@openfn/ws-worker 1.5.0 → 1.5.1

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,12 @@
1
1
  # ws-worker
2
2
 
3
+ ## 1.5.1
4
+
5
+ ### Patch Changes
6
+
7
+ - a08fb47: Update CLI docs
8
+ Add WORKER_MAX_SOCKET_TIMEOUT_SECONDS
9
+
3
10
  ## 1.5.0
4
11
 
5
12
  ### Minor Changes
package/dist/index.d.ts CHANGED
@@ -65,6 +65,7 @@ declare type ServerOptions = {
65
65
  min?: number;
66
66
  max?: number;
67
67
  };
68
+ socketTimeoutSeconds?: number;
68
69
  payloadLimitMb?: number;
69
70
  };
70
71
  interface ServerApp extends Koa {
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ var name, version, description, main, type, scripts, bin, author, license, depen
29
29
  var init_package = __esm({
30
30
  "package.json"() {
31
31
  name = "@openfn/ws-worker";
32
- version = "1.5.0";
32
+ version = "1.5.1";
33
33
  description = "A Websocket Worker to connect Lightning to a Runtime Engine";
34
34
  main = "dist/index.js";
35
35
  type = "module";
@@ -167,7 +167,7 @@ var waitForRuns = (app, logger) => new Promise((resolve) => {
167
167
  log();
168
168
  app.events.on(INTERNAL_RUN_COMPLETE, onRunComplete);
169
169
  } else {
170
- logger.debug("No active rns detected");
170
+ logger.debug("No active runs detected, closing immediately");
171
171
  resolve();
172
172
  }
173
173
  });
@@ -242,7 +242,10 @@ var claim = (app, logger = mockLogger, options = {}) => {
242
242
  }
243
243
  logger.debug("requesting run...");
244
244
  app.queueChannel.push(CLAIM, { demand: 1 }).receive("ok", ({ runs }) => {
245
- logger.debug(`pulled ${runs.length} runs`);
245
+ logger.debug(
246
+ `claimed ${runs.length} runs: `,
247
+ runs.map((r) => r.id).join(",")
248
+ );
246
249
  if (!runs?.length) {
247
250
  return reject(new Error("No runs returned"));
248
251
  }
@@ -265,10 +268,10 @@ var claim = (app, logger = mockLogger, options = {}) => {
265
268
  app.execute(run);
266
269
  resolve();
267
270
  });
268
- }).receive("error", () => {
269
- logger.debug("pull err");
271
+ }).receive("error", (e) => {
272
+ logger.error("Error on claim", e);
270
273
  }).receive("timeout", () => {
271
- logger.debug("pull timeout");
274
+ logger.error("TIMEOUT on claim. Runs may be lost.");
272
275
  reject(new Error("timeout"));
273
276
  });
274
277
  });
