@beignet/core 0.0.30 → 0.0.32
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/CHANGELOG.md +86 -0
- package/README.md +48 -2
- package/dist/domain/entity.d.ts +37 -6
- package/dist/domain/entity.d.ts.map +1 -1
- package/dist/domain/entity.js +9 -7
- package/dist/domain/entity.js.map +1 -1
- package/dist/domain/index.d.ts +4 -4
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +4 -4
- package/dist/domain/index.js.map +1 -1
- package/dist/flags/index.d.ts +5 -4
- package/dist/flags/index.d.ts.map +1 -1
- package/dist/flags/index.js +10 -9
- package/dist/flags/index.js.map +1 -1
- package/dist/idempotency/index.d.ts +11 -1
- package/dist/idempotency/index.d.ts.map +1 -1
- package/dist/idempotency/index.js +4 -3
- package/dist/idempotency/index.js.map +1 -1
- package/dist/jobs/index.d.ts +35 -6
- package/dist/jobs/index.d.ts.map +1 -1
- package/dist/jobs/index.js +82 -11
- package/dist/jobs/index.js.map +1 -1
- package/dist/memo/index.d.ts +107 -0
- package/dist/memo/index.d.ts.map +1 -0
- package/dist/memo/index.js +205 -0
- package/dist/memo/index.js.map +1 -0
- package/dist/outbox/index.d.ts +20 -2
- package/dist/outbox/index.d.ts.map +1 -1
- package/dist/outbox/index.js +23 -8
- package/dist/outbox/index.js.map +1 -1
- package/dist/ports/events.d.ts +2 -2
- package/dist/providers/provider.d.ts +10 -2
- package/dist/providers/provider.d.ts.map +1 -1
- package/dist/providers/provider.js.map +1 -1
- package/dist/search/index.d.ts +2 -1
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +1 -0
- package/dist/search/index.js.map +1 -1
- package/dist/server/providers/loadProviderConfig.d.ts.map +1 -1
- package/dist/server/providers/loadProviderConfig.js +15 -2
- package/dist/server/providers/loadProviderConfig.js.map +1 -1
- package/dist/server/server.d.ts +1 -1
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +43 -3
- package/dist/server/server.js.map +1 -1
- package/dist/testing/index.d.ts +6 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +12 -3
- package/dist/testing/index.js.map +1 -1
- package/dist/uploads/index.d.ts +111 -2
- package/dist/uploads/index.d.ts.map +1 -1
- package/dist/uploads/index.js +124 -61
- package/dist/uploads/index.js.map +1 -1
- package/dist/webhooks/index.d.ts +1 -0
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/index.js +1 -0
- package/dist/webhooks/index.js.map +1 -1
- package/package.json +5 -1
- package/src/domain/entity.ts +61 -13
- package/src/domain/index.ts +8 -7
- package/src/flags/index.ts +23 -19
- package/src/idempotency/index.ts +17 -3
- package/src/jobs/index.ts +131 -16
- package/src/memo/index.ts +310 -0
- package/src/outbox/index.ts +52 -8
- package/src/ports/events.ts +2 -2
- package/src/providers/provider.ts +11 -2
- package/src/search/index.ts +3 -1
- package/src/server/providers/loadProviderConfig.ts +19 -2
- package/src/server/server.ts +73 -18
- package/src/testing/index.ts +19 -3
- package/src/uploads/index.ts +174 -62
- package/src/webhooks/index.ts +2 -0
- package/src/domain/events.ts +0 -59
package/dist/webhooks/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webhooks/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webhooks/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@beignet/core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.32",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Core framework primitives for Beignet",
|
|
6
6
|
"exports": {
|
|
@@ -65,6 +65,10 @@
|
|
|
65
65
|
"types": "./dist/locks/index.d.ts",
|
|
66
66
|
"default": "./dist/locks/index.js"
|
|
67
67
|
},
|
|
68
|
+
"./memo": {
|
|
69
|
+
"types": "./dist/memo/index.d.ts",
|
|
70
|
+
"default": "./dist/memo/index.js"
|
|
71
|
+
},
|
|
68
72
|
"./mail": {
|
|
69
73
|
"types": "./dist/mail/index.d.ts",
|
|
70
74
|
"default": "./dist/mail/index.js"
|
package/src/domain/entity.ts
CHANGED
|
@@ -66,9 +66,47 @@ function validateSchemaSync<T>(
|
|
|
66
66
|
// biome-ignore lint/suspicious/noExplicitAny: Base methods type for flexibility
|
|
67
67
|
type AnyMethods = Record<string, any>;
|
|
68
68
|
|
|
69
|
+
/**
|
|
70
|
+
* Base entity instance passed to the `.methods(...)` builder: validated props
|
|
71
|
+
* plus the `with` and `toJSON` helpers, before domain methods attach.
|
|
72
|
+
*
|
|
73
|
+
* `with(...)` is typed as returning the base instance here because the final
|
|
74
|
+
* methods object is still being defined while the builder runs. At runtime
|
|
75
|
+
* the returned instance carries the entity's methods, and `EntityInstance`
|
|
76
|
+
* maps base-instance returns back to the full instance type so consumers keep
|
|
77
|
+
* typed method chaining.
|
|
78
|
+
*/
|
|
79
|
+
export type EntityBaseInstance<Schema extends StandardSchema> =
|
|
80
|
+
InferOutput<Schema> & {
|
|
81
|
+
/**
|
|
82
|
+
* Create a new validated entity instance with patched properties.
|
|
83
|
+
*/
|
|
84
|
+
with(
|
|
85
|
+
patch: Partial<InferOutput<Schema>>,
|
|
86
|
+
): EntityBaseInstance<Schema> | Promise<EntityBaseInstance<Schema>>;
|
|
87
|
+
/**
|
|
88
|
+
* Convert the entity to a plain JSON object for persistence.
|
|
89
|
+
*/
|
|
90
|
+
toJSON(): InferOutput<Schema>;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Replace base-instance returns with the full entity instance type, unwrapping
|
|
95
|
+
* promises, so methods that return `self` or `self.with(...)` chain with the
|
|
96
|
+
* entity's methods attached.
|
|
97
|
+
*/
|
|
98
|
+
type WithEntityInstance<R, Instance, Schema extends StandardSchema> =
|
|
99
|
+
R extends Promise<infer P>
|
|
100
|
+
? Promise<WithEntityInstance<P, Instance, Schema>>
|
|
101
|
+
: R extends EntityBaseInstance<Schema>
|
|
102
|
+
? Instance
|
|
103
|
+
: R;
|
|
104
|
+
|
|
69
105
|
/**
|
|
70
106
|
* Entity instance with validated props, attached methods, and immutable update
|
|
71
|
-
* helpers.
|
|
107
|
+
* helpers. Method returns that are typed as the base instance (`self` or
|
|
108
|
+
* `self.with(...)`) are mapped to the full instance type so chaining keeps
|
|
109
|
+
* the entity's methods.
|
|
72
110
|
*/
|
|
73
111
|
export type EntityInstance<
|
|
74
112
|
Name extends string,
|
|
@@ -87,7 +125,13 @@ export type EntityInstance<
|
|
|
87
125
|
* Convert the entity to a plain JSON object for persistence.
|
|
88
126
|
*/
|
|
89
127
|
toJSON(): InferOutput<Schema>;
|
|
90
|
-
} &
|
|
128
|
+
} & {
|
|
129
|
+
[K in keyof Methods]: Methods[K] extends (...args: infer A) => infer R
|
|
130
|
+
? (
|
|
131
|
+
...args: A
|
|
132
|
+
) => WithEntityInstance<R, EntityInstance<Name, Schema, Methods>, Schema>
|
|
133
|
+
: Methods[K];
|
|
134
|
+
};
|
|
91
135
|
|
|
92
136
|
/**
|
|
93
137
|
* Entity definition returned by `defineEntity(...).build()`.
|
|
@@ -135,8 +179,7 @@ class EntityBuilder<
|
|
|
135
179
|
private readonly cfg: {
|
|
136
180
|
name: Name;
|
|
137
181
|
schema?: Schema;
|
|
138
|
-
|
|
139
|
-
methods?: (self: any) => Methods;
|
|
182
|
+
methods?: (self: EntityBaseInstance<Schema>) => Methods;
|
|
140
183
|
},
|
|
141
184
|
) {}
|
|
142
185
|
|
|
@@ -147,17 +190,22 @@ class EntityBuilder<
|
|
|
147
190
|
return new EntityBuilder<Name, S, Methods>({
|
|
148
191
|
name: this.cfg.name,
|
|
149
192
|
schema,
|
|
150
|
-
|
|
193
|
+
// Methods declared before props were typed against the previous schema;
|
|
194
|
+
// canonical builder order is props-then-methods, so this widening only
|
|
195
|
+
// affects the discouraged reverse order.
|
|
196
|
+
methods: this.cfg.methods as unknown as
|
|
197
|
+
| ((self: EntityBaseInstance<S>) => Methods)
|
|
198
|
+
| undefined,
|
|
151
199
|
});
|
|
152
200
|
}
|
|
153
201
|
|
|
154
202
|
/**
|
|
155
203
|
* Define methods to attach to entity instances.
|
|
156
|
-
* The method builder receives the base instance
|
|
204
|
+
* The method builder receives the typed base instance: validated props plus
|
|
205
|
+
* `with` and `toJSON`.
|
|
157
206
|
*/
|
|
158
207
|
methods<M extends AnyMethods>(
|
|
159
|
-
|
|
160
|
-
build: (self: any) => M,
|
|
208
|
+
build: (self: EntityBaseInstance<Schema>) => M,
|
|
161
209
|
): EntityBuilder<Name, Schema, M> {
|
|
162
210
|
return new EntityBuilder<Name, Schema, M>({
|
|
163
211
|
name: this.cfg.name,
|
|
@@ -190,8 +238,7 @@ class EntityBuilder<
|
|
|
190
238
|
// Cast parsed to a plain object for spreading
|
|
191
239
|
const parsedObj = parsed as Record<string, unknown>;
|
|
192
240
|
|
|
193
|
-
|
|
194
|
-
const base: any = {
|
|
241
|
+
const base = {
|
|
195
242
|
...parsedObj,
|
|
196
243
|
// Immutable update - creates a new validated instance
|
|
197
244
|
// Note: Re-validates the merged props for data integrity
|
|
@@ -205,7 +252,7 @@ class EntityBuilder<
|
|
|
205
252
|
toJSON() {
|
|
206
253
|
return parsed;
|
|
207
254
|
},
|
|
208
|
-
}
|
|
255
|
+
} as EntityBaseInstance<Schema>;
|
|
209
256
|
|
|
210
257
|
const methods = methodsBuilder?.(base) ?? {};
|
|
211
258
|
const instance = Object.freeze({
|
|
@@ -262,6 +309,7 @@ class EntityBuilder<
|
|
|
262
309
|
* ```
|
|
263
310
|
*/
|
|
264
311
|
export function defineEntity<Name extends string>(name: Name) {
|
|
265
|
-
|
|
266
|
-
|
|
312
|
+
return new EntityBuilder<Name, StandardSchema, Record<string, never>>({
|
|
313
|
+
name,
|
|
314
|
+
});
|
|
267
315
|
}
|
package/src/domain/index.ts
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @beignet/core/domain
|
|
3
3
|
*
|
|
4
|
-
* Domain modeling helpers for Beignet - value objects
|
|
4
|
+
* Domain modeling helpers for Beignet - value objects and entities.
|
|
5
5
|
*
|
|
6
6
|
* This package provides small, framework-agnostic helpers for domain modeling:
|
|
7
7
|
* - A Value Object builder (defineValueObject)
|
|
8
8
|
* - An Entity/Aggregate builder (defineEntity)
|
|
9
|
-
*
|
|
9
|
+
*
|
|
10
|
+
* Domain events are declared with `defineEvent` from `@beignet/core/events`.
|
|
10
11
|
*/
|
|
11
12
|
|
|
12
|
-
export { defineEntity, type EntityDef, type EntityInstance } from "./entity.js";
|
|
13
13
|
export {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
type
|
|
17
|
-
|
|
14
|
+
defineEntity,
|
|
15
|
+
type EntityBaseInstance,
|
|
16
|
+
type EntityDef,
|
|
17
|
+
type EntityInstance,
|
|
18
|
+
} from "./entity.js";
|
|
18
19
|
export { defineValueObject, type ValueObjectDef } from "./value-object.js";
|
package/src/flags/index.ts
CHANGED
|
@@ -38,7 +38,7 @@ export type FlagKey = string;
|
|
|
38
38
|
/**
|
|
39
39
|
* Feature flag value kind.
|
|
40
40
|
*/
|
|
41
|
-
export type
|
|
41
|
+
export type FlagValueKind = "boolean" | "string" | "number" | "object";
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
44
|
* Subject used for provider-neutral flag targeting.
|
|
@@ -104,8 +104,9 @@ export type FlagEvaluationContext = {
|
|
|
104
104
|
* Flag definition registered through `defineFlags(...)`.
|
|
105
105
|
*/
|
|
106
106
|
export type FlagDef<TValue extends FlagValue = FlagValue> = {
|
|
107
|
+
kind: "flag";
|
|
107
108
|
key: FlagKey;
|
|
108
|
-
|
|
109
|
+
valueKind: FlagValueKindForValue<TValue>;
|
|
109
110
|
defaultValue: TValue;
|
|
110
111
|
description?: string;
|
|
111
112
|
metadata?: Record<string, unknown>;
|
|
@@ -120,13 +121,14 @@ export type InferFlagValue<TFlag> =
|
|
|
120
121
|
/**
|
|
121
122
|
* Map a value type to its runtime flag kind.
|
|
122
123
|
*/
|
|
123
|
-
export type
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
124
|
+
export type FlagValueKindForValue<TValue extends FlagValue> =
|
|
125
|
+
TValue extends boolean
|
|
126
|
+
? "boolean"
|
|
127
|
+
: TValue extends string
|
|
128
|
+
? "string"
|
|
129
|
+
: TValue extends number
|
|
130
|
+
? "number"
|
|
131
|
+
: "object";
|
|
130
132
|
|
|
131
133
|
/**
|
|
132
134
|
* Options accepted when declaring a flag.
|
|
@@ -184,7 +186,7 @@ export type FlagEvaluationDetails<TValue extends FlagValue = FlagValue> = {
|
|
|
184
186
|
key: string;
|
|
185
187
|
value: TValue;
|
|
186
188
|
defaultValue: TValue;
|
|
187
|
-
|
|
189
|
+
valueKind: FlagValueKindForValue<TValue>;
|
|
188
190
|
reason: FlagEvaluationReason;
|
|
189
191
|
defaulted: boolean;
|
|
190
192
|
variant?: string;
|
|
@@ -320,20 +322,21 @@ export type MemoryFlagsPort = FlagsPort & {
|
|
|
320
322
|
};
|
|
321
323
|
|
|
322
324
|
function createFlag<TValue extends FlagValue>(
|
|
323
|
-
|
|
325
|
+
valueKind: FlagValueKind,
|
|
324
326
|
key: string,
|
|
325
327
|
options: DefineFlagOptions<TValue>,
|
|
326
328
|
): FlagDef<TValue> {
|
|
327
329
|
const defaultValue = options.default;
|
|
328
|
-
if (!
|
|
330
|
+
if (!matchesValueKind(defaultValue, valueKind)) {
|
|
329
331
|
throw new Error(
|
|
330
|
-
`Flag "${key}" default value does not match "${
|
|
332
|
+
`Flag "${key}" default value does not match "${valueKind}" flag value kind.`,
|
|
331
333
|
);
|
|
332
334
|
}
|
|
333
335
|
|
|
334
336
|
return {
|
|
337
|
+
kind: "flag",
|
|
335
338
|
key,
|
|
336
|
-
|
|
339
|
+
valueKind: valueKind as FlagValueKindForValue<TValue>,
|
|
337
340
|
defaultValue,
|
|
338
341
|
description: options.description,
|
|
339
342
|
metadata: options.metadata,
|
|
@@ -454,9 +457,9 @@ export function createMemoryFlags(
|
|
|
454
457
|
...port,
|
|
455
458
|
values,
|
|
456
459
|
set(flag, value) {
|
|
457
|
-
if (!
|
|
460
|
+
if (!matchesValueKind(value, flag.valueKind)) {
|
|
458
461
|
throw new Error(
|
|
459
|
-
`Flag "${flag.key}" value does not match "${flag.
|
|
462
|
+
`Flag "${flag.key}" value does not match "${flag.valueKind}" flag value kind.`,
|
|
460
463
|
);
|
|
461
464
|
}
|
|
462
465
|
values.set(flag.key, value);
|
|
@@ -485,13 +488,14 @@ function createFlagsFromStore(
|
|
|
485
488
|
const values = readValues();
|
|
486
489
|
const stored = values[flag.key];
|
|
487
490
|
const hasStored = Object.hasOwn(values, flag.key);
|
|
488
|
-
const usedStoredValue =
|
|
491
|
+
const usedStoredValue =
|
|
492
|
+
hasStored && matchesValueKind(stored, flag.valueKind);
|
|
489
493
|
const value = usedStoredValue
|
|
490
494
|
? (stored as typeof defaultValue)
|
|
491
495
|
: defaultValue;
|
|
492
496
|
const details: FlagEvaluationDetails<typeof defaultValue> = {
|
|
493
497
|
key: flag.key,
|
|
494
|
-
|
|
498
|
+
valueKind: flag.valueKind as FlagValueKindForValue<typeof defaultValue>,
|
|
495
499
|
value,
|
|
496
500
|
defaultValue,
|
|
497
501
|
reason: usedStoredValue ? "static" : "default",
|
|
@@ -551,7 +555,7 @@ function createFlagsFromStore(
|
|
|
551
555
|
return flags;
|
|
552
556
|
}
|
|
553
557
|
|
|
554
|
-
function
|
|
558
|
+
function matchesValueKind(value: unknown, kind: FlagValueKind): boolean {
|
|
555
559
|
switch (kind) {
|
|
556
560
|
case "boolean":
|
|
557
561
|
return typeof value === "boolean";
|
package/src/idempotency/index.ts
CHANGED
|
@@ -507,13 +507,27 @@ function reservationFromRecord(
|
|
|
507
507
|
};
|
|
508
508
|
}
|
|
509
509
|
|
|
510
|
+
/**
|
|
511
|
+
* Options for `createMemoryIdempotencyStore(...)`.
|
|
512
|
+
*/
|
|
513
|
+
export interface MemoryIdempotencyStoreOptions {
|
|
514
|
+
/**
|
|
515
|
+
* Clock used for reservation and completion timestamps. Defaults to the
|
|
516
|
+
* system clock.
|
|
517
|
+
*/
|
|
518
|
+
now?: () => Date;
|
|
519
|
+
}
|
|
520
|
+
|
|
510
521
|
/**
|
|
511
522
|
* Create an in-memory idempotency store for tests and local examples.
|
|
512
523
|
*
|
|
513
524
|
* The memory store is process-local and not suitable for multi-process
|
|
514
525
|
* production deployments.
|
|
515
526
|
*/
|
|
516
|
-
export function createMemoryIdempotencyStore(
|
|
527
|
+
export function createMemoryIdempotencyStore(
|
|
528
|
+
options: MemoryIdempotencyStoreOptions = {},
|
|
529
|
+
): MemoryIdempotencyStore {
|
|
530
|
+
const storeNow = options.now ?? (() => new Date());
|
|
517
531
|
const records = new Map<string, MemoryRecord>();
|
|
518
532
|
|
|
519
533
|
return {
|
|
@@ -527,7 +541,7 @@ export function createMemoryIdempotencyStore(): MemoryIdempotencyStore {
|
|
|
527
541
|
assertNonEmptyString("fingerprint", input.fingerprint);
|
|
528
542
|
assertTtl(input.ttlSec);
|
|
529
543
|
|
|
530
|
-
const now =
|
|
544
|
+
const now = storeNow();
|
|
531
545
|
const storageKey = createIdempotencyStorageKey(input);
|
|
532
546
|
const existing = records.get(storageKey);
|
|
533
547
|
|
|
@@ -573,7 +587,7 @@ export function createMemoryIdempotencyStore(): MemoryIdempotencyStore {
|
|
|
573
587
|
|
|
574
588
|
existing.status = "completed";
|
|
575
589
|
existing.result = input.result;
|
|
576
|
-
existing.completedAt =
|
|
590
|
+
existing.completedAt = storeNow();
|
|
577
591
|
},
|
|
578
592
|
|
|
579
593
|
async fail(input) {
|
package/src/jobs/index.ts
CHANGED
|
@@ -284,18 +284,50 @@ export interface InlineJobDispatcherOptions<Ctx> {
|
|
|
284
284
|
*/
|
|
285
285
|
ctx?: Ctx | (() => MaybePromise<Ctx>);
|
|
286
286
|
/**
|
|
287
|
-
* Called when a dispatched inline job fails
|
|
288
|
-
* rethrown to the caller.
|
|
287
|
+
* Called when a dispatched inline job fails all attempts allowed by its
|
|
288
|
+
* retry policy. When omitted, the final error is rethrown to the caller.
|
|
289
289
|
*/
|
|
290
290
|
onError?: (error: unknown, job: JobDef<string, StandardSchema, Ctx>) => void;
|
|
291
|
+
/**
|
|
292
|
+
* Sleep implementation used between retry attempts. Defaults to a real
|
|
293
|
+
* `setTimeout` delay; inject a fake in tests to keep retries instant.
|
|
294
|
+
*/
|
|
295
|
+
sleep?: (ms: number) => Promise<void>;
|
|
296
|
+
/**
|
|
297
|
+
* Honor the job's declared retry policy inline. Defaults to `true`. Set
|
|
298
|
+
* `false` when another layer owns execution retries for every dispatch
|
|
299
|
+
* through this dispatcher.
|
|
300
|
+
*/
|
|
301
|
+
retry?: boolean;
|
|
291
302
|
}
|
|
292
303
|
|
|
304
|
+
/**
|
|
305
|
+
* Well-known symbol under which the inline dispatcher exposes a
|
|
306
|
+
* single-attempt dispatch. Delivery systems that own execution retries
|
|
307
|
+
* themselves — the outbox drain — call it instead of `dispatch(...)` so a
|
|
308
|
+
* job's retry policy runs in exactly one layer. Registered with `Symbol.for`
|
|
309
|
+
* so multiple core copies in one process agree on the key.
|
|
310
|
+
*/
|
|
311
|
+
export const SINGLE_ATTEMPT_DISPATCH: unique symbol = Symbol.for(
|
|
312
|
+
"beignet.jobs.singleAttemptDispatch",
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Shape of the single-attempt dispatch exposed under
|
|
317
|
+
* `SINGLE_ATTEMPT_DISPATCH`.
|
|
318
|
+
*/
|
|
319
|
+
export type SingleAttemptJobDispatch = <J extends JobDef>(
|
|
320
|
+
job: J,
|
|
321
|
+
payload: InferJobPayload<J>,
|
|
322
|
+
) => Promise<void>;
|
|
323
|
+
|
|
293
324
|
/**
|
|
294
325
|
* Local/test job dispatcher that executes job handlers inline.
|
|
295
326
|
*/
|
|
296
327
|
export interface InlineJobDispatcher<Ctx = unknown> {
|
|
297
328
|
/**
|
|
298
|
-
* Validate a payload and run the job handler
|
|
329
|
+
* Validate a payload and run the job handler inline, honoring the job's
|
|
330
|
+
* declared retry policy before failing.
|
|
299
331
|
*/
|
|
300
332
|
dispatch<J extends JobDef<string, StandardSchema, Ctx>>(
|
|
301
333
|
job: J,
|
|
@@ -400,7 +432,20 @@ function durationToMs(name: string, value: JobRetryDuration): number {
|
|
|
400
432
|
}
|
|
401
433
|
}
|
|
402
434
|
|
|
435
|
+
const VALIDATED_RETRY_OPTIONS = Symbol("beignet.jobs.validatedRetryOptions");
|
|
436
|
+
|
|
403
437
|
function validateJobRetryOptions(options: JobRetryOptions): JobRetryOptions {
|
|
438
|
+
// Options returned by this function are branded so repeated validation —
|
|
439
|
+
// per attempt in the retry helpers — short-circuits instead of re-parsing
|
|
440
|
+
// duration strings and reallocating.
|
|
441
|
+
if (
|
|
442
|
+
(options as { [VALIDATED_RETRY_OPTIONS]?: boolean })[
|
|
443
|
+
VALIDATED_RETRY_OPTIONS
|
|
444
|
+
]
|
|
445
|
+
) {
|
|
446
|
+
return options;
|
|
447
|
+
}
|
|
448
|
+
|
|
404
449
|
const strategy = options.strategy ?? "exponential";
|
|
405
450
|
|
|
406
451
|
if (!["none", "fixed", "exponential"].includes(strategy)) {
|
|
@@ -436,11 +481,16 @@ function validateJobRetryOptions(options: JobRetryOptions): JobRetryOptions {
|
|
|
436
481
|
}
|
|
437
482
|
}
|
|
438
483
|
|
|
439
|
-
|
|
484
|
+
const validated = {
|
|
440
485
|
...options,
|
|
441
486
|
strategy,
|
|
442
487
|
attempts,
|
|
443
488
|
};
|
|
489
|
+
Object.defineProperty(validated, VALIDATED_RETRY_OPTIONS, {
|
|
490
|
+
value: true,
|
|
491
|
+
enumerable: false,
|
|
492
|
+
});
|
|
493
|
+
return validated;
|
|
444
494
|
}
|
|
445
495
|
|
|
446
496
|
/**
|
|
@@ -584,28 +634,93 @@ export async function parseJobPayload<J extends JobDef>(
|
|
|
584
634
|
|
|
585
635
|
/**
|
|
586
636
|
* Create a local/test dispatcher that runs job handlers inline.
|
|
637
|
+
*
|
|
638
|
+
* Dispatch honors the job's declared retry policy: failed attempts retry with
|
|
639
|
+
* the policy's delays until the policy is exhausted. Payload validation
|
|
640
|
+
* failures never retry. Jobs without a retry policy run exactly once.
|
|
587
641
|
*/
|
|
588
642
|
export function createInlineJobDispatcher<Ctx>(
|
|
589
643
|
options: InlineJobDispatcherOptions<Ctx> = {},
|
|
590
644
|
): InlineJobDispatcher<Ctx> {
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
645
|
+
const sleep =
|
|
646
|
+
options.sleep ??
|
|
647
|
+
((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
|
|
648
|
+
|
|
649
|
+
async function run<J extends JobDef<string, StandardSchema, Ctx>>(
|
|
650
|
+
job: J,
|
|
651
|
+
payload: InferJobPayload<J>,
|
|
652
|
+
retryEnabled: boolean,
|
|
653
|
+
): Promise<void> {
|
|
654
|
+
const fail = (error: unknown): void => {
|
|
655
|
+
options.onError?.(error, job);
|
|
656
|
+
if (!options.onError) throw error;
|
|
657
|
+
};
|
|
658
|
+
|
|
659
|
+
let parsed: InferJobPayload<J>;
|
|
660
|
+
let ctx: Ctx;
|
|
661
|
+
try {
|
|
662
|
+
parsed = await parseJobPayload(job, payload);
|
|
663
|
+
// Resolve once per dispatch so a ctx factory does not run (and cannot
|
|
664
|
+
// produce different contexts) across retry attempts.
|
|
665
|
+
ctx = await resolveCtx(options.ctx);
|
|
666
|
+
} catch (error) {
|
|
667
|
+
fail(error);
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
const policy = retryEnabled ? job.retry : undefined;
|
|
672
|
+
const maxAttempts = policy ? (getJobRetryMaxAttempts(policy) ?? 1) : 1;
|
|
673
|
+
|
|
674
|
+
for (let attempt = 1; ; attempt += 1) {
|
|
596
675
|
try {
|
|
597
|
-
const parsed = await parseJobPayload(job, payload);
|
|
598
676
|
await job.handle({
|
|
599
677
|
job,
|
|
600
678
|
payload: parsed,
|
|
601
|
-
ctx
|
|
679
|
+
ctx,
|
|
602
680
|
});
|
|
681
|
+
return;
|
|
603
682
|
} catch (error) {
|
|
604
|
-
|
|
605
|
-
|
|
683
|
+
const willRetry = shouldRetryJob(policy, {
|
|
684
|
+
error,
|
|
685
|
+
attempt,
|
|
686
|
+
maxAttempts,
|
|
687
|
+
jobName: job.name,
|
|
688
|
+
});
|
|
689
|
+
if (!willRetry) {
|
|
690
|
+
fail(error);
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
const delayMs = getJobRetryDelayMs(policy, {
|
|
695
|
+
error,
|
|
696
|
+
attempt,
|
|
697
|
+
jobName: job.name,
|
|
698
|
+
});
|
|
699
|
+
if (delayMs > 0) await sleep(delayMs);
|
|
606
700
|
}
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
const dispatcher: InlineJobDispatcher<Ctx> = {
|
|
705
|
+
async dispatch<J extends JobDef<string, StandardSchema, Ctx>>(
|
|
706
|
+
job: J,
|
|
707
|
+
payload: InferJobPayload<J>,
|
|
708
|
+
) {
|
|
709
|
+
await run(job, payload, options.retry !== false);
|
|
607
710
|
},
|
|
608
711
|
};
|
|
712
|
+
|
|
713
|
+
// Non-enumerable so spreads and serialization keep treating the dispatcher
|
|
714
|
+
// as a plain port; the outbox drain discovers it by symbol.
|
|
715
|
+
Object.defineProperty(dispatcher, SINGLE_ATTEMPT_DISPATCH, {
|
|
716
|
+
value: <J extends JobDef<string, StandardSchema, Ctx>>(
|
|
717
|
+
job: J,
|
|
718
|
+
payload: InferJobPayload<J>,
|
|
719
|
+
) => run(job, payload, false),
|
|
720
|
+
enumerable: false,
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
return dispatcher;
|
|
609
724
|
}
|
|
610
725
|
|
|
611
726
|
/**
|
|
@@ -617,9 +732,9 @@ export function createInlineJobDispatcher<Ctx>(
|
|
|
617
732
|
* export const { defineJob } = createJobs<AppContext>();
|
|
618
733
|
* ```
|
|
619
734
|
*
|
|
620
|
-
* Retry options
|
|
621
|
-
*
|
|
622
|
-
*
|
|
735
|
+
* Retry options describe the job's retry policy. Inline dispatchers run the
|
|
736
|
+
* policy in-process with real delays; durable providers map the policy onto
|
|
737
|
+
* their own runtime and reject options they cannot honor.
|
|
623
738
|
*/
|
|
624
739
|
export function createJobs<Ctx>(): Jobs<Ctx> {
|
|
625
740
|
return {
|