Git Product home page Git Product logo

ictx's Introduction

ictx (Invocation Context)

npm version Actions Status

Globally maintains context throughout a invocation/request lifecycle, using cls-hooked under the hood.

Context can be set and retrieved during the entire lifetime a request, through all chains of function calls, even if defined in another module entirely.

Examples

Context.Middlware (for Express)

import Context from 'ictx';
import express from 'express';

function getCurrentUser() {
  return User.findById(Context.get('userId'));
}

const app = express();

app.use(Context.Middleware);

app.get('/me', async (req, res) => {
  // Request header `x-user-id` was set as '123'

  Context.get('userId'); // => '123'
  Context.userId(); // => '123'

  const currentUser = getCurrentUser();

  res.json(currentUser);
});

Certain headers will be automatically assigned as context properties:

  • x-user-id can be accessed via Context.get('userId') or Context.userId()
  • x-invocation-id / x-request-id can be accessed via Context.get('invocationId') or Context.invocationId()

Context.Provider

Generic provider. Works much like Context.Middlware, except you don't need to pass req and res.

import Context from 'ictx';

Context.Provider({ userId: 'abc' }, () => {
  Context.get('userId'); // => 'abc'
});

Typed Context

import Container from 'typedi';
import { ContextFactory } from 'ictx';

const Context = ContextFactory<{ userId: string }>({
  initialValues: { userId: 123 },
  beforeHook: ({ invocationId }) => {
    Container.of(invocationId).set('connection', new DBConnection());
  },
  afterHook: ({ invocationId }) => {
    Container.reset(invocationId);
  },
});

Context.Provider(() => {
  // Defines methods for values
  Context.userId(); // => 123
  Context.userId(999);
  Context.userId(); // => 999
});

ictx's People

Contributors

ashleyw avatar

Stargazers

 avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.