@ewhauser/world-celld 0.1.1 → 0.3.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/dist/worker.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { CreateEventRequest, Event, Hook, RunCreatedEventRequest, Step, ValidQueueName, WorkflowRun } from "@workflow/world";
1
+ import { CreateEventParams, CreateEventRequest, Event, Hook, RunCreatedEventRequest, Step, TerminalWorkflowRunStatus, ValidQueueName, Wait, WorkflowRun } from "@workflow/world";
2
2
  //#region src/worker/router.d.ts
3
3
  /** Minimal structural DO namespace type (celld provides the real thing). */
4
4
  interface DONamespaceLike {
@@ -18,11 +18,78 @@ interface WorkerEnv {
18
18
  }
19
19
  declare function createRouter(env: WorkerEnv): (request: Request) => Promise<Response>;
20
20
  //#endregion
21
+ //#region src/retention.d.ts
22
+ type CleanupPhase = 'retained' | 'index' | 'streams' | 'queues' | 'payload' | 'tombstoned';
23
+ interface CleanupRecord {
24
+ version: 1;
25
+ runId: string;
26
+ workflowName: string;
27
+ createdAt: Date;
28
+ completedAt: Date;
29
+ terminalStatus: TerminalWorkflowRunStatus;
30
+ dueAt: Date;
31
+ queueShards: number;
32
+ phase: CleanupPhase;
33
+ attempts: number;
34
+ lastError?: string;
35
+ lastAttemptAt?: Date;
36
+ tombstonedAt?: Date;
37
+ deletedPayloadKeys: number;
38
+ deletedStreams: number;
39
+ deletedQueueMessages: number;
40
+ }
41
+ interface RunTombstone {
42
+ version: 1;
43
+ runId: string;
44
+ terminalStatus: TerminalWorkflowRunStatus;
45
+ completedAt: Date;
46
+ expiredAt: Date;
47
+ tombstonedAt: Date;
48
+ }
49
+ type RunReadOutcome<T> = {
50
+ ok: true;
51
+ value: T;
52
+ } | {
53
+ ok: false;
54
+ code: 'RUN_EXPIRED';
55
+ message: string;
56
+ tombstone: RunTombstone;
57
+ };
58
+ interface HookIndexReference {
59
+ hookId: string;
60
+ token: string;
61
+ }
62
+ interface ExpireRunIndexesRequest {
63
+ runId: string;
64
+ keys: string[];
65
+ hooks: HookIndexReference[];
66
+ expiredAt: number;
67
+ }
68
+ interface ExpireRunIndexesResult {
69
+ deleted: number;
70
+ }
71
+ interface ExpireRunStreamsResult {
72
+ streams: string[];
73
+ }
74
+ interface ExpireStreamResult {
75
+ deleted: boolean;
76
+ chunks: number;
77
+ }
78
+ interface ExpireQueueRunResult {
79
+ deleted: number;
80
+ }
81
+ interface ScheduleCleanupRequest {
82
+ retentionMs: number;
83
+ queueShards: number;
84
+ }
85
+ //#endregion
21
86
  //#region src/apply-event.d.ts
22
87
  interface ApplyEventRequest {
23
88
  /** The effective run id (already resolved / generated by the caller). */
24
89
  runId: string;
25
90
  data: CreateEventRequest | RunCreatedEventRequest;
91
+ /** Workflow 5 event-log position and preload options. */
92
+ params?: CreateEventParams;
26
93
  /**
27
94
  * Current holder of the hook token per the global KV token index
28
95
  * (hook_created only). `null` means the token is unclaimed.
@@ -31,8 +98,10 @@ interface ApplyEventRequest {
31
98
  runId: string;
32
99
  hookId: string;
33
100
  } | null;
101
+ /** Internal world-celld retention policy captured with the event. */
102
+ cleanup?: ScheduleCleanupRequest;
34
103
  }
35
- type ApplyEventErrorCode = 'RUN_NOT_FOUND' | 'STEP_NOT_FOUND' | 'HOOK_NOT_FOUND' | 'ENTITY_CONFLICT' | 'RUN_EXPIRED' | 'TOO_EARLY' | 'RUN_NOT_SUPPORTED' | 'LEGACY_RUN_NOT_SUPPORTED';
104
+ type ApplyEventErrorCode = 'RUN_NOT_FOUND' | 'STEP_NOT_FOUND' | 'HOOK_NOT_FOUND' | 'WAIT_NOT_FOUND' | 'ENTITY_CONFLICT' | 'RUN_EXPIRED' | 'TOO_EARLY' | 'RUN_NOT_SUPPORTED';
36
105
  interface ApplyEventFailure {
37
106
  ok: false;
38
107
  code: ApplyEventErrorCode;
@@ -49,6 +118,9 @@ interface ApplyEventSuccess {
49
118
  run?: WorkflowRun;
50
119
  step?: Step;
51
120
  hook?: Hook;
121
+ wait?: Wait;
122
+ /** True when a lazy step_started atomically created its step. */
123
+ stepCreated?: true;
52
124
  /** Hooks whose tokens must be released from the global KV index. */
53
125
  releasedHooks: Array<{
54
126
  hookId: string;
@@ -63,11 +135,16 @@ interface ApplyEventSuccess {
63
135
  hookToIndex?: Hook;
64
136
  /** All events (ascending), preloaded for run_started responses. */
65
137
  events?: Event[];
138
+ /** Pagination metadata required whenever events are returned. */
139
+ cursor?: string | null;
140
+ hasMore?: boolean;
141
+ /** Server-owned event ceiling advertised on run lifecycle writes. */
142
+ maxEvents?: number;
66
143
  }
67
144
  type ApplyEventOutcome = ApplyEventSuccess | ApplyEventFailure;
68
145
  //#endregion
69
146
  //#region src/queue.d.ts
70
- type Pathname = 'flow' | 'step';
147
+ type Pathname = 'flow';
71
148
  /**
72
149
  * Enqueue request accepted by a QueueDO cell. The message payload travels
73
150
  * pre-encoded with the shared tagged-JSON codec (`body`), so the cell can
@@ -79,6 +156,8 @@ interface EnqueueRequest {
79
156
  pathname: Pathname;
80
157
  /** `stringify(message)` — the exact bytes POSTed to the app on delivery. */
81
158
  body: string;
159
+ /** Owning workflow run; absent only for health-check messages. */
160
+ runId?: string;
82
161
  idempotencyKey?: string;
83
162
  delaySeconds?: number;
84
163
  /**
@@ -88,7 +167,7 @@ interface EnqueueRequest {
88
167
  config: QueueCellConfig;
89
168
  }
90
169
  interface QueueCellConfig {
91
- /** Base URL of the app; deliveries POST to `${baseUrl}/.well-known/workflow/v1/{flow|step}`. */
170
+ /** Base URL of the app; deliveries POST to `${baseUrl}/.well-known/workflow/v1/flow`. */
92
171
  targetBaseUrl: string;
93
172
  queueShards: number;
94
173
  }
@@ -98,7 +177,7 @@ type EnqueueOutcome = {
98
177
  deduped: boolean;
99
178
  } | {
100
179
  ok: false;
101
- code: 'CONFIG_MISMATCH';
180
+ code: 'CONFIG_MISMATCH' | 'RUN_EXPIRED';
102
181
  message: string;
103
182
  };
104
183
  //#endregion
@@ -141,6 +220,10 @@ declare class DurableObject<TEnv = unknown> {
141
220
  declare class IndexDO extends DurableObject {
142
221
  get(key: string): Promise<string | null>;
143
222
  put(key: string, value: string): Promise<void>;
223
+ /** Publish a derived index only while its owning run is not expired. */
224
+ putOwned(runId: string, key: string, value: string): Promise<{
225
+ stored: boolean;
226
+ }>;
144
227
  delete(key: string): Promise<void>;
145
228
  list(options?: {
146
229
  prefix?: string;
@@ -161,6 +244,12 @@ declare class IndexDO extends DurableObject {
161
244
  finalizeHookIndexes(token: string, hookId: string, serializedHook: string, owner: HookTokenOwner): Promise<void>;
162
245
  releaseHookToken(token: string, owner: HookTokenOwner): Promise<void>;
163
246
  deleteHookIndexes(token: string, hookId: string, owner: HookTokenOwner): Promise<void>;
247
+ /**
248
+ * Fence a run and remove all of its known derived indexes atomically.
249
+ * Once the fence exists, putOwned() and hook finalization cannot resurrect
250
+ * entries from a delayed request.
251
+ */
252
+ expireRun(request: ExpireRunIndexesRequest): Promise<ExpireRunIndexesResult>;
164
253
  }
165
254
  //#endregion
166
255
  //#region src/worker/durable-objects/QueueDO.d.ts
@@ -179,6 +268,8 @@ declare class IndexDO extends DurableObject {
179
268
  * inflight:<messageId> crash-recovery deadline (epoch ms)
180
269
  * key:<idempotencyKey> active dedup claim -> messageId
181
270
  * dlq:<paddedMs>:<messageId> DeadLetterRow
271
+ * run:<runId>:<messageId> QueueRunReference for retention cleanup
272
+ * expired-run:<runId> run fence preventing delayed enqueue
182
273
  *
183
274
  * celld gotchas designed around:
184
275
  * - celld#144 (alarm handlers can overlap): the storage-only claim phase runs
@@ -196,6 +287,7 @@ interface MessageRow {
196
287
  pathname: 'flow' | 'step';
197
288
  /** Pre-encoded tagged-JSON payload — forwarded byte-identical. */
198
289
  body: string;
290
+ runId?: string;
199
291
  /**
200
292
  * Delivery target captured at enqueue time. Carried per message (not
201
293
  * pinned on the cell) so an app redeploy at a new URL never bricks the
@@ -245,6 +337,8 @@ declare class QueueDO extends DurableObject {
245
337
  rearmAlarm(): Promise<{
246
338
  alarmAt: number | null;
247
339
  }>;
340
+ /** Fence a run and purge every live, inflight, and dead-letter message it owns. */
341
+ expireRun(runId: string, expiredAt: number): Promise<ExpireQueueRunResult>;
248
342
  }
249
343
  //#endregion
250
344
  //#region src/worker/durable-objects/StreamDO.d.ts
@@ -260,16 +354,17 @@ declare class QueueDO extends DurableObject {
260
354
  */
261
355
  declare class StreamDO extends DurableObject {
262
356
  private getMeta;
357
+ private assertOwner;
263
358
  /**
264
359
  * Append a chunk. The index is allocated inside the transaction, so
265
360
  * concurrent writers can never collide or skip.
266
361
  */
267
- writeChunk(data: Uint8Array): Promise<number>;
362
+ writeChunk(runId: string, data: Uint8Array): Promise<number>;
268
363
  /**
269
364
  * Close the stream (idempotent). Readers observe `done: true` once all
270
365
  * previously written chunks have been consumed.
271
366
  */
272
- closeStream(): Promise<void>;
367
+ closeStream(runId: string): Promise<void>;
273
368
  /**
274
369
  * Read up to `limit` chunks starting at `startIndex` (0-based, inclusive).
275
370
  */
@@ -293,11 +388,17 @@ declare class StreamDO extends DurableObject {
293
388
  /**
294
389
  * Register a stream name against this per-run registry instance.
295
390
  */
296
- registerStream(name: string): Promise<void>;
391
+ registerStream(runId: string, name: string): Promise<void>;
297
392
  /**
298
393
  * List stream names registered against this per-run registry instance.
299
394
  */
300
395
  listStreams(): Promise<string[]>;
396
+ /** Fence a run's registry before any stream cells are removed. */
397
+ expireRegistry(runId: string, expiredAt: number): Promise<ExpireRunStreamsResult>;
398
+ /** Remove the registry payload after every referenced stream was fenced. */
399
+ finalizeRegistry(runId: string): Promise<void>;
400
+ /** Delete stream payload while leaving a small ownership tombstone. */
401
+ expireStream(runId: string, expiredAt: number): Promise<ExpireStreamResult>;
301
402
  }
302
403
  //#endregion
303
404
  //#region src/worker/durable-objects/WorkflowRunDO.d.ts
@@ -312,88 +413,58 @@ declare class StreamDO extends DurableObject {
312
413
  * queue-message dedup claims (see claimInflight/releaseInflight).
313
414
  */
314
415
  declare class WorkflowRunDO extends DurableObject {
315
- private schemaReady;
316
- /**
317
- * Lazily ensure schema migrations have run.
318
- * Memoized so it only runs once per DO instantiation.
319
- */
320
- private ensureSchema;
321
- /**
322
- * Apply an event: validate, guard, append the event and mutate the entity
323
- * in ONE storage transaction. Guard failures are returned as structured
324
- * outcomes (not thrown) because typed errors do not survive the RPC
325
- * boundary with their `name` intact.
326
- */
416
+ private now;
417
+ private expiredTombstone;
418
+ private read;
419
+ /** Apply an event and capture all retention metadata in the same transaction. */
327
420
  applyEvent(request: ApplyEventRequest): Promise<ApplyEventOutcome>;
328
- /**
329
- * Get the workflow run
330
- */
331
- getRun(): Promise<WorkflowRun | null>;
332
- /**
333
- * Get a specific step
334
- */
335
- getStep(stepId: string): Promise<Step | null>;
336
- /**
337
- * List steps with real limit/cursor pagination (cursor = last stepId).
338
- */
421
+ getRun(): Promise<RunReadOutcome<WorkflowRun | null>>;
422
+ getStep(stepId: string): Promise<RunReadOutcome<Step | null>>;
339
423
  listSteps(params?: {
340
424
  limit?: number;
341
425
  cursor?: string;
342
426
  sortOrder?: 'asc' | 'desc';
343
- }): Promise<{
427
+ }): Promise<RunReadOutcome<{
344
428
  data: Step[];
345
429
  cursor: string | null;
346
430
  hasMore: boolean;
347
- }>;
348
- /**
349
- * Get a specific event
350
- */
351
- getEvent(eventId: string): Promise<Event | null>;
352
- /**
353
- * List events with real limit/cursor pagination. Events are keyed by their
354
- * monotonic ULID eventId, so storage order == event order.
355
- */
431
+ }>>;
432
+ getEvent(eventId: string): Promise<RunReadOutcome<Event | null>>;
356
433
  listEvents(params?: {
357
434
  limit?: number;
358
435
  cursor?: string;
359
436
  sortOrder?: 'asc' | 'desc';
360
- }): Promise<{
437
+ }): Promise<RunReadOutcome<{
361
438
  data: Event[];
362
439
  cursor: string | null;
363
440
  hasMore: boolean;
364
- }>;
365
- /**
366
- * List hooks with real limit/cursor pagination (cursor = last hookId).
367
- */
441
+ }>>;
368
442
  listHooks(params?: {
369
443
  limit?: number;
370
444
  cursor?: string;
371
445
  sortOrder?: 'asc' | 'desc';
372
- }): Promise<{
446
+ }): Promise<RunReadOutcome<{
373
447
  data: Hook[];
374
448
  cursor: string | null;
375
449
  hasMore: boolean;
376
- }>;
377
- /**
378
- * Claim a queue-message dedup slot. Used on DO instances dedicated to a
379
- * single idempotency key (`claim:<queueName>:<idempotencyKey>`).
380
- *
381
- * - Unclaimed -> claim and proceed.
382
- * - Claimed by the SAME messageId -> redelivery of the same message
383
- * (previous attempt failed transiently) -> proceed.
384
- * - Claimed by a DIFFERENT messageId -> concurrent duplicate -> reject,
385
- * unless the claim is stale (holder crashed / went to the DLQ without
386
- * releasing), in which case the claim is stolen.
387
- */
450
+ }>>;
451
+ getCleanupStatus(): Promise<CleanupRecord | null>;
452
+ /** Explicitly schedule an existing terminal run, used for opt-in backfills. */
453
+ scheduleCleanup(request: ScheduleCleanupRequest): Promise<CleanupRecord | null>;
454
+ cleanupNow(request: ScheduleCleanupRequest): Promise<CleanupRecord | null>;
455
+ rearmCleanup(): Promise<CleanupRecord | null>;
456
+ alarm(): Promise<void>;
457
+ private namespace;
458
+ private setCleanupPhase;
459
+ private executeCleanup;
460
+ private deletePayloadBatch;
461
+ private recordCleanupFailure;
388
462
  claimInflight(params: {
389
463
  messageId: string;
390
464
  staleMs: number;
391
465
  }): Promise<{
392
466
  claimed: boolean;
393
467
  }>;
394
- /**
395
- * Release a queue-message dedup claim after the message was fully handled.
396
- */
397
468
  releaseInflight(): Promise<void>;
398
469
  }
399
470
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","names":[],"sources":["../src/worker/router.ts","../src/apply-event.ts","../src/queue.ts","../src/config.ts","../src/worker/do-base.ts","../src/worker/durable-objects/IndexDO.ts","../src/worker/durable-objects/QueueDO.ts","../src/worker/durable-objects/StreamDO.ts","../src/worker/durable-objects/WorkflowRunDO.ts","../src/worker/worker.ts"],"mappings":";;;UAmBiB;EACf,WAAW;IAAiB;;EAC5B,IAAI;IAAM;;;UAGK;EACf,aAAa;EACb,kBAAkB;EAClB,gBAAgB;EAChB,gBAAgB;EAChB;;iBAmFc,aAAa,KAAK,aAClB,SAAS,YAAU,QAAQ;;;UC3B1B;;EAEf;EACA,MAAM,qBAAqB;;;;;EAK3B;IAAgB;IAAe;;;KAGrB;UAUK;EACf;EACA,MAAM;EACN;;EAEA;;EAEA;;UAGe;EACf;;EAEA,QAAQ;EACR,MAAM;EACN,OAAO;EACP,OAAO;;EAEP,eAAe;IAAQ;IAAgB;;;EAEvC;IAAe;IAAsB,WAAW;;;EAEhD,cAAc;;EAEd,SAAS;;KAGC,oBAAoB,oBAAoB;;;KC/E/C;;;;;;UAoBY;EACf;EACA,WAAW;EACX,UAAU;;EAEV;EACA;EACA;;;;;EAKA,QAAQ;;UAGO;;EAEf;EACA;;KAGU;EACN;EAAU;EAAmB;;EAC7B;EAAW;EAAyB;;;;UCtEzB;EACf;EACA;;;;;;;;;;;;;cCrBW,cAAc;WAEd,KAAK;WACL,KAAK;EADL,YAAA,KAAK,oBACL,KAAK;;;;;;;;;;;;;;;;;cCoBL,gBAAgB;EACrB,IAAI,cAAc;EAKlB,IAAI,aAAa,gBAAgB;EAIjC,OAAO,cAAc;EAIrB,KAAK;IACT;IACA;IACA;IACA;MACE;IACF,MAAM;MAAQ;;IACd;IACA;;EA2BI,iBACJ,eACA,OAAO,iBACN;IAAU;IAAkB,SAAS;;EAmBlC,oBACJ,eACA,gBACA,wBACA,OAAO,iBACN;EAmBG,iBAAiB,eAAe,OAAO,iBAAiB;EAUxD,kBAAkB,eAAe,gBAAgB,OAAO,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UC3GhE;EACf;EACA;EACA;;EAEA;;;;;;;EAOA;EACA;;EAEA;EACA;EACA;;UAGe,sBAAsB;EACrC;;UAGe;EACf;EACA;EACA;EACA;;cAqCW,gBAAgB;;EAoBrB,QAAQ,SAAS,iBAAiB,QAAQ;EA2D1C,SAAS;EA8NT,SAAS,QAAQ;EAgBjB,gBAAgB;IACpB;IACA;MACE;IAAU,MAAM;IAAiB;IAAuB;;;EAkBtD,kBAAkB,oBAAoB;IAAU;;EAkChD,oBAAoB;IAAU;;;;;;EAe9B,cAAc;IAAU;;;;;;;;;;;;;;;cClcnB,iBAAiB;UACd;;;;;EASR,WAAW,MAAM,aAAa;;;;;EAiB9B,eAAe;;;;EAUf,UAAU;IAAU;IAAoB;MAAkB;IAC9D,QAAQ;;IAER;;IAEA;;;;;EAmBI,WAAW;IAAU;IAAmB;;;;;EAQxC,eAAe,eAAe;;;;EAO9B,eAAe;;;;;;;;;;;;;;cCeV,sBAAsB;UACzB;;;;;UAMA;;;;;;;EAaF,WAAW,SAAS,oBAAoB,QAAQ;;;;EAqBhD,UAAU,QAAQ;;;;EASlB,QAAQ,iBAAiB,QAAQ;;;;EASjC,UAAU;IACd;IACA;IACA;MACE;IAAU,MAAM;IAAQ;IAAuB;;;;;EAiB7C,SAAS,kBAAkB,QAAQ;;;;;EAUnC,WAAW;IACf;IACA;IACA;MACE;IAAU,MAAM;IAAS;IAAuB;;;;;EAiB9C,UAAU;IACd;IACA;IACA;MACE;IAAU,MAAM;IAAQ;IAAuB;;;;;;;;;;;;;EAyB7C,cAAc;IAClB;IACA;MACE;IAAU;;;;;EAoBR,mBAAmB;;;;;EChRJ,MAAA,SAAA,SAAO,KAAO,YAAY,QAAQ"}
1
+ {"version":3,"file":"worker.d.ts","names":[],"sources":["../src/worker/router.ts","../src/retention.ts","../src/apply-event.ts","../src/queue.ts","../src/config.ts","../src/worker/do-base.ts","../src/worker/durable-objects/IndexDO.ts","../src/worker/durable-objects/QueueDO.ts","../src/worker/durable-objects/StreamDO.ts","../src/worker/durable-objects/WorkflowRunDO.ts","../src/worker/worker.ts"],"mappings":"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"}