trigger.dev 0.0.0-prerelease-20240410151927 → 0.0.0-v2-prerelease-20240524135558

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.
@@ -1,36 +1,37 @@
1
1
  // src/workers/dev/worker-facade.ts
2
2
  import {
3
- TaskExecutor,
4
- DurableClock,
5
3
  clock,
6
- logLevels,
7
- getEnvVar,
8
- ZodSchemaParsedError
4
+ taskCatalog
9
5
  } from "@trigger.dev/core/v3";
10
6
  import {
11
- ConsoleInterceptor,
12
- DevRuntimeManager,
7
+ TaskExecutor,
8
+ DurableClock,
9
+ getEnvVar,
10
+ logLevels,
13
11
  OtelTaskLogger,
12
+ ConsoleInterceptor
13
+ } from "@trigger.dev/core/v3/workers";
14
+ import {
14
15
  TaskRunErrorCodes,
15
16
  TriggerTracer,
16
- ZodMessageHandler,
17
17
  logger,
18
18
  runtime,
19
19
  workerToChildMessages
20
20
  } from "@trigger.dev/core/v3";
21
-
22
- // package.json
23
- var version = "0.0.0-prerelease-20240410151927";
24
-
25
- // src/workers/dev/worker-facade.ts
21
+ import { DevRuntimeManager } from "@trigger.dev/core/v3/dev";
22
+ import {
23
+ ZodMessageHandler,
24
+ ZodSchemaParsedError
25
+ } from "@trigger.dev/core/v3/zodMessageHandler";
26
26
  __WORKER_SETUP__;
27
27
  __IMPORTED_PROJECT_CONFIG__;
28
- var otelTracer = tracingSDK.getTracer("trigger-dev-worker", version);
29
- var otelLogger = tracingSDK.getLogger("trigger-dev-worker", version);
30
28
  var durableClock = new DurableClock();
31
29
  clock.setGlobalClock(durableClock);
32
30
  var tracer = new TriggerTracer({ tracer: otelTracer, logger: otelLogger });
33
- var consoleInterceptor = new ConsoleInterceptor(otelLogger);
31
+ var consoleInterceptor = new ConsoleInterceptor(
32
+ otelLogger,
33
+ typeof __PROJECT_CONFIG__.enableConsoleLogging === "boolean" ? __PROJECT_CONFIG__.enableConsoleLogging : true
34
+ );
34
35
  var devRuntimeManager = new DevRuntimeManager();
35
36
  runtime.setGlobalRuntimeManager(devRuntimeManager);
36
37
  var triggerLogLevel = getEnvVar("TRIGGER_LOG_LEVEL");
@@ -38,56 +39,27 @@ var configLogLevel = triggerLogLevel ? triggerLogLevel : importedConfig ? import
38
39
  var otelTaskLogger = new OtelTaskLogger({
39
40
  logger: otelLogger,
40
41
  tracer,
41
- level: logLevels.includes(configLogLevel) ? configLogLevel : "log"
42
+ level: logLevels.includes(configLogLevel) ? configLogLevel : "info"
42
43
  });
43
44
  logger.setGlobalTaskLogger(otelTaskLogger);
44
45
  var TaskFileImports = {};
45
46
  var TaskFiles = {};
46
47
  __TASKS__;
