@ironflow/node 0.20.2 → 0.22.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 (145) hide show
  1. package/dist/agent/agent.d.ts +60 -0
  2. package/dist/agent/agent.d.ts.map +1 -0
  3. package/dist/agent/agent.js +133 -0
  4. package/dist/agent/agent.js.map +1 -0
  5. package/dist/agent/approve.d.ts +23 -0
  6. package/dist/agent/approve.d.ts.map +1 -0
  7. package/dist/agent/approve.js +42 -0
  8. package/dist/agent/approve.js.map +1 -0
  9. package/dist/agent/dispatch.d.ts +63 -0
  10. package/dist/agent/dispatch.d.ts.map +1 -0
  11. package/dist/agent/dispatch.js +130 -0
  12. package/dist/agent/dispatch.js.map +1 -0
  13. package/dist/agent/errors.d.ts +90 -0
  14. package/dist/agent/errors.d.ts.map +1 -0
  15. package/dist/agent/errors.js +136 -0
  16. package/dist/agent/errors.js.map +1 -0
  17. package/dist/agent/index.d.ts +35 -0
  18. package/dist/agent/index.d.ts.map +1 -0
  19. package/dist/agent/index.js +32 -0
  20. package/dist/agent/index.js.map +1 -0
  21. package/dist/agent/internal-registry.d.ts +27 -0
  22. package/dist/agent/internal-registry.d.ts.map +1 -0
  23. package/dist/agent/internal-registry.js +36 -0
  24. package/dist/agent/internal-registry.js.map +1 -0
  25. package/dist/agent/internal.d.ts +24 -0
  26. package/dist/agent/internal.d.ts.map +1 -0
  27. package/dist/agent/internal.js +29 -0
  28. package/dist/agent/internal.js.map +1 -0
  29. package/dist/agent/llm.d.ts +39 -0
  30. package/dist/agent/llm.d.ts.map +1 -0
  31. package/dist/agent/llm.js +59 -0
  32. package/dist/agent/llm.js.map +1 -0
  33. package/dist/agent/mcp.d.ts +51 -0
  34. package/dist/agent/mcp.d.ts.map +1 -0
  35. package/dist/agent/mcp.js +155 -0
  36. package/dist/agent/mcp.js.map +1 -0
  37. package/dist/agent/memory.d.ts +74 -0
  38. package/dist/agent/memory.d.ts.map +1 -0
  39. package/dist/agent/memory.js +130 -0
  40. package/dist/agent/memory.js.map +1 -0
  41. package/dist/agent/spawn.d.ts +20 -0
  42. package/dist/agent/spawn.d.ts.map +1 -0
  43. package/dist/agent/spawn.js +29 -0
  44. package/dist/agent/spawn.js.map +1 -0
  45. package/dist/agent/tool.d.ts +39 -0
  46. package/dist/agent/tool.d.ts.map +1 -0
  47. package/dist/agent/tool.js +103 -0
  48. package/dist/agent/tool.js.map +1 -0
  49. package/dist/agent/types.d.ts +363 -0
  50. package/dist/agent/types.d.ts.map +1 -0
  51. package/dist/agent/types.js +9 -0
  52. package/dist/agent/types.js.map +1 -0
  53. package/dist/client.d.ts +942 -0
  54. package/dist/client.d.ts.map +1 -0
  55. package/dist/client.js +1557 -0
  56. package/dist/client.js.map +1 -0
  57. package/dist/command-dedup.d.ts +61 -0
  58. package/dist/command-dedup.d.ts.map +1 -0
  59. package/dist/command-dedup.js +129 -0
  60. package/dist/command-dedup.js.map +1 -0
  61. package/dist/config-client.d.ts +58 -0
  62. package/dist/config-client.d.ts.map +1 -0
  63. package/dist/config-client.js +171 -0
  64. package/dist/config-client.js.map +1 -0
  65. package/dist/function.d.ts +53 -0
  66. package/dist/function.d.ts.map +1 -0
  67. package/dist/function.js +72 -0
  68. package/dist/function.js.map +1 -0
  69. package/dist/index.d.ts +71 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +70 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/internal/assert-defined.d.ts +10 -0
  74. package/dist/internal/assert-defined.d.ts.map +1 -0
  75. package/dist/internal/assert-defined.js +15 -0
  76. package/dist/internal/assert-defined.js.map +1 -0
  77. package/dist/internal/context.d.ts +142 -0
  78. package/dist/internal/context.d.ts.map +1 -0
  79. package/dist/internal/context.js +306 -0
  80. package/dist/internal/context.js.map +1 -0
  81. package/dist/internal/errors.d.ts +66 -0
  82. package/dist/internal/errors.d.ts.map +1 -0
  83. package/dist/internal/errors.js +29 -0
  84. package/dist/internal/errors.js.map +1 -0
  85. package/dist/internal/run-context.d.ts +10 -0
  86. package/dist/internal/run-context.d.ts.map +1 -0
  87. package/dist/internal/run-context.js +23 -0
  88. package/dist/internal/run-context.js.map +1 -0
  89. package/dist/kv.d.ts +86 -0
  90. package/dist/kv.d.ts.map +1 -0
  91. package/dist/kv.js +261 -0
  92. package/dist/kv.js.map +1 -0
  93. package/dist/projection-runner.d.ts +83 -0
  94. package/dist/projection-runner.d.ts.map +1 -0
  95. package/dist/projection-runner.js +498 -0
  96. package/dist/projection-runner.js.map +1 -0
  97. package/dist/projection.d.ts +36 -0
  98. package/dist/projection.d.ts.map +1 -0
  99. package/dist/projection.js +55 -0
  100. package/dist/projection.js.map +1 -0
  101. package/dist/secrets.d.ts +6 -0
  102. package/dist/secrets.d.ts.map +1 -0
  103. package/dist/secrets.js +19 -0
  104. package/dist/secrets.js.map +1 -0
  105. package/dist/serve.d.ts +71 -0
  106. package/dist/serve.d.ts.map +1 -0
  107. package/dist/serve.js +460 -0
  108. package/dist/serve.js.map +1 -0
  109. package/dist/step.d.ts +18 -0
  110. package/dist/step.d.ts.map +1 -0
  111. package/dist/step.js +581 -0
  112. package/dist/step.js.map +1 -0
  113. package/dist/subscribe.d.ts +164 -0
  114. package/dist/subscribe.d.ts.map +1 -0
  115. package/dist/subscribe.js +487 -0
  116. package/dist/subscribe.js.map +1 -0
  117. package/dist/test/index.d.ts +22 -0
  118. package/dist/test/index.d.ts.map +1 -0
  119. package/dist/test/index.js +112 -0
  120. package/dist/test/index.js.map +1 -0
  121. package/dist/test/test-step.d.ts +21 -0
  122. package/dist/test/test-step.d.ts.map +1 -0
  123. package/dist/test/test-step.js +83 -0
  124. package/dist/test/test-step.js.map +1 -0
  125. package/dist/types.d.ts +108 -0
  126. package/dist/types.d.ts.map +1 -0
  127. package/dist/types.js +5 -0
  128. package/dist/types.js.map +1 -0
  129. package/dist/version.d.ts +2 -0
  130. package/dist/version.d.ts.map +1 -0
  131. package/dist/version.js +4 -0
  132. package/dist/version.js.map +1 -0
  133. package/dist/webhook.d.ts +22 -0
  134. package/dist/webhook.d.ts.map +1 -0
  135. package/dist/webhook.js +23 -0
  136. package/dist/webhook.js.map +1 -0
  137. package/dist/worker-streaming.d.ts +17 -0
  138. package/dist/worker-streaming.d.ts.map +1 -0
  139. package/dist/worker-streaming.js +510 -0
  140. package/dist/worker-streaming.js.map +1 -0
  141. package/dist/worker.d.ts +28 -0
  142. package/dist/worker.d.ts.map +1 -0
  143. package/dist/worker.js +559 -0
  144. package/dist/worker.js.map +1 -0
  145. package/package.json +3 -3
