@nest-boot/request-context 8.0.0-beta.3 → 8.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/request-context.d.ts +19 -9
- package/dist/request-context.js +87 -11
- package/dist/request-context.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type InjectionToken } from "@nestjs/common";
|
|
2
2
|
export type RequestContextMiddlewareType = <T>(ctx: RequestContext, next: () => Promise<T>) => Promise<T>;
|
|
3
|
-
export type
|
|
3
|
+
export type RequestContextToken<T = unknown> = InjectionToken<T>;
|
|
4
|
+
export type RequestContextDependencyResolver = (token: RequestContextToken) => unknown;
|
|
4
5
|
export interface RequestContextCreateOptions {
|
|
5
6
|
dependencyResolver?: RequestContextDependencyResolver;
|
|
6
7
|
id?: string;
|
|
@@ -13,18 +14,27 @@ export declare class RequestContext {
|
|
|
13
14
|
readonly parent?: RequestContext;
|
|
14
15
|
private readonly dependencyResolver?;
|
|
15
16
|
private readonly container;
|
|
17
|
+
private readonly aliases;
|
|
16
18
|
private static readonly storage;
|
|
17
19
|
private static readonly middlewares;
|
|
18
20
|
private static readonly middlewareDependencies;
|
|
19
21
|
private static middlewaresStack;
|
|
20
22
|
constructor(options: RequestContextCreateOptions);
|
|
21
|
-
get<T>(token:
|
|
22
|
-
private
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
static
|
|
27
|
-
|
|
23
|
+
get<T>(token: RequestContextToken<T>): T | undefined;
|
|
24
|
+
private findContextValue;
|
|
25
|
+
private resolveDependency;
|
|
26
|
+
private getAliasTarget;
|
|
27
|
+
private resolveToken;
|
|
28
|
+
private static formatToken;
|
|
29
|
+
set<T>(typeOrToken: RequestContextToken<T>, value: T): void;
|
|
30
|
+
alias(aliasToken: RequestContextToken, targetToken: RequestContextToken): void;
|
|
31
|
+
unalias(aliasToken: RequestContextToken): void;
|
|
32
|
+
getOrSet<T>(typeOrToken: RequestContextToken<T>, value: T): T;
|
|
33
|
+
static get<T>(key: RequestContextToken<T>): T | undefined;
|
|
34
|
+
static set<T>(key: RequestContextToken<T>, value: T): void;
|
|
35
|
+
static alias(aliasToken: RequestContextToken, targetToken: RequestContextToken): void;
|
|
36
|
+
static unalias(aliasToken: RequestContextToken): void;
|
|
37
|
+
static getOrSet<T>(key: RequestContextToken<T>, value: T): T;
|
|
28
38
|
static get id(): string;
|
|
29
39
|
static current(): RequestContext;
|
|
30
40
|
static isActive(): boolean;
|
package/dist/request-context.js
CHANGED
|
@@ -6,6 +6,7 @@ export class RequestContext {
|
|
|
6
6
|
parent;
|
|
7
7
|
dependencyResolver;
|
|
8
8
|
container = new Map();
|
|
9
|
+
aliases = new Map();
|
|
9
10
|
static storage = new AsyncLocalStorage();
|
|
10
11
|
static middlewares = new Map();
|
|
11
12
|
static middlewareDependencies = new Map();
|
|
@@ -15,26 +16,95 @@ export class RequestContext {
|
|
|
15
16
|
this.type = options.type;
|
|
16
17
|
this.parent = options.parent;
|
|
17
18
|
this.dependencyResolver = options.dependencyResolver;
|
|
19
|
+
if (this.parent) {
|
|
20
|
+
for (const [aliasToken, targetToken] of this.parent.aliases) {
|
|
21
|
+
this.aliases.set(aliasToken, targetToken);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
18
24
|
}
|
|
19
25
|
get(token) {
|
|
26
|
+
const resolvedToken = this.resolveToken(token);
|
|
27
|
+
const contextValue = this.findContextValue(resolvedToken);
|
|
28
|
+
if (contextValue.found) {
|
|
29
|
+
return contextValue.value;
|
|
30
|
+
}
|
|
31
|
+
return this.resolveDependency(resolvedToken);
|
|
32
|
+
}
|
|
33
|
+
findContextValue(token) {
|
|
20
34
|
if (this.container.has(token)) {
|
|
21
|
-
return
|
|
35
|
+
return {
|
|
36
|
+
found: true,
|
|
37
|
+
value: this.container.get(token),
|
|
38
|
+
};
|
|
22
39
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
40
|
+
return (this.parent?.findContextValue(token) ?? {
|
|
41
|
+
found: false,
|
|
42
|
+
value: undefined,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
resolveDependency(token) {
|
|
46
|
+
const parentValue = this.parent?.resolveDependency(token);
|
|
47
|
+
if (typeof parentValue !== "undefined") {
|
|
48
|
+
return parentValue;
|
|
29
49
|
}
|
|
30
50
|
return this.dependencyResolver?.(token);
|
|
31
51
|
}
|
|
32
|
-
|
|
33
|
-
return
|
|
34
|
-
|
|
52
|
+
getAliasTarget(aliasToken) {
|
|
53
|
+
return this.aliases.get(aliasToken);
|
|
54
|
+
}
|
|
55
|
+
resolveToken(aliasToken) {
|
|
56
|
+
const path = [aliasToken];
|
|
57
|
+
const seen = new Map([[aliasToken, 0]]);
|
|
58
|
+
let token = aliasToken;
|
|
59
|
+
while (true) {
|
|
60
|
+
const targetToken = this.getAliasTarget(token);
|
|
61
|
+
if (typeof targetToken === "undefined") {
|
|
62
|
+
return token;
|
|
63
|
+
}
|
|
64
|
+
path.push(targetToken);
|
|
65
|
+
const cycleStart = seen.get(targetToken);
|
|
66
|
+
if (typeof cycleStart !== "undefined") {
|
|
67
|
+
const cycle = path
|
|
68
|
+
.slice(cycleStart)
|
|
69
|
+
.map((currentToken) => RequestContext.formatToken(currentToken))
|
|
70
|
+
.join(" -> ");
|
|
71
|
+
throw new Error(`Circular request context alias detected: ${cycle}`);
|
|
72
|
+
}
|
|
73
|
+
seen.set(targetToken, path.length - 1);
|
|
74
|
+
token = targetToken;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
static formatToken(token) {
|
|
78
|
+
if (typeof token === "string") {
|
|
79
|
+
return JSON.stringify(token);
|
|
80
|
+
}
|
|
81
|
+
if (typeof token === "symbol") {
|
|
82
|
+
return token.toString();
|
|
83
|
+
}
|
|
84
|
+
return token.name || "(anonymous function)";
|
|
35
85
|
}
|
|
36
86
|
set(typeOrToken, value) {
|
|
37
|
-
this.container.set(typeOrToken, value);
|
|
87
|
+
this.container.set(this.resolveToken(typeOrToken), value);
|
|
88
|
+
}
|
|
89
|
+
alias(aliasToken, targetToken) {
|
|
90
|
+
const hadAlias = this.aliases.has(aliasToken);
|
|
91
|
+
const previousTarget = this.aliases.get(aliasToken);
|
|
92
|
+
this.aliases.set(aliasToken, targetToken);
|
|
93
|
+
try {
|
|
94
|
+
this.resolveToken(aliasToken);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (hadAlias && typeof previousTarget !== "undefined") {
|
|
98
|
+
this.aliases.set(aliasToken, previousTarget);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
this.aliases.delete(aliasToken);
|
|
102
|
+
}
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
unalias(aliasToken) {
|
|
107
|
+
this.aliases.delete(aliasToken);
|
|
38
108
|
}
|
|
39
109
|
getOrSet(typeOrToken, value) {
|
|
40
110
|
const existing = this.get(typeOrToken);
|
|
@@ -54,6 +124,12 @@ export class RequestContext {
|
|
|
54
124
|
ctx.set(key, value);
|
|
55
125
|
}
|
|
56
126
|
}
|
|
127
|
+
static alias(aliasToken, targetToken) {
|
|
128
|
+
this.current().alias(aliasToken, targetToken);
|
|
129
|
+
}
|
|
130
|
+
static unalias(aliasToken) {
|
|
131
|
+
this.current().unalias(aliasToken);
|
|
132
|
+
}
|
|
57
133
|
static getOrSet(key, value) {
|
|
58
134
|
const ctx = this.current();
|
|
59
135
|
return ctx.getOrSet(key, value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-context.js","sourceRoot":"","sources":["../src/request-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"request-context.js","sourceRoot":"","sources":["../src/request-context.ts"],"names":[],"mappings":"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"}
|