@bluelibs/runner 2.2.3 → 3.0.0
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/README.md +1315 -942
- package/dist/common.types.d.ts +20 -0
- package/dist/common.types.js +4 -0
- package/dist/common.types.js.map +1 -0
- package/dist/context.d.ts +34 -0
- package/dist/context.js +58 -0
- package/dist/context.js.map +1 -0
- package/dist/define.d.ts +22 -3
- package/dist/define.js +52 -8
- package/dist/define.js.map +1 -1
- package/dist/defs.d.ts +52 -31
- package/dist/defs.js +10 -2
- package/dist/defs.js.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/event.types.d.ts +18 -0
- package/dist/event.types.js +4 -0
- package/dist/event.types.js.map +1 -0
- package/dist/examples/registrator-example.d.ts +122 -0
- package/dist/examples/registrator-example.js +147 -0
- package/dist/examples/registrator-example.js.map +1 -0
- package/dist/globals/globalEvents.d.ts +41 -0
- package/dist/globals/globalEvents.js +94 -0
- package/dist/globals/globalEvents.js.map +1 -0
- package/dist/globals/globalMiddleware.d.ts +23 -0
- package/dist/globals/globalMiddleware.js +15 -0
- package/dist/globals/globalMiddleware.js.map +1 -0
- package/dist/globals/globalResources.d.ts +27 -0
- package/dist/globals/globalResources.js +47 -0
- package/dist/globals/globalResources.js.map +1 -0
- package/dist/globals/middleware/cache.middleware.d.ts +34 -0
- package/dist/globals/middleware/cache.middleware.js +85 -0
- package/dist/globals/middleware/cache.middleware.js.map +1 -0
- package/dist/globals/middleware/requireContext.middleware.d.ts +6 -0
- package/dist/globals/middleware/requireContext.middleware.js +25 -0
- package/dist/globals/middleware/requireContext.middleware.js.map +1 -0
- package/dist/globals/middleware/retry.middleware.d.ts +20 -0
- package/dist/globals/middleware/retry.middleware.js +34 -0
- package/dist/globals/middleware/retry.middleware.js.map +1 -0
- package/dist/globals/resources/queue.resource.d.ts +7 -0
- package/dist/globals/resources/queue.resource.js +31 -0
- package/dist/globals/resources/queue.resource.js.map +1 -0
- package/dist/index.d.ts +45 -9
- package/dist/index.js +14 -9
- package/dist/index.js.map +1 -1
- package/dist/middleware.types.d.ts +40 -0
- package/dist/middleware.types.js +4 -0
- package/dist/middleware.types.js.map +1 -0
- package/dist/models/DependencyProcessor.d.ts +2 -1
- package/dist/models/DependencyProcessor.js +11 -13
- package/dist/models/DependencyProcessor.js.map +1 -1
- package/dist/models/EventManager.d.ts +5 -0
- package/dist/models/EventManager.js +44 -2
- package/dist/models/EventManager.js.map +1 -1
- package/dist/models/Logger.d.ts +30 -12
- package/dist/models/Logger.js +130 -42
- package/dist/models/Logger.js.map +1 -1
- package/dist/models/OverrideManager.d.ts +13 -0
- package/dist/models/OverrideManager.js +70 -0
- package/dist/models/OverrideManager.js.map +1 -0
- package/dist/models/Queue.d.ts +25 -0
- package/dist/models/Queue.js +54 -0
- package/dist/models/Queue.js.map +1 -0
- package/dist/models/ResourceInitializer.d.ts +5 -2
- package/dist/models/ResourceInitializer.js +20 -14
- package/dist/models/ResourceInitializer.js.map +1 -1
- package/dist/models/Semaphore.d.ts +61 -0
- package/dist/models/Semaphore.js +166 -0
- package/dist/models/Semaphore.js.map +1 -0
- package/dist/models/Store.d.ts +17 -72
- package/dist/models/Store.js +71 -269
- package/dist/models/Store.js.map +1 -1
- package/dist/models/StoreConstants.d.ts +11 -0
- package/dist/models/StoreConstants.js +18 -0
- package/dist/models/StoreConstants.js.map +1 -0
- package/dist/models/StoreRegistry.d.ts +25 -0
- package/dist/models/StoreRegistry.js +171 -0
- package/dist/models/StoreRegistry.js.map +1 -0
- package/dist/models/StoreTypes.d.ts +21 -0
- package/dist/models/StoreTypes.js +3 -0
- package/dist/models/StoreTypes.js.map +1 -0
- package/dist/models/StoreValidator.d.ts +10 -0
- package/dist/models/StoreValidator.js +41 -0
- package/dist/models/StoreValidator.js.map +1 -0
- package/dist/models/TaskRunner.js +39 -24
- package/dist/models/TaskRunner.js.map +1 -1
- package/dist/models/VarStore.d.ts +17 -0
- package/dist/models/VarStore.js +60 -0
- package/dist/models/VarStore.js.map +1 -0
- package/dist/models/index.d.ts +3 -0
- package/dist/models/index.js +3 -0
- package/dist/models/index.js.map +1 -1
- package/dist/resource.types.d.ts +31 -0
- package/dist/resource.types.js +3 -0
- package/dist/resource.types.js.map +1 -0
- package/dist/run.d.ts +4 -1
- package/dist/run.js +6 -3
- package/dist/run.js.map +1 -1
- package/dist/symbols.d.ts +24 -0
- package/dist/symbols.js +29 -0
- package/dist/symbols.js.map +1 -0
- package/dist/task.types.d.ts +55 -0
- package/dist/task.types.js +23 -0
- package/dist/task.types.js.map +1 -0
- package/dist/tools/registratorId.d.ts +4 -0
- package/dist/tools/registratorId.js +40 -0
- package/dist/tools/registratorId.js.map +1 -0
- package/dist/tools/simpleHash.d.ts +9 -0
- package/dist/tools/simpleHash.js +34 -0
- package/dist/tools/simpleHash.js.map +1 -0
- package/dist/types/base-interfaces.d.ts +18 -0
- package/dist/types/base-interfaces.js +6 -0
- package/dist/types/base-interfaces.js.map +1 -0
- package/dist/types/base.d.ts +13 -0
- package/dist/types/base.js +3 -0
- package/dist/types/base.js.map +1 -0
- package/dist/types/dependencies.d.ts +22 -0
- package/dist/types/dependencies.js +3 -0
- package/dist/types/dependencies.js.map +1 -0
- package/dist/types/dependency-core.d.ts +14 -0
- package/dist/types/dependency-core.js +5 -0
- package/dist/types/dependency-core.js.map +1 -0
- package/dist/types/events.d.ts +52 -0
- package/dist/types/events.js +6 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/hooks.d.ts +16 -0
- package/dist/types/hooks.js +5 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.js +27 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/meta.d.ts +13 -0
- package/dist/types/meta.js +5 -0
- package/dist/types/meta.js.map +1 -0
- package/dist/types/middleware.d.ts +38 -0
- package/dist/types/middleware.js +6 -0
- package/dist/types/middleware.js.map +1 -0
- package/dist/types/registerable.d.ts +10 -0
- package/dist/types/registerable.js +5 -0
- package/dist/types/registerable.js.map +1 -0
- package/dist/types/resources.d.ts +44 -0
- package/dist/types/resources.js +5 -0
- package/dist/types/resources.js.map +1 -0
- package/dist/types/symbols.d.ts +24 -0
- package/dist/types/symbols.js +30 -0
- package/dist/types/symbols.js.map +1 -0
- package/dist/types/tasks.d.ts +41 -0
- package/dist/types/tasks.js +5 -0
- package/dist/types/tasks.js.map +1 -0
- package/dist/types/utilities.d.ts +7 -0
- package/dist/types/utilities.js +5 -0
- package/dist/types/utilities.js.map +1 -0
- package/package.json +10 -6
- package/src/__tests__/benchmark/benchmark.test.ts +1 -1
- package/src/__tests__/context.test.ts +91 -0
- package/src/__tests__/errors.test.ts +8 -5
- package/src/__tests__/globalEvents.test.ts +1 -1
- package/src/__tests__/globals/cache.middleware.test.ts +772 -0
- package/src/__tests__/globals/queue.resource.test.ts +141 -0
- package/src/__tests__/globals/requireContext.middleware.test.ts +98 -0
- package/src/__tests__/globals/retry.middleware.test.ts +157 -0
- package/src/__tests__/index.helper.test.ts +55 -0
- package/src/__tests__/models/EventManager.test.ts +144 -0
- package/src/__tests__/models/Logger.test.ts +291 -34
- package/src/__tests__/models/Queue.test.ts +189 -0
- package/src/__tests__/models/ResourceInitializer.test.ts +8 -6
- package/src/__tests__/models/Semaphore.test.ts +713 -0
- package/src/__tests__/models/Store.test.ts +40 -0
- package/src/__tests__/models/TaskRunner.test.ts +86 -5
- package/src/__tests__/run.middleware.test.ts +166 -12
- package/src/__tests__/run.overrides.test.ts +13 -10
- package/src/__tests__/run.test.ts +363 -12
- package/src/__tests__/setOutput.test.ts +244 -0
- package/src/__tests__/tools/getCallerFile.test.ts +9 -9
- package/src/__tests__/typesafety.test.ts +54 -39
- package/src/context.ts +86 -0
- package/src/define.ts +84 -14
- package/src/defs.ts +91 -41
- package/src/errors.ts +3 -1
- package/src/{globalEvents.ts → globals/globalEvents.ts} +13 -12
- package/src/globals/globalMiddleware.ts +14 -0
- package/src/{globalResources.ts → globals/globalResources.ts} +14 -10
- package/src/globals/middleware/cache.middleware.ts +115 -0
- package/src/globals/middleware/requireContext.middleware.ts +36 -0
- package/src/globals/middleware/retry.middleware.ts +56 -0
- package/src/globals/resources/queue.resource.ts +34 -0
- package/src/index.ts +9 -5
- package/src/models/DependencyProcessor.ts +36 -40
- package/src/models/EventManager.ts +45 -5
- package/src/models/Logger.ts +170 -48
- package/src/models/OverrideManager.ts +84 -0
- package/src/models/Queue.ts +66 -0
- package/src/models/ResourceInitializer.ts +38 -20
- package/src/models/Semaphore.ts +208 -0
- package/src/models/Store.ts +94 -342
- package/src/models/StoreConstants.ts +17 -0
- package/src/models/StoreRegistry.ts +217 -0
- package/src/models/StoreTypes.ts +46 -0
- package/src/models/StoreValidator.ts +38 -0
- package/src/models/TaskRunner.ts +53 -40
- package/src/models/index.ts +3 -0
- package/src/run.ts +7 -4
- package/src/__tests__/index.ts +0 -15
- package/src/examples/express-mongo/index.ts +0 -1
package/dist/models/Logger.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Logger = void 0;
|
|
4
|
-
const globalEvents_1 = require("../globalEvents");
|
|
4
|
+
const globalEvents_1 = require("../globals/globalEvents");
|
|
5
5
|
class Logger {
|
|
6
6
|
eventManager;
|
|
7
7
|
printThreshold = null;
|
|
8
|
-
|
|
8
|
+
boundContext = {};
|
|
9
|
+
static Severity = {
|
|
9
10
|
trace: 0,
|
|
10
11
|
debug: 1,
|
|
11
12
|
info: 2,
|
|
@@ -13,25 +14,53 @@ class Logger {
|
|
|
13
14
|
error: 4,
|
|
14
15
|
critical: 5,
|
|
15
16
|
};
|
|
16
|
-
constructor(eventManager) {
|
|
17
|
+
constructor(eventManager, boundContext = {}) {
|
|
17
18
|
this.eventManager = eventManager;
|
|
19
|
+
this.boundContext = { ...boundContext };
|
|
18
20
|
}
|
|
19
21
|
/**
|
|
20
|
-
*
|
|
21
|
-
* @param message
|
|
22
|
+
* Creates a new logger instance with additional bound context
|
|
22
23
|
*/
|
|
23
|
-
|
|
24
|
+
with(context) {
|
|
25
|
+
return new Logger(this.eventManager, {
|
|
26
|
+
...this.boundContext,
|
|
27
|
+
...context,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
extractErrorInfo(error) {
|
|
31
|
+
return {
|
|
32
|
+
name: error.name,
|
|
33
|
+
message: error.message,
|
|
34
|
+
stack: error.stack,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Core logging method with structured LogInfo
|
|
39
|
+
*/
|
|
40
|
+
log(level, message, logInfo = {}) {
|
|
41
|
+
const { source, error, data, ...context } = logInfo;
|
|
24
42
|
const log = {
|
|
25
43
|
level,
|
|
26
|
-
|
|
27
|
-
source: source,
|
|
44
|
+
message,
|
|
45
|
+
source: source || this.boundContext.source,
|
|
28
46
|
timestamp: new Date(),
|
|
47
|
+
error: error ? this.extractErrorInfo(error) : undefined,
|
|
48
|
+
data: data || undefined,
|
|
49
|
+
context: { ...this.boundContext, ...context },
|
|
29
50
|
};
|
|
30
51
|
if (this.printThreshold &&
|
|
31
|
-
|
|
52
|
+
Logger.Severity[level] >= Logger.Severity[this.printThreshold]) {
|
|
32
53
|
this.print(log);
|
|
33
54
|
}
|
|
34
|
-
|
|
55
|
+
if (this.eventManager.hasListeners(globalEvents_1.globalEvents.log)) {
|
|
56
|
+
setImmediate(() => {
|
|
57
|
+
this.eventManager
|
|
58
|
+
.emit(globalEvents_1.globalEvents.log, log, source || this.boundContext.source || "unknown")
|
|
59
|
+
.catch((err) => {
|
|
60
|
+
console.error("Logger event emission failed:", err);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
35
64
|
}
|
|
36
65
|
/**
|
|
37
66
|
* Will print logs after that, use `null` to disable autoprinting.
|
|
@@ -41,47 +70,106 @@ class Logger {
|
|
|
41
70
|
this.printThreshold = level;
|
|
42
71
|
}
|
|
43
72
|
print(log) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
73
|
+
const { level, source, message, timestamp, error, data, context } = log;
|
|
74
|
+
// Color codes for different log levels
|
|
75
|
+
const colors = {
|
|
76
|
+
trace: '\x1b[90m', // bright black/gray
|
|
77
|
+
debug: '\x1b[36m', // cyan
|
|
78
|
+
info: '\x1b[32m', // green
|
|
79
|
+
warn: '\x1b[33m', // yellow
|
|
80
|
+
error: '\x1b[31m', // red
|
|
81
|
+
critical: '\x1b[35m', // magenta
|
|
82
|
+
reset: '\x1b[0m', // reset
|
|
83
|
+
bold: '\x1b[1m', // bold
|
|
84
|
+
dim: '\x1b[2m', // dim
|
|
85
|
+
blue: '\x1b[34m', // blue
|
|
86
|
+
red: '\x1b[31m', // red
|
|
87
|
+
cyan: '\x1b[36m', // cyan
|
|
88
|
+
};
|
|
89
|
+
const levelColor = colors[level] || colors.info;
|
|
90
|
+
// Format timestamp
|
|
91
|
+
const time = timestamp.toLocaleTimeString('en-US', {
|
|
92
|
+
hour12: false,
|
|
93
|
+
hour: '2-digit',
|
|
94
|
+
minute: '2-digit',
|
|
95
|
+
second: '2-digit'
|
|
96
|
+
});
|
|
97
|
+
const ms = timestamp.getMilliseconds().toString().padStart(3, '0');
|
|
98
|
+
const formattedTime = `${colors.dim}${time}.${ms}${colors.reset}`;
|
|
99
|
+
// Format level with color and padding
|
|
100
|
+
const levelStr = `${levelColor}${colors.bold}${level.toUpperCase().padEnd(8)}${colors.reset}`;
|
|
101
|
+
// Format source
|
|
102
|
+
const sourceStr = source ? `${colors.blue}[${source}]${colors.reset} ` : '';
|
|
103
|
+
// Format the main message
|
|
104
|
+
let messageStr;
|
|
105
|
+
if (typeof message === 'object') {
|
|
106
|
+
messageStr = JSON.stringify(message, null, 2);
|
|
59
107
|
}
|
|
60
108
|
else {
|
|
61
|
-
|
|
109
|
+
messageStr = String(message);
|
|
110
|
+
}
|
|
111
|
+
// Build the main log line
|
|
112
|
+
const mainLine = `${formattedTime} ${levelStr} ${sourceStr}${messageStr}`;
|
|
113
|
+
// Start building output lines
|
|
114
|
+
const lines = [mainLine];
|
|
115
|
+
// Add error information if present
|
|
116
|
+
if (error) {
|
|
117
|
+
lines.push(`${colors.dim}├─ ${colors.red}Error: ${error.name}${colors.reset}`);
|
|
118
|
+
lines.push(`${colors.dim}├─ ${colors.red}${error.message}${colors.reset}`);
|
|
119
|
+
if (error.stack) {
|
|
120
|
+
const stackLines = error.stack.split('\n').slice(1, 4); // Show first 3 stack frames
|
|
121
|
+
stackLines.forEach((line, index) => {
|
|
122
|
+
const prefix = index === stackLines.length - 1 ? '└─' : '├─';
|
|
123
|
+
lines.push(`${colors.dim}${prefix} ${colors.red}${line.trim()}${colors.reset}`);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Add structured data if present
|
|
128
|
+
if (data && Object.keys(data).length > 0) {
|
|
129
|
+
lines.push(`${colors.dim}├─ ${colors.cyan}Data:${colors.reset}`);
|
|
130
|
+
const dataStr = JSON.stringify(data, null, 2);
|
|
131
|
+
const dataLines = dataStr.split('\n');
|
|
132
|
+
dataLines.forEach((line, index) => {
|
|
133
|
+
const prefix = index === dataLines.length - 1 ? '└─' : '├─';
|
|
134
|
+
lines.push(`${colors.dim}${prefix} ${colors.cyan}${line}${colors.reset}`);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// Add context if present (excluding common context we already show)
|
|
138
|
+
const filteredContext = context ? { ...context } : {};
|
|
139
|
+
delete filteredContext.source; // Already shown in source
|
|
140
|
+
if (filteredContext && Object.keys(filteredContext).length > 0) {
|
|
141
|
+
lines.push(`${colors.dim}└─ ${colors.blue}Context:${colors.reset}`);
|
|
142
|
+
const contextStr = JSON.stringify(filteredContext, null, 2);
|
|
143
|
+
const contextLines = contextStr.split('\n');
|
|
144
|
+
contextLines.forEach((line, index) => {
|
|
145
|
+
const prefix = index === contextLines.length - 1 ? ' ' : ' ';
|
|
146
|
+
lines.push(`${colors.dim}${prefix} ${colors.blue}${line}${colors.reset}`);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// Output all lines
|
|
150
|
+
lines.forEach(line => console.log(line));
|
|
151
|
+
// Add a subtle separator for multi-line logs
|
|
152
|
+
if (lines.length > 1) {
|
|
153
|
+
console.log(`${colors.dim}${colors.reset}`);
|
|
62
154
|
}
|
|
63
|
-
// Construct the final log message
|
|
64
|
-
const logMessage = `${formattedTimestamp} ${levelStr} ${contextStr} - ${dataStr}`;
|
|
65
|
-
// Print the log message
|
|
66
|
-
console.log(logMessage);
|
|
67
155
|
}
|
|
68
|
-
|
|
69
|
-
|
|
156
|
+
info(message, logInfo = {}) {
|
|
157
|
+
this.log("info", message, logInfo);
|
|
70
158
|
}
|
|
71
|
-
|
|
72
|
-
|
|
159
|
+
error(message, logInfo = {}) {
|
|
160
|
+
this.log("error", message, logInfo);
|
|
73
161
|
}
|
|
74
|
-
|
|
75
|
-
|
|
162
|
+
warn(message, logInfo = {}) {
|
|
163
|
+
this.log("warn", message, logInfo);
|
|
76
164
|
}
|
|
77
|
-
|
|
78
|
-
|
|
165
|
+
debug(message, logInfo = {}) {
|
|
166
|
+
this.log("debug", message, logInfo);
|
|
79
167
|
}
|
|
80
|
-
|
|
81
|
-
|
|
168
|
+
trace(message, logInfo = {}) {
|
|
169
|
+
this.log("trace", message, logInfo);
|
|
82
170
|
}
|
|
83
|
-
|
|
84
|
-
|
|
171
|
+
critical(message, logInfo = {}) {
|
|
172
|
+
this.log("critical", message, logInfo);
|
|
85
173
|
}
|
|
86
174
|
}
|
|
87
175
|
exports.Logger = Logger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../src/models/Logger.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../src/models/Logger.ts"],"names":[],"mappings":";;;AAAA,0DAAuD;AAgCvD,MAAa,MAAM;IAcL;IAbZ,cAAc,GAAqB,IAAI,CAAC;IAChC,YAAY,GAAwB,EAAE,CAAC;IAExC,MAAM,CAAC,QAAQ,GAAG;QACvB,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,CAAC;KACZ,CAAC;IAEF,YACY,YAA0B,EACpC,eAAoC,EAAE;QAD5B,iBAAY,GAAZ,YAAY,CAAc;QAGpC,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,OAA4B;QACtC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE;YACnC,GAAG,IAAI,CAAC,YAAY;YACpB,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB,CAAC,KAAY;QAKnC,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,KAAgB,EAAE,OAAY,EAAE,UAAmB,EAAE;QAC9D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC;QAEpD,MAAM,GAAG,GAAS;YAChB,KAAK;YACL,OAAO;YACP,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM;YAC1C,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;YACvD,IAAI,EAAE,IAAI,IAAI,SAAS;YACvB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,OAAO,EAAE;SAC9C,CAAC;QAEF,IACE,IAAI,CAAC,cAAc;YACnB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,EAC9D,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,2BAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACrD,YAAY,CAAC,GAAG,EAAE;gBAChB,IAAI,CAAC,YAAY;qBACd,IAAI,CACH,2BAAY,CAAC,GAAG,EAChB,GAAG,EACH,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,SAAS,CAChD;qBACA,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;gBACtD,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,iBAAiB,CAAC,KAAuB;QAC9C,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,GAAS;QACpB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;QAExE,uCAAuC;QACvC,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,UAAU,EAAK,oBAAoB;YAC1C,KAAK,EAAE,UAAU,EAAK,OAAO;YAC7B,IAAI,EAAE,UAAU,EAAM,QAAQ;YAC9B,IAAI,EAAE,UAAU,EAAM,SAAS;YAC/B,KAAK,EAAE,UAAU,EAAK,MAAM;YAC5B,QAAQ,EAAE,UAAU,EAAE,UAAU;YAChC,KAAK,EAAE,SAAS,EAAM,QAAQ;YAC9B,IAAI,EAAE,SAAS,EAAO,OAAO;YAC7B,GAAG,EAAE,SAAS,EAAQ,MAAM;YAC5B,IAAI,EAAE,UAAU,EAAM,OAAO;YAC7B,GAAG,EAAE,UAAU,EAAO,MAAM;YAC5B,IAAI,EAAE,UAAU,EAAM,OAAO;SAC9B,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,CAAC,KAA4B,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC;QAEvE,mBAAmB;QACnB,MAAM,IAAI,GAAG,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACjD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,SAAS,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnE,MAAM,aAAa,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAElE,sCAAsC;QACtC,MAAM,QAAQ,GAAG,GAAG,UAAU,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAE9F,gBAAgB;QAChB,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAE5E,0BAA0B;QAC1B,IAAI,UAAkB,CAAC;QACvB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAED,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,GAAG,aAAa,IAAI,QAAQ,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;QAE1E,8BAA8B;QAC9B,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEzB,mCAAmC;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,UAAU,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/E,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3E,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,4BAA4B;gBACpF,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;oBACjC,MAAM,MAAM,GAAG,KAAK,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC7D,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBAClF,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAChC,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,MAAM,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9E,CAAC,CAAC,CAAC;QACL,CAAC;QAED,oEAAoE;QACpE,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,0BAA0B;QAEzD,IAAI,eAAe,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACpE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5D,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACnC,MAAM,MAAM,GAAG,KAAK,KAAK,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC/D,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,MAAM,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9E,CAAC,CAAC,CAAC;QACL,CAAC;QAED,mBAAmB;QACnB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAEzC,6CAA6C;QAC7C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAEM,IAAI,CAAC,OAAY,EAAE,UAAmB,EAAE;QAC7C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,OAAY,EAAE,UAAmB,EAAE;QAC9C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAEM,IAAI,CAAC,OAAY,EAAE,UAAmB,EAAE;QAC7C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,OAAY,EAAE,UAAmB,EAAE;QAC9C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAEM,KAAK,CAAC,OAAY,EAAE,UAAmB,EAAE;QAC9C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAEM,QAAQ,CAAC,OAAY,EAAE,UAAmB,EAAE;QACjD,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;;AAhNH,wBAiNC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IResource, IMiddleware, ITask, IResourceWithConfig, RegisterableItems } from "../defs";
|
|
2
|
+
import { StoreRegistry } from "./StoreRegistry";
|
|
3
|
+
export declare class OverrideManager {
|
|
4
|
+
private readonly registry;
|
|
5
|
+
overrides: Map<string, IResource | IMiddleware | ITask | IResourceWithConfig>;
|
|
6
|
+
overrideRequests: Set<{
|
|
7
|
+
source: string;
|
|
8
|
+
override: RegisterableItems;
|
|
9
|
+
}>;
|
|
10
|
+
constructor(registry: StoreRegistry);
|
|
11
|
+
storeOverridesDeeply<C>(element: IResource<C, any, any>): void;
|
|
12
|
+
processOverrides(): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OverrideManager = void 0;
|
|
4
|
+
const utils = require("../define");
|
|
5
|
+
const errors_1 = require("../errors");
|
|
6
|
+
class OverrideManager {
|
|
7
|
+
registry;
|
|
8
|
+
overrides = new Map();
|
|
9
|
+
overrideRequests = new Set();
|
|
10
|
+
constructor(registry) {
|
|
11
|
+
this.registry = registry;
|
|
12
|
+
}
|
|
13
|
+
storeOverridesDeeply(element) {
|
|
14
|
+
element.overrides.forEach((override) => {
|
|
15
|
+
if (utils.isResource(override)) {
|
|
16
|
+
this.storeOverridesDeeply(override);
|
|
17
|
+
}
|
|
18
|
+
let id;
|
|
19
|
+
if (utils.isResourceWithConfig(override)) {
|
|
20
|
+
this.storeOverridesDeeply(override.resource);
|
|
21
|
+
id = override.resource.id;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
id = override.id;
|
|
25
|
+
}
|
|
26
|
+
this.overrideRequests.add({ source: element.id, override });
|
|
27
|
+
this.overrides.set(id, override);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
processOverrides() {
|
|
31
|
+
// If we are trying to use override on something that wasn't previously registered, we throw an error.
|
|
32
|
+
for (const override of this.overrides.values()) {
|
|
33
|
+
let hasAnyItem = false;
|
|
34
|
+
if (utils.isTask(override)) {
|
|
35
|
+
hasAnyItem = this.registry.tasks.has(override.id);
|
|
36
|
+
}
|
|
37
|
+
else if (utils.isResource(override)) {
|
|
38
|
+
hasAnyItem = this.registry.resources.has(override.id);
|
|
39
|
+
}
|
|
40
|
+
else if (utils.isMiddleware(override)) {
|
|
41
|
+
hasAnyItem = this.registry.middlewares.has(override.id);
|
|
42
|
+
}
|
|
43
|
+
else if (utils.isResourceWithConfig(override)) {
|
|
44
|
+
hasAnyItem = this.registry.resources.has(override.resource.id);
|
|
45
|
+
}
|
|
46
|
+
if (!hasAnyItem) {
|
|
47
|
+
const id = utils.isResourceWithConfig(override)
|
|
48
|
+
? override.resource.id
|
|
49
|
+
: override.id;
|
|
50
|
+
throw errors_1.Errors.dependencyNotFound(id);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
for (const override of this.overrides.values()) {
|
|
54
|
+
if (utils.isTask(override)) {
|
|
55
|
+
this.registry.storeTask(override, false);
|
|
56
|
+
}
|
|
57
|
+
else if (utils.isResource(override)) {
|
|
58
|
+
this.registry.storeResource(override, false);
|
|
59
|
+
}
|
|
60
|
+
else if (utils.isMiddleware(override)) {
|
|
61
|
+
this.registry.storeMiddleware(override, false);
|
|
62
|
+
}
|
|
63
|
+
else if (utils.isResourceWithConfig(override)) {
|
|
64
|
+
this.registry.storeResourceWithConfig(override, false);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.OverrideManager = OverrideManager;
|
|
70
|
+
//# sourceMappingURL=OverrideManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OverrideManager.js","sourceRoot":"","sources":["../../src/models/OverrideManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cooperative task queue.
|
|
3
|
+
* • Tasks run one‑after‑another (FIFO ordering).
|
|
4
|
+
* • Dead‑lock detection prevents nesting.
|
|
5
|
+
* • dispose() drains or cancels outstanding tasks, then rejects new ones.
|
|
6
|
+
*/
|
|
7
|
+
export declare class Queue {
|
|
8
|
+
private tail;
|
|
9
|
+
private disposed;
|
|
10
|
+
private abortController;
|
|
11
|
+
private readonly executionContext;
|
|
12
|
+
/**
|
|
13
|
+
* Schedule an asynchronous task.
|
|
14
|
+
* @param task – receives an AbortSignal so it can cancel early if desired.
|
|
15
|
+
*/
|
|
16
|
+
run<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T>;
|
|
17
|
+
/**
|
|
18
|
+
* Disposes the queue.
|
|
19
|
+
* @param options.cancel – if true, broadcasts AbortSignal to running task.
|
|
20
|
+
* default: false (waits for tasks to finish).
|
|
21
|
+
*/
|
|
22
|
+
dispose(options?: {
|
|
23
|
+
cancel?: boolean;
|
|
24
|
+
}): Promise<void>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Queue = void 0;
|
|
4
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
5
|
+
/**
|
|
6
|
+
* Cooperative task queue.
|
|
7
|
+
* • Tasks run one‑after‑another (FIFO ordering).
|
|
8
|
+
* • Dead‑lock detection prevents nesting.
|
|
9
|
+
* • dispose() drains or cancels outstanding tasks, then rejects new ones.
|
|
10
|
+
*/
|
|
11
|
+
class Queue {
|
|
12
|
+
tail = Promise.resolve();
|
|
13
|
+
disposed = false;
|
|
14
|
+
abortController = new AbortController();
|
|
15
|
+
// true while inside a queued task → helps detect "queue in queue"
|
|
16
|
+
executionContext = new node_async_hooks_1.AsyncLocalStorage();
|
|
17
|
+
/**
|
|
18
|
+
* Schedule an asynchronous task.
|
|
19
|
+
* @param task – receives an AbortSignal so it can cancel early if desired.
|
|
20
|
+
*/
|
|
21
|
+
run(task) {
|
|
22
|
+
// 1. refuse new work if we've disposed
|
|
23
|
+
if (this.disposed) {
|
|
24
|
+
return Promise.reject(new Error("Queue has been disposed"));
|
|
25
|
+
}
|
|
26
|
+
// 2. detect dead‑locks (a queued task adding another queued task)
|
|
27
|
+
if (this.executionContext.getStore()) {
|
|
28
|
+
return Promise.reject(new Error("Dead‑lock detected: a queued task attempted to queue another task"));
|
|
29
|
+
}
|
|
30
|
+
const { signal } = this.abortController;
|
|
31
|
+
// 3. chain task after the current tail
|
|
32
|
+
const result = this.tail.then(() => this.executionContext.run(true, () => task(signal)));
|
|
33
|
+
// 4. preserve the chain even if the task rejects (swallow internally)
|
|
34
|
+
this.tail = result.catch(() => { });
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Disposes the queue.
|
|
39
|
+
* @param options.cancel – if true, broadcasts AbortSignal to running task.
|
|
40
|
+
* default: false (waits for tasks to finish).
|
|
41
|
+
*/
|
|
42
|
+
async dispose(options = {}) {
|
|
43
|
+
if (this.disposed)
|
|
44
|
+
return;
|
|
45
|
+
this.disposed = true;
|
|
46
|
+
if (options.cancel) {
|
|
47
|
+
this.abortController.abort(); // notify cooperative tasks
|
|
48
|
+
}
|
|
49
|
+
// wait for everything already chained to settle
|
|
50
|
+
await this.tail.catch(() => { });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.Queue = Queue;
|
|
54
|
+
//# sourceMappingURL=Queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Queue.js","sourceRoot":"","sources":["../../src/models/Queue.ts"],"names":[],"mappings":";;;AAAA,uDAAqD;AAErD;;;;;GAKG;AACH,MAAa,KAAK;IACR,IAAI,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3C,QAAQ,GAAG,KAAK,CAAC;IACjB,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAEhD,kEAAkE;IACjD,gBAAgB,GAAG,IAAI,oCAAiB,EAAW,CAAC;IAErE;;;OAGG;IACI,GAAG,CAAI,IAAyC;QACrD,uCAAuC;QACvC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,kEAAkE;QAClE,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,EAAE,CAAC;YACrC,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,KAAK,CACP,mEAAmE,CACpE,CACF,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC;QAExC,uCAAuC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CACjC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CACpD,CAAC;QAEF,sEAAsE;QACtE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEnC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,OAAO,CAAC,UAAgC,EAAE;QACrD,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,2BAA2B;QAC3D,CAAC;QAED,gDAAgD;QAChD,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClC,CAAC;CACF;AAzDD,sBAyDC"}
|
|
@@ -11,6 +11,9 @@ export declare class ResourceInitializer {
|
|
|
11
11
|
* Begins the execution of an task. These are registered tasks and all sanity checks have been performed at this stage to ensure consistency of the object.
|
|
12
12
|
* This function can throw only if any of the event listeners or run function throws
|
|
13
13
|
*/
|
|
14
|
-
initializeResource<TConfig = null, TValue = any, TDeps extends DependencyMapType = {}>(resource: IResource<TConfig, TValue, TDeps>, config: TConfig, dependencies: DependencyValuesType<TDeps>): Promise<
|
|
15
|
-
|
|
14
|
+
initializeResource<TConfig = null, TValue = any, TDeps extends DependencyMapType = {}, TContext = any>(resource: IResource<TConfig, TValue, TDeps>, config: TConfig, dependencies: DependencyValuesType<TDeps>): Promise<{
|
|
15
|
+
value: TValue;
|
|
16
|
+
context: TContext;
|
|
17
|
+
}>;
|
|
18
|
+
initWithMiddleware<C, V, D extends DependencyMapType, TContext>(resource: IResource<C, V, D, TContext>, config: C, dependencies: DependencyValuesType<D>, context: TContext): Promise<V | undefined>;
|
|
16
19
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ResourceInitializer = void 0;
|
|
4
|
-
const globalEvents_1 = require("../globalEvents");
|
|
4
|
+
const globalEvents_1 = require("../globals/globalEvents");
|
|
5
5
|
class ResourceInitializer {
|
|
6
6
|
store;
|
|
7
7
|
eventManager;
|
|
@@ -16,6 +16,7 @@ class ResourceInitializer {
|
|
|
16
16
|
* This function can throw only if any of the event listeners or run function throws
|
|
17
17
|
*/
|
|
18
18
|
async initializeResource(resource, config, dependencies) {
|
|
19
|
+
const context = resource.context?.();
|
|
19
20
|
await this.eventManager.emit(globalEvents_1.globalEvents.resources.beforeInit, {
|
|
20
21
|
config,
|
|
21
22
|
resource,
|
|
@@ -23,18 +24,20 @@ class ResourceInitializer {
|
|
|
23
24
|
await this.eventManager.emit(resource.events.beforeInit, { config }, resource.id);
|
|
24
25
|
let error, value;
|
|
25
26
|
try {
|
|
26
|
-
|
|
27
|
+
if (resource.init) {
|
|
28
|
+
value = await this.initWithMiddleware(resource, config, dependencies, context);
|
|
29
|
+
}
|
|
27
30
|
await this.eventManager.emit(resource.events.afterInit, {
|
|
28
31
|
config,
|
|
29
|
-
value,
|
|
32
|
+
value: value,
|
|
30
33
|
}, resource.id);
|
|
31
34
|
await this.eventManager.emit(globalEvents_1.globalEvents.resources.afterInit, {
|
|
32
35
|
config,
|
|
33
36
|
resource,
|
|
34
|
-
value,
|
|
37
|
+
value: value,
|
|
35
38
|
}, resource.id);
|
|
36
|
-
this.logger.debug(`Resource ${resource.id} initialized`, resource.id);
|
|
37
|
-
return value;
|
|
39
|
+
this.logger.debug(`Resource ${resource.id} initialized`, { source: resource.id });
|
|
40
|
+
return { value: value, context };
|
|
38
41
|
}
|
|
39
42
|
catch (e) {
|
|
40
43
|
error = e;
|
|
@@ -44,27 +47,28 @@ class ResourceInitializer {
|
|
|
44
47
|
}
|
|
45
48
|
// If you want to rewthrow the error, this should be done inside the onError event.
|
|
46
49
|
await this.eventManager.emit(resource.events.onError, {
|
|
47
|
-
error,
|
|
50
|
+
error: error,
|
|
48
51
|
suppress,
|
|
49
52
|
}, resource.id);
|
|
50
53
|
await this.eventManager.emit(globalEvents_1.globalEvents.resources.onError, {
|
|
51
|
-
error,
|
|
54
|
+
error: error,
|
|
52
55
|
resource,
|
|
53
56
|
suppress,
|
|
54
57
|
}, resource.id);
|
|
55
58
|
if (!isSuppressed)
|
|
56
59
|
throw e;
|
|
60
|
+
return { value: undefined, context: {} };
|
|
57
61
|
}
|
|
58
62
|
}
|
|
59
|
-
async initWithMiddleware(resource, config, dependencies) {
|
|
63
|
+
async initWithMiddleware(resource, config, dependencies, context) {
|
|
60
64
|
let next = async (config) => {
|
|
61
65
|
if (resource.init) {
|
|
62
|
-
return resource.init.call(null, config, dependencies);
|
|
66
|
+
return resource.init.call(null, config, dependencies, context);
|
|
63
67
|
}
|
|
64
68
|
};
|
|
65
69
|
const existingMiddlewares = resource.middleware;
|
|
66
70
|
const createdMiddlewares = [
|
|
67
|
-
...this.store.
|
|
71
|
+
...this.store.getEverywhereMiddlewareForResources(existingMiddlewares.map((x) => x.id)),
|
|
68
72
|
...existingMiddlewares,
|
|
69
73
|
];
|
|
70
74
|
for (let i = createdMiddlewares.length - 1; i >= 0; i--) {
|
|
@@ -73,10 +77,12 @@ class ResourceInitializer {
|
|
|
73
77
|
const nextFunction = next;
|
|
74
78
|
next = async (config) => {
|
|
75
79
|
return storeMiddleware.middleware.run({
|
|
76
|
-
|
|
77
|
-
|
|
80
|
+
resource: {
|
|
81
|
+
definition: resource,
|
|
82
|
+
config,
|
|
83
|
+
},
|
|
78
84
|
next: nextFunction,
|
|
79
|
-
}, storeMiddleware.computedDependencies);
|
|
85
|
+
}, storeMiddleware.computedDependencies, middleware.config);
|
|
80
86
|
};
|
|
81
87
|
}
|
|
82
88
|
return next(config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceInitializer.js","sourceRoot":"","sources":["../../src/models/ResourceInitializer.ts"],"names":[],"mappings":";;;AAOA,
|
|
1
|
+
{"version":3,"file":"ResourceInitializer.js","sourceRoot":"","sources":["../../src/models/ResourceInitializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A semaphore that limits the number of concurrent operations.
|
|
3
|
+
* Used to prevent connection pool exhaustion by limiting concurrent
|
|
4
|
+
* database operations to the pool size.
|
|
5
|
+
*/
|
|
6
|
+
export declare class Semaphore {
|
|
7
|
+
private permits;
|
|
8
|
+
private readonly waitingQueue;
|
|
9
|
+
private disposed;
|
|
10
|
+
private readonly maxPermits;
|
|
11
|
+
constructor(maxPermits: number);
|
|
12
|
+
/**
|
|
13
|
+
* Acquire a permit. If no permits are available, waits until one becomes available.
|
|
14
|
+
*/
|
|
15
|
+
acquire(options?: {
|
|
16
|
+
timeout?: number;
|
|
17
|
+
signal?: AbortSignal;
|
|
18
|
+
}): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Release a permit, allowing waiting operations to proceed.
|
|
21
|
+
*/
|
|
22
|
+
release(): void;
|
|
23
|
+
private removeFromQueue;
|
|
24
|
+
/**
|
|
25
|
+
* Execute a function with a permit, automatically releasing it afterwards.
|
|
26
|
+
*/
|
|
27
|
+
withPermit<T>(fn: () => Promise<T>, options?: {
|
|
28
|
+
timeout?: number;
|
|
29
|
+
signal?: AbortSignal;
|
|
30
|
+
}): Promise<T>;
|
|
31
|
+
/**
|
|
32
|
+
* Dispose the semaphore, rejecting all waiting operations and preventing new ones.
|
|
33
|
+
*/
|
|
34
|
+
dispose(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Get current number of available permits (for debugging)
|
|
37
|
+
*/
|
|
38
|
+
getAvailablePermits(): number;
|
|
39
|
+
/**
|
|
40
|
+
* Get current number of waiting operations (for debugging)
|
|
41
|
+
*/
|
|
42
|
+
getWaitingCount(): number;
|
|
43
|
+
/**
|
|
44
|
+
* Get maximum number of permits
|
|
45
|
+
*/
|
|
46
|
+
getMaxPermits(): number;
|
|
47
|
+
/**
|
|
48
|
+
* Check if the semaphore has been disposed
|
|
49
|
+
*/
|
|
50
|
+
isDisposed(): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Get metrics about the current state of the semaphore
|
|
53
|
+
*/
|
|
54
|
+
getMetrics(): {
|
|
55
|
+
availablePermits: number;
|
|
56
|
+
waitingCount: number;
|
|
57
|
+
maxPermits: number;
|
|
58
|
+
utilization: number;
|
|
59
|
+
disposed: boolean;
|
|
60
|
+
};
|
|
61
|
+
}
|