@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 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
@@ -77,6 +77,7 @@ type ServerOptions = {
77
77
  sentryDsn?: string;
78
78
  sentryEnv?: string;
79
79
  socketTimeoutSeconds?: number;
80
+ messageTimeoutSeconds?: number;
80
81
  payloadLimitMb?: number;
81
82
  collectionsVersion?: string;
82
83
  collectionsUrl?: string;
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, { demand: 1 }).receive("ok", ({ runs }) => {
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
- `claimed ${runs.length} runs in ${duration}ms (${runs.length ? runs.map((r) => r.id).join(",") : "-"})`
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("starting run", run.id);
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.debug("connecting to ", channelName);
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, { demand: 1 }).receive("ok", ({ runs }) => {
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
- `claimed ${runs.length} runs in ${duration}ms (${runs.length ? runs.map((r) => r.id).join(",") : "-"})`
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("starting run", run2.id);
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.debug("connecting to ", channelName);
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
- OPENFN_ADAPTORS_REPO
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 mono repo, from where @local adaptors will be loaded. Env: OPENFN_ADAPTORS_REPO"
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 Lighting, in seconds. Defaults to 10.`
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.0",
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.2",
27
- "@openfn/logger": "1.0.5",
26
+ "@openfn/engine-multi": "1.6.3",
28
27
  "@openfn/runtime": "1.6.4",
29
- "@openfn/lexicon": "^1.2.0"
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.4"
46
+ "@openfn/lightning-mock": "2.1.5"
47
47
  },
48
48
  "files": [
49
49
  "dist",