-
-
Notifications
You must be signed in to change notification settings - Fork 102
Expand file tree
/
Copy pathtest_async_local_storage_context.ts
More file actions
118 lines (105 loc) · 3.18 KB
/
test_async_local_storage_context.ts
File metadata and controls
118 lines (105 loc) · 3.18 KB
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
115
116
117
118
import { AsyncLocalStorage } from "node:async_hooks";
import { setImmediate } from "node:timers";
const als = new AsyncLocalStorage();
const other = new AsyncLocalStorage();
async function viaAwait() {
await Promise.resolve();
console.log("await store:", als.getStore().trace);
}
function viaThen() {
return Promise.resolve().then(() => {
console.log("then store:", als.getStore().trace);
});
}
function viaCatch() {
return Promise.reject(new Error("boom")).catch(() => {
console.log("catch store:", als.getStore().trace);
});
}
function viaNextTick() {
return new Promise((resolve) => {
process.nextTick(() => {
console.log("nextTick store:", als.getStore().trace);
resolve(undefined);
});
});
}
function viaTimer() {
return new Promise((resolve) => {
setTimeout(() => {
console.log("timer store:", als.getStore().trace);
resolve(undefined);
}, 0);
});
}
function viaImmediate() {
return new Promise((resolve) => {
setImmediate(() => {
console.log("immediate store:", als.getStore().trace);
resolve(undefined);
});
});
}
function viaInterval() {
return new Promise((resolve) => {
let id: any;
id = setInterval(() => {
clearInterval(id);
console.log("interval store:", als.getStore().trace);
resolve(undefined);
}, 0);
});
}
async function nested() {
await als.run({ trace: "outer" }, async () => {
console.log("outer pre:", als.getStore().trace);
await als.run({ trace: "inner" }, async () => {
await Promise.resolve();
console.log("inner:", als.getStore().trace);
});
await Promise.resolve();
console.log("outer post:", als.getStore().trace);
});
}
async function enterWithContext() {
als.enterWith({ trace: "entered" });
await Promise.resolve();
console.log("enterWith store:", als.getStore().trace);
als.disable();
}
async function exitContextIsolation() {
await als.run({ trace: "exit-outer" }, async () => {
await other.run({ trace: "other-before" }, async () => {
await als.exit(async () => {
console.log("exit clears primary:", als.getStore());
other.enterWith({ trace: "other-mutated" });
await Promise.resolve();
console.log("exit keeps other:", other.getStore().trace);
});
console.log("exit restores primary:", als.getStore().trace);
console.log("exit preserves other mutation:", other.getStore().trace);
});
});
}
async function twoInstances() {
await als.run({ trace: "primary" }, async () => {
await other.run({ trace: "secondary" }, async () => {
await Promise.resolve();
console.log("primary store:", als.getStore().trace);
console.log("secondary store:", other.getStore().trace);
});
});
}
(async () => {
await als.run({ trace: "await" }, viaAwait);
await als.run({ trace: "then" }, viaThen);
await als.run({ trace: "catch" }, viaCatch);
await als.run({ trace: "nextTick" }, viaNextTick);
await als.run({ trace: "timer" }, viaTimer);
await als.run({ trace: "immediate" }, viaImmediate);
await als.run({ trace: "interval" }, viaInterval);
await nested();
await enterWithContext();
await exitContextIsolation();
await twoInstances();
})();