@trigger.dev/core 4.0.7 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/dist/commonjs/v3/apiClient/index.d.ts +24 -4
  2. package/dist/commonjs/v3/apiClient/index.js +48 -4
  3. package/dist/commonjs/v3/apiClient/index.js.map +1 -1
  4. package/dist/commonjs/v3/apiClient/runStream.d.ts +28 -14
  5. package/dist/commonjs/v3/apiClient/runStream.js +175 -58
  6. package/dist/commonjs/v3/apiClient/runStream.js.map +1 -1
  7. package/dist/commonjs/v3/apiClientManager/index.d.ts +1 -1
  8. package/dist/commonjs/v3/apiClientManager/index.js +11 -4
  9. package/dist/commonjs/v3/apiClientManager/index.js.map +1 -1
  10. package/dist/commonjs/v3/apiClientManager/types.d.ts +2 -1
  11. package/dist/commonjs/v3/index.d.ts +1 -0
  12. package/dist/commonjs/v3/index.js +1 -0
  13. package/dist/commonjs/v3/index.js.map +1 -1
  14. package/dist/commonjs/v3/lifecycle-hooks-api.d.ts +1 -1
  15. package/dist/commonjs/v3/lifecycleHooks/index.d.ts +5 -1
  16. package/dist/commonjs/v3/lifecycleHooks/index.js +12 -0
  17. package/dist/commonjs/v3/lifecycleHooks/index.js.map +1 -1
  18. package/dist/commonjs/v3/lifecycleHooks/manager.d.ts +11 -1
  19. package/dist/commonjs/v3/lifecycleHooks/manager.js +36 -0
  20. package/dist/commonjs/v3/lifecycleHooks/manager.js.map +1 -1
  21. package/dist/commonjs/v3/lifecycleHooks/types.d.ts +12 -0
  22. package/dist/commonjs/v3/realtime-streams-api.d.ts +3 -0
  23. package/dist/commonjs/v3/realtime-streams-api.js +23 -0
  24. package/dist/commonjs/v3/realtime-streams-api.js.map +1 -0
  25. package/dist/commonjs/v3/realtimeStreams/index.d.ts +10 -0
  26. package/dist/commonjs/v3/realtimeStreams/index.js +31 -0
  27. package/dist/commonjs/v3/realtimeStreams/index.js.map +1 -0
  28. package/dist/commonjs/v3/realtimeStreams/manager.d.ts +14 -0
  29. package/dist/commonjs/v3/realtimeStreams/manager.js +128 -0
  30. package/dist/commonjs/v3/realtimeStreams/manager.js.map +1 -0
  31. package/dist/commonjs/v3/realtimeStreams/noopManager.d.ts +5 -0
  32. package/dist/commonjs/v3/realtimeStreams/noopManager.js +17 -0
  33. package/dist/commonjs/v3/realtimeStreams/noopManager.js.map +1 -0
  34. package/dist/commonjs/v3/realtimeStreams/streamInstance.d.ts +23 -0
  35. package/dist/commonjs/v3/realtimeStreams/streamInstance.js +106 -0
  36. package/dist/commonjs/v3/realtimeStreams/streamInstance.js.map +1 -0
  37. package/dist/commonjs/v3/realtimeStreams/streamsWriterV1.d.ts +49 -0
  38. package/dist/commonjs/v3/realtimeStreams/streamsWriterV1.js +382 -0
  39. package/dist/commonjs/v3/realtimeStreams/streamsWriterV1.js.map +1 -0
  40. package/dist/commonjs/v3/realtimeStreams/streamsWriterV2.d.ts +60 -0
  41. package/dist/commonjs/v3/realtimeStreams/streamsWriterV2.js +179 -0
  42. package/dist/commonjs/v3/realtimeStreams/streamsWriterV2.js.map +1 -0
  43. package/dist/commonjs/v3/realtimeStreams/types.d.ts +119 -0
  44. package/dist/commonjs/v3/realtimeStreams/types.js +3 -0
  45. package/dist/commonjs/v3/realtimeStreams/types.js.map +1 -0
  46. package/dist/commonjs/v3/runEngineWorker/supervisor/http.d.ts +1 -0
  47. package/dist/commonjs/v3/runEngineWorker/supervisor/schemas.d.ts +7 -0
  48. package/dist/commonjs/v3/runEngineWorker/workload/http.d.ts +1 -0
  49. package/dist/commonjs/v3/runEngineWorker/workload/schemas.d.ts +7 -0
  50. package/dist/commonjs/v3/runMetadata/manager.d.ts +3 -8
  51. package/dist/commonjs/v3/runMetadata/manager.js +14 -79
  52. package/dist/commonjs/v3/runMetadata/manager.js.map +1 -1
  53. package/dist/commonjs/v3/schemas/api.d.ts +22 -0
  54. package/dist/commonjs/v3/schemas/api.js +9 -1
  55. package/dist/commonjs/v3/schemas/api.js.map +1 -1
  56. package/dist/commonjs/v3/schemas/common.d.ts +5 -0
  57. package/dist/commonjs/v3/schemas/common.js +1 -0
  58. package/dist/commonjs/v3/schemas/common.js.map +1 -1
  59. package/dist/commonjs/v3/schemas/messages.d.ts +35 -0
  60. package/dist/commonjs/v3/schemas/runEngine.d.ts +7 -0
  61. package/dist/commonjs/v3/schemas/schemas.d.ts +7 -0
  62. package/dist/commonjs/v3/semanticInternalAttributes.d.ts +1 -0
  63. package/dist/commonjs/v3/semanticInternalAttributes.js +1 -0
  64. package/dist/commonjs/v3/semanticInternalAttributes.js.map +1 -1
  65. package/dist/commonjs/v3/streams/asyncIterableStream.d.ts +2 -0
  66. package/dist/commonjs/v3/streams/asyncIterableStream.js +47 -0
  67. package/dist/commonjs/v3/streams/asyncIterableStream.js.map +1 -1
  68. package/dist/commonjs/v3/types/tasks.d.ts +17 -2
  69. package/dist/commonjs/v3/types/tasks.js.map +1 -1
  70. package/dist/commonjs/v3/utils/globals.d.ts +2 -0
  71. package/dist/commonjs/v3/utils/globals.js.map +1 -1
  72. package/dist/commonjs/v3/waitUntil/index.d.ts +1 -1
  73. package/dist/commonjs/v3/waitUntil/index.js +3 -3
  74. package/dist/commonjs/v3/waitUntil/index.js.map +1 -1
  75. package/dist/commonjs/v3/waitUntil/manager.d.ts +3 -1
  76. package/dist/commonjs/v3/waitUntil/manager.js +7 -3
  77. package/dist/commonjs/v3/waitUntil/manager.js.map +1 -1
  78. package/dist/commonjs/v3/waitUntil/types.d.ts +2 -2
  79. package/dist/commonjs/v3/workers/index.d.ts +1 -0
  80. package/dist/commonjs/v3/workers/index.js +3 -1
  81. package/dist/commonjs/v3/workers/index.js.map +1 -1
  82. package/dist/commonjs/v3/workers/taskExecutor.js +50 -25
  83. package/dist/commonjs/v3/workers/taskExecutor.js.map +1 -1
  84. package/dist/commonjs/version.js +1 -1
  85. package/dist/esm/v3/apiClient/index.d.ts +24 -4
  86. package/dist/esm/v3/apiClient/index.js +49 -6
  87. package/dist/esm/v3/apiClient/index.js.map +1 -1
  88. package/dist/esm/v3/apiClient/runStream.d.ts +28 -14
  89. package/dist/esm/v3/apiClient/runStream.js +176 -58
  90. package/dist/esm/v3/apiClient/runStream.js.map +1 -1
  91. package/dist/esm/v3/apiClientManager/index.d.ts +1 -1
  92. package/dist/esm/v3/apiClientManager/index.js +11 -4
  93. package/dist/esm/v3/apiClientManager/index.js.map +1 -1
  94. package/dist/esm/v3/apiClientManager/types.d.ts +2 -1
  95. package/dist/esm/v3/index.d.ts +1 -0
  96. package/dist/esm/v3/index.js +1 -0
  97. package/dist/esm/v3/index.js.map +1 -1
  98. package/dist/esm/v3/lifecycle-hooks-api.d.ts +1 -1
  99. package/dist/esm/v3/lifecycleHooks/index.d.ts +5 -1
  100. package/dist/esm/v3/lifecycleHooks/index.js +12 -0
  101. package/dist/esm/v3/lifecycleHooks/index.js.map +1 -1
  102. package/dist/esm/v3/lifecycleHooks/manager.d.ts +11 -1
  103. package/dist/esm/v3/lifecycleHooks/manager.js +36 -0
  104. package/dist/esm/v3/lifecycleHooks/manager.js.map +1 -1
  105. package/dist/esm/v3/lifecycleHooks/types.d.ts +12 -0
  106. package/dist/esm/v3/realtime-streams-api.d.ts +3 -0
  107. package/dist/esm/v3/realtime-streams-api.js +6 -0
  108. package/dist/esm/v3/realtime-streams-api.js.map +1 -0
  109. package/dist/esm/v3/realtimeStreams/index.d.ts +10 -0
  110. package/dist/esm/v3/realtimeStreams/index.js +27 -0
  111. package/dist/esm/v3/realtimeStreams/index.js.map +1 -0
  112. package/dist/esm/v3/realtimeStreams/manager.d.ts +14 -0
  113. package/dist/esm/v3/realtimeStreams/manager.js +124 -0
  114. package/dist/esm/v3/realtimeStreams/manager.js.map +1 -0
  115. package/dist/esm/v3/realtimeStreams/noopManager.d.ts +5 -0
  116. package/dist/esm/v3/realtimeStreams/noopManager.js +13 -0
  117. package/dist/esm/v3/realtimeStreams/noopManager.js.map +1 -0
  118. package/dist/esm/v3/realtimeStreams/streamInstance.d.ts +23 -0
  119. package/dist/esm/v3/realtimeStreams/streamInstance.js +102 -0
  120. package/dist/esm/v3/realtimeStreams/streamInstance.js.map +1 -0
  121. package/dist/esm/v3/realtimeStreams/streamsWriterV1.d.ts +49 -0
  122. package/dist/esm/v3/realtimeStreams/streamsWriterV1.js +378 -0
  123. package/dist/esm/v3/realtimeStreams/streamsWriterV1.js.map +1 -0
  124. package/dist/esm/v3/realtimeStreams/streamsWriterV2.d.ts +60 -0
  125. package/dist/esm/v3/realtimeStreams/streamsWriterV2.js +175 -0
  126. package/dist/esm/v3/realtimeStreams/streamsWriterV2.js.map +1 -0
  127. package/dist/esm/v3/realtimeStreams/types.d.ts +119 -0
  128. package/dist/esm/v3/realtimeStreams/types.js +2 -0
  129. package/dist/esm/v3/realtimeStreams/types.js.map +1 -0
  130. package/dist/esm/v3/runEngineWorker/supervisor/http.d.ts +1 -0
  131. package/dist/esm/v3/runEngineWorker/supervisor/schemas.d.ts +7 -0
  132. package/dist/esm/v3/runEngineWorker/workload/http.d.ts +1 -0
  133. package/dist/esm/v3/runEngineWorker/workload/schemas.d.ts +7 -0
  134. package/dist/esm/v3/runMetadata/manager.d.ts +3 -8
  135. package/dist/esm/v3/runMetadata/manager.js +14 -79
  136. package/dist/esm/v3/runMetadata/manager.js.map +1 -1
  137. package/dist/esm/v3/schemas/api.d.ts +22 -0
  138. package/dist/esm/v3/schemas/api.js +8 -0
  139. package/dist/esm/v3/schemas/api.js.map +1 -1
  140. package/dist/esm/v3/schemas/common.d.ts +5 -0
  141. package/dist/esm/v3/schemas/common.js +1 -0
  142. package/dist/esm/v3/schemas/common.js.map +1 -1
  143. package/dist/esm/v3/schemas/messages.d.ts +35 -0
  144. package/dist/esm/v3/schemas/runEngine.d.ts +7 -0
  145. package/dist/esm/v3/schemas/schemas.d.ts +7 -0
  146. package/dist/esm/v3/semanticInternalAttributes.d.ts +1 -0
  147. package/dist/esm/v3/semanticInternalAttributes.js +1 -0
  148. package/dist/esm/v3/semanticInternalAttributes.js.map +1 -1
  149. package/dist/esm/v3/streams/asyncIterableStream.d.ts +2 -0
  150. package/dist/esm/v3/streams/asyncIterableStream.js +45 -0
  151. package/dist/esm/v3/streams/asyncIterableStream.js.map +1 -1
  152. package/dist/esm/v3/types/tasks.d.ts +17 -2
  153. package/dist/esm/v3/types/tasks.js.map +1 -1
  154. package/dist/esm/v3/utils/globals.d.ts +2 -0
  155. package/dist/esm/v3/utils/globals.js.map +1 -1
  156. package/dist/esm/v3/waitUntil/index.d.ts +1 -1
  157. package/dist/esm/v3/waitUntil/index.js +3 -3
  158. package/dist/esm/v3/waitUntil/index.js.map +1 -1
  159. package/dist/esm/v3/waitUntil/manager.d.ts +3 -1
  160. package/dist/esm/v3/waitUntil/manager.js +7 -3
  161. package/dist/esm/v3/waitUntil/manager.js.map +1 -1
  162. package/dist/esm/v3/waitUntil/types.d.ts +2 -2
  163. package/dist/esm/v3/workers/index.d.ts +1 -0
  164. package/dist/esm/v3/workers/index.js +1 -0
  165. package/dist/esm/v3/workers/index.js.map +1 -1
  166. package/dist/esm/v3/workers/taskExecutor.js +50 -25
  167. package/dist/esm/v3/workers/taskExecutor.js.map +1 -1
  168. package/dist/esm/version.js +1 -1
  169. package/package.json +2 -1
  170. package/dist/commonjs/v3/runMetadata/metadataStream.d.ts +0 -28
  171. package/dist/commonjs/v3/runMetadata/metadataStream.js +0 -155
  172. package/dist/commonjs/v3/runMetadata/metadataStream.js.map +0 -1
  173. package/dist/esm/v3/runMetadata/metadataStream.d.ts +0 -28
  174. package/dist/esm/v3/runMetadata/metadataStream.js +0 -151
  175. package/dist/esm/v3/runMetadata/metadataStream.js.map +0 -1
