-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathtransaction-context.js
111 lines (93 loc) · 3.75 KB
/
transaction-context.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
var Cls = require('cls-hooked');
let SchemaFilter = require('json-schema-filter')
const trxnHeaderSchema = require('./schema/transaction_context').getHeaderSchema();
const Error = require('./error');
const PrioritizedLoadShed = require('./load_shed/strategy/prioritized')
const ContextConstants = {
UC_TRXN_CONTEXT_NS: 'uc-txn-context-ns',
TRXN_ID: 'trxn-id',
HEADERS: 'headers',
PRIORITY: 'priority',
LANGUAGE: 'language'
};
const _ = require('lodash')
const Crypto = require("crypto");
var SessionContext = Cls.createNamespace(ContextConstants.UC_TRXN_CONTEXT_NS);
const clsBluebird = require('cls-bluebird');
const { LOG_CONSTANTS } = require('./logging/constants');
var transactionContext = {};
transactionContext.getTrxnId = () => {
SessionContext = Cls.getNamespace(ContextConstants.UC_TRXN_CONTEXT_NS);
return SessionContext.get(ContextConstants.TRXN_ID);
}
transactionContext.getTrxnLanguage = () => {
SessionContext = Cls.getNamespace(ContextConstants.UC_TRXN_CONTEXT_NS);
return SessionContext.get(ContextConstants.LANGUAGE);
}
transactionContext.getPriority = () => {
SessionContext = Cls.getNamespace(ContextConstants.UC_TRXN_CONTEXT_NS);
return SessionContext.get(ContextConstants.PRIORITY);
}
transactionContext.getTrxnHeaders = (request_body) => {
SessionContext = Cls.getNamespace(ContextConstants.UC_TRXN_CONTEXT_NS);
return SessionContext.get(ContextConstants.HEADERS);
}
transactionContext.getNamespace = () => {
return Cls.getNamespace(ContextConstants.UC_TRXN_CONTEXT_NS);
}
transactionContext.getExpressMiddleware = () => {
return function transactionContextMiddleware(req, res, next) {
req.trxn_id = req.query.trxn_id || req.headers['cf-ray'] || Crypto.randomBytes(16).toString("hex");
req.priority = req.query.priority || PrioritizedLoadShed.assignPriorityToRequest(req);
req.language = req.query.language || req.headers['x-preferred-language'];
SessionContext = Cls.getNamespace(ContextConstants.UC_TRXN_CONTEXT_NS);
SessionContext.bindEmitter(req);
SessionContext.bindEmitter(res);
SessionContext.run(function() {
SessionContext.set(ContextConstants.TRXN_ID, req.trxn_id);
SessionContext.set(ContextConstants.PRIORITY, req.priority);
SessionContext.set(ContextConstants.LANGUAGE, req.language);
next();
})
}
}
transactionContext.setTrxnHeaders = (values) => {
SessionContext = Cls.getNamespace(ContextConstants.UC_TRXN_CONTEXT_NS);
let headers = SchemaFilter(trxnHeaderSchema, _.extend(SessionContext.get(ContextConstants.HEADERS), values))
SessionContext.set(ContextConstants.HEADERS, headers);
}
transactionContext.patchBluebird = (bluebird) => {
if(bluebird != require('bluebird')) {
clsBluebird(Cls.getNamespace(ContextConstants.UC_TRXN_CONTEXT_NS), require('bluebird'));
}
if(bluebird) {
clsBluebird(Cls.getNamespace(ContextConstants.UC_TRXN_CONTEXT_NS), bluebird)
}
}
transactionContext.addTransactionDataToLog = (log) => {
if(!log || typeof log !== 'object')
return log;
SessionContext = Cls.getNamespace(ContextConstants.UC_TRXN_CONTEXT_NS);
if(!log[LOG_CONSTANTS.SYSTEM_LOGS.TRANSACTION_ID]) {
log[LOG_CONSTANTS.SYSTEM_LOGS.TRANSACTION_ID] = SessionContext.get(ContextConstants.TRXN_ID);
}
return log;
}
transactionContext.getRandomTrxnId = () => {
return Crypto.randomBytes(16).toString("hex");
}
transactionContext.wrapTrxnInAsyncFn = (trxn_id, callback, params = []) => {
SessionContext = Cls.getNamespace(ContextConstants.UC_TRXN_CONTEXT_NS);
return new Promise((resolve, reject) => {
SessionContext.run(async () => {
SessionContext.set(ContextConstants.TRXN_ID, trxn_id);
try {
await callback(...params);
} catch (ex) {
reject(ex);
}
resolve();
});
});
}
module.exports = transactionContext;