@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.
Files changed (127) hide show
  1. package/dist/commonjs/v3/apiClient/runStream.d.ts +3 -0
  2. package/dist/commonjs/v3/apiClient/runStream.js +1 -0
  3. package/dist/commonjs/v3/apiClient/runStream.js.map +1 -1
  4. package/dist/commonjs/v3/apiClient/runStream.test.js +1 -0
  5. package/dist/commonjs/v3/apiClient/runStream.test.js.map +1 -1
  6. package/dist/commonjs/v3/isomorphic/friendlyId.d.ts +64 -1
  7. package/dist/commonjs/v3/isomorphic/friendlyId.js +179 -12
  8. package/dist/commonjs/v3/isomorphic/friendlyId.js.map +1 -1
  9. package/dist/commonjs/v3/isomorphic/friendlyId.test.js +283 -1
  10. package/dist/commonjs/v3/isomorphic/friendlyId.test.js.map +1 -1
  11. package/dist/commonjs/v3/isomorphic/index.d.ts +1 -0
  12. package/dist/commonjs/v3/isomorphic/index.js +1 -0
  13. package/dist/commonjs/v3/isomorphic/index.js.map +1 -1
  14. package/dist/commonjs/v3/isomorphic/runOpsResidency.d.ts +21 -7
  15. package/dist/commonjs/v3/isomorphic/runOpsResidency.js +23 -7
  16. package/dist/commonjs/v3/isomorphic/runOpsResidency.js.map +1 -1
  17. package/dist/commonjs/v3/isomorphic/runOpsResidency.test.js +85 -2
  18. package/dist/commonjs/v3/isomorphic/runOpsResidency.test.js.map +1 -1
  19. package/dist/commonjs/v3/isomorphic/waitpointMint.d.ts +9 -0
  20. package/dist/commonjs/v3/isomorphic/waitpointMint.js +22 -0
  21. package/dist/commonjs/v3/isomorphic/waitpointMint.js.map +1 -0
  22. package/dist/commonjs/v3/isomorphic/waitpointMint.test.d.ts +1 -0
  23. package/dist/commonjs/v3/isomorphic/waitpointMint.test.js +97 -0
  24. package/dist/commonjs/v3/isomorphic/waitpointMint.test.js.map +1 -0
  25. package/dist/commonjs/v3/runEngineWorker/workload/schemas.d.ts +54 -54
  26. package/dist/commonjs/v3/schemas/api.d.ts +45 -3
  27. package/dist/commonjs/v3/schemas/api.js +18 -5
  28. package/dist/commonjs/v3/schemas/api.js.map +1 -1
  29. package/dist/commonjs/v3/session-streams-api.d.ts +1 -0
  30. package/dist/commonjs/v3/session-streams-api.js +1 -0
  31. package/dist/commonjs/v3/session-streams-api.js.map +1 -1
  32. package/dist/commonjs/v3/sessionStreams/index.d.ts +9 -1
  33. package/dist/commonjs/v3/sessionStreams/index.js +38 -0
  34. package/dist/commonjs/v3/sessionStreams/index.js.map +1 -1
  35. package/dist/commonjs/v3/sessionStreams/manager.d.ts +27 -2
  36. package/dist/commonjs/v3/sessionStreams/manager.js +202 -108
  37. package/dist/commonjs/v3/sessionStreams/manager.js.map +1 -1
  38. package/dist/commonjs/v3/sessionStreams/manager.test.js +253 -0
  39. package/dist/commonjs/v3/sessionStreams/manager.test.js.map +1 -1
  40. package/dist/commonjs/v3/sessionStreams/noopManager.d.ts +9 -1
  41. package/dist/commonjs/v3/sessionStreams/noopManager.js +18 -0
  42. package/dist/commonjs/v3/sessionStreams/noopManager.js.map +1 -1
  43. package/dist/commonjs/v3/sessionStreams/router.d.ts +241 -0
  44. package/dist/commonjs/v3/sessionStreams/router.js +402 -0
  45. package/dist/commonjs/v3/sessionStreams/router.js.map +1 -0
  46. package/dist/commonjs/v3/sessionStreams/router.test.d.ts +1 -0
  47. package/dist/commonjs/v3/sessionStreams/router.test.js +463 -0
  48. package/dist/commonjs/v3/sessionStreams/router.test.js.map +1 -0
  49. package/dist/commonjs/v3/sessionStreams/types.d.ts +42 -6
  50. package/dist/commonjs/v3/sessionStreams/wireProtocol.d.ts +11 -0
  51. package/dist/commonjs/v3/sessionStreams/wireProtocol.js +12 -1
  52. package/dist/commonjs/v3/sessionStreams/wireProtocol.js.map +1 -1
  53. package/dist/commonjs/v3/test/mock-task-context.d.ts +4 -1
  54. package/dist/commonjs/v3/test/mock-task-context.js +2 -2
  55. package/dist/commonjs/v3/test/mock-task-context.js.map +1 -1
  56. package/dist/commonjs/v3/test/session-waitpoint-backend.js +17 -3
  57. package/dist/commonjs/v3/test/session-waitpoint-backend.js.map +1 -1
  58. package/dist/commonjs/v3/test/test-session-stream-manager.d.ts +13 -2
  59. package/dist/commonjs/v3/test/test-session-stream-manager.js +173 -67
  60. package/dist/commonjs/v3/test/test-session-stream-manager.js.map +1 -1
  61. package/dist/commonjs/v3/utils/globals.js +5 -1
  62. package/dist/commonjs/v3/utils/globals.js.map +1 -1
  63. package/dist/commonjs/version.js +1 -1
  64. package/dist/esm/v3/apiClient/runStream.d.ts +3 -0
  65. package/dist/esm/v3/apiClient/runStream.js +1 -0
  66. package/dist/esm/v3/apiClient/runStream.js.map +1 -1
  67. package/dist/esm/v3/apiClient/runStream.test.js +1 -0
  68. package/dist/esm/v3/apiClient/runStream.test.js.map +1 -1
  69. package/dist/esm/v3/isomorphic/friendlyId.d.ts +64 -1
  70. package/dist/esm/v3/isomorphic/friendlyId.js +170 -11
  71. package/dist/esm/v3/isomorphic/friendlyId.js.map +1 -1
  72. package/dist/esm/v3/isomorphic/friendlyId.test.js +284 -2
  73. package/dist/esm/v3/isomorphic/friendlyId.test.js.map +1 -1
  74. package/dist/esm/v3/isomorphic/index.d.ts +1 -0
  75. package/dist/esm/v3/isomorphic/index.js +1 -0
  76. package/dist/esm/v3/isomorphic/index.js.map +1 -1
  77. package/dist/esm/v3/isomorphic/runOpsResidency.d.ts +21 -7
  78. package/dist/esm/v3/isomorphic/runOpsResidency.js +23 -8
  79. package/dist/esm/v3/isomorphic/runOpsResidency.js.map +1 -1
  80. package/dist/esm/v3/isomorphic/runOpsResidency.test.js +87 -4
  81. package/dist/esm/v3/isomorphic/runOpsResidency.test.js.map +1 -1
  82. package/dist/esm/v3/isomorphic/waitpointMint.d.ts +9 -0
  83. package/dist/esm/v3/isomorphic/waitpointMint.js +18 -0
  84. package/dist/esm/v3/isomorphic/waitpointMint.js.map +1 -0
  85. package/dist/esm/v3/isomorphic/waitpointMint.test.d.ts +1 -0
  86. package/dist/esm/v3/isomorphic/waitpointMint.test.js +95 -0
  87. package/dist/esm/v3/isomorphic/waitpointMint.test.js.map +1 -0
  88. package/dist/esm/v3/runEngineWorker/workload/schemas.d.ts +54 -54
  89. package/dist/esm/v3/schemas/api.d.ts +45 -3
  90. package/dist/esm/v3/schemas/api.js +15 -2
  91. package/dist/esm/v3/schemas/api.js.map +1 -1
  92. package/dist/esm/v3/session-streams-api.d.ts +1 -0
  93. package/dist/esm/v3/session-streams-api.js +1 -0
  94. package/dist/esm/v3/session-streams-api.js.map +1 -1
  95. package/dist/esm/v3/sessionStreams/index.d.ts +9 -1
  96. package/dist/esm/v3/sessionStreams/index.js +38 -0
  97. package/dist/esm/v3/sessionStreams/index.js.map +1 -1
  98. package/dist/esm/v3/sessionStreams/manager.d.ts +27 -2
  99. package/dist/esm/v3/sessionStreams/manager.js +202 -108
  100. package/dist/esm/v3/sessionStreams/manager.js.map +1 -1
  101. package/dist/esm/v3/sessionStreams/manager.test.js +253 -0
  102. package/dist/esm/v3/sessionStreams/manager.test.js.map +1 -1
  103. package/dist/esm/v3/sessionStreams/noopManager.d.ts +9 -1
  104. package/dist/esm/v3/sessionStreams/noopManager.js +18 -0
  105. package/dist/esm/v3/sessionStreams/noopManager.js.map +1 -1
  106. package/dist/esm/v3/sessionStreams/router.d.ts +241 -0
  107. package/dist/esm/v3/sessionStreams/router.js +398 -0
  108. package/dist/esm/v3/sessionStreams/router.js.map +1 -0
  109. package/dist/esm/v3/sessionStreams/router.test.d.ts +1 -0
  110. package/dist/esm/v3/sessionStreams/router.test.js +461 -0
  111. package/dist/esm/v3/sessionStreams/router.test.js.map +1 -0
  112. package/dist/esm/v3/sessionStreams/types.d.ts +42 -6
  113. package/dist/esm/v3/sessionStreams/wireProtocol.d.ts +11 -0
  114. package/dist/esm/v3/sessionStreams/wireProtocol.js +11 -0
  115. package/dist/esm/v3/sessionStreams/wireProtocol.js.map +1 -1
  116. package/dist/esm/v3/test/mock-task-context.d.ts +4 -1
  117. package/dist/esm/v3/test/mock-task-context.js +2 -2
  118. package/dist/esm/v3/test/mock-task-context.js.map +1 -1
  119. package/dist/esm/v3/test/session-waitpoint-backend.js +17 -3
  120. package/dist/esm/v3/test/session-waitpoint-backend.js.map +1 -1
  121. package/dist/esm/v3/test/test-session-stream-manager.d.ts +13 -2
  122. package/dist/esm/v3/test/test-session-stream-manager.js +173 -67
  123. package/dist/esm/v3/test/test-session-stream-manager.js.map +1 -1
  124. package/dist/esm/v3/utils/globals.js +5 -1
  125. package/dist/esm/v3/utils/globals.js.map +1 -1
  126. package/dist/esm/version.js +1 -1
  127. 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 has been *consumed* on the channel —
42
- * delivered to a `once()` waiter or shifted off the buffer into one.
43
- * Distinct from {@link lastSeqNum}, which advances on every received
44
- * record regardless of whether anything consumed it. Used by
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 and clear the buffer. Called before `.wait` suspends. */
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;AAE5D,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"}
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"}