@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,74 @@
|
|
|
1
|
+
import type { UnknownEventEnvelope } from "@relkit/events";
|
|
2
|
+
import type { RetryPolicy } from "@relkit/jobs";
|
|
3
|
+
import type { JobFailureMetadata, JobQueueCounts } from "../jobs/queue-utils.js";
|
|
4
|
+
import type { JobStoreBoundary } from "../jobs/store.js";
|
|
5
|
+
import type { EventDeliveryRecord } from "./router-records.js";
|
|
6
|
+
export declare const EVENT_DELIVERY_CAPABILITIES: Readonly<{
|
|
7
|
+
readonly persistence: "restart-recovery";
|
|
8
|
+
readonly restartRecovery: true;
|
|
9
|
+
readonly atLeastOnce: true;
|
|
10
|
+
readonly exactlyOnce: false;
|
|
11
|
+
readonly ordering: "unsupported";
|
|
12
|
+
readonly orderedByKey: false;
|
|
13
|
+
}>;
|
|
14
|
+
export type EventDeliveryCapabilities = typeof EVENT_DELIVERY_CAPABILITIES;
|
|
15
|
+
export type EventDeliveryBoundary = JobStoreBoundary | "handler-success-before-ack";
|
|
16
|
+
export interface EventDeliveryBinding {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly invoke: (envelope: UnknownEventEnvelope) => Promise<unknown>;
|
|
19
|
+
readonly profile?: string;
|
|
20
|
+
readonly retry?: RetryPolicy;
|
|
21
|
+
readonly concurrency?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface EventDeliveryOptions {
|
|
24
|
+
readonly now?: () => number;
|
|
25
|
+
readonly random?: () => number;
|
|
26
|
+
readonly ownerToken?: string;
|
|
27
|
+
readonly leaseDurationMs?: number;
|
|
28
|
+
readonly retry?: RetryPolicy;
|
|
29
|
+
readonly concurrency?: number;
|
|
30
|
+
readonly onBoundary?: (boundary: EventDeliveryBoundary) => void | Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export interface EventDeliveryResult {
|
|
33
|
+
readonly deliveryId: string;
|
|
34
|
+
readonly triggerId: string;
|
|
35
|
+
readonly eventInstanceId: string;
|
|
36
|
+
readonly accepted: boolean;
|
|
37
|
+
readonly persisted: boolean;
|
|
38
|
+
readonly status: "queued" | "completed" | "failed";
|
|
39
|
+
readonly state: "available" | "leased" | "delayed" | "completed" | "dead-lettered";
|
|
40
|
+
readonly attempt: number;
|
|
41
|
+
readonly duplicate: boolean;
|
|
42
|
+
readonly value?: unknown;
|
|
43
|
+
readonly error?: unknown;
|
|
44
|
+
readonly failure?: JobFailureMetadata;
|
|
45
|
+
}
|
|
46
|
+
export interface EventDeliveryLedgerRecord extends EventDeliveryRecord {
|
|
47
|
+
readonly cursor: number;
|
|
48
|
+
readonly state: EventDeliveryResult["state"];
|
|
49
|
+
readonly attempt: number;
|
|
50
|
+
readonly duplicate: boolean;
|
|
51
|
+
readonly leaseOwner?: string;
|
|
52
|
+
readonly leaseExpiresAt?: number;
|
|
53
|
+
readonly failure?: JobFailureMetadata;
|
|
54
|
+
}
|
|
55
|
+
export interface EventDeliverySnapshot {
|
|
56
|
+
readonly cursor: number;
|
|
57
|
+
readonly records: readonly EventDeliveryRecord[];
|
|
58
|
+
readonly ledger: readonly EventDeliveryLedgerRecord[];
|
|
59
|
+
readonly counts: JobQueueCounts;
|
|
60
|
+
readonly capabilities: typeof EVENT_DELIVERY_CAPABILITIES;
|
|
61
|
+
}
|
|
62
|
+
export interface EventDelivery {
|
|
63
|
+
readonly triggerId: string;
|
|
64
|
+
readonly capabilities: EventDeliveryCapabilities;
|
|
65
|
+
readonly accept: (envelope: UnknownEventEnvelope) => Promise<EventDeliveryResult>;
|
|
66
|
+
readonly deliver: (envelope: UnknownEventEnvelope) => Promise<EventDeliveryResult>;
|
|
67
|
+
readonly runNext: (deliveryId?: string) => Promise<EventDeliveryResult | undefined>;
|
|
68
|
+
readonly retry: (deliveryId: string) => Promise<EventDeliveryResult>;
|
|
69
|
+
readonly drain: () => Promise<readonly EventDeliveryResult[]>;
|
|
70
|
+
readonly recover: (now?: number) => Promise<readonly EventDeliveryLedgerRecord[]>;
|
|
71
|
+
readonly snapshot: () => EventDeliverySnapshot;
|
|
72
|
+
readonly close: () => Promise<void>;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=delivery-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-types.d.ts","sourceRoot":"","sources":["../../src/events/delivery-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-types.js","sourceRoot":"","sources":["../../src/events/delivery-types.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC,MAAM,CAAC;IACvD,WAAW,EAAE,kBAAkB;IAC/B,eAAe,EAAE,IAAI;IACrB,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,KAAK;IAClB,QAAQ,EAAE,aAAa;IACvB,YAAY,EAAE,KAAK;CACX,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type JsonValue } from "@relkit/contracts";
|
|
2
|
+
import type { RetryPolicy } from "@relkit/jobs";
|
|
3
|
+
import type { JobStore, JobRecord } from "../jobs/store.js";
|
|
4
|
+
import type { JobQueue, JobQueueEntry } from "../jobs/queue-utils.js";
|
|
5
|
+
import { type EventDeliveryRecord } from "./router-records.js";
|
|
6
|
+
import type { EventDeliveryLedgerRecord, EventDeliveryResult } from "./delivery-types.js";
|
|
7
|
+
export declare const DEFAULT_RETRY: RetryPolicy;
|
|
8
|
+
export declare function resultFrom(entry: JobQueueEntry, triggerId: string, duplicate: boolean, status: EventDeliveryResult["status"], error?: unknown, failure?: EventDeliveryResult["failure"], value?: unknown): EventDeliveryResult;
|
|
9
|
+
export declare function retryDelivery(queue: JobQueue, triggerId: string, deliveryId: string, now: () => number): Promise<EventDeliveryResult>;
|
|
10
|
+
export declare function promoteDue(queue: JobQueue, now: () => number): Promise<void>;
|
|
11
|
+
export declare function records(raw: readonly JobRecord[], triggerId: string, queue: JobQueue): EventDeliveryRecord[];
|
|
12
|
+
export declare function ledger(store: Pick<JobStore, "snapshot">, triggerId: string, queue: JobQueue): readonly EventDeliveryLedgerRecord[];
|
|
13
|
+
export declare function validateStoredData(value: JsonValue): void;
|
|
14
|
+
export declare function normalizeRetry(value: RetryPolicy | undefined): RetryPolicy;
|
|
15
|
+
export declare function positive(value: number, name: string): number;
|
|
16
|
+
export declare function json(value: unknown): JsonValue;
|
|
17
|
+
//# sourceMappingURL=delivery-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-utils.d.ts","sourceRoot":"","sources":["../../src/events/delivery-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,KAAK,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1F,eAAO,MAAM,aAAa,EAAE,WAM1B,CAAC;AAEH,wBAAgB,UAAU,CACxB,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EACrC,KAAK,CAAC,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,EACxC,KAAK,CAAC,EAAE,OAAO,GACd,mBAAmB,CAerB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAK9B;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUlF;AAED,wBAAgB,OAAO,CACrB,GAAG,EAAE,SAAS,SAAS,EAAE,EACzB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,QAAQ,GACd,mBAAmB,EAAE,CAcvB;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EACjC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,QAAQ,GACd,SAAS,yBAAyB,EAAE,CA4BtC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAkBzD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,CAU1E;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAE9C"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { canonicalJson, normalizeId } from "@relkit/contracts";
|
|
2
|
+
import { readEntry } from "../jobs/queue-entry.js";
|
|
3
|
+
import { normalizeEnvelope } from "./router-records.js";
|
|
4
|
+
export const DEFAULT_RETRY = Object.freeze({
|
|
5
|
+
maxAttempts: 1,
|
|
6
|
+
initialDelayMs: 0,
|
|
7
|
+
maxDelayMs: 0,
|
|
8
|
+
multiplier: 1,
|
|
9
|
+
jitter: "none",
|
|
10
|
+
});
|
|
11
|
+
export function resultFrom(entry, triggerId, duplicate, status, error, failure, value) {
|
|
12
|
+
return Object.freeze({
|
|
13
|
+
deliveryId: entry.instanceId,
|
|
14
|
+
triggerId,
|
|
15
|
+
eventInstanceId: normalizeEnvelope(entry.input).instanceId,
|
|
16
|
+
accepted: true,
|
|
17
|
+
persisted: true,
|
|
18
|
+
status,
|
|
19
|
+
state: entry.state,
|
|
20
|
+
attempt: entry.attempt,
|
|
21
|
+
duplicate,
|
|
22
|
+
...(error === undefined ? {} : { error }),
|
|
23
|
+
...(failure === undefined ? {} : { failure }),
|
|
24
|
+
...(value === undefined ? {} : { value }),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export async function retryDelivery(queue, triggerId, deliveryId, now) {
|
|
28
|
+
const normalized = normalizeId(deliveryId);
|
|
29
|
+
await queue.recover(now());
|
|
30
|
+
const entry = await queue.adminRetry(normalized, { availableAt: now() });
|
|
31
|
+
return resultFrom(entry, triggerId, false, "queued");
|
|
32
|
+
}
|
|
33
|
+
export async function promoteDue(queue, now) {
|
|
34
|
+
const time = now();
|
|
35
|
+
for (const entry of queue.snapshot()) {
|
|
36
|
+
if (entry.state === "delayed" && (entry.availableAt ?? Number.MAX_SAFE_INTEGER) <= time) {
|
|
37
|
+
await queue.transition(entry.instanceId, "available", {
|
|
38
|
+
expectedState: "delayed",
|
|
39
|
+
availableAt: time,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function records(raw, triggerId, queue) {
|
|
45
|
+
return queue.snapshot().map((entry) => {
|
|
46
|
+
const record = [...raw].reverse().find((item) => item.instanceId === entry.instanceId);
|
|
47
|
+
const envelope = normalizeEnvelope(entry.input);
|
|
48
|
+
return Object.freeze({
|
|
49
|
+
version: 1,
|
|
50
|
+
sequence: record?.sequence ?? entry.order,
|
|
51
|
+
timestamp: record?.timestamp ?? entry.acceptedAt,
|
|
52
|
+
deliveryId: entry.instanceId,
|
|
53
|
+
eventInstanceId: envelope.instanceId,
|
|
54
|
+
triggerId,
|
|
55
|
+
envelope,
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
export function ledger(store, triggerId, queue) {
|
|
60
|
+
return Object.freeze(store
|
|
61
|
+
.snapshot()
|
|
62
|
+
.records.filter((record) => queue.get(record.instanceId) !== undefined)
|
|
63
|
+
.filter((record) => record.kind !== "event-delivery-accepted")
|
|
64
|
+
.map((record) => {
|
|
65
|
+
const entry = readEntry(record);
|
|
66
|
+
if (entry === undefined)
|
|
67
|
+
throw new Error("Event delivery ledger state is invalid");
|
|
68
|
+
const envelope = normalizeEnvelope(entry.input);
|
|
69
|
+
return Object.freeze({
|
|
70
|
+
version: 1,
|
|
71
|
+
sequence: record.sequence,
|
|
72
|
+
timestamp: record.timestamp,
|
|
73
|
+
cursor: record.sequence,
|
|
74
|
+
deliveryId: entry.instanceId,
|
|
75
|
+
eventInstanceId: envelope.instanceId,
|
|
76
|
+
triggerId,
|
|
77
|
+
envelope,
|
|
78
|
+
state: entry.state,
|
|
79
|
+
attempt: entry.attempt,
|
|
80
|
+
duplicate: entry.attempt > 1,
|
|
81
|
+
...(entry.leaseOwner === undefined ? {} : { leaseOwner: entry.leaseOwner }),
|
|
82
|
+
...(entry.leaseExpiresAt === undefined ? {} : { leaseExpiresAt: entry.leaseExpiresAt }),
|
|
83
|
+
...(entry.failure === undefined ? {} : { failure: entry.failure }),
|
|
84
|
+
});
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
export function validateStoredData(value) {
|
|
88
|
+
if (isRecord(value) && value.input !== undefined) {
|
|
89
|
+
readEntry({
|
|
90
|
+
version: 1,
|
|
91
|
+
sequence: 1,
|
|
92
|
+
instanceId: "delivery.validation",
|
|
93
|
+
kind: "available",
|
|
94
|
+
timestamp: 0,
|
|
95
|
+
data: value,
|
|
96
|
+
});
|
|
97
|
+
normalizeEnvelope(value.input);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (isRecord(value) && value.envelope !== undefined) {
|
|
101
|
+
normalizeEnvelope(value.envelope);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
normalizeEnvelope(value);
|
|
105
|
+
}
|
|
106
|
+
export function normalizeRetry(value) {
|
|
107
|
+
const policy = value ?? DEFAULT_RETRY;
|
|
108
|
+
positive(policy.maxAttempts, "retry.maxAttempts");
|
|
109
|
+
nonNegative(policy.initialDelayMs, "retry.initialDelayMs");
|
|
110
|
+
nonNegative(policy.maxDelayMs, "retry.maxDelayMs");
|
|
111
|
+
if (policy.maxDelayMs < policy.initialDelayMs || policy.multiplier < 1)
|
|
112
|
+
throw new TypeError("Event retry policy is invalid");
|
|
113
|
+
if (!["none", "full", "equal"].includes(policy.jitter))
|
|
114
|
+
throw new TypeError("Event retry policy jitter is invalid");
|
|
115
|
+
return Object.freeze({ ...policy });
|
|
116
|
+
}
|
|
117
|
+
export function positive(value, name) {
|
|
118
|
+
if (!Number.isSafeInteger(value) || value < 1)
|
|
119
|
+
throw new TypeError(`${name} must be positive`);
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
122
|
+
export function json(value) {
|
|
123
|
+
return JSON.parse(canonicalJson(value));
|
|
124
|
+
}
|
|
125
|
+
function nonNegative(value, name) {
|
|
126
|
+
if (!Number.isSafeInteger(value) || value < 0)
|
|
127
|
+
throw new TypeError(`${name} must be non-negative`);
|
|
128
|
+
return value;
|
|
129
|
+
}
|
|
130
|
+
function isRecord(value) {
|
|
131
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=delivery-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-utils.js","sourceRoot":"","sources":["../../src/events/delivery-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type EventDelivery, type EventDeliveryBinding, type EventDeliveryOptions } from "./delivery-types.js";
|
|
2
|
+
export { EVENT_DELIVERY_CAPABILITIES } from "./delivery-types.js";
|
|
3
|
+
export type { EventDelivery, EventDeliveryBinding, EventDeliveryBoundary, EventDeliveryLedgerRecord, EventDeliveryOptions, EventDeliveryResult, EventDeliverySnapshot, } from "./delivery-types.js";
|
|
4
|
+
/** Provides durable at-least-once delivery for one compiled event trigger. */
|
|
5
|
+
export declare function createEventDelivery(requestedRoot: string, binding: EventDeliveryBinding, options?: EventDeliveryOptions): Promise<EventDelivery>;
|
|
6
|
+
//# sourceMappingURL=delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/events/delivery.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAEzB,KAAK,oBAAoB,EAG1B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,8EAA8E;AAC9E,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,oBAAoB,EAC7B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CA4JxB"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { normalizeId } from "@relkit/contracts";
|
|
2
|
+
import { applyRetry, safeFailureMetadata } from "../jobs/retry.js";
|
|
3
|
+
import { createJobQueue } from "../jobs/queue.js";
|
|
4
|
+
import { createJobStore } from "../jobs/store.js";
|
|
5
|
+
import { makeDeliveryId, normalizeEnvelope } from "./router-records.js";
|
|
6
|
+
import { json, ledger, normalizeRetry, positive, promoteDue, records, resultFrom, retryDelivery, validateStoredData, } from "./delivery-utils.js";
|
|
7
|
+
import { EVENT_DELIVERY_CAPABILITIES, } from "./delivery-types.js";
|
|
8
|
+
export { EVENT_DELIVERY_CAPABILITIES } from "./delivery-types.js";
|
|
9
|
+
/** Provides durable at-least-once delivery for one compiled event trigger. */
|
|
10
|
+
export async function createEventDelivery(requestedRoot, binding, options = {}) {
|
|
11
|
+
const triggerId = normalizeId(binding.id);
|
|
12
|
+
if (typeof binding.invoke !== "function")
|
|
13
|
+
throw new TypeError("Event delivery target is required");
|
|
14
|
+
const concurrency = positive(options.concurrency ?? binding.concurrency ?? 1, "concurrency");
|
|
15
|
+
const retryPolicy = normalizeRetry(options.retry ?? binding.retry);
|
|
16
|
+
const clock = options.now ?? Date.now;
|
|
17
|
+
const store = await createJobStore(requestedRoot, {
|
|
18
|
+
now: clock,
|
|
19
|
+
...(options.onBoundary === undefined
|
|
20
|
+
? {}
|
|
21
|
+
: { onBoundary: (boundary) => options.onBoundary(boundary) }),
|
|
22
|
+
validateData: validateStoredData,
|
|
23
|
+
});
|
|
24
|
+
const queue = createJobQueue(store, {
|
|
25
|
+
now: clock,
|
|
26
|
+
...(options.ownerToken === undefined ? {} : { ownerToken: options.ownerToken }),
|
|
27
|
+
...(options.leaseDurationMs === undefined ? {} : { leaseDurationMs: options.leaseDurationMs }),
|
|
28
|
+
});
|
|
29
|
+
await queue.ready();
|
|
30
|
+
let active = 0;
|
|
31
|
+
let closed = false;
|
|
32
|
+
let admissionTail = Promise.resolve();
|
|
33
|
+
const accept = async (input) => {
|
|
34
|
+
ensureOpen();
|
|
35
|
+
const accepted = await admit(normalizeEnvelope(input));
|
|
36
|
+
if (accepted.entry.state === "completed")
|
|
37
|
+
return resultFrom(accepted.entry, triggerId, true, "completed");
|
|
38
|
+
if (accepted.entry.state === "dead-lettered")
|
|
39
|
+
return resultFrom(accepted.entry, triggerId, true, "failed", undefined, accepted.entry.failure);
|
|
40
|
+
return resultFrom(accepted.entry, triggerId, accepted.duplicate, "queued");
|
|
41
|
+
};
|
|
42
|
+
const deliver = async (input) => {
|
|
43
|
+
const accepted = await accept(input);
|
|
44
|
+
const result = await runNext(accepted.deliveryId);
|
|
45
|
+
return result === undefined
|
|
46
|
+
? accepted
|
|
47
|
+
: { ...result, duplicate: result.duplicate || accepted.duplicate };
|
|
48
|
+
};
|
|
49
|
+
const runNext = async (deliveryId) => {
|
|
50
|
+
ensureOpen();
|
|
51
|
+
if (active >= concurrency)
|
|
52
|
+
return undefined;
|
|
53
|
+
active += 1;
|
|
54
|
+
try {
|
|
55
|
+
await queue.recover(clock());
|
|
56
|
+
await promoteDue(queue, clock);
|
|
57
|
+
const candidate = deliveryId === undefined ? undefined : queue.get(deliveryId);
|
|
58
|
+
if (deliveryId !== undefined &&
|
|
59
|
+
(candidate === undefined || candidate.state !== "available")) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
const leased = await queue.acquire(deliveryId);
|
|
63
|
+
if (leased === undefined)
|
|
64
|
+
return undefined;
|
|
65
|
+
const duplicate = leased.attempt > 1;
|
|
66
|
+
let value;
|
|
67
|
+
try {
|
|
68
|
+
value = await binding.invoke(normalizeEnvelope(leased.input));
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
const entry = await applyRetry(queue, leased.instanceId, retryPolicy, error, {
|
|
72
|
+
now: clock,
|
|
73
|
+
...(options.random === undefined ? {} : { random: options.random }),
|
|
74
|
+
});
|
|
75
|
+
return resultFrom(entry, triggerId, duplicate, "failed", error, safeFailureMetadata(error));
|
|
76
|
+
}
|
|
77
|
+
await options.onBoundary?.("handler-success-before-ack");
|
|
78
|
+
const entry = await queue.transition(leased.instanceId, "completed", {
|
|
79
|
+
expectedState: "leased",
|
|
80
|
+
});
|
|
81
|
+
return resultFrom(entry, triggerId, duplicate, "completed", undefined, undefined, value);
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
active -= 1;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const retry = async (deliveryId) => {
|
|
88
|
+
ensureOpen();
|
|
89
|
+
return retryDelivery(queue, triggerId, deliveryId, clock);
|
|
90
|
+
};
|
|
91
|
+
const recover = async (now = clock()) => {
|
|
92
|
+
ensureOpen();
|
|
93
|
+
await queue.recover(now);
|
|
94
|
+
return ledger(store, triggerId, queue);
|
|
95
|
+
};
|
|
96
|
+
const snapshot = () => {
|
|
97
|
+
ensureOpen();
|
|
98
|
+
const current = store.snapshot();
|
|
99
|
+
return Object.freeze({
|
|
100
|
+
cursor: current.checkpoint.sequence,
|
|
101
|
+
records: Object.freeze(records(current.records, triggerId, queue)),
|
|
102
|
+
ledger: ledger(store, triggerId, queue),
|
|
103
|
+
counts: queue.counts(),
|
|
104
|
+
capabilities: EVENT_DELIVERY_CAPABILITIES,
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
const drain = async () => {
|
|
108
|
+
const results = [];
|
|
109
|
+
while (true) {
|
|
110
|
+
const result = await runNext();
|
|
111
|
+
if (result === undefined)
|
|
112
|
+
return Object.freeze(results);
|
|
113
|
+
results.push(result);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
const close = async () => {
|
|
117
|
+
if (closed)
|
|
118
|
+
return;
|
|
119
|
+
closed = true;
|
|
120
|
+
await store.close();
|
|
121
|
+
};
|
|
122
|
+
return Object.freeze({
|
|
123
|
+
triggerId,
|
|
124
|
+
capabilities: EVENT_DELIVERY_CAPABILITIES,
|
|
125
|
+
accept,
|
|
126
|
+
deliver,
|
|
127
|
+
runNext,
|
|
128
|
+
retry,
|
|
129
|
+
drain,
|
|
130
|
+
recover,
|
|
131
|
+
snapshot,
|
|
132
|
+
close,
|
|
133
|
+
});
|
|
134
|
+
async function admit(envelope) {
|
|
135
|
+
const result = admissionTail.then(async () => {
|
|
136
|
+
const deliveryId = makeDeliveryId(envelope.instanceId, triggerId);
|
|
137
|
+
const existing = queue.get(deliveryId);
|
|
138
|
+
if (existing !== undefined)
|
|
139
|
+
return { entry: existing, duplicate: true };
|
|
140
|
+
const accepted = await queue.enqueue({
|
|
141
|
+
instanceId: deliveryId,
|
|
142
|
+
input: json(envelope),
|
|
143
|
+
profile: binding.profile ?? "default",
|
|
144
|
+
});
|
|
145
|
+
const available = await queue.transition(deliveryId, "available", {
|
|
146
|
+
expectedState: "accepted",
|
|
147
|
+
availableAt: accepted.acceptedAt,
|
|
148
|
+
});
|
|
149
|
+
return { entry: available, duplicate: false };
|
|
150
|
+
});
|
|
151
|
+
admissionTail = result.then(() => undefined, () => undefined);
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
function ensureOpen() {
|
|
155
|
+
if (closed)
|
|
156
|
+
throw new Error("Event delivery is closed");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/events/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { UnknownEventEnvelope } from "@relkit/events";
|
|
2
|
+
export declare const DEFAULT_EPHEMERAL_CAPACITY = 100;
|
|
3
|
+
export declare const EPHEMERAL_DELIVERY_CAPABILITIES: Readonly<{
|
|
4
|
+
readonly persistence: "none";
|
|
5
|
+
readonly restartRecovery: false;
|
|
6
|
+
readonly dropPolicy: "drop-newest";
|
|
7
|
+
}>;
|
|
8
|
+
export interface EphemeralDeliveryResult {
|
|
9
|
+
readonly accepted: boolean;
|
|
10
|
+
readonly persisted: false;
|
|
11
|
+
readonly status: "completed" | "failed" | "dropped";
|
|
12
|
+
readonly capacity: number;
|
|
13
|
+
readonly dropPolicy: "drop-newest";
|
|
14
|
+
readonly restartRecovery: false;
|
|
15
|
+
readonly value?: unknown;
|
|
16
|
+
readonly error?: unknown;
|
|
17
|
+
readonly dropReason?: "capacity";
|
|
18
|
+
}
|
|
19
|
+
export interface EphemeralDeliverySnapshot {
|
|
20
|
+
readonly capacity: number;
|
|
21
|
+
readonly inFlight: number;
|
|
22
|
+
readonly admitted: number;
|
|
23
|
+
readonly completed: number;
|
|
24
|
+
readonly failed: number;
|
|
25
|
+
readonly dropped: number;
|
|
26
|
+
readonly persistence: "none";
|
|
27
|
+
readonly restartRecovery: false;
|
|
28
|
+
readonly dropPolicy: "drop-newest";
|
|
29
|
+
}
|
|
30
|
+
export interface EphemeralDelivery {
|
|
31
|
+
readonly deliver: (envelope: UnknownEventEnvelope) => Promise<EphemeralDeliveryResult>;
|
|
32
|
+
readonly snapshot: () => EphemeralDeliverySnapshot;
|
|
33
|
+
}
|
|
34
|
+
/** Delivers transient events while bounding simultaneous in-process work. */
|
|
35
|
+
export declare function createEphemeralDelivery(invoke: (envelope: UnknownEventEnvelope) => Promise<unknown>, requestedCapacity?: number): EphemeralDelivery;
|
|
36
|
+
//# sourceMappingURL=ephemeral.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ephemeral.d.ts","sourceRoot":"","sources":["../../src/events/ephemeral.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,+BAA+B;;;;EAIjC,CAAC;AAEZ,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACvF,QAAQ,CAAC,QAAQ,EAAE,MAAM,yBAAyB,CAAC;CACpD;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,EAC5D,iBAAiB,SAA6B,GAC7C,iBAAiB,CAuDnB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export const DEFAULT_EPHEMERAL_CAPACITY = 100;
|
|
2
|
+
export const EPHEMERAL_DELIVERY_CAPABILITIES = Object.freeze({
|
|
3
|
+
persistence: "none",
|
|
4
|
+
restartRecovery: false,
|
|
5
|
+
dropPolicy: "drop-newest",
|
|
6
|
+
});
|
|
7
|
+
/** Delivers transient events while bounding simultaneous in-process work. */
|
|
8
|
+
export function createEphemeralDelivery(invoke, requestedCapacity = DEFAULT_EPHEMERAL_CAPACITY) {
|
|
9
|
+
if (typeof invoke !== "function")
|
|
10
|
+
throw new TypeError("Ephemeral delivery requires a target");
|
|
11
|
+
if (!Number.isSafeInteger(requestedCapacity) || requestedCapacity <= 0) {
|
|
12
|
+
throw new RangeError("Ephemeral delivery capacity must be a positive integer");
|
|
13
|
+
}
|
|
14
|
+
const capacity = requestedCapacity;
|
|
15
|
+
let inFlight = 0;
|
|
16
|
+
let admitted = 0;
|
|
17
|
+
let completed = 0;
|
|
18
|
+
let failed = 0;
|
|
19
|
+
let dropped = 0;
|
|
20
|
+
const deliver = async (envelope) => {
|
|
21
|
+
// ponytail: no hidden backlog; add a bounded FIFO only if measured delivery needs it.
|
|
22
|
+
if (inFlight >= capacity) {
|
|
23
|
+
dropped += 1;
|
|
24
|
+
return outcome({ accepted: false, status: "dropped", dropReason: "capacity" });
|
|
25
|
+
}
|
|
26
|
+
inFlight += 1;
|
|
27
|
+
admitted += 1;
|
|
28
|
+
try {
|
|
29
|
+
const value = await invoke(envelope);
|
|
30
|
+
completed += 1;
|
|
31
|
+
return outcome({ accepted: true, status: "completed", value });
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
failed += 1;
|
|
35
|
+
return outcome({ accepted: true, status: "failed", error });
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
inFlight -= 1;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const snapshot = () => Object.freeze({
|
|
42
|
+
capacity,
|
|
43
|
+
inFlight,
|
|
44
|
+
admitted,
|
|
45
|
+
completed,
|
|
46
|
+
failed,
|
|
47
|
+
dropped,
|
|
48
|
+
...EPHEMERAL_DELIVERY_CAPABILITIES,
|
|
49
|
+
});
|
|
50
|
+
return Object.freeze({ deliver, snapshot });
|
|
51
|
+
function outcome(result) {
|
|
52
|
+
return Object.freeze({
|
|
53
|
+
...result,
|
|
54
|
+
persisted: false,
|
|
55
|
+
capacity,
|
|
56
|
+
dropPolicy: "drop-newest",
|
|
57
|
+
restartRecovery: false,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=ephemeral.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ephemeral.js","sourceRoot":"","sources":["../../src/events/ephemeral.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,MAAM,CAAC,MAAM,+BAA+B,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3D,WAAW,EAAE,MAAM;IACnB,eAAe,EAAE,KAAK;IACtB,UAAU,EAAE,aAAa;CACjB,CAAC,CAAC;AA+BZ,6EAA6E;AAC7E,MAAM,UAAU,uBAAuB,CACrC,MAA4D,EAC5D,iBAAiB,GAAG,0BAA0B;IAE9C,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IAC9F,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,UAAU,CAAC,wDAAwD,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC;IACnC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,MAAM,OAAO,GAAG,KAAK,EAAE,QAA8B,EAAoC,EAAE;QACzF,sFAAsF;QACtF,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,CAAC;YACb,OAAO,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,QAAQ,IAAI,CAAC,CAAC;QACd,QAAQ,IAAI,CAAC,CAAC;QACd,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrC,SAAS,IAAI,CAAC,CAAC;YACf,OAAO,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,CAAC;YACZ,OAAO,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9D,CAAC;gBAAS,CAAC;YACT,QAAQ,IAAI,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,GAA8B,EAAE,CAC/C,MAAM,CAAC,MAAM,CAAC;QACZ,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,MAAM;QACN,OAAO;QACP,GAAG,+BAA+B;KACnC,CAAC,CAAC;IACL,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE5C,SAAS,OAAO,CACd,MAC0E;QAE1E,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,GAAG,MAAM;YACT,SAAS,EAAE,KAAK;YAChB,QAAQ;YACR,UAAU,EAAE,aAAa;YACzB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { EventPublishResult, UnknownEventEnvelope } from "@relkit/events";
|
|
2
|
+
import { type JobStoreBoundary, type JobStoreCheckpoint, type JobStoreIndex, type JobStoreOptions } from "../jobs/store.js";
|
|
3
|
+
import { createJobStorePaths } from "../jobs/store-files.js";
|
|
4
|
+
export declare const EVENT_LOG_VERSION: 1;
|
|
5
|
+
export type EventLogBoundary = JobStoreBoundary;
|
|
6
|
+
export type EventLogPaths = ReturnType<typeof createJobStorePaths>;
|
|
7
|
+
export interface EventLogOptions extends Pick<JobStoreOptions, "now" | "onBoundary"> {
|
|
8
|
+
}
|
|
9
|
+
export interface EventLogRecord {
|
|
10
|
+
readonly version: typeof EVENT_LOG_VERSION;
|
|
11
|
+
readonly sequence: number;
|
|
12
|
+
readonly kind: "accepted";
|
|
13
|
+
readonly accepted: true;
|
|
14
|
+
readonly timestamp: number;
|
|
15
|
+
readonly envelope: UnknownEventEnvelope;
|
|
16
|
+
}
|
|
17
|
+
export interface EventLogSnapshot {
|
|
18
|
+
readonly records: readonly EventLogRecord[];
|
|
19
|
+
readonly index: JobStoreIndex;
|
|
20
|
+
readonly checkpoint: JobStoreCheckpoint;
|
|
21
|
+
}
|
|
22
|
+
export interface EventLog {
|
|
23
|
+
readonly root: string;
|
|
24
|
+
readonly paths: EventLogPaths;
|
|
25
|
+
readonly append: (envelope: EventLogInput) => Promise<EventLogRecord>;
|
|
26
|
+
readonly snapshot: () => EventLogSnapshot;
|
|
27
|
+
readonly close: () => Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
export type EventLogInput = UnknownEventEnvelope | EventPublishResult<string, number, unknown>;
|
|
30
|
+
export declare class EventLogStateError extends Error {
|
|
31
|
+
readonly code: "RELKIT_EVENT_LOG_STATE_INVALID";
|
|
32
|
+
constructor(message: string);
|
|
33
|
+
}
|
|
34
|
+
export declare function createEventLogPaths(root: string): EventLogPaths;
|
|
35
|
+
/** Opens the durable accepted-event log and repairs invalid records on startup. */
|
|
36
|
+
export declare function createEventLog(requestedRoot: string, options?: EventLogOptions): Promise<EventLog>;
|
|
37
|
+
//# sourceMappingURL=log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/events/log.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,eAAO,MAAM,iBAAiB,EAAG,CAAU,CAAC;AAC5C,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAChD,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEnE,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,YAAY,CAAC;CAAG;AAEvF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,iBAAiB,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;CACzC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACtE,QAAQ,CAAC,QAAQ,EAAE,MAAM,gBAAgB,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,MAAM,aAAa,GAAG,oBAAoB,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE/F,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAG,gCAAgC,CAAU;gBAE9C,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAE/D;AAED,mFAAmF;AACnF,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAwBnB"}
|