@ironflow/node 0.20.0 → 0.20.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +181 -0
- package/package.json +8 -8
- package/dist/agent/agent.d.ts +0 -60
- package/dist/agent/agent.d.ts.map +0 -1
- package/dist/agent/agent.js +0 -133
- package/dist/agent/agent.js.map +0 -1
- package/dist/agent/approve.d.ts +0 -23
- package/dist/agent/approve.d.ts.map +0 -1
- package/dist/agent/approve.js +0 -42
- package/dist/agent/approve.js.map +0 -1
- package/dist/agent/dispatch.d.ts +0 -63
- package/dist/agent/dispatch.d.ts.map +0 -1
- package/dist/agent/dispatch.js +0 -130
- package/dist/agent/dispatch.js.map +0 -1
- package/dist/agent/errors.d.ts +0 -90
- package/dist/agent/errors.d.ts.map +0 -1
- package/dist/agent/errors.js +0 -136
- package/dist/agent/errors.js.map +0 -1
- package/dist/agent/index.d.ts +0 -30
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/agent/index.js +0 -27
- package/dist/agent/index.js.map +0 -1
- package/dist/agent/internal-registry.d.ts +0 -27
- package/dist/agent/internal-registry.d.ts.map +0 -1
- package/dist/agent/internal-registry.js +0 -36
- package/dist/agent/internal-registry.js.map +0 -1
- package/dist/agent/internal.d.ts +0 -24
- package/dist/agent/internal.d.ts.map +0 -1
- package/dist/agent/internal.js +0 -29
- package/dist/agent/internal.js.map +0 -1
- package/dist/agent/llm.d.ts +0 -39
- package/dist/agent/llm.d.ts.map +0 -1
- package/dist/agent/llm.js +0 -59
- package/dist/agent/llm.js.map +0 -1
- package/dist/agent/mcp.d.ts +0 -51
- package/dist/agent/mcp.d.ts.map +0 -1
- package/dist/agent/mcp.js +0 -155
- package/dist/agent/mcp.js.map +0 -1
- package/dist/agent/memory.d.ts +0 -74
- package/dist/agent/memory.d.ts.map +0 -1
- package/dist/agent/memory.js +0 -130
- package/dist/agent/memory.js.map +0 -1
- package/dist/agent/spawn.d.ts +0 -20
- package/dist/agent/spawn.d.ts.map +0 -1
- package/dist/agent/spawn.js +0 -29
- package/dist/agent/spawn.js.map +0 -1
- package/dist/agent/tool.d.ts +0 -39
- package/dist/agent/tool.d.ts.map +0 -1
- package/dist/agent/tool.js +0 -103
- package/dist/agent/tool.js.map +0 -1
- package/dist/agent/types.d.ts +0 -363
- package/dist/agent/types.d.ts.map +0 -1
- package/dist/agent/types.js +0 -9
- package/dist/agent/types.js.map +0 -1
- package/dist/client.d.ts +0 -942
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -1557
- package/dist/client.js.map +0 -1
- package/dist/command-dedup.d.ts +0 -61
- package/dist/command-dedup.d.ts.map +0 -1
- package/dist/command-dedup.js +0 -129
- package/dist/command-dedup.js.map +0 -1
- package/dist/config-client.d.ts +0 -58
- package/dist/config-client.d.ts.map +0 -1
- package/dist/config-client.js +0 -171
- package/dist/config-client.js.map +0 -1
- package/dist/function.d.ts +0 -53
- package/dist/function.d.ts.map +0 -1
- package/dist/function.js +0 -72
- package/dist/function.js.map +0 -1
- package/dist/index.d.ts +0 -71
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -70
- package/dist/index.js.map +0 -1
- package/dist/internal/assert-defined.d.ts +0 -10
- package/dist/internal/assert-defined.d.ts.map +0 -1
- package/dist/internal/assert-defined.js +0 -15
- package/dist/internal/assert-defined.js.map +0 -1
- package/dist/internal/context.d.ts +0 -142
- package/dist/internal/context.d.ts.map +0 -1
- package/dist/internal/context.js +0 -306
- package/dist/internal/context.js.map +0 -1
- package/dist/internal/errors.d.ts +0 -66
- package/dist/internal/errors.d.ts.map +0 -1
- package/dist/internal/errors.js +0 -29
- package/dist/internal/errors.js.map +0 -1
- package/dist/internal/run-context.d.ts +0 -10
- package/dist/internal/run-context.d.ts.map +0 -1
- package/dist/internal/run-context.js +0 -23
- package/dist/internal/run-context.js.map +0 -1
- package/dist/kv.d.ts +0 -86
- package/dist/kv.d.ts.map +0 -1
- package/dist/kv.js +0 -261
- package/dist/kv.js.map +0 -1
- package/dist/projection-runner.d.ts +0 -83
- package/dist/projection-runner.d.ts.map +0 -1
- package/dist/projection-runner.js +0 -498
- package/dist/projection-runner.js.map +0 -1
- package/dist/projection.d.ts +0 -36
- package/dist/projection.d.ts.map +0 -1
- package/dist/projection.js +0 -55
- package/dist/projection.js.map +0 -1
- package/dist/secrets.d.ts +0 -6
- package/dist/secrets.d.ts.map +0 -1
- package/dist/secrets.js +0 -19
- package/dist/secrets.js.map +0 -1
- package/dist/serve.d.ts +0 -71
- package/dist/serve.d.ts.map +0 -1
- package/dist/serve.js +0 -460
- package/dist/serve.js.map +0 -1
- package/dist/step.d.ts +0 -18
- package/dist/step.d.ts.map +0 -1
- package/dist/step.js +0 -581
- package/dist/step.js.map +0 -1
- package/dist/subscribe.d.ts +0 -164
- package/dist/subscribe.d.ts.map +0 -1
- package/dist/subscribe.js +0 -487
- package/dist/subscribe.js.map +0 -1
- package/dist/test/index.d.ts +0 -22
- package/dist/test/index.d.ts.map +0 -1
- package/dist/test/index.js +0 -112
- package/dist/test/index.js.map +0 -1
- package/dist/test/test-step.d.ts +0 -21
- package/dist/test/test-step.d.ts.map +0 -1
- package/dist/test/test-step.js +0 -83
- package/dist/test/test-step.js.map +0 -1
- package/dist/types.d.ts +0 -108
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -5
- package/dist/types.js.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -4
- package/dist/version.js.map +0 -1
- package/dist/webhook.d.ts +0 -22
- package/dist/webhook.d.ts.map +0 -1
- package/dist/webhook.js +0 -23
- package/dist/webhook.js.map +0 -1
- package/dist/worker-streaming.d.ts +0 -17
- package/dist/worker-streaming.d.ts.map +0 -1
- package/dist/worker-streaming.js +0 -510
- package/dist/worker-streaming.js.map +0 -1
- package/dist/worker.d.ts +0 -28
- package/dist/worker.d.ts.map +0 -1
- package/dist/worker.js +0 -559
- package/dist/worker.js.map +0 -1
|
@@ -1,498 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"projection-runner.js","sourceRoot":"","sources":["../src/projection-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/projection.d.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
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
|
package/dist/projection.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/projection.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
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
|
package/dist/projection.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/secrets.d.ts
DELETED
package/dist/secrets.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/secrets.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
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
|
package/dist/secrets.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|