@trigger.dev/core 4.5.12 → 4.5.13
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/commonjs/v3/apiClient/runStream.d.ts +3 -0
- package/dist/commonjs/v3/apiClient/runStream.js +1 -0
- package/dist/commonjs/v3/apiClient/runStream.js.map +1 -1
- package/dist/commonjs/v3/apiClient/runStream.test.js +1 -0
- package/dist/commonjs/v3/apiClient/runStream.test.js.map +1 -1
- package/dist/commonjs/v3/isomorphic/friendlyId.d.ts +64 -1
- package/dist/commonjs/v3/isomorphic/friendlyId.js +179 -12
- package/dist/commonjs/v3/isomorphic/friendlyId.js.map +1 -1
- package/dist/commonjs/v3/isomorphic/friendlyId.test.js +283 -1
- package/dist/commonjs/v3/isomorphic/friendlyId.test.js.map +1 -1
- package/dist/commonjs/v3/isomorphic/index.d.ts +1 -0
- package/dist/commonjs/v3/isomorphic/index.js +1 -0
- package/dist/commonjs/v3/isomorphic/index.js.map +1 -1
- package/dist/commonjs/v3/isomorphic/runOpsResidency.d.ts +21 -7
- package/dist/commonjs/v3/isomorphic/runOpsResidency.js +23 -7
- package/dist/commonjs/v3/isomorphic/runOpsResidency.js.map +1 -1
- package/dist/commonjs/v3/isomorphic/runOpsResidency.test.js +85 -2
- package/dist/commonjs/v3/isomorphic/runOpsResidency.test.js.map +1 -1
- package/dist/commonjs/v3/isomorphic/waitpointMint.d.ts +9 -0
- package/dist/commonjs/v3/isomorphic/waitpointMint.js +22 -0
- package/dist/commonjs/v3/isomorphic/waitpointMint.js.map +1 -0
- package/dist/commonjs/v3/isomorphic/waitpointMint.test.d.ts +1 -0
- package/dist/commonjs/v3/isomorphic/waitpointMint.test.js +97 -0
- package/dist/commonjs/v3/isomorphic/waitpointMint.test.js.map +1 -0
- package/dist/commonjs/v3/runEngineWorker/workload/schemas.d.ts +54 -54
- package/dist/commonjs/v3/schemas/api.d.ts +45 -3
- package/dist/commonjs/v3/schemas/api.js +18 -5
- package/dist/commonjs/v3/schemas/api.js.map +1 -1
- package/dist/commonjs/v3/session-streams-api.d.ts +1 -0
- package/dist/commonjs/v3/session-streams-api.js +1 -0
- package/dist/commonjs/v3/session-streams-api.js.map +1 -1
- package/dist/commonjs/v3/sessionStreams/index.d.ts +9 -1
- package/dist/commonjs/v3/sessionStreams/index.js +38 -0
- package/dist/commonjs/v3/sessionStreams/index.js.map +1 -1
- package/dist/commonjs/v3/sessionStreams/manager.d.ts +27 -2
- package/dist/commonjs/v3/sessionStreams/manager.js +202 -108
- package/dist/commonjs/v3/sessionStreams/manager.js.map +1 -1
- package/dist/commonjs/v3/sessionStreams/manager.test.js +253 -0
- package/dist/commonjs/v3/sessionStreams/manager.test.js.map +1 -1
- package/dist/commonjs/v3/sessionStreams/noopManager.d.ts +9 -1
- package/dist/commonjs/v3/sessionStreams/noopManager.js +18 -0
- package/dist/commonjs/v3/sessionStreams/noopManager.js.map +1 -1
- package/dist/commonjs/v3/sessionStreams/router.d.ts +241 -0
- package/dist/commonjs/v3/sessionStreams/router.js +402 -0
- package/dist/commonjs/v3/sessionStreams/router.js.map +1 -0
- package/dist/commonjs/v3/sessionStreams/router.test.d.ts +1 -0
- package/dist/commonjs/v3/sessionStreams/router.test.js +463 -0
- package/dist/commonjs/v3/sessionStreams/router.test.js.map +1 -0
- package/dist/commonjs/v3/sessionStreams/types.d.ts +42 -6
- package/dist/commonjs/v3/sessionStreams/wireProtocol.d.ts +11 -0
- package/dist/commonjs/v3/sessionStreams/wireProtocol.js +12 -1
- package/dist/commonjs/v3/sessionStreams/wireProtocol.js.map +1 -1
- package/dist/commonjs/v3/test/mock-task-context.d.ts +4 -1
- package/dist/commonjs/v3/test/mock-task-context.js +2 -2
- package/dist/commonjs/v3/test/mock-task-context.js.map +1 -1
- package/dist/commonjs/v3/test/session-waitpoint-backend.js +17 -3
- package/dist/commonjs/v3/test/session-waitpoint-backend.js.map +1 -1
- package/dist/commonjs/v3/test/test-session-stream-manager.d.ts +13 -2
- package/dist/commonjs/v3/test/test-session-stream-manager.js +173 -67
- package/dist/commonjs/v3/test/test-session-stream-manager.js.map +1 -1
- package/dist/commonjs/v3/utils/globals.js +5 -1
- package/dist/commonjs/v3/utils/globals.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/esm/v3/apiClient/runStream.d.ts +3 -0
- package/dist/esm/v3/apiClient/runStream.js +1 -0
- package/dist/esm/v3/apiClient/runStream.js.map +1 -1
- package/dist/esm/v3/apiClient/runStream.test.js +1 -0
- package/dist/esm/v3/apiClient/runStream.test.js.map +1 -1
- package/dist/esm/v3/isomorphic/friendlyId.d.ts +64 -1
- package/dist/esm/v3/isomorphic/friendlyId.js +170 -11
- package/dist/esm/v3/isomorphic/friendlyId.js.map +1 -1
- package/dist/esm/v3/isomorphic/friendlyId.test.js +284 -2
- package/dist/esm/v3/isomorphic/friendlyId.test.js.map +1 -1
- package/dist/esm/v3/isomorphic/index.d.ts +1 -0
- package/dist/esm/v3/isomorphic/index.js +1 -0
- package/dist/esm/v3/isomorphic/index.js.map +1 -1
- package/dist/esm/v3/isomorphic/runOpsResidency.d.ts +21 -7
- package/dist/esm/v3/isomorphic/runOpsResidency.js +23 -8
- package/dist/esm/v3/isomorphic/runOpsResidency.js.map +1 -1
- package/dist/esm/v3/isomorphic/runOpsResidency.test.js +87 -4
- package/dist/esm/v3/isomorphic/runOpsResidency.test.js.map +1 -1
- package/dist/esm/v3/isomorphic/waitpointMint.d.ts +9 -0
- package/dist/esm/v3/isomorphic/waitpointMint.js +18 -0
- package/dist/esm/v3/isomorphic/waitpointMint.js.map +1 -0
- package/dist/esm/v3/isomorphic/waitpointMint.test.d.ts +1 -0
- package/dist/esm/v3/isomorphic/waitpointMint.test.js +95 -0
- package/dist/esm/v3/isomorphic/waitpointMint.test.js.map +1 -0
- package/dist/esm/v3/runEngineWorker/workload/schemas.d.ts +54 -54
- package/dist/esm/v3/schemas/api.d.ts +45 -3
- package/dist/esm/v3/schemas/api.js +15 -2
- package/dist/esm/v3/schemas/api.js.map +1 -1
- package/dist/esm/v3/session-streams-api.d.ts +1 -0
- package/dist/esm/v3/session-streams-api.js +1 -0
- package/dist/esm/v3/session-streams-api.js.map +1 -1
- package/dist/esm/v3/sessionStreams/index.d.ts +9 -1
- package/dist/esm/v3/sessionStreams/index.js +38 -0
- package/dist/esm/v3/sessionStreams/index.js.map +1 -1
- package/dist/esm/v3/sessionStreams/manager.d.ts +27 -2
- package/dist/esm/v3/sessionStreams/manager.js +202 -108
- package/dist/esm/v3/sessionStreams/manager.js.map +1 -1
- package/dist/esm/v3/sessionStreams/manager.test.js +253 -0
- package/dist/esm/v3/sessionStreams/manager.test.js.map +1 -1
- package/dist/esm/v3/sessionStreams/noopManager.d.ts +9 -1
- package/dist/esm/v3/sessionStreams/noopManager.js +18 -0
- package/dist/esm/v3/sessionStreams/noopManager.js.map +1 -1
- package/dist/esm/v3/sessionStreams/router.d.ts +241 -0
- package/dist/esm/v3/sessionStreams/router.js +398 -0
- package/dist/esm/v3/sessionStreams/router.js.map +1 -0
- package/dist/esm/v3/sessionStreams/router.test.d.ts +1 -0
- package/dist/esm/v3/sessionStreams/router.test.js +461 -0
- package/dist/esm/v3/sessionStreams/router.test.js.map +1 -0
- package/dist/esm/v3/sessionStreams/types.d.ts +42 -6
- package/dist/esm/v3/sessionStreams/wireProtocol.d.ts +11 -0
- package/dist/esm/v3/sessionStreams/wireProtocol.js +11 -0
- package/dist/esm/v3/sessionStreams/wireProtocol.js.map +1 -1
- package/dist/esm/v3/test/mock-task-context.d.ts +4 -1
- package/dist/esm/v3/test/mock-task-context.js +2 -2
- package/dist/esm/v3/test/mock-task-context.js.map +1 -1
- package/dist/esm/v3/test/session-waitpoint-backend.js +17 -3
- package/dist/esm/v3/test/session-waitpoint-backend.js.map +1 -1
- package/dist/esm/v3/test/test-session-stream-manager.d.ts +13 -2
- package/dist/esm/v3/test/test-session-stream-manager.js +173 -67
- package/dist/esm/v3/test/test-session-stream-manager.js.map +1 -1
- package/dist/esm/v3/utils/globals.js +5 -1
- package/dist/esm/v3/utils/globals.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { StandardSessionStreamManager } from "./manager.js";
|
|
3
|
+
import { InputStreamTimeoutError } from "../inputStreams/types.js";
|
|
3
4
|
// Single-shot mock that mimics S2's long-poll: delivers `records` once via
|
|
4
5
|
// `onPart` on the first subscribe call, then keeps the returned async
|
|
5
6
|
// iterable OPEN until the abort signal fires. Real S2 keeps the SSE
|
|
@@ -35,6 +36,22 @@ function singleShotApiClient(records) {
|
|
|
35
36
|
},
|
|
36
37
|
};
|
|
37
38
|
}
|
|
39
|
+
function repeatingApiClient(record) {
|
|
40
|
+
return {
|
|
41
|
+
async subscribeToSessionStream(_sessionIdOrExternalId, _io, options) {
|
|
42
|
+
options?.onPart?.(record);
|
|
43
|
+
const signal = options?.signal;
|
|
44
|
+
// eslint-disable-next-line require-yield
|
|
45
|
+
return (async function* () {
|
|
46
|
+
if (signal?.aborted)
|
|
47
|
+
return;
|
|
48
|
+
await new Promise((resolve) => {
|
|
49
|
+
signal?.addEventListener("abort", () => resolve(), { once: true });
|
|
50
|
+
});
|
|
51
|
+
})();
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
38
55
|
describe("StandardSessionStreamManager — minTimestamp filter", () => {
|
|
39
56
|
const sessionId = "session-1";
|
|
40
57
|
const io = "in";
|
|
@@ -117,4 +134,240 @@ describe("StandardSessionStreamManager — minTimestamp filter", () => {
|
|
|
117
134
|
manager.disconnect();
|
|
118
135
|
});
|
|
119
136
|
});
|
|
137
|
+
describe("StandardSessionStreamManager — record metadata", () => {
|
|
138
|
+
const sessionId = "session-records";
|
|
139
|
+
const io = "in";
|
|
140
|
+
const records = [
|
|
141
|
+
{
|
|
142
|
+
id: "41",
|
|
143
|
+
recordId: "part-stable-1",
|
|
144
|
+
chunk: { kind: "message", payload: { id: "u1" } },
|
|
145
|
+
timestamp: 1000,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: "42",
|
|
149
|
+
recordId: "part-stable-2",
|
|
150
|
+
chunk: { kind: "message", payload: { id: "u2" } },
|
|
151
|
+
timestamp: 2000,
|
|
152
|
+
},
|
|
153
|
+
];
|
|
154
|
+
it("consumes one record at a time with stable id and sequence metadata", async () => {
|
|
155
|
+
const manager = new StandardSessionStreamManager(singleShotApiClient(records), "http://localhost");
|
|
156
|
+
const first = await manager.onceRecord(sessionId, io);
|
|
157
|
+
expect(first).toEqual({
|
|
158
|
+
ok: true,
|
|
159
|
+
output: {
|
|
160
|
+
id: "part-stable-1",
|
|
161
|
+
seqNum: 41,
|
|
162
|
+
data: { kind: "message", payload: { id: "u1" } },
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
expect(manager.peekRecord(sessionId, io)).toEqual({
|
|
166
|
+
id: "part-stable-2",
|
|
167
|
+
seqNum: 42,
|
|
168
|
+
data: { kind: "message", payload: { id: "u2" } },
|
|
169
|
+
});
|
|
170
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBe(41);
|
|
171
|
+
const second = await manager.onceRecord(sessionId, io);
|
|
172
|
+
expect(second.ok && second.output.id).toBe("part-stable-2");
|
|
173
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBe(42);
|
|
174
|
+
manager.disconnectStream(sessionId, io);
|
|
175
|
+
manager.disconnect();
|
|
176
|
+
});
|
|
177
|
+
it("returns the same envelope when a record is redelivered", async () => {
|
|
178
|
+
const manager = new StandardSessionStreamManager(repeatingApiClient(records[0]), "http://localhost");
|
|
179
|
+
const first = await manager.onceRecord(sessionId, io);
|
|
180
|
+
manager.disconnectStream(sessionId, io);
|
|
181
|
+
const replayed = await manager.onceRecord(sessionId, io);
|
|
182
|
+
expect(first).toEqual(replayed);
|
|
183
|
+
manager.disconnectStream(sessionId, io);
|
|
184
|
+
manager.disconnect();
|
|
185
|
+
});
|
|
186
|
+
it("returns immediately when the timeout is zero", async () => {
|
|
187
|
+
const manager = new StandardSessionStreamManager({
|
|
188
|
+
subscribeToSessionStream: () => {
|
|
189
|
+
throw new Error("zero-timeout reads must not subscribe");
|
|
190
|
+
},
|
|
191
|
+
}, "http://localhost");
|
|
192
|
+
const result = await manager.onceRecord(sessionId, io, { timeoutMs: 0 });
|
|
193
|
+
expect(result.ok).toBe(false);
|
|
194
|
+
if (!result.ok) {
|
|
195
|
+
expect(result.error).toBeInstanceOf(InputStreamTimeoutError);
|
|
196
|
+
}
|
|
197
|
+
manager.disconnect();
|
|
198
|
+
});
|
|
199
|
+
it("does not consume a matching record past an earlier unmatched record", async () => {
|
|
200
|
+
const manager = new StandardSessionStreamManager(singleShotApiClient([
|
|
201
|
+
{
|
|
202
|
+
id: "50",
|
|
203
|
+
recordId: "handover-1",
|
|
204
|
+
chunk: { kind: "handover" },
|
|
205
|
+
timestamp: 1000,
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
id: "51",
|
|
209
|
+
recordId: "message-1",
|
|
210
|
+
chunk: { kind: "message", payload: { id: "u1" } },
|
|
211
|
+
timestamp: 2000,
|
|
212
|
+
},
|
|
213
|
+
]), "http://localhost");
|
|
214
|
+
const pendingMessage = manager.onceRecordWhere(sessionId, io, (record) => record.data.kind === "message", { timeoutMs: 200 });
|
|
215
|
+
expect(manager.peekRecord(sessionId, io)).toEqual({
|
|
216
|
+
id: "handover-1",
|
|
217
|
+
seqNum: 50,
|
|
218
|
+
data: { kind: "handover" },
|
|
219
|
+
});
|
|
220
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBeUndefined();
|
|
221
|
+
const handover = await manager.onceRecord(sessionId, io);
|
|
222
|
+
expect(handover).toEqual({
|
|
223
|
+
ok: true,
|
|
224
|
+
output: { id: "handover-1", seqNum: 50, data: { kind: "handover" } },
|
|
225
|
+
});
|
|
226
|
+
await expect(pendingMessage).resolves.toEqual({
|
|
227
|
+
ok: true,
|
|
228
|
+
output: {
|
|
229
|
+
id: "message-1",
|
|
230
|
+
seqNum: 51,
|
|
231
|
+
data: { kind: "message", payload: { id: "u1" } },
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBe(51);
|
|
235
|
+
manager.disconnectStream(sessionId, io);
|
|
236
|
+
manager.disconnect();
|
|
237
|
+
});
|
|
238
|
+
it("keeps the persisted cursor behind each earlier buffered record", async () => {
|
|
239
|
+
const manager = new StandardSessionStreamManager(singleShotApiClient([
|
|
240
|
+
{
|
|
241
|
+
id: "50",
|
|
242
|
+
recordId: "message-1",
|
|
243
|
+
chunk: { kind: "message", payload: { id: "u1" } },
|
|
244
|
+
timestamp: 1000,
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
id: "51",
|
|
248
|
+
recordId: "stop-1",
|
|
249
|
+
chunk: { kind: "stop" },
|
|
250
|
+
timestamp: 2000,
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
id: "52",
|
|
254
|
+
recordId: "message-2",
|
|
255
|
+
chunk: { kind: "message", payload: { id: "u2" } },
|
|
256
|
+
timestamp: 3000,
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
id: "53",
|
|
260
|
+
recordId: "stop-2",
|
|
261
|
+
chunk: { kind: "stop" },
|
|
262
|
+
timestamp: 4000,
|
|
263
|
+
},
|
|
264
|
+
]), "http://localhost");
|
|
265
|
+
let resolveStop;
|
|
266
|
+
let remainingStops = 2;
|
|
267
|
+
const stopConsumed = new Promise((resolve) => {
|
|
268
|
+
resolveStop = resolve;
|
|
269
|
+
});
|
|
270
|
+
manager.on(sessionId, io, (data) => {
|
|
271
|
+
if (data.kind !== "stop")
|
|
272
|
+
return;
|
|
273
|
+
remainingStops--;
|
|
274
|
+
if (remainingStops === 0)
|
|
275
|
+
resolveStop();
|
|
276
|
+
return true;
|
|
277
|
+
});
|
|
278
|
+
await stopConsumed;
|
|
279
|
+
expect(manager.peekRecord(sessionId, io)).toEqual({
|
|
280
|
+
id: "message-1",
|
|
281
|
+
seqNum: 50,
|
|
282
|
+
data: { kind: "message", payload: { id: "u1" } },
|
|
283
|
+
});
|
|
284
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBe(49);
|
|
285
|
+
const firstMessage = await manager.onceRecord(sessionId, io);
|
|
286
|
+
expect(firstMessage.ok && firstMessage.output.id).toBe("message-1");
|
|
287
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBe(51);
|
|
288
|
+
const secondMessage = await manager.onceRecord(sessionId, io);
|
|
289
|
+
expect(secondMessage.ok && secondMessage.output.id).toBe("message-2");
|
|
290
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBe(53);
|
|
291
|
+
manager.disconnectStream(sessionId, io);
|
|
292
|
+
manager.disconnect();
|
|
293
|
+
});
|
|
294
|
+
it("preserves buffered records across disconnect and consumes only the exact sequence", async () => {
|
|
295
|
+
const manager = new StandardSessionStreamManager(singleShotApiClient([
|
|
296
|
+
{
|
|
297
|
+
id: "50",
|
|
298
|
+
recordId: "message-1",
|
|
299
|
+
chunk: { kind: "message", payload: { id: "u1" } },
|
|
300
|
+
timestamp: 1000,
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
id: "51",
|
|
304
|
+
recordId: "stop-1",
|
|
305
|
+
chunk: { kind: "stop" },
|
|
306
|
+
timestamp: 2000,
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
id: "52",
|
|
310
|
+
recordId: "message-2",
|
|
311
|
+
chunk: { kind: "message", payload: { id: "u2" } },
|
|
312
|
+
timestamp: 3000,
|
|
313
|
+
},
|
|
314
|
+
]), "http://localhost");
|
|
315
|
+
let resolveStop;
|
|
316
|
+
const stopConsumed = new Promise((resolve) => {
|
|
317
|
+
resolveStop = resolve;
|
|
318
|
+
});
|
|
319
|
+
manager.on(sessionId, io, (data) => {
|
|
320
|
+
if (data.kind !== "stop")
|
|
321
|
+
return;
|
|
322
|
+
resolveStop();
|
|
323
|
+
return true;
|
|
324
|
+
});
|
|
325
|
+
await stopConsumed;
|
|
326
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBe(49);
|
|
327
|
+
manager.disconnectStream(sessionId, io);
|
|
328
|
+
expect(manager.peekRecord(sessionId, io)?.seqNum).toBe(50);
|
|
329
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBe(49);
|
|
330
|
+
manager.consumeRecord(sessionId, io, 50);
|
|
331
|
+
expect(manager.peekRecord(sessionId, io)?.seqNum).toBe(52);
|
|
332
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBe(51);
|
|
333
|
+
manager.consumeRecord(sessionId, io, 52);
|
|
334
|
+
expect(manager.peekRecord(sessionId, io)).toBeUndefined();
|
|
335
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBe(52);
|
|
336
|
+
manager.reset();
|
|
337
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBeUndefined();
|
|
338
|
+
});
|
|
339
|
+
it("does not expose a negative cursor when sequence zero is buffered", async () => {
|
|
340
|
+
const manager = new StandardSessionStreamManager(singleShotApiClient([
|
|
341
|
+
{
|
|
342
|
+
id: "0",
|
|
343
|
+
recordId: "message-0",
|
|
344
|
+
chunk: { kind: "message", payload: { id: "u0" } },
|
|
345
|
+
timestamp: 1000,
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
id: "1",
|
|
349
|
+
recordId: "stop-1",
|
|
350
|
+
chunk: { kind: "stop" },
|
|
351
|
+
timestamp: 2000,
|
|
352
|
+
},
|
|
353
|
+
]), "http://localhost");
|
|
354
|
+
let resolveStop;
|
|
355
|
+
const stopConsumed = new Promise((resolve) => {
|
|
356
|
+
resolveStop = resolve;
|
|
357
|
+
});
|
|
358
|
+
manager.on(sessionId, io, (data) => {
|
|
359
|
+
if (data.kind !== "stop")
|
|
360
|
+
return;
|
|
361
|
+
resolveStop();
|
|
362
|
+
return true;
|
|
363
|
+
});
|
|
364
|
+
await stopConsumed;
|
|
365
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBeUndefined();
|
|
366
|
+
const message = await manager.onceRecord(sessionId, io);
|
|
367
|
+
expect(message.ok && message.output.id).toBe("message-0");
|
|
368
|
+
expect(manager.lastDispatchedSeqNum(sessionId, io)).toBe(1);
|
|
369
|
+
manager.disconnectStream(sessionId, io);
|
|
370
|
+
manager.disconnect();
|
|
371
|
+
});
|
|
372
|
+
});
|
|
120
373
|
//# sourceMappingURL=manager.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.test.js","sourceRoot":"","sources":["../../../../src/v3/sessionStreams/manager.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manager.test.js","sourceRoot":"","sources":["../../../../src/v3/sessionStreams/manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
import type { InputStreamOnceOptions } from "../realtimeStreams/types.js";
|
|
2
2
|
import { InputStreamOncePromise } from "../inputStreams/types.js";
|
|
3
|
-
import type { SessionChannelIO, SessionStreamManager } from "./types.js";
|
|
3
|
+
import type { SessionChannelIO, SessionStreamManager, SessionStreamRecord, SessionStreamRecordPredicate } from "./types.js";
|
|
4
4
|
export declare class NoopSessionStreamManager implements SessionStreamManager {
|
|
5
5
|
on(_sessionId: string, _io: SessionChannelIO, _handler: (data: unknown) => void | boolean | Promise<void>): {
|
|
6
6
|
off: () => void;
|
|
7
7
|
};
|
|
8
|
+
onRecord(_sessionId: string, _io: SessionChannelIO, _handler: (record: SessionStreamRecord) => void | boolean | Promise<void>): {
|
|
9
|
+
off: () => void;
|
|
10
|
+
};
|
|
8
11
|
once(_sessionId: string, _io: SessionChannelIO, _options?: InputStreamOnceOptions): InputStreamOncePromise<unknown>;
|
|
12
|
+
onceRecord(_sessionId: string, _io: SessionChannelIO, _options?: InputStreamOnceOptions): InputStreamOncePromise<SessionStreamRecord>;
|
|
13
|
+
onceRecordWhere(_sessionId: string, _io: SessionChannelIO, _predicate: SessionStreamRecordPredicate, _options?: InputStreamOnceOptions): InputStreamOncePromise<SessionStreamRecord>;
|
|
9
14
|
peek(_sessionId: string, _io: SessionChannelIO): unknown | undefined;
|
|
15
|
+
peekRecord(_sessionId: string, _io: SessionChannelIO): SessionStreamRecord | undefined;
|
|
10
16
|
lastSeqNum(_sessionId: string, _io: SessionChannelIO): number | undefined;
|
|
11
17
|
setLastSeqNum(_sessionId: string, _io: SessionChannelIO, _seqNum: number): void;
|
|
18
|
+
consumeRecord(_sessionId: string, _io: SessionChannelIO, _seqNum: number): void;
|
|
12
19
|
lastDispatchedSeqNum(_sessionId: string, _io: SessionChannelIO): number | undefined;
|
|
13
20
|
setLastDispatchedSeqNum(_sessionId: string, _io: SessionChannelIO, _seqNum: number): void;
|
|
14
21
|
setMinTimestamp(_sessionId: string, _io: SessionChannelIO, _minTimestamp: number | undefined): void;
|
|
15
22
|
shiftBuffer(_sessionId: string, _io: SessionChannelIO): boolean;
|
|
16
23
|
disconnectStream(_sessionId: string, _io: SessionChannelIO): void;
|
|
24
|
+
reconnectStream(_sessionId: string, _io: SessionChannelIO): void;
|
|
17
25
|
clearHandlers(): void;
|
|
18
26
|
reset(): void;
|
|
19
27
|
disconnect(): void;
|
|
@@ -3,18 +3,35 @@ export class NoopSessionStreamManager {
|
|
|
3
3
|
on(_sessionId, _io, _handler) {
|
|
4
4
|
return { off: () => { } };
|
|
5
5
|
}
|
|
6
|
+
onRecord(_sessionId, _io, _handler) {
|
|
7
|
+
return { off: () => { } };
|
|
8
|
+
}
|
|
6
9
|
once(_sessionId, _io, _options) {
|
|
7
10
|
return new InputStreamOncePromise(() => {
|
|
8
11
|
// Never resolves in noop mode.
|
|
9
12
|
});
|
|
10
13
|
}
|
|
14
|
+
onceRecord(_sessionId, _io, _options) {
|
|
15
|
+
return new InputStreamOncePromise(() => {
|
|
16
|
+
// Never resolves in noop mode.
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
onceRecordWhere(_sessionId, _io, _predicate, _options) {
|
|
20
|
+
return new InputStreamOncePromise(() => {
|
|
21
|
+
// Never resolves in noop mode.
|
|
22
|
+
});
|
|
23
|
+
}
|
|
11
24
|
peek(_sessionId, _io) {
|
|
12
25
|
return undefined;
|
|
13
26
|
}
|
|
27
|
+
peekRecord(_sessionId, _io) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
14
30
|
lastSeqNum(_sessionId, _io) {
|
|
15
31
|
return undefined;
|
|
16
32
|
}
|
|
17
33
|
setLastSeqNum(_sessionId, _io, _seqNum) { }
|
|
34
|
+
consumeRecord(_sessionId, _io, _seqNum) { }
|
|
18
35
|
lastDispatchedSeqNum(_sessionId, _io) {
|
|
19
36
|
return undefined;
|
|
20
37
|
}
|
|
@@ -24,6 +41,7 @@ export class NoopSessionStreamManager {
|
|
|
24
41
|
return false;
|
|
25
42
|
}
|
|
26
43
|
disconnectStream(_sessionId, _io) { }
|
|
44
|
+
reconnectStream(_sessionId, _io) { }
|
|
27
45
|
clearHandlers() { }
|
|
28
46
|
reset() { }
|
|
29
47
|
disconnect() { }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noopManager.js","sourceRoot":"","sources":["../../../../src/v3/sessionStreams/noopManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"noopManager.js","sourceRoot":"","sources":["../../../../src/v3/sessionStreams/noopManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAQlE,MAAM,OAAO,wBAAwB;IACnC,EAAE,CACA,UAAkB,EAClB,GAAqB,EACrB,QAA2D;QAE3D,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;IAC3B,CAAC;IAED,QAAQ,CACN,UAAkB,EAClB,GAAqB,EACrB,QAAyE;QAEzE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CACF,UAAkB,EAClB,GAAqB,EACrB,QAAiC;QAEjC,OAAO,IAAI,sBAAsB,CAAC,GAAG,EAAE;YACrC,+BAA+B;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CACR,UAAkB,EAClB,GAAqB,EACrB,QAAiC;QAEjC,OAAO,IAAI,sBAAsB,CAAC,GAAG,EAAE;YACrC,+BAA+B;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CACb,UAAkB,EAClB,GAAqB,EACrB,UAAwC,EACxC,QAAiC;QAEjC,OAAO,IAAI,sBAAsB,CAAC,GAAG,EAAE;YACrC,+BAA+B;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,UAAkB,EAAE,GAAqB;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,UAAU,CAAC,UAAkB,EAAE,GAAqB;QAClD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,UAAU,CAAC,UAAkB,EAAE,GAAqB;QAClD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,aAAa,CAAC,UAAkB,EAAE,GAAqB,EAAE,OAAe,IAAS,CAAC;IAElF,aAAa,CAAC,UAAkB,EAAE,GAAqB,EAAE,OAAe,IAAS,CAAC;IAElF,oBAAoB,CAAC,UAAkB,EAAE,GAAqB;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,uBAAuB,CAAC,UAAkB,EAAE,GAAqB,EAAE,OAAe,IAAS,CAAC;IAE5F,eAAe,CACb,UAAkB,EAClB,GAAqB,EACrB,aAAiC,IAC1B,CAAC;IAEV,WAAW,CAAC,UAAkB,EAAE,GAAqB;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gBAAgB,CAAC,UAAkB,EAAE,GAAqB,IAAS,CAAC;IAEpE,eAAe,CAAC,UAAkB,EAAE,GAAqB,IAAS,CAAC;IAEnE,aAAa,KAAU,CAAC;IAExB,KAAK,KAAU,CAAC;IAEhB,UAAU,KAAU,CAAC;CACtB"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import type { SessionStreamRecord } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* What happens to a record when no consumer is ready for it *right now*.
|
|
4
|
+
*
|
|
5
|
+
* - `queue`: it waits in the route's own queue until a consumer takes it.
|
|
6
|
+
* - `at-arrival`: it goes to a live handler or nowhere. A record that only
|
|
7
|
+
* means something to the turn that is live when it lands (a stop) is this.
|
|
8
|
+
*/
|
|
9
|
+
export type RouteDelivery = "queue" | "at-arrival";
|
|
10
|
+
/**
|
|
11
|
+
* One route: which kinds it owns, whether it waits for a consumer, and whether
|
|
12
|
+
* a record it never handled has to survive into the next boot.
|
|
13
|
+
*
|
|
14
|
+
* The two properties are independent, and that is the point. Three of the four
|
|
15
|
+
* combinations are meaningful and cover everything `session.in` carries:
|
|
16
|
+
*
|
|
17
|
+
* | delivery | replayable | example |
|
|
18
|
+
* | --- | --- | --- |
|
|
19
|
+
* | `queue` | `true` | a user message: waits for a turn, and a crash must not lose it |
|
|
20
|
+
* | `at-arrival` | `false` | a stop: only the live turn cares, and a replayed one would abort the wrong turn |
|
|
21
|
+
* | `queue` | `false` | a handover signal: can arrive before its consumer is ready, but is meaningless to a later boot |
|
|
22
|
+
*
|
|
23
|
+
* The fourth is a contradiction (discard it when nobody is listening, yet
|
|
24
|
+
* recover it later) and the table rejects it.
|
|
25
|
+
*/
|
|
26
|
+
export type SessionRoute = {
|
|
27
|
+
/** Unique within a table. */
|
|
28
|
+
name: string;
|
|
29
|
+
delivery: RouteDelivery;
|
|
30
|
+
/**
|
|
31
|
+
* Whether a record this route never handled must be recovered by the next
|
|
32
|
+
* boot. Only `true` holds the resume floor back.
|
|
33
|
+
*/
|
|
34
|
+
replayable: boolean;
|
|
35
|
+
/** Record kinds this route owns. Every kind belongs to at most one route. */
|
|
36
|
+
kinds: readonly string[];
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* The complete statement of what a channel carries and who owns each kind.
|
|
40
|
+
* Intended to be a literal at the point of use, so "which kinds exist and what
|
|
41
|
+
* happens to each" is answerable by reading one object.
|
|
42
|
+
*/
|
|
43
|
+
export type SessionRouteTable = {
|
|
44
|
+
/** Extract a record's kind. Returning `undefined` marks it malformed. */
|
|
45
|
+
kindOf: (data: unknown) => string | undefined;
|
|
46
|
+
routes: readonly SessionRoute[];
|
|
47
|
+
};
|
|
48
|
+
export type RouterDropReason =
|
|
49
|
+
/** No route claims this kind: nothing on this boot can consume it. */
|
|
50
|
+
"unroutable"
|
|
51
|
+
/** No usable kind on the record at all. */
|
|
52
|
+
| "malformed"
|
|
53
|
+
/**
|
|
54
|
+
* A non-replayable record inside the replay window. It was already observed
|
|
55
|
+
* by a previous run, and its route has declared that a later boot has no use
|
|
56
|
+
* for it.
|
|
57
|
+
*/
|
|
58
|
+
| "replayed"
|
|
59
|
+
/** An `at-arrival` record with no handler attached right now. */
|
|
60
|
+
| "no-handler";
|
|
61
|
+
export type RouterDecision =
|
|
62
|
+
/** Handed to a consumer that was already waiting, or to a live handler. */
|
|
63
|
+
{
|
|
64
|
+
action: "deliver";
|
|
65
|
+
route: string;
|
|
66
|
+
}
|
|
67
|
+
/** Parked in the route's queue for a future consumer. */
|
|
68
|
+
| {
|
|
69
|
+
action: "queue";
|
|
70
|
+
route: string;
|
|
71
|
+
} | {
|
|
72
|
+
action: "drop";
|
|
73
|
+
route?: string;
|
|
74
|
+
reason: RouterDropReason;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* The two numbers a turn boundary publishes, and that a boot reads back.
|
|
78
|
+
*
|
|
79
|
+
* `resumeFrom` is the floor: every record at or below it was terminally
|
|
80
|
+
* handled, so a boot subscribes from just past it. `appliedThrough` is the end
|
|
81
|
+
* of the replay window: the highest sequence a previous run observed. Records
|
|
82
|
+
* at or below it are being re-read rather than arriving live.
|
|
83
|
+
*/
|
|
84
|
+
export type RouterCheckpoint = {
|
|
85
|
+
resumeFrom?: number;
|
|
86
|
+
appliedThrough?: number;
|
|
87
|
+
};
|
|
88
|
+
type RouteHandler = (record: SessionStreamRecord) => void;
|
|
89
|
+
/**
|
|
90
|
+
* Reads one session channel and gives every record exactly one destination.
|
|
91
|
+
*
|
|
92
|
+
* The channel carries records for several independent consumers whose delivery
|
|
93
|
+
* needs differ: a message must be delivered eventually and so can lag
|
|
94
|
+
* arbitrarily far behind the newest record, while a stop only means anything to
|
|
95
|
+
* the turn that is live when it lands. Tracking that with a single scalar
|
|
96
|
+
* cursor is not possible — the true state is always "control applied through
|
|
97
|
+
* X, message Y still owed" — so the router tracks it per route and derives the
|
|
98
|
+
* published numbers from route state:
|
|
99
|
+
*
|
|
100
|
+
* - the resume floor is held back only by records a later boot would still have
|
|
101
|
+
* to recover, which is exactly the queued records on replayable routes;
|
|
102
|
+
* - a record whose route has declared it not replayable is never re-applied
|
|
103
|
+
* after a resume, because the route said a later boot has no use for it;
|
|
104
|
+
* - a record with no route is terminal by classification, so it never enters a
|
|
105
|
+
* queue and cannot park at the head of one.
|
|
106
|
+
*
|
|
107
|
+
* Those three properties are what previously needed a cursor-barrier
|
|
108
|
+
* predicate, a drop predicate with a second published header, and a
|
|
109
|
+
* discard-the-unclaimed drain respectively.
|
|
110
|
+
*/
|
|
111
|
+
export declare class SessionChannelRouter {
|
|
112
|
+
#private;
|
|
113
|
+
private table;
|
|
114
|
+
constructor(table: SessionRouteTable, options?: {
|
|
115
|
+
/** Called for every dropped record. Reporting only; never load-bearing. */
|
|
116
|
+
onDrop?: (record: SessionStreamRecord, reason: RouterDropReason, route?: string) => void;
|
|
117
|
+
});
|
|
118
|
+
/**
|
|
119
|
+
* Seed the router from a previous run's turn boundary.
|
|
120
|
+
*
|
|
121
|
+
* An absent `appliedThrough` falls back to the floor, which leaves anything
|
|
122
|
+
* above the floor treated as live. A caller resuming a boundary that predates
|
|
123
|
+
* the published replay window should resolve the window from the channel
|
|
124
|
+
* instead, so it covers everything already there at boot: a missed stop is
|
|
125
|
+
* recoverable, while a stop applied to the wrong turn kills a live answer.
|
|
126
|
+
*/
|
|
127
|
+
restore(checkpoint: RouterCheckpoint): void;
|
|
128
|
+
/** Where a boot should subscribe from: just past this sequence. */
|
|
129
|
+
resumeFrom(): number | undefined;
|
|
130
|
+
/**
|
|
131
|
+
* Classify one record and act on it. The record's destination is decided
|
|
132
|
+
* here, once, and never by whichever consumer happens to be waiting.
|
|
133
|
+
*
|
|
134
|
+
* Queued routes serve a waiting consumer before a push handler, so a handler
|
|
135
|
+
* can never take a record out from under a consumer that is actively awaiting
|
|
136
|
+
* one. A record handed straight to either never enters the queue, so it never
|
|
137
|
+
* holds the floor back.
|
|
138
|
+
*/
|
|
139
|
+
ingest(record: SessionStreamRecord): RouterDecision;
|
|
140
|
+
/**
|
|
141
|
+
* The highest sequence that can be resumed past without losing anything.
|
|
142
|
+
*
|
|
143
|
+
* Held back below the earliest record still queued anywhere, because those
|
|
144
|
+
* are exactly the records a replay has to recover. Everything else the
|
|
145
|
+
* router has seen was terminally decided, so the floor is free to sit at the
|
|
146
|
+
* high water when every queue is empty.
|
|
147
|
+
*/
|
|
148
|
+
resumeFloor(): number | undefined;
|
|
149
|
+
/**
|
|
150
|
+
* The high water: highest sequence observed, never held back. Published as
|
|
151
|
+
* the end of the replay window so the next boot can tell a re-read
|
|
152
|
+
* `at-arrival` record from one arriving live.
|
|
153
|
+
*/
|
|
154
|
+
appliedThrough(): number | undefined;
|
|
155
|
+
/** Both published numbers for a turn boundary. */
|
|
156
|
+
checkpoint(): RouterCheckpoint;
|
|
157
|
+
/**
|
|
158
|
+
* Attach a push handler. A `queued` route with a handler attached delivers
|
|
159
|
+
* straight to it instead of queueing; an `at-arrival` route discards records
|
|
160
|
+
* whenever no handler is attached.
|
|
161
|
+
*
|
|
162
|
+
* Attaching re-offers anything already queued, so a consumer that attaches
|
|
163
|
+
* after records have piled up still sees them in order.
|
|
164
|
+
*/
|
|
165
|
+
on(name: string, handler: RouteHandler): {
|
|
166
|
+
off: () => void;
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* Watch a route without consuming from it.
|
|
170
|
+
*
|
|
171
|
+
* Notification and consumption are separate concerns: an observer is told
|
|
172
|
+
* that a record arrived and the record still queues, so the resume floor
|
|
173
|
+
* stays held behind it until something actually takes it. A push handler
|
|
174
|
+
* registered with {@link on} is the opposite, and a record handed to one
|
|
175
|
+
* counts as terminally decided.
|
|
176
|
+
*
|
|
177
|
+
* Only meaningful on a replayable route. On an `at-arrival` route an observer
|
|
178
|
+
* would either have to count as a listener, which would stop an unconsumed
|
|
179
|
+
* record being discarded, or watch records it cannot affect, so it is
|
|
180
|
+
* rejected rather than given one of those two meanings.
|
|
181
|
+
*
|
|
182
|
+
* Records already queued are not re-offered: an observer reports arrivals
|
|
183
|
+
* from the moment it attaches, so re-offering would fire twice for a record
|
|
184
|
+
* that arrived before a later consumer attached.
|
|
185
|
+
*/
|
|
186
|
+
observe(name: string, observer: RouteHandler): {
|
|
187
|
+
off: () => void;
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* Remove one queued record, identified by sequence.
|
|
191
|
+
*
|
|
192
|
+
* For a consumer that decided to take a record it had only observed. Returns
|
|
193
|
+
* whether it was still queued, so a caller can tell a real take from a record
|
|
194
|
+
* something else had already consumed.
|
|
195
|
+
*/
|
|
196
|
+
take(name: string, seqNum: number): SessionStreamRecord | undefined;
|
|
197
|
+
/**
|
|
198
|
+
* Put a taken record back, in sequence order.
|
|
199
|
+
*
|
|
200
|
+
* For a consumer that claimed a record and then could not use it. Returning
|
|
201
|
+
* it leaves the route as though the claim never happened, so the record is
|
|
202
|
+
* delivered later and goes back to holding the resume floor. Without this a
|
|
203
|
+
* failed claim-then-use is indistinguishable from a delivery, and the record
|
|
204
|
+
* is lost.
|
|
205
|
+
*/
|
|
206
|
+
untake(name: string, record: SessionStreamRecord): void;
|
|
207
|
+
/** Whether an `at-arrival` route currently has anywhere to deliver. */
|
|
208
|
+
hasHandler(name: string): boolean;
|
|
209
|
+
/**
|
|
210
|
+
* Take the next record on a route.
|
|
211
|
+
*
|
|
212
|
+
* `timeoutMs: 0` is a non-blocking take. Omitted means wait indefinitely.
|
|
213
|
+
* Resolves `undefined` on timeout. An `at-arrival` route delivers to a
|
|
214
|
+
* waiting caller when one is already parked here, which is what makes a pull
|
|
215
|
+
* consumer possible on such a route without weakening the discard rule.
|
|
216
|
+
*/
|
|
217
|
+
next(name: string, options?: {
|
|
218
|
+
timeoutMs?: number;
|
|
219
|
+
}): Promise<SessionStreamRecord | undefined>;
|
|
220
|
+
/** Head of a route's queue without consuming it. */
|
|
221
|
+
peek(name: string): SessionStreamRecord | undefined;
|
|
222
|
+
/**
|
|
223
|
+
* Whether a route has anything queued. Exact, because it reads that route's
|
|
224
|
+
* own queue rather than the head of a buffer shared with every other kind on
|
|
225
|
+
* the channel.
|
|
226
|
+
*/
|
|
227
|
+
hasPending(name: string): boolean;
|
|
228
|
+
/** Number of records queued on a route. Diagnostic use. */
|
|
229
|
+
pendingCount(name: string): number;
|
|
230
|
+
/**
|
|
231
|
+
* Discard whatever one route has queued and wake its waiters empty.
|
|
232
|
+
*
|
|
233
|
+
* Closes a consumer window: a route that is not replayable has nothing owed
|
|
234
|
+
* to a later boot, so once its window is over anything still queued on it is
|
|
235
|
+
* dead and must not sit at the head of the queue for the rest of the run.
|
|
236
|
+
*/
|
|
237
|
+
clearRoute(name: string): void;
|
|
238
|
+
/** Drop every waiter and queue. Called between task executions. */
|
|
239
|
+
reset(): void;
|
|
240
|
+
}
|
|
241
|
+
export {};
|