/
cls.ts
114 lines (93 loc) · 2.41 KB
/
cls.ts
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
112
113
114
import * as asyncHooks from "async_hooks";
const namespaces: { [key: string]: Namespace } = {};
/**
* Create a new namespace
*/
export function create() {
return namespace;
}
/**
* Set AutomationContext into the namespace of the current execution
* @param context
*/
export function set(context: AutomationContext): void {
namespace.set("context", context);
}
/**
* Get AutomationContext from the namespace of the current execution
*/
export function get(): AutomationContext {
return namespace.get("context");
}
/**
* Context of the current command or event handler execution
*/
export interface AutomationContext {
correlationId: string;
workspaceId: string;
workspaceName: string;
operation: string;
name: string;
version: string;
invocationId: string;
ts: number;
}
/**
* Internal mapping from async execution ids to AutomationContext instances
*/
class Namespace {
constructor(public readonly context = {}) {
}
public run(fn: () => void): void {
const id = asyncHooks.executionAsyncId();
this.context[id] = {};
fn();
}
public set(key: string, val: any): void {
const id = asyncHooks.executionAsyncId();
if (this.context[id]) {
this.context[id][key] = val;
}
}
public get(key: string): any {
const id = asyncHooks.executionAsyncId();
if (this.context[id]) {
return this.context[id][key];
} else {
return undefined;
}
}
}
/**
* Registers the internal async hooks on the namespace
* @param nsp
*/
function createHooks(nsp: Namespace): void {
function init(asyncId, type, triggerId, resource) {
if (nsp.context[triggerId]) {
nsp.context[asyncId] = nsp.context[triggerId];
}
}
function destroy(asyncId): void {
delete nsp.context[asyncId];
}
const asyncHook = asyncHooks.createHook({ init, destroy });
asyncHook.enable();
}
/**
* Create a new Namespace instance of the given name
* @param name
*/
function createNamespace(name): Namespace {
if (namespaces[name]) {
throw new Error(`Namespace '${name}' already exists`);
}
const nsp = new Namespace();
namespaces[name] = nsp;
createHooks(nsp);
return nsp;
}
/**
* Create the default namespace used by command and event handler executions
*/
const namespace = createNamespace("automation-client");