47
- function getTasks() {
48
- const result = [];
48
+ (() => {
49
49
  for (const [importName, taskFile] of Object.entries(TaskFiles)) {
50
50
  const fileImports = TaskFileImports[importName];
51
51
  for (const [exportName, task] of Object.entries(fileImports ?? {})) {
52
- if (task.__trigger) {
53
- result.push({
54
- id: task.__trigger.id,
55
- exportName,
56
- packageVersion: task.__trigger.packageVersion,
57
- filePath: taskFile.filePath,
58
- queue: task.__trigger.queue,
59
- retry: task.__trigger.retry,
60
- machine: task.__trigger.machine,
61
- fns: task.__trigger.fns
62
- });
52
+ if (typeof task === "object" && task !== null && "id" in task && typeof task.id === "string") {
53
+ if (taskCatalog.taskExists(task.id)) {
54
+ taskCatalog.registerTaskFileMetadata(task.id, {
55
+ exportName,
56
+ filePath: taskFile.filePath
57
+ });
58
+ }
63
59
  }
64
60
  }
65
61
  }
66
- return result;
67
- }
68
- function getTaskMetadata() {
69
- const result = getTasks();
70
- return result.map((task) => {
71
- const { fns, ...metadata } = task;
72
- return metadata;
73
- });
74
- }
75
- var tasks = getTasks();
76
- runtime.registerTasks(tasks);
77
- var taskExecutors = /* @__PURE__ */ new Map();
78
- for (const task of tasks) {
79
- taskExecutors.set(
80
- task.id,
81
- new TaskExecutor(task, {
82
- tracer,
83
- tracingSDK,
84
- consoleInterceptor,
85
- projectConfig: __PROJECT_CONFIG__,
86
- importedConfig,
87
- handleErrorFn: handleError
88
- })
89
- );
90
- }
62
+ })();
91
63
  var _execution;
92
64
  var _isRunning = false;
93
65
  var handler = new ZodMessageHandler({
@@ -100,7 +72,7 @@ var handler = new ZodMessageHandler({
100
72
  execution,
101
73
  result: {
102
74
  ok: false,
103
- id: execution.attempt.id,
75
+ id: execution.run.id,
104
76
  error: {
105
77
  type: "INTERNAL_ERROR",
106
78
  code: TaskRunErrorCodes.TASK_ALREADY_RUNNING
@@ -110,14 +82,14 @@ var handler = new ZodMessageHandler({
110
82
  return;
111
83
  }
112
84
  process.title = `trigger-dev-worker: ${execution.task.id} ${execution.run.id}`;
113
- const executor = taskExecutors.get(execution.task.id);
114
- if (!executor) {
115
- console.error(`Could not find executor for task ${execution.task.id}`);
85
+ const task = taskCatalog.getTask(execution.task.id);
86
+ if (!task) {
87
+ console.error(`Could not find task ${execution.task.id}`);
116
88
  await sender.send("TASK_RUN_COMPLETED", {
117
89
  execution,
118
90
  result: {
119
91
  ok: false,
120
- id: execution.attempt.id,
92
+ id: execution.run.id,
121
93
  error: {
122
94
  type: "INTERNAL_ERROR",
123
95
  code: TaskRunErrorCodes.COULD_NOT_FIND_EXECUTOR
@@ -126,6 +98,14 @@ var handler = new ZodMessageHandler({
126
98
  });
127
99
  return;
128
100
  }
101
+ const executor = new TaskExecutor(task, {
102
+ tracer,
103
+ tracingSDK,
104
+ consoleInterceptor,
105
+ projectConfig: __PROJECT_CONFIG__,
106
+ importedConfig,
107
+ handleErrorFn: handleError
108
+ });
129
109
  try {
130
110
  _execution = execution;
131
111
  _isRunning = true;
@@ -157,7 +137,7 @@ var handler = new ZodMessageHandler({
157
137
  process.on("message", async (msg) => {
158
138
  await handler.handleMessage(msg);
159
139
  });
160
- var TASK_METADATA = getTaskMetadata();
140
+ var TASK_METADATA = taskCatalog.getAllTaskMetadata();
161
141
  sender.send("TASKS_READY", { tasks: TASK_METADATA }).catch((err) => {
162
142
  if (err instanceof ZodSchemaParsedError) {
163
143
  sender.send("TASKS_FAILED_TO_PARSE", { zodIssues: err.error.issues, tasks: TASK_METADATA });
@@ -1,40 +1,34 @@
1
1
  // src/workers/dev/worker-setup.ts
2
- import "source-map-support/register.js";
3
- import { Resource } from "@opentelemetry/resources";
2
+ import { childToWorkerMessages, taskCatalog } from "@trigger.dev/core/v3";
4
3
  import {
5
- SemanticInternalAttributes,
6
- TracingSDK,
7
- ZodMessageSender,
8
- childToWorkerMessages
9
- } from "@trigger.dev/core/v3";
4
+ StandardTaskCatalog,
5
+ TracingSDK
6
+ } from "@trigger.dev/core/v3/workers";
7
+ import { ZodMessageSender } from "@trigger.dev/core/v3/zodMessageHandler";
8
+ import "source-map-support/register.js";
9
+
10
+ // package.json
11
+ var version = "3.0.0-beta.33";
12
+
13
+ // src/workers/dev/worker-setup.ts
10
14
  __SETUP_IMPORTED_PROJECT_CONFIG__;
11
15
  var tracingSDK = new TracingSDK({
12
16
  url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? "http://0.0.0.0:4318",
13
- resource: new Resource({
14
- [SemanticInternalAttributes.CLI_VERSION]: "3.0.0"
15
- }),
16
17
  instrumentations: setupImportedConfig?.instrumentations ?? [],
17
18
  diagLogLevel: process.env.OTEL_LOG_LEVEL ?? "none"
18
19
  });
20
+ var otelTracer = tracingSDK.getTracer("trigger-dev-worker", version);
21
+ var otelLogger = tracingSDK.getLogger("trigger-dev-worker", version);
19
22
  var sender = new ZodMessageSender({
20
23
  schema: childToWorkerMessages,
21
24
  sender: async (message) => {
22
25
  process.send?.(message);
23
26
  }
24
27
  });
25
- process.on("uncaughtException", (error, origin) => {
26
- sender.send("UNCAUGHT_EXCEPTION", {
27
- error: {
28
- name: error.name,
29
- message: error.message,
30
- stack: error.stack
31
- },
32
- origin
33
- }).catch((err) => {
34
- console.error("Failed to send UNCAUGHT_EXCEPTION message", err);
35
- });
36
- });
28
+ taskCatalog.setGlobalTaskCatalog(new StandardTaskCatalog());
37
29
  export {
30
+ otelLogger,
31
+ otelTracer,
38
32
  sender,
39
33
  tracingSDK
40
34
  };
@@ -3,9 +3,9 @@ import {
3
3
  CoordinatorToProdWorkerMessages,
4
4
  PostStartCauses,
5
5
  PreStopCauses,
6
- ProdWorkerToCoordinatorMessages,
7
- ZodSocketConnection as ZodSocketConnection2
6
+ ProdWorkerToCoordinatorMessages
8
7
  } from "@trigger.dev/core/v3";
8
+ import { ZodSocketConnection as ZodSocketConnection2 } from "@trigger.dev/core/v3/zodSocket";
9
9
 
10
10
  // ../core-apps/src/http.ts
11
11
  var HttpReply = class {
@@ -71,10 +71,10 @@ import {
71
71
  clientWebsocketMessages,
72
72
  PlatformToProviderMessages,
73
73
  ProviderToPlatformMessages,
74
- SharedQueueToClientMessages,
75
- ZodMessageSender,
76
- ZodSocketConnection
74
+ SharedQueueToClientMessages
77
75
  } from "@trigger.dev/core/v3";
76
+ import { ZodMessageSender } from "@trigger.dev/core/v3/zodMessageHandler";
77
+ import { ZodSocketConnection } from "@trigger.dev/core/v3/zodSocket";
78
78
  var HTTP_SERVER_PORT = Number(process.env.HTTP_SERVER_PORT || getRandomPortNumber());
79
79
  var MACHINE_NAME = process.env.MACHINE_NAME || "local";
80
80
  var PLATFORM_HOST = process.env.PLATFORM_HOST || "127.0.0.1";
@@ -93,9 +93,9 @@ import {
93
93
  ProdWorkerToChildMessages,
94
94
  SemanticInternalAttributes,
95
95
  TaskRunErrorCodes,
96
- ZodIpcConnection,
97
96
  correctErrorStackTrace
98
97
  } from "@trigger.dev/core/v3";
98
+ import { ZodIpcConnection } from "@trigger.dev/core/v3/zodIpc";
99
99
  import { Evt } from "evt";
100
100
  import { fork } from "node:child_process";
101
101
 
@@ -148,6 +148,7 @@ var ProdBackgroundWorker = class {
148
148
  onWaitForDuration = new Evt();
149
149
  onWaitForTask = new Evt();
150
150
  preCheckpointNotification = Evt.create();
151
+ checkpointCanceledNotification = Evt.create();
151
152
  onReadyForCheckpoint = Evt.create();
152
153
  onCancelCheckpoint = Evt.create();
153
154
  _onClose = new Evt();
@@ -296,6 +297,9 @@ var ProdBackgroundWorker = class {
296
297
  this.preCheckpointNotification.attach((message) => {
297
298
  taskRunProcess.preCheckpointNotification.post(message);
298
299
  });
300
+ this.checkpointCanceledNotification.attach((message) => {
301
+ taskRunProcess.checkpointCanceledNotification.post(message);
302
+ });
299
303
  await taskRunProcess.initialize();
300
304
  this._taskRunProcess = taskRunProcess;
301
305
  }
@@ -394,6 +398,7 @@ var TaskRunProcess = class {
394
398
  onWaitForDuration = new Evt();
395
399
  onWaitForTask = new Evt();
396
400
  preCheckpointNotification = Evt.create();
401
+ checkpointCanceledNotification = Evt.create();
397
402
  onReadyForCheckpoint = Evt.create();
398
403
  onCancelCheckpoint = Evt.create();
399
404
  async initialize() {
@@ -443,22 +448,49 @@ var TaskRunProcess = class {
443
448
  },
444
449
  TASKS_READY: async (message) => {
445
450
  },
451
+ WAIT_FOR_TASK: async (message) => {
452
+ this.onWaitForTask.post(message);
453
+ },
446
454
  WAIT_FOR_BATCH: async (message) => {
447
455
  this.onWaitForBatch.post(message);
448
456
  },
449
457
  WAIT_FOR_DURATION: async (message) => {
450
458
  this.onWaitForDuration.post(message);
451
- const { willCheckpointAndRestore } = await this.preCheckpointNotification.waitFor();
452
- return { willCheckpointAndRestore };
453
- },
454
- WAIT_FOR_TASK: async (message) => {
455
- this.onWaitForTask.post(message);
459
+ try {
460
+ const { willCheckpointAndRestore } = await this.preCheckpointNotification.waitFor(
461
+ 3e4
462
+ );
463
+ return {
464
+ willCheckpointAndRestore
465
+ };
466
+ } catch (error) {
467
+ console.error("Error while waiting for pre-checkpoint notification", error);
468
+ return {
469
+ willCheckpointAndRestore: false
470
+ };
471
+ }
456
472
  },
457
473
  READY_FOR_CHECKPOINT: async (message) => {
458
474
  this.onReadyForCheckpoint.post(message);
459
475
  },
460
476
  CANCEL_CHECKPOINT: async (message) => {
477
+ const version = "v2";
461
478
  this.onCancelCheckpoint.post(message);
479
+ try {
480
+ const { checkpointCanceled } = await this.checkpointCanceledNotification.waitFor(
481
+ 3e4
482
+ );
483
+ return {
484
+ version,
485
+ checkpointCanceled
486
+ };
487
+ } catch (error) {
488
+ console.error("Error while waiting for checkpoint cancellation", error);
489
+ return {
490
+ version,
491
+ checkpointCanceled: true
492
+ };
493
+ }
462
494
  }
463
495
  }
464
496
  });
@@ -577,6 +609,7 @@ var logger2 = new SimpleLogger(`[${MACHINE_NAME2}][${SHORT_HASH}]`);
577
609
  var ProdWorker = class {
578
610
  constructor(port, host = "0.0.0.0") {
579
611
  this.host = host;
612
+ process.on("SIGTERM", this.#handleSignal.bind(this, "SIGTERM"));
580
613
  this.#coordinatorSocket = this.#createCoordinatorSocket(COORDINATOR_HOST);
581
614
  this.#backgroundWorker = new ProdBackgroundWorker("worker.js", {
582
615
  projectConfig: __PROJECT_CONFIG__,
@@ -592,18 +625,26 @@ var ProdWorker = class {
592
625
  this.#coordinatorSocket.socket.emit("TASK_HEARTBEAT", { version: "v1", attemptFriendlyId });
593
626
  });
594
627
  this.#backgroundWorker.onReadyForCheckpoint.attach(async (message) => {
628
+ await this.#backgroundWorker.flushTelemetry();
595
629
  this.#coordinatorSocket.socket.emit("READY_FOR_CHECKPOINT", { version: "v1" });
596
630
  });
597
631
  this.#backgroundWorker.onCancelCheckpoint.attach(async (message) => {
598
- logger2.log("onCancelCheckpoint() clearing paused state, don't wait for post start hook", {
599
- paused: this.paused,
600
- nextResumeAfter: this.nextResumeAfter,
601
- waitForPostStart: this.waitForPostStart
602
- });
603
- this.paused = false;
604
- this.nextResumeAfter = void 0;
605
- this.waitForPostStart = false;
606
- this.#coordinatorSocket.socket.emit("CANCEL_CHECKPOINT", { version: "v1" });
632
+ logger2.log("onCancelCheckpoint", { message });
633
+ const { checkpointCanceled } = await this.#coordinatorSocket.socket.emitWithAck(
634
+ "CANCEL_CHECKPOINT",
635
+ {
636
+ version: "v2",
637
+ reason: message.reason
638
+ }
639
+ );
640
+ if (checkpointCanceled) {
641
+ if (message.reason === "WAIT_FOR_DURATION") {
642
+ this.paused = false;
643
+ this.nextResumeAfter = void 0;
644
+ this.waitForPostStart = false;
645
+ }
646
+ }
647
+ this.#backgroundWorker.checkpointCanceledNotification.post({ checkpointCanceled });
607
648
  });
608
649
  this.#backgroundWorker.onWaitForDuration.attach(async (message) => {
609
650
  if (!this.attemptFriendlyId) {
@@ -669,6 +710,27 @@ var ProdWorker = class {
669
710
  #backgroundWorker;
670
711
  #httpServer;
671
712
  #coordinatorSocket;
713
+ async #handleSignal(signal) {
714
+ logger2.log("Received signal", { signal });
715
+ if (signal === "SIGTERM") {
716
+ if (this.executing) {
717
+ const terminationGracePeriodSeconds = 60 * 60;
718
+ logger2.log("Waiting for attempt to complete before exiting", {
719
+ terminationGracePeriodSeconds
720
+ });
721
+ await setTimeout2(terminationGracePeriodSeconds * 1e3 - 5e3);
722
+ logger2.log("Termination timeout reached, exiting gracefully.");
723
+ } else {
724
+ logger2.log("Not executing, exiting immediately.");
725
+ }
726
+ await this.#exitGracefully();
727
+ }
728
+ logger2.log("Unhandled signal", { signal });
729
+ }
730
+ async #exitGracefully() {
731
+ await this.#backgroundWorker.close();
732
+ process.exit(0);
733
+ }
672
734
  async #reconnect(isPostStart = false, reconnectImmediately = false) {
673
735
  if (isPostStart) {
674
736
  this.waitForPostStart = false;
@@ -698,13 +760,16 @@ var ProdWorker = class {
698
760
  this.#coordinatorSocket = this.#createCoordinatorSocket(coordinatorHost);
699
761
  }
700
762
  }
701
- #prepareForWait(reason, willCheckpointAndRestore) {
763
+ async #prepareForWait(reason, willCheckpointAndRestore) {
702
764
  logger2.log(`prepare for ${reason}`, { willCheckpointAndRestore });
703
765
  this.#backgroundWorker.preCheckpointNotification.post({ willCheckpointAndRestore });
704
766
  if (willCheckpointAndRestore) {
705
767
  this.paused = true;
706
768
  this.nextResumeAfter = reason;
707
769
  this.waitForPostStart = true;
770
+ if (reason === "WAIT_FOR_TASK" || reason === "WAIT_FOR_BATCH") {
771
+ await this.#backgroundWorker.flushTelemetry();
772
+ }
708
773
  }
709
774
  }
710
775
  async #prepareForRetry(willCheckpointAndRestore, shouldExit) {
@@ -713,8 +778,7 @@ var ProdWorker = class {
713
778
  if (willCheckpointAndRestore) {
714
779
  logger2.log("WARNING: Will checkpoint but also requested exit. This won't end well.");
715
780
  }
716
- await this.#backgroundWorker.close();
717
- process.exit(0);
781
+ await this.#exitGracefully();
718
782
  }
719
783
  this.executing = false;
720
784
  this.attemptFriendlyId = void 0;
@@ -727,6 +791,7 @@ var ProdWorker = class {
727
791
  #resumeAfterDuration() {
728
792
  this.paused = false;
729
793
  this.nextResumeAfter = void 0;
794
+ this.waitForPostStart = false;
730
795
  this.#backgroundWorker.waitCompletedNotification();
731
796
  }
732
797
  #returnValidatedExtraHeaders(headers) {
@@ -737,6 +802,7 @@ var ProdWorker = class {
737
802
  }
738
803
  return headers;
739
804
  }
805
+ // FIXME: If the the worker can't connect for a while, this runs MANY times - it should only run once
740
806
  #createCoordinatorSocket(host) {
741
807
  const extraHeaders = this.#returnValidatedExtraHeaders({
742
808
  "x-machine-name": MACHINE_NAME2,
@@ -801,6 +867,7 @@ var ProdWorker = class {
801
867
  }
802
868
  this.paused = false;
803
869
  this.nextResumeAfter = void 0;
870
+ this.waitForPostStart = false;
804
871
  for (let i = 0; i < message.completions.length; i++) {
805
872
  const completion = message.completions[i];
806
873
  const execution = message.executions[i];
@@ -872,6 +939,21 @@ var ProdWorker = class {
872
939
  logger3.log("skip connection handler, waiting for post start hook");
873
940
  return;
874
941
  }
942
+ if (this.paused) {
943
+ if (!this.nextResumeAfter) {
944
+ return;
945
+ }
946
+ if (!this.attemptFriendlyId) {
947
+ logger3.error("Missing friendly ID");
948
+ return;
949
+ }
950
+ socket.emit("READY_FOR_RESUME", {
951
+ version: "v1",
952
+ attemptFriendlyId: this.attemptFriendlyId,
953
+ type: this.nextResumeAfter
954
+ });
955
+ return;
956
+ }
875
957
  if (process.env.INDEX_TASKS === "true") {
876
958
  try {
877
959
  const taskResources = await this.#initializeWorker();
@@ -889,7 +971,10 @@ var ProdWorker = class {
889
971
  }
890
972
  } catch (e) {
891
973
  if (e instanceof TaskMetadataParseError) {
892
- logger3.error("tasks metadata parse error", { message: e.zodIssues, tasks: e.tasks });
974
+ logger3.error("tasks metadata parse error", {
975
+ zodIssues: e.zodIssues,
976
+ tasks: e.tasks
977
+ });
893
978
  socket.emit("INDEXING_FAILED", {
894
979
  version: "v1",
895
980
  deploymentId: this.deploymentId,
@@ -900,29 +985,31 @@ var ProdWorker = class {
900
985
  }
901
986
  });
902
987
  } else if (e instanceof UncaughtExceptionError) {
903
- logger3.error("uncaught exception", { message: e.originalError.message });
988
+ const error = {
989
+ name: e.originalError.name,
990
+ message: e.originalError.message,
991
+ stack: e.originalError.stack
992
+ };
993
+ logger3.error("uncaught exception", { originalError: error });
904
994
  socket.emit("INDEXING_FAILED", {
905
995
  version: "v1",
906
996
  deploymentId: this.deploymentId,
907
- error: {
908
- name: e.originalError.name,
909
- message: e.originalError.message,
910
- stack: e.originalError.stack
911
- }
997
+ error
912
998
  });
913
999
  } else if (e instanceof Error) {
914
- logger3.error("error", { message: e.message });
1000
+ const error = {
1001
+ name: e.name,
1002
+ message: e.message,
1003
+ stack: e.stack
1004
+ };
1005
+ logger3.error("error", { error });
915
1006
  socket.emit("INDEXING_FAILED", {
916
1007
  version: "v1",
917
1008
  deploymentId: this.deploymentId,
918
- error: {
919
- name: e.name,
920
- message: e.message,
921
- stack: e.stack
922
- }
1009
+ error
923
1010
  });
924
1011
  } else if (typeof e === "string") {
925
- logger3.error("string error", { message: e });
1012
+ logger3.error("string error", { error: { message: e } });
926
1013
  socket.emit("INDEXING_FAILED", {
927
1014
  version: "v1",
928
1015
  deploymentId: this.deploymentId,
@@ -943,28 +1030,9 @@ var ProdWorker = class {
943
1030
  });
944
1031
  }
945
1032
  await setTimeout2(200);
946
- process.exit(1);
1033
+ process.exit(111);
947
1034
  }
948
1035
  }
949
- if (this.paused) {
950
- if (!this.nextResumeAfter) {
951
- return;
952
- }
953
- if (!this.attemptFriendlyId) {
954
- logger3.error("Missing friendly ID");
955
- return;
956
- }
957
- if (this.nextResumeAfter === "WAIT_FOR_DURATION") {
958
- this.#resumeAfterDuration();
959
- return;
960
- }
961
- socket.emit("READY_FOR_RESUME", {
962
- version: "v1",
963
- attemptFriendlyId: this.attemptFriendlyId,
964
- type: this.nextResumeAfter
965
- });
966
- return;
967
- }
968
1036
  if (this.executing) {
969
1037
  return;
970
1038
  }
@@ -1001,7 +1069,8 @@ var ProdWorker = class {
1001
1069
  case "/status": {
1002
1070
  return reply.json({
1003
1071
  executing: this.executing,
1004
- pause: this.paused,
1072
+ paused: this.paused,
1073
+ completed: this.completed.size,
1005
1074
  nextResumeAfter: this.nextResumeAfter
1006
1075
  });
1007
1076
  }
@@ -1039,7 +1108,6 @@ var ProdWorker = class {
1039
1108
  break;
1040
1109
  }
1041
1110
  }
1042
- logger2.log("preStop", { url: req.url });
1043
1111
  return reply.text("preStop ok");
1044
1112
  }
1045
1113
  case "/postStart": {