@rivetkit/workflow-engine 2.3.16 → 2.3.18-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tsup/{chunk-KLHCG2KY.cjs → chunk-32422MOM.cjs} +32 -15
- package/dist/tsup/chunk-32422MOM.cjs.map +1 -0
- package/dist/tsup/{chunk-DTS4S7RT.js → chunk-TVRZA5O5.js} +32 -15
- package/dist/tsup/chunk-TVRZA5O5.js.map +1 -0
- package/dist/tsup/index.cjs +2 -2
- package/dist/tsup/index.d.cts +5 -0
- package/dist/tsup/index.d.ts +5 -0
- package/dist/tsup/index.js +1 -1
- package/dist/tsup/testing.cjs +29 -23
- package/dist/tsup/testing.cjs.map +1 -1
- package/dist/tsup/testing.d.cts +1 -0
- package/dist/tsup/testing.d.ts +1 -0
- package/dist/tsup/testing.js +7 -1
- package/dist/tsup/testing.js.map +1 -1
- package/package.json +1 -1
- package/src/driver.ts +6 -0
- package/src/storage.ts +44 -14
- package/src/testing.ts +7 -0
- package/dist/tsup/chunk-DTS4S7RT.js.map +0 -1
- package/dist/tsup/chunk-KLHCG2KY.cjs.map +0 -1
package/dist/tsup/index.cjs
CHANGED
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
var
|
|
46
|
+
var _chunk32422MOMcjs = require('./chunk-32422MOM.cjs');
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
|
|
@@ -89,5 +89,5 @@ var _chunkKLHCG2KYcjs = require('./chunk-KLHCG2KY.cjs');
|
|
|
89
89
|
|
|
90
90
|
|
|
91
91
|
|
|
92
|
-
exports.CancelledError =
|
|
92
|
+
exports.CancelledError = _chunk32422MOMcjs.CancelledError; exports.CriticalError = _chunk32422MOMcjs.CriticalError; exports.DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL = _chunk32422MOMcjs.DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL; exports.DEFAULT_MAX_RETRIES = _chunk32422MOMcjs.DEFAULT_MAX_RETRIES; exports.DEFAULT_RETRY_BACKOFF_BASE = _chunk32422MOMcjs.DEFAULT_RETRY_BACKOFF_BASE; exports.DEFAULT_RETRY_BACKOFF_MAX = _chunk32422MOMcjs.DEFAULT_RETRY_BACKOFF_MAX; exports.DEFAULT_STEP_TIMEOUT = _chunk32422MOMcjs.DEFAULT_STEP_TIMEOUT; exports.EntryInProgressError = _chunk32422MOMcjs.EntryInProgressError; exports.EvictedError = _chunk32422MOMcjs.EvictedError; exports.HistoryDivergedError = _chunk32422MOMcjs.HistoryDivergedError; exports.JoinError = _chunk32422MOMcjs.JoinError; exports.Loop = _chunk32422MOMcjs.Loop; exports.MessageWaitError = _chunk32422MOMcjs.MessageWaitError; exports.RaceError = _chunk32422MOMcjs.RaceError; exports.RollbackCheckpointError = _chunk32422MOMcjs.RollbackCheckpointError; exports.RollbackError = _chunk32422MOMcjs.RollbackError; exports.SleepError = _chunk32422MOMcjs.SleepError; exports.StepExhaustedError = _chunk32422MOMcjs.StepExhaustedError; exports.StepFailedError = _chunk32422MOMcjs.StepFailedError; exports.WorkflowContextImpl = _chunk32422MOMcjs.WorkflowContextImpl; exports.appendLoopIteration = _chunk32422MOMcjs.appendLoopIteration; exports.appendName = _chunk32422MOMcjs.appendName; exports.createEntry = _chunk32422MOMcjs.createEntry; exports.createHistorySnapshot = _chunk32422MOMcjs.createHistorySnapshot; exports.createStorage = _chunk32422MOMcjs.createStorage; exports.deleteEntriesWithPrefix = _chunk32422MOMcjs.deleteEntriesWithPrefix; exports.emptyLocation = _chunk32422MOMcjs.emptyLocation; exports.extractErrorInfo = _chunk32422MOMcjs.extractErrorInfo; exports.flush = _chunk32422MOMcjs.flush; exports.generateId = _chunk32422MOMcjs.generateId; exports.getEntry = _chunk32422MOMcjs.getEntry; exports.getOrCreateMetadata = _chunk32422MOMcjs.getOrCreateMetadata; exports.isLocationPrefix = _chunk32422MOMcjs.isLocationPrefix; exports.isLoopIterationMarker = _chunk32422MOMcjs.isLoopIterationMarker; exports.loadMetadata = _chunk32422MOMcjs.loadMetadata; exports.loadStorage = _chunk32422MOMcjs.loadStorage; exports.locationToKey = _chunk32422MOMcjs.locationToKey; exports.locationsEqual = _chunk32422MOMcjs.locationsEqual; exports.parentLocation = _chunk32422MOMcjs.parentLocation; exports.registerName = _chunk32422MOMcjs.registerName; exports.replayWorkflowFromStep = _chunk32422MOMcjs.replayWorkflowFromStep; exports.resolveName = _chunk32422MOMcjs.resolveName; exports.runWorkflow = _chunk32422MOMcjs.runWorkflow; exports.setEntry = _chunk32422MOMcjs.setEntry;
|
|
93
93
|
//# sourceMappingURL=index.cjs.map
|
package/dist/tsup/index.d.cts
CHANGED
|
@@ -589,6 +589,11 @@ interface EngineDriver {
|
|
|
589
589
|
* Delete a key.
|
|
590
590
|
*/
|
|
591
591
|
delete(key: Uint8Array): Promise<void>;
|
|
592
|
+
/**
|
|
593
|
+
* Batch delete multiple keys in a single operation.
|
|
594
|
+
* Should be atomic if possible.
|
|
595
|
+
*/
|
|
596
|
+
batchDelete(keys: Uint8Array[]): Promise<void>;
|
|
592
597
|
/**
|
|
593
598
|
* Delete all keys with a given prefix.
|
|
594
599
|
*/
|
package/dist/tsup/index.d.ts
CHANGED
|
@@ -589,6 +589,11 @@ interface EngineDriver {
|
|
|
589
589
|
* Delete a key.
|
|
590
590
|
*/
|
|
591
591
|
delete(key: Uint8Array): Promise<void>;
|
|
592
|
+
/**
|
|
593
|
+
* Batch delete multiple keys in a single operation.
|
|
594
|
+
* Should be atomic if possible.
|
|
595
|
+
*/
|
|
596
|
+
batchDelete(keys: Uint8Array[]): Promise<void>;
|
|
592
597
|
/**
|
|
593
598
|
* Delete all keys with a given prefix.
|
|
594
599
|
*/
|
package/dist/tsup/index.js
CHANGED
package/dist/tsup/testing.cjs
CHANGED
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
var
|
|
50
|
+
var _chunk32422MOMcjs = require('./chunk-32422MOM.cjs');
|
|
51
51
|
|
|
52
52
|
// src/testing.ts
|
|
53
53
|
var InMemoryWorkflowMessageDriver = class {
|
|
@@ -97,7 +97,7 @@ var InMemoryWorkflowMessageDriver = class {
|
|
|
97
97
|
}
|
|
98
98
|
async waitForMessages(messageNames, abortSignal) {
|
|
99
99
|
if (abortSignal.aborted) {
|
|
100
|
-
throw new (0,
|
|
100
|
+
throw new (0, _chunk32422MOMcjs.EvictedError)();
|
|
101
101
|
}
|
|
102
102
|
const nameSet = messageNames.length > 0 ? new Set(messageNames) : void 0;
|
|
103
103
|
if (this.#messages.some(
|
|
@@ -118,7 +118,7 @@ var InMemoryWorkflowMessageDriver = class {
|
|
|
118
118
|
},
|
|
119
119
|
abortSignal,
|
|
120
120
|
onAbort: () => {
|
|
121
|
-
waiter.reject(new (0,
|
|
121
|
+
waiter.reject(new (0, _chunk32422MOMcjs.EvictedError)());
|
|
122
122
|
}
|
|
123
123
|
};
|
|
124
124
|
abortSignal.addEventListener("abort", waiter.onAbort, {
|
|
@@ -158,56 +158,62 @@ var InMemoryDriver = (_class = class {constructor() { _class.prototype.__init.ca
|
|
|
158
158
|
__init4() {this.workerPollInterval = 100}
|
|
159
159
|
__init5() {this.messageDriver = this.#inMemoryMessageDriver}
|
|
160
160
|
async get(key) {
|
|
161
|
-
await
|
|
162
|
-
const entry = this.kv.get(
|
|
161
|
+
await _chunk32422MOMcjs.sleep.call(void 0, this.latency);
|
|
162
|
+
const entry = this.kv.get(_chunk32422MOMcjs.keyToHex.call(void 0, key));
|
|
163
163
|
return _nullishCoalesce((entry == null ? void 0 : entry.value), () => ( null));
|
|
164
164
|
}
|
|
165
165
|
async set(key, value) {
|
|
166
|
-
await
|
|
167
|
-
this.kv.set(
|
|
166
|
+
await _chunk32422MOMcjs.sleep.call(void 0, this.latency);
|
|
167
|
+
this.kv.set(_chunk32422MOMcjs.keyToHex.call(void 0, key), { key, value });
|
|
168
168
|
}
|
|
169
169
|
async delete(key) {
|
|
170
|
-
await
|
|
171
|
-
this.kv.delete(
|
|
170
|
+
await _chunk32422MOMcjs.sleep.call(void 0, this.latency);
|
|
171
|
+
this.kv.delete(_chunk32422MOMcjs.keyToHex.call(void 0, key));
|
|
172
|
+
}
|
|
173
|
+
async batchDelete(keys) {
|
|
174
|
+
await _chunk32422MOMcjs.sleep.call(void 0, this.latency);
|
|
175
|
+
for (const key of keys) {
|
|
176
|
+
this.kv.delete(_chunk32422MOMcjs.keyToHex.call(void 0, key));
|
|
177
|
+
}
|
|
172
178
|
}
|
|
173
179
|
async deletePrefix(prefix) {
|
|
174
|
-
await
|
|
180
|
+
await _chunk32422MOMcjs.sleep.call(void 0, this.latency);
|
|
175
181
|
for (const [hexKey, entry] of this.kv) {
|
|
176
|
-
if (
|
|
182
|
+
if (_chunk32422MOMcjs.keyStartsWith.call(void 0, entry.key, prefix)) {
|
|
177
183
|
this.kv.delete(hexKey);
|
|
178
184
|
}
|
|
179
185
|
}
|
|
180
186
|
}
|
|
181
187
|
async deleteRange(start, end) {
|
|
182
|
-
await
|
|
188
|
+
await _chunk32422MOMcjs.sleep.call(void 0, this.latency);
|
|
183
189
|
for (const [hexKey, entry] of this.kv) {
|
|
184
|
-
if (
|
|
190
|
+
if (_chunk32422MOMcjs.compareKeys.call(void 0, entry.key, start) >= 0 && _chunk32422MOMcjs.compareKeys.call(void 0, entry.key, end) < 0) {
|
|
185
191
|
this.kv.delete(hexKey);
|
|
186
192
|
}
|
|
187
193
|
}
|
|
188
194
|
}
|
|
189
195
|
async list(prefix) {
|
|
190
|
-
await
|
|
196
|
+
await _chunk32422MOMcjs.sleep.call(void 0, this.latency);
|
|
191
197
|
const results = [];
|
|
192
198
|
for (const entry of this.kv.values()) {
|
|
193
|
-
if (
|
|
199
|
+
if (_chunk32422MOMcjs.keyStartsWith.call(void 0, entry.key, prefix)) {
|
|
194
200
|
results.push({ key: entry.key, value: entry.value });
|
|
195
201
|
}
|
|
196
202
|
}
|
|
197
|
-
return results.sort((a, b) =>
|
|
203
|
+
return results.sort((a, b) => _chunk32422MOMcjs.compareKeys.call(void 0, a.key, b.key));
|
|
198
204
|
}
|
|
199
205
|
async batch(writes) {
|
|
200
|
-
await
|
|
206
|
+
await _chunk32422MOMcjs.sleep.call(void 0, this.latency);
|
|
201
207
|
for (const { key, value } of writes) {
|
|
202
|
-
this.kv.set(
|
|
208
|
+
this.kv.set(_chunk32422MOMcjs.keyToHex.call(void 0, key), { key, value });
|
|
203
209
|
}
|
|
204
210
|
}
|
|
205
211
|
async setAlarm(workflowId, wakeAt) {
|
|
206
|
-
await
|
|
212
|
+
await _chunk32422MOMcjs.sleep.call(void 0, this.latency);
|
|
207
213
|
this.alarms.set(workflowId, wakeAt);
|
|
208
214
|
}
|
|
209
215
|
async clearAlarm(workflowId) {
|
|
210
|
-
await
|
|
216
|
+
await _chunk32422MOMcjs.sleep.call(void 0, this.latency);
|
|
211
217
|
this.alarms.delete(workflowId);
|
|
212
218
|
}
|
|
213
219
|
async waitForMessages(messageNames, abortSignal) {
|
|
@@ -218,7 +224,7 @@ var InMemoryDriver = (_class = class {constructor() { _class.prototype.__init.ca
|
|
|
218
224
|
}
|
|
219
225
|
while (true) {
|
|
220
226
|
if (abortSignal.aborted) {
|
|
221
|
-
throw new (0,
|
|
227
|
+
throw new (0, _chunk32422MOMcjs.EvictedError)();
|
|
222
228
|
}
|
|
223
229
|
const messages = await this.messageDriver.receiveMessages({
|
|
224
230
|
names: messageNames.length > 0 ? messageNames : void 0,
|
|
@@ -228,7 +234,7 @@ var InMemoryDriver = (_class = class {constructor() { _class.prototype.__init.ca
|
|
|
228
234
|
if (messages.length > 0) {
|
|
229
235
|
return;
|
|
230
236
|
}
|
|
231
|
-
await
|
|
237
|
+
await _chunk32422MOMcjs.sleep.call(void 0, Math.max(1, this.latency));
|
|
232
238
|
}
|
|
233
239
|
}
|
|
234
240
|
/**
|
|
@@ -324,5 +330,5 @@ var InMemoryDriver = (_class = class {constructor() { _class.prototype.__init.ca
|
|
|
324
330
|
|
|
325
331
|
|
|
326
332
|
|
|
327
|
-
exports.CancelledError =
|
|
333
|
+
exports.CancelledError = _chunk32422MOMcjs.CancelledError; exports.CriticalError = _chunk32422MOMcjs.CriticalError; exports.DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL = _chunk32422MOMcjs.DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL; exports.DEFAULT_MAX_RETRIES = _chunk32422MOMcjs.DEFAULT_MAX_RETRIES; exports.DEFAULT_RETRY_BACKOFF_BASE = _chunk32422MOMcjs.DEFAULT_RETRY_BACKOFF_BASE; exports.DEFAULT_RETRY_BACKOFF_MAX = _chunk32422MOMcjs.DEFAULT_RETRY_BACKOFF_MAX; exports.DEFAULT_STEP_TIMEOUT = _chunk32422MOMcjs.DEFAULT_STEP_TIMEOUT; exports.EntryInProgressError = _chunk32422MOMcjs.EntryInProgressError; exports.EvictedError = _chunk32422MOMcjs.EvictedError; exports.HistoryDivergedError = _chunk32422MOMcjs.HistoryDivergedError; exports.InMemoryDriver = InMemoryDriver; exports.JoinError = _chunk32422MOMcjs.JoinError; exports.Loop = _chunk32422MOMcjs.Loop; exports.MessageWaitError = _chunk32422MOMcjs.MessageWaitError; exports.RaceError = _chunk32422MOMcjs.RaceError; exports.RollbackCheckpointError = _chunk32422MOMcjs.RollbackCheckpointError; exports.RollbackError = _chunk32422MOMcjs.RollbackError; exports.SleepError = _chunk32422MOMcjs.SleepError; exports.StepExhaustedError = _chunk32422MOMcjs.StepExhaustedError; exports.StepFailedError = _chunk32422MOMcjs.StepFailedError; exports.WorkflowContextImpl = _chunk32422MOMcjs.WorkflowContextImpl; exports.appendLoopIteration = _chunk32422MOMcjs.appendLoopIteration; exports.appendName = _chunk32422MOMcjs.appendName; exports.createEntry = _chunk32422MOMcjs.createEntry; exports.createHistorySnapshot = _chunk32422MOMcjs.createHistorySnapshot; exports.createStorage = _chunk32422MOMcjs.createStorage; exports.deleteEntriesWithPrefix = _chunk32422MOMcjs.deleteEntriesWithPrefix; exports.emptyLocation = _chunk32422MOMcjs.emptyLocation; exports.extractErrorInfo = _chunk32422MOMcjs.extractErrorInfo; exports.flush = _chunk32422MOMcjs.flush; exports.generateId = _chunk32422MOMcjs.generateId; exports.getEntry = _chunk32422MOMcjs.getEntry; exports.getOrCreateMetadata = _chunk32422MOMcjs.getOrCreateMetadata; exports.isLocationPrefix = _chunk32422MOMcjs.isLocationPrefix; exports.isLoopIterationMarker = _chunk32422MOMcjs.isLoopIterationMarker; exports.loadMetadata = _chunk32422MOMcjs.loadMetadata; exports.loadStorage = _chunk32422MOMcjs.loadStorage; exports.locationToKey = _chunk32422MOMcjs.locationToKey; exports.locationsEqual = _chunk32422MOMcjs.locationsEqual; exports.parentLocation = _chunk32422MOMcjs.parentLocation; exports.registerName = _chunk32422MOMcjs.registerName; exports.replayWorkflowFromStep = _chunk32422MOMcjs.replayWorkflowFromStep; exports.resolveName = _chunk32422MOMcjs.resolveName; exports.runWorkflow = _chunk32422MOMcjs.runWorkflow; exports.setEntry = _chunk32422MOMcjs.setEntry;
|
|
328
334
|
//# sourceMappingURL=testing.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/actors/actors/rivetkit-typescript/packages/workflow-engine/dist/tsup/testing.cjs","../../src/testing.ts"],"names":[],"mappings":"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","file":"/home/runner/work/actors/actors/rivetkit-typescript/packages/workflow-engine/dist/tsup/testing.cjs","sourcesContent":[null,"import type { EngineDriver, KVEntry, KVWrite } from \"./driver.js\";\nimport { EvictedError } from \"./errors.js\";\nimport { compareKeys, keyStartsWith, keyToHex } from \"./keys.js\";\nimport type { Message, WorkflowMessageDriver } from \"./types.js\";\nimport { sleep } from \"./utils.js\";\n\ninterface Waiter {\n\tnameSet?: Set<string>;\n\tresolve: () => void;\n\treject: (error: Error) => void;\n\tabortSignal: AbortSignal;\n\tonAbort: () => void;\n}\n\nclass InMemoryWorkflowMessageDriver implements WorkflowMessageDriver {\n\t#messages: Message[] = [];\n\t#waiters = new Set<Waiter>();\n\n\tasync addMessage(message: Message): Promise<void> {\n\t\tthis.#messages.push(message);\n\t\tthis.#notifyWaiters(message.name);\n\t}\n\n\tasync receiveMessages(opts: {\n\t\tnames?: readonly string[];\n\t\tcount: number;\n\t\tcompletable: boolean;\n\t}): Promise<Message[]> {\n\t\tconst limitedCount = Math.max(1, opts.count);\n\t\tconst nameSet =\n\t\t\topts.names && opts.names.length > 0\n\t\t\t\t? new Set(opts.names)\n\t\t\t\t: undefined;\n\t\tconst selected: Array<{ message: Message; index: number }> = [];\n\n\t\tfor (\n\t\t\tlet i = 0;\n\t\t\ti < this.#messages.length && selected.length < limitedCount;\n\t\t\ti++\n\t\t) {\n\t\t\tconst message = this.#messages[i];\n\t\t\tif (nameSet && !nameSet.has(message.name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tselected.push({ message, index: i });\n\t\t}\n\n\t\tif (selected.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (!opts.completable) {\n\t\t\tfor (let i = selected.length - 1; i >= 0; i--) {\n\t\t\t\tthis.#messages.splice(selected[i].index, 1);\n\t\t\t}\n\t\t\treturn selected.map((entry) => entry.message);\n\t\t}\n\n\t\treturn selected.map((entry) => {\n\t\t\tconst { message } = entry;\n\t\t\treturn {\n\t\t\t\t...message,\n\t\t\t\tcomplete: async () => {\n\t\t\t\t\tawait this.completeMessage(message.id);\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t}\n\n\tasync completeMessage(messageId: string): Promise<void> {\n\t\tconst index = this.#messages.findIndex(\n\t\t\t(message) => message.id === messageId,\n\t\t);\n\t\tif (index !== -1) {\n\t\t\tthis.#messages.splice(index, 1);\n\t\t}\n\t}\n\n\tasync waitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tif (abortSignal.aborted) {\n\t\t\tthrow new EvictedError();\n\t\t}\n\n\t\tconst nameSet =\n\t\t\tmessageNames.length > 0 ? new Set(messageNames) : undefined;\n\t\tif (\n\t\t\tthis.#messages.some((message) =>\n\t\t\t\tnameSet ? nameSet.has(message.name) : true,\n\t\t\t)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst waiter: Waiter = {\n\t\t\t\tnameSet,\n\t\t\t\tresolve: () => {\n\t\t\t\t\tthis.#removeWaiter(waiter);\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tthis.#removeWaiter(waiter);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t\tabortSignal,\n\t\t\t\tonAbort: () => {\n\t\t\t\t\twaiter.reject(new EvictedError());\n\t\t\t\t},\n\t\t\t};\n\t\t\tabortSignal.addEventListener(\"abort\", waiter.onAbort, {\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t\tthis.#waiters.add(waiter);\n\t\t});\n\t}\n\n\t#removeWaiter(waiter: Waiter): void {\n\t\tif (this.#waiters.delete(waiter)) {\n\t\t\twaiter.abortSignal.removeEventListener(\"abort\", waiter.onAbort);\n\t\t}\n\t}\n\n\t#notifyWaiters(name: string): void {\n\t\tfor (const waiter of [...this.#waiters]) {\n\t\t\tif (waiter.nameSet && !waiter.nameSet.has(name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\twaiter.resolve();\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis.#messages = [];\n\t\tfor (const waiter of [...this.#waiters]) {\n\t\t\twaiter.reject(new Error(\"cleared\"));\n\t\t}\n\t}\n}\n\n/**\n * In-memory implementation of EngineDriver for testing.\n * Uses binary keys (Uint8Array) with hex encoding for internal Map storage.\n */\nexport class InMemoryDriver implements EngineDriver {\n\t// Map from hex-encoded key to { originalKey, value }\n\tprivate kv = new Map<string, { key: Uint8Array; value: Uint8Array }>();\n\tprivate alarms = new Map<string, number>();\n\t#inMemoryMessageDriver = new InMemoryWorkflowMessageDriver();\n\n\t/** Simulated latency per operation (ms) */\n\tlatency = 10;\n\n\t/** How often the worker polls for work */\n\tworkerPollInterval = 100;\n\tmessageDriver: WorkflowMessageDriver = this.#inMemoryMessageDriver;\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tawait sleep(this.latency);\n\t\tconst entry = this.kv.get(keyToHex(key));\n\t\treturn entry?.value ?? null;\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.kv.set(keyToHex(key), { key, value });\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.kv.delete(keyToHex(key));\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tif (keyStartsWith(entry.key, prefix)) {\n\t\t\t\tthis.kv.delete(hexKey);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tif (\n\t\t\t\tcompareKeys(entry.key, start) >= 0 &&\n\t\t\t\tcompareKeys(entry.key, end) < 0\n\t\t\t) {\n\t\t\t\tthis.kv.delete(hexKey);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\tawait sleep(this.latency);\n\t\tconst results: KVEntry[] = [];\n\t\tfor (const entry of this.kv.values()) {\n\t\t\tif (keyStartsWith(entry.key, prefix)) {\n\t\t\t\tresults.push({ key: entry.key, value: entry.value });\n\t\t\t}\n\t\t}\n\t\t// Sort by key lexicographically\n\t\treturn results.sort((a, b) => compareKeys(a.key, b.key));\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const { key, value } of writes) {\n\t\t\tthis.kv.set(keyToHex(key), { key, value });\n\t\t}\n\t}\n\n\tasync setAlarm(workflowId: string, wakeAt: number): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.alarms.set(workflowId, wakeAt);\n\t}\n\n\tasync clearAlarm(workflowId: string): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.alarms.delete(workflowId);\n\t}\n\n\tasync waitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tconst driver = this.messageDriver as WorkflowMessageDriver & {\n\t\t\twaitForMessages?: (\n\t\t\t\tmessageNames: string[],\n\t\t\t\tabortSignal: AbortSignal,\n\t\t\t) => Promise<void>;\n\t\t};\n\t\tif (driver.waitForMessages) {\n\t\t\tawait driver.waitForMessages(messageNames, abortSignal);\n\t\t\treturn;\n\t\t}\n\n\t\twhile (true) {\n\t\t\tif (abortSignal.aborted) {\n\t\t\t\tthrow new EvictedError();\n\t\t\t}\n\t\t\tconst messages = await this.messageDriver.receiveMessages({\n\t\t\t\tnames: messageNames.length > 0 ? messageNames : undefined,\n\t\t\t\tcount: 1,\n\t\t\t\tcompletable: true,\n\t\t\t});\n\t\t\tif (messages.length > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait sleep(Math.max(1, this.latency));\n\t\t}\n\t}\n\n\t/**\n\t * Get the alarm time for a workflow (for testing).\n\t */\n\tgetAlarm(workflowId: string): number | undefined {\n\t\treturn this.alarms.get(workflowId);\n\t}\n\n\t/**\n\t * Check if any alarms are due and return their workflow IDs.\n\t */\n\tgetDueAlarms(): string[] {\n\t\tconst now = Date.now();\n\t\tconst due: string[] = [];\n\t\tfor (const [workflowId, wakeAt] of this.alarms) {\n\t\t\tif (wakeAt <= now) {\n\t\t\t\tdue.push(workflowId);\n\t\t\t}\n\t\t}\n\t\treturn due;\n\t}\n\n\t/**\n\t * Clear all data (for testing).\n\t */\n\tclear(): void {\n\t\tthis.kv.clear();\n\t\tthis.alarms.clear();\n\t\tthis.#inMemoryMessageDriver.clear();\n\t}\n\n\t/**\n\t * Get a snapshot of all data (for testing/debugging).\n\t */\n\tsnapshot(): {\n\t\tkv: Record<string, Uint8Array>;\n\t\talarms: Record<string, number>;\n\t} {\n\t\tconst kvSnapshot: Record<string, Uint8Array> = {};\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tkvSnapshot[hexKey] = entry.value;\n\t\t}\n\t\treturn {\n\t\t\tkv: kvSnapshot,\n\t\t\talarms: Object.fromEntries(this.alarms),\n\t\t};\n\t}\n\n\t/**\n\t * Get all hex-encoded keys (for testing).\n\t */\n\tkeys(): string[] {\n\t\treturn [...this.kv.keys()];\n\t}\n}\n\n// Re-export main exports for convenience\nexport * from \"./index.js\";\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/actors/actors/rivetkit-typescript/packages/workflow-engine/dist/tsup/testing.cjs","../../src/testing.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACrCA,IAAM,8BAAA,EAAN,MAAqE;AAAA,EACpE,CAAA,SAAA,EAAuB,CAAC,CAAA;AAAA,EACxB,CAAA,QAAA,kBAAW,IAAI,GAAA,CAAY,CAAA;AAAA,EAE3B,MAAM,UAAA,CAAW,OAAA,EAAiC;AACjD,IAAA,IAAA,CAAK,CAAA,QAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AAC3B,IAAA,IAAA,CAAK,CAAA,aAAA,CAAe,OAAA,CAAQ,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,eAAA,CAAgB,IAAA,EAIC;AACtB,IAAA,MAAM,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA;AAC3C,IAAA,MAAM,QAAA,EACL,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,EAAA,EAC/B,IAAI,GAAA,CAAI,IAAA,CAAK,KAAK,EAAA,EAClB,KAAA,CAAA;AACJ,IAAA,MAAM,SAAA,EAAuD,CAAC,CAAA;AAE9D,IAAA,IAAA,CAAA,IACK,EAAA,EAAI,CAAA,EACR,EAAA,EAAI,IAAA,CAAK,CAAA,QAAA,CAAU,OAAA,GAAU,QAAA,CAAS,OAAA,EAAS,YAAA,EAC/C,CAAA,EAAA,EACC;AACD,MAAA,MAAM,QAAA,EAAU,IAAA,CAAK,CAAA,QAAA,CAAU,CAAC,CAAA;AAChC,MAAA,GAAA,CAAI,QAAA,GAAW,CAAC,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC1C,QAAA,QAAA;AAAA,MACD;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,IACpC;AAEA,IAAA,GAAA,CAAI,QAAA,CAAS,OAAA,IAAW,CAAA,EAAG;AAC1B,MAAA,OAAO,CAAC,CAAA;AAAA,IACT;AAEA,IAAA,GAAA,CAAI,CAAC,IAAA,CAAK,WAAA,EAAa;AACtB,MAAA,IAAA,CAAA,IAAS,EAAA,EAAI,QAAA,CAAS,OAAA,EAAS,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC9C,QAAA,IAAA,CAAK,CAAA,QAAA,CAAU,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AAAA,MAC3C;AACA,MAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,EAAA,GAAU,KAAA,CAAM,OAAO,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,EAAA,GAAU;AAC9B,MAAA,MAAM,EAAE,QAAQ,EAAA,EAAI,KAAA;AACpB,MAAA,OAAO;AAAA,QACN,GAAG,OAAA;AAAA,QACH,QAAA,EAAU,MAAA,CAAA,EAAA,GAAY;AACrB,UAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,EAAE,CAAA;AAAA,QACtC;AAAA,MACD,CAAA;AAAA,IACD,CAAC,CAAA;AAAA,EACF;AAAA,EAEA,MAAM,eAAA,CAAgB,SAAA,EAAkC;AACvD,IAAA,MAAM,MAAA,EAAQ,IAAA,CAAK,CAAA,QAAA,CAAU,SAAA;AAAA,MAC5B,CAAC,OAAA,EAAA,GAAY,OAAA,CAAQ,GAAA,IAAO;AAAA,IAC7B,CAAA;AACA,IAAA,GAAA,CAAI,MAAA,IAAU,CAAA,CAAA,EAAI;AACjB,MAAA,IAAA,CAAK,CAAA,QAAA,CAAU,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,IAC/B;AAAA,EACD;AAAA,EAEA,MAAM,eAAA,CACL,YAAA,EACA,WAAA,EACgB;AAChB,IAAA,GAAA,CAAI,WAAA,CAAY,OAAA,EAAS;AACxB,MAAA,MAAM,IAAI,mCAAA,CAAa,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,QAAA,EACL,YAAA,CAAa,OAAA,EAAS,EAAA,EAAI,IAAI,GAAA,CAAI,YAAY,EAAA,EAAI,KAAA,CAAA;AACnD,IAAA,GAAA,CACC,IAAA,CAAK,CAAA,QAAA,CAAU,IAAA;AAAA,MAAK,CAAC,OAAA,EAAA,GACpB,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,IAAI,EAAA,EAAI;AAAA,IACvC,CAAA,EACC;AACD,MAAA,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,EAAA,GAAW;AAC5C,MAAA,MAAM,OAAA,EAAiB;AAAA,QACtB,OAAA;AAAA,QACA,OAAA,EAAS,CAAA,EAAA,GAAM;AACd,UAAA,IAAA,CAAK,CAAA,YAAA,CAAc,MAAM,CAAA;AACzB,UAAA,OAAA,CAAQ,CAAA;AAAA,QACT,CAAA;AAAA,QACA,MAAA,EAAQ,CAAC,KAAA,EAAA,GAAU;AAClB,UAAA,IAAA,CAAK,CAAA,YAAA,CAAc,MAAM,CAAA;AACzB,UAAA,MAAA,CAAO,KAAK,CAAA;AAAA,QACb,CAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA,EAAS,CAAA,EAAA,GAAM;AACd,UAAA,MAAA,CAAO,MAAA,CAAO,IAAI,mCAAA,CAAa,CAAC,CAAA;AAAA,QACjC;AAAA,MACD,CAAA;AACA,MAAA,WAAA,CAAY,gBAAA,CAAiB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS;AAAA,QACrD,IAAA,EAAM;AAAA,MACP,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,CAAA,OAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACF;AAAA,EAEA,CAAA,YAAA,CAAc,MAAA,EAAsB;AACnC,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,OAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG;AACjC,MAAA,MAAA,CAAO,WAAA,CAAY,mBAAA,CAAoB,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA;AAAA,IAC/D;AAAA,EACD;AAAA,EAEA,CAAA,aAAA,CAAe,IAAA,EAAoB;AAClC,IAAA,IAAA,CAAA,MAAW,OAAA,GAAU,CAAC,GAAG,IAAA,CAAK,CAAA,OAAQ,CAAA,EAAG;AACxC,MAAA,GAAA,CAAI,MAAA,CAAO,QAAA,GAAW,CAAC,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AAChD,QAAA,QAAA;AAAA,MACD;AACA,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAA;AAAA,IAChB;AAAA,EACD;AAAA,EAEA,KAAA,CAAA,EAAc;AACb,IAAA,IAAA,CAAK,CAAA,SAAA,EAAY,CAAC,CAAA;AAClB,IAAA,IAAA,CAAA,MAAW,OAAA,GAAU,CAAC,GAAG,IAAA,CAAK,CAAA,OAAQ,CAAA,EAAG;AACxC,MAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,IACnC;AAAA,EACD;AACD,CAAA;AAMO,IAAM,eAAA,YAAN,MAA6C;AAAA;AAAA,iBAE3C,GAAA,kBAAK,IAAI,GAAA,CAAoD,EAAA;AAAA,kBAC7D,OAAA,kBAAS,IAAI,GAAA,CAAoB,EAAA;AAAA,EACzC,CAAA,sBAAA,EAAyB,IAAI,6BAAA,CAA8B,CAAA;AAAA;AAAA,kBAG3D,QAAA,EAAU,GAAA;AAAA;AAAA,kBAGV,mBAAA,EAAqB,IAAA;AAAA,kBACrB,cAAA,EAAuC,IAAA,CAAK,CAAA,sBAAA;AAAA,EAE5C,MAAM,GAAA,CAAI,GAAA,EAA6C;AACtD,IAAA,MAAM,qCAAA,IAAM,CAAK,OAAO,CAAA;AACxB,IAAA,MAAM,MAAA,EAAQ,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,wCAAA,GAAY,CAAC,CAAA;AACvC,IAAA,wBAAA,CAAO,MAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,KAAA,CAAO,KAAA,CAAA,UAAS,MAAA;AAAA,EACxB;AAAA,EAEA,MAAM,GAAA,CAAI,GAAA,EAAiB,KAAA,EAAkC;AAC5D,IAAA,MAAM,qCAAA,IAAM,CAAK,OAAO,CAAA;AACxB,IAAA,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,wCAAA,GAAY,CAAA,EAAG,EAAE,GAAA,EAAK,MAAM,CAAC,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,MAAA,CAAO,GAAA,EAAgC;AAC5C,IAAA,MAAM,qCAAA,IAAM,CAAK,OAAO,CAAA;AACxB,IAAA,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,wCAAA,GAAY,CAAC,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,WAAA,CAAY,IAAA,EAAmC;AACpD,IAAA,MAAM,qCAAA,IAAM,CAAK,OAAO,CAAA;AACxB,IAAA,IAAA,CAAA,MAAW,IAAA,GAAO,IAAA,EAAM;AACvB,MAAA,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,wCAAA,GAAY,CAAC,CAAA;AAAA,IAC7B;AAAA,EACD;AAAA,EAEA,MAAM,YAAA,CAAa,MAAA,EAAmC;AACrD,IAAA,MAAM,qCAAA,IAAM,CAAK,OAAO,CAAA;AACxB,IAAA,IAAA,CAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,EAAA,GAAK,IAAA,CAAK,EAAA,EAAI;AACtC,MAAA,GAAA,CAAI,6CAAA,KAAc,CAAM,GAAA,EAAK,MAAM,CAAA,EAAG;AACrC,QAAA,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,MAAM,CAAA;AAAA,MACtB;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,WAAA,CAAY,KAAA,EAAmB,GAAA,EAAgC;AACpE,IAAA,MAAM,qCAAA,IAAM,CAAK,OAAO,CAAA;AACxB,IAAA,IAAA,CAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,EAAA,GAAK,IAAA,CAAK,EAAA,EAAI;AACtC,MAAA,GAAA,CACC,2CAAA,KAAY,CAAM,GAAA,EAAK,KAAK,EAAA,GAAK,EAAA,GACjC,2CAAA,KAAY,CAAM,GAAA,EAAK,GAAG,EAAA,EAAI,CAAA,EAC7B;AACD,QAAA,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,MAAM,CAAA;AAAA,MACtB;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,IAAA,CAAK,MAAA,EAAwC;AAClD,IAAA,MAAM,qCAAA,IAAM,CAAK,OAAO,CAAA;AACxB,IAAA,MAAM,QAAA,EAAqB,CAAC,CAAA;AAC5B,IAAA,IAAA,CAAA,MAAW,MAAA,GAAS,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,CAAA,EAAG;AACrC,MAAA,GAAA,CAAI,6CAAA,KAAc,CAAM,GAAA,EAAK,MAAM,CAAA,EAAG;AACrC,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,MACpD;AAAA,IACD;AAEA,IAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,EAAA,GAAM,2CAAA,CAAY,CAAE,GAAA,EAAK,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,EACxD;AAAA,EAEA,MAAM,KAAA,CAAM,MAAA,EAAkC;AAC7C,IAAA,MAAM,qCAAA,IAAM,CAAK,OAAO,CAAA;AACxB,IAAA,IAAA,CAAA,MAAW,EAAE,GAAA,EAAK,MAAM,EAAA,GAAK,MAAA,EAAQ;AACpC,MAAA,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,wCAAA,GAAY,CAAA,EAAG,EAAE,GAAA,EAAK,MAAM,CAAC,CAAA;AAAA,IAC1C;AAAA,EACD;AAAA,EAEA,MAAM,QAAA,CAAS,UAAA,EAAoB,MAAA,EAA+B;AACjE,IAAA,MAAM,qCAAA,IAAM,CAAK,OAAO,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,MAAM,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,UAAA,CAAW,UAAA,EAAmC;AACnD,IAAA,MAAM,qCAAA,IAAM,CAAK,OAAO,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,eAAA,CACL,YAAA,EACA,WAAA,EACgB;AAChB,IAAA,MAAM,OAAA,EAAS,IAAA,CAAK,aAAA;AAMpB,IAAA,GAAA,CAAI,MAAA,CAAO,eAAA,EAAiB;AAC3B,MAAA,MAAM,MAAA,CAAO,eAAA,CAAgB,YAAA,EAAc,WAAW,CAAA;AACtD,MAAA,MAAA;AAAA,IACD;AAEA,IAAA,MAAA,CAAO,IAAA,EAAM;AACZ,MAAA,GAAA,CAAI,WAAA,CAAY,OAAA,EAAS;AACxB,QAAA,MAAM,IAAI,mCAAA,CAAa,CAAA;AAAA,MACxB;AACA,MAAA,MAAM,SAAA,EAAW,MAAM,IAAA,CAAK,aAAA,CAAc,eAAA,CAAgB;AAAA,QACzD,KAAA,EAAO,YAAA,CAAa,OAAA,EAAS,EAAA,EAAI,aAAA,EAAe,KAAA,CAAA;AAAA,QAChD,KAAA,EAAO,CAAA;AAAA,QACP,WAAA,EAAa;AAAA,MACd,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,CAAA,EAAG;AACxB,QAAA,MAAA;AAAA,MACD;AACA,MAAA,MAAM,qCAAA,IAAM,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IACtC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CAAS,UAAA,EAAwC;AAChD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAA,EAAyB;AACxB,IAAA,MAAM,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAA;AACrB,IAAA,MAAM,IAAA,EAAgB,CAAC,CAAA;AACvB,IAAA,IAAA,CAAA,MAAW,CAAC,UAAA,EAAY,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,EAAQ;AAC/C,MAAA,GAAA,CAAI,OAAA,GAAU,GAAA,EAAK;AAClB,QAAA,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AAAA,MACpB;AAAA,IACD;AACA,IAAA,OAAO,GAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAA,EAAc;AACb,IAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,CAAA;AACd,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA;AAClB,IAAA,IAAA,CAAK,CAAA,qBAAA,CAAuB,KAAA,CAAM,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CAAA,EAGE;AACD,IAAA,MAAM,WAAA,EAAyC,CAAC,CAAA;AAChD,IAAA,IAAA,CAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,EAAA,GAAK,IAAA,CAAK,EAAA,EAAI;AACtC,MAAA,UAAA,CAAW,MAAM,EAAA,EAAI,KAAA,CAAM,KAAA;AAAA,IAC5B;AACA,IAAA,OAAO;AAAA,MACN,EAAA,EAAI,UAAA;AAAA,MACJ,MAAA,EAAQ,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,MAAM;AAAA,IACvC,CAAA;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAA,EAAiB;AAChB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAAA,EAC1B;AACD,UAAA;AD9BA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,8rFAAC","file":"/home/runner/work/actors/actors/rivetkit-typescript/packages/workflow-engine/dist/tsup/testing.cjs","sourcesContent":[null,"import type { EngineDriver, KVEntry, KVWrite } from \"./driver.js\";\nimport { EvictedError } from \"./errors.js\";\nimport { compareKeys, keyStartsWith, keyToHex } from \"./keys.js\";\nimport type { Message, WorkflowMessageDriver } from \"./types.js\";\nimport { sleep } from \"./utils.js\";\n\ninterface Waiter {\n\tnameSet?: Set<string>;\n\tresolve: () => void;\n\treject: (error: Error) => void;\n\tabortSignal: AbortSignal;\n\tonAbort: () => void;\n}\n\nclass InMemoryWorkflowMessageDriver implements WorkflowMessageDriver {\n\t#messages: Message[] = [];\n\t#waiters = new Set<Waiter>();\n\n\tasync addMessage(message: Message): Promise<void> {\n\t\tthis.#messages.push(message);\n\t\tthis.#notifyWaiters(message.name);\n\t}\n\n\tasync receiveMessages(opts: {\n\t\tnames?: readonly string[];\n\t\tcount: number;\n\t\tcompletable: boolean;\n\t}): Promise<Message[]> {\n\t\tconst limitedCount = Math.max(1, opts.count);\n\t\tconst nameSet =\n\t\t\topts.names && opts.names.length > 0\n\t\t\t\t? new Set(opts.names)\n\t\t\t\t: undefined;\n\t\tconst selected: Array<{ message: Message; index: number }> = [];\n\n\t\tfor (\n\t\t\tlet i = 0;\n\t\t\ti < this.#messages.length && selected.length < limitedCount;\n\t\t\ti++\n\t\t) {\n\t\t\tconst message = this.#messages[i];\n\t\t\tif (nameSet && !nameSet.has(message.name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tselected.push({ message, index: i });\n\t\t}\n\n\t\tif (selected.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (!opts.completable) {\n\t\t\tfor (let i = selected.length - 1; i >= 0; i--) {\n\t\t\t\tthis.#messages.splice(selected[i].index, 1);\n\t\t\t}\n\t\t\treturn selected.map((entry) => entry.message);\n\t\t}\n\n\t\treturn selected.map((entry) => {\n\t\t\tconst { message } = entry;\n\t\t\treturn {\n\t\t\t\t...message,\n\t\t\t\tcomplete: async () => {\n\t\t\t\t\tawait this.completeMessage(message.id);\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t}\n\n\tasync completeMessage(messageId: string): Promise<void> {\n\t\tconst index = this.#messages.findIndex(\n\t\t\t(message) => message.id === messageId,\n\t\t);\n\t\tif (index !== -1) {\n\t\t\tthis.#messages.splice(index, 1);\n\t\t}\n\t}\n\n\tasync waitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tif (abortSignal.aborted) {\n\t\t\tthrow new EvictedError();\n\t\t}\n\n\t\tconst nameSet =\n\t\t\tmessageNames.length > 0 ? new Set(messageNames) : undefined;\n\t\tif (\n\t\t\tthis.#messages.some((message) =>\n\t\t\t\tnameSet ? nameSet.has(message.name) : true,\n\t\t\t)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst waiter: Waiter = {\n\t\t\t\tnameSet,\n\t\t\t\tresolve: () => {\n\t\t\t\t\tthis.#removeWaiter(waiter);\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tthis.#removeWaiter(waiter);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t\tabortSignal,\n\t\t\t\tonAbort: () => {\n\t\t\t\t\twaiter.reject(new EvictedError());\n\t\t\t\t},\n\t\t\t};\n\t\t\tabortSignal.addEventListener(\"abort\", waiter.onAbort, {\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t\tthis.#waiters.add(waiter);\n\t\t});\n\t}\n\n\t#removeWaiter(waiter: Waiter): void {\n\t\tif (this.#waiters.delete(waiter)) {\n\t\t\twaiter.abortSignal.removeEventListener(\"abort\", waiter.onAbort);\n\t\t}\n\t}\n\n\t#notifyWaiters(name: string): void {\n\t\tfor (const waiter of [...this.#waiters]) {\n\t\t\tif (waiter.nameSet && !waiter.nameSet.has(name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\twaiter.resolve();\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis.#messages = [];\n\t\tfor (const waiter of [...this.#waiters]) {\n\t\t\twaiter.reject(new Error(\"cleared\"));\n\t\t}\n\t}\n}\n\n/**\n * In-memory implementation of EngineDriver for testing.\n * Uses binary keys (Uint8Array) with hex encoding for internal Map storage.\n */\nexport class InMemoryDriver implements EngineDriver {\n\t// Map from hex-encoded key to { originalKey, value }\n\tprivate kv = new Map<string, { key: Uint8Array; value: Uint8Array }>();\n\tprivate alarms = new Map<string, number>();\n\t#inMemoryMessageDriver = new InMemoryWorkflowMessageDriver();\n\n\t/** Simulated latency per operation (ms) */\n\tlatency = 10;\n\n\t/** How often the worker polls for work */\n\tworkerPollInterval = 100;\n\tmessageDriver: WorkflowMessageDriver = this.#inMemoryMessageDriver;\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tawait sleep(this.latency);\n\t\tconst entry = this.kv.get(keyToHex(key));\n\t\treturn entry?.value ?? null;\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.kv.set(keyToHex(key), { key, value });\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.kv.delete(keyToHex(key));\n\t}\n\n\tasync batchDelete(keys: Uint8Array[]): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const key of keys) {\n\t\t\tthis.kv.delete(keyToHex(key));\n\t\t}\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tif (keyStartsWith(entry.key, prefix)) {\n\t\t\t\tthis.kv.delete(hexKey);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tif (\n\t\t\t\tcompareKeys(entry.key, start) >= 0 &&\n\t\t\t\tcompareKeys(entry.key, end) < 0\n\t\t\t) {\n\t\t\t\tthis.kv.delete(hexKey);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\tawait sleep(this.latency);\n\t\tconst results: KVEntry[] = [];\n\t\tfor (const entry of this.kv.values()) {\n\t\t\tif (keyStartsWith(entry.key, prefix)) {\n\t\t\t\tresults.push({ key: entry.key, value: entry.value });\n\t\t\t}\n\t\t}\n\t\t// Sort by key lexicographically\n\t\treturn results.sort((a, b) => compareKeys(a.key, b.key));\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const { key, value } of writes) {\n\t\t\tthis.kv.set(keyToHex(key), { key, value });\n\t\t}\n\t}\n\n\tasync setAlarm(workflowId: string, wakeAt: number): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.alarms.set(workflowId, wakeAt);\n\t}\n\n\tasync clearAlarm(workflowId: string): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.alarms.delete(workflowId);\n\t}\n\n\tasync waitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tconst driver = this.messageDriver as WorkflowMessageDriver & {\n\t\t\twaitForMessages?: (\n\t\t\t\tmessageNames: string[],\n\t\t\t\tabortSignal: AbortSignal,\n\t\t\t) => Promise<void>;\n\t\t};\n\t\tif (driver.waitForMessages) {\n\t\t\tawait driver.waitForMessages(messageNames, abortSignal);\n\t\t\treturn;\n\t\t}\n\n\t\twhile (true) {\n\t\t\tif (abortSignal.aborted) {\n\t\t\t\tthrow new EvictedError();\n\t\t\t}\n\t\t\tconst messages = await this.messageDriver.receiveMessages({\n\t\t\t\tnames: messageNames.length > 0 ? messageNames : undefined,\n\t\t\t\tcount: 1,\n\t\t\t\tcompletable: true,\n\t\t\t});\n\t\t\tif (messages.length > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait sleep(Math.max(1, this.latency));\n\t\t}\n\t}\n\n\t/**\n\t * Get the alarm time for a workflow (for testing).\n\t */\n\tgetAlarm(workflowId: string): number | undefined {\n\t\treturn this.alarms.get(workflowId);\n\t}\n\n\t/**\n\t * Check if any alarms are due and return their workflow IDs.\n\t */\n\tgetDueAlarms(): string[] {\n\t\tconst now = Date.now();\n\t\tconst due: string[] = [];\n\t\tfor (const [workflowId, wakeAt] of this.alarms) {\n\t\t\tif (wakeAt <= now) {\n\t\t\t\tdue.push(workflowId);\n\t\t\t}\n\t\t}\n\t\treturn due;\n\t}\n\n\t/**\n\t * Clear all data (for testing).\n\t */\n\tclear(): void {\n\t\tthis.kv.clear();\n\t\tthis.alarms.clear();\n\t\tthis.#inMemoryMessageDriver.clear();\n\t}\n\n\t/**\n\t * Get a snapshot of all data (for testing/debugging).\n\t */\n\tsnapshot(): {\n\t\tkv: Record<string, Uint8Array>;\n\t\talarms: Record<string, number>;\n\t} {\n\t\tconst kvSnapshot: Record<string, Uint8Array> = {};\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tkvSnapshot[hexKey] = entry.value;\n\t\t}\n\t\treturn {\n\t\t\tkv: kvSnapshot,\n\t\t\talarms: Object.fromEntries(this.alarms),\n\t\t};\n\t}\n\n\t/**\n\t * Get all hex-encoded keys (for testing).\n\t */\n\tkeys(): string[] {\n\t\treturn [...this.kv.keys()];\n\t}\n}\n\n// Re-export main exports for convenience\nexport * from \"./index.js\";\n"]}
|
package/dist/tsup/testing.d.cts
CHANGED
|
@@ -18,6 +18,7 @@ declare class InMemoryDriver implements EngineDriver {
|
|
|
18
18
|
get(key: Uint8Array): Promise<Uint8Array | null>;
|
|
19
19
|
set(key: Uint8Array, value: Uint8Array): Promise<void>;
|
|
20
20
|
delete(key: Uint8Array): Promise<void>;
|
|
21
|
+
batchDelete(keys: Uint8Array[]): Promise<void>;
|
|
21
22
|
deletePrefix(prefix: Uint8Array): Promise<void>;
|
|
22
23
|
deleteRange(start: Uint8Array, end: Uint8Array): Promise<void>;
|
|
23
24
|
list(prefix: Uint8Array): Promise<KVEntry[]>;
|
package/dist/tsup/testing.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ declare class InMemoryDriver implements EngineDriver {
|
|
|
18
18
|
get(key: Uint8Array): Promise<Uint8Array | null>;
|
|
19
19
|
set(key: Uint8Array, value: Uint8Array): Promise<void>;
|
|
20
20
|
delete(key: Uint8Array): Promise<void>;
|
|
21
|
+
batchDelete(keys: Uint8Array[]): Promise<void>;
|
|
21
22
|
deletePrefix(prefix: Uint8Array): Promise<void>;
|
|
22
23
|
deleteRange(start: Uint8Array, end: Uint8Array): Promise<void>;
|
|
23
24
|
list(prefix: Uint8Array): Promise<KVEntry[]>;
|
package/dist/tsup/testing.js
CHANGED
|
@@ -47,7 +47,7 @@ import {
|
|
|
47
47
|
runWorkflow,
|
|
48
48
|
setEntry,
|
|
49
49
|
sleep
|
|
50
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-TVRZA5O5.js";
|
|
51
51
|
|
|
52
52
|
// src/testing.ts
|
|
53
53
|
var InMemoryWorkflowMessageDriver = class {
|
|
@@ -170,6 +170,12 @@ var InMemoryDriver = class {
|
|
|
170
170
|
await sleep(this.latency);
|
|
171
171
|
this.kv.delete(keyToHex(key));
|
|
172
172
|
}
|
|
173
|
+
async batchDelete(keys) {
|
|
174
|
+
await sleep(this.latency);
|
|
175
|
+
for (const key of keys) {
|
|
176
|
+
this.kv.delete(keyToHex(key));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
173
179
|
async deletePrefix(prefix) {
|
|
174
180
|
await sleep(this.latency);
|
|
175
181
|
for (const [hexKey, entry] of this.kv) {
|
package/dist/tsup/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/testing.ts"],"sourcesContent":["import type { EngineDriver, KVEntry, KVWrite } from \"./driver.js\";\nimport { EvictedError } from \"./errors.js\";\nimport { compareKeys, keyStartsWith, keyToHex } from \"./keys.js\";\nimport type { Message, WorkflowMessageDriver } from \"./types.js\";\nimport { sleep } from \"./utils.js\";\n\ninterface Waiter {\n\tnameSet?: Set<string>;\n\tresolve: () => void;\n\treject: (error: Error) => void;\n\tabortSignal: AbortSignal;\n\tonAbort: () => void;\n}\n\nclass InMemoryWorkflowMessageDriver implements WorkflowMessageDriver {\n\t#messages: Message[] = [];\n\t#waiters = new Set<Waiter>();\n\n\tasync addMessage(message: Message): Promise<void> {\n\t\tthis.#messages.push(message);\n\t\tthis.#notifyWaiters(message.name);\n\t}\n\n\tasync receiveMessages(opts: {\n\t\tnames?: readonly string[];\n\t\tcount: number;\n\t\tcompletable: boolean;\n\t}): Promise<Message[]> {\n\t\tconst limitedCount = Math.max(1, opts.count);\n\t\tconst nameSet =\n\t\t\topts.names && opts.names.length > 0\n\t\t\t\t? new Set(opts.names)\n\t\t\t\t: undefined;\n\t\tconst selected: Array<{ message: Message; index: number }> = [];\n\n\t\tfor (\n\t\t\tlet i = 0;\n\t\t\ti < this.#messages.length && selected.length < limitedCount;\n\t\t\ti++\n\t\t) {\n\t\t\tconst message = this.#messages[i];\n\t\t\tif (nameSet && !nameSet.has(message.name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tselected.push({ message, index: i });\n\t\t}\n\n\t\tif (selected.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (!opts.completable) {\n\t\t\tfor (let i = selected.length - 1; i >= 0; i--) {\n\t\t\t\tthis.#messages.splice(selected[i].index, 1);\n\t\t\t}\n\t\t\treturn selected.map((entry) => entry.message);\n\t\t}\n\n\t\treturn selected.map((entry) => {\n\t\t\tconst { message } = entry;\n\t\t\treturn {\n\t\t\t\t...message,\n\t\t\t\tcomplete: async () => {\n\t\t\t\t\tawait this.completeMessage(message.id);\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t}\n\n\tasync completeMessage(messageId: string): Promise<void> {\n\t\tconst index = this.#messages.findIndex(\n\t\t\t(message) => message.id === messageId,\n\t\t);\n\t\tif (index !== -1) {\n\t\t\tthis.#messages.splice(index, 1);\n\t\t}\n\t}\n\n\tasync waitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tif (abortSignal.aborted) {\n\t\t\tthrow new EvictedError();\n\t\t}\n\n\t\tconst nameSet =\n\t\t\tmessageNames.length > 0 ? new Set(messageNames) : undefined;\n\t\tif (\n\t\t\tthis.#messages.some((message) =>\n\t\t\t\tnameSet ? nameSet.has(message.name) : true,\n\t\t\t)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst waiter: Waiter = {\n\t\t\t\tnameSet,\n\t\t\t\tresolve: () => {\n\t\t\t\t\tthis.#removeWaiter(waiter);\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tthis.#removeWaiter(waiter);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t\tabortSignal,\n\t\t\t\tonAbort: () => {\n\t\t\t\t\twaiter.reject(new EvictedError());\n\t\t\t\t},\n\t\t\t};\n\t\t\tabortSignal.addEventListener(\"abort\", waiter.onAbort, {\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t\tthis.#waiters.add(waiter);\n\t\t});\n\t}\n\n\t#removeWaiter(waiter: Waiter): void {\n\t\tif (this.#waiters.delete(waiter)) {\n\t\t\twaiter.abortSignal.removeEventListener(\"abort\", waiter.onAbort);\n\t\t}\n\t}\n\n\t#notifyWaiters(name: string): void {\n\t\tfor (const waiter of [...this.#waiters]) {\n\t\t\tif (waiter.nameSet && !waiter.nameSet.has(name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\twaiter.resolve();\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis.#messages = [];\n\t\tfor (const waiter of [...this.#waiters]) {\n\t\t\twaiter.reject(new Error(\"cleared\"));\n\t\t}\n\t}\n}\n\n/**\n * In-memory implementation of EngineDriver for testing.\n * Uses binary keys (Uint8Array) with hex encoding for internal Map storage.\n */\nexport class InMemoryDriver implements EngineDriver {\n\t// Map from hex-encoded key to { originalKey, value }\n\tprivate kv = new Map<string, { key: Uint8Array; value: Uint8Array }>();\n\tprivate alarms = new Map<string, number>();\n\t#inMemoryMessageDriver = new InMemoryWorkflowMessageDriver();\n\n\t/** Simulated latency per operation (ms) */\n\tlatency = 10;\n\n\t/** How often the worker polls for work */\n\tworkerPollInterval = 100;\n\tmessageDriver: WorkflowMessageDriver = this.#inMemoryMessageDriver;\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tawait sleep(this.latency);\n\t\tconst entry = this.kv.get(keyToHex(key));\n\t\treturn entry?.value ?? null;\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.kv.set(keyToHex(key), { key, value });\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.kv.delete(keyToHex(key));\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tif (keyStartsWith(entry.key, prefix)) {\n\t\t\t\tthis.kv.delete(hexKey);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tif (\n\t\t\t\tcompareKeys(entry.key, start) >= 0 &&\n\t\t\t\tcompareKeys(entry.key, end) < 0\n\t\t\t) {\n\t\t\t\tthis.kv.delete(hexKey);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\tawait sleep(this.latency);\n\t\tconst results: KVEntry[] = [];\n\t\tfor (const entry of this.kv.values()) {\n\t\t\tif (keyStartsWith(entry.key, prefix)) {\n\t\t\t\tresults.push({ key: entry.key, value: entry.value });\n\t\t\t}\n\t\t}\n\t\t// Sort by key lexicographically\n\t\treturn results.sort((a, b) => compareKeys(a.key, b.key));\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const { key, value } of writes) {\n\t\t\tthis.kv.set(keyToHex(key), { key, value });\n\t\t}\n\t}\n\n\tasync setAlarm(workflowId: string, wakeAt: number): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.alarms.set(workflowId, wakeAt);\n\t}\n\n\tasync clearAlarm(workflowId: string): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.alarms.delete(workflowId);\n\t}\n\n\tasync waitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tconst driver = this.messageDriver as WorkflowMessageDriver & {\n\t\t\twaitForMessages?: (\n\t\t\t\tmessageNames: string[],\n\t\t\t\tabortSignal: AbortSignal,\n\t\t\t) => Promise<void>;\n\t\t};\n\t\tif (driver.waitForMessages) {\n\t\t\tawait driver.waitForMessages(messageNames, abortSignal);\n\t\t\treturn;\n\t\t}\n\n\t\twhile (true) {\n\t\t\tif (abortSignal.aborted) {\n\t\t\t\tthrow new EvictedError();\n\t\t\t}\n\t\t\tconst messages = await this.messageDriver.receiveMessages({\n\t\t\t\tnames: messageNames.length > 0 ? messageNames : undefined,\n\t\t\t\tcount: 1,\n\t\t\t\tcompletable: true,\n\t\t\t});\n\t\t\tif (messages.length > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait sleep(Math.max(1, this.latency));\n\t\t}\n\t}\n\n\t/**\n\t * Get the alarm time for a workflow (for testing).\n\t */\n\tgetAlarm(workflowId: string): number | undefined {\n\t\treturn this.alarms.get(workflowId);\n\t}\n\n\t/**\n\t * Check if any alarms are due and return their workflow IDs.\n\t */\n\tgetDueAlarms(): string[] {\n\t\tconst now = Date.now();\n\t\tconst due: string[] = [];\n\t\tfor (const [workflowId, wakeAt] of this.alarms) {\n\t\t\tif (wakeAt <= now) {\n\t\t\t\tdue.push(workflowId);\n\t\t\t}\n\t\t}\n\t\treturn due;\n\t}\n\n\t/**\n\t * Clear all data (for testing).\n\t */\n\tclear(): void {\n\t\tthis.kv.clear();\n\t\tthis.alarms.clear();\n\t\tthis.#inMemoryMessageDriver.clear();\n\t}\n\n\t/**\n\t * Get a snapshot of all data (for testing/debugging).\n\t */\n\tsnapshot(): {\n\t\tkv: Record<string, Uint8Array>;\n\t\talarms: Record<string, number>;\n\t} {\n\t\tconst kvSnapshot: Record<string, Uint8Array> = {};\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tkvSnapshot[hexKey] = entry.value;\n\t\t}\n\t\treturn {\n\t\t\tkv: kvSnapshot,\n\t\t\talarms: Object.fromEntries(this.alarms),\n\t\t};\n\t}\n\n\t/**\n\t * Get all hex-encoded keys (for testing).\n\t */\n\tkeys(): string[] {\n\t\treturn [...this.kv.keys()];\n\t}\n}\n\n// Re-export main exports for convenience\nexport * from \"./index.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,IAAM,gCAAN,MAAqE;AAAA,EACpE,YAAuB,CAAC;AAAA,EACxB,WAAW,oBAAI,IAAY;AAAA,EAE3B,MAAM,WAAW,SAAiC;AACjD,SAAK,UAAU,KAAK,OAAO;AAC3B,SAAK,eAAe,QAAQ,IAAI;AAAA,EACjC;AAAA,EAEA,MAAM,gBAAgB,MAIC;AACtB,UAAM,eAAe,KAAK,IAAI,GAAG,KAAK,KAAK;AAC3C,UAAM,UACL,KAAK,SAAS,KAAK,MAAM,SAAS,IAC/B,IAAI,IAAI,KAAK,KAAK,IAClB;AACJ,UAAM,WAAuD,CAAC;AAE9D,aACK,IAAI,GACR,IAAI,KAAK,UAAU,UAAU,SAAS,SAAS,cAC/C,KACC;AACD,YAAM,UAAU,KAAK,UAAU,CAAC;AAChC,UAAI,WAAW,CAAC,QAAQ,IAAI,QAAQ,IAAI,GAAG;AAC1C;AAAA,MACD;AACA,eAAS,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;AAAA,IACpC;AAEA,QAAI,SAAS,WAAW,GAAG;AAC1B,aAAO,CAAC;AAAA,IACT;AAEA,QAAI,CAAC,KAAK,aAAa;AACtB,eAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC9C,aAAK,UAAU,OAAO,SAAS,CAAC,EAAE,OAAO,CAAC;AAAA,MAC3C;AACA,aAAO,SAAS,IAAI,CAAC,UAAU,MAAM,OAAO;AAAA,IAC7C;AAEA,WAAO,SAAS,IAAI,CAAC,UAAU;AAC9B,YAAM,EAAE,QAAQ,IAAI;AACpB,aAAO;AAAA,QACN,GAAG;AAAA,QACH,UAAU,YAAY;AACrB,gBAAM,KAAK,gBAAgB,QAAQ,EAAE;AAAA,QACtC;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,WAAkC;AACvD,UAAM,QAAQ,KAAK,UAAU;AAAA,MAC5B,CAAC,YAAY,QAAQ,OAAO;AAAA,IAC7B;AACA,QAAI,UAAU,IAAI;AACjB,WAAK,UAAU,OAAO,OAAO,CAAC;AAAA,IAC/B;AAAA,EACD;AAAA,EAEA,MAAM,gBACL,cACA,aACgB;AAChB,QAAI,YAAY,SAAS;AACxB,YAAM,IAAI,aAAa;AAAA,IACxB;AAEA,UAAM,UACL,aAAa,SAAS,IAAI,IAAI,IAAI,YAAY,IAAI;AACnD,QACC,KAAK,UAAU;AAAA,MAAK,CAAC,YACpB,UAAU,QAAQ,IAAI,QAAQ,IAAI,IAAI;AAAA,IACvC,GACC;AACD;AAAA,IACD;AAEA,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,YAAM,SAAiB;AAAA,QACtB;AAAA,QACA,SAAS,MAAM;AACd,eAAK,cAAc,MAAM;AACzB,kBAAQ;AAAA,QACT;AAAA,QACA,QAAQ,CAAC,UAAU;AAClB,eAAK,cAAc,MAAM;AACzB,iBAAO,KAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA,SAAS,MAAM;AACd,iBAAO,OAAO,IAAI,aAAa,CAAC;AAAA,QACjC;AAAA,MACD;AACA,kBAAY,iBAAiB,SAAS,OAAO,SAAS;AAAA,QACrD,MAAM;AAAA,MACP,CAAC;AACD,WAAK,SAAS,IAAI,MAAM;AAAA,IACzB,CAAC;AAAA,EACF;AAAA,EAEA,cAAc,QAAsB;AACnC,QAAI,KAAK,SAAS,OAAO,MAAM,GAAG;AACjC,aAAO,YAAY,oBAAoB,SAAS,OAAO,OAAO;AAAA,IAC/D;AAAA,EACD;AAAA,EAEA,eAAe,MAAoB;AAClC,eAAW,UAAU,CAAC,GAAG,KAAK,QAAQ,GAAG;AACxC,UAAI,OAAO,WAAW,CAAC,OAAO,QAAQ,IAAI,IAAI,GAAG;AAChD;AAAA,MACD;AACA,aAAO,QAAQ;AAAA,IAChB;AAAA,EACD;AAAA,EAEA,QAAc;AACb,SAAK,YAAY,CAAC;AAClB,eAAW,UAAU,CAAC,GAAG,KAAK,QAAQ,GAAG;AACxC,aAAO,OAAO,IAAI,MAAM,SAAS,CAAC;AAAA,IACnC;AAAA,EACD;AACD;AAMO,IAAM,iBAAN,MAA6C;AAAA;AAAA,EAE3C,KAAK,oBAAI,IAAoD;AAAA,EAC7D,SAAS,oBAAI,IAAoB;AAAA,EACzC,yBAAyB,IAAI,8BAA8B;AAAA;AAAA,EAG3D,UAAU;AAAA;AAAA,EAGV,qBAAqB;AAAA,EACrB,gBAAuC,KAAK;AAAA,EAE5C,MAAM,IAAI,KAA6C;AACtD,UAAM,MAAM,KAAK,OAAO;AACxB,UAAM,QAAQ,KAAK,GAAG,IAAI,SAAS,GAAG,CAAC;AACvC,YAAO,+BAAO,UAAS;AAAA,EACxB;AAAA,EAEA,MAAM,IAAI,KAAiB,OAAkC;AAC5D,UAAM,MAAM,KAAK,OAAO;AACxB,SAAK,GAAG,IAAI,SAAS,GAAG,GAAG,EAAE,KAAK,MAAM,CAAC;AAAA,EAC1C;AAAA,EAEA,MAAM,OAAO,KAAgC;AAC5C,UAAM,MAAM,KAAK,OAAO;AACxB,SAAK,GAAG,OAAO,SAAS,GAAG,CAAC;AAAA,EAC7B;AAAA,EAEA,MAAM,aAAa,QAAmC;AACrD,UAAM,MAAM,KAAK,OAAO;AACxB,eAAW,CAAC,QAAQ,KAAK,KAAK,KAAK,IAAI;AACtC,UAAI,cAAc,MAAM,KAAK,MAAM,GAAG;AACrC,aAAK,GAAG,OAAO,MAAM;AAAA,MACtB;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,YAAY,OAAmB,KAAgC;AACpE,UAAM,MAAM,KAAK,OAAO;AACxB,eAAW,CAAC,QAAQ,KAAK,KAAK,KAAK,IAAI;AACtC,UACC,YAAY,MAAM,KAAK,KAAK,KAAK,KACjC,YAAY,MAAM,KAAK,GAAG,IAAI,GAC7B;AACD,aAAK,GAAG,OAAO,MAAM;AAAA,MACtB;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,KAAK,QAAwC;AAClD,UAAM,MAAM,KAAK,OAAO;AACxB,UAAM,UAAqB,CAAC;AAC5B,eAAW,SAAS,KAAK,GAAG,OAAO,GAAG;AACrC,UAAI,cAAc,MAAM,KAAK,MAAM,GAAG;AACrC,gBAAQ,KAAK,EAAE,KAAK,MAAM,KAAK,OAAO,MAAM,MAAM,CAAC;AAAA,MACpD;AAAA,IACD;AAEA,WAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC;AAAA,EACxD;AAAA,EAEA,MAAM,MAAM,QAAkC;AAC7C,UAAM,MAAM,KAAK,OAAO;AACxB,eAAW,EAAE,KAAK,MAAM,KAAK,QAAQ;AACpC,WAAK,GAAG,IAAI,SAAS,GAAG,GAAG,EAAE,KAAK,MAAM,CAAC;AAAA,IAC1C;AAAA,EACD;AAAA,EAEA,MAAM,SAAS,YAAoB,QAA+B;AACjE,UAAM,MAAM,KAAK,OAAO;AACxB,SAAK,OAAO,IAAI,YAAY,MAAM;AAAA,EACnC;AAAA,EAEA,MAAM,WAAW,YAAmC;AACnD,UAAM,MAAM,KAAK,OAAO;AACxB,SAAK,OAAO,OAAO,UAAU;AAAA,EAC9B;AAAA,EAEA,MAAM,gBACL,cACA,aACgB;AAChB,UAAM,SAAS,KAAK;AAMpB,QAAI,OAAO,iBAAiB;AAC3B,YAAM,OAAO,gBAAgB,cAAc,WAAW;AACtD;AAAA,IACD;AAEA,WAAO,MAAM;AACZ,UAAI,YAAY,SAAS;AACxB,cAAM,IAAI,aAAa;AAAA,MACxB;AACA,YAAM,WAAW,MAAM,KAAK,cAAc,gBAAgB;AAAA,QACzD,OAAO,aAAa,SAAS,IAAI,eAAe;AAAA,QAChD,OAAO;AAAA,QACP,aAAa;AAAA,MACd,CAAC;AACD,UAAI,SAAS,SAAS,GAAG;AACxB;AAAA,MACD;AACA,YAAM,MAAM,KAAK,IAAI,GAAG,KAAK,OAAO,CAAC;AAAA,IACtC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,YAAwC;AAChD,WAAO,KAAK,OAAO,IAAI,UAAU;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAyB;AACxB,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,MAAgB,CAAC;AACvB,eAAW,CAAC,YAAY,MAAM,KAAK,KAAK,QAAQ;AAC/C,UAAI,UAAU,KAAK;AAClB,YAAI,KAAK,UAAU;AAAA,MACpB;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACb,SAAK,GAAG,MAAM;AACd,SAAK,OAAO,MAAM;AAClB,SAAK,uBAAuB,MAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,WAGE;AACD,UAAM,aAAyC,CAAC;AAChD,eAAW,CAAC,QAAQ,KAAK,KAAK,KAAK,IAAI;AACtC,iBAAW,MAAM,IAAI,MAAM;AAAA,IAC5B;AACA,WAAO;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ,OAAO,YAAY,KAAK,MAAM;AAAA,IACvC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAiB;AAChB,WAAO,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;AAAA,EAC1B;AACD;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/testing.ts"],"sourcesContent":["import type { EngineDriver, KVEntry, KVWrite } from \"./driver.js\";\nimport { EvictedError } from \"./errors.js\";\nimport { compareKeys, keyStartsWith, keyToHex } from \"./keys.js\";\nimport type { Message, WorkflowMessageDriver } from \"./types.js\";\nimport { sleep } from \"./utils.js\";\n\ninterface Waiter {\n\tnameSet?: Set<string>;\n\tresolve: () => void;\n\treject: (error: Error) => void;\n\tabortSignal: AbortSignal;\n\tonAbort: () => void;\n}\n\nclass InMemoryWorkflowMessageDriver implements WorkflowMessageDriver {\n\t#messages: Message[] = [];\n\t#waiters = new Set<Waiter>();\n\n\tasync addMessage(message: Message): Promise<void> {\n\t\tthis.#messages.push(message);\n\t\tthis.#notifyWaiters(message.name);\n\t}\n\n\tasync receiveMessages(opts: {\n\t\tnames?: readonly string[];\n\t\tcount: number;\n\t\tcompletable: boolean;\n\t}): Promise<Message[]> {\n\t\tconst limitedCount = Math.max(1, opts.count);\n\t\tconst nameSet =\n\t\t\topts.names && opts.names.length > 0\n\t\t\t\t? new Set(opts.names)\n\t\t\t\t: undefined;\n\t\tconst selected: Array<{ message: Message; index: number }> = [];\n\n\t\tfor (\n\t\t\tlet i = 0;\n\t\t\ti < this.#messages.length && selected.length < limitedCount;\n\t\t\ti++\n\t\t) {\n\t\t\tconst message = this.#messages[i];\n\t\t\tif (nameSet && !nameSet.has(message.name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tselected.push({ message, index: i });\n\t\t}\n\n\t\tif (selected.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (!opts.completable) {\n\t\t\tfor (let i = selected.length - 1; i >= 0; i--) {\n\t\t\t\tthis.#messages.splice(selected[i].index, 1);\n\t\t\t}\n\t\t\treturn selected.map((entry) => entry.message);\n\t\t}\n\n\t\treturn selected.map((entry) => {\n\t\t\tconst { message } = entry;\n\t\t\treturn {\n\t\t\t\t...message,\n\t\t\t\tcomplete: async () => {\n\t\t\t\t\tawait this.completeMessage(message.id);\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t}\n\n\tasync completeMessage(messageId: string): Promise<void> {\n\t\tconst index = this.#messages.findIndex(\n\t\t\t(message) => message.id === messageId,\n\t\t);\n\t\tif (index !== -1) {\n\t\t\tthis.#messages.splice(index, 1);\n\t\t}\n\t}\n\n\tasync waitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tif (abortSignal.aborted) {\n\t\t\tthrow new EvictedError();\n\t\t}\n\n\t\tconst nameSet =\n\t\t\tmessageNames.length > 0 ? new Set(messageNames) : undefined;\n\t\tif (\n\t\t\tthis.#messages.some((message) =>\n\t\t\t\tnameSet ? nameSet.has(message.name) : true,\n\t\t\t)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst waiter: Waiter = {\n\t\t\t\tnameSet,\n\t\t\t\tresolve: () => {\n\t\t\t\t\tthis.#removeWaiter(waiter);\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tthis.#removeWaiter(waiter);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t\tabortSignal,\n\t\t\t\tonAbort: () => {\n\t\t\t\t\twaiter.reject(new EvictedError());\n\t\t\t\t},\n\t\t\t};\n\t\t\tabortSignal.addEventListener(\"abort\", waiter.onAbort, {\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t\tthis.#waiters.add(waiter);\n\t\t});\n\t}\n\n\t#removeWaiter(waiter: Waiter): void {\n\t\tif (this.#waiters.delete(waiter)) {\n\t\t\twaiter.abortSignal.removeEventListener(\"abort\", waiter.onAbort);\n\t\t}\n\t}\n\n\t#notifyWaiters(name: string): void {\n\t\tfor (const waiter of [...this.#waiters]) {\n\t\t\tif (waiter.nameSet && !waiter.nameSet.has(name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\twaiter.resolve();\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis.#messages = [];\n\t\tfor (const waiter of [...this.#waiters]) {\n\t\t\twaiter.reject(new Error(\"cleared\"));\n\t\t}\n\t}\n}\n\n/**\n * In-memory implementation of EngineDriver for testing.\n * Uses binary keys (Uint8Array) with hex encoding for internal Map storage.\n */\nexport class InMemoryDriver implements EngineDriver {\n\t// Map from hex-encoded key to { originalKey, value }\n\tprivate kv = new Map<string, { key: Uint8Array; value: Uint8Array }>();\n\tprivate alarms = new Map<string, number>();\n\t#inMemoryMessageDriver = new InMemoryWorkflowMessageDriver();\n\n\t/** Simulated latency per operation (ms) */\n\tlatency = 10;\n\n\t/** How often the worker polls for work */\n\tworkerPollInterval = 100;\n\tmessageDriver: WorkflowMessageDriver = this.#inMemoryMessageDriver;\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tawait sleep(this.latency);\n\t\tconst entry = this.kv.get(keyToHex(key));\n\t\treturn entry?.value ?? null;\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.kv.set(keyToHex(key), { key, value });\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.kv.delete(keyToHex(key));\n\t}\n\n\tasync batchDelete(keys: Uint8Array[]): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const key of keys) {\n\t\t\tthis.kv.delete(keyToHex(key));\n\t\t}\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tif (keyStartsWith(entry.key, prefix)) {\n\t\t\t\tthis.kv.delete(hexKey);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tif (\n\t\t\t\tcompareKeys(entry.key, start) >= 0 &&\n\t\t\t\tcompareKeys(entry.key, end) < 0\n\t\t\t) {\n\t\t\t\tthis.kv.delete(hexKey);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\tawait sleep(this.latency);\n\t\tconst results: KVEntry[] = [];\n\t\tfor (const entry of this.kv.values()) {\n\t\t\tif (keyStartsWith(entry.key, prefix)) {\n\t\t\t\tresults.push({ key: entry.key, value: entry.value });\n\t\t\t}\n\t\t}\n\t\t// Sort by key lexicographically\n\t\treturn results.sort((a, b) => compareKeys(a.key, b.key));\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const { key, value } of writes) {\n\t\t\tthis.kv.set(keyToHex(key), { key, value });\n\t\t}\n\t}\n\n\tasync setAlarm(workflowId: string, wakeAt: number): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.alarms.set(workflowId, wakeAt);\n\t}\n\n\tasync clearAlarm(workflowId: string): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.alarms.delete(workflowId);\n\t}\n\n\tasync waitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tconst driver = this.messageDriver as WorkflowMessageDriver & {\n\t\t\twaitForMessages?: (\n\t\t\t\tmessageNames: string[],\n\t\t\t\tabortSignal: AbortSignal,\n\t\t\t) => Promise<void>;\n\t\t};\n\t\tif (driver.waitForMessages) {\n\t\t\tawait driver.waitForMessages(messageNames, abortSignal);\n\t\t\treturn;\n\t\t}\n\n\t\twhile (true) {\n\t\t\tif (abortSignal.aborted) {\n\t\t\t\tthrow new EvictedError();\n\t\t\t}\n\t\t\tconst messages = await this.messageDriver.receiveMessages({\n\t\t\t\tnames: messageNames.length > 0 ? messageNames : undefined,\n\t\t\t\tcount: 1,\n\t\t\t\tcompletable: true,\n\t\t\t});\n\t\t\tif (messages.length > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait sleep(Math.max(1, this.latency));\n\t\t}\n\t}\n\n\t/**\n\t * Get the alarm time for a workflow (for testing).\n\t */\n\tgetAlarm(workflowId: string): number | undefined {\n\t\treturn this.alarms.get(workflowId);\n\t}\n\n\t/**\n\t * Check if any alarms are due and return their workflow IDs.\n\t */\n\tgetDueAlarms(): string[] {\n\t\tconst now = Date.now();\n\t\tconst due: string[] = [];\n\t\tfor (const [workflowId, wakeAt] of this.alarms) {\n\t\t\tif (wakeAt <= now) {\n\t\t\t\tdue.push(workflowId);\n\t\t\t}\n\t\t}\n\t\treturn due;\n\t}\n\n\t/**\n\t * Clear all data (for testing).\n\t */\n\tclear(): void {\n\t\tthis.kv.clear();\n\t\tthis.alarms.clear();\n\t\tthis.#inMemoryMessageDriver.clear();\n\t}\n\n\t/**\n\t * Get a snapshot of all data (for testing/debugging).\n\t */\n\tsnapshot(): {\n\t\tkv: Record<string, Uint8Array>;\n\t\talarms: Record<string, number>;\n\t} {\n\t\tconst kvSnapshot: Record<string, Uint8Array> = {};\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tkvSnapshot[hexKey] = entry.value;\n\t\t}\n\t\treturn {\n\t\t\tkv: kvSnapshot,\n\t\t\talarms: Object.fromEntries(this.alarms),\n\t\t};\n\t}\n\n\t/**\n\t * Get all hex-encoded keys (for testing).\n\t */\n\tkeys(): string[] {\n\t\treturn [...this.kv.keys()];\n\t}\n}\n\n// Re-export main exports for convenience\nexport * from \"./index.js\";\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
package/src/driver.ts
CHANGED
|
@@ -54,6 +54,12 @@ export interface EngineDriver {
|
|
|
54
54
|
*/
|
|
55
55
|
delete(key: Uint8Array): Promise<void>;
|
|
56
56
|
|
|
57
|
+
/**
|
|
58
|
+
* Batch delete multiple keys in a single operation.
|
|
59
|
+
* Should be atomic if possible.
|
|
60
|
+
*/
|
|
61
|
+
batchDelete(keys: Uint8Array[]): Promise<void>;
|
|
62
|
+
|
|
57
63
|
/**
|
|
58
64
|
* Delete all keys with a given prefix.
|
|
59
65
|
*/
|
package/src/storage.ts
CHANGED
|
@@ -43,6 +43,9 @@ import type {
|
|
|
43
43
|
export const MAX_KV_BATCH_ENTRIES = 128;
|
|
44
44
|
export const MAX_KV_BATCH_PAYLOAD_BYTES = 976 * 1024;
|
|
45
45
|
|
|
46
|
+
/** Max delete ops (one transaction/permit each) run at once, under the 128-permit cap. */
|
|
47
|
+
export const MAX_CONCURRENT_DELETES = 64;
|
|
48
|
+
|
|
46
49
|
/**
|
|
47
50
|
* Create an empty storage instance.
|
|
48
51
|
*/
|
|
@@ -330,18 +333,8 @@ export async function flush(
|
|
|
330
333
|
// Apply pending deletions after the batch write. These are collected
|
|
331
334
|
// by collectLoopPruning so pruning happens alongside the state write.
|
|
332
335
|
if (pendingDeletions) {
|
|
333
|
-
const
|
|
334
|
-
|
|
335
|
-
deleteOps.push(driver.deletePrefix(prefix));
|
|
336
|
-
}
|
|
337
|
-
for (const range of pendingDeletions.ranges) {
|
|
338
|
-
deleteOps.push(driver.deleteRange(range.start, range.end));
|
|
339
|
-
}
|
|
340
|
-
for (const key of pendingDeletions.keys) {
|
|
341
|
-
deleteOps.push(driver.delete(key));
|
|
342
|
-
}
|
|
343
|
-
if (deleteOps.length > 0) {
|
|
344
|
-
await Promise.all(deleteOps);
|
|
336
|
+
const didChange = await runDeletes(driver, pendingDeletions);
|
|
337
|
+
if (didChange) {
|
|
345
338
|
historyUpdated = true;
|
|
346
339
|
}
|
|
347
340
|
}
|
|
@@ -397,6 +390,44 @@ function splitBatchWrites(writes: KVWrite[]): KVWrite[][] {
|
|
|
397
390
|
return chunks;
|
|
398
391
|
}
|
|
399
392
|
|
|
393
|
+
/**
|
|
394
|
+
* Split delete keys into batches within one KV transaction (MAX_KV_BATCH_ENTRIES).
|
|
395
|
+
*/
|
|
396
|
+
function splitBatchDeletes(keys: Uint8Array[]): Uint8Array[][] {
|
|
397
|
+
const chunks: Uint8Array[][] = [];
|
|
398
|
+
for (let i = 0; i < keys.length; i += MAX_KV_BATCH_ENTRIES) {
|
|
399
|
+
chunks.push(keys.slice(i, i + MAX_KV_BATCH_ENTRIES));
|
|
400
|
+
}
|
|
401
|
+
return chunks;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Apply deletions concurrently in bounded rounds; returns whether anything was deleted.
|
|
406
|
+
*/
|
|
407
|
+
async function runDeletes(
|
|
408
|
+
driver: EngineDriver,
|
|
409
|
+
deletions: PendingDeletions,
|
|
410
|
+
): Promise<boolean> {
|
|
411
|
+
const ops = [
|
|
412
|
+
...deletions.prefixes.map((prefix) => () => driver.deletePrefix(prefix)),
|
|
413
|
+
...deletions.ranges.map(
|
|
414
|
+
(range) => () => driver.deleteRange(range.start, range.end),
|
|
415
|
+
),
|
|
416
|
+
...splitBatchDeletes(deletions.keys).map(
|
|
417
|
+
(chunk) => () => driver.batchDelete(chunk),
|
|
418
|
+
),
|
|
419
|
+
];
|
|
420
|
+
if (ops.length === 0) {
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
for (let i = 0; i < ops.length; i += MAX_CONCURRENT_DELETES) {
|
|
424
|
+
await Promise.all(
|
|
425
|
+
ops.slice(i, i + MAX_CONCURRENT_DELETES).map((op) => op()),
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
return true;
|
|
429
|
+
}
|
|
430
|
+
|
|
400
431
|
/**
|
|
401
432
|
* Delete entries with a given location prefix (used for loop forgetting).
|
|
402
433
|
* Also cleans up associated metadata from both memory and driver.
|
|
@@ -410,8 +441,7 @@ export async function deleteEntriesWithPrefix(
|
|
|
410
441
|
const deletions = collectDeletionsForPrefix(storage, prefixLocation);
|
|
411
442
|
|
|
412
443
|
// Apply deletions to driver
|
|
413
|
-
await driver
|
|
414
|
-
await Promise.all(deletions.keys.map((key) => driver.delete(key)));
|
|
444
|
+
await runDeletes(driver, deletions);
|
|
415
445
|
|
|
416
446
|
if (deletions.keys.length > 0 && onHistoryUpdated) {
|
|
417
447
|
onHistoryUpdated();
|
package/src/testing.ts
CHANGED
|
@@ -173,6 +173,13 @@ export class InMemoryDriver implements EngineDriver {
|
|
|
173
173
|
this.kv.delete(keyToHex(key));
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
+
async batchDelete(keys: Uint8Array[]): Promise<void> {
|
|
177
|
+
await sleep(this.latency);
|
|
178
|
+
for (const key of keys) {
|
|
179
|
+
this.kv.delete(keyToHex(key));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
176
183
|
async deletePrefix(prefix: Uint8Array): Promise<void> {
|
|
177
184
|
await sleep(this.latency);
|
|
178
185
|
for (const [hexKey, entry] of this.kv) {
|