@@ -942,7 +945,7 @@ var generateWorkerToken = async (secret, workerId, logger) => {
942
945
  var worker_token_default = generateWorkerToken;
943
946
 
944
947
  // src/channels/worker-queue.ts
945
- var connectToWorkerQueue = (endpoint, serverId, secret, logger, SocketConstructor = PhxSocket) => {
948
+ var connectToWorkerQueue = (endpoint, serverId, secret, timeout = 10, logger, SocketConstructor = PhxSocket) => {
946
949
  const events = new EventEmitter();
947
950
  worker_token_default(secret, serverId, logger).then(async (token) => {
948
951
  const pkg = await Promise.resolve().then(() => (init_package(), package_exports));
@@ -953,7 +956,8 @@ var connectToWorkerQueue = (endpoint, serverId, secret, logger, SocketConstructo
953
956
  };
954
957
  const socket = new SocketConstructor(endpoint, {
955
958
  params,
956
- transport: WebSocket
959
+ transport: WebSocket,
960
+ timeout: timeout * 1e3
957
961
  });
958
962
  let didOpen = false;
959
963
  socket.onOpen(() => {
@@ -985,7 +989,7 @@ var connectToWorkerQueue = (endpoint, serverId, secret, logger, SocketConstructo
985
989
  var worker_queue_default = connectToWorkerQueue;
986
990
 
987
991
  // src/server.ts
988
- var DEFAULT_PORT = 1234;
992
+ var DEFAULT_PORT = 2222;
989
993
  var MIN_BACKOFF = 1e3;
990
994
  var MAX_BACKOFF = 1e3 * 30;
991
995
  function connect(app, logger, options = {}) {
@@ -1007,13 +1011,12 @@ function connect(app, logger, options = {}) {
1007
1011
  options.maxWorkflows
1008
1012
  );
1009
1013
  } else {
1014
+ const port = app.server?.address().port;
1010
1015
  logger.break();
1011
- logger.warn("Workloop not starting");
1016
+ logger.warn("Noloop active: workloop has not started");
1012
1017
  logger.info("This server will not auto-pull work from lightning.");
1013
1018
  logger.info("You can manually claim by posting to /claim, eg:");
1014
- logger.info(
1015
- ` curl -X POST http://locahost:${options.port || DEFAULT_PORT}/claim`
1016
- );
1019
+ logger.info(` curl -X POST http://localhost:${port}/claim`);
1017
1020
  logger.break();
1018
1021
  }
1019
1022
  };
@@ -1037,7 +1040,13 @@ function connect(app, logger, options = {}) {
1037
1040
  );
1038
1041
  logger.debug(e);
1039
1042
  };
1040
- worker_queue_default(options.lightning, app.id, options.secret, logger).on("connect", onConnect).on("disconnect", onDisconnect).on("error", onError);
1043
+ worker_queue_default(
1044
+ options.lightning,
1045
+ app.id,
1046
+ options.secret,
1047
+ options.socketTimeoutSeconds,
1048
+ logger
1049
+ ).on("connect", onConnect).on("disconnect", onDisconnect).on("error", onError);
1041
1050
  }
1042
1051
  function createServer(engine, options = {}) {
1043
1052
  const logger = options.logger || createMockLogger2();
package/dist/start.js CHANGED
@@ -37,7 +37,7 @@ var name, version, description, main, type, scripts, bin, author, license, depen
37
37
  var init_package = __esm({
38
38
  "package.json"() {
39
39
  name = "@openfn/ws-worker";
40
- version = "1.5.0";
40
+ version = "1.5.1";
41
41
  description = "A Websocket Worker to connect Lightning to a Runtime Engine";
42
42
  main = "dist/index.js";
43
43
  type = "module";
@@ -306,7 +306,7 @@ var waitForRuns = (app, logger2) => new Promise((resolve5) => {
306
306
  log();
307
307
  app.events.on(INTERNAL_RUN_COMPLETE, onRunComplete);
308
308
  } else {
309
- logger2.debug("No active rns detected");
309
+ logger2.debug("No active runs detected, closing immediately");
310
310
  resolve5();
311
311
  }
312
312
  });
@@ -381,7 +381,10 @@ var claim = (app, logger2 = mockLogger, options = {}) => {
381
381
  }
382
382
  logger2.debug("requesting run...");
383
383
  app.queueChannel.push(CLAIM, { demand: 1 }).receive("ok", ({ runs }) => {
384
- logger2.debug(`pulled ${runs.length} runs`);
384
+ logger2.debug(
385
+ `claimed ${runs.length} runs: `,
386
+ runs.map((r) => r.id).join(",")
387
+ );
385
388
  if (!runs?.length) {
386
389
  return reject(new Error("No runs returned"));
387
390
  }
@@ -404,10 +407,10 @@ var claim = (app, logger2 = mockLogger, options = {}) => {
404
407
  app.execute(run2);
405
408
  resolve5();
406
409
  });
407
- }).receive("error", () => {
408
- logger2.debug("pull err");
410
+ }).receive("error", (e) => {
411
+ logger2.error("Error on claim", e);
409
412
  }).receive("timeout", () => {
410
- logger2.debug("pull timeout");
413
+ logger2.error("TIMEOUT on claim. Runs may be lost.");
411
414
  reject(new Error("timeout"));
412
415
  });
413
416
  });
@@ -1081,7 +1084,7 @@ var generateWorkerToken = async (secret, workerId, logger2) => {
1081
1084
  var worker_token_default = generateWorkerToken;
1082
1085
 
1083
1086
  // src/channels/worker-queue.ts
1084
- var connectToWorkerQueue = (endpoint, serverId, secret, logger2, SocketConstructor = PhxSocket) => {
1087
+ var connectToWorkerQueue = (endpoint, serverId, secret, timeout = 10, logger2, SocketConstructor = PhxSocket) => {
1085
1088
  const events = new EventEmitter2();
1086
1089
  worker_token_default(secret, serverId, logger2).then(async (token) => {
1087
1090
  const pkg = await Promise.resolve().then(() => (init_package(), package_exports));
@@ -1092,7 +1095,8 @@ var connectToWorkerQueue = (endpoint, serverId, secret, logger2, SocketConstruct
1092
1095
  };
1093
1096
  const socket = new SocketConstructor(endpoint, {
1094
1097
  params,
1095
- transport: WebSocket
1098
+ transport: WebSocket,
1099
+ timeout: timeout * 1e3
1096
1100
  });
1097
1101
  let didOpen = false;
1098
1102
  socket.onOpen(() => {
@@ -1124,7 +1128,7 @@ var connectToWorkerQueue = (endpoint, serverId, secret, logger2, SocketConstruct
1124
1128
  var worker_queue_default = connectToWorkerQueue;
1125
1129
 
1126
1130
  // src/server.ts
1127
- var DEFAULT_PORT = 1234;
1131
+ var DEFAULT_PORT = 2222;
1128
1132
  var MIN_BACKOFF = 1e3;
1129
1133
  var MAX_BACKOFF = 1e3 * 30;
1130
1134
  function connect(app, logger2, options = {}) {
@@ -1146,13 +1150,12 @@ function connect(app, logger2, options = {}) {
1146
1150
  options.maxWorkflows
1147
1151
  );
1148
1152
  } else {
1153
+ const port = app.server?.address().port;
1149
1154
  logger2.break();
1150
- logger2.warn("Workloop not starting");
1155
+ logger2.warn("Noloop active: workloop has not started");
1151
1156
  logger2.info("This server will not auto-pull work from lightning.");
1152
1157
  logger2.info("You can manually claim by posting to /claim, eg:");
1153
- logger2.info(
1154
- ` curl -X POST http://locahost:${options.port || DEFAULT_PORT}/claim`
1155
- );
1158
+ logger2.info(` curl -X POST http://localhost:${port}/claim`);
1156
1159
  logger2.break();
1157
1160
  }
1158
1161
  };
@@ -1176,7 +1179,13 @@ function connect(app, logger2, options = {}) {
1176
1179
  );
1177
1180
  logger2.debug(e);
1178
1181
  };
1179
- worker_queue_default(options.lightning, app.id, options.secret, logger2).on("connect", onConnect).on("disconnect", onDisconnect).on("error", onError);
1182
+ worker_queue_default(
1183
+ options.lightning,
1184
+ app.id,
1185
+ options.secret,
1186
+ options.socketTimeoutSeconds,
1187
+ logger2
1188
+ ).on("connect", onConnect).on("disconnect", onDisconnect).on("error", onError);
1180
1189
  }
1181
1190
  function createServer(engine, options = {}) {
1182
1191
  const logger2 = options.logger || createMockLogger2();
@@ -6124,6 +6133,9 @@ var Yargs = YargsFactory(esm_default);
6124
6133
  var yargs_default = Yargs;
6125
6134
 
6126
6135
  // src/util/cli.ts
6136
+ var DEFAULT_PORT2 = 2222;
6137
+ var DEFAULT_WORKER_CAPACITY = 5;
6138
+ var DEFAULT_SOCKET_TIMEOUT_SECONDS = 10;
6127
6139
  function setArg(argValue, envValue, defaultValue) {
6128
6140
  if (Array.isArray(defaultValue) && !argValue && typeof envValue === "string") {
6129
6141
  return envValue.split(",");
@@ -6146,11 +6158,12 @@ function parseArgs(argv) {
6146
6158
  WORKER_PORT,
6147
6159
  WORKER_REPO_DIR,
6148
6160
  WORKER_SECRET,
6149
- WORKER_STATE_PROPS_TO_REMOVE
6161
+ WORKER_STATE_PROPS_TO_REMOVE,
6162
+ WORKER_SOCKET_TIMEOUT_SECONDS
6150
6163
  } = process.env;
6151
6164
  const parser2 = yargs_default(hideBin(argv)).command("server", "Start a ws-worker server").option("port", {
6152
6165
  alias: "p",
6153
- description: "Port to run the server on. Env: WORKER_PORT",
6166
+ description: `Port to run the server on. Default ${DEFAULT_PORT2}. Env: WORKER_PORT`,
6154
6167
  type: "number"
6155
6168
  }).option("lightning", {
6156
6169
  alias: ["l", "lightning-service-url"],
@@ -6161,6 +6174,8 @@ function parseArgs(argv) {
6161
6174
  }).option("secret", {
6162
6175
  alias: "s",
6163
6176
  description: "Worker secret. (comes from WORKER_SECRET by default). Env: WORKER_SECRET"
6177
+ }).option("socket-timeout", {
6178
+ description: `Timeout for websockets to Lighting, in seconds. Defaults to 10.`
6164
6179
  }).option("lightning-public-key", {
6165
6180
  description: "Base64-encoded public key. Used to verify run tokens. Env: WORKER_LIGHTNING_PUBLIC_KEY"
6166
6181
  }).option("log", {
@@ -6176,7 +6191,7 @@ function parseArgs(argv) {
6176
6191
  }).option("backoff", {
6177
6192
  description: "Claim backoff rules: min/max (in seconds). Env: WORKER_BACKOFF"
6178
6193
  }).option("capacity", {
6179
- description: "max concurrent workers. Env: WORKER_CAPACITY",
6194
+ description: `max concurrent workers. Default ${DEFAULT_WORKER_CAPACITY}. Env: WORKER_CAPACITY`,
6180
6195
  type: "number"
6181
6196
  }).option("state-props-to-remove", {
6182
6197
  description: "A list of properties to remove from the final state returned by a job. Env: WORKER_STATE_PROPS_TO_REMOVE",
@@ -6195,7 +6210,7 @@ function parseArgs(argv) {
6195
6210
  const args2 = parser2.parse();
6196
6211
  return {
6197
6212
  ...args2,
6198
- port: setArg(args2.port, WORKER_PORT, 2222),
6213
+ port: setArg(args2.port, WORKER_PORT, DEFAULT_PORT2),
6199
6214
  lightning: setArg(
6200
6215
  args2.lightning,
6201
6216
  WORKER_LIGHTNING_SERVICE_URL,
@@ -6209,7 +6224,7 @@ function parseArgs(argv) {
6209
6224
  ),
6210
6225
  log: setArg(args2.log, WORKER_LOG_LEVEL, "debug"),
6211
6226
  backoff: setArg(args2.backoff, WORKER_BACKOFF, "1/10"),
6212
- capacity: setArg(args2.capacity, WORKER_CAPACITY, 5),
6227
+ capacity: setArg(args2.capacity, WORKER_CAPACITY, DEFAULT_WORKER_CAPACITY),
6213
6228
  statePropsToRemove: setArg(
6214
6229
  args2.statePropsToRemove,
6215
6230
  WORKER_STATE_PROPS_TO_REMOVE,
@@ -6221,6 +6236,11 @@ function parseArgs(argv) {
6221
6236
  args2.maxRunDurationSeconds,
6222
6237
  WORKER_MAX_RUN_DURATION_SECONDS,
6223
6238
  300
6239
+ ),
6240
+ socketTimeoutSeconds: setArg(
6241
+ args2.socketTimeoutSeconds,
6242
+ WORKER_SOCKET_TIMEOUT_SECONDS,
6243
+ DEFAULT_SOCKET_TIMEOUT_SECONDS
6224
6244
  )
6225
6245
  };
6226
6246
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openfn/ws-worker",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "description": "A Websocket Worker to connect Lightning to a Runtime Engine",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -23,8 +23,8 @@
23
23
  "phoenix": "1.7.10",
24
24
  "ws": "^8.14.1",
25
25
  "@openfn/engine-multi": "1.2.1",
26
- "@openfn/logger": "1.0.1",
27
26
  "@openfn/lexicon": "^1.0.2",
27
+ "@openfn/logger": "1.0.1",
28
28
  "@openfn/runtime": "1.4.1"
29
29
  },
30
30
  "devDependencies": {