@@ -0,0 +1,498 @@
1
+ // sdk/js/node/src/projection-runner.ts
2
+ /** Micro-batch flush configuration */
3
+ const FLUSH_INTERVAL_MS = 100;
4
+ /** Reusable encoder — TextEncoder is stateless, no need to instantiate per call */
5
+ const textEncoder = new TextEncoder();
6
+ /**
7
+ * Encode a JSON string as a ConnectRPC envelope.
8
+ * Format: 0x00 (flags: uncompressed) + uint32 big-endian length + payload bytes.
9
+ * Required for streaming RPCs; unary RPCs use plain JSON bodies.
10
+ */
11
+ function encodeConnectEnvelope(json) {
12
+ const payload = textEncoder.encode(json);
13
+ const envelope = new Uint8Array(5 + payload.length);
14
+ envelope[0] = 0x00; // flags: uncompressed
15
+ const view = new DataView(envelope.buffer);
16
+ view.setUint32(1, payload.length, false); // big-endian length
17
+ envelope.set(payload, 5);
18
+ return envelope;
19
+ }
20
+ export class ProjectionRunner {
21
+ config;
22
+ running = false;
23
+ backoffMs = 1000;
24
+ // Micro-batch state for streaming mode
25
+ pendingEvents = [];
26
+ flushTimer = null;
27
+ // Serializes flushPending calls to prevent concurrent state mutations
28
+ flushChain = Promise.resolve();
29
+ // In-memory state for managed projections (accumulated across micro-batches)
30
+ managedState = null;
31
+ managedStateInitialized = false;
32
+ constructor(config) {
33
+ this.config = config;
34
+ }
35
+ async register() {
36
+ const { projection, baseUrl, headers } = this.config;
37
+ const resp = await fetch(`${baseUrl}/ironflow.v1.ProjectionService/RegisterProjection`, {
38
+ method: "POST",
39
+ headers: { ...headers, "Content-Type": "application/json" },
40
+ body: JSON.stringify({
41
+ name: projection.config.name,
42
+ events: projection.config.events,
43
+ mode: projection.config.mode,
44
+ version: 1,
45
+ partitionKey: projection.config.partitionKey || "",
46
+ }),
47
+ });
48
+ if (!resp.ok) {
49
+ throw new Error(`Failed to register projection: ${resp.status}`);
50
+ }
51
+ }
52
+ /**
53
+ * Start in streaming mode (preferred). Opens a ConnectRPC server-stream
54
+ * that delivers events in real-time. Falls back to polling if the server
55
+ * returns Unimplemented or the stream fails to connect.
56
+ */
57
+ async startStreaming() {
58
+ this.running = true;
59
+ await this.register();
60
+ const { projection, baseUrl, headers, logger } = this.config;
61
+ const name = projection.config.name;
62
+ logger.info(`Projection runner started (streaming): ${name}`);
63
+ // Initialize managed state from initialState() if available
64
+ if (projection.config.mode === "managed" && projection.config.initialState) {
65
+ this.managedState = projection.config.initialState();
66
+ this.managedStateInitialized = true;
67
+ }
68
+ // Fetch existing state from server to resume from where we left off
69
+ await this.loadExistingState();
70
+ // Track consecutive connection failures so the first drop (often just
71
+ // a proxy/socket idle timeout during quiet periods) logs at info rather
72
+ // than error. Escalates to error after repeated failures — at that
73
+ // point something is actually broken.
74
+ let consecutiveFailures = 0;
75
+ const FAIL_LOG_ESCALATE_AT = 3;
76
+ while (this.running && !this.config.signal?.aborted) {
77
+ try {
78
+ const resp = await fetch(`${baseUrl}/ironflow.v1.ProjectionService/StreamProjectionEvents`, {
79
+ method: "POST",
80
+ headers: {
81
+ ...headers,
82
+ "Content-Type": "application/connect+json",
83
+ },
84
+ body: encodeConnectEnvelope(JSON.stringify({
85
+ name,
86
+ batchSize: projection.config.batchSize || 100,
87
+ // Opt in to server-side keepalive heartbeats. Server emits
88
+ // empty ProjectionEvent frames with kind=HEARTBEAT every
89
+ // ~15s so idle streams don't get closed by proxies/LBs or
90
+ // Node's default fetch socket idle timer.
91
+ acceptHeartbeats: true,
92
+ })),
93
+ signal: this.config.signal,
94
+ });
95
+ if (!resp.ok) {
96
+ const status = resp.status;
97
+ // If server doesn't support streaming, let the caller know to fall back
98
+ if (status === 404 || status === 501) {
99
+ throw new StreamingUnsupportedError(`Server does not support StreamProjectionEvents (${status})`);
100
+ }
101
+ // Auth failures (401/403) are non-transient — break out of the reconnect loop
102
+ if (status === 401 || status === 403) {
103
+ throw new StreamingUnsupportedError(`Stream authentication failed (${status}) — check credentials`);
104
+ }
105
+ throw new Error(`Stream request failed: ${status}`);
106
+ }
107
+ if (!resp.body) {
108
+ throw new Error("No response body for streaming");
109
+ }
110
+ // Read the streaming response using the ConnectRPC streaming envelope format.
111
+ // Each message is: 1 byte flags + 4 bytes big-endian length + JSON payload.
112
+ const reader = resp.body.getReader();
113
+ try {
114
+ let buffer = new Uint8Array(0);
115
+ while (this.running && !this.config.signal?.aborted) {
116
+ const { done, value } = await reader.read();
117
+ if (done)
118
+ break;
119
+ // Successful read — the connection is healthy, so clear the
120
+ // failure counter that gates error-log escalation.
121
+ consecutiveFailures = 0;
122
+ // Append new data to buffer
123
+ const newBuffer = new Uint8Array(buffer.length + value.length);
124
+ newBuffer.set(buffer);
125
+ newBuffer.set(value, buffer.length);
126
+ buffer = newBuffer;
127
+ // Process all complete messages in the buffer
128
+ while (buffer.length >= 5) {
129
+ // ConnectRPC envelope: flags(1) + length(4) + payload(length)
130
+ const dataView = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
131
+ const msgLength = dataView.getUint32(1, false); // big-endian
132
+ const totalLength = 5 + msgLength;
133
+ if (buffer.length < totalLength)
134
+ break; // Incomplete message
135
+ const flags = buffer[0] ?? 0;
136
+ const payload = buffer.slice(5, totalLength);
137
+ buffer = buffer.slice(totalLength);
138
+ // ConnectRPC end-of-stream trailer (flags bit 1 set)
139
+ if (flags & 0x02) {
140
+ const text = new TextDecoder().decode(payload);
141
+ try {
142
+ const trailer = JSON.parse(text);
143
+ if (trailer.error) {
144
+ logger.error(`Stream trailer error: ${trailer.error.message || trailer.error.code}`);
145
+ }
146
+ }
147
+ catch { /* ignore malformed trailers */ }
148
+ break; // End of stream
149
+ }
150
+ const text = new TextDecoder().decode(payload);
151
+ try {
152
+ const event = JSON.parse(text);
153
+ // Skip server-side keepalive heartbeats (issue #550).
154
+ // Proto enum renders as string name in ConnectRPC JSON,
155
+ // but accept the numeric form defensively.
156
+ if (event.kind === "PROJECTION_EVENT_KIND_HEARTBEAT" || event.kind === 2) {
157
+ continue;
158
+ }
159
+ // Normalize field names from protobuf JSON (camelCase)
160
+ const normalized = {
161
+ id: event.id || "",
162
+ name: event.name || "",
163
+ data: event.data,
164
+ seq: typeof event.seq === "string" ? parseInt(event.seq, 10) : (event.seq || 0),
165
+ timestamp: event.timestamp,
166
+ metadata: event.metadata,
167
+ };
168
+ this.enqueueEvent(normalized);
169
+ }
170
+ catch {
171
+ // Skip malformed messages
172
+ logger.warn(`Skipping malformed stream message: ${text.slice(0, 100)}`);
173
+ }
174
+ }
175
+ }
176
+ }
177
+ finally {
178
+ reader.releaseLock();
179
+ // Flush any remaining events
180
+ await this.flushPending();
181
+ }
182
+ // Stream ended normally (server restart, etc.)
183
+ if (this.running) {
184
+ logger.info(`Projection stream ended for ${name}, reconnecting...`);
185
+ await this.sleep(1000);
186
+ }
187
+ }
188
+ catch (err) {
189
+ if (!this.running || this.config.signal?.aborted)
190
+ break;
191
+ // Re-throw StreamingUnsupportedError so caller can fall back to polling
192
+ if (err instanceof StreamingUnsupportedError) {
193
+ throw err;
194
+ }
195
+ consecutiveFailures += 1;
196
+ if (consecutiveFailures < FAIL_LOG_ESCALATE_AT) {
197
+ // First failures are typically idle-timeout reconnects during
198
+ // quiet periods — don't pollute logs. Issue #550.
199
+ logger.info(`Projection stream disconnected for ${name}, reconnecting (attempt ${consecutiveFailures})`);
200
+ }
201
+ else {
202
+ logger.error(`Projection stream error for ${name} (${consecutiveFailures} consecutive failures): ${err}`);
203
+ }
204
+ await this.sleep(2000); // Brief delay before reconnect
205
+ }
206
+ }
207
+ }
208
+ /**
209
+ * Enqueue an event from the stream into the micro-batch.
210
+ * Flushes when batch is full or after FLUSH_INTERVAL_MS of inactivity.
211
+ * Flush calls are serialized via flushChain to prevent concurrent state mutations.
212
+ */
213
+ enqueueEvent(event) {
214
+ this.pendingEvents.push(event);
215
+ const batchSize = this.config.projection.config.batchSize || 100;
216
+ if (this.pendingEvents.length >= batchSize) {
217
+ // Batch full — flush immediately, serialized through the chain
218
+ this.scheduleFlush();
219
+ }
220
+ else if (!this.flushTimer) {
221
+ // Start the flush timer
222
+ this.flushTimer = setTimeout(() => {
223
+ this.flushTimer = null;
224
+ this.scheduleFlush();
225
+ }, FLUSH_INTERVAL_MS);
226
+ }
227
+ }
228
+ /** Serializes flush calls so only one runs at a time */
229
+ scheduleFlush() {
230
+ this.flushChain = this.flushChain.then(() => this.flushPending()).catch(() => { });
231
+ }
232
+ /**
233
+ * Flush pending events through the handler and persist state.
234
+ */
235
+ async flushPending() {
236
+ if (this.flushTimer) {
237
+ clearTimeout(this.flushTimer);
238
+ this.flushTimer = null;
239
+ }
240
+ const events = this.pendingEvents.splice(0);
241
+ if (events.length === 0)
242
+ return;
243
+ const projConfig = this.config.projection.config;
244
+ if (projConfig.mode === "managed") {
245
+ await this.processManagedBatch(events);
246
+ }
247
+ else {
248
+ await this.processExternalBatch(events);
249
+ }
250
+ }
251
+ /**
252
+ * Process a batch of events in managed mode: run reducer, save state.
253
+ */
254
+ async processManagedBatch(events) {
255
+ const projConfig = this.config.projection.config;
256
+ // Group by partition
257
+ const partitions = new Map();
258
+ for (const event of events) {
259
+ const pk = event.metadata?.["__partition"] || "__global__";
260
+ if (!partitions.has(pk)) {
261
+ partitions.set(pk, { events: [], lastEventId: "", lastEventSeq: 0 });
262
+ }
263
+ partitions.get(pk).events.push(event);
264
+ }
265
+ for (const [pk, batch] of partitions) {
266
+ // For __global__ partition, use in-memory accumulated state
267
+ let state;
268
+ if (pk === "__global__" && this.managedStateInitialized) {
269
+ state = this.managedState;
270
+ }
271
+ else {
272
+ state = projConfig.initialState ? projConfig.initialState() : {};
273
+ }
274
+ for (const event of batch.events) {
275
+ const ctx = this.buildContext(event);
276
+ state = projConfig.handler(state, event, ctx);
277
+ batch.lastEventId = event.id;
278
+ batch.lastEventSeq = event.seq;
279
+ batch.lastEventTime = event.timestamp;
280
+ }
281
+ // Update in-memory state for __global__ partition
282
+ if (pk === "__global__") {
283
+ this.managedState = state;
284
+ this.managedStateInitialized = true;
285
+ }
286
+ await this.saveState(state, batch.lastEventId, batch.lastEventSeq, batch.lastEventTime, pk);
287
+ }
288
+ }
289
+ /**
290
+ * Process a batch of events in external mode: run handler, ack.
291
+ */
292
+ async processExternalBatch(events) {
293
+ const projConfig = this.config.projection.config;
294
+ let lastEventId = "";
295
+ let lastEventSeq = 0;
296
+ for (const event of events) {
297
+ const ctx = this.buildContext(event);
298
+ await projConfig.handler(event, ctx);
299
+ lastEventId = event.id;
300
+ lastEventSeq = event.seq;
301
+ }
302
+ await this.ackEvents(lastEventId, lastEventSeq);
303
+ }
304
+ /**
305
+ * Load existing projection state from the server so streaming resumes
306
+ * with the correct accumulated state.
307
+ */
308
+ async loadExistingState() {
309
+ const { projection, baseUrl, headers, logger } = this.config;
310
+ if (projection.config.mode !== "managed")
311
+ return;
312
+ try {
313
+ const resp = await fetch(`${baseUrl}/ironflow.v1.ProjectionService/GetProjection`, {
314
+ method: "POST",
315
+ headers: { ...headers, "Content-Type": "application/json" },
316
+ body: JSON.stringify({ name: projection.config.name }),
317
+ });
318
+ if (resp.ok) {
319
+ const data = await resp.json();
320
+ if (data.state &&
321
+ typeof data.state === "object" &&
322
+ Object.keys(data.state).length > 0) {
323
+ this.managedState = data.state;
324
+ this.managedStateInitialized = true;
325
+ }
326
+ }
327
+ }
328
+ catch (err) {
329
+ logger.warn(`Failed to load existing projection state: ${err}`);
330
+ }
331
+ }
332
+ /**
333
+ * Start in poll mode (fallback). Uses the existing PollProjectionEvents RPC
334
+ * with exponential backoff.
335
+ */
336
+ async start() {
337
+ this.running = true;
338
+ await this.register();
339
+ this.config.logger.info(`Projection runner started: ${this.config.projection.config.name}`);
340
+ while (this.running && !this.config.signal?.aborted) {
341
+ try {
342
+ const processed = await this.poll();
343
+ if (processed > 0) {
344
+ this.backoffMs = 1000; // Reset backoff
345
+ }
346
+ else {
347
+ // Backoff on empty poll
348
+ await this.sleep(this.backoffMs);
349
+ this.backoffMs = Math.min(this.backoffMs * 2, 10000);
350
+ }
351
+ }
352
+ catch (err) {
353
+ this.config.logger.error(`Projection poll error: ${err}`);
354
+ await this.sleep(this.backoffMs);
355
+ this.backoffMs = Math.min(this.backoffMs * 2, 10000);
356
+ }
357
+ }
358
+ }
359
+ async stop() {
360
+ this.running = false;
361
+ if (this.flushTimer) {
362
+ clearTimeout(this.flushTimer);
363
+ this.flushTimer = null;
364
+ }
365
+ // Wait for any in-flight flush, then flush remaining events
366
+ await this.flushChain;
367
+ await this.flushPending();
368
+ }
369
+ async poll() {
370
+ const { projection, baseUrl, headers } = this.config;
371
+ const resp = await fetch(`${baseUrl}/ironflow.v1.ProjectionService/PollProjectionEvents`, {
372
+ method: "POST",
373
+ headers: { ...headers, "Content-Type": "application/json" },
374
+ body: JSON.stringify({
375
+ name: projection.config.name,
376
+ batchSize: projection.config.batchSize || 100,
377
+ }),
378
+ });
379
+ if (!resp.ok)
380
+ throw new Error(`Poll failed: ${resp.status}`);
381
+ const data = (await resp.json());
382
+ const events = data.events || [];
383
+ if (events.length === 0)
384
+ return 0;
385
+ const projConfig = projection.config;
386
+ if (projConfig.mode === "managed") {
387
+ // Managed mode: group events by partition, run reducer per partition, save each.
388
+ const partitions = new Map();
389
+ for (const event of events) {
390
+ const pk = event.metadata?.["__partition"] || "__global__";
391
+ if (!partitions.has(pk)) {
392
+ partitions.set(pk, {
393
+ events: [],
394
+ lastEventId: "",
395
+ lastEventSeq: 0,
396
+ });
397
+ }
398
+ partitions.get(pk).events.push(event);
399
+ }
400
+ for (const [pk, batch] of partitions) {
401
+ // Use currentState from server only for __global__ (non-partitioned).
402
+ let state = pk === "__global__" && data.currentState != null
403
+ ? data.currentState
404
+ : projConfig.initialState
405
+ ? projConfig.initialState()
406
+ : {};
407
+ for (const event of batch.events) {
408
+ const ctx = this.buildContext(event);
409
+ state = projConfig.handler(state, event, ctx);
410
+ batch.lastEventId = event.id;
411
+ batch.lastEventSeq = event.seq;
412
+ batch.lastEventTime = event.timestamp;
413
+ }
414
+ await this.saveState(state, batch.lastEventId, batch.lastEventSeq, batch.lastEventTime, pk);
415
+ }
416
+ }
417
+ else {
418
+ // External mode: run handler for each event, then ack
419
+ let lastEventId = "";
420
+ let lastEventSeq = 0;
421
+ for (const event of events) {
422
+ const ctx = this.buildContext(event);
423
+ await projConfig.handler(event, ctx);
424
+ lastEventId = event.id;
425
+ lastEventSeq = event.seq;
426
+ }
427
+ await this.ackEvents(lastEventId, lastEventSeq);
428
+ }
429
+ return events.length;
430
+ }
431
+ buildContext(event) {
432
+ return {
433
+ event: {
434
+ id: event.id,
435
+ name: event.name,
436
+ seq: event.seq || 0,
437
+ timestamp: event.timestamp ? new Date(event.timestamp) : new Date(),
438
+ metadata: event.metadata,
439
+ },
440
+ projection: {
441
+ name: this.config.projection.config.name,
442
+ version: 1,
443
+ },
444
+ logger: this.config.logger,
445
+ };
446
+ }
447
+ async saveState(state, lastEventId, lastEventSeq, lastEventTime, partitionKey) {
448
+ const { baseUrl, headers, projection } = this.config;
449
+ const resp = await fetch(`${baseUrl}/ironflow.v1.ProjectionService/SaveProjectionState`, {
450
+ method: "POST",
451
+ headers: { ...headers, "Content-Type": "application/json" },
452
+ body: JSON.stringify({
453
+ name: projection.config.name,
454
+ partitionKey: partitionKey ?? "",
455
+ state,
456
+ lastEventId,
457
+ lastEventSeq,
458
+ lastEventTime,
459
+ }),
460
+ });
461
+ if (!resp.ok)
462
+ throw new Error(`Save state failed: ${resp.status}`);
463
+ }
464
+ async ackEvents(lastEventId, lastEventSeq) {
465
+ const { baseUrl, headers, projection } = this.config;
466
+ const resp = await fetch(`${baseUrl}/ironflow.v1.ProjectionService/AckProjectionEvents`, {
467
+ method: "POST",
468
+ headers: { ...headers, "Content-Type": "application/json" },
469
+ body: JSON.stringify({
470
+ name: projection.config.name,
471
+ lastEventId,
472
+ lastEventSeq,
473
+ }),
474
+ });
475
+ if (!resp.ok)
476
+ throw new Error(`Ack events failed: ${resp.status}`);
477
+ }
478
+ sleep(ms) {
479
+ return new Promise((resolve) => {
480
+ const timer = setTimeout(resolve, ms);
481
+ this.config.signal?.addEventListener("abort", () => {
482
+ clearTimeout(timer);
483
+ resolve();
484
+ }, { once: true });
485
+ });
486
+ }
487
+ }
488
+ /** Error thrown when the server doesn't support the streaming RPC */
489
+ export class StreamingUnsupportedError extends Error {
490
+ constructor(message) {
491
+ super(message);
492
+ this.name = "StreamingUnsupportedError";
493
+ }
494
+ }
495
+ export function createProjectionRunner(config) {
496
+ return new ProjectionRunner(config);
497
+ }
498
+ //# sourceMappingURL=projection-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection-runner.js","sourceRoot":"","sources":["../src/projection-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { ProjectionConfig, IronflowProjection } from "@ironflow/core";
2
+ /**
3
+ * Create a projection definition.
4
+ *
5
+ * Projections subscribe to event streams and maintain derived state (managed mode)
6
+ * or trigger side effects (external mode).
7
+ *
8
+ * Mode is auto-detected from the presence of `initialState`:
9
+ * - If `initialState` is provided, mode defaults to "managed"
10
+ * - If `initialState` is absent, mode defaults to "external"
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // Managed projection (maintains state)
15
+ * const orderTotals = createProjection({
16
+ * name: "order-totals",
17
+ * events: ["order.created", "order.updated"],
18
+ * initialState: () => ({ total: 0, count: 0 }),
19
+ * handler: (state, event) => ({
20
+ * total: state.total + event.data.amount,
21
+ * count: state.count + 1,
22
+ * }),
23
+ * });
24
+ *
25
+ * // External projection (side effects)
26
+ * const emailNotifier = createProjection({
27
+ * name: "email-notifier",
28
+ * events: ["order.completed"],
29
+ * handler: async (event, ctx) => {
30
+ * await sendEmail(event.data.email, "Order complete!");
31
+ * },
32
+ * });
33
+ * ```
34
+ */
35
+ export declare function createProjection<TState = unknown, TEvent = unknown>(config: ProjectionConfig<TState, TEvent>): IronflowProjection<TState, TEvent>;
36
+ //# sourceMappingURL=projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AAGxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO,EACjE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,GACvC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBpC"}
@@ -0,0 +1,55 @@
1
+ // sdk/js/node/src/projection.ts
2
+ import { ValidationError } from "@ironflow/core";
3
+ /**
4
+ * Create a projection definition.
5
+ *
6
+ * Projections subscribe to event streams and maintain derived state (managed mode)
7
+ * or trigger side effects (external mode).
8
+ *
9
+ * Mode is auto-detected from the presence of `initialState`:
10
+ * - If `initialState` is provided, mode defaults to "managed"
11
+ * - If `initialState` is absent, mode defaults to "external"
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * // Managed projection (maintains state)
16
+ * const orderTotals = createProjection({
17
+ * name: "order-totals",
18
+ * events: ["order.created", "order.updated"],
19
+ * initialState: () => ({ total: 0, count: 0 }),
20
+ * handler: (state, event) => ({
21
+ * total: state.total + event.data.amount,
22
+ * count: state.count + 1,
23
+ * }),
24
+ * });
25
+ *
26
+ * // External projection (side effects)
27
+ * const emailNotifier = createProjection({
28
+ * name: "email-notifier",
29
+ * events: ["order.completed"],
30
+ * handler: async (event, ctx) => {
31
+ * await sendEmail(event.data.email, "Order complete!");
32
+ * },
33
+ * });
34
+ * ```
35
+ */
36
+ export function createProjection(config) {
37
+ // Validate
38
+ if (!config.name) {
39
+ throw new ValidationError("Projection name is required");
40
+ }
41
+ if (!config.events || config.events.length === 0) {
42
+ throw new ValidationError("Projection must subscribe to at least one event");
43
+ }
44
+ // Auto-detect mode
45
+ const mode = config.mode ?? (config.initialState ? "managed" : "external");
46
+ return {
47
+ config: {
48
+ ...config,
49
+ mode,
50
+ maxRetries: config.maxRetries ?? 3,
51
+ batchSize: config.batchSize ?? 100,
52
+ },
53
+ };
54
+ }
55
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAMhC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAwC;IAExC,WAAW;IACX,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,eAAe,CAAC,6BAA6B,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,eAAe,CAAC,iDAAiD,CAAC,CAAC;IAC/E,CAAC;IAED,mBAAmB;IACnB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAE3E,OAAO;QACL,MAAM,EAAE;YACN,GAAG,MAAM;YACT,IAAI;YACJ,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YAClC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,GAAG;SACnC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SecretsClient } from "@ironflow/core";
2
+ /**
3
+ * Creates a read-only SecretsClient from a resolved secrets map.
4
+ */
5
+ export declare function createSecretsClient(secrets?: Record<string, string>): SecretsClient;
6
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,aAAa,CAcf"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Creates a read-only SecretsClient from a resolved secrets map.
3
+ */
4
+ export function createSecretsClient(secrets) {
5
+ const values = secrets ?? {};
6
+ return {
7
+ get(name) {
8
+ const value = values[name];
9
+ if (value === undefined) {
10
+ throw new Error(`Secret "${name}" not found`);
11
+ }
12
+ return value;
13
+ },
14
+ has(name) {
15
+ return name in values;
16
+ },
17
+ };
18
+ }
19
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAgC;IAEhC,MAAM,MAAM,GAAG,OAAO,IAAI,EAAE,CAAC;IAC7B,OAAO;QACL,GAAG,CAAC,IAAY;YACd,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,aAAa,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,GAAG,CAAC,IAAY;YACd,OAAO,IAAI,IAAI,MAAM,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}