@bluelibs/runner 1.4.0 → 1.5.1
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 +32 -6
- package/dist/defs.d.ts +10 -0
- package/dist/models/DependencyProcessor.d.ts +3 -3
- package/dist/models/DependencyProcessor.js +15 -12
- package/dist/models/DependencyProcessor.js.map +1 -1
- package/dist/models/EventManager.d.ts +1 -1
- package/dist/models/EventManager.js +2 -2
- package/dist/models/EventManager.js.map +1 -1
- package/dist/models/Logger.d.ts +7 -7
- package/dist/models/Logger.js +15 -15
- package/dist/models/Logger.js.map +1 -1
- package/dist/models/ResourceInitializer.js +6 -6
- package/dist/models/ResourceInitializer.js.map +1 -1
- package/dist/models/Store.d.ts +7 -5
- package/dist/models/Store.js +10 -7
- package/dist/models/Store.js.map +1 -1
- package/dist/models/TaskRunner.js +6 -6
- package/dist/models/TaskRunner.js.map +1 -1
- package/dist/run.js +3 -2
- package/dist/run.js.map +1 -1
- package/package.json +3 -2
- package/src/__tests__/models/EventManager.test.ts +21 -21
- package/src/__tests__/models/Logger.test.ts +6 -4
- package/src/__tests__/models/ResourceInitializer.test.ts +56 -21
- package/src/defs.ts +10 -0
- package/src/models/DependencyProcessor.ts +33 -12
- package/src/models/EventManager.ts +3 -2
- package/src/models/Logger.ts +16 -16
- package/src/models/ResourceInitializer.ts +48 -23
- package/src/models/Store.ts +14 -7
- package/src/models/TaskRunner.ts +37 -17
- package/src/run.ts +3 -2
package/dist/run.js
CHANGED
|
@@ -33,13 +33,14 @@ async function run(resource, config) {
|
|
|
33
33
|
await store.storeEventsForAllTasks();
|
|
34
34
|
await processor.attachHooks();
|
|
35
35
|
await processor.computeAllDependencies();
|
|
36
|
+
// After this stage, logger print policy could have been set.
|
|
36
37
|
await logger.debug("All elements have been initalized..");
|
|
37
38
|
// Now we can safely compute dependencies without being afraid of an infinite loop.
|
|
38
39
|
// The hooking part is done here.
|
|
39
|
-
await eventManager.emit(globalEvents_1.globalEvents.beforeInit);
|
|
40
|
+
await eventManager.emit(globalEvents_1.globalEvents.beforeInit, null, resource.id);
|
|
40
41
|
// Now we can initialise the root resource
|
|
41
42
|
await processor.initializeRoot();
|
|
42
|
-
await eventManager.emit(globalEvents_1.globalEvents.afterInit);
|
|
43
|
+
await eventManager.emit(globalEvents_1.globalEvents.afterInit, null, resource.id);
|
|
43
44
|
await logger.debug("System initialized and operational.");
|
|
44
45
|
// disallow manipulation or attaching more
|
|
45
46
|
store.lock();
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":";;AAsDA,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":";;AAsDA,kBAuDC;AA7GD,oDAAiD;AAUjD,sEAAmE;AACnE,wDAAqD;AACrD,iDAA8C;AAC9C,0CAAuC;AACvC,+EAA4E;AAC5E,qCAAkC;AAClC,uDAAoD;AACpD,4CAAyC;AAqClC,KAAK,UAAU,GAAG,CACvB,QAAyB,EACzB,MAAU;IAEV,MAAM,YAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;IAExC,2FAA2F;IAC3F,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,YAAY,CAAC,CAAC;IAExC,MAAM,KAAK,GAAG,IAAI,aAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,uBAAU,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,yCAAmB,CACvC,KAAK,EACL,YAAY,EACZ,UAAU,EACV,MAAM,CACP,CAAC;IAEF,+FAA+F;IAC/F,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,KAAK,CAAC,gBAAgB,CAAC,iCAAe,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,KAAK,CAAC,gBAAgB,CAAC,iCAAe,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAEpE,kGAAkG;IAClG,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACjD,MAAM,oBAAoB,GAAG,IAAA,mDAAwB,EAAC,cAAc,CAAC,CAAC;IACtE,IAAI,oBAAoB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,eAAM,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,sFAAsF;IACtF,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAE/B,iGAAiG;IACjG,MAAM,KAAK,CAAC,sBAAsB,EAAE,CAAC;IACrC,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC;IAC9B,MAAM,SAAS,CAAC,sBAAsB,EAAE,CAAC;IAEzC,6DAA6D;IAC7D,MAAM,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAE1D,mFAAmF;IACnF,iCAAiC;IACjC,MAAM,YAAY,CAAC,IAAI,CAAC,2BAAY,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEpE,0CAA0C;IAC1C,MAAM,SAAS,CAAC,cAAc,EAAE,CAAC;IAEjC,MAAM,YAAY,CAAC,IAAI,CAAC,2BAAY,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAE1D,0CAA0C;IAC1C,KAAK,CAAC,IAAI,EAAE,CAAC;IAEb,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bluelibs/runner",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"description": "BlueLibs Runner",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"repository": {
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"testonly": "npm test",
|
|
19
19
|
"test:ci": "npm run coverage -- --ci --maxWorkers=2 --reporters=default --reporters=jest-junit",
|
|
20
20
|
"prepublishOnly": "npm run build",
|
|
21
|
-
"typedoc": "typedoc",
|
|
21
|
+
"typedoc": "typedoc --options typedoc.json",
|
|
22
22
|
"benchmark": "jest --testMatch=\"**/__tests__/benchmark/benchmark.test.ts\" --testTimeout 10000"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"source-map-support": "^0.5.13",
|
|
40
40
|
"ts-jest": "^29.0.0",
|
|
41
41
|
"typedoc": "^0.26.7",
|
|
42
|
+
"typedoc-material-theme": "^1.1.0",
|
|
42
43
|
"typescript": "^5.6.2"
|
|
43
44
|
},
|
|
44
45
|
"typings": "dist/index.d.ts",
|
|
@@ -15,7 +15,7 @@ describe("EventManager", () => {
|
|
|
15
15
|
const handler = jest.fn();
|
|
16
16
|
eventManager.addListener(eventDefinition, handler);
|
|
17
17
|
|
|
18
|
-
await eventManager.emit(eventDefinition, "testData");
|
|
18
|
+
await eventManager.emit(eventDefinition, "testData", "test");
|
|
19
19
|
|
|
20
20
|
expect(handler).toHaveBeenCalledTimes(1);
|
|
21
21
|
expect(handler).toHaveBeenCalledWith(
|
|
@@ -61,7 +61,7 @@ describe("EventManager", () => {
|
|
|
61
61
|
{ order: 3 }
|
|
62
62
|
);
|
|
63
63
|
|
|
64
|
-
await eventManager.emit(eventDefinition, "testData");
|
|
64
|
+
await eventManager.emit(eventDefinition, "testData", "test");
|
|
65
65
|
|
|
66
66
|
expect(results).toEqual([0, 1, 2, 3]);
|
|
67
67
|
});
|
|
@@ -72,10 +72,10 @@ describe("EventManager", () => {
|
|
|
72
72
|
|
|
73
73
|
eventManager.addListener(eventDefinition, handler, { filter });
|
|
74
74
|
|
|
75
|
-
await eventManager.emit(eventDefinition, "blocked");
|
|
75
|
+
await eventManager.emit(eventDefinition, "blocked", "test");
|
|
76
76
|
expect(handler).not.toHaveBeenCalled();
|
|
77
77
|
|
|
78
|
-
await eventManager.emit(eventDefinition, "allowed");
|
|
78
|
+
await eventManager.emit(eventDefinition, "allowed", "test");
|
|
79
79
|
expect(handler).toHaveBeenCalledTimes(1);
|
|
80
80
|
expect(handler).toHaveBeenCalledWith(
|
|
81
81
|
expect.objectContaining({
|
|
@@ -89,7 +89,7 @@ describe("EventManager", () => {
|
|
|
89
89
|
|
|
90
90
|
eventManager.addGlobalListener(handler);
|
|
91
91
|
|
|
92
|
-
await eventManager.emit(eventDefinition, "testData");
|
|
92
|
+
await eventManager.emit(eventDefinition, "testData", "test");
|
|
93
93
|
|
|
94
94
|
expect(handler).toHaveBeenCalledTimes(1);
|
|
95
95
|
expect(handler).toHaveBeenCalledWith(
|
|
@@ -133,7 +133,7 @@ describe("EventManager", () => {
|
|
|
133
133
|
{ order: 3 }
|
|
134
134
|
);
|
|
135
135
|
|
|
136
|
-
await eventManager.emit(eventDefinition, "testData");
|
|
136
|
+
await eventManager.emit(eventDefinition, "testData", "test");
|
|
137
137
|
|
|
138
138
|
expect(results).toEqual([
|
|
139
139
|
"globalListener1",
|
|
@@ -169,8 +169,8 @@ describe("EventManager", () => {
|
|
|
169
169
|
eventManager.addListener(eventDef1, handler1);
|
|
170
170
|
eventManager.addListener(eventDef2, handler2);
|
|
171
171
|
|
|
172
|
-
await eventManager.emit(eventDef1, "data1");
|
|
173
|
-
await eventManager.emit(eventDef2, "data2");
|
|
172
|
+
await eventManager.emit(eventDef1, "data1", "test");
|
|
173
|
+
await eventManager.emit(eventDef2, "data2", "test");
|
|
174
174
|
|
|
175
175
|
expect(handler1).toHaveBeenCalledTimes(1);
|
|
176
176
|
expect(handler1).toHaveBeenCalledWith(
|
|
@@ -196,7 +196,7 @@ describe("EventManager", () => {
|
|
|
196
196
|
eventManager.addListener(eventDefinition, handler1);
|
|
197
197
|
eventManager.addListener(eventDefinition, handler2);
|
|
198
198
|
|
|
199
|
-
await eventManager.emit(eventDefinition, "testData");
|
|
199
|
+
await eventManager.emit(eventDefinition, "testData", "test");
|
|
200
200
|
|
|
201
201
|
expect(handler1).toHaveBeenCalledTimes(1);
|
|
202
202
|
expect(handler2).toHaveBeenCalledTimes(1);
|
|
@@ -210,8 +210,8 @@ describe("EventManager", () => {
|
|
|
210
210
|
|
|
211
211
|
eventManager.addListener([eventDef1, eventDef2], handler);
|
|
212
212
|
|
|
213
|
-
await eventManager.emit(eventDef1, "data1");
|
|
214
|
-
await eventManager.emit(eventDef2, "data2");
|
|
213
|
+
await eventManager.emit(eventDef1, "data1", "test");
|
|
214
|
+
await eventManager.emit(eventDef2, "data2", "test");
|
|
215
215
|
|
|
216
216
|
expect(handler).toHaveBeenCalledTimes(2);
|
|
217
217
|
expect(handler).toHaveBeenNthCalledWith(
|
|
@@ -240,7 +240,7 @@ describe("EventManager", () => {
|
|
|
240
240
|
eventManager.addListener(eventDef1, handler1);
|
|
241
241
|
eventManager.addListener(eventDef2, handler2);
|
|
242
242
|
|
|
243
|
-
await eventManager.emit(eventDef1, "data1");
|
|
243
|
+
await eventManager.emit(eventDef1, "data1", "test");
|
|
244
244
|
|
|
245
245
|
expect(handler1).toHaveBeenCalledTimes(1);
|
|
246
246
|
expect(handler2).not.toHaveBeenCalled();
|
|
@@ -266,7 +266,7 @@ describe("EventManager", () => {
|
|
|
266
266
|
{ order: 0 }
|
|
267
267
|
);
|
|
268
268
|
|
|
269
|
-
await eventManager.emit(eventDefinition, "testData");
|
|
269
|
+
await eventManager.emit(eventDefinition, "testData", "test");
|
|
270
270
|
|
|
271
271
|
expect(results).toEqual([0, 1]);
|
|
272
272
|
});
|
|
@@ -279,7 +279,7 @@ describe("EventManager", () => {
|
|
|
279
279
|
eventManager.addListener(eventDefinition, handler);
|
|
280
280
|
|
|
281
281
|
await expect(
|
|
282
|
-
eventManager.emit(eventDefinition, "testData")
|
|
282
|
+
eventManager.emit(eventDefinition, "testData", "test")
|
|
283
283
|
).rejects.toThrow("Handler error");
|
|
284
284
|
});
|
|
285
285
|
|
|
@@ -293,7 +293,7 @@ describe("EventManager", () => {
|
|
|
293
293
|
eventManager.addListener(eventDefinition, handler2);
|
|
294
294
|
|
|
295
295
|
await expect(
|
|
296
|
-
eventManager.emit(eventDefinition, "testData")
|
|
296
|
+
eventManager.emit(eventDefinition, "testData", "test")
|
|
297
297
|
).rejects.toThrow("Handler error");
|
|
298
298
|
|
|
299
299
|
// The second handler should have been called despite the error in the first
|
|
@@ -316,7 +316,7 @@ describe("EventManager", () => {
|
|
|
316
316
|
eventManager.lock();
|
|
317
317
|
|
|
318
318
|
await expect(
|
|
319
|
-
eventManager.emit(eventDefinition, "testData")
|
|
319
|
+
eventManager.emit(eventDefinition, "testData", "test")
|
|
320
320
|
).resolves.toBeUndefined();
|
|
321
321
|
|
|
322
322
|
expect(handler).toHaveBeenCalledTimes(1);
|
|
@@ -340,7 +340,7 @@ describe("EventManager", () => {
|
|
|
340
340
|
{ order: 1 }
|
|
341
341
|
);
|
|
342
342
|
|
|
343
|
-
await eventManager.emit(eventDefinition, "testData");
|
|
343
|
+
await eventManager.emit(eventDefinition, "testData", "test");
|
|
344
344
|
|
|
345
345
|
// According to the merge logic, event listeners come before global listeners when orders are equal
|
|
346
346
|
expect(results).toEqual(["eventListener", "globalListener"]);
|
|
@@ -352,16 +352,16 @@ describe("EventManager", () => {
|
|
|
352
352
|
|
|
353
353
|
eventManager.addGlobalListener(handler, { filter });
|
|
354
354
|
|
|
355
|
-
await eventManager.emit(eventDefinition, "blocked");
|
|
355
|
+
await eventManager.emit(eventDefinition, "blocked", "test");
|
|
356
356
|
expect(handler).not.toHaveBeenCalled();
|
|
357
357
|
|
|
358
|
-
await eventManager.emit(eventDefinition, "allowed");
|
|
358
|
+
await eventManager.emit(eventDefinition, "allowed", "test");
|
|
359
359
|
expect(handler).toHaveBeenCalledTimes(1);
|
|
360
360
|
});
|
|
361
361
|
|
|
362
362
|
it("should handle emitting with no listeners", async () => {
|
|
363
363
|
await expect(
|
|
364
|
-
eventManager.emit(eventDefinition, "testData")
|
|
364
|
+
eventManager.emit(eventDefinition, "testData", "test")
|
|
365
365
|
).resolves.toBeUndefined();
|
|
366
366
|
});
|
|
367
367
|
|
|
@@ -372,7 +372,7 @@ describe("EventManager", () => {
|
|
|
372
372
|
|
|
373
373
|
eventManager.addListener(voidEventDefinition, handler);
|
|
374
374
|
|
|
375
|
-
await eventManager.emit(voidEventDefinition);
|
|
375
|
+
await eventManager.emit(voidEventDefinition, undefined, "test");
|
|
376
376
|
|
|
377
377
|
expect(handler).toHaveBeenCalledTimes(1);
|
|
378
378
|
expect(handler).toHaveBeenCalledWith(
|
|
@@ -26,7 +26,8 @@ describe("Logger", () => {
|
|
|
26
26
|
level: testLevel,
|
|
27
27
|
data: testData,
|
|
28
28
|
timestamp: expect.any(Date),
|
|
29
|
-
})
|
|
29
|
+
}),
|
|
30
|
+
"unknown"
|
|
30
31
|
);
|
|
31
32
|
});
|
|
32
33
|
|
|
@@ -43,7 +44,7 @@ describe("Logger", () => {
|
|
|
43
44
|
mockEventManager.emit = jest.fn();
|
|
44
45
|
|
|
45
46
|
for (const level of levels) {
|
|
46
|
-
await logger.log(level, `Test ${level} message
|
|
47
|
+
await logger.log(level, `Test ${level} message`, "testSource");
|
|
47
48
|
|
|
48
49
|
expect(mockEventManager.emit).toHaveBeenCalledWith(
|
|
49
50
|
globalEvents.log,
|
|
@@ -51,7 +52,8 @@ describe("Logger", () => {
|
|
|
51
52
|
level,
|
|
52
53
|
data: `Test ${level} message`,
|
|
53
54
|
timestamp: expect.any(Date),
|
|
54
|
-
})
|
|
55
|
+
}),
|
|
56
|
+
"testSource"
|
|
55
57
|
);
|
|
56
58
|
}
|
|
57
59
|
});
|
|
@@ -71,7 +73,7 @@ describe("Logger", () => {
|
|
|
71
73
|
it("should print log messages correctly", async () => {
|
|
72
74
|
const testLog: ILog = {
|
|
73
75
|
level: "info",
|
|
74
|
-
|
|
76
|
+
source: "test",
|
|
75
77
|
data: "Test log message",
|
|
76
78
|
timestamp: new Date("2023-01-01T00:00:00Z"),
|
|
77
79
|
};
|
|
@@ -3,6 +3,8 @@ import { Store } from "../../models/Store";
|
|
|
3
3
|
import { EventManager } from "../../models/EventManager";
|
|
4
4
|
import { defineResource } from "../../define";
|
|
5
5
|
import { Logger } from "../../models";
|
|
6
|
+
import { globalResources } from "../../globalResources";
|
|
7
|
+
import { globalEvents } from "../../globalEvents";
|
|
6
8
|
|
|
7
9
|
describe("ResourceInitializer", () => {
|
|
8
10
|
let store: Store;
|
|
@@ -39,13 +41,30 @@ describe("ResourceInitializer", () => {
|
|
|
39
41
|
mockConfig,
|
|
40
42
|
mockDependencies
|
|
41
43
|
);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
|
|
45
|
+
expect(emitSpy).toHaveBeenCalledWith(
|
|
46
|
+
globalEvents.resources.beforeInit,
|
|
47
|
+
{
|
|
48
|
+
config: mockConfig,
|
|
49
|
+
resource: mockResource,
|
|
50
|
+
},
|
|
51
|
+
"testResource"
|
|
52
|
+
);
|
|
53
|
+
expect(emitSpy).toHaveBeenCalledWith(
|
|
54
|
+
mockResource.events.beforeInit,
|
|
55
|
+
{
|
|
56
|
+
config: mockConfig,
|
|
57
|
+
},
|
|
58
|
+
"testResource"
|
|
59
|
+
);
|
|
60
|
+
expect(emitSpy).toHaveBeenCalledWith(
|
|
61
|
+
mockResource.events.afterInit,
|
|
62
|
+
{
|
|
63
|
+
config: mockConfig,
|
|
64
|
+
value: "initialized value",
|
|
65
|
+
},
|
|
66
|
+
"testResource"
|
|
67
|
+
);
|
|
49
68
|
});
|
|
50
69
|
|
|
51
70
|
it("should handle errors and emit onError event", async () => {
|
|
@@ -74,13 +93,21 @@ describe("ResourceInitializer", () => {
|
|
|
74
93
|
mockConfig,
|
|
75
94
|
mockDependencies
|
|
76
95
|
);
|
|
77
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
96
|
+
expect(emitSpy).toHaveBeenCalledWith(
|
|
97
|
+
mockResource.events.beforeInit,
|
|
98
|
+
{
|
|
99
|
+
config: mockConfig,
|
|
100
|
+
},
|
|
101
|
+
"testResource"
|
|
102
|
+
);
|
|
103
|
+
expect(emitSpy).toHaveBeenCalledWith(
|
|
104
|
+
mockResource.events.onError,
|
|
105
|
+
{
|
|
106
|
+
error: mockError,
|
|
107
|
+
suppress: expect.any(Function),
|
|
108
|
+
},
|
|
109
|
+
"testResource"
|
|
110
|
+
);
|
|
84
111
|
});
|
|
85
112
|
|
|
86
113
|
it("should handle resources without init function", async () => {
|
|
@@ -100,12 +127,20 @@ describe("ResourceInitializer", () => {
|
|
|
100
127
|
);
|
|
101
128
|
|
|
102
129
|
expect(result).toBeUndefined();
|
|
103
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
130
|
+
expect(emitSpy).toHaveBeenCalledWith(
|
|
131
|
+
mockResource.events.beforeInit,
|
|
132
|
+
{
|
|
133
|
+
config: mockConfig,
|
|
134
|
+
},
|
|
135
|
+
"testResource"
|
|
136
|
+
);
|
|
137
|
+
expect(emitSpy).toHaveBeenCalledWith(
|
|
138
|
+
mockResource.events.afterInit,
|
|
139
|
+
{
|
|
140
|
+
config: mockConfig,
|
|
141
|
+
value: undefined,
|
|
142
|
+
},
|
|
143
|
+
"testResource"
|
|
144
|
+
);
|
|
110
145
|
});
|
|
111
146
|
});
|
package/src/defs.ts
CHANGED
|
@@ -209,8 +209,18 @@ export interface IResourceWithConfig<
|
|
|
209
209
|
|
|
210
210
|
export interface IEvent<TPayload = any> {
|
|
211
211
|
id: string;
|
|
212
|
+
/**
|
|
213
|
+
* The data that the event carries. It can be anything.
|
|
214
|
+
*/
|
|
212
215
|
data: TPayload;
|
|
216
|
+
/**
|
|
217
|
+
* The timestamp when the event was created.
|
|
218
|
+
*/
|
|
213
219
|
timestamp: Date;
|
|
220
|
+
/**
|
|
221
|
+
* The source of the event. This can be useful for debugging.
|
|
222
|
+
*/
|
|
223
|
+
source: string;
|
|
214
224
|
}
|
|
215
225
|
|
|
216
226
|
export type EventHandlerType<T = any> = (
|
|
@@ -41,7 +41,10 @@ export class DependencyProcessor {
|
|
|
41
41
|
async computeAllDependencies() {
|
|
42
42
|
for (const middleware of this.store.middlewares.values()) {
|
|
43
43
|
const deps = middleware.middleware.dependencies as DependencyMapType;
|
|
44
|
-
middleware.computedDependencies = await this.extractDependencies(
|
|
44
|
+
middleware.computedDependencies = await this.extractDependencies(
|
|
45
|
+
deps,
|
|
46
|
+
middleware.middleware.id
|
|
47
|
+
);
|
|
45
48
|
}
|
|
46
49
|
|
|
47
50
|
for (const task of this.store.tasks.values()) {
|
|
@@ -61,7 +64,10 @@ export class DependencyProcessor {
|
|
|
61
64
|
task: TaskStoreElementType<any, any, any>
|
|
62
65
|
) {
|
|
63
66
|
const deps = task.task.dependencies as DependencyMapType;
|
|
64
|
-
task.computedDependencies = await this.extractDependencies(
|
|
67
|
+
task.computedDependencies = await this.extractDependencies(
|
|
68
|
+
deps,
|
|
69
|
+
task.task.id
|
|
70
|
+
);
|
|
65
71
|
|
|
66
72
|
let eventDefinition = task.task.on;
|
|
67
73
|
if (eventDefinition) {
|
|
@@ -117,7 +123,10 @@ export class DependencyProcessor {
|
|
|
117
123
|
resource: ResourceStoreElementType<any, any, {}>
|
|
118
124
|
) {
|
|
119
125
|
const deps = resource.resource.dependencies as DependencyMapType;
|
|
120
|
-
resource.computedDependencies = await this.extractDependencies(
|
|
126
|
+
resource.computedDependencies = await this.extractDependencies(
|
|
127
|
+
deps,
|
|
128
|
+
resource.resource.id
|
|
129
|
+
);
|
|
121
130
|
}
|
|
122
131
|
|
|
123
132
|
public async initializeRoot() {
|
|
@@ -197,24 +206,25 @@ export class DependencyProcessor {
|
|
|
197
206
|
}
|
|
198
207
|
|
|
199
208
|
async extractDependencies<T extends DependencyMapType>(
|
|
200
|
-
map: T
|
|
209
|
+
map: T,
|
|
210
|
+
source: string
|
|
201
211
|
): Promise<DependencyValuesType<T>> {
|
|
202
212
|
const object = {} as DependencyValuesType<T>;
|
|
203
213
|
|
|
204
214
|
for (const key in map) {
|
|
205
|
-
object[key] = await this.extractDependency(map[key]);
|
|
215
|
+
object[key] = await this.extractDependency(map[key], source);
|
|
206
216
|
}
|
|
207
217
|
|
|
208
218
|
return object;
|
|
209
219
|
}
|
|
210
220
|
|
|
211
|
-
async extractDependency(object) {
|
|
221
|
+
async extractDependency(object, source: string) {
|
|
212
222
|
if (utils.isResource(object)) {
|
|
213
223
|
return this.extractResourceDependency(object);
|
|
214
224
|
} else if (utils.isTask(object)) {
|
|
215
225
|
return this.extractTaskDependency(object);
|
|
216
226
|
} else if (utils.isEvent(object)) {
|
|
217
|
-
return this.extractEventDependency(object);
|
|
227
|
+
return this.extractEventDependency(object, source);
|
|
218
228
|
} else {
|
|
219
229
|
throw Errors.unknownItemType(object);
|
|
220
230
|
}
|
|
@@ -225,10 +235,17 @@ export class DependencyProcessor {
|
|
|
225
235
|
* @param object
|
|
226
236
|
* @returns
|
|
227
237
|
*/
|
|
228
|
-
extractEventDependency(
|
|
238
|
+
extractEventDependency(
|
|
239
|
+
object: IEventDefinition<Record<string, any>>,
|
|
240
|
+
source: string
|
|
241
|
+
) {
|
|
229
242
|
return async (input) => {
|
|
230
|
-
|
|
231
|
-
|
|
243
|
+
// runs it in background.
|
|
244
|
+
this.logger.debug({
|
|
245
|
+
message: `Event ${object.id} was emitted from ${source}`,
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
return this.eventManager.emit(object, input, source);
|
|
232
249
|
};
|
|
233
250
|
}
|
|
234
251
|
|
|
@@ -245,7 +262,8 @@ export class DependencyProcessor {
|
|
|
245
262
|
const dependencies = object.dependencies as DependencyMapType;
|
|
246
263
|
|
|
247
264
|
storeTask.computedDependencies = await this.extractDependencies(
|
|
248
|
-
dependencies
|
|
265
|
+
dependencies,
|
|
266
|
+
storeTask.task.id
|
|
249
267
|
);
|
|
250
268
|
}
|
|
251
269
|
|
|
@@ -277,7 +295,10 @@ export class DependencyProcessor {
|
|
|
277
295
|
storeResource.value = await this.resourceInitializer.initializeResource(
|
|
278
296
|
resource,
|
|
279
297
|
config,
|
|
280
|
-
await this.extractDependencies(
|
|
298
|
+
await this.extractDependencies(
|
|
299
|
+
resource.dependencies || {},
|
|
300
|
+
resource.id
|
|
301
|
+
)
|
|
281
302
|
);
|
|
282
303
|
}
|
|
283
304
|
}
|
|
@@ -55,9 +55,9 @@ export class EventManager {
|
|
|
55
55
|
|
|
56
56
|
async emit<TInput>(
|
|
57
57
|
eventDefinition: IEventDefinition<TInput>,
|
|
58
|
-
|
|
58
|
+
data: TInput,
|
|
59
|
+
source: string
|
|
59
60
|
): Promise<void> {
|
|
60
|
-
const data = args[0];
|
|
61
61
|
const eventListeners = this.listeners.get(eventDefinition.id) || [];
|
|
62
62
|
const allListeners = this.mergeSortedListeners(
|
|
63
63
|
eventListeners,
|
|
@@ -68,6 +68,7 @@ export class EventManager {
|
|
|
68
68
|
id: eventDefinition.id,
|
|
69
69
|
data,
|
|
70
70
|
timestamp: new Date(),
|
|
71
|
+
source,
|
|
71
72
|
};
|
|
72
73
|
|
|
73
74
|
for (const listener of allListeners) {
|
package/src/models/Logger.ts
CHANGED
|
@@ -11,7 +11,7 @@ export type LogLevels =
|
|
|
11
11
|
|
|
12
12
|
export interface ILog {
|
|
13
13
|
level: string;
|
|
14
|
-
|
|
14
|
+
source?: string;
|
|
15
15
|
data: any;
|
|
16
16
|
timestamp: Date;
|
|
17
17
|
}
|
|
@@ -42,7 +42,7 @@ export class Logger {
|
|
|
42
42
|
const log: ILog = {
|
|
43
43
|
level,
|
|
44
44
|
data,
|
|
45
|
-
|
|
45
|
+
source: source,
|
|
46
46
|
timestamp: new Date(),
|
|
47
47
|
};
|
|
48
48
|
|
|
@@ -53,7 +53,7 @@ export class Logger {
|
|
|
53
53
|
this.print(log);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
await this.eventManager.emit(globalEvents.log, log);
|
|
56
|
+
await this.eventManager.emit(globalEvents.log, log, source || "unknown");
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
/**
|
|
@@ -66,7 +66,7 @@ export class Logger {
|
|
|
66
66
|
|
|
67
67
|
public print(log: ILog) {
|
|
68
68
|
// Extract the relevant information from the log
|
|
69
|
-
const { level, context, data, timestamp } = log;
|
|
69
|
+
const { level, source: context, data, timestamp } = log;
|
|
70
70
|
|
|
71
71
|
// Format the timestamp to a more readable format
|
|
72
72
|
const formattedTimestamp = timestamp.toISOString();
|
|
@@ -94,27 +94,27 @@ export class Logger {
|
|
|
94
94
|
console.log(logMessage);
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
public async info(data: any,
|
|
98
|
-
await this.log("info", data,
|
|
97
|
+
public async info(data: any, source?: string) {
|
|
98
|
+
await this.log("info", data, source);
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
public async error(data: any,
|
|
102
|
-
await this.log("error", data,
|
|
101
|
+
public async error(data: any, source?: string) {
|
|
102
|
+
await this.log("error", data, source);
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
public async warn(data: any,
|
|
106
|
-
await this.log("warn", data,
|
|
105
|
+
public async warn(data: any, source?: string) {
|
|
106
|
+
await this.log("warn", data, source);
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
-
public async debug(data: any,
|
|
110
|
-
await this.log("debug", data,
|
|
109
|
+
public async debug(data: any, source?: string) {
|
|
110
|
+
await this.log("debug", data, source);
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
public async trace(data: any,
|
|
114
|
-
await this.log("trace", data,
|
|
113
|
+
public async trace(data: any, source?: string) {
|
|
114
|
+
await this.log("trace", data, source);
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
public async critical(data: any,
|
|
118
|
-
await this.log("critical", data,
|
|
117
|
+
public async critical(data: any, source?: string) {
|
|
118
|
+
await this.log("critical", data, source);
|
|
119
119
|
}
|
|
120
120
|
}
|
|
@@ -29,11 +29,20 @@ export class ResourceInitializer {
|
|
|
29
29
|
config: TConfig,
|
|
30
30
|
dependencies: DependencyValuesType<TDeps>
|
|
31
31
|
): Promise<TValue | undefined> {
|
|
32
|
-
await this.eventManager.emit(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
32
|
+
await this.eventManager.emit(
|
|
33
|
+
globalEvents.resources.beforeInit,
|
|
34
|
+
{
|
|
35
|
+
config,
|
|
36
|
+
resource,
|
|
37
|
+
},
|
|
38
|
+
resource.id
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
await this.eventManager.emit(
|
|
42
|
+
resource.events.beforeInit,
|
|
43
|
+
{ config },
|
|
44
|
+
resource.id
|
|
45
|
+
);
|
|
37
46
|
|
|
38
47
|
let error, value;
|
|
39
48
|
try {
|
|
@@ -41,15 +50,23 @@ export class ResourceInitializer {
|
|
|
41
50
|
value = await this.initWithMiddleware(resource, config, dependencies);
|
|
42
51
|
}
|
|
43
52
|
|
|
44
|
-
await this.eventManager.emit(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
resource
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
await this.eventManager.emit(
|
|
54
|
+
resource.events.afterInit,
|
|
55
|
+
{
|
|
56
|
+
config,
|
|
57
|
+
value,
|
|
58
|
+
},
|
|
59
|
+
resource.id
|
|
60
|
+
);
|
|
61
|
+
await this.eventManager.emit(
|
|
62
|
+
globalEvents.resources.afterInit,
|
|
63
|
+
{
|
|
64
|
+
config,
|
|
65
|
+
resource,
|
|
66
|
+
value,
|
|
67
|
+
},
|
|
68
|
+
resource.id
|
|
69
|
+
);
|
|
53
70
|
|
|
54
71
|
this.logger.debug(`Resource ${resource.id} initialized`);
|
|
55
72
|
|
|
@@ -60,15 +77,23 @@ export class ResourceInitializer {
|
|
|
60
77
|
const suppress = () => (isSuppressed = true);
|
|
61
78
|
|
|
62
79
|
// If you want to rewthrow the error, this should be done inside the onError event.
|
|
63
|
-
await this.eventManager.emit(
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
resource
|
|
70
|
-
|
|
71
|
-
|
|
80
|
+
await this.eventManager.emit(
|
|
81
|
+
resource.events.onError,
|
|
82
|
+
{
|
|
83
|
+
error,
|
|
84
|
+
suppress,
|
|
85
|
+
},
|
|
86
|
+
resource.id
|
|
87
|
+
);
|
|
88
|
+
await this.eventManager.emit(
|
|
89
|
+
globalEvents.resources.onError,
|
|
90
|
+
{
|
|
91
|
+
error,
|
|
92
|
+
resource,
|
|
93
|
+
suppress,
|
|
94
|
+
},
|
|
95
|
+
resource.id
|
|
96
|
+
);
|
|
72
97
|
|
|
73
98
|
if (!isSuppressed) throw e;
|
|
74
99
|
}
|