@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
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const router_js_1 = require("./router.js");
|
|
5
|
+
const CHAT_TABLE = {
|
|
6
|
+
kindOf: (data) => data?.kind,
|
|
7
|
+
routes: [
|
|
8
|
+
{ name: "messages", delivery: "queue", replayable: true, kinds: ["message"] },
|
|
9
|
+
{ name: "stop", delivery: "at-arrival", replayable: false, kinds: ["stop"] },
|
|
10
|
+
{
|
|
11
|
+
name: "handover",
|
|
12
|
+
delivery: "queue",
|
|
13
|
+
replayable: false,
|
|
14
|
+
kinds: ["handover", "handover-skip"],
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
};
|
|
18
|
+
function router(onDrop) {
|
|
19
|
+
return makeRouter(onDrop);
|
|
20
|
+
}
|
|
21
|
+
function makeRouter(onDrop) {
|
|
22
|
+
return new router_js_1.SessionChannelRouter(CHAT_TABLE, { onDrop });
|
|
23
|
+
}
|
|
24
|
+
function rec(seqNum, kind, text) {
|
|
25
|
+
return { id: `r${seqNum}`, seqNum, data: { kind, ...(text ? { text } : {}) } };
|
|
26
|
+
}
|
|
27
|
+
(0, vitest_1.describe)("SessionChannelRouter: table validation", () => {
|
|
28
|
+
(0, vitest_1.it)("rejects a route that is at-arrival and replayable", () => {
|
|
29
|
+
(0, vitest_1.expect)(() => new router_js_1.SessionChannelRouter({
|
|
30
|
+
kindOf: () => "x",
|
|
31
|
+
routes: [{ name: "bad", delivery: "at-arrival", replayable: true, kinds: ["x"] }],
|
|
32
|
+
})).toThrow(/at-arrival and replayable/);
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)("rejects a kind claimed by two routes", () => {
|
|
35
|
+
(0, vitest_1.expect)(() => new router_js_1.SessionChannelRouter({
|
|
36
|
+
kindOf: () => "x",
|
|
37
|
+
routes: [
|
|
38
|
+
{ name: "a", delivery: "queue", replayable: true, kinds: ["x"] },
|
|
39
|
+
{ name: "b", delivery: "queue", replayable: false, kinds: ["x"] },
|
|
40
|
+
],
|
|
41
|
+
})).toThrow(/claimed by both/);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.describe)("SessionChannelRouter: classification", () => {
|
|
45
|
+
(0, vitest_1.it)("queues a message when nobody is ready for it", () => {
|
|
46
|
+
const r = router();
|
|
47
|
+
(0, vitest_1.expect)(r.ingest(rec(0, "message", "M0"))).toEqual({ action: "queue", route: "messages" });
|
|
48
|
+
(0, vitest_1.expect)(r.hasPending("messages")).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
(0, vitest_1.it)("discards a stop with no handler attached", () => {
|
|
51
|
+
const r = router();
|
|
52
|
+
(0, vitest_1.expect)(r.ingest(rec(0, "stop"))).toEqual({
|
|
53
|
+
action: "drop",
|
|
54
|
+
route: "stop",
|
|
55
|
+
reason: "no-handler",
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
(0, vitest_1.it)("delivers a stop to a live handler", () => {
|
|
59
|
+
const r = router();
|
|
60
|
+
const seen = [];
|
|
61
|
+
r.on("stop", (record) => seen.push(record.seqNum));
|
|
62
|
+
(0, vitest_1.expect)(r.ingest(rec(3, "stop"))).toEqual({ action: "deliver", route: "stop" });
|
|
63
|
+
(0, vitest_1.expect)(seen).toEqual([3]);
|
|
64
|
+
});
|
|
65
|
+
(0, vitest_1.it)("drops a kind no route claims, and reports it once", () => {
|
|
66
|
+
const drops = [];
|
|
67
|
+
const r = router((record, reason) => drops.push([record.seqNum, reason]));
|
|
68
|
+
(0, vitest_1.expect)(r.ingest(rec(1, "some-future-kind"))).toEqual({
|
|
69
|
+
action: "drop",
|
|
70
|
+
reason: "unroutable",
|
|
71
|
+
});
|
|
72
|
+
(0, vitest_1.expect)(drops).toEqual([[1, "unroutable"]]);
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.it)("drops a record with no usable kind", () => {
|
|
75
|
+
const r = router();
|
|
76
|
+
(0, vitest_1.expect)(r.ingest({ id: "x", seqNum: 0, data: { nope: true } })).toEqual({
|
|
77
|
+
action: "drop",
|
|
78
|
+
reason: "malformed",
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.it)("does not let a throwing kindOf take the channel down", () => {
|
|
82
|
+
const r = new router_js_1.SessionChannelRouter({
|
|
83
|
+
kindOf: () => {
|
|
84
|
+
throw new Error("boom");
|
|
85
|
+
},
|
|
86
|
+
routes: [{ name: "m", delivery: "queue", replayable: true, kinds: ["message"] }],
|
|
87
|
+
});
|
|
88
|
+
(0, vitest_1.expect)(r.ingest(rec(0, "message"))).toEqual({ action: "drop", reason: "malformed" });
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
(0, vitest_1.describe)("SessionChannelRouter: the wedge cannot happen", () => {
|
|
92
|
+
(0, vitest_1.it)("delivers a message queued behind an unroutable record", async () => {
|
|
93
|
+
const r = router();
|
|
94
|
+
r.ingest(rec(0, "mystery-kind"));
|
|
95
|
+
r.ingest(rec(1, "message", "M1"));
|
|
96
|
+
(0, vitest_1.expect)(r.hasPending("messages")).toBe(true);
|
|
97
|
+
const taken = await r.next("messages", { timeoutMs: 0 });
|
|
98
|
+
(0, vitest_1.expect)(taken.data.text).toBe("M1");
|
|
99
|
+
});
|
|
100
|
+
(0, vitest_1.it)("reports pending for a message queued behind a stop", () => {
|
|
101
|
+
const r = router();
|
|
102
|
+
r.ingest(rec(0, "stop"));
|
|
103
|
+
r.ingest(rec(1, "message", "M1"));
|
|
104
|
+
(0, vitest_1.expect)(r.hasPending("messages")).toBe(true);
|
|
105
|
+
(0, vitest_1.expect)(r.peek("messages").data.text).toBe("M1");
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
(0, vitest_1.describe)("SessionChannelRouter: delivery ordering", () => {
|
|
109
|
+
(0, vitest_1.it)("serves a parked waiter before a push handler", async () => {
|
|
110
|
+
const r = router();
|
|
111
|
+
const handlerSaw = [];
|
|
112
|
+
const pending = r.next("messages");
|
|
113
|
+
r.on("messages", (record) => handlerSaw.push(record.data.text));
|
|
114
|
+
r.ingest(rec(0, "message", "M0"));
|
|
115
|
+
(0, vitest_1.expect)((await pending)?.seqNum).toBe(0);
|
|
116
|
+
(0, vitest_1.expect)(handlerSaw).toEqual([]);
|
|
117
|
+
});
|
|
118
|
+
(0, vitest_1.it)("re-offers a queued record to a handler attaching later, in order", () => {
|
|
119
|
+
const r = router();
|
|
120
|
+
r.ingest(rec(0, "message", "M0"));
|
|
121
|
+
r.ingest(rec(1, "message", "M1"));
|
|
122
|
+
const seen = [];
|
|
123
|
+
r.on("messages", (record) => seen.push(record.data.text));
|
|
124
|
+
(0, vitest_1.expect)(seen).toEqual(["M0", "M1"]);
|
|
125
|
+
(0, vitest_1.expect)(r.hasPending("messages")).toBe(false);
|
|
126
|
+
});
|
|
127
|
+
(0, vitest_1.it)("resolves next() undefined on timeout without consuming anything", async () => {
|
|
128
|
+
const r = router();
|
|
129
|
+
(0, vitest_1.expect)(await r.next("messages", { timeoutMs: 5 })).toBeUndefined();
|
|
130
|
+
r.ingest(rec(0, "message", "M0"));
|
|
131
|
+
(0, vitest_1.expect)((await r.next("messages", { timeoutMs: 0 }))?.seqNum).toBe(0);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
(0, vitest_1.describe)("SessionChannelRouter: the resume floor", () => {
|
|
135
|
+
(0, vitest_1.it)("sits at the high water when nothing is owed", () => {
|
|
136
|
+
const r = router();
|
|
137
|
+
r.on("stop", () => { });
|
|
138
|
+
r.ingest(rec(0, "message"));
|
|
139
|
+
r.next("messages", { timeoutMs: 0 });
|
|
140
|
+
r.ingest(rec(1, "stop"));
|
|
141
|
+
(0, vitest_1.expect)(r.resumeFloor()).toBe(1);
|
|
142
|
+
(0, vitest_1.expect)(r.appliedThrough()).toBe(1);
|
|
143
|
+
});
|
|
144
|
+
(0, vitest_1.it)("is held below a message still queued, even as control records advance", () => {
|
|
145
|
+
const r = router();
|
|
146
|
+
r.on("stop", () => { });
|
|
147
|
+
r.ingest(rec(0, "message", "M0"));
|
|
148
|
+
r.ingest(rec(1, "message", "M1"));
|
|
149
|
+
r.next("messages", { timeoutMs: 0 });
|
|
150
|
+
r.ingest(rec(2, "stop"));
|
|
151
|
+
r.ingest(rec(3, "stop"));
|
|
152
|
+
(0, vitest_1.expect)(r.resumeFloor()).toBe(0);
|
|
153
|
+
(0, vitest_1.expect)(r.appliedThrough()).toBe(3);
|
|
154
|
+
});
|
|
155
|
+
(0, vitest_1.it)("is undefined rather than negative when the very first record is owed", () => {
|
|
156
|
+
const r = router();
|
|
157
|
+
r.ingest(rec(0, "message", "M0"));
|
|
158
|
+
(0, vitest_1.expect)(r.resumeFloor()).toBeUndefined();
|
|
159
|
+
});
|
|
160
|
+
(0, vitest_1.it)("is not held back by a queued non-replayable record", () => {
|
|
161
|
+
const r = router();
|
|
162
|
+
r.ingest(rec(0, "handover"));
|
|
163
|
+
r.ingest(rec(1, "message", "M1"));
|
|
164
|
+
r.next("messages", { timeoutMs: 0 });
|
|
165
|
+
(0, vitest_1.expect)(r.pendingCount("handover")).toBe(1);
|
|
166
|
+
(0, vitest_1.expect)(r.resumeFloor()).toBe(1);
|
|
167
|
+
});
|
|
168
|
+
(0, vitest_1.it)("advances once the owed message is taken", async () => {
|
|
169
|
+
const r = router();
|
|
170
|
+
r.on("stop", () => { });
|
|
171
|
+
r.ingest(rec(0, "message", "M0"));
|
|
172
|
+
r.ingest(rec(1, "stop"));
|
|
173
|
+
(0, vitest_1.expect)(r.resumeFloor()).toBeUndefined();
|
|
174
|
+
await r.next("messages", { timeoutMs: 0 });
|
|
175
|
+
(0, vitest_1.expect)(r.resumeFloor()).toBe(1);
|
|
176
|
+
});
|
|
177
|
+
(0, vitest_1.it)("tracks the earliest of several owed messages", () => {
|
|
178
|
+
const r = router();
|
|
179
|
+
r.ingest(rec(0, "message", "M0"));
|
|
180
|
+
r.ingest(rec(1, "message", "M1"));
|
|
181
|
+
r.ingest(rec(2, "message", "M2"));
|
|
182
|
+
r.next("messages", { timeoutMs: 0 });
|
|
183
|
+
(0, vitest_1.expect)(r.resumeFloor()).toBe(0);
|
|
184
|
+
(0, vitest_1.expect)(r.appliedThrough()).toBe(2);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
(0, vitest_1.describe)("SessionChannelRouter: resuming", () => {
|
|
188
|
+
(0, vitest_1.it)("does not apply a non-replayable record inside the replay window", () => {
|
|
189
|
+
const r = router();
|
|
190
|
+
r.restore({ resumeFrom: 0, appliedThrough: 2 });
|
|
191
|
+
const stops = [];
|
|
192
|
+
r.on("stop", (record) => stops.push(record.seqNum));
|
|
193
|
+
(0, vitest_1.expect)(r.ingest(rec(1, "message", "M1"))).toEqual({ action: "queue", route: "messages" });
|
|
194
|
+
(0, vitest_1.expect)(r.ingest(rec(2, "stop"))).toEqual({
|
|
195
|
+
action: "drop",
|
|
196
|
+
route: "stop",
|
|
197
|
+
reason: "replayed",
|
|
198
|
+
});
|
|
199
|
+
(0, vitest_1.expect)(stops).toEqual([]);
|
|
200
|
+
});
|
|
201
|
+
(0, vitest_1.it)("applies the same kind arriving live, past the window", () => {
|
|
202
|
+
const r = router();
|
|
203
|
+
r.restore({ resumeFrom: 0, appliedThrough: 2 });
|
|
204
|
+
const stops = [];
|
|
205
|
+
r.on("stop", (record) => stops.push(record.seqNum));
|
|
206
|
+
r.ingest(rec(1, "message", "M1"));
|
|
207
|
+
r.ingest(rec(2, "stop"));
|
|
208
|
+
(0, vitest_1.expect)(r.ingest(rec(3, "stop"))).toEqual({ action: "deliver", route: "stop" });
|
|
209
|
+
(0, vitest_1.expect)(stops).toEqual([3]);
|
|
210
|
+
});
|
|
211
|
+
(0, vitest_1.it)("falls back to the floor when no replay-window end is supplied", () => {
|
|
212
|
+
const r = router();
|
|
213
|
+
r.restore({ resumeFrom: 4 });
|
|
214
|
+
r.on("stop", () => { });
|
|
215
|
+
(0, vitest_1.expect)(r.ingest(rec(4, "stop")).action).toBe("drop");
|
|
216
|
+
(0, vitest_1.expect)(r.ingest(rec(5, "stop"))).toEqual({ action: "deliver", route: "stop" });
|
|
217
|
+
});
|
|
218
|
+
(0, vitest_1.it)("declines a control record inside a window resolved from the channel", () => {
|
|
219
|
+
const r = router();
|
|
220
|
+
// What the chat layer supplies when the boundary predates the published
|
|
221
|
+
// window: everything already on the channel at boot counts as replayed.
|
|
222
|
+
r.restore({ resumeFrom: 4, appliedThrough: 6 });
|
|
223
|
+
const stops = [];
|
|
224
|
+
r.on("stop", (record) => stops.push(record.seqNum));
|
|
225
|
+
(0, vitest_1.expect)(r.ingest(rec(5, "message", "M5"))).toEqual({ action: "queue", route: "messages" });
|
|
226
|
+
(0, vitest_1.expect)(r.ingest(rec(6, "stop"))).toEqual({
|
|
227
|
+
action: "drop",
|
|
228
|
+
route: "stop",
|
|
229
|
+
reason: "replayed",
|
|
230
|
+
});
|
|
231
|
+
(0, vitest_1.expect)(r.ingest(rec(7, "stop"))).toEqual({ action: "deliver", route: "stop" });
|
|
232
|
+
(0, vitest_1.expect)(stops).toEqual([7]);
|
|
233
|
+
});
|
|
234
|
+
(0, vitest_1.it)("applies everything on a fresh session with no checkpoint", () => {
|
|
235
|
+
const r = router();
|
|
236
|
+
r.on("stop", () => { });
|
|
237
|
+
(0, vitest_1.expect)(r.ingest(rec(0, "stop"))).toEqual({ action: "deliver", route: "stop" });
|
|
238
|
+
});
|
|
239
|
+
(0, vitest_1.it)("never drops a replayable record, however far inside the window", () => {
|
|
240
|
+
const r = router();
|
|
241
|
+
r.restore({ resumeFrom: 0, appliedThrough: 9 });
|
|
242
|
+
(0, vitest_1.expect)(r.ingest(rec(1, "message", "M1"))).toEqual({ action: "queue", route: "messages" });
|
|
243
|
+
});
|
|
244
|
+
(0, vitest_1.it)("keeps the floor from moving backwards past the restored point", () => {
|
|
245
|
+
const r = router();
|
|
246
|
+
r.restore({ resumeFrom: 7, appliedThrough: 7 });
|
|
247
|
+
(0, vitest_1.expect)(r.resumeFloor()).toBe(7);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
(0, vitest_1.describe)("SessionChannelRouter: consumer windows", () => {
|
|
251
|
+
(0, vitest_1.it)("queues a handover that arrives before its consumer is ready", async () => {
|
|
252
|
+
const r = router();
|
|
253
|
+
(0, vitest_1.expect)(r.ingest(rec(0, "handover")).action).toBe("queue");
|
|
254
|
+
const taken = await r.next("handover", { timeoutMs: 0 });
|
|
255
|
+
(0, vitest_1.expect)(taken?.seqNum).toBe(0);
|
|
256
|
+
});
|
|
257
|
+
(0, vitest_1.it)("discards what is left on a route when its window closes", () => {
|
|
258
|
+
const r = router();
|
|
259
|
+
r.ingest(rec(0, "handover"));
|
|
260
|
+
r.clearRoute("handover");
|
|
261
|
+
(0, vitest_1.expect)(r.pendingCount("handover")).toBe(0);
|
|
262
|
+
(0, vitest_1.expect)(r.resumeFloor()).toBe(0);
|
|
263
|
+
});
|
|
264
|
+
(0, vitest_1.it)("wakes a waiter empty when its window closes", async () => {
|
|
265
|
+
const r = router();
|
|
266
|
+
const pending = r.next("handover");
|
|
267
|
+
r.clearRoute("handover");
|
|
268
|
+
(0, vitest_1.expect)(await pending).toBeUndefined();
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
/**
|
|
272
|
+
* The invariant the whole design exists to hold: across any interleaving and
|
|
273
|
+
* any crash point, a message is delivered exactly once and a stop is never
|
|
274
|
+
* applied twice.
|
|
275
|
+
*
|
|
276
|
+
* Runs every record sequence over a simulated two-boot lifecycle. The second
|
|
277
|
+
* boot resubscribes from the published floor, exactly as the tail does with
|
|
278
|
+
* `Last-Event-ID`, so a floor that is too high shows up as a lost message and
|
|
279
|
+
* one that replays a stop shows up as a duplicate application.
|
|
280
|
+
*/
|
|
281
|
+
(0, vitest_1.describe)("SessionChannelRouter: exactly-once across a crash", () => {
|
|
282
|
+
const KINDS = ["message", "stop", "handover", "junk"];
|
|
283
|
+
function interleavings(length) {
|
|
284
|
+
if (length === 0)
|
|
285
|
+
return [[]];
|
|
286
|
+
const shorter = interleavings(length - 1);
|
|
287
|
+
const out = [];
|
|
288
|
+
for (const prefix of shorter) {
|
|
289
|
+
for (const kind of KINDS)
|
|
290
|
+
out.push([...prefix, kind]);
|
|
291
|
+
}
|
|
292
|
+
return out;
|
|
293
|
+
}
|
|
294
|
+
function runBoot(records, checkpoint, takeMessages, attachStop) {
|
|
295
|
+
const r = router();
|
|
296
|
+
r.restore(checkpoint);
|
|
297
|
+
const messages = [];
|
|
298
|
+
const stops = [];
|
|
299
|
+
if (attachStop)
|
|
300
|
+
r.on("stop", (record) => stops.push(record.seqNum));
|
|
301
|
+
for (const record of records) {
|
|
302
|
+
if (checkpoint.resumeFrom !== undefined && record.seqNum <= checkpoint.resumeFrom)
|
|
303
|
+
continue;
|
|
304
|
+
r.ingest(record);
|
|
305
|
+
}
|
|
306
|
+
for (let i = 0; i < takeMessages; i++) {
|
|
307
|
+
const head = r.peek("messages");
|
|
308
|
+
if (!head)
|
|
309
|
+
break;
|
|
310
|
+
void r.next("messages", { timeoutMs: 0 });
|
|
311
|
+
messages.push(head.seqNum);
|
|
312
|
+
}
|
|
313
|
+
return { messages, stops, checkpoint: r.checkpoint() };
|
|
314
|
+
}
|
|
315
|
+
(0, vitest_1.it)("delivers every message exactly once and applies no stop twice", () => {
|
|
316
|
+
const cases = interleavings(4);
|
|
317
|
+
(0, vitest_1.expect)(cases.length).toBe(256);
|
|
318
|
+
for (const kinds of cases) {
|
|
319
|
+
const records = kinds.map((kind, index) => rec(index, kind));
|
|
320
|
+
const messageSeqs = records
|
|
321
|
+
.filter((record) => record.data.kind === "message")
|
|
322
|
+
.map((record) => record.seqNum);
|
|
323
|
+
for (let crashAfter = 0; crashAfter <= kinds.length; crashAfter++) {
|
|
324
|
+
const first = runBoot(records, {}, crashAfter, true);
|
|
325
|
+
const second = runBoot(records, first.checkpoint, kinds.length, true);
|
|
326
|
+
const delivered = [...first.messages, ...second.messages];
|
|
327
|
+
(0, vitest_1.expect)(delivered, `messages for [${kinds.join(",")}] crashAfter=${crashAfter}`).toEqual(messageSeqs);
|
|
328
|
+
const appliedTwice = first.stops.filter((seq) => second.stops.includes(seq));
|
|
329
|
+
(0, vitest_1.expect)(appliedTwice, `stops applied twice for [${kinds.join(",")}] crashAfter=${crashAfter}`).toEqual([]);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
(0, vitest_1.describe)("SessionChannelRouter: observe", () => {
|
|
335
|
+
(0, vitest_1.it)("notifies without consuming, so the record still queues and holds the floor", () => {
|
|
336
|
+
const r = router();
|
|
337
|
+
const seen = [];
|
|
338
|
+
r.observe("messages", (record) => seen.push(record.seqNum));
|
|
339
|
+
r.ingest(rec(0, "message"));
|
|
340
|
+
(0, vitest_1.expect)(seen).toEqual([0]);
|
|
341
|
+
(0, vitest_1.expect)(r.hasPending("messages")).toBe(true);
|
|
342
|
+
(0, vitest_1.expect)(r.resumeFloor()).toBeUndefined();
|
|
343
|
+
});
|
|
344
|
+
(0, vitest_1.it)("does not satisfy a queue route's handler delivery", () => {
|
|
345
|
+
const r = router();
|
|
346
|
+
const observed = [];
|
|
347
|
+
const handled = [];
|
|
348
|
+
r.observe("messages", (record) => observed.push(record.seqNum));
|
|
349
|
+
r.ingest(rec(0, "message"));
|
|
350
|
+
(0, vitest_1.expect)(handled).toEqual([]);
|
|
351
|
+
r.on("messages", (record) => handled.push(record.seqNum));
|
|
352
|
+
(0, vitest_1.expect)(handled).toEqual([0]);
|
|
353
|
+
(0, vitest_1.expect)(observed).toEqual([0]);
|
|
354
|
+
});
|
|
355
|
+
(0, vitest_1.it)("rejects an at-arrival route, so a stop with only an observer is still discarded", () => {
|
|
356
|
+
const r = router();
|
|
357
|
+
(0, vitest_1.expect)(() => r.observe("stop", () => { })).toThrow(/at-arrival/);
|
|
358
|
+
});
|
|
359
|
+
(0, vitest_1.it)("does not re-offer records that were already queued when it attached", () => {
|
|
360
|
+
const r = router();
|
|
361
|
+
r.ingest(rec(0, "message"));
|
|
362
|
+
const seen = [];
|
|
363
|
+
r.observe("messages", (record) => seen.push(record.seqNum));
|
|
364
|
+
(0, vitest_1.expect)(seen).toEqual([]);
|
|
365
|
+
r.ingest(rec(1, "message"));
|
|
366
|
+
(0, vitest_1.expect)(seen).toEqual([1]);
|
|
367
|
+
});
|
|
368
|
+
(0, vitest_1.it)("stops notifying after off()", () => {
|
|
369
|
+
const r = router();
|
|
370
|
+
const seen = [];
|
|
371
|
+
const sub = r.observe("messages", (record) => seen.push(record.seqNum));
|
|
372
|
+
r.ingest(rec(0, "message"));
|
|
373
|
+
sub.off();
|
|
374
|
+
r.ingest(rec(1, "message"));
|
|
375
|
+
(0, vitest_1.expect)(seen).toEqual([0]);
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
(0, vitest_1.describe)("SessionChannelRouter: take", () => {
|
|
379
|
+
(0, vitest_1.it)("removes one queued record by sequence and releases the floor", () => {
|
|
380
|
+
const r = router();
|
|
381
|
+
r.ingest(rec(0, "message"));
|
|
382
|
+
r.ingest(rec(1, "message"));
|
|
383
|
+
(0, vitest_1.expect)(r.take("messages", 0)?.seqNum).toBe(0);
|
|
384
|
+
(0, vitest_1.expect)(r.pendingCount("messages")).toBe(1);
|
|
385
|
+
(0, vitest_1.expect)(r.peek("messages")?.seqNum).toBe(1);
|
|
386
|
+
});
|
|
387
|
+
(0, vitest_1.it)("reports false for a record that is no longer queued", () => {
|
|
388
|
+
const r = router();
|
|
389
|
+
r.ingest(rec(0, "message"));
|
|
390
|
+
(0, vitest_1.expect)(r.take("messages", 0)?.seqNum).toBe(0);
|
|
391
|
+
(0, vitest_1.expect)(r.take("messages", 0)).toBeUndefined();
|
|
392
|
+
(0, vitest_1.expect)(r.take("messages", 99)).toBeUndefined();
|
|
393
|
+
});
|
|
394
|
+
(0, vitest_1.it)("leaves an untaken observed record to be delivered as normal", async () => {
|
|
395
|
+
const r = router();
|
|
396
|
+
r.observe("messages", () => { });
|
|
397
|
+
r.ingest(rec(0, "message"));
|
|
398
|
+
r.ingest(rec(1, "message"));
|
|
399
|
+
r.take("messages", 0);
|
|
400
|
+
const next = await r.next("messages", { timeoutMs: 0 });
|
|
401
|
+
(0, vitest_1.expect)(next?.seqNum).toBe(1);
|
|
402
|
+
});
|
|
403
|
+
});
|
|
404
|
+
(0, vitest_1.describe)("SessionChannelRouter: clearRoute guard", () => {
|
|
405
|
+
(0, vitest_1.it)("refuses to clear a replayable route", () => {
|
|
406
|
+
const r = router();
|
|
407
|
+
r.ingest(rec(0, "message"));
|
|
408
|
+
(0, vitest_1.expect)(() => r.clearRoute("messages")).toThrow(/replayable/);
|
|
409
|
+
(0, vitest_1.expect)(r.hasPending("messages")).toBe(true);
|
|
410
|
+
});
|
|
411
|
+
(0, vitest_1.it)("still clears a non-replayable route", () => {
|
|
412
|
+
const r = router();
|
|
413
|
+
r.ingest(rec(0, "handover"));
|
|
414
|
+
(0, vitest_1.expect)(r.hasPending("handover")).toBe(true);
|
|
415
|
+
r.clearRoute("handover");
|
|
416
|
+
(0, vitest_1.expect)(r.hasPending("handover")).toBe(false);
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
(0, vitest_1.describe)("SessionChannelRouter: observe versus a waiting consumer", () => {
|
|
420
|
+
(0, vitest_1.it)("notifies the observer even when a parked puller takes the record", async () => {
|
|
421
|
+
const r = router();
|
|
422
|
+
const seen = [];
|
|
423
|
+
r.observe("messages", (record) => seen.push(record.seqNum));
|
|
424
|
+
const pull = r.next("messages");
|
|
425
|
+
r.ingest(rec(0, "message"));
|
|
426
|
+
const taken = await pull;
|
|
427
|
+
(0, vitest_1.expect)(seen).toEqual([0]);
|
|
428
|
+
(0, vitest_1.expect)(taken?.seqNum).toBe(0);
|
|
429
|
+
(0, vitest_1.expect)(r.hasPending("messages")).toBe(false);
|
|
430
|
+
});
|
|
431
|
+
(0, vitest_1.it)("reports a failed take for a record a puller already consumed", async () => {
|
|
432
|
+
const r = router();
|
|
433
|
+
const seen = [];
|
|
434
|
+
r.observe("messages", (record) => seen.push(record.seqNum));
|
|
435
|
+
const pull = r.next("messages");
|
|
436
|
+
r.ingest(rec(0, "message"));
|
|
437
|
+
await pull;
|
|
438
|
+
(0, vitest_1.expect)(seen).toEqual([0]);
|
|
439
|
+
(0, vitest_1.expect)(r.take("messages", 0)).toBeUndefined();
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
(0, vitest_1.describe)("SessionChannelRouter: untake", () => {
|
|
443
|
+
(0, vitest_1.it)("puts a claimed record back in sequence order", async () => {
|
|
444
|
+
const r = router();
|
|
445
|
+
r.ingest(rec(0, "message"));
|
|
446
|
+
r.ingest(rec(2, "message"));
|
|
447
|
+
const taken = r.take("messages", 0);
|
|
448
|
+
(0, vitest_1.expect)(r.peek("messages")?.seqNum).toBe(2);
|
|
449
|
+
r.untake("messages", taken);
|
|
450
|
+
(0, vitest_1.expect)(r.pendingCount("messages")).toBe(2);
|
|
451
|
+
(0, vitest_1.expect)(r.peek("messages")?.seqNum).toBe(0);
|
|
452
|
+
(0, vitest_1.expect)(r.resumeFloor()).toBeUndefined();
|
|
453
|
+
});
|
|
454
|
+
(0, vitest_1.it)("is idempotent, so a double return cannot duplicate a record", () => {
|
|
455
|
+
const r = router();
|
|
456
|
+
r.ingest(rec(0, "message"));
|
|
457
|
+
const taken = r.take("messages", 0);
|
|
458
|
+
r.untake("messages", taken);
|
|
459
|
+
r.untake("messages", taken);
|
|
460
|
+
(0, vitest_1.expect)(r.pendingCount("messages")).toBe(1);
|
|
461
|
+
});
|
|
462
|
+
});
|
|
463
|
+
//# sourceMappingURL=router.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.test.js","sourceRoot":"","sources":["../../../../src/v3/sessionStreams/router.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,19 @@ import { InputStreamOncePromise, InputStreamTimeoutError } from "../inputStreams
|
|
|
9
9
|
export { InputStreamOncePromise, InputStreamTimeoutError };
|
|
10
10
|
export type { InputStreamOnceResult };
|
|
11
11
|
export type SessionChannelIO = "out" | "in";
|
|
12
|
+
/**
|
|
13
|
+
* One durable Session channel record.
|
|
14
|
+
*
|
|
15
|
+
* `id` is the append's stable idempotency key. `seqNum` is the record's
|
|
16
|
+
* monotonic S2 sequence within the Session channel. Both stay stable when
|
|
17
|
+
* the same record is delivered again after a reconnect.
|
|
18
|
+
*/
|
|
19
|
+
export type SessionStreamRecord<T = unknown> = Readonly<{
|
|
20
|
+
id: string;
|
|
21
|
+
seqNum: number;
|
|
22
|
+
data: T;
|
|
23
|
+
}>;
|
|
24
|
+
export type SessionStreamRecordPredicate = (record: SessionStreamRecord) => boolean;
|
|
12
25
|
/**
|
|
13
26
|
* Manager for Session channel reads: a session-scoped parallel to
|
|
14
27
|
* {@link InputStreamManager} keyed on `(sessionId, io)` instead of
|
|
@@ -29,19 +42,39 @@ export interface SessionStreamManager {
|
|
|
29
42
|
on(sessionId: string, io: SessionChannelIO, handler: (data: unknown) => void | boolean | Promise<void>): {
|
|
30
43
|
off: () => void;
|
|
31
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* Register a handler that receives the full record, including its sequence
|
|
47
|
+
* number. Same consume semantics as {@link on}.
|
|
48
|
+
*/
|
|
49
|
+
onRecord?(sessionId: string, io: SessionChannelIO, handler: (record: SessionStreamRecord) => void | boolean | Promise<void>): {
|
|
50
|
+
off: () => void;
|
|
51
|
+
};
|
|
32
52
|
/** Wait for the next record on the given channel (buffered or live). */
|
|
33
53
|
once(sessionId: string, io: SessionChannelIO, options?: InputStreamOnceOptions): InputStreamOncePromise<unknown>;
|
|
54
|
+
/** Wait for and consume the next record, including its durable metadata. */
|
|
55
|
+
onceRecord?(sessionId: string, io: SessionChannelIO, options?: InputStreamOnceOptions): InputStreamOncePromise<SessionStreamRecord>;
|
|
56
|
+
/**
|
|
57
|
+
* Wait for and consume the next record accepted by `predicate`.
|
|
58
|
+
* Earlier unmatched records stay buffered and block consumption so the
|
|
59
|
+
* committed cursor never advances past them.
|
|
60
|
+
*/
|
|
61
|
+
onceRecordWhere?(sessionId: string, io: SessionChannelIO, predicate: SessionStreamRecordPredicate, options?: InputStreamOnceOptions): InputStreamOncePromise<SessionStreamRecord>;
|
|
34
62
|
/** Non-blocking peek at the head of the channel buffer. */
|
|
35
63
|
peek(sessionId: string, io: SessionChannelIO): unknown | undefined;
|
|
64
|
+
/** Non-blocking peek at the head record, including its durable metadata. */
|
|
65
|
+
peekRecord?(sessionId: string, io: SessionChannelIO): SessionStreamRecord | undefined;
|
|
36
66
|
/** Last S2 sequence number seen on the given channel. */
|
|
37
67
|
lastSeqNum(sessionId: string, io: SessionChannelIO): number | undefined;
|
|
38
68
|
/** Advance the last-seen sequence number (prevents SSE replay after `.wait` resume). */
|
|
39
69
|
setLastSeqNum(sessionId: string, io: SessionChannelIO, seqNum: number): void;
|
|
70
|
+
/** Consume one exact record delivered through the waitpoint path. */
|
|
71
|
+
consumeRecord?(sessionId: string, io: SessionChannelIO, seqNum: number): void;
|
|
40
72
|
/**
|
|
41
|
-
* Highest sequence number that
|
|
42
|
-
*
|
|
43
|
-
* Distinct from {@link lastSeqNum},
|
|
44
|
-
* record regardless of whether anything
|
|
73
|
+
* Highest sequence number that is safe to persist as consumed. When a later
|
|
74
|
+
* record is handled while an earlier record remains unconsumed, this stays
|
|
75
|
+
* behind the earliest unconsumed record. Distinct from {@link lastSeqNum},
|
|
76
|
+
* which advances on every received record regardless of whether anything
|
|
77
|
+
* consumed it. Used by
|
|
45
78
|
* `chat.agent` to persist the `.in` resume cursor on each
|
|
46
79
|
* `turn-complete` control record so the next worker boot can resume
|
|
47
80
|
* the channel from this point without replaying processed messages.
|
|
@@ -50,7 +83,8 @@ export interface SessionStreamManager {
|
|
|
50
83
|
/**
|
|
51
84
|
* Seed the committed-consume cursor at worker boot — e.g. from the
|
|
52
85
|
* `session-in-event-id` header on the latest `turn-complete` on
|
|
53
|
-
* `.out`. Monotonic: only ever advances forward, never backwards.
|
|
86
|
+
* `.out`. Monotonic: only ever advances forward, never backwards. Existing
|
|
87
|
+
* unconsumed records still constrain {@link lastDispatchedSeqNum}.
|
|
54
88
|
*/
|
|
55
89
|
setLastDispatchedSeqNum(sessionId: string, io: SessionChannelIO, seqNum: number): void;
|
|
56
90
|
/**
|
|
@@ -64,8 +98,10 @@ export interface SessionStreamManager {
|
|
|
64
98
|
setMinTimestamp(sessionId: string, io: SessionChannelIO, minTimestamp: number | undefined): void;
|
|
65
99
|
/** Remove and discard the first buffered record. Returns true if one was removed. */
|
|
66
100
|
shiftBuffer(sessionId: string, io: SessionChannelIO): boolean;
|
|
67
|
-
/** Abort the SSE tail
|
|
101
|
+
/** Abort the SSE tail while preserving buffered records. Called before `.wait` suspends. */
|
|
68
102
|
disconnectStream(sessionId: string, io: SessionChannelIO): void;
|
|
103
|
+
/** Re-open a channel closed by {@link disconnectStream}, registering nothing. */
|
|
104
|
+
reconnectStream?(sessionId: string, io: SessionChannelIO): void;
|
|
69
105
|
/** Clear all `.on` handlers; abort tails without pending once-waiters. */
|
|
70
106
|
clearHandlers(): void;
|
|
71
107
|
/** Reset state between task executions. */
|
|
@@ -35,6 +35,17 @@ export declare const SESSION_STATE_LAST_EVENT_ID_HEADER: "last-event-id";
|
|
|
35
35
|
* fresh chat triggered via the wire payload).
|
|
36
36
|
*/
|
|
37
37
|
export declare const SESSION_IN_EVENT_ID_HEADER: "session-in-event-id";
|
|
38
|
+
/**
|
|
39
|
+
* Sibling of {@link SESSION_IN_EVENT_ID_HEADER}: the highest `.in` sequence this
|
|
40
|
+
* run had actually consumed at the turn boundary, unclamped.
|
|
41
|
+
*
|
|
42
|
+
* The resume cursor is held back behind records still waiting to be handled, so
|
|
43
|
+
* resuming from it necessarily re-delivers records that WERE handled. A message
|
|
44
|
+
* re-delivered that way is the point. A control record re-delivered that way is
|
|
45
|
+
* a bug: it applies a second time to whatever turn is live on the new run. On
|
|
46
|
+
* boot this bound tells the run which control records it has already seen.
|
|
47
|
+
*/
|
|
48
|
+
export declare const SESSION_IN_CONSUMED_ID_HEADER: "session-in-consumed-id";
|
|
38
49
|
export declare const TRIGGER_CONTROL_SUBTYPE: {
|
|
39
50
|
readonly TURN_COMPLETE: "turn-complete";
|
|
40
51
|
readonly UPGRADE_REQUIRED: "upgrade-required";
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* customer-facing contract.
|
|
21
21
|
*/
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.TRIGGER_CONTROL_SUBTYPE = exports.SESSION_IN_EVENT_ID_HEADER = exports.SESSION_STATE_LAST_EVENT_ID_HEADER = exports.PUBLIC_ACCESS_TOKEN_HEADER = exports.TRIGGER_CONTROL_HEADER = void 0;
|
|
23
|
+
exports.TRIGGER_CONTROL_SUBTYPE = exports.SESSION_IN_CONSUMED_ID_HEADER = exports.SESSION_IN_EVENT_ID_HEADER = exports.SESSION_STATE_LAST_EVENT_ID_HEADER = exports.PUBLIC_ACCESS_TOKEN_HEADER = exports.TRIGGER_CONTROL_HEADER = void 0;
|
|
24
24
|
exports.headerValue = headerValue;
|
|
25
25
|
exports.controlSubtype = controlSubtype;
|
|
26
26
|
exports.isS2CommandRecord = isS2CommandRecord;
|
|
@@ -41,6 +41,17 @@ exports.SESSION_STATE_LAST_EVENT_ID_HEADER = "last-event-id";
|
|
|
41
41
|
* fresh chat triggered via the wire payload).
|
|
42
42
|
*/
|
|
43
43
|
exports.SESSION_IN_EVENT_ID_HEADER = "session-in-event-id";
|
|
44
|
+
/**
|
|
45
|
+
* Sibling of {@link SESSION_IN_EVENT_ID_HEADER}: the highest `.in` sequence this
|
|
46
|
+
* run had actually consumed at the turn boundary, unclamped.
|
|
47
|
+
*
|
|
48
|
+
* The resume cursor is held back behind records still waiting to be handled, so
|
|
49
|
+
* resuming from it necessarily re-delivers records that WERE handled. A message
|
|
50
|
+
* re-delivered that way is the point. A control record re-delivered that way is
|
|
51
|
+
* a bug: it applies a second time to whatever turn is live on the new run. On
|
|
52
|
+
* boot this bound tells the run which control records it has already seen.
|
|
53
|
+
*/
|
|
54
|
+
exports.SESSION_IN_CONSUMED_ID_HEADER = "session-in-consumed-id";
|
|
44
55
|
exports.TRIGGER_CONTROL_SUBTYPE = {
|
|
45
56
|
TURN_COMPLETE: "turn-complete",
|
|
46
57
|
UPGRADE_REQUIRED: "upgrade-required",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wireProtocol.js","sourceRoot":"","sources":["../../../../src/v3/sessionStreams/wireProtocol.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;;;;AAEH,2EAA2E;AAC9D,QAAA,sBAAsB,GAAG,iBAA0B,CAAC;AAEjE,iFAAiF;AACpE,QAAA,0BAA0B,GAAG,qBAA8B,CAAC;AAEzE,8EAA8E;AACjE,QAAA,kCAAkC,GAAG,eAAwB,CAAC;AAE3E;;;;;;;;;GASG;AACU,QAAA,0BAA0B,GAAG,qBAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"wireProtocol.js","sourceRoot":"","sources":["../../../../src/v3/sessionStreams/wireProtocol.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;;;;AAEH,2EAA2E;AAC9D,QAAA,sBAAsB,GAAG,iBAA0B,CAAC;AAEjE,iFAAiF;AACpE,QAAA,0BAA0B,GAAG,qBAA8B,CAAC;AAEzE,8EAA8E;AACjE,QAAA,kCAAkC,GAAG,eAAwB,CAAC;AAE3E;;;;;;;;;GASG;AACU,QAAA,0BAA0B,GAAG,qBAA8B,CAAC;AAEzE;;;;;;;;;GASG;AACU,QAAA,6BAA6B,GAAG,wBAAiC,CAAC;AAElE,QAAA,uBAAuB,GAAG;IACrC,aAAa,EAAE,eAAe;IAC9B,gBAAgB,EAAE,kBAAkB;CAC5B,CAAC;AAKX,mEAAmE;AACnE,qBACE,OAA6D,EAC7D,IAAY;IAEZ,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,wBACE,OAA6D;IAE7D,OAAO,WAAW,CAAC,OAAO,EAAE,QAAA,sBAAsB,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,2BACE,OAA6D;IAE7D,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AAClC,CAAC"}
|