@openfn/ws-worker 1.13.0 → 1.13.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/CHANGELOG.md +17 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +19 -7
- package/dist/start.js +36 -13
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# ws-worker
|
|
2
2
|
|
|
3
|
+
## 1.13.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- On claim, rename pod_name to worker_name
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @openfn/lexicon@1.2.1
|
|
10
|
+
- @openfn/engine-multi@1.6.3
|
|
11
|
+
- @openfn/runtime@1.6.4
|
|
12
|
+
|
|
13
|
+
## 1.13.1
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- b83d13c: Add DEFAULT_MESSAGE_TIMEOUT_SECONDS env var and tweaked some error handling around lightning messaging
|
|
18
|
+
- 0bd4adf: Include pod name in logs when claiming
|
|
19
|
+
|
|
3
20
|
## 1.13.0
|
|
4
21
|
|
|
5
22
|
### Minor Changes
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -124,9 +124,12 @@ var verifyToken = async (token, publicKey) => {
|
|
|
124
124
|
return true;
|
|
125
125
|
}
|
|
126
126
|
};
|
|
127
|
+
var { DEPLOYED_POD_NAME, WORKER_NAME } = process.env;
|
|
128
|
+
var NAME = WORKER_NAME || DEPLOYED_POD_NAME;
|
|
127
129
|
var claim = (app, logger = mockLogger, options = {}) => {
|
|
128
130
|
return new Promise((resolve, reject) => {
|
|
129
131
|
const { maxWorkers = 5 } = options;
|
|
132
|
+
const podName = NAME ? `[${NAME}] ` : "";
|
|
130
133
|
const activeWorkers = Object.keys(app.workflows).length;
|
|
131
134
|
if (activeWorkers >= maxWorkers) {
|
|
132
135
|
app.workloop?.stop(`server at capacity (${activeWorkers}/${maxWorkers})`);
|
|
@@ -138,10 +141,13 @@ var claim = (app, logger = mockLogger, options = {}) => {
|
|
|
138
141
|
}
|
|
139
142
|
logger.debug(`requesting run (capacity ${activeWorkers}/${maxWorkers})`);
|
|
140
143
|
const start = Date.now();
|
|
141
|
-
app.queueChannel.push(CLAIM, {
|
|
144
|
+
app.queueChannel.push(CLAIM, {
|
|
145
|
+
demand: 1,
|
|
146
|
+
worker_name: NAME || null
|
|
147
|
+
}).receive("ok", ({ runs }) => {
|
|
142
148
|
const duration = Date.now() - start;
|
|
143
149
|
logger.debug(
|
|
144
|
-
|
|
150
|
+
`${podName}claimed ${runs.length} runs in ${duration}ms (${runs.length ? runs.map((r) => r.id).join(",") : "-"})`
|
|
145
151
|
);
|
|
146
152
|
if (!runs?.length) {
|
|
147
153
|
return reject(new Error("No runs returned"));
|
|
@@ -161,7 +167,7 @@ var claim = (app, logger = mockLogger, options = {}) => {
|
|
|
161
167
|
} else {
|
|
162
168
|
logger.debug("skipping run token validation for", run.id);
|
|
163
169
|
}
|
|
164
|
-
logger.debug(
|
|
170
|
+
logger.debug(`${podName} starting run ${run.id}`);
|
|
165
171
|
app.execute(run);
|
|
166
172
|
resolve();
|
|
167
173
|
});
|
|
@@ -939,13 +945,14 @@ var healthcheck_default = (ctx) => {
|
|
|
939
945
|
|
|
940
946
|
// src/channels/run.ts
|
|
941
947
|
import * as Sentry3 from "@sentry/node";
|
|
942
|
-
var joinRunChannel = (socket, token, runId, logger) => {
|
|
948
|
+
var joinRunChannel = (socket, token, runId, logger, timeout = 30) => {
|
|
943
949
|
return new Promise((resolve, reject) => {
|
|
944
950
|
let didReceiveOk = false;
|
|
945
951
|
const channelName = `run:${runId}`;
|
|
946
|
-
logger.
|
|
952
|
+
logger.info(`JOINING ${channelName}`);
|
|
953
|
+
logger.debug(`connecting to ${channelName} with timeout ${timeout}s`);
|
|
947
954
|
const channel = socket.channel(channelName, { token });
|
|
948
|
-
channel.join().receive("ok", async (e) => {
|
|
955
|
+
channel.join(timeout * 1e3).receive("ok", async (e) => {
|
|
949
956
|
if (!didReceiveOk) {
|
|
950
957
|
didReceiveOk = true;
|
|
951
958
|
logger.success(`connected to ${channelName}`, e);
|
|
@@ -958,10 +965,12 @@ var joinRunChannel = (socket, token, runId, logger) => {
|
|
|
958
965
|
}).receive("error", (err) => {
|
|
959
966
|
Sentry3.captureException(err);
|
|
960
967
|
logger.error(`error connecting to ${channelName}`, err);
|
|
968
|
+
channel?.leave();
|
|
961
969
|
reject(err);
|
|
962
970
|
}).receive("timeout", (err) => {
|
|
963
971
|
Sentry3.captureException(err);
|
|
964
972
|
logger.error(`Timeout for ${channelName}`, err);
|
|
973
|
+
channel?.leave();
|
|
965
974
|
reject(err);
|
|
966
975
|
});
|
|
967
976
|
channel.onClose(() => {
|
|
@@ -1216,7 +1225,8 @@ function createServer(engine, options = {}) {
|
|
|
1216
1225
|
app.socket,
|
|
1217
1226
|
token,
|
|
1218
1227
|
id,
|
|
1219
|
-
logger
|
|
1228
|
+
logger,
|
|
1229
|
+
app.options.messageTimeoutSeconds
|
|
1220
1230
|
);
|
|
1221
1231
|
const { plan, options: options2, input } = convert_lightning_plan_default(run, {
|
|
1222
1232
|
collectionsVersion: app.options.collectionsVersion,
|
|
@@ -1253,6 +1263,8 @@ function createServer(engine, options = {}) {
|
|
|
1253
1263
|
);
|
|
1254
1264
|
app.workflows[id] = context;
|
|
1255
1265
|
} catch (e) {
|
|
1266
|
+
delete app.workflows[id];
|
|
1267
|
+
app.resumeWorkloop();
|
|
1256
1268
|
logger.error(`Unexpected error executing ${id}`);
|
|
1257
1269
|
logger.error(e);
|
|
1258
1270
|
}
|
package/dist/start.js
CHANGED
|
@@ -264,9 +264,12 @@ var verifyToken = async (token, publicKey) => {
|
|
|
264
264
|
return true;
|
|
265
265
|
}
|
|
266
266
|
};
|
|
267
|
+
var { DEPLOYED_POD_NAME, WORKER_NAME } = process.env;
|
|
268
|
+
var NAME = WORKER_NAME || DEPLOYED_POD_NAME;
|
|
267
269
|
var claim = (app, logger2 = mockLogger, options = {}) => {
|
|
268
270
|
return new Promise((resolve5, reject) => {
|
|
269
271
|
const { maxWorkers = 5 } = options;
|
|
272
|
+
const podName = NAME ? `[${NAME}] ` : "";
|
|
270
273
|
const activeWorkers = Object.keys(app.workflows).length;
|
|
271
274
|
if (activeWorkers >= maxWorkers) {
|
|
272
275
|
app.workloop?.stop(`server at capacity (${activeWorkers}/${maxWorkers})`);
|
|
@@ -278,10 +281,13 @@ var claim = (app, logger2 = mockLogger, options = {}) => {
|
|
|
278
281
|
}
|
|
279
282
|
logger2.debug(`requesting run (capacity ${activeWorkers}/${maxWorkers})`);
|
|
280
283
|
const start = Date.now();
|
|
281
|
-
app.queueChannel.push(CLAIM, {
|
|
284
|
+
app.queueChannel.push(CLAIM, {
|
|
285
|
+
demand: 1,
|
|
286
|
+
worker_name: NAME || null
|
|
287
|
+
}).receive("ok", ({ runs }) => {
|
|
282
288
|
const duration = Date.now() - start;
|
|
283
289
|
logger2.debug(
|
|
284
|
-
|
|
290
|
+
`${podName}claimed ${runs.length} runs in ${duration}ms (${runs.length ? runs.map((r) => r.id).join(",") : "-"})`
|
|
285
291
|
);
|
|
286
292
|
if (!runs?.length) {
|
|
287
293
|
return reject(new Error("No runs returned"));
|
|
@@ -301,7 +307,7 @@ var claim = (app, logger2 = mockLogger, options = {}) => {
|
|
|
301
307
|
} else {
|
|
302
308
|
logger2.debug("skipping run token validation for", run2.id);
|
|
303
309
|
}
|
|
304
|
-
logger2.debug(
|
|
310
|
+
logger2.debug(`${podName} starting run ${run2.id}`);
|
|
305
311
|
app.execute(run2);
|
|
306
312
|
resolve5();
|
|
307
313
|
});
|
|
@@ -1079,13 +1085,14 @@ var healthcheck_default = (ctx) => {
|
|
|
1079
1085
|
|
|
1080
1086
|
// src/channels/run.ts
|
|
1081
1087
|
import * as Sentry3 from "@sentry/node";
|
|
1082
|
-
var joinRunChannel = (socket, token, runId, logger2) => {
|
|
1088
|
+
var joinRunChannel = (socket, token, runId, logger2, timeout = 30) => {
|
|
1083
1089
|
return new Promise((resolve5, reject) => {
|
|
1084
1090
|
let didReceiveOk = false;
|
|
1085
1091
|
const channelName = `run:${runId}`;
|
|
1086
|
-
logger2.
|
|
1092
|
+
logger2.info(`JOINING ${channelName}`);
|
|
1093
|
+
logger2.debug(`connecting to ${channelName} with timeout ${timeout}s`);
|
|
1087
1094
|
const channel = socket.channel(channelName, { token });
|
|
1088
|
-
channel.join().receive("ok", async (e) => {
|
|
1095
|
+
channel.join(timeout * 1e3).receive("ok", async (e) => {
|
|
1089
1096
|
if (!didReceiveOk) {
|
|
1090
1097
|
didReceiveOk = true;
|
|
1091
1098
|
logger2.success(`connected to ${channelName}`, e);
|
|
@@ -1098,10 +1105,12 @@ var joinRunChannel = (socket, token, runId, logger2) => {
|
|
|
1098
1105
|
}).receive("error", (err) => {
|
|
1099
1106
|
Sentry3.captureException(err);
|
|
1100
1107
|
logger2.error(`error connecting to ${channelName}`, err);
|
|
1108
|
+
channel?.leave();
|
|
1101
1109
|
reject(err);
|
|
1102
1110
|
}).receive("timeout", (err) => {
|
|
1103
1111
|
Sentry3.captureException(err);
|
|
1104
1112
|
logger2.error(`Timeout for ${channelName}`, err);
|
|
1113
|
+
channel?.leave();
|
|
1105
1114
|
reject(err);
|
|
1106
1115
|
});
|
|
1107
1116
|
channel.onClose(() => {
|
|
@@ -1356,7 +1365,8 @@ function createServer(engine, options = {}) {
|
|
|
1356
1365
|
app.socket,
|
|
1357
1366
|
token,
|
|
1358
1367
|
id,
|
|
1359
|
-
logger2
|
|
1368
|
+
logger2,
|
|
1369
|
+
app.options.messageTimeoutSeconds
|
|
1360
1370
|
);
|
|
1361
1371
|
const { plan, options: options2, input } = convert_lightning_plan_default(run2, {
|
|
1362
1372
|
collectionsVersion: app.options.collectionsVersion,
|
|
@@ -1393,6 +1403,8 @@ function createServer(engine, options = {}) {
|
|
|
1393
1403
|
);
|
|
1394
1404
|
app.workflows[id] = context;
|
|
1395
1405
|
} catch (e) {
|
|
1406
|
+
delete app.workflows[id];
|
|
1407
|
+
app.resumeWorkloop();
|
|
1396
1408
|
logger2.error(`Unexpected error executing ${id}`);
|
|
1397
1409
|
logger2.error(e);
|
|
1398
1410
|
}
|
|
@@ -6302,6 +6314,7 @@ var yargs_default = Yargs;
|
|
|
6302
6314
|
var DEFAULT_PORT2 = 2222;
|
|
6303
6315
|
var DEFAULT_WORKER_CAPACITY = 5;
|
|
6304
6316
|
var DEFAULT_SOCKET_TIMEOUT_SECONDS = 10;
|
|
6317
|
+
var DEFAULT_MESSAGE_TIMEOUT_SECONDS = 30;
|
|
6305
6318
|
function setArg(argValue, envValue, defaultValue) {
|
|
6306
6319
|
if (Array.isArray(defaultValue) && !argValue && typeof envValue === "string") {
|
|
6307
6320
|
return envValue.split(",");
|
|
@@ -6313,24 +6326,25 @@ function setArg(argValue, envValue, defaultValue) {
|
|
|
6313
6326
|
}
|
|
6314
6327
|
function parseArgs(argv) {
|
|
6315
6328
|
const {
|
|
6329
|
+
OPENFN_ADAPTORS_REPO,
|
|
6316
6330
|
WORKER_BACKOFF,
|
|
6317
6331
|
WORKER_CAPACITY,
|
|
6318
|
-
WORKER_COLLECTIONS_VERSION,
|
|
6319
6332
|
WORKER_COLLECTIONS_URL,
|
|
6333
|
+
WORKER_COLLECTIONS_VERSION,
|
|
6320
6334
|
WORKER_LIGHTNING_PUBLIC_KEY,
|
|
6321
6335
|
WORKER_LIGHTNING_SERVICE_URL,
|
|
6322
6336
|
WORKER_LOG_LEVEL,
|
|
6323
6337
|
WORKER_MAX_PAYLOAD_MB,
|
|
6324
6338
|
WORKER_MAX_RUN_DURATION_SECONDS,
|
|
6325
6339
|
WORKER_MAX_RUN_MEMORY_MB,
|
|
6340
|
+
WORKER_MESSAGE_TIMEOUT_SECONDS,
|
|
6326
6341
|
WORKER_PORT,
|
|
6327
6342
|
WORKER_REPO_DIR,
|
|
6328
6343
|
WORKER_SECRET,
|
|
6329
6344
|
WORKER_SENTRY_DSN,
|
|
6330
6345
|
WORKER_SENTRY_ENV,
|
|
6331
|
-
WORKER_STATE_PROPS_TO_REMOVE,
|
|
6332
6346
|
WORKER_SOCKET_TIMEOUT_SECONDS,
|
|
6333
|
-
|
|
6347
|
+
WORKER_STATE_PROPS_TO_REMOVE
|
|
6334
6348
|
} = process.env;
|
|
6335
6349
|
const parser2 = yargs_default(hideBin(argv)).command("server", "Start a ws-worker server").option("port", {
|
|
6336
6350
|
alias: "p",
|
|
@@ -6344,7 +6358,7 @@ function parseArgs(argv) {
|
|
|
6344
6358
|
description: "Path to the runtime repo (where modules will be installed). Env: WORKER_REPO_DIR"
|
|
6345
6359
|
}).option("monorepo-dir", {
|
|
6346
6360
|
alias: "m",
|
|
6347
|
-
description: "Path to the adaptors
|
|
6361
|
+
description: "Path to the adaptors monorepo, from where @local adaptors will be loaded. Env: OPENFN_ADAPTORS_REPO"
|
|
6348
6362
|
}).option("secret", {
|
|
6349
6363
|
alias: "s",
|
|
6350
6364
|
description: "Worker secret. (comes from WORKER_SECRET by default). Env: WORKER_SECRET"
|
|
@@ -6354,7 +6368,9 @@ function parseArgs(argv) {
|
|
|
6354
6368
|
}).option("sentry-env", {
|
|
6355
6369
|
description: "Sentry environment. Defaults to 'dev'. Env: WORKER_SENTRY_ENV"
|
|
6356
6370
|
}).option("socket-timeout", {
|
|
6357
|
-
description: `Timeout for websockets to
|
|
6371
|
+
description: `Timeout for websockets to Lightning, in seconds. Defaults to 10.Env: WORKER_SOCKET_TIMEOUT_SECONDS`
|
|
6372
|
+
}).option("message-timeout", {
|
|
6373
|
+
description: `Timeout for messages in the run channel in seconds. Defaults to 1. Env: WORKER_MESSAGE_TIMEOUT_SECONDS`
|
|
6358
6374
|
}).option("lightning-public-key", {
|
|
6359
6375
|
description: "Base64-encoded public key. Used to verify run tokens. Env: WORKER_LIGHTNING_PUBLIC_KEY"
|
|
6360
6376
|
}).option("log", {
|
|
@@ -6430,6 +6446,11 @@ function parseArgs(argv) {
|
|
|
6430
6446
|
WORKER_SOCKET_TIMEOUT_SECONDS,
|
|
6431
6447
|
DEFAULT_SOCKET_TIMEOUT_SECONDS
|
|
6432
6448
|
),
|
|
6449
|
+
messageTimeoutSeconds: setArg(
|
|
6450
|
+
args2.messageTimeoutSeconds,
|
|
6451
|
+
WORKER_MESSAGE_TIMEOUT_SECONDS,
|
|
6452
|
+
DEFAULT_MESSAGE_TIMEOUT_SECONDS
|
|
6453
|
+
),
|
|
6433
6454
|
collectionsVersion: setArg(
|
|
6434
6455
|
args2.collectionsVersion,
|
|
6435
6456
|
WORKER_COLLECTIONS_VERSION
|
|
@@ -6471,7 +6492,9 @@ function engineReady(engine) {
|
|
|
6471
6492
|
payloadLimitMb: args.payloadMemory,
|
|
6472
6493
|
collectionsVersion: args.collectionsVersion,
|
|
6473
6494
|
collectionsUrl: args.collectionsUrl,
|
|
6474
|
-
monorepoDir: args.monorepoDir
|
|
6495
|
+
monorepoDir: args.monorepoDir,
|
|
6496
|
+
messageTimeoutSeconds: args.messageTimeoutSeconds,
|
|
6497
|
+
socketTimeoutSeconds: args.socketTimeoutSeconds
|
|
6475
6498
|
};
|
|
6476
6499
|
if (args.lightningPublicKey) {
|
|
6477
6500
|
logger.info(
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openfn/ws-worker",
|
|
3
|
-
"version": "1.13.
|
|
3
|
+
"version": "1.13.2",
|
|
4
4
|
"description": "A Websocket Worker to connect Lightning to a Runtime Engine",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
"koa-logger": "^3.2.1",
|
|
24
24
|
"phoenix": "1.7.10",
|
|
25
25
|
"ws": "^8.18.0",
|
|
26
|
-
"@openfn/engine-multi": "1.6.
|
|
27
|
-
"@openfn/logger": "1.0.5",
|
|
26
|
+
"@openfn/engine-multi": "1.6.3",
|
|
28
27
|
"@openfn/runtime": "1.6.4",
|
|
29
|
-
"@openfn/
|
|
28
|
+
"@openfn/logger": "1.0.5",
|
|
29
|
+
"@openfn/lexicon": "^1.2.1"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/koa": "^2.13.5",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"tsup": "^6.2.3",
|
|
44
44
|
"typescript": "^4.6.4",
|
|
45
45
|
"yargs": "^17.6.2",
|
|
46
|
-
"@openfn/lightning-mock": "2.1.
|
|
46
|
+
"@openfn/lightning-mock": "2.1.5"
|
|
47
47
|
},
|
|
48
48
|
"files": [
|
|
49
49
|
"dist",
|