@relkit/providers-local 0.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/LICENSE +21 -0
- package/README.md +40 -0
- package/dist/buckets/index.d.ts +5 -0
- package/dist/buckets/index.d.ts.map +1 -0
- package/dist/buckets/index.js +5 -0
- package/dist/buckets/index.js.map +1 -0
- package/dist/buckets/keys.d.ts +7 -0
- package/dist/buckets/keys.d.ts.map +1 -0
- package/dist/buckets/keys.js +60 -0
- package/dist/buckets/keys.js.map +1 -0
- package/dist/buckets/operations.d.ts +11 -0
- package/dist/buckets/operations.d.ts.map +1 -0
- package/dist/buckets/operations.js +89 -0
- package/dist/buckets/operations.js.map +1 -0
- package/dist/buckets/pagination.d.ts +5 -0
- package/dist/buckets/pagination.d.ts.map +1 -0
- package/dist/buckets/pagination.js +34 -0
- package/dist/buckets/pagination.js.map +1 -0
- package/dist/buckets/policy.d.ts +8 -0
- package/dist/buckets/policy.d.ts.map +1 -0
- package/dist/buckets/policy.js +74 -0
- package/dist/buckets/policy.js.map +1 -0
- package/dist/buckets/provider.d.ts +4 -0
- package/dist/buckets/provider.d.ts.map +1 -0
- package/dist/buckets/provider.js +119 -0
- package/dist/buckets/provider.js.map +1 -0
- package/dist/buckets/storage.d.ts +12 -0
- package/dist/buckets/storage.d.ts.map +1 -0
- package/dist/buckets/storage.js +169 -0
- package/dist/buckets/storage.js.map +1 -0
- package/dist/buckets/types.d.ts +91 -0
- package/dist/buckets/types.d.ts.map +1 -0
- package/dist/buckets/types.js +34 -0
- package/dist/buckets/types.js.map +1 -0
- package/dist/cache/index.d.ts +8 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +8 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/inspector.d.ts +4 -0
- package/dist/cache/inspector.d.ts.map +1 -0
- package/dist/cache/inspector.js +62 -0
- package/dist/cache/inspector.js.map +1 -0
- package/dist/cache/keys.d.ts +6 -0
- package/dist/cache/keys.d.ts.map +1 -0
- package/dist/cache/keys.js +34 -0
- package/dist/cache/keys.js.map +1 -0
- package/dist/cache/persistence.d.ts +5 -0
- package/dist/cache/persistence.d.ts.map +1 -0
- package/dist/cache/persistence.js +108 -0
- package/dist/cache/persistence.js.map +1 -0
- package/dist/cache/policy.d.ts +9 -0
- package/dist/cache/policy.d.ts.map +1 -0
- package/dist/cache/policy.js +64 -0
- package/dist/cache/policy.js.map +1 -0
- package/dist/cache/provider.d.ts +3 -0
- package/dist/cache/provider.d.ts.map +1 -0
- package/dist/cache/provider.js +164 -0
- package/dist/cache/provider.js.map +1 -0
- package/dist/cache/store.d.ts +44 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +132 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cache/types.d.ts +100 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +39 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/cache/write.d.ts +5 -0
- package/dist/cache/write.d.ts.map +1 -0
- package/dist/cache/write.js +13 -0
- package/dist/cache/write.js.map +1 -0
- package/dist/events/admin-actions.d.ts +7 -0
- package/dist/events/admin-actions.d.ts.map +1 -0
- package/dist/events/admin-actions.js +28 -0
- package/dist/events/admin-actions.js.map +1 -0
- package/dist/events/admin-contracts.d.ts +132 -0
- package/dist/events/admin-contracts.d.ts.map +1 -0
- package/dist/events/admin-contracts.js +4 -0
- package/dist/events/admin-contracts.js.map +1 -0
- package/dist/events/admin-errors.d.ts +5 -0
- package/dist/events/admin-errors.d.ts.map +1 -0
- package/dist/events/admin-errors.js +9 -0
- package/dist/events/admin-errors.js.map +1 -0
- package/dist/events/admin-state.d.ts +8 -0
- package/dist/events/admin-state.d.ts.map +1 -0
- package/dist/events/admin-state.js +10 -0
- package/dist/events/admin-state.js.map +1 -0
- package/dist/events/admin-utils.d.ts +27 -0
- package/dist/events/admin-utils.d.ts.map +1 -0
- package/dist/events/admin-utils.js +153 -0
- package/dist/events/admin-utils.js.map +1 -0
- package/dist/events/admin.d.ts +22 -0
- package/dist/events/admin.d.ts.map +1 -0
- package/dist/events/admin.js +92 -0
- package/dist/events/admin.js.map +1 -0
- package/dist/events/delivery-types.d.ts +74 -0
- package/dist/events/delivery-types.d.ts.map +1 -0
- package/dist/events/delivery-types.js +9 -0
- package/dist/events/delivery-types.js.map +1 -0
- package/dist/events/delivery-utils.d.ts +17 -0
- package/dist/events/delivery-utils.d.ts.map +1 -0
- package/dist/events/delivery-utils.js +133 -0
- package/dist/events/delivery-utils.js.map +1 -0
- package/dist/events/delivery.d.ts +6 -0
- package/dist/events/delivery.d.ts.map +1 -0
- package/dist/events/delivery.js +159 -0
- package/dist/events/delivery.js.map +1 -0
- package/dist/events/ephemeral.d.ts +36 -0
- package/dist/events/ephemeral.d.ts.map +1 -0
- package/dist/events/ephemeral.js +61 -0
- package/dist/events/ephemeral.js.map +1 -0
- package/dist/events/log.d.ts +37 -0
- package/dist/events/log.d.ts.map +1 -0
- package/dist/events/log.js +121 -0
- package/dist/events/log.js.map +1 -0
- package/dist/events/provider.d.ts +9 -0
- package/dist/events/provider.d.ts.map +1 -0
- package/dist/events/provider.js +37 -0
- package/dist/events/provider.js.map +1 -0
- package/dist/events/router-inspection.d.ts +18 -0
- package/dist/events/router-inspection.d.ts.map +1 -0
- package/dist/events/router-inspection.js +110 -0
- package/dist/events/router-inspection.js.map +1 -0
- package/dist/events/router-records.d.ts +34 -0
- package/dist/events/router-records.d.ts.map +1 -0
- package/dist/events/router-records.js +98 -0
- package/dist/events/router-records.js.map +1 -0
- package/dist/events/router-types.d.ts +83 -0
- package/dist/events/router-types.d.ts.map +1 -0
- package/dist/events/router-types.js +2 -0
- package/dist/events/router-types.js.map +1 -0
- package/dist/events/router.d.ts +7 -0
- package/dist/events/router.d.ts.map +1 -0
- package/dist/events/router.js +148 -0
- package/dist/events/router.js.map +1 -0
- package/dist/factory.d.ts +26 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +66 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/admin-contracts.d.ts +66 -0
- package/dist/jobs/admin-contracts.d.ts.map +1 -0
- package/dist/jobs/admin-contracts.js +4 -0
- package/dist/jobs/admin-contracts.js.map +1 -0
- package/dist/jobs/admin-errors.d.ts +5 -0
- package/dist/jobs/admin-errors.d.ts.map +1 -0
- package/dist/jobs/admin-errors.js +9 -0
- package/dist/jobs/admin-errors.js.map +1 -0
- package/dist/jobs/admin-utils.d.ts +29 -0
- package/dist/jobs/admin-utils.d.ts.map +1 -0
- package/dist/jobs/admin-utils.js +138 -0
- package/dist/jobs/admin-utils.js.map +1 -0
- package/dist/jobs/admin.d.ts +25 -0
- package/dist/jobs/admin.d.ts.map +1 -0
- package/dist/jobs/admin.js +89 -0
- package/dist/jobs/admin.js.map +1 -0
- package/dist/jobs/cron.d.ts +10 -0
- package/dist/jobs/cron.d.ts.map +1 -0
- package/dist/jobs/cron.js +18 -0
- package/dist/jobs/cron.js.map +1 -0
- package/dist/jobs/idempotency.d.ts +18 -0
- package/dist/jobs/idempotency.d.ts.map +1 -0
- package/dist/jobs/idempotency.js +82 -0
- package/dist/jobs/idempotency.js.map +1 -0
- package/dist/jobs/lease-utils.d.ts +9 -0
- package/dist/jobs/lease-utils.d.ts.map +1 -0
- package/dist/jobs/lease-utils.js +31 -0
- package/dist/jobs/lease-utils.js.map +1 -0
- package/dist/jobs/queue-admin.d.ts +12 -0
- package/dist/jobs/queue-admin.d.ts.map +1 -0
- package/dist/jobs/queue-admin.js +42 -0
- package/dist/jobs/queue-admin.js.map +1 -0
- package/dist/jobs/queue-entry.d.ts +8 -0
- package/dist/jobs/queue-entry.d.ts.map +1 -0
- package/dist/jobs/queue-entry.js +130 -0
- package/dist/jobs/queue-entry.js.map +1 -0
- package/dist/jobs/queue-lease.d.ts +4 -0
- package/dist/jobs/queue-lease.d.ts.map +1 -0
- package/dist/jobs/queue-lease.js +12 -0
- package/dist/jobs/queue-lease.js.map +1 -0
- package/dist/jobs/queue-operations.d.ts +16 -0
- package/dist/jobs/queue-operations.d.ts.map +1 -0
- package/dist/jobs/queue-operations.js +107 -0
- package/dist/jobs/queue-operations.js.map +1 -0
- package/dist/jobs/queue-recovery.d.ts +5 -0
- package/dist/jobs/queue-recovery.d.ts.map +1 -0
- package/dist/jobs/queue-recovery.js +22 -0
- package/dist/jobs/queue-recovery.js.map +1 -0
- package/dist/jobs/queue-utils.d.ts +101 -0
- package/dist/jobs/queue-utils.d.ts.map +1 -0
- package/dist/jobs/queue-utils.js +28 -0
- package/dist/jobs/queue-utils.js.map +1 -0
- package/dist/jobs/queue.d.ts +7 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +70 -0
- package/dist/jobs/queue.js.map +1 -0
- package/dist/jobs/retry.d.ts +25 -0
- package/dist/jobs/retry.d.ts.map +1 -0
- package/dist/jobs/retry.js +84 -0
- package/dist/jobs/retry.js.map +1 -0
- package/dist/jobs/scheduler.d.ts +52 -0
- package/dist/jobs/scheduler.d.ts.map +1 -0
- package/dist/jobs/scheduler.js +122 -0
- package/dist/jobs/scheduler.js.map +1 -0
- package/dist/jobs/store-files.d.ts +20 -0
- package/dist/jobs/store-files.d.ts.map +1 -0
- package/dist/jobs/store-files.js +177 -0
- package/dist/jobs/store-files.js.map +1 -0
- package/dist/jobs/store.d.ts +60 -0
- package/dist/jobs/store.d.ts.map +1 -0
- package/dist/jobs/store.js +97 -0
- package/dist/jobs/store.js.map +1 -0
- package/dist/runtime-capabilities.d.ts +17 -0
- package/dist/runtime-capabilities.d.ts.map +1 -0
- package/dist/runtime-capabilities.js +32 -0
- package/dist/runtime-capabilities.js.map +1 -0
- package/dist/state.d.ts +15 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +69 -0
- package/dist/state.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { normalizeId } from "@relkit/contracts";
|
|
2
|
+
import { acceptance, prepareIdempotency } from "./idempotency.js";
|
|
3
|
+
import { makeEntry, nextEntry, persist } from "./queue-entry.js";
|
|
4
|
+
import { assertTime, JobQueueStateError, transitions, } from "./queue-utils.js";
|
|
5
|
+
import { assertLeaseOwner, leaseTransitionOptions } from "./lease-utils.js";
|
|
6
|
+
import { acquireQueueLease } from "./queue-lease.js";
|
|
7
|
+
import { createJobQueueAdminMutations } from "./queue-admin.js";
|
|
8
|
+
import { orderedQueueEntries, recoverQueueEntries } from "./queue-recovery.js";
|
|
9
|
+
export function createJobQueueMutations(store, state, options) {
|
|
10
|
+
let tail = Promise.resolve();
|
|
11
|
+
const serialize = (work) => {
|
|
12
|
+
const result = tail.then(work);
|
|
13
|
+
tail = result.then(() => undefined, () => undefined);
|
|
14
|
+
return result;
|
|
15
|
+
};
|
|
16
|
+
const enqueue = (input) => serialize(async () => {
|
|
17
|
+
const now = options.clock();
|
|
18
|
+
assertTime(now, "enqueue time");
|
|
19
|
+
const acceptedAt = input.acceptedAt ?? now;
|
|
20
|
+
const prepared = prepareIdempotency(input.input, input.idempotency ?? options.idempotency, state.entries.values(), now, acceptedAt);
|
|
21
|
+
if (prepared.duplicate !== undefined)
|
|
22
|
+
return prepared.duplicate;
|
|
23
|
+
const instanceId = normalizeId(input.instanceId ?? options.createInstanceId?.());
|
|
24
|
+
if (state.entries.has(instanceId))
|
|
25
|
+
throw new JobQueueStateError(`Job ${instanceId} already exists`);
|
|
26
|
+
const entry = makeEntry(instanceId, "accepted", input.input, input.profile ?? "default", acceptedAt, state.nextOrder + 1, 0, undefined, undefined, undefined, prepared.record);
|
|
27
|
+
await persist(store, entry);
|
|
28
|
+
state.entries.set(instanceId, entry);
|
|
29
|
+
state.nextOrder = entry.order;
|
|
30
|
+
return acceptance(entry, false);
|
|
31
|
+
});
|
|
32
|
+
const acquire = (instanceId, leaseOptions = {}) => serialize(async () => {
|
|
33
|
+
const time = options.clock();
|
|
34
|
+
assertTime(time, "acquisition time");
|
|
35
|
+
await recoverQueueEntries(store, state.entries, time, false, options.clock);
|
|
36
|
+
const current = instanceId === undefined
|
|
37
|
+
? orderedQueueEntries(state.entries).find((entry) => entry.state === "available" && (entry.availableAt ?? 0) <= time)
|
|
38
|
+
: state.entries.get(normalizeId(instanceId));
|
|
39
|
+
if (current === undefined) {
|
|
40
|
+
if (instanceId === undefined)
|
|
41
|
+
return undefined;
|
|
42
|
+
throw new JobQueueStateError(`Job ${instanceId} is unknown`);
|
|
43
|
+
}
|
|
44
|
+
if (current.state !== "available" || (current.availableAt ?? 0) > time)
|
|
45
|
+
throw new JobQueueStateError(`Job ${current.instanceId} is not available`);
|
|
46
|
+
return acquireQueueLease(store, state.entries, current, time, leaseOptions, current.attempt + 1, options.clock, options.ownerToken, options.leaseDurationMs);
|
|
47
|
+
});
|
|
48
|
+
const renew = (instanceId, leaseOptions = {}) => serialize(async () => {
|
|
49
|
+
const time = options.clock();
|
|
50
|
+
assertTime(time, "renewal time");
|
|
51
|
+
await recoverQueueEntries(store, state.entries, time, false, options.clock);
|
|
52
|
+
const current = state.entries.get(normalizeId(instanceId));
|
|
53
|
+
if (current === undefined)
|
|
54
|
+
throw new JobQueueStateError(`Job ${instanceId} is unknown`);
|
|
55
|
+
if (current.state !== "leased")
|
|
56
|
+
throw new JobQueueStateError(`Job ${instanceId} is not leased`);
|
|
57
|
+
assertLeaseOwner(current, options.ownerToken);
|
|
58
|
+
const next = nextEntry(current, "leased", leaseTransitionOptions(time, options.leaseDurationMs, leaseOptions, options.ownerToken), options.clock);
|
|
59
|
+
await persist(store, next);
|
|
60
|
+
state.entries.set(current.instanceId, next);
|
|
61
|
+
return next;
|
|
62
|
+
});
|
|
63
|
+
const transition = (instanceId, target, transitionOptions = {}) => serialize(async () => {
|
|
64
|
+
const time = options.clock();
|
|
65
|
+
assertTime(time, "transition time");
|
|
66
|
+
await recoverQueueEntries(store, state.entries, time, false, options.clock);
|
|
67
|
+
const current = state.entries.get(normalizeId(instanceId));
|
|
68
|
+
if (current === undefined)
|
|
69
|
+
throw new JobQueueStateError(`Job ${instanceId} is unknown`);
|
|
70
|
+
if (transitionOptions.expectedState !== undefined &&
|
|
71
|
+
current.state !== transitionOptions.expectedState)
|
|
72
|
+
throw new JobQueueStateError(`Job ${instanceId} is not ${transitionOptions.expectedState}`);
|
|
73
|
+
if (!transitions[current.state].includes(target))
|
|
74
|
+
throw new JobQueueStateError(`Invalid transition ${current.state} -> ${target}`);
|
|
75
|
+
if (current.state === "leased")
|
|
76
|
+
assertLeaseOwner(current, options.ownerToken);
|
|
77
|
+
const next = nextEntry(current, target, target === "leased"
|
|
78
|
+
? {
|
|
79
|
+
...leaseTransitionOptions(time, options.leaseDurationMs, transitionOptions, options.ownerToken),
|
|
80
|
+
...(transitionOptions.attempt === undefined
|
|
81
|
+
? {}
|
|
82
|
+
: { attempt: transitionOptions.attempt }),
|
|
83
|
+
}
|
|
84
|
+
: transitionOptions, options.clock);
|
|
85
|
+
await persist(store, next);
|
|
86
|
+
state.entries.set(current.instanceId, next);
|
|
87
|
+
return next;
|
|
88
|
+
});
|
|
89
|
+
const recover = (time = options.clock()) => serialize(() => recoverQueueEntries(store, state.entries, time, true, options.clock));
|
|
90
|
+
const expire = (time = options.clock()) => serialize(() => recoverQueueEntries(store, state.entries, time, false, options.clock));
|
|
91
|
+
const admin = createJobQueueAdminMutations(store, state.entries, {
|
|
92
|
+
clock: options.clock,
|
|
93
|
+
serialize,
|
|
94
|
+
});
|
|
95
|
+
const ready = recover(options.clock()).then(() => undefined);
|
|
96
|
+
return {
|
|
97
|
+
ready: () => ready,
|
|
98
|
+
enqueue,
|
|
99
|
+
acquire,
|
|
100
|
+
renew,
|
|
101
|
+
transition,
|
|
102
|
+
...admin,
|
|
103
|
+
recover,
|
|
104
|
+
expire,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=queue-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-operations.js","sourceRoot":"","sources":["../../src/jobs/queue-operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EACL,UAAU,EACV,kBAAkB,EAQlB,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAA+B,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAW/E,MAAM,UAAU,uBAAuB,CACrC,KAAe,EACf,KAAwB,EACxB,OAMC;IAED,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,CAAI,IAAsB,EAAc,EAAE;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,GAAG,MAAM,CAAC,IAAI,CAChB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,KAAsB,EAA+B,EAAE,CACtE,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5B,UAAU,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC;QAC3C,MAAM,QAAQ,GAAG,kBAAkB,CACjC,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,EACxC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EACtB,GAAG,EACH,UAAU,CACX,CAAC;QACF,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC,SAAS,CAAC;QAChE,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,IAAI,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACjF,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;YAC/B,MAAM,IAAI,kBAAkB,CAAC,OAAO,UAAU,iBAAiB,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,SAAS,CACrB,UAAU,EACV,UAAU,EACV,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,OAAO,IAAI,SAAS,EAC1B,UAAU,EACV,KAAK,CAAC,SAAS,GAAG,CAAC,EACnB,CAAC,EACD,SAAS,EACT,SAAS,EACT,SAAS,EACT,QAAQ,CAAC,MAAM,CAChB,CAAC;QACF,MAAM,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACrC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;QAC9B,OAAO,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IACL,MAAM,OAAO,GAAG,CACd,UAAmB,EACnB,eAAqC,EAAE,EACH,EAAE,CACtC,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,UAAU,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QACrC,MAAM,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,OAAO,GACX,UAAU,KAAK,SAAS;YACtB,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CACrC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,IAAI,CAC3E;YACH,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;QACjD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,UAAU,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC/C,MAAM,IAAI,kBAAkB,CAAC,OAAO,UAAU,aAAa,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,IAAI;YACpE,MAAM,IAAI,kBAAkB,CAAC,OAAO,OAAO,CAAC,UAAU,mBAAmB,CAAC,CAAC;QAC7E,OAAO,iBAAiB,CACtB,KAAK,EACL,KAAK,CAAC,OAAO,EACb,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,OAAO,CAAC,OAAO,GAAG,CAAC,EACnB,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,eAAe,CACxB,CAAC;IACJ,CAAC,CAAC,CAAC;IACL,MAAM,KAAK,GAAG,CACZ,UAAkB,EAClB,eAAqC,EAAE,EACf,EAAE,CAC1B,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACjC,MAAM,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3D,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,kBAAkB,CAAC,OAAO,UAAU,aAAa,CAAC,CAAC;QACxF,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ;YAC5B,MAAM,IAAI,kBAAkB,CAAC,OAAO,UAAU,gBAAgB,CAAC,CAAC;QAClE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,SAAS,CACpB,OAAO,EACP,QAAQ,EACR,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC,EACvF,OAAO,CAAC,KAAK,CACd,CAAC;QACF,MAAM,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACL,MAAM,UAAU,GAAG,CACjB,UAAkB,EAClB,MAAqB,EACrB,oBAA+C,EAAE,EACzB,EAAE,CAC1B,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,UAAU,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACpC,MAAM,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3D,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,kBAAkB,CAAC,OAAO,UAAU,aAAa,CAAC,CAAC;QACxF,IACE,iBAAiB,CAAC,aAAa,KAAK,SAAS;YAC7C,OAAO,CAAC,KAAK,KAAK,iBAAiB,CAAC,aAAa;YAEjD,MAAM,IAAI,kBAAkB,CAAC,OAAO,UAAU,WAAW,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC9C,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,OAAO,CAAC,KAAK,OAAO,MAAM,EAAE,CAAC,CAAC;QACnF,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ;YAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,SAAS,CACpB,OAAO,EACP,MAAM,EACN,MAAM,KAAK,QAAQ;YACjB,CAAC,CAAC;gBACE,GAAG,sBAAsB,CACvB,IAAI,EACJ,OAAO,CAAC,eAAe,EACvB,iBAAiB,EACjB,OAAO,CAAC,UAAU,CACnB;gBACD,GAAG,CAAC,iBAAiB,CAAC,OAAO,KAAK,SAAS;oBACzC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC;aAC5C;YACH,CAAC,CAAC,iBAAiB,EACrB,OAAO,CAAC,KAAK,CACd,CAAC;QACF,MAAM,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACL,MAAM,OAAO,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,EAAqC,EAAE,CAC5E,SAAS,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,EAAqC,EAAE,CAC3E,SAAS,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACzF,MAAM,KAAK,GAAG,4BAA4B,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE;QAC/D,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS;KACV,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC7D,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK;QAClB,OAAO;QACP,OAAO;QACP,KAAK;QACL,UAAU;QACV,GAAG,KAAK;QACR,OAAO;QACP,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { JobStore } from "./store.js";
|
|
2
|
+
import { type JobQueueEntry } from "./queue-utils.js";
|
|
3
|
+
export declare function orderedQueueEntries(entries: Map<string, JobQueueEntry>): JobQueueEntry[];
|
|
4
|
+
export declare function recoverQueueEntries(store: JobStore, entries: Map<string, JobQueueEntry>, time: number, includeAccepted: boolean, clock: () => number): Promise<readonly JobQueueEntry[]>;
|
|
5
|
+
//# sourceMappingURL=queue-recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-recovery.d.ts","sourceRoot":"","sources":["../../src/jobs/queue-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGlE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,aAAa,EAAE,CAIxF;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EACnC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,OAAO,EACxB,KAAK,EAAE,MAAM,MAAM,GAClB,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAYnC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { nextEntry, persist } from "./queue-entry.js";
|
|
2
|
+
import { assertTime } from "./queue-utils.js";
|
|
3
|
+
import { isLeaseExpired } from "./lease-utils.js";
|
|
4
|
+
export function orderedQueueEntries(entries) {
|
|
5
|
+
return [...entries.values()].sort((a, b) => a.order - b.order || a.instanceId.localeCompare(b.instanceId));
|
|
6
|
+
}
|
|
7
|
+
export async function recoverQueueEntries(store, entries, time, includeAccepted, clock) {
|
|
8
|
+
assertTime(time, includeAccepted ? "recovery time" : "expiry time");
|
|
9
|
+
const recovered = [];
|
|
10
|
+
for (const current of orderedQueueEntries(entries)) {
|
|
11
|
+
if (current.state !== "accepted" && !isLeaseExpired(current, time))
|
|
12
|
+
continue;
|
|
13
|
+
if (!includeAccepted && current.state === "accepted")
|
|
14
|
+
continue;
|
|
15
|
+
const next = nextEntry(current, "available", { availableAt: time }, clock);
|
|
16
|
+
await persist(store, next);
|
|
17
|
+
entries.set(current.instanceId, next);
|
|
18
|
+
recovered.push(next);
|
|
19
|
+
}
|
|
20
|
+
return Object.freeze(recovered);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=queue-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-recovery.js","sourceRoot":"","sources":["../../src/jobs/queue-recovery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAsB,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,UAAU,mBAAmB,CAAC,OAAmC;IACrE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CACxE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAe,EACf,OAAmC,EACnC,IAAY,EACZ,eAAwB,EACxB,KAAmB;IAEnB,UAAU,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACpE,MAAM,SAAS,GAAoB,EAAE,CAAC;IACtC,KAAK,MAAM,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,OAAO,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC;YAAE,SAAS;QAC7E,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC,KAAK,KAAK,UAAU;YAAE,SAAS;QAC/D,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;QAC3E,MAAM,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACtC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { JsonValue } from "@relkit/contracts";
|
|
2
|
+
export declare const JOB_QUEUE_STATES: readonly ["accepted", "available", "leased", "delayed", "completed", "dead-lettered"];
|
|
3
|
+
export type JobQueueState = (typeof JOB_QUEUE_STATES)[number];
|
|
4
|
+
export type JobState = JobQueueState;
|
|
5
|
+
export interface JobIdempotencyDefinition {
|
|
6
|
+
readonly key: string;
|
|
7
|
+
readonly retentionMs: number;
|
|
8
|
+
}
|
|
9
|
+
export interface JobIdempotencyRecord {
|
|
10
|
+
readonly key: string;
|
|
11
|
+
readonly expiresAt: number;
|
|
12
|
+
}
|
|
13
|
+
export interface JobQueueEntry {
|
|
14
|
+
readonly instanceId: string;
|
|
15
|
+
readonly state: JobQueueState;
|
|
16
|
+
readonly input: JsonValue;
|
|
17
|
+
readonly profile: string;
|
|
18
|
+
readonly attempt: number;
|
|
19
|
+
readonly acceptedAt: number;
|
|
20
|
+
readonly order: number;
|
|
21
|
+
readonly availableAt?: number;
|
|
22
|
+
readonly leaseOwner?: string;
|
|
23
|
+
readonly leaseExpiresAt?: number;
|
|
24
|
+
readonly idempotency?: JobIdempotencyRecord;
|
|
25
|
+
readonly failure?: JobFailureMetadata;
|
|
26
|
+
}
|
|
27
|
+
/** Durable acceptance information returned by queue admission. */
|
|
28
|
+
export interface JobQueueAcceptance extends JobQueueEntry {
|
|
29
|
+
readonly accepted: true;
|
|
30
|
+
readonly duplicate: boolean;
|
|
31
|
+
readonly idempotencyKey?: string;
|
|
32
|
+
readonly idempotencyExpiresAt?: number;
|
|
33
|
+
}
|
|
34
|
+
export type JobFailureKind = "application" | "provider" | "cancellation" | "timeout" | "defect";
|
|
35
|
+
export type JobFailureOutcome = "declared-error" | "provider-failure" | "cancelled" | "timeout" | "defect";
|
|
36
|
+
export type JobFailureRetry = "never" | "later";
|
|
37
|
+
/** Public, JSON-safe failure data retained with a delayed or dead-lettered job. */
|
|
38
|
+
export interface JobFailureMetadata {
|
|
39
|
+
readonly kind: JobFailureKind;
|
|
40
|
+
readonly outcome: JobFailureOutcome;
|
|
41
|
+
readonly code: string;
|
|
42
|
+
readonly message: string;
|
|
43
|
+
readonly data?: JsonValue;
|
|
44
|
+
readonly status?: number;
|
|
45
|
+
readonly retry?: JobFailureRetry;
|
|
46
|
+
readonly afterMs?: number;
|
|
47
|
+
}
|
|
48
|
+
export interface JobQueueEnqueue {
|
|
49
|
+
readonly input: JsonValue;
|
|
50
|
+
readonly profile?: string;
|
|
51
|
+
readonly instanceId?: string;
|
|
52
|
+
readonly acceptedAt?: number;
|
|
53
|
+
readonly idempotency?: JobIdempotencyDefinition;
|
|
54
|
+
}
|
|
55
|
+
export interface JobQueueLeaseOptions {
|
|
56
|
+
readonly leaseDurationMs?: number;
|
|
57
|
+
readonly leaseExpiresAt?: number;
|
|
58
|
+
}
|
|
59
|
+
export interface JobQueueTransitionOptions extends JobQueueLeaseOptions {
|
|
60
|
+
readonly expectedState?: JobQueueState;
|
|
61
|
+
readonly attempt?: number;
|
|
62
|
+
readonly availableAt?: number;
|
|
63
|
+
readonly leaseOwner?: string;
|
|
64
|
+
readonly failure?: JobFailureMetadata;
|
|
65
|
+
}
|
|
66
|
+
export interface JobQueueAdminRetryOptions {
|
|
67
|
+
readonly availableAt?: number;
|
|
68
|
+
}
|
|
69
|
+
export type JobQueueCounts = Readonly<Record<JobQueueState, number>>;
|
|
70
|
+
export interface JobQueueOptions {
|
|
71
|
+
readonly now?: () => number;
|
|
72
|
+
readonly createInstanceId?: () => string;
|
|
73
|
+
readonly ownerToken?: string;
|
|
74
|
+
readonly leaseDurationMs?: number;
|
|
75
|
+
readonly idempotency?: JobIdempotencyDefinition;
|
|
76
|
+
}
|
|
77
|
+
export interface JobQueue {
|
|
78
|
+
readonly ownerToken: string;
|
|
79
|
+
readonly ready: () => Promise<void>;
|
|
80
|
+
readonly enqueue: (input: JobQueueEnqueue) => Promise<JobQueueAcceptance>;
|
|
81
|
+
readonly acquire: (instanceId?: string, options?: JobQueueLeaseOptions) => Promise<JobQueueEntry | undefined>;
|
|
82
|
+
readonly renew: (instanceId: string, options?: JobQueueLeaseOptions) => Promise<JobQueueEntry>;
|
|
83
|
+
readonly transition: (instanceId: string, state: JobQueueState, options?: JobQueueTransitionOptions) => Promise<JobQueueEntry>;
|
|
84
|
+
/** Requeues one dead letter as a fresh attempt without widening normal transitions. */
|
|
85
|
+
readonly adminRetry: (instanceId: string, options?: JobQueueAdminRetryOptions) => Promise<JobQueueEntry>;
|
|
86
|
+
/** Moves one eligible nonterminal entry to a dead letter with safe metadata. */
|
|
87
|
+
readonly adminDeadLetter: (instanceId: string, failure: JobFailureMetadata) => Promise<JobQueueEntry>;
|
|
88
|
+
readonly recover: (now?: number) => Promise<readonly JobQueueEntry[]>;
|
|
89
|
+
readonly expire: (now?: number) => Promise<readonly JobQueueEntry[]>;
|
|
90
|
+
readonly selectAvailable: (limit?: number, now?: number) => readonly JobQueueEntry[];
|
|
91
|
+
readonly get: (instanceId: string) => JobQueueEntry | undefined;
|
|
92
|
+
readonly counts: () => JobQueueCounts;
|
|
93
|
+
readonly snapshot: () => readonly JobQueueEntry[];
|
|
94
|
+
}
|
|
95
|
+
export declare class JobQueueStateError extends Error {
|
|
96
|
+
readonly code: "RELKIT_JOB_QUEUE_STATE_INVALID";
|
|
97
|
+
constructor(message: string);
|
|
98
|
+
}
|
|
99
|
+
export declare const transitions: Readonly<Record<JobQueueState, readonly JobQueueState[]>>;
|
|
100
|
+
export declare function assertTime(value: number, label: string): void;
|
|
101
|
+
//# sourceMappingURL=queue-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-utils.d.ts","sourceRoot":"","sources":["../../src/jobs/queue-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const JOB_QUEUE_STATES = [
|
|
2
|
+
"accepted",
|
|
3
|
+
"available",
|
|
4
|
+
"leased",
|
|
5
|
+
"delayed",
|
|
6
|
+
"completed",
|
|
7
|
+
"dead-lettered",
|
|
8
|
+
];
|
|
9
|
+
export class JobQueueStateError extends Error {
|
|
10
|
+
code = "RELKIT_JOB_QUEUE_STATE_INVALID";
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "JobQueueStateError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export const transitions = {
|
|
17
|
+
accepted: ["available"],
|
|
18
|
+
available: ["leased"],
|
|
19
|
+
leased: ["leased", "available", "delayed", "completed", "dead-lettered"],
|
|
20
|
+
delayed: ["available"],
|
|
21
|
+
completed: [],
|
|
22
|
+
"dead-lettered": [],
|
|
23
|
+
};
|
|
24
|
+
export function assertTime(value, label) {
|
|
25
|
+
if (!Number.isSafeInteger(value) || value < 0)
|
|
26
|
+
throw new JobQueueStateError(`${label} is invalid`);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=queue-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-utils.js","sourceRoot":"","sources":["../../src/jobs/queue-utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU;IACV,WAAW;IACX,QAAQ;IACR,SAAS;IACT,WAAW;IACX,eAAe;CACP,CAAC;AAmHX,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,GAAG,gCAAyC,CAAC;IAE1D,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,WAAW,GAA8D;IACpF,QAAQ,EAAE,CAAC,WAAW,CAAC;IACvB,SAAS,EAAE,CAAC,QAAQ,CAAC;IACrB,MAAM,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,CAAC;IACxE,OAAO,EAAE,CAAC,WAAW,CAAC;IACtB,SAAS,EAAE,EAAE;IACb,eAAe,EAAE,EAAE;CACpB,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,KAAa;IACrD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAC3C,MAAM,IAAI,kBAAkB,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { JobStore } from "./store.js";
|
|
2
|
+
import { type JobQueue, type JobQueueOptions } from "./queue-utils.js";
|
|
3
|
+
export { JOB_QUEUE_STATES, JobQueueStateError } from "./queue-utils.js";
|
|
4
|
+
export type * from "./queue-utils.js";
|
|
5
|
+
/** Provides durable queue state plus process-owned leases. */
|
|
6
|
+
export declare function createJobQueue(store: JobStore, options?: JobQueueOptions): JobQueue;
|
|
7
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/jobs/queue.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,OAAO,EAKL,KAAK,QAAQ,EAGb,KAAK,eAAe,EAErB,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACxE,mBAAmB,kBAAkB,CAAC;AAEtC,8DAA8D;AAC9D,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAuEvF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { normalizeId } from "@relkit/contracts";
|
|
3
|
+
import { readEntry } from "./queue-entry.js";
|
|
4
|
+
import { createJobQueueMutations } from "./queue-operations.js";
|
|
5
|
+
import { validateIdempotencyDefinition } from "./idempotency.js";
|
|
6
|
+
import { JOB_QUEUE_STATES, JobQueueStateError, assertTime, transitions, } from "./queue-utils.js";
|
|
7
|
+
import { assertLeaseDuration, DEFAULT_LEASE_DURATION_MS, normalizeOwnerToken, } from "./lease-utils.js";
|
|
8
|
+
export { JOB_QUEUE_STATES, JobQueueStateError } from "./queue-utils.js";
|
|
9
|
+
/** Provides durable queue state plus process-owned leases. */
|
|
10
|
+
export function createJobQueue(store, options = {}) {
|
|
11
|
+
const clock = options.now ?? Date.now;
|
|
12
|
+
const ownerToken = normalizeOwnerToken(options.ownerToken ?? randomUUID());
|
|
13
|
+
const leaseDurationMs = options.leaseDurationMs ?? DEFAULT_LEASE_DURATION_MS;
|
|
14
|
+
const idempotency = options.idempotency === undefined
|
|
15
|
+
? undefined
|
|
16
|
+
: validateIdempotencyDefinition(options.idempotency);
|
|
17
|
+
assertLeaseDuration(leaseDurationMs);
|
|
18
|
+
const state = { entries: new Map(), nextOrder: 0 };
|
|
19
|
+
for (const record of store.snapshot().records) {
|
|
20
|
+
const entry = readEntry(record);
|
|
21
|
+
if (entry === undefined)
|
|
22
|
+
continue;
|
|
23
|
+
const prior = state.entries.get(entry.instanceId);
|
|
24
|
+
if (prior !== undefined &&
|
|
25
|
+
prior.state !== entry.state &&
|
|
26
|
+
!transitions[prior.state].includes(entry.state))
|
|
27
|
+
throw new JobQueueStateError(`Invalid transition ${prior.state} -> ${entry.state}`);
|
|
28
|
+
state.entries.set(entry.instanceId, entry);
|
|
29
|
+
state.nextOrder = Math.max(state.nextOrder, entry.order);
|
|
30
|
+
}
|
|
31
|
+
const mutations = createJobQueueMutations(store, state, {
|
|
32
|
+
clock,
|
|
33
|
+
createInstanceId: options.createInstanceId ?? randomUUID,
|
|
34
|
+
ownerToken,
|
|
35
|
+
leaseDurationMs,
|
|
36
|
+
idempotency,
|
|
37
|
+
});
|
|
38
|
+
const ordered = () => [...state.entries.values()].sort((a, b) => a.order - b.order || a.instanceId.localeCompare(b.instanceId));
|
|
39
|
+
const selectAvailable = (limit = Number.MAX_SAFE_INTEGER, time = clock()) => {
|
|
40
|
+
assertTime(time, "selection time");
|
|
41
|
+
if (!Number.isSafeInteger(limit) || limit < 0)
|
|
42
|
+
throw new JobQueueStateError("Selection limit is invalid");
|
|
43
|
+
return Object.freeze(ordered()
|
|
44
|
+
.filter((entry) => entry.state === "available" && (entry.availableAt ?? 0) <= time)
|
|
45
|
+
.slice(0, limit));
|
|
46
|
+
};
|
|
47
|
+
const counts = () => {
|
|
48
|
+
const result = Object.fromEntries(JOB_QUEUE_STATES.map((state) => [state, 0]));
|
|
49
|
+
for (const entry of state.entries.values())
|
|
50
|
+
result[entry.state] += 1;
|
|
51
|
+
return Object.freeze(result);
|
|
52
|
+
};
|
|
53
|
+
return Object.freeze({
|
|
54
|
+
ownerToken,
|
|
55
|
+
ready: mutations.ready,
|
|
56
|
+
enqueue: mutations.enqueue,
|
|
57
|
+
acquire: mutations.acquire,
|
|
58
|
+
renew: mutations.renew,
|
|
59
|
+
transition: mutations.transition,
|
|
60
|
+
adminRetry: mutations.adminRetry,
|
|
61
|
+
adminDeadLetter: mutations.adminDeadLetter,
|
|
62
|
+
recover: mutations.recover,
|
|
63
|
+
expire: mutations.expire,
|
|
64
|
+
selectAvailable,
|
|
65
|
+
get: (instanceId) => state.entries.get(normalizeId(instanceId)),
|
|
66
|
+
counts,
|
|
67
|
+
snapshot: () => Object.freeze(ordered()),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/jobs/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { RetryPolicy } from "@relkit/jobs";
|
|
2
|
+
import { type JobFailureMetadata, type JobQueue, type JobQueueEntry } from "./queue-utils.js";
|
|
3
|
+
export type RetryClassification = "retryable" | "non-retryable";
|
|
4
|
+
export type RetryState = "delayed" | "dead-lettered";
|
|
5
|
+
export type RandomSource = () => number;
|
|
6
|
+
export interface RetryPlan {
|
|
7
|
+
readonly classification: RetryClassification;
|
|
8
|
+
readonly state: RetryState;
|
|
9
|
+
readonly attempt: number;
|
|
10
|
+
readonly delayMs: number;
|
|
11
|
+
readonly failure: JobFailureMetadata;
|
|
12
|
+
}
|
|
13
|
+
export interface RetryOptions {
|
|
14
|
+
readonly now?: () => number;
|
|
15
|
+
readonly random?: RandomSource;
|
|
16
|
+
}
|
|
17
|
+
/** Uses the declared error policy; non-declared failures are not retried. */
|
|
18
|
+
export declare function classifyFailure(value: unknown): RetryClassification;
|
|
19
|
+
/** Calculates a bounded, integer delay for a one-based completed attempt. */
|
|
20
|
+
export declare function calculateRetryDelay(policy: RetryPolicy, attempt: number, random?: RandomSource): number;
|
|
21
|
+
export declare function planRetry(policy: RetryPolicy, attempt: number, failure: unknown, options?: Pick<RetryOptions, "random">): RetryPlan;
|
|
22
|
+
/** Applies one leased attempt's retry/dead-letter outcome durably. */
|
|
23
|
+
export declare function applyRetry(queue: Pick<JobQueue, "get" | "transition">, instanceId: string, policy: RetryPolicy, failure: unknown, options?: RetryOptions): Promise<JobQueueEntry>;
|
|
24
|
+
export declare function safeFailureMetadata(value: unknown): JobFailureMetadata;
|
|
25
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/jobs/retry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,eAAe,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,eAAe,CAAC;AACrD,MAAM,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC;AAExC,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,cAAc,EAAE,mBAAmB,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;CACtC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;CAChC;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAKnE;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,YAA0B,GACjC,MAAM,CAcR;AAED,wBAAgB,SAAS,CACvB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAM,GACzC,SAAS,CAcX;AAED,sEAAsE;AACtE,wBAAsB,UAAU,CAC9B,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,YAAY,CAAC,EAC3C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,aAAa,CAAC,CAaxB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAItE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { canonicalJson, deepFreeze } from "@relkit/contracts";
|
|
2
|
+
import { normalizeFailure, toPublicEnvelope } from "@relkit/runtime-effect";
|
|
3
|
+
import { JobQueueStateError, assertTime, } from "./queue-utils.js";
|
|
4
|
+
/** Uses the declared error policy; non-declared failures are not retried. */
|
|
5
|
+
export function classifyFailure(value) {
|
|
6
|
+
const failure = normalizeFailure(value);
|
|
7
|
+
return failure._tag === "ApplicationFailure" && failure.retry === "later"
|
|
8
|
+
? "retryable"
|
|
9
|
+
: "non-retryable";
|
|
10
|
+
}
|
|
11
|
+
/** Calculates a bounded, integer delay for a one-based completed attempt. */
|
|
12
|
+
export function calculateRetryDelay(policy, attempt, random = Math.random) {
|
|
13
|
+
assertPolicy(policy);
|
|
14
|
+
assertAttempt(attempt);
|
|
15
|
+
const exponential = policy.initialDelayMs * Math.pow(policy.multiplier, attempt - 1);
|
|
16
|
+
const capped = Number.isFinite(exponential)
|
|
17
|
+
? Math.min(policy.maxDelayMs, Math.floor(exponential))
|
|
18
|
+
: policy.maxDelayMs;
|
|
19
|
+
if (capped === 0 || policy.jitter === "none")
|
|
20
|
+
return capped;
|
|
21
|
+
const sample = random();
|
|
22
|
+
if (!Number.isFinite(sample) || sample < 0 || sample >= 1)
|
|
23
|
+
throw new TypeError("Retry randomness must be in [0, 1)");
|
|
24
|
+
return policy.jitter === "full"
|
|
25
|
+
? Math.floor(sample * capped)
|
|
26
|
+
: Math.floor(capped / 2 + sample * (capped / 2));
|
|
27
|
+
}
|
|
28
|
+
export function planRetry(policy, attempt, failure, options = {}) {
|
|
29
|
+
assertAttempt(attempt);
|
|
30
|
+
const normalized = normalizeFailure(failure);
|
|
31
|
+
const classification = classifyFailure(normalized);
|
|
32
|
+
const retry = classification === "retryable" && attempt < policy.maxAttempts;
|
|
33
|
+
const policyDelay = retry ? calculateRetryDelay(policy, attempt, options.random) : 0;
|
|
34
|
+
const errorDelay = normalized._tag === "ApplicationFailure" ? (normalized.afterMs ?? 0) : 0;
|
|
35
|
+
return deepFreeze({
|
|
36
|
+
classification,
|
|
37
|
+
state: retry ? "delayed" : "dead-lettered",
|
|
38
|
+
attempt,
|
|
39
|
+
delayMs: retry ? Math.max(policyDelay, errorDelay) : 0,
|
|
40
|
+
failure: safeFailureMetadata(normalized),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/** Applies one leased attempt's retry/dead-letter outcome durably. */
|
|
44
|
+
export async function applyRetry(queue, instanceId, policy, failure, options = {}) {
|
|
45
|
+
const current = queue.get(instanceId);
|
|
46
|
+
if (current === undefined)
|
|
47
|
+
throw new JobQueueStateError(`Job ${instanceId} is unknown`);
|
|
48
|
+
if (current.state !== "leased")
|
|
49
|
+
throw new JobQueueStateError(`Job ${instanceId} is not leased`);
|
|
50
|
+
const plan = planRetry(policy, current.attempt, failure, options);
|
|
51
|
+
const now = options.now?.() ?? Date.now();
|
|
52
|
+
assertTime(now, "retry time");
|
|
53
|
+
const availableAt = plan.state === "delayed" ? addTime(now, plan.delayMs) : undefined;
|
|
54
|
+
return queue.transition(instanceId, plan.state, {
|
|
55
|
+
expectedState: "leased",
|
|
56
|
+
...(availableAt === undefined ? {} : { availableAt }),
|
|
57
|
+
failure: plan.failure,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export function safeFailureMetadata(value) {
|
|
61
|
+
return deepFreeze(JSON.parse(canonicalJson(toPublicEnvelope(normalizeFailure(value)))));
|
|
62
|
+
}
|
|
63
|
+
function assertPolicy(policy) {
|
|
64
|
+
if (!Number.isSafeInteger(policy.maxAttempts) || policy.maxAttempts < 1)
|
|
65
|
+
throw new TypeError("retry.maxAttempts must be a positive integer");
|
|
66
|
+
if (!Number.isSafeInteger(policy.initialDelayMs) || policy.initialDelayMs < 0)
|
|
67
|
+
throw new TypeError("retry.initialDelayMs must be a non-negative integer");
|
|
68
|
+
if (!Number.isSafeInteger(policy.maxDelayMs) || policy.maxDelayMs < policy.initialDelayMs)
|
|
69
|
+
throw new TypeError("retry.maxDelayMs must be at least retry.initialDelayMs");
|
|
70
|
+
if (!Number.isFinite(policy.multiplier) || policy.multiplier < 1)
|
|
71
|
+
throw new TypeError("retry.multiplier must be a finite number at least 1");
|
|
72
|
+
if (!["none", "full", "equal"].includes(policy.jitter))
|
|
73
|
+
throw new TypeError("retry.jitter must be none, full, or equal");
|
|
74
|
+
}
|
|
75
|
+
function assertAttempt(value) {
|
|
76
|
+
if (!Number.isSafeInteger(value) || value < 1)
|
|
77
|
+
throw new JobQueueStateError("Retry attempt must be a positive integer");
|
|
78
|
+
}
|
|
79
|
+
function addTime(now, delayMs) {
|
|
80
|
+
if (delayMs > Number.MAX_SAFE_INTEGER - now)
|
|
81
|
+
throw new JobQueueStateError("Retry availability time is invalid");
|
|
82
|
+
return now + delayMs;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/jobs/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type JsonValue, type MaybePromise } from "@relkit/contracts";
|
|
2
|
+
import type { ScheduleDefinition, ScheduleOverlap } from "@relkit/jobs";
|
|
3
|
+
export declare class ScheduleValidationError extends TypeError {
|
|
4
|
+
readonly code: "RELKIT_SCHEDULE_INVALID";
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
export interface CompiledSchedule {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
readonly cron: string;
|
|
10
|
+
readonly timezone: string;
|
|
11
|
+
readonly input: JsonValue;
|
|
12
|
+
readonly overlap: ScheduleOverlap;
|
|
13
|
+
readonly nextFireAt: Date;
|
|
14
|
+
readonly nextFire: (currentDate: Date) => Date;
|
|
15
|
+
}
|
|
16
|
+
export interface ScheduleEnqueueContext {
|
|
17
|
+
readonly scheduleId: string;
|
|
18
|
+
readonly fireAt: Date;
|
|
19
|
+
}
|
|
20
|
+
/** The scheduler only emits work through the common job enqueue/invocation seam. */
|
|
21
|
+
export type ScheduleEnqueue = (input: JsonValue, context: ScheduleEnqueueContext) => MaybePromise<unknown>;
|
|
22
|
+
export interface SchedulerRegistration {
|
|
23
|
+
readonly schedule: ScheduleDefinition;
|
|
24
|
+
readonly enqueue: ScheduleEnqueue;
|
|
25
|
+
}
|
|
26
|
+
export interface SchedulerClock {
|
|
27
|
+
readonly now: () => Date | number;
|
|
28
|
+
}
|
|
29
|
+
export interface SchedulerOptions {
|
|
30
|
+
readonly clock?: SchedulerClock;
|
|
31
|
+
readonly now?: () => Date | number;
|
|
32
|
+
readonly schedules?: readonly SchedulerRegistration[];
|
|
33
|
+
}
|
|
34
|
+
export interface ScheduleRun {
|
|
35
|
+
readonly scheduleId: string;
|
|
36
|
+
readonly fireAt: Date;
|
|
37
|
+
readonly status: "enqueued" | "skipped";
|
|
38
|
+
readonly result?: unknown;
|
|
39
|
+
}
|
|
40
|
+
export interface Scheduler {
|
|
41
|
+
readonly register: (schedule: ScheduleDefinition, enqueue: ScheduleEnqueue) => CompiledSchedule;
|
|
42
|
+
readonly nextFire: (scheduleId: string) => Date | undefined;
|
|
43
|
+
readonly runDue: (currentDate?: Date | number) => Promise<readonly ScheduleRun[]>;
|
|
44
|
+
readonly tick: (currentDate?: Date | number) => Promise<readonly ScheduleRun[]>;
|
|
45
|
+
}
|
|
46
|
+
/** Validates a static schedule and hides the cron parser behind native dates. */
|
|
47
|
+
export declare function compileSchedule(schedule: ScheduleDefinition, options?: {
|
|
48
|
+
readonly currentDate?: Date;
|
|
49
|
+
}): CompiledSchedule;
|
|
50
|
+
/** Runs due schedules against an injected clock without owning or calling handlers. */
|
|
51
|
+
export declare function createScheduler(options?: SchedulerOptions): Scheduler;
|
|
52
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/jobs/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAExE,qBAAa,uBAAwB,SAAQ,SAAS;IACpD,QAAQ,CAAC,IAAI,EAAG,yBAAyB,CAAU;gBAEvC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;CACvB;AAED,oFAAoF;AACpF,MAAM,MAAM,eAAe,GAAG,CAC5B,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,sBAAsB,KAC5B,YAAY,CAAC,OAAO,CAAC,CAAC;AAE3B,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACvD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AASD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,eAAe,KAAK,gBAAgB,CAAC;IAChG,QAAQ,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;IAClF,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;CACjF;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE;IAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAA;CAAO,GAC5C,gBAAgB,CA2BlB;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,SAAS,CA6DzE"}
|