Research
Security News
Quasar RAT Disguised as an npm Package for Detecting Vulnerabilities in Ethereum Smart Contracts
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
asynchronous-local-storage
Advanced tools
Asynchronous local storage implementation based on Node.js ALS with fallback to cls-hooked for older Node.js versions
Asynchronous local storage implementation based on Node.js ALS with fallback to cls-hooked for older Node.js versions.
Heavily based on a work done in https://github.com/thorough-developer/fast-als
If you are planning to use it with fastify, it is recommended to use fastify-request-context plugin instead which seamlessly integrates asynchronous-local-storage
with the fastify request lifecycle.
$ npm install --save asynchronous-local-storage
const { als } = require('asynchronous-local-storage')
const fastify = require('fastify')({ logger: true })
const asyncResourceSymbol = Symbol('asyncResource')
fastify.addHook('onRequest', (req, reply, done) => {
als.runWith(() => {
const asyncResource = new AsyncResource('my-als-context')
req[asyncResourceSymbol] = asyncResource
asyncResource.runInAsyncScope(done, req.raw)
}, { user: { id: 'defaultUser' } })
});
fastify.addHook('preValidation', (req, res, done) => {
const asyncResource = req[asyncResourceSymbol]
asyncResource.runInAsyncScope(done, req.raw)
})
fastify.addHook('preHandler', (req, reply, done) => {
// overrides default user value
als.set('user', { id: 'customUser' });
done();
});
// Declare a route
fastify.get('/', async (request, reply) => {
return {
user: als.get('user')
}
});
// Run the server!
const start = async () => {
try {
await fastify.listen(3000);
fastify.log.info(`server listening on ${fastify.server.address().port}`);
} catch (err) {
fastify.log.error(err);
process.exit(1);
}
}
start();
const { als } = require('asynchronous-local-storage')
const express = require('express')
const app = express()
const port = 3000
app.use((req, res, next) => {
als.runWith(() => {
next();
}, { user: { id: 'defaultUser' } }); // sets default values
});
app.use((req, res, next) => {
// overrides default user value
als.set('user', { id: 'customUser' });
next();
});
app.get('/', (req, res) => res.send({ user: als.get('user') }))
app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
Start an asynchronous local storage context. Once this method is called, a new context is created, for which
get
and set
calls will operate on a set of entities, unique to this context.
callback
- function that will be executed first within the newly created context[defaults]
- an optional record, containing default values for the contextconst als = require('asynchronous-local-storage');
function firstCallInScope() {
// override user
als.set('user', { id: 'overwrittenUser'});
}
function secondCallInScope() {
// will print the user set in firstCallInScope
console.log(als.get('user'));
}
als.runWith(() => {
firstCallInScope();
secondCallInScope();
}, { user: { id: 'someUser' } });
Sets a variable for a given key within running context (started by runWith
).
If this is called outside of a running context, it will not store the value.
key
a string key to store the variable byvalue
any value to store under the key for the later lookup.const als = require('asynchronous-local-storage');
function callInScope() {
// override user
als.set('user', { id: 'overwrittenUser'});
}
als.runWith({ user: { id: 'someUser' } }, () => {
callInScope();
});
const als = require('asynchronous-local-storage');
function callOutOfScope() {
// this never gets set
als.set('user', { id: 'overwrittenUser'});
}
// calling this won't store the variable under the key
callOutOfScope();
Gets a variable previously set within a running context (started by runWith
).
If this is called outside of a running context, it will not retrieve the value.
key
a string key to retrieve the stored value forconst als = require('asynchronous-local-storage');
function callInScope() {
// prints default user
console.log(als.get('user'));
}
als.runWith(() => {
callInScope();
}, { user: { id: 'someUser' } });
const als = require('asynchronous-local-storage');
function callInScope() {
// prints default user
console.log(als.get('user'));
}
als.runWith(() => {
callInScope();
}, { user: { id: 'someUser' } });
// calling this will return undefined
callInScope();
FAQs
Asynchronous local storage implementation based on Node.js ALS with fallback to cls-hooked for older Node.js versions
We found that asynchronous-local-storage demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
Security News
Research
A supply chain attack on Rspack's npm packages injected cryptomining malware, potentially impacting thousands of developers.
Research
Security News
Socket researchers discovered a malware campaign on npm delivering the Skuld infostealer via typosquatted packages, exposing sensitive data.