@bluelibs/runner 3.4.0 → 3.4.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 +56 -43
- package/dist/models/Store.d.ts +3 -1
- package/dist/models/Store.js +6 -0
- package/dist/models/Store.js.map +1 -1
- package/dist/models/StoreRegistry.d.ts +3 -1
- package/dist/models/StoreRegistry.js +16 -0
- package/dist/models/StoreRegistry.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/models/Store.test.ts +57 -0
- package/src/models/Store.ts +9 -0
- package/src/models/StoreRegistry.ts +25 -0
package/README.md
CHANGED
|
@@ -601,6 +601,58 @@ The retry middleware can be configured with:
|
|
|
601
601
|
- `delayStrategy`: A function that returns the delay in milliseconds before the next attempt.
|
|
602
602
|
- `stopRetryIf`: A function to prevent retries for certain types of errors.
|
|
603
603
|
|
|
604
|
+
## Timeout Middleware: Never Wait Forever
|
|
605
|
+
|
|
606
|
+
The built-in timeout middleware prevents operations from hanging indefinitely by racing them against a configurable
|
|
607
|
+
timeout:
|
|
608
|
+
|
|
609
|
+
```typescript
|
|
610
|
+
import { globals } from "@bluelibs/runner";
|
|
611
|
+
|
|
612
|
+
const apiTask = task({
|
|
613
|
+
id: "app.tasks.externalApi",
|
|
614
|
+
middleware: [
|
|
615
|
+
globals.middleware.timeout.with({ ttl: 5000 }), // 5 second timeout
|
|
616
|
+
],
|
|
617
|
+
run: async () => {
|
|
618
|
+
// This operation will be aborted if it takes longer than 5 seconds
|
|
619
|
+
return await fetch("https://slow-api.example.com/data");
|
|
620
|
+
},
|
|
621
|
+
});
|
|
622
|
+
|
|
623
|
+
// Combine with retry for robust error handling
|
|
624
|
+
const resilientTask = task({
|
|
625
|
+
id: "app.tasks.resilient",
|
|
626
|
+
middleware: [
|
|
627
|
+
// Order matters here. Imagine a big onion.
|
|
628
|
+
globals.middleware.retry.with({
|
|
629
|
+
retries: 3,
|
|
630
|
+
delayStrategy: (attempt) => 1000 * attempt, // 1s, 2s, 3s delays
|
|
631
|
+
}),
|
|
632
|
+
globals.middleware.timeout.with({ ttl: 10000 }), // 10 second timeout per attempt
|
|
633
|
+
],
|
|
634
|
+
run: async () => {
|
|
635
|
+
// Each retry attempt gets its own 10-second timeout
|
|
636
|
+
return await unreliableOperation();
|
|
637
|
+
},
|
|
638
|
+
});
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
How it works:
|
|
642
|
+
|
|
643
|
+
- Uses AbortController and Promise.race() for clean cancellation
|
|
644
|
+
- Throws TimeoutError when the timeout is reached
|
|
645
|
+
- Works with any async operation in tasks and resources
|
|
646
|
+
- Integrates seamlessly with retry middleware for layered resilience
|
|
647
|
+
- Zero timeout (ttl: 0) throws immediately for testing edge cases
|
|
648
|
+
|
|
649
|
+
Best practices:
|
|
650
|
+
|
|
651
|
+
- Set timeouts based on expected operation duration plus buffer
|
|
652
|
+
- Combine with retry middleware for transient failures
|
|
653
|
+
- Use longer timeouts for resource initialization than task execution
|
|
654
|
+
- Consider network conditions when setting API call timeouts
|
|
655
|
+
|
|
604
656
|
## Logging: Because Console.log Isn't Professional
|
|
605
657
|
|
|
606
658
|
_The structured logging system that actually makes debugging enjoyable_
|
|
@@ -1191,6 +1243,8 @@ const apiEndpoint = task({
|
|
|
1191
1243
|
});
|
|
1192
1244
|
```
|
|
1193
1245
|
|
|
1246
|
+
To process these tags you can hook into `globals.events.afterInit`, use the global store as dependency and use the `getTasksWithTag()` and `getResourcesWithTag()` functionality.
|
|
1247
|
+
|
|
1194
1248
|
#### Smart Middleware Using Structured Tags
|
|
1195
1249
|
|
|
1196
1250
|
```typescript
|
|
@@ -1295,6 +1349,8 @@ const badTask = task({
|
|
|
1295
1349
|
|
|
1296
1350
|
### When to Use Metadata
|
|
1297
1351
|
|
|
1352
|
+
Always strive to provide a title and a description.
|
|
1353
|
+
|
|
1298
1354
|
#### ✅ Great Use Cases
|
|
1299
1355
|
|
|
1300
1356
|
**Documentation & Discovery**
|
|
@@ -1345,33 +1401,6 @@ const developmentTask = task({
|
|
|
1345
1401
|
});
|
|
1346
1402
|
```
|
|
1347
1403
|
|
|
1348
|
-
#### ❌ When NOT to Use Metadata
|
|
1349
|
-
|
|
1350
|
-
**Simple Internal Logic** - Don't overcomplicate straightforward code:
|
|
1351
|
-
|
|
1352
|
-
```typescript
|
|
1353
|
-
// ❌ Overkill
|
|
1354
|
-
const simple = task({
|
|
1355
|
-
meta: { tags: ["internal", "utility"] },
|
|
1356
|
-
run: () => Math.random(),
|
|
1357
|
-
});
|
|
1358
|
-
|
|
1359
|
-
// ✅ Better
|
|
1360
|
-
const generateId = () => Math.random().toString(36);
|
|
1361
|
-
```
|
|
1362
|
-
|
|
1363
|
-
**One-Off Tasks** - If it's used once, metadata won't help:
|
|
1364
|
-
|
|
1365
|
-
```typescript
|
|
1366
|
-
// ❌ Unnecessary
|
|
1367
|
-
const oneTimeScript = task({
|
|
1368
|
-
meta: { title: "Migration Script", tags: ["migration"] },
|
|
1369
|
-
run: () => {
|
|
1370
|
-
/* run once and forget */
|
|
1371
|
-
},
|
|
1372
|
-
});
|
|
1373
|
-
```
|
|
1374
|
-
|
|
1375
1404
|
### Extending Metadata: Custom Properties
|
|
1376
1405
|
|
|
1377
1406
|
For advanced use cases, you can extend the metadata interfaces to add your own properties:
|
|
@@ -1426,22 +1455,6 @@ const database = resource({
|
|
|
1426
1455
|
|
|
1427
1456
|
### Advanced Patterns
|
|
1428
1457
|
|
|
1429
|
-
#### Tag-Based Component Selection
|
|
1430
|
-
|
|
1431
|
-
```typescript
|
|
1432
|
-
// Find all API endpoints
|
|
1433
|
-
function getApiTasks(store: Store) {
|
|
1434
|
-
return store.getAllTasks().filter((task) => task.meta?.tags?.includes("api"));
|
|
1435
|
-
}
|
|
1436
|
-
|
|
1437
|
-
// Find all tasks with specific performance requirements
|
|
1438
|
-
function getPerformanceCriticalTasks(store: Store) {
|
|
1439
|
-
return store.tasks.values().filter(({ task }) => {
|
|
1440
|
-
return performanceTag.extract(task) !== null;
|
|
1441
|
-
});
|
|
1442
|
-
}
|
|
1443
|
-
```
|
|
1444
|
-
|
|
1445
1458
|
#### Dynamic Middleware Application
|
|
1446
1459
|
|
|
1447
1460
|
```typescript
|
package/dist/models/Store.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IResource, RegisterableItems, IMiddleware } from "../defs";
|
|
1
|
+
import { IResource, RegisterableItems, IMiddleware, ITag } from "../defs";
|
|
2
2
|
import { IDependentNode } from "../tools/findCircularDependencies";
|
|
3
3
|
import { EventManager } from "./EventManager";
|
|
4
4
|
import { Logger } from "./Logger";
|
|
@@ -37,5 +37,7 @@ export declare class Store {
|
|
|
37
37
|
getEverywhereMiddlewareForResources(excludingIds: Array<string | symbol>): IMiddleware[];
|
|
38
38
|
storeGenericItem<C>(item: RegisterableItems): void;
|
|
39
39
|
storeEventsForAllTasks(): void;
|
|
40
|
+
getTasksWithTag(tag: string | ITag): TaskStoreElementType[] | import("../defs").ITask<any, any, any, any, any>[];
|
|
41
|
+
getResourcesWithTag(tag: string | ITag): ResourceStoreElementType[] | IResource<any, any, {}, any, any>[];
|
|
40
42
|
getDependentNodes(): IDependentNode[];
|
|
41
43
|
}
|
package/dist/models/Store.js
CHANGED
|
@@ -125,6 +125,12 @@ class Store {
|
|
|
125
125
|
storeEventsForAllTasks() {
|
|
126
126
|
this.registry.storeEventsForAllTasks();
|
|
127
127
|
}
|
|
128
|
+
getTasksWithTag(tag) {
|
|
129
|
+
return this.registry.getTasksWithTag(tag);
|
|
130
|
+
}
|
|
131
|
+
getResourcesWithTag(tag) {
|
|
132
|
+
return this.registry.getResourcesWithTag(tag);
|
|
133
|
+
}
|
|
128
134
|
getDependentNodes() {
|
|
129
135
|
return this.registry.getDependentNodes();
|
|
130
136
|
}
|
package/dist/models/Store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.js","sourceRoot":"","sources":["../../src/models/Store.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"Store.js","sourceRoot":"","sources":["../../src/models/Store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IResource, ITask, IResourceWithConfig, RegisterableItems, IMiddleware, IEvent } from "../defs";
|
|
1
|
+
import { IResource, ITask, IResourceWithConfig, RegisterableItems, IMiddleware, IEvent, ITag } from "../defs";
|
|
2
2
|
import { TaskStoreElementType, MiddlewareStoreElementType, ResourceStoreElementType, EventStoreElementType } from "./StoreTypes";
|
|
3
3
|
import { StoreValidator } from "./StoreValidator";
|
|
4
4
|
export declare class StoreRegistry {
|
|
@@ -22,4 +22,6 @@ export declare class StoreRegistry {
|
|
|
22
22
|
private prepareResource;
|
|
23
23
|
private middlewareAsMap;
|
|
24
24
|
getDependentNodes(): any[];
|
|
25
|
+
getTasksWithTag(tag: string | ITag): TaskStoreElementType[] | ITask<any, any, any, any, any>[];
|
|
26
|
+
getResourcesWithTag(tag: string | ITag): ResourceStoreElementType[] | IResource<any, any, {}, any, any>[];
|
|
25
27
|
}
|
|
@@ -166,6 +166,22 @@ class StoreRegistry {
|
|
|
166
166
|
}
|
|
167
167
|
return depenedants;
|
|
168
168
|
}
|
|
169
|
+
getTasksWithTag(tag) {
|
|
170
|
+
if (typeof tag === "string") {
|
|
171
|
+
return Array.from(this.tasks.values()).filter((x) => x.task.meta?.tags?.includes(tag));
|
|
172
|
+
}
|
|
173
|
+
return Array.from(this.tasks.values())
|
|
174
|
+
.filter((x) => tag.extract(x.task.meta?.tags))
|
|
175
|
+
.map((x) => x.task);
|
|
176
|
+
}
|
|
177
|
+
getResourcesWithTag(tag) {
|
|
178
|
+
if (typeof tag === "string") {
|
|
179
|
+
return Array.from(this.resources.values()).filter((x) => x.resource.meta?.tags?.includes(tag));
|
|
180
|
+
}
|
|
181
|
+
return Array.from(this.resources.values())
|
|
182
|
+
.filter((x) => tag.extract(x.resource.meta?.tags))
|
|
183
|
+
.map((x) => x.resource);
|
|
184
|
+
}
|
|
169
185
|
}
|
|
170
186
|
exports.StoreRegistry = StoreRegistry;
|
|
171
187
|
//# sourceMappingURL=StoreRegistry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StoreRegistry.js","sourceRoot":"","sources":["../../src/models/StoreRegistry.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"StoreRegistry.js","sourceRoot":"","sources":["../../src/models/StoreRegistry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
defineTask,
|
|
6
6
|
defineMiddleware,
|
|
7
7
|
defineEvent,
|
|
8
|
+
defineTag,
|
|
8
9
|
} from "../../define";
|
|
9
10
|
import { Logger } from "../../models";
|
|
10
11
|
|
|
@@ -167,4 +168,60 @@ describe("Store", () => {
|
|
|
167
168
|
const result = store.getDependentNodes();
|
|
168
169
|
expect(Array.isArray(result)).toBe(true);
|
|
169
170
|
});
|
|
171
|
+
|
|
172
|
+
it("should call getTasksWithTag method", () => {
|
|
173
|
+
const tag = defineTag({
|
|
174
|
+
id: "tags.test",
|
|
175
|
+
});
|
|
176
|
+
const taskTest = defineTask({
|
|
177
|
+
meta: {
|
|
178
|
+
tags: [tag, "test"],
|
|
179
|
+
},
|
|
180
|
+
async run() {
|
|
181
|
+
return "OK";
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
const unfindableTask = defineTask({
|
|
185
|
+
run: async () => 1,
|
|
186
|
+
});
|
|
187
|
+
const rootResource = defineResource({
|
|
188
|
+
id: "root",
|
|
189
|
+
register: [taskTest, unfindableTask],
|
|
190
|
+
init: async () => "Root Value",
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
store.initializeStore(rootResource, {});
|
|
194
|
+
const result = store.getTasksWithTag(tag);
|
|
195
|
+
expect(Array.isArray(result)).toBe(true);
|
|
196
|
+
expect(result).toHaveLength(1);
|
|
197
|
+
const result2 = store.getTasksWithTag("test");
|
|
198
|
+
expect(result2).toHaveLength(1);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it("should call getResourcesWithTag method", () => {
|
|
202
|
+
const tag = defineTag({
|
|
203
|
+
id: "tags.test",
|
|
204
|
+
});
|
|
205
|
+
const resourceTest = defineResource({
|
|
206
|
+
meta: {
|
|
207
|
+
tags: [tag, "test"],
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
const unfindableResource = defineResource({
|
|
212
|
+
init: async () => 1,
|
|
213
|
+
});
|
|
214
|
+
const rootResource = defineResource({
|
|
215
|
+
id: "root",
|
|
216
|
+
register: [resourceTest, unfindableResource],
|
|
217
|
+
init: async () => "Root Value",
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
store.initializeStore(rootResource, {});
|
|
221
|
+
const result = store.getResourcesWithTag(tag);
|
|
222
|
+
expect(Array.isArray(result)).toBe(true);
|
|
223
|
+
expect(result).toHaveLength(1);
|
|
224
|
+
const result2 = store.getResourcesWithTag("test");
|
|
225
|
+
expect(result2).toHaveLength(1);
|
|
226
|
+
});
|
|
170
227
|
});
|
package/src/models/Store.ts
CHANGED
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
IResource,
|
|
4
4
|
RegisterableItems,
|
|
5
5
|
IMiddleware,
|
|
6
|
+
ITag,
|
|
6
7
|
} from "../defs";
|
|
7
8
|
import { IDependentNode } from "../tools/findCircularDependencies";
|
|
8
9
|
import { globalEventsArray } from "../globals/globalEvents";
|
|
@@ -178,6 +179,14 @@ export class Store {
|
|
|
178
179
|
this.registry.storeEventsForAllTasks();
|
|
179
180
|
}
|
|
180
181
|
|
|
182
|
+
public getTasksWithTag(tag: string | ITag) {
|
|
183
|
+
return this.registry.getTasksWithTag(tag);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
public getResourcesWithTag(tag: string | ITag) {
|
|
187
|
+
return this.registry.getResourcesWithTag(tag);
|
|
188
|
+
}
|
|
189
|
+
|
|
181
190
|
getDependentNodes(): IDependentNode[] {
|
|
182
191
|
return this.registry.getDependentNodes();
|
|
183
192
|
}
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
symbolMiddlewareEverywhereResources,
|
|
11
11
|
symbolMiddlewareEverywhereTasks,
|
|
12
12
|
IEvent,
|
|
13
|
+
ITag,
|
|
13
14
|
} from "../defs";
|
|
14
15
|
import * as utils from "../define";
|
|
15
16
|
import { UnknownItemTypeError } from "../errors";
|
|
@@ -225,4 +226,28 @@ export class StoreRegistry {
|
|
|
225
226
|
|
|
226
227
|
return depenedants;
|
|
227
228
|
}
|
|
229
|
+
|
|
230
|
+
getTasksWithTag(tag: string | ITag) {
|
|
231
|
+
if (typeof tag === "string") {
|
|
232
|
+
return Array.from(this.tasks.values()).filter((x) =>
|
|
233
|
+
x.task.meta?.tags?.includes(tag)
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return Array.from(this.tasks.values())
|
|
238
|
+
.filter((x) => tag.extract(x.task.meta?.tags))
|
|
239
|
+
.map((x) => x.task);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
getResourcesWithTag(tag: string | ITag) {
|
|
243
|
+
if (typeof tag === "string") {
|
|
244
|
+
return Array.from(this.resources.values()).filter((x) =>
|
|
245
|
+
x.resource.meta?.tags?.includes(tag)
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return Array.from(this.resources.values())
|
|
250
|
+
.filter((x) => tag.extract(x.resource.meta?.tags))
|
|
251
|
+
.map((x) => x.resource);
|
|
252
|
+
}
|
|
228
253
|
}
|