npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@utilitywarehouse/microbe.js

v3.0.2

Published

Microbe is an abstraction for the repetitive task of setting basic express infrastructure each time we bring up another μService.

Downloads

69

Readme

uw-microbe.js

Microbe is an abstraction for the repetitive task of setting basic express infrastructure each time we bring up another μService.

API

  • new Microbe([root = process.cwd()]) - create an instance of a service passing it's name (used for loggers etc.) and root directory (for operational endpoitns etc.)
  • Microbe.build() - builds the system, needs to be called before starting
  • Microbe.start(port) - starts the server on given port
  • Microbe.container - returns instance of DI container
  • Microbe.configure(configPath) - loads yml file into canister.js configuration
  • Microbe.before(middleware) - attaches middleware to run before any routes are evaluated
  • Microbe.after(middleware) - attaches middleware to run after routes are evaluated
  • Microbe.route() : express.Router - returns an instance of Router, attach your handlers here
  • Microbe.health(callback) - adds a health checker per uw-lib-operational.js
  • Microbe.ready(callback) - sets a ready checker per uw-lib-operational.js
  • Microbe.bootstrap() : Promise - runs bootstrap methods (if any) in order and returns Promise
  • Microbe.teardown() : Promise - runs teardown methods (if any) in reverse order and returns Promise

Bits out of the box

Logging

There's both request and error logging via bunyan available out of the box.

A request scope logger, with request-id and x-request-id is available on req.logger property.

Instrumentation

Available in the container via get('instrumentation'). Default heap and request durations are preconfigured as well as /__/metrics for reporter.

Health

Endpoints exposed via default /__/{name} routes. You can configure your checks as described in the API section above.

Other services

Check wiring.yml for additional services.

Wiring

For reference on wiring go to https://github.com/michael-donat/canister.js

Before/After ware

Those can be added by either using your the API or tagging services with before.router and after.router.

Example

const Microbe = require('uw-microbe.js');

const system = new Microbe(__dirname);

system.configure('./wiring.yml');
system.build();

system.router.get('/', (req, res) => {
	res.json({ok: true});
})

system.pre.use((req, res, next) => {
	console.log('Some preware');
	next();
});

system.start(3321);

System lifecycle

It is possible to define startup and shutdown methods via container configuration. Microbe exposes bootstrap and teardown methods to trigger the behaviour.

Definition:

components:
  mysql:
    module: './mysql'
    tags:
      system.start: ~
  redis:
    module: './redis'
    tags:
      system.start: 2
  mongo:
    class: './mongo'
    tags:
      system.start: {method: start, priority: 3}
      system.stop: {method: stop}
  • myssql will be with priority 0 and the startup method will be the one returned from the module (require('./mysql')())
  • redis will be started with priority 2 and the startup method will be the one returned from the module (as above)
  • mongo will be started with priority 3 and the startup method will be start executed in mongo context (no constructor manual needed, this will be mongo)
  • mongo will shutdown with priority 0 (reverse order), method is stop bound to mongo

Order is NOT guaranteed if two services have the same priority.

Start/Stop methods are executed in series, always.

Provided start/stop methods are required to return a promise.

Where a start/stop method rejects the entire chain will be rejected.

Monitoring

Microbe can monitor your infrastructure connections and have state pumped onto logger, instrumentation and health endpoints. There are only two types of events recognised, connect and disconnect and any instance provided for monitoring is required to raise those. Patch methods for redis and mongo are available and will translate events to the required pair. The endpoint patch method will translate available and unavailable events.

Definition:

components:
  redis:
    module: './redis'
    tags:
      system.start: 2
      system.monitor:
        type: redis
        prop: cache
        initiallyConnected: true
  mongo:
    class: './mongo'
    tags:
      system.start: {method: start, priority: 3}
      system.stop: {method: stop}
      system.monitor:
        type: mongo
        prop: db
        required: true
        initiallyConnected: true

Syntax:

  • type - optional, endpoint, redis or mongo, if left blank it will try to monitor connect/disconnect events on passed instance
  • prop - optional, the prop of the service where the events are emitted from, this is required because we often have wrappers around connection objects
  • name - optional, arbitrary name, will be used as label in any output type - defaults to component definition id (service name)
  • required - optional, if set to true and connection is down it will report system as unhealthy in health checks, default is false
  • initiallyConnected - optional, it will set the probe to connected after creation, this is because a lot of the connection objects do not emit connection events, default is true

Endpoint monitoring

HTTP endpoint monitoring is available via the https://github.com/utilitywarehouse/uw-lib-endpoint-monitor.js package - please refer to the package documentation for specifics.

Definition:

components:
  someApi:
    factory: 'axios.create'
    with:
      - baseURL: 'http://api.example.com'
  endpoint.monitor.someAPI:
    factory: '@utilitywarehouse/uw-lib-endpoint-monitor.js'
    with:
        - client: '@someApi'
    tags:
      system.monitor:
        type: endpoint
        name: someApi

Injecting components for testing

It is possible to inject values into the container definition before the system is built. This technique should be used during testing only.

const Microbe = require('uw-microbe.js');

const system = new Microbe(__dirname);

system.configure('./wiring.yml');

system.di.inject('my.id', new Object('oi!'));

system.build();

Behaviour

  Microbe
    ✓ sets up default instrumentation
    ✓ renders errors with error.status and error.message only with http status matching error.status
    ✓ renders 500/Internal Server Error when no error.status / error.message
    ✓ can run before() and after() middleware
    exposes operational endpoints at
      ✓ /__/about
      ✓ /__/ready
      ✓ /__/health
      ✓ /__/metrics
    provides a logger that
      ✓ is namespaced with app name
      ✓ attaches to req.logger with correlation id (id) and request id (r)
      ✓ logs requests
      ✓ logs errors with stacks and previous errors