Skip to content

local storage that is shared between all stack frames (top down) in a call chain, including async function

Notifications You must be signed in to change notification settings

TheOrangeDots/async-local-storage

 
 

Repository files navigation

async-local-storage

Build Status Coverage Status npm Github Releases

I want something like thread-local storage in threaded programming and async_hooks is usable in node.js 8.0, so there is an easy way to use thread-local.

API

const als = require('async-local-storage');
als.enable();
setTimeout(() => {
  const id = randomBytes(8);
  als.set('id', id);
  delay().then(() => {
    assert.equal(als.get('id'), id);
    return readfilePromise(__filename);
  }).then(() => {
    assert.equal(als.get('id'), id);
    return superagent.get('http://www.baidu.com/');
  }).then(() => {
    assert.equal(als.get('id'), id);
  });
}, 100);

enable

enable the async hooks

const als = require('async-local-storage');
als.enable();

disable

disable the async hooks

const als = require('async-local-storage');
als.enable();
setTimeout(() => {
  als.disable();
}, 100);

size

get the size of storage

const als = require('async-local-storage');
als.enable();
setTimeout(() => {
  console.info(als.size());
}, 100);

set

set the value by key for the current id

  • key the key
  • value the value
  • linkedTop set the value linked to top
const assert = require('assert');
const als = require('async-local-storage');
const crypto = require('crypto');
const randomBytes = length => crypto.randomBytes(length).toString('hex')

als.enable()
setTimeout(() => {
  const id = randomBytes(8);
  als.set('id', id);
  const check = (times, id, subId) => {
    assert.equal(als.get('id'), id);
    assert.equal(als.get('subId'), subId);
    if (times < 0) {
      done();
    } else {
      setTimeout(() => {
        check(times - 1, id, subId);
      }, 10);
    }
  };
  setTimeout(() => {
    const subId = randomBytes(8);
    als.set('subId', subId);
    assert.equal(als.get('id'), id);
    check(3, id, subId);
  }, 10);
}, 10);

get

get the value by key, if will find from parent, self --> parent --> parent, until the value is not undefined

  • key the key
const assert = require('assert');
const als = require('async-local-storage');
const crypto = require('crypto');
const randomBytes = length => crypto.randomBytes(length).toString('hex')

als.enable()
setTimeout(() => {
  const id = randomBytes(8);
  als.set('id', id);
  const check = (times, id, subId) => {
    assert.equal(als.get('id'), id);
    assert.equal(als.get('subId'), subId);
    if (times < 0) {
      done();
    } else {
      setTimeout(() => {
        check(times - 1, id, subId);
      }, 10);
    }
  };
  setTimeout(() => {
    const subId = randomBytes(8);
    als.set('subId', subId);
    assert.equal(als.get('id'), id);
    check(3, id, subId);
  }, 10);
}, 10);

currentId

Get the current id

const assert = require('assert');
const als = require('async-local-storage');
als.enable();
setTimeout(() => {
  assert(als.currentId());
}, 10);

use

  • id The tigger id, default is als.currentId()
const assert = require('assert');
const als = require('async-local-storage');
als.enable();
setTimeout(() => {
  assert(als.use());
}, 10);

enableLinkedTop

Enable all value linked to top

disableLinkedTop

Disable all value linked to top

License

MIT

About

local storage that is shared between all stack frames (top down) in a call chain, including async function

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 100.0%