node-simple-context is an helper to create a context in node.
This library is highly inspired by nctx. You definitely should check it out! Thanks to @devthejo for his help đź’Ş
npm install node-simple-contextimport { createSimpleContext } from 'node-simple-context';
export const contextA = createSimpleContext();
export const contextB = createSimpleContext();import { contextA, contextB } from './my-context';
contextA.set('foo', 'bar');
contextB.set('foo', 'baz');import { contextA, contextB } from './my-context';
console.log(contextA.get('foo')); // bar
console.log(contextB.get('foo')); // baz
console.log(contextA.get('xxx')); // undefined
// in typescript
console.log(contextA.get<string>('foo')); // barThanks to AsyncLocalStorage api, you can fork your context in promise or async functions. As you can see below:
You can also pass a callback in
forkmethod to runs a function synchronously within a context and returns its return value which uses run method from AsyncLocalStorage (cf. example)
const context = createSimpleContext();
const func = (): string => {
  const foo = context.get('foo');
  return `foo=${foo}`;
};
context.fork();
context.set('foo', 'bar');
const res = await Promise.all([
  new Promise((resolve) => {
    context.fork().set('foo', 'tata');
    setTimeout(() => {
      resolve(func());
    }, 400);
  }),
  new Promise((resolve) => {
    context.fork().set('foo', 'toto');
    setTimeout(() => {
      resolve(func());
    }, 200);
  }),
  new Promise((resolve) => {
    context.fork().set('foo', 'titi');
    setTimeout(() => {
      resolve(func());
    }, 100);
  }),
  new Promise((resolve) => {
    context.fork().set('foo', 'tutu');
    setTimeout(() => {
      resolve(func());
    }, 600);
  }),
]);
console.log(res); // ['foo=tata', 'foo=toto', 'foo=titi', 'foo=tutu']const contextA = createSimpleContext();
const contextB = createSimpleContext();
const contextC = createSimpleContext();
const contextD = createSimpleContext();
const func = (context: SimpleContext): string => {
  const foo = context.get('foo');
  return `foo=${foo}`;
};
const res = await Promise.all([
  new Promise((resolve) => {
    contextA.set('foo', 'tata');
    setTimeout(() => {
      resolve(func(contextA));
    }, 400);
  }),
  new Promise((resolve) => {
    contextB.set('foo', 'toto');
    setTimeout(() => {
      resolve(func(contextB));
    }, 200);
  }),
  new Promise((resolve) => {
    contextC.set('foo', 'titi');
    setTimeout(() => {
      resolve(func(contextC));
    }, 100);
  }),
  new Promise((resolve) => {
    contextD.set('foo', 'tutu');
    setTimeout(() => {
      resolve(func(contextD));
    }, 600);
  }),
]);
console.log(res); // ['foo=tata', 'foo=toto', 'foo=titi', 'foo=tutu']const context = createSimpleContext();
const func = (key: string): string => {
  const foo = context.get(key);
  return `foo=${foo}`;
};
const res = await Promise.all([
  new Promise((resolve) => {
    context.set('foo1', 'tata');
    setTimeout(() => {
      resolve(func('foo1'));
    }, 400);
  }),
  new Promise((resolve) => {
    context.set('foo2', 'toto');
    setTimeout(() => {
      resolve(func('foo2'));
    }, 200);
  }),
  new Promise((resolve) => {
    context.set('foo3', 'titi');
    setTimeout(() => {
      resolve(func('foo3'));
    }, 100);
  }),
  new Promise((resolve) => {
    context.set('foo4', 'tutu');
    setTimeout(() => {
      resolve(func('foo4'));
    }, 600);
  }),
]);
console.log(res); // ['foo=tata', 'foo=toto', 'foo=titi', 'foo=tutu']