Skip to content

Commit 6eb167a

Browse files
committed
fix(pencil): Added cls context implementation
1 parent 2277f6f commit 6eb167a

File tree

5 files changed

+66
-6
lines changed

5 files changed

+66
-6
lines changed

package-lock.json

Lines changed: 41 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"semantic-release": "semantic-release"
2424
},
2525
"dependencies": {
26+
"cls-hooked": "^4.2.2",
2627
"cookie": "^0.3.1",
2728
"futoin-ipset": "^1.3.4",
2829
"ip": "^1.1.5",
@@ -37,6 +38,7 @@
3738
"@types/assert": "^1.4.6",
3839
"@types/chai": "^4.2.10",
3940
"@types/chai-as-promised": "^7.1.2",
41+
"@types/cls-hooked": "^4.3.0",
4042
"@types/cookie": "^0.3.3",
4143
"@types/express": "^4.17.3",
4244
"@types/fetch-mock": "^7.3.2",

src/events/sdk-event.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ export default class SDKEvent implements IEvent {
3232

3333
constructor(event: EventOptions, options: SecureNativeOptions) {
3434
Logger.debug('Building SDK event');
35+
3536
// extract info from session
36-
const { req } = SessionManager.getLastSession();
37+
const req = SessionManager.getNs().get('req');
3738
if (!req) {
3839
Logger.debug('request is empty', req);
3940
}
4041
const reqCtx = mergeRequestContexts(event.context || {}, contextFromRequest(req));
41-
4242
const decryptedToken = decrypt(reqCtx?.clientToken, options.apiKey);
4343
Logger.debug('Decrypted client token', decryptedToken);
4444
const parsedToken = JSON.parse(decryptedToken) || {};

src/session-manager.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { IncomingMessage, ServerResponse } from 'http';
22
import { Logger } from './logger';
3+
import { createNamespace, Namespace } from 'cls-hooked';
4+
35
export interface Session {
46
req: IncomingMessage | any;
57
res: ServerResponse | any;
68
}
79

810
export default class SessionManager {
911
private static stack: Array<Session> = [];
10-
12+
private static ns = createNamespace('sn_session');
1113
static getLastSession(): Session {
1214
const [session = { req: null, res: null }] = SessionManager.stack;
1315
return session;
@@ -38,4 +40,8 @@ export default class SessionManager {
3840
Logger.debug(`[SessionManager] Cleaning all sessions`);
3941
SessionManager.stack = [];
4042
}
43+
44+
static getNs(): Namespace {
45+
return SessionManager.ns;
46+
}
4147
}

src/utils/shimer.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { wrap } from 'shimmer';
2+
import SessionManager from '../session-manager';
23

34
export const wrapListener = (module, method, listner, callback) => {
45
wrap(module, method, function (original) {
@@ -8,8 +9,20 @@ export const wrapListener = (module, method, listner, callback) => {
89
if (!status) {
910
return;
1011
}
12+
// @ts-ignore
13+
const [ , req, res ] = arguments;
14+
15+
const ns = SessionManager.getNs();
16+
ns.bindEmitter(req);
17+
ns.bindEmitter(res);
18+
19+
return ns.run(() => {
20+
ns.set('req', req);
21+
ns.set('res', res);
22+
return original.apply(this, arguments);
23+
});
1124
}
1225
return original.apply(this, arguments);
1326
};
1427
});
15-
}
28+
};

0 commit comments

Comments
 (0)