@ironflow/node 0.19.3 → 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/README.md +5 -2
- package/package.json +20 -14
- package/dist/client.d.ts +0 -924
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -1526
- 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 -56
- 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/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 -470
- 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 -434
- 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 -540
- package/dist/worker.js.map +0 -1
package/dist/worker.js
DELETED
|
@@ -1,540 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ironflow Worker Client
|
|
3
|
-
*
|
|
4
|
-
* Pull mode worker that polls the Ironflow server for jobs.
|
|
5
|
-
*/
|
|
6
|
-
import { IronflowError, JobAssignmentSchema, createLogger, createNoopLogger, DEFAULT_SERVER_URL, DEFAULT_WORKER, HEADERS, DEFAULT_ENVIRONMENT, } from "@ironflow/core";
|
|
7
|
-
import { ExecutionContext } from "./internal/context.js";
|
|
8
|
-
import { createStepClient, executeCompensations } from "./step.js";
|
|
9
|
-
import { isYieldSignal } from "./internal/errors.js";
|
|
10
|
-
import { createProjectionRunner, StreamingUnsupportedError } from "./projection-runner.js";
|
|
11
|
-
import { createSecretsClient } from "./secrets.js";
|
|
12
|
-
import { withRunContext } from "./internal/run-context.js";
|
|
13
|
-
import { SDK_VERSION } from "./version.js";
|
|
14
|
-
/**
|
|
15
|
-
* Create a worker for Pull mode execution
|
|
16
|
-
*
|
|
17
|
-
* @example
|
|
18
|
-
* ```typescript
|
|
19
|
-
* import { createWorker } from "@ironflow/node/worker";
|
|
20
|
-
*
|
|
21
|
-
* const worker = createWorker({
|
|
22
|
-
* serverUrl: "http://localhost:9123",
|
|
23
|
-
* functions: [myFunction],
|
|
24
|
-
* maxConcurrentJobs: 4,
|
|
25
|
-
* });
|
|
26
|
-
*
|
|
27
|
-
* await worker.start();
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export function createWorker(config) {
|
|
31
|
-
return new IronflowWorker(config);
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Worker implementation using REST HTTP polling
|
|
35
|
-
*/
|
|
36
|
-
class IronflowWorker {
|
|
37
|
-
config;
|
|
38
|
-
functionMap;
|
|
39
|
-
workerId;
|
|
40
|
-
maxConcurrentJobs;
|
|
41
|
-
heartbeatInterval;
|
|
42
|
-
reconnectDelay;
|
|
43
|
-
logger;
|
|
44
|
-
environment;
|
|
45
|
-
apiKey;
|
|
46
|
-
state = "idle";
|
|
47
|
-
activeJobs = new Map();
|
|
48
|
-
heartbeatTimer;
|
|
49
|
-
abortController;
|
|
50
|
-
projectionRunners = [];
|
|
51
|
-
constructor(config) {
|
|
52
|
-
this.config = {
|
|
53
|
-
...config,
|
|
54
|
-
serverUrl: config.serverUrl || DEFAULT_SERVER_URL,
|
|
55
|
-
};
|
|
56
|
-
this.workerId = generateWorkerId();
|
|
57
|
-
this.maxConcurrentJobs =
|
|
58
|
-
config.maxConcurrentJobs ?? DEFAULT_WORKER.MAX_CONCURRENT_JOBS;
|
|
59
|
-
this.heartbeatInterval =
|
|
60
|
-
config.heartbeatInterval ?? DEFAULT_WORKER.HEARTBEAT_INTERVAL_MS;
|
|
61
|
-
this.reconnectDelay =
|
|
62
|
-
config.reconnectDelay ?? DEFAULT_WORKER.RECONNECT_DELAY_MS;
|
|
63
|
-
this.environment =
|
|
64
|
-
config.environment ?? process.env.IRONFLOW_ENV ?? DEFAULT_ENVIRONMENT;
|
|
65
|
-
this.apiKey = config.apiKey ?? process.env.IRONFLOW_API_KEY;
|
|
66
|
-
// Initialize logger
|
|
67
|
-
if (config.logger === false) {
|
|
68
|
-
this.logger = createNoopLogger();
|
|
69
|
-
}
|
|
70
|
-
else if (config.logger) {
|
|
71
|
-
this.logger = config.logger;
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
this.logger = createLogger({ prefix: "[ironflow-worker]" });
|
|
75
|
-
}
|
|
76
|
-
// Build function map
|
|
77
|
-
this.functionMap = new Map();
|
|
78
|
-
for (const fn of config.functions) {
|
|
79
|
-
if (this.functionMap.has(fn.config.id)) {
|
|
80
|
-
this.logger.warn(`Duplicate function ID "${fn.config.id}" — the later definition will overwrite the earlier one. ` +
|
|
81
|
-
"Each function should have a unique ID.");
|
|
82
|
-
}
|
|
83
|
-
this.functionMap.set(fn.config.id, fn);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Start the worker (blocks until stopped)
|
|
88
|
-
*/
|
|
89
|
-
async start() {
|
|
90
|
-
if (this.state !== "idle") {
|
|
91
|
-
throw new IronflowError("Worker is already running", {
|
|
92
|
-
code: "WORKER_ALREADY_RUNNING",
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
this.state = "connecting";
|
|
96
|
-
this.abortController = new AbortController();
|
|
97
|
-
this.logger.info(`Starting worker ${this.workerId} with ${this.functionMap.size} functions`);
|
|
98
|
-
// Connect loop with auto-reconnect
|
|
99
|
-
// Use explicit type annotation to allow state changes from other methods
|
|
100
|
-
while (this.state !== "stopped") {
|
|
101
|
-
try {
|
|
102
|
-
await this.connect();
|
|
103
|
-
}
|
|
104
|
-
catch (error) {
|
|
105
|
-
if (this.state === "stopped") {
|
|
106
|
-
break;
|
|
107
|
-
}
|
|
108
|
-
this.logger.error("Connection error", { error: String(error) });
|
|
109
|
-
this.logger.info(`Reconnecting in ${this.reconnectDelay}ms...`);
|
|
110
|
-
await this.sleep(this.reconnectDelay);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
this.logger.info("Worker stopped");
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Gracefully drain and stop
|
|
117
|
-
*/
|
|
118
|
-
async drain() {
|
|
119
|
-
if (this.state === "stopped" || this.state === "idle") {
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
this.logger.info("Draining worker...");
|
|
123
|
-
this.state = "draining";
|
|
124
|
-
// Wait for active jobs to complete
|
|
125
|
-
while (this.activeJobs.size > 0) {
|
|
126
|
-
this.logger.info(`Waiting for ${this.activeJobs.size} jobs to complete...`);
|
|
127
|
-
await this.sleep(1000);
|
|
128
|
-
}
|
|
129
|
-
this.stop();
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Force stop immediately
|
|
133
|
-
*/
|
|
134
|
-
stop() {
|
|
135
|
-
this.state = "stopped";
|
|
136
|
-
this.abortController?.abort();
|
|
137
|
-
if (this.heartbeatTimer) {
|
|
138
|
-
clearInterval(this.heartbeatTimer);
|
|
139
|
-
this.heartbeatTimer = undefined;
|
|
140
|
-
}
|
|
141
|
-
// Stop projection runners
|
|
142
|
-
for (const runner of this.projectionRunners) {
|
|
143
|
-
runner.stop().catch(() => { });
|
|
144
|
-
}
|
|
145
|
-
this.projectionRunners = [];
|
|
146
|
-
// Cancel all active jobs
|
|
147
|
-
for (const job of this.activeJobs.values()) {
|
|
148
|
-
job.abortController.abort();
|
|
149
|
-
}
|
|
150
|
-
this.activeJobs.clear();
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Build common headers including environment
|
|
154
|
-
*/
|
|
155
|
-
buildHeaders() {
|
|
156
|
-
const headers = {
|
|
157
|
-
"Content-Type": "application/json",
|
|
158
|
-
[HEADERS.ENVIRONMENT]: this.environment,
|
|
159
|
-
};
|
|
160
|
-
if (this.apiKey) {
|
|
161
|
-
headers["Authorization"] = `Bearer ${this.apiKey}`;
|
|
162
|
-
}
|
|
163
|
-
return headers;
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Establish connection to the Ironflow server
|
|
167
|
-
*/
|
|
168
|
-
async connect() {
|
|
169
|
-
this.state = "connecting";
|
|
170
|
-
// Clean up from previous connection (e.g. after server restart)
|
|
171
|
-
if (this.heartbeatTimer) {
|
|
172
|
-
clearInterval(this.heartbeatTimer);
|
|
173
|
-
this.heartbeatTimer = undefined;
|
|
174
|
-
}
|
|
175
|
-
for (const runner of this.projectionRunners) {
|
|
176
|
-
runner.stop().catch(() => { });
|
|
177
|
-
}
|
|
178
|
-
this.projectionRunners = [];
|
|
179
|
-
const baseUrl = this.config.serverUrl.replace(/\/$/, "");
|
|
180
|
-
// Register functions so the event router can find them
|
|
181
|
-
await this.registerFunctions(baseUrl);
|
|
182
|
-
// Register worker
|
|
183
|
-
await this.registerWorker(baseUrl);
|
|
184
|
-
this.state = "connected";
|
|
185
|
-
this.logger.info("Connected to server");
|
|
186
|
-
// Start projection runners (if any)
|
|
187
|
-
this.startProjectionRunners(baseUrl);
|
|
188
|
-
// Start heartbeat
|
|
189
|
-
this.startHeartbeat(baseUrl);
|
|
190
|
-
// Poll for jobs
|
|
191
|
-
await this.pollForJobs(baseUrl);
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Register all worker functions with the Ironflow server
|
|
195
|
-
*/
|
|
196
|
-
async registerFunctions(baseUrl) {
|
|
197
|
-
for (const [fnId, fn] of this.functionMap) {
|
|
198
|
-
const body = {
|
|
199
|
-
id: fn.config.id,
|
|
200
|
-
name: fn.config.name || fn.config.id,
|
|
201
|
-
triggers: fn.config.triggers || [],
|
|
202
|
-
preferredMode: "EXECUTION_MODE_PULL",
|
|
203
|
-
};
|
|
204
|
-
if (fn.config.description)
|
|
205
|
-
body.description = fn.config.description;
|
|
206
|
-
if (fn.config.retry)
|
|
207
|
-
body.retry = fn.config.retry;
|
|
208
|
-
if (fn.config.timeout)
|
|
209
|
-
body.timeoutMs = fn.config.timeout;
|
|
210
|
-
if (fn.config.concurrency)
|
|
211
|
-
body.concurrency = fn.config.concurrency;
|
|
212
|
-
if (fn.config.actorKey)
|
|
213
|
-
body.actorKey = fn.config.actorKey;
|
|
214
|
-
if (fn.config.recording != null)
|
|
215
|
-
body.recording = fn.config.recording;
|
|
216
|
-
if (fn.config.recordingRetention != null)
|
|
217
|
-
body.recordingRetention = fn.config.recordingRetention;
|
|
218
|
-
if (fn.config.pauseBehavior)
|
|
219
|
-
body.pauseBehavior = fn.config.pauseBehavior;
|
|
220
|
-
if (fn.config.metadata)
|
|
221
|
-
body.metadata = fn.config.metadata;
|
|
222
|
-
if (fn.config.secrets?.length)
|
|
223
|
-
body.secrets = fn.config.secrets;
|
|
224
|
-
const response = await fetch(`${baseUrl}/ironflow.v1.IronflowService/RegisterFunction`, {
|
|
225
|
-
method: "POST",
|
|
226
|
-
headers: this.buildHeaders(),
|
|
227
|
-
body: JSON.stringify(body),
|
|
228
|
-
signal: this.abortController?.signal,
|
|
229
|
-
});
|
|
230
|
-
if (!response.ok) {
|
|
231
|
-
throw new IronflowError(`Failed to register function ${fnId}: ${response.status}`, { code: "FUNCTION_REGISTRATION_FAILED" });
|
|
232
|
-
}
|
|
233
|
-
this.logger.info(`Registered function: ${fnId}`);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Register the worker with the Ironflow server
|
|
238
|
-
*/
|
|
239
|
-
async registerWorker(baseUrl) {
|
|
240
|
-
const functionIds = Array.from(this.functionMap.keys());
|
|
241
|
-
const response = await fetch(`${baseUrl}/api/v1/workers/${this.workerId}/register`, {
|
|
242
|
-
method: "POST",
|
|
243
|
-
headers: this.buildHeaders(),
|
|
244
|
-
body: JSON.stringify({
|
|
245
|
-
worker_id: this.workerId,
|
|
246
|
-
hostname: getHostname(),
|
|
247
|
-
function_ids: functionIds,
|
|
248
|
-
max_concurrent_jobs: this.maxConcurrentJobs,
|
|
249
|
-
labels: this.config.labels ?? {},
|
|
250
|
-
version: {
|
|
251
|
-
sdk: SDK_VERSION,
|
|
252
|
-
runtime: `node-${process.version}`,
|
|
253
|
-
},
|
|
254
|
-
}),
|
|
255
|
-
signal: this.abortController?.signal,
|
|
256
|
-
});
|
|
257
|
-
if (!response.ok) {
|
|
258
|
-
throw new IronflowError("Failed to register worker", {
|
|
259
|
-
code: "REGISTRATION_FAILED",
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Start projection runners in background
|
|
265
|
-
*/
|
|
266
|
-
startProjectionRunners(baseUrl) {
|
|
267
|
-
if (!this.config.projections?.length) {
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
for (const proj of this.config.projections) {
|
|
271
|
-
const runner = createProjectionRunner({
|
|
272
|
-
projection: proj,
|
|
273
|
-
baseUrl,
|
|
274
|
-
headers: this.buildHeaders(),
|
|
275
|
-
logger: this.logger,
|
|
276
|
-
signal: this.abortController?.signal,
|
|
277
|
-
});
|
|
278
|
-
this.projectionRunners.push(runner);
|
|
279
|
-
// Try streaming first, fall back to polling if unsupported
|
|
280
|
-
runner.startStreaming().catch((err) => {
|
|
281
|
-
if (err instanceof StreamingUnsupportedError) {
|
|
282
|
-
this.logger.info(`Streaming not available for ${proj.config.name}, falling back to polling`);
|
|
283
|
-
runner.start().catch((pollErr) => {
|
|
284
|
-
this.logger.error(`Projection runner failed: ${pollErr}`);
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
else {
|
|
288
|
-
this.logger.error(`Projection runner failed: ${err}`);
|
|
289
|
-
}
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
this.logger.info(`Started ${this.config.projections.length} projection runner(s)`);
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Start the heartbeat interval
|
|
296
|
-
*/
|
|
297
|
-
startHeartbeat(baseUrl) {
|
|
298
|
-
this.heartbeatTimer = setInterval(async () => {
|
|
299
|
-
if (this.state !== "connected") {
|
|
300
|
-
return;
|
|
301
|
-
}
|
|
302
|
-
try {
|
|
303
|
-
await fetch(`${baseUrl}/api/v1/workers/${this.workerId}/heartbeat`, {
|
|
304
|
-
method: "POST",
|
|
305
|
-
headers: this.buildHeaders(),
|
|
306
|
-
body: JSON.stringify({
|
|
307
|
-
worker_id: this.workerId,
|
|
308
|
-
active_jobs: this.activeJobs.size,
|
|
309
|
-
jobs: Array.from(this.activeJobs.values()).map((job) => ({
|
|
310
|
-
job_id: job.jobId,
|
|
311
|
-
started_at: job.startedAt.toISOString(),
|
|
312
|
-
})),
|
|
313
|
-
}),
|
|
314
|
-
signal: this.abortController?.signal,
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
catch (error) {
|
|
318
|
-
this.logger.warn("Heartbeat failed", { error: String(error) });
|
|
319
|
-
}
|
|
320
|
-
}, this.heartbeatInterval);
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Continuously poll the server for available jobs
|
|
324
|
-
*/
|
|
325
|
-
async pollForJobs(baseUrl) {
|
|
326
|
-
while (this.state === "connected") {
|
|
327
|
-
// Check capacity
|
|
328
|
-
if (this.activeJobs.size >= this.maxConcurrentJobs) {
|
|
329
|
-
await this.sleep(1000);
|
|
330
|
-
continue;
|
|
331
|
-
}
|
|
332
|
-
try {
|
|
333
|
-
// Request a job
|
|
334
|
-
const response = await fetch(`${baseUrl}/api/v1/workers/${this.workerId}/jobs`, {
|
|
335
|
-
method: "GET",
|
|
336
|
-
headers: this.buildHeaders(),
|
|
337
|
-
signal: this.abortController?.signal,
|
|
338
|
-
});
|
|
339
|
-
if (response.status === 204) {
|
|
340
|
-
// No jobs available
|
|
341
|
-
await this.sleep(1000);
|
|
342
|
-
continue;
|
|
343
|
-
}
|
|
344
|
-
if (response.status === 404) {
|
|
345
|
-
// Worker or function not registered — server likely restarted.
|
|
346
|
-
// Break polling so connect() returns and start() re-registers.
|
|
347
|
-
this.logger.warn("Worker not found on server (404) — will re-register");
|
|
348
|
-
this.state = "connecting";
|
|
349
|
-
return;
|
|
350
|
-
}
|
|
351
|
-
if (!response.ok) {
|
|
352
|
-
throw new Error(`Failed to get job: ${response.status}`);
|
|
353
|
-
}
|
|
354
|
-
// Parse and validate job assignment
|
|
355
|
-
const rawJob = await response.json();
|
|
356
|
-
const result = JobAssignmentSchema.safeParse(rawJob);
|
|
357
|
-
if (!result.success) {
|
|
358
|
-
const issues = result.error.issues
|
|
359
|
-
.map((i) => `${i.path.join(".")}: ${i.message}`)
|
|
360
|
-
.join(", ");
|
|
361
|
-
this.logger.error(`Invalid job assignment: ${issues}`);
|
|
362
|
-
await this.sleep(1000);
|
|
363
|
-
continue;
|
|
364
|
-
}
|
|
365
|
-
// Process the validated job
|
|
366
|
-
this.processJob(baseUrl, result.data);
|
|
367
|
-
}
|
|
368
|
-
catch (error) {
|
|
369
|
-
if (this.state !== "connected") {
|
|
370
|
-
break;
|
|
371
|
-
}
|
|
372
|
-
this.logger.warn("Job polling error", { error: String(error) });
|
|
373
|
-
await this.sleep(5000);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
/**
|
|
378
|
-
* Start processing a job asynchronously
|
|
379
|
-
*/
|
|
380
|
-
processJob(baseUrl, job) {
|
|
381
|
-
const abortController = new AbortController();
|
|
382
|
-
const activeJob = {
|
|
383
|
-
jobId: job.job_id,
|
|
384
|
-
runId: job.run_id,
|
|
385
|
-
functionId: job.function_id,
|
|
386
|
-
startedAt: new Date(),
|
|
387
|
-
abortController,
|
|
388
|
-
};
|
|
389
|
-
this.activeJobs.set(job.job_id, activeJob);
|
|
390
|
-
// Execute in background
|
|
391
|
-
this.executeJob(baseUrl, job, abortController.signal)
|
|
392
|
-
.catch((error) => {
|
|
393
|
-
this.logger.error(`Job ${job.job_id} failed`, { error: String(error) });
|
|
394
|
-
})
|
|
395
|
-
.finally(() => {
|
|
396
|
-
this.activeJobs.delete(job.job_id);
|
|
397
|
-
});
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* Execute a job and report results
|
|
401
|
-
*/
|
|
402
|
-
async executeJob(baseUrl, job, signal) {
|
|
403
|
-
const fn = this.functionMap.get(job.function_id);
|
|
404
|
-
if (!fn) {
|
|
405
|
-
await this.sendJobFailed(baseUrl, job.job_id, {
|
|
406
|
-
message: `Function not found: ${job.function_id}`,
|
|
407
|
-
code: "FUNCTION_NOT_FOUND",
|
|
408
|
-
retryable: false,
|
|
409
|
-
});
|
|
410
|
-
return;
|
|
411
|
-
}
|
|
412
|
-
this.logger.info(`Processing job ${job.job_id} for ${job.function_id}`);
|
|
413
|
-
// Build execution context from job assignment (with optional upcasting)
|
|
414
|
-
const ctx = new ExecutionContext({
|
|
415
|
-
run_id: job.run_id,
|
|
416
|
-
function_id: job.function_id,
|
|
417
|
-
attempt: job.attempt,
|
|
418
|
-
event: job.event,
|
|
419
|
-
steps: job.completed_steps.map((s) => ({
|
|
420
|
-
id: s.step_id,
|
|
421
|
-
name: s.name,
|
|
422
|
-
status: "completed",
|
|
423
|
-
output: s.output,
|
|
424
|
-
})),
|
|
425
|
-
resume: undefined,
|
|
426
|
-
}, undefined, this.config.eventDefinitions, fn.config.stepTimeout, this.config.serverUrl);
|
|
427
|
-
const step = createStepClient(ctx);
|
|
428
|
-
const functionContext = {
|
|
429
|
-
event: ctx.event,
|
|
430
|
-
step,
|
|
431
|
-
run: ctx.runInfo,
|
|
432
|
-
logger: ctx.logger,
|
|
433
|
-
secrets: createSecretsClient(job.context?.secrets),
|
|
434
|
-
};
|
|
435
|
-
try {
|
|
436
|
-
// Check for abort
|
|
437
|
-
if (signal.aborted) {
|
|
438
|
-
return;
|
|
439
|
-
}
|
|
440
|
-
const result = await withRunContext(ctx.runId, () => fn.handler(functionContext));
|
|
441
|
-
// Send completion with executed steps
|
|
442
|
-
await this.sendJobCompleted(baseUrl, job.job_id, result, ctx.getExecutedSteps());
|
|
443
|
-
}
|
|
444
|
-
catch (error) {
|
|
445
|
-
if (signal.aborted) {
|
|
446
|
-
return;
|
|
447
|
-
}
|
|
448
|
-
if (isYieldSignal(error)) {
|
|
449
|
-
// Send yield
|
|
450
|
-
await this.sendStepYielded(baseUrl, job.job_id, error.yieldInfo);
|
|
451
|
-
return;
|
|
452
|
-
}
|
|
453
|
-
const retryable = error instanceof IronflowError ? error.retryable : true;
|
|
454
|
-
// Run compensations only if error is not retryable (terminal failure)
|
|
455
|
-
if (ctx.hasCompensations() && !retryable) {
|
|
456
|
-
await executeCompensations(ctx);
|
|
457
|
-
}
|
|
458
|
-
// Send failure with executed steps (includes compensation steps)
|
|
459
|
-
await this.sendJobFailed(baseUrl, job.job_id, {
|
|
460
|
-
message: error instanceof Error ? error.message : String(error),
|
|
461
|
-
code: error instanceof IronflowError ? error.code : "ERROR",
|
|
462
|
-
retryable,
|
|
463
|
-
}, ctx.getExecutedSteps());
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
/**
|
|
467
|
-
* Report successful job completion
|
|
468
|
-
*/
|
|
469
|
-
async sendJobCompleted(baseUrl, jobId, output, steps) {
|
|
470
|
-
await fetch(`${baseUrl}/api/v1/workers/${this.workerId}/jobs/${jobId}`, {
|
|
471
|
-
method: "PUT",
|
|
472
|
-
headers: this.buildHeaders(),
|
|
473
|
-
body: JSON.stringify({
|
|
474
|
-
status: "completed",
|
|
475
|
-
output,
|
|
476
|
-
steps,
|
|
477
|
-
}),
|
|
478
|
-
});
|
|
479
|
-
}
|
|
480
|
-
/**
|
|
481
|
-
* Report job failure
|
|
482
|
-
*/
|
|
483
|
-
async sendJobFailed(baseUrl, jobId, error, steps) {
|
|
484
|
-
const body = {
|
|
485
|
-
status: "failed",
|
|
486
|
-
error,
|
|
487
|
-
};
|
|
488
|
-
if (steps && steps.length > 0) {
|
|
489
|
-
body.steps = steps;
|
|
490
|
-
}
|
|
491
|
-
await fetch(`${baseUrl}/api/v1/workers/${this.workerId}/jobs/${jobId}`, {
|
|
492
|
-
method: "PUT",
|
|
493
|
-
headers: this.buildHeaders(),
|
|
494
|
-
body: JSON.stringify(body),
|
|
495
|
-
});
|
|
496
|
-
}
|
|
497
|
-
/**
|
|
498
|
-
* Report step yield
|
|
499
|
-
*/
|
|
500
|
-
async sendStepYielded(baseUrl, jobId, yieldInfo) {
|
|
501
|
-
await fetch(`${baseUrl}/api/v1/workers/${this.workerId}/jobs/${jobId}`, {
|
|
502
|
-
method: "PUT",
|
|
503
|
-
headers: this.buildHeaders(),
|
|
504
|
-
body: JSON.stringify({
|
|
505
|
-
status: "yielded",
|
|
506
|
-
yield: yieldInfo,
|
|
507
|
-
}),
|
|
508
|
-
});
|
|
509
|
-
}
|
|
510
|
-
/**
|
|
511
|
-
* Async sleep helper
|
|
512
|
-
*/
|
|
513
|
-
sleep(ms) {
|
|
514
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
/**
|
|
518
|
-
* Generate a unique worker ID
|
|
519
|
-
*/
|
|
520
|
-
function generateWorkerId() {
|
|
521
|
-
const timestamp = Date.now().toString(36);
|
|
522
|
-
const random = Math.random().toString(36).substring(2, 8);
|
|
523
|
-
return `worker-${timestamp}-${random}`;
|
|
524
|
-
}
|
|
525
|
-
/**
|
|
526
|
-
* Get the hostname from environment
|
|
527
|
-
*/
|
|
528
|
-
function getHostname() {
|
|
529
|
-
if (typeof process !== "undefined" && process.env["HOSTNAME"]) {
|
|
530
|
-
return process.env["HOSTNAME"];
|
|
531
|
-
}
|
|
532
|
-
return "unknown";
|
|
533
|
-
}
|
|
534
|
-
// NOTE: createStreamingWorker is NOT re-exported here to avoid loading protobuf
|
|
535
|
-
// dependencies. Import from "@ironflow/node/worker-streaming" if you need it.
|
|
536
|
-
/**
|
|
537
|
-
* Default export
|
|
538
|
-
*/
|
|
539
|
-
export default createWorker;
|
|
540
|
-
//# sourceMappingURL=worker.js.map
|
package/dist/worker.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
|