@@ -0,0 +1,382 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StreamsWriterV1 = void 0;
4
+ const node_https_1 = require("node:https");
5
+ const node_http_1 = require("node:http");
6
+ const node_url_1 = require("node:url");
7
+ const node_crypto_1 = require("node:crypto");
8
+ class StreamsWriterV1 {
9
+ options;
10
+ controller = new AbortController();
11
+ serverStream;
12
+ consumerStream;
13
+ streamPromise;
14
+ retryCount = 0;
15
+ maxRetries;
16
+ currentChunkIndex = 0;
17
+ baseDelayMs = 1000; // 1 second base delay
18
+ maxDelayMs = 30000; // 30 seconds max delay
19
+ maxBufferSize;
20
+ clientId;
21
+ ringBuffer = []; // Ring buffer for recent chunks
22
+ bufferStartIndex = 0; // Index of the oldest chunk in buffer
23
+ highestBufferedIndex = -1; // Highest chunk index that's been buffered
24
+ streamReader = null;
25
+ bufferReaderTask = null;
26
+ streamComplete = false;
27
+ constructor(options) {
28
+ this.options = options;
29
+ const [serverStream, consumerStream] = this.options.source.tee();
30
+ this.serverStream = serverStream;
31
+ this.consumerStream = consumerStream;
32
+ this.maxRetries = options.maxRetries ?? 10;
33
+ this.maxBufferSize = options.maxBufferSize ?? 10000; // Default 10000 chunks
34
+ this.clientId = options.clientId || this.generateClientId();
35
+ // Start background task to continuously read from stream into ring buffer
36
+ this.startBuffering();
37
+ this.streamPromise = this.initializeServerStream();
38
+ }
39
+ generateClientId() {
40
+ return (0, node_crypto_1.randomBytes)(4).toString("hex");
41
+ }
42
+ startBuffering() {
43
+ this.streamReader = this.serverStream.getReader();
44
+ this.bufferReaderTask = (async () => {
45
+ try {
46
+ let chunkIndex = 0;
47
+ while (true) {
48
+ const { done, value } = await this.streamReader.read();
49
+ if (done) {
50
+ this.streamComplete = true;
51
+ break;
52
+ }
53
+ // Add to ring buffer
54
+ this.addToRingBuffer(chunkIndex, value);
55
+ this.highestBufferedIndex = chunkIndex;
56
+ chunkIndex++;
57
+ }
58
+ }
59
+ catch (error) {
60
+ throw error;
61
+ }
62
+ })();
63
+ }
64
+ async makeRequest(startFromChunk = 0) {
65
+ return new Promise((resolve, reject) => {
66
+ const url = new node_url_1.URL(this.buildUrl());
67
+ const timeout = 15 * 60 * 1000; // 15 minutes
68
+ const requestFn = url.protocol === "https:" ? node_https_1.request : node_http_1.request;
69
+ const req = requestFn({
70
+ method: "POST",
71
+ hostname: url.hostname,
72
+ port: url.port || (url.protocol === "https:" ? 443 : 80),
73
+ path: url.pathname + url.search,
74
+ headers: {
75
+ ...this.options.headers,
76
+ "Content-Type": "application/json",
77
+ "X-Client-Id": this.clientId,
78
+ "X-Resume-From-Chunk": startFromChunk.toString(),
79
+ "X-Stream-Version": this.options.version ?? "v1",
80
+ },
81
+ timeout,
82
+ });
83
+ req.on("error", async (error) => {
84
+ const errorCode = "code" in error ? error.code : undefined;
85
+ const errorMsg = error instanceof Error ? error.message : String(error);
86
+ // Check if this is a retryable connection error
87
+ if (this.isRetryableError(error)) {
88
+ if (this.retryCount < this.maxRetries) {
89
+ this.retryCount++;
90
+ // Clean up the current request to avoid socket leaks
91
+ req.destroy();
92
+ const delayMs = this.calculateBackoffDelay();
93
+ await this.delay(delayMs);
94
+ // Query server to find out what the last chunk it received was
95
+ const serverLastChunk = await this.queryServerLastChunkIndex();
96
+ // Resume from the next chunk after what the server has
97
+ const resumeFromChunk = serverLastChunk + 1;
98
+ resolve(this.makeRequest(resumeFromChunk));
99
+ return;
100
+ }
101
+ }
102
+ reject(error);
103
+ });
104
+ req.on("timeout", async () => {
105
+ // Timeout is retryable
106
+ if (this.retryCount < this.maxRetries) {
107
+ this.retryCount++;
108
+ // Clean up the current request to avoid socket leaks
109
+ req.destroy();
110
+ const delayMs = this.calculateBackoffDelay();
111
+ await this.delay(delayMs);
112
+ // Query server to find where to resume
113
+ const serverLastChunk = await this.queryServerLastChunkIndex();
114
+ const resumeFromChunk = serverLastChunk + 1;
115
+ resolve(this.makeRequest(resumeFromChunk));
116
+ return;
117
+ }
118
+ req.destroy();
119
+ reject(new Error("Request timed out"));
120
+ });
121
+ req.on("response", async (res) => {
122
+ // Check for retryable status codes (408, 429, 5xx)
123
+ if (res.statusCode && this.isRetryableStatusCode(res.statusCode)) {
124
+ if (this.retryCount < this.maxRetries) {
125
+ this.retryCount++;
126
+ // Drain and destroy the response and request to avoid socket leaks
127
+ // We need to consume the response before destroying it
128
+ res.resume(); // Start draining the response
129
+ res.destroy(); // Destroy the response to free the socket
130
+ req.destroy(); // Destroy the request as well
131
+ const delayMs = this.calculateBackoffDelay();
132
+ await this.delay(delayMs);
133
+ // Query server to find where to resume (in case some data was written)
134
+ const serverLastChunk = await this.queryServerLastChunkIndex();
135
+ const resumeFromChunk = serverLastChunk + 1;
136
+ resolve(this.makeRequest(resumeFromChunk));
137
+ return;
138
+ }
139
+ res.destroy();
140
+ req.destroy();
141
+ reject(new Error(`Max retries (${this.maxRetries}) exceeded for status code ${res.statusCode}`));
142
+ return;
143
+ }
144
+ // Non-retryable error status
145
+ if (res.statusCode && (res.statusCode < 200 || res.statusCode >= 300)) {
146
+ res.destroy();
147
+ req.destroy();
148
+ const error = new Error(`HTTP error! status: ${res.statusCode}`);
149
+ reject(error);
150
+ return;
151
+ }
152
+ // Success! Reset retry count
153
+ this.retryCount = 0;
154
+ res.on("end", () => {
155
+ resolve();
156
+ });
157
+ res.resume();
158
+ });
159
+ if (this.options.signal) {
160
+ this.options.signal.addEventListener("abort", () => {
161
+ req.destroy(new Error("Request aborted"));
162
+ });
163
+ }
164
+ const processStream = async () => {
165
+ try {
166
+ let lastSentIndex = startFromChunk - 1;
167
+ while (true) {
168
+ // Send all chunks that are available in buffer
169
+ while (lastSentIndex < this.highestBufferedIndex) {
170
+ lastSentIndex++;
171
+ const chunk = this.ringBuffer.find((c) => c.index === lastSentIndex);
172
+ if (chunk) {
173
+ const stringified = JSON.stringify(chunk.data) + "\n";
174
+ req.write(stringified);
175
+ this.currentChunkIndex = lastSentIndex + 1;
176
+ }
177
+ }
178
+ // If stream is complete and we've sent all buffered chunks, we're done
179
+ if (this.streamComplete && lastSentIndex >= this.highestBufferedIndex) {
180
+ req.end();
181
+ break;
182
+ }
183
+ // Wait a bit for more chunks to be buffered
184
+ await this.delay(10);
185
+ }
186
+ }
187
+ catch (error) {
188
+ reject(error);
189
+ }
190
+ };
191
+ processStream().catch((error) => {
192
+ reject(error);
193
+ });
194
+ });
195
+ }
196
+ async initializeServerStream() {
197
+ await this.makeRequest(0);
198
+ }
199
+ async wait() {
200
+ return this.streamPromise;
201
+ }
202
+ [Symbol.asyncIterator]() {
203
+ return streamToAsyncIterator(this.consumerStream);
204
+ }
205
+ buildUrl() {
206
+ return `${this.options.baseUrl}/realtime/v1/streams/${this.options.runId}/${this.options.target ?? "self"}/${this.options.key}`;
207
+ }
208
+ isRetryableError(error) {
209
+ if (!error)
210
+ return false;
211
+ // Connection errors that are safe to retry
212
+ const retryableErrors = [
213
+ "ECONNRESET", // Connection reset by peer
214
+ "ECONNREFUSED", // Connection refused
215
+ "ETIMEDOUT", // Connection timed out
216
+ "ENOTFOUND", // DNS lookup failed
217
+ "EPIPE", // Broken pipe
218
+ "EHOSTUNREACH", // Host unreachable
219
+ "ENETUNREACH", // Network unreachable
220
+ "socket hang up", // Socket hang up
221
+ ];
222
+ // Check error code
223
+ if (error.code && retryableErrors.includes(error.code)) {
224
+ return true;
225
+ }
226
+ // Check error message for socket hang up
227
+ if (error.message && error.message.includes("socket hang up")) {
228
+ return true;
229
+ }
230
+ return false;
231
+ }
232
+ isRetryableStatusCode(statusCode) {
233
+ // Retry on transient server errors
234
+ if (statusCode === 408)
235
+ return true; // Request Timeout
236
+ if (statusCode === 429)
237
+ return true; // Rate Limit
238
+ if (statusCode === 500)
239
+ return true; // Internal Server Error
240
+ if (statusCode === 502)
241
+ return true; // Bad Gateway
242
+ if (statusCode === 503)
243
+ return true; // Service Unavailable
244
+ if (statusCode === 504)
245
+ return true; // Gateway Timeout
246
+ return false;
247
+ }
248
+ async delay(ms) {
249
+ return new Promise((resolve) => setTimeout(resolve, ms));
250
+ }
251
+ calculateBackoffDelay() {
252
+ // Exponential backoff with jitter: baseDelay * 2^retryCount + random jitter
253
+ const exponentialDelay = this.baseDelayMs * Math.pow(2, this.retryCount);
254
+ const jitter = Math.random() * 1000; // 0-1000ms jitter
255
+ return Math.min(exponentialDelay + jitter, this.maxDelayMs);
256
+ }
257
+ addToRingBuffer(index, data) {
258
+ const chunk = { index, data };
259
+ if (this.ringBuffer.length < this.maxBufferSize) {
260
+ // Buffer not full yet, just append
261
+ this.ringBuffer.push(chunk);
262
+ }
263
+ else {
264
+ // Buffer full, replace oldest chunk (ring buffer behavior)
265
+ const bufferIndex = index % this.maxBufferSize;
266
+ this.ringBuffer[bufferIndex] = chunk;
267
+ this.bufferStartIndex = Math.max(this.bufferStartIndex, index - this.maxBufferSize + 1);
268
+ }
269
+ }
270
+ getChunksFromBuffer(startIndex) {
271
+ const result = [];
272
+ for (const chunk of this.ringBuffer) {
273
+ if (chunk.index >= startIndex) {
274
+ result.push(chunk);
275
+ }
276
+ }
277
+ // Sort by index to ensure correct order
278
+ result.sort((a, b) => a.index - b.index);
279
+ return result;
280
+ }
281
+ async queryServerLastChunkIndex(attempt = 0) {
282
+ return new Promise((resolve, reject) => {
283
+ const url = new node_url_1.URL(this.buildUrl());
284
+ const maxHeadRetries = 3; // Separate retry limit for HEAD requests
285
+ const requestFn = url.protocol === "https:" ? node_https_1.request : node_http_1.request;
286
+ const req = requestFn({
287
+ method: "HEAD",
288
+ hostname: url.hostname,
289
+ port: url.port || (url.protocol === "https:" ? 443 : 80),
290
+ path: url.pathname + url.search,
291
+ headers: {
292
+ ...this.options.headers,
293
+ "X-Client-Id": this.clientId,
294
+ "X-Stream-Version": this.options.version ?? "v1",
295
+ },
296
+ timeout: 5000, // 5 second timeout for HEAD request
297
+ });
298
+ req.on("error", async (error) => {
299
+ if (this.isRetryableError(error) && attempt < maxHeadRetries) {
300
+ // Clean up the current request to avoid socket leaks
301
+ req.destroy();
302
+ await this.delay(1000 * (attempt + 1)); // Simple linear backoff
303
+ const result = await this.queryServerLastChunkIndex(attempt + 1);
304
+ resolve(result);
305
+ return;
306
+ }
307
+ req.destroy();
308
+ // Return -1 to indicate we don't know what the server has (resume from 0)
309
+ resolve(-1);
310
+ });
311
+ req.on("timeout", async () => {
312
+ req.destroy();
313
+ if (attempt < maxHeadRetries) {
314
+ await this.delay(1000 * (attempt + 1));
315
+ const result = await this.queryServerLastChunkIndex(attempt + 1);
316
+ resolve(result);
317
+ return;
318
+ }
319
+ resolve(-1);
320
+ });
321
+ req.on("response", async (res) => {
322
+ // Retry on 5xx errors
323
+ if (res.statusCode && this.isRetryableStatusCode(res.statusCode)) {
324
+ if (attempt < maxHeadRetries) {
325
+ // Drain and destroy the response and request to avoid socket leaks
326
+ res.resume();
327
+ res.destroy();
328
+ req.destroy();
329
+ await this.delay(1000 * (attempt + 1));
330
+ const result = await this.queryServerLastChunkIndex(attempt + 1);
331
+ resolve(result);
332
+ return;
333
+ }
334
+ res.destroy();
335
+ req.destroy();
336
+ resolve(-1);
337
+ return;
338
+ }
339
+ // Non-retryable error
340
+ if (res.statusCode && (res.statusCode < 200 || res.statusCode >= 300)) {
341
+ res.destroy();
342
+ req.destroy();
343
+ resolve(-1);
344
+ return;
345
+ }
346
+ // Success - extract chunk index
347
+ const lastChunkHeader = res.headers["x-last-chunk-index"];
348
+ if (lastChunkHeader) {
349
+ const lastChunkIndex = parseInt(Array.isArray(lastChunkHeader) ? lastChunkHeader[0] ?? "0" : lastChunkHeader ?? "0", 10);
350
+ resolve(lastChunkIndex);
351
+ }
352
+ else {
353
+ resolve(-1);
354
+ }
355
+ res.resume(); // Consume response
356
+ });
357
+ req.end();
358
+ });
359
+ }
360
+ }
361
+ exports.StreamsWriterV1 = StreamsWriterV1;
362
+ async function* streamToAsyncIterator(stream) {
363
+ const reader = stream.getReader();
364
+ try {
365
+ while (true) {
366
+ const { done, value } = await reader.read();
367
+ if (done)
368
+ return;
369
+ yield value;
370
+ }
371
+ }
372
+ finally {
373
+ safeReleaseLock(reader);
374
+ }
375
+ }
376
+ function safeReleaseLock(reader) {
377
+ try {
378
+ reader.releaseLock();
379
+ }
380
+ catch (error) { }
381
+ }
382
+ //# sourceMappingURL=streamsWriterV1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamsWriterV1.js","sourceRoot":"","sources":["../../../../src/v3/realtimeStreams/streamsWriterV1.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { StreamsWriter } from "./types.js";
2
+ export type StreamsWriterV2Options<T = any> = {
3
+ basin: string;
4
+ stream: string;
5
+ accessToken: string;
6
+ source: ReadableStream<T>;
7
+ signal?: AbortSignal;
8
+ flushIntervalMs?: number;
9
+ maxRetries?: number;
10
+ debug?: boolean;
11
+ maxQueuedBytes?: number;
12
+ };
13
+ /**
14
+ * StreamsWriterV2 writes metadata stream data directly to S2 (https://s2.dev).
15
+ *
16
+ * Features:
17
+ * - Direct streaming: Uses S2's appendSession for efficient streaming
18
+ * - Automatic batching: Uses BatchTransform to batch records
19
+ * - No manual buffering: S2 handles buffering internally
20
+ * - Debug logging: Enable with debug: true to see detailed operation logs
21
+ *
22
+ * Example usage:
23
+ * ```typescript
24
+ * const stream = new StreamsWriterV2({
25
+ * basin: "my-basin",
26
+ * stream: "my-stream",
27
+ * accessToken: "s2-token-here",
28
+ * source: myAsyncIterable,
29
+ * flushIntervalMs: 200, // Optional: batch linger duration in ms
30
+ * debug: true, // Optional: enable debug logging
31
+ * });
32
+ *
33
+ * // Wait for streaming to complete
34
+ * await stream.wait();
35
+ *
36
+ * // Or consume the stream
37
+ * for await (const value of stream) {
38
+ * console.log(value);
39
+ * }
40
+ * ```
41
+ */
42
+ export declare class StreamsWriterV2<T = any> implements StreamsWriter {
43
+ private options;
44
+ private s2Client;
45
+ private serverStream;
46
+ private consumerStream;
47
+ private streamPromise;
48
+ private readonly flushIntervalMs;
49
+ private readonly debug;
50
+ private readonly maxQueuedBytes;
51
+ private aborted;
52
+ private sessionWritable;
53
+ constructor(options: StreamsWriterV2Options<T>);
54
+ private handleAbort;
55
+ private initializeServerStream;
56
+ wait(): Promise<void>;
57
+ [Symbol.asyncIterator](): AsyncIterableIterator<T>;
58
+ private log;
59
+ private logError;
60
+ }
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StreamsWriterV2 = void 0;
4
+ const streamstore_1 = require("@s2-dev/streamstore");
5
+ const nanoid_1 = require("nanoid");
6
+ /**
7
+ * StreamsWriterV2 writes metadata stream data directly to S2 (https://s2.dev).
8
+ *
9
+ * Features:
10
+ * - Direct streaming: Uses S2's appendSession for efficient streaming
11
+ * - Automatic batching: Uses BatchTransform to batch records
12
+ * - No manual buffering: S2 handles buffering internally
13
+ * - Debug logging: Enable with debug: true to see detailed operation logs
14
+ *
15
+ * Example usage:
16
+ * ```typescript
17
+ * const stream = new StreamsWriterV2({
18
+ * basin: "my-basin",
19
+ * stream: "my-stream",
20
+ * accessToken: "s2-token-here",
21
+ * source: myAsyncIterable,
22
+ * flushIntervalMs: 200, // Optional: batch linger duration in ms
23
+ * debug: true, // Optional: enable debug logging
24
+ * });
25
+ *
26
+ * // Wait for streaming to complete
27
+ * await stream.wait();
28
+ *
29
+ * // Or consume the stream
30
+ * for await (const value of stream) {
31
+ * console.log(value);
32
+ * }
33
+ * ```
34
+ */
35
+ class StreamsWriterV2 {
36
+ options;
37
+ s2Client;
38
+ serverStream;
39
+ consumerStream;
40
+ streamPromise;
41
+ flushIntervalMs;
42
+ debug;
43
+ maxQueuedBytes;
44
+ aborted = false;
45
+ sessionWritable = null;
46
+ constructor(options) {
47
+ this.options = options;
48
+ this.debug = options.debug ?? false;
49
+ this.s2Client = new streamstore_1.S2({ accessToken: options.accessToken });
50
+ this.flushIntervalMs = options.flushIntervalMs ?? 200;
51
+ this.maxQueuedBytes = options.maxQueuedBytes ?? 1024 * 1024 * 10; // 10MB default
52
+ this.log(`[S2MetadataStream] Initializing: basin=${options.basin}, stream=${options.stream}, flushIntervalMs=${this.flushIntervalMs}, maxQueuedBytes=${this.maxQueuedBytes}`);
53
+ // Check if already aborted
54
+ if (options.signal?.aborted) {
55
+ this.aborted = true;
56
+ this.log("[S2MetadataStream] Signal already aborted, skipping initialization");
57
+ this.serverStream = new ReadableStream();
58
+ this.consumerStream = new ReadableStream();
59
+ this.streamPromise = Promise.resolve();
60
+ return;
61
+ }
62
+ // Set up abort signal handler
63
+ if (options.signal) {
64
+ options.signal.addEventListener("abort", () => {
65
+ this.log("[S2MetadataStream] Abort signal received");
66
+ this.handleAbort();
67
+ });
68
+ }
69
+ const [serverStream, consumerStream] = this.options.source.tee();
70
+ this.serverStream = serverStream;
71
+ this.consumerStream = consumerStream;
72
+ this.streamPromise = this.initializeServerStream();
73
+ }
74
+ handleAbort() {
75
+ if (this.aborted) {
76
+ return; // Already aborted
77
+ }
78
+ this.aborted = true;
79
+ this.log("[S2MetadataStream] Handling abort - cleaning up resources");
80
+ // Abort the writable stream if it exists
81
+ if (this.sessionWritable) {
82
+ this.sessionWritable
83
+ .abort("Aborted")
84
+ .catch((error) => {
85
+ this.logError("[S2MetadataStream] Error aborting writable stream:", error);
86
+ })
87
+ .finally(() => {
88
+ this.log("[S2MetadataStream] Writable stream aborted");
89
+ });
90
+ }
91
+ this.log("[S2MetadataStream] Abort cleanup complete");
92
+ }
93
+ async initializeServerStream() {
94
+ try {
95
+ if (this.aborted) {
96
+ this.log("[S2MetadataStream] Stream initialization aborted");
97
+ return;
98
+ }
99
+ this.log("[S2MetadataStream] Getting S2 basin and stream");
100
+ const basin = this.s2Client.basin(this.options.basin);
101
+ const stream = basin.stream(this.options.stream);
102
+ const session = await stream.appendSession({
103
+ maxQueuedBytes: this.maxQueuedBytes,
104
+ });
105
+ this.sessionWritable = session.writable;
106
+ this.log(`[S2MetadataStream] Starting stream pipeline`);
107
+ // Convert source stream to AppendRecord format and pipe to S2
108
+ await this.serverStream
109
+ .pipeThrough(new TransformStream({
110
+ transform: (chunk, controller) => {
111
+ if (this.aborted) {
112
+ controller.error(new Error("Stream aborted"));
113
+ return;
114
+ }
115
+ // Convert each chunk to JSON string and wrap in AppendRecord
116
+ controller.enqueue(streamstore_1.AppendRecord.make(JSON.stringify({ data: chunk, id: (0, nanoid_1.nanoid)(7) })));
117
+ },
118
+ }))
119
+ .pipeThrough(new streamstore_1.BatchTransform({
120
+ lingerDurationMillis: this.flushIntervalMs,
121
+ }))
122
+ .pipeTo(session.writable);
123
+ this.log("[S2MetadataStream] Stream pipeline completed successfully");
124
+ // Get final position to verify completion
125
+ const lastAcked = session.lastAckedPosition();
126
+ if (lastAcked?.end) {
127
+ const recordsWritten = lastAcked.end.seq_num;
128
+ this.log(`[S2MetadataStream] Written ${recordsWritten} records, ending at seq_num=${lastAcked.end.seq_num}`);
129
+ }
130
+ }
131
+ catch (error) {
132
+ if (this.aborted) {
133
+ this.log("[S2MetadataStream] Stream error occurred but stream was aborted");
134
+ return;
135
+ }
136
+ this.logError("[S2MetadataStream] Error in stream pipeline:", error);
137
+ throw error;
138
+ }
139
+ }
140
+ async wait() {
141
+ await this.streamPromise;
142
+ }
143
+ [Symbol.asyncIterator]() {
144
+ return streamToAsyncIterator(this.consumerStream);
145
+ }
146
+ // Helper methods
147
+ log(message) {
148
+ if (this.debug) {
149
+ console.log(message);
150
+ }
151
+ }
152
+ logError(message, error) {
153
+ if (this.debug) {
154
+ console.error(message, error);
155
+ }
156
+ }
157
+ }
158
+ exports.StreamsWriterV2 = StreamsWriterV2;
159
+ async function* streamToAsyncIterator(stream) {
160
+ const reader = stream.getReader();
161
+ try {
162
+ while (true) {
163
+ const { done, value } = await reader.read();
164
+ if (done)
165
+ return;
166
+ yield value;
167
+ }
168
+ }
169
+ finally {
170
+ safeReleaseLock(reader);
171
+ }
172
+ }
173
+ function safeReleaseLock(reader) {
174
+ try {
175
+ reader.releaseLock();
176
+ }
177
+ catch (error) { }
178
+ }
179
+ //# sourceMappingURL=streamsWriterV2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamsWriterV2.js","sourceRoot":"","sources":["../../../../src/v3/realtimeStreams/streamsWriterV2.ts"],"names":[],"mappings":"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"}