trigger.dev 3.0.0-beta.1 → 3.0.0-beta.11

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.
@@ -2,8 +2,9 @@ import type { TriggerConfig } from "@trigger.dev/sdk/v3";
2
2
 
3
3
  export const config: TriggerConfig = {
4
4
  project: "${projectRef}",
5
+ logLevel: "log",
5
6
  retries: {
6
- enabledInDev: false,
7
+ enabledInDev: true,
7
8
  default: {
8
9
  maxAttempts: 3,
9
10
  minTimeoutInMs: 1000,
@@ -1,7 +1,11 @@
1
1
  // src/workers/dev/worker-facade.ts
2
2
  import {
3
3
  TaskExecutor,
4
- preciseDateOriginNow
4
+ DurableClock,
5
+ clock,
6
+ logLevels,
7
+ getEnvVar,
8
+ ZodSchemaParsedError
5
9
  } from "@trigger.dev/core/v3";
6
10
  import {
7
11
  ConsoleInterceptor,
@@ -16,23 +20,25 @@ import {
16
20
  } from "@trigger.dev/core/v3";
17
21
 
18
22
  // package.json
19
- var version = "3.0.0-beta.1";
23
+ var version = "3.0.0-beta.11";
20
24
 
21
25
  // src/workers/dev/worker-facade.ts
22
26
  __WORKER_SETUP__;
23
27
  __IMPORTED_PROJECT_CONFIG__;
24
28
  var otelTracer = tracingSDK.getTracer("trigger-dev-worker", version);
25
29
  var otelLogger = tracingSDK.getLogger("trigger-dev-worker", version);
26
- var preciseDateOrigin = preciseDateOriginNow();
30
+ var durableClock = new DurableClock();
31
+ clock.setGlobalClock(durableClock);
27
32
  var tracer = new TriggerTracer({ tracer: otelTracer, logger: otelLogger });
28
- var consoleInterceptor = new ConsoleInterceptor(otelLogger, preciseDateOrigin);
33
+ var consoleInterceptor = new ConsoleInterceptor(otelLogger);
29
34
  var devRuntimeManager = new DevRuntimeManager();
30
35
  runtime.setGlobalRuntimeManager(devRuntimeManager);
36
+ var triggerLogLevel = getEnvVar("TRIGGER_LOG_LEVEL");
37
+ var configLogLevel = triggerLogLevel ? triggerLogLevel : importedConfig ? importedConfig.logLevel : __PROJECT_CONFIG__.logLevel;
31
38
  var otelTaskLogger = new OtelTaskLogger({
32
39
  logger: otelLogger,
33
40
  tracer,
34
- level: "info",
35
- preciseDateOrigin
41
+ level: logLevels.includes(configLogLevel) ? configLogLevel : "log"
36
42
  });
37
43
  logger.setGlobalTaskLogger(otelTaskLogger);
38
44
  var TaskFileImports = {};
@@ -51,6 +57,7 @@ function getTasks() {
51
57
  filePath: taskFile.filePath,
52
58
  queue: task.__trigger.queue,
53
59
  retry: task.__trigger.retry,
60
+ machine: task.__trigger.machine,
54
61
  fns: task.__trigger.fns
55
62
  });
56
63
  }
@@ -150,8 +157,13 @@ var handler = new ZodMessageHandler({
150
157
  process.on("message", async (msg) => {
151
158
  await handler.handleMessage(msg);
152
159
  });
153
- sender.send("TASKS_READY", { tasks: getTaskMetadata() }).catch((err) => {
154
- console.error("Failed to send TASKS_READY message", err);
160
+ var TASK_METADATA = getTaskMetadata();
161
+ sender.send("TASKS_READY", { tasks: TASK_METADATA }).catch((err) => {
162
+ if (err instanceof ZodSchemaParsedError) {
163
+ sender.send("TASKS_FAILED_TO_PARSE", { zodIssues: err.error.issues, tasks: TASK_METADATA });
164
+ } else {
165
+ console.error("Failed to send TASKS_READY message", err);
166
+ }
155
167
  });
156
168
  process.title = "trigger-dev-worker";
157
169
  async function asyncHeartbeat(initialDelayInSeconds = 30, intervalInSeconds = 5) {
@@ -1,6 +1,8 @@
1
1
  // src/workers/prod/entry-point.ts
2
2
  import {
3
3
  CoordinatorToProdWorkerMessages,
4
+ PostStartCauses,
5
+ PreStopCauses,
4
6
  ProdWorkerToCoordinatorMessages,
5
7
  ZodSocketConnection as ZodSocketConnection2
6
8
  } from "@trigger.dev/core/v3";
@@ -78,12 +80,12 @@ var MACHINE_NAME = process.env.MACHINE_NAME || "local";
78
80
  var PLATFORM_HOST = process.env.PLATFORM_HOST || "127.0.0.1";
79
81
  var PLATFORM_WS_PORT = process.env.PLATFORM_WS_PORT || 3030;
80
82
  var PLATFORM_SECRET = process.env.PLATFORM_SECRET || "provider-secret";
83
+ var SECURE_CONNECTION = ["1", "true"].includes(process.env.SECURE_CONNECTION ?? "false");
81
84
  var logger = new SimpleLogger(`[${MACHINE_NAME}]`);
82
85
 
83
86
  // src/workers/prod/entry-point.ts
84
87
  import { readFile } from "node:fs/promises";
85
88
  import { createServer } from "node:http";
86
- import { z } from "zod";
87
89
 
88
90
  // src/workers/prod/backgroundWorker.ts
89
91
  import {
@@ -106,6 +108,14 @@ var UncaughtExceptionError = class extends Error {
106
108
  this.name = "UncaughtExceptionError";
107
109
  }
108
110
  };
111
+ var TaskMetadataParseError = class extends Error {
112
+ constructor(zodIssues, tasks) {
113
+ super(`Failed to parse task metadata`);
114
+ this.zodIssues = zodIssues;
115
+ this.tasks = tasks;
116
+ this.name = "TaskMetadataParseError";
117
+ }
118
+ };
109
119
 
110
120
  // src/workers/prod/backgroundWorker.ts
111
121
  var UnexpectedExitError = class extends Error {
@@ -204,6 +214,14 @@ var ProdBackgroundWorker = class {
204
214
  reject(new UncaughtExceptionError(message.error, message.origin));
205
215
  child.kill();
206
216
  }
217
+ },
218
+ TASKS_FAILED_TO_PARSE: async (message) => {
219
+ if (!resolved) {
220
+ clearTimeout(timeout);
221
+ resolved = true;
222
+ reject(new TaskMetadataParseError(message.zodIssues, message.tasks));
223
+ child.kill();
224
+ }
207
225
  }
208
226
  }
209
227
  });
@@ -245,6 +263,7 @@ var ProdBackgroundWorker = class {
245
263
  );
246
264
  if (!this._taskRunProcess) {
247
265
  const taskRunProcess = new TaskRunProcess(
266
+ payload.execution,
248
267
  this.path,
249
268
  {
250
269
  ...this.params.env,
@@ -287,7 +306,6 @@ var ProdBackgroundWorker = class {
287
306
  try {
288
307
  const taskRunProcess = await this.#initializeTaskRunProcess(payload);
289
308
  const result = await taskRunProcess.executeTaskRun(payload);
290
- await taskRunProcess.cleanup(result.ok || result.retry === void 0);
291
309
  if (result.ok) {
292
310
  return result;
293
311
  }
@@ -356,7 +374,8 @@ var ProdBackgroundWorker = class {
356
374
  }
357
375
  };
358
376
  var TaskRunProcess = class {
359
- constructor(path, env, metadata, worker) {
377
+ constructor(execution, path, env, metadata, worker) {
378
+ this.execution = execution;
360
379
  this.path = path;
361
380
  this.env = env;
362
381
  this.metadata = metadata;
@@ -389,6 +408,7 @@ var TaskRunProcess = class {
389
408
  "ipc"
390
409
  ],
391
410
  env: {
411
+ ...this.execution.run.isTest ? { TRIGGER_LOG_LEVEL: "debug" } : {},
392
412
  ...this.env,
393
413
  OTEL_RESOURCE_ATTRIBUTES: JSON.stringify({
394
414
  [SemanticInternalAttributes.PROJECT_DIR]: this.worker.projectConfig.projectDir
@@ -416,6 +436,7 @@ var TaskRunProcess = class {
416
436
  resolver(result);
417
437
  },
418
438
  READY_TO_DISPOSE: async (message) => {
439
+ process.exit(0);
419
440
  },
420
441
  TASK_HEARTBEAT: async (message) => {
421
442
  this.onTaskHeartbeat.post(message.id);
@@ -648,31 +669,33 @@ var ProdWorker = class {
648
669
  #backgroundWorker;
649
670
  #httpServer;
650
671
  #coordinatorSocket;
651
- async #reconnect(isPostStart = false) {
672
+ async #reconnect(isPostStart = false, reconnectImmediately = false) {
652
673
  if (isPostStart) {
653
674
  this.waitForPostStart = false;
654
675
  }
655
676
  this.#coordinatorSocket.close();
656
- if (!this.runningInKubernetes) {
657
- this.#coordinatorSocket.connect();
658
- return;
677
+ if (!reconnectImmediately) {
678
+ await setTimeout2(1e3);
659
679
  }
680
+ let coordinatorHost = COORDINATOR_HOST;
660
681
  try {
661
- const coordinatorHost = (await readFile("/etc/taskinfo/coordinator-host", "utf-8")).replace(
662
- "\n",
663
- ""
664
- );
665
- logger2.log("reconnecting", {
666
- coordinatorHost: {
667
- fromEnv: COORDINATOR_HOST,
668
- fromVolume: coordinatorHost,
669
- current: this.#coordinatorSocket.socket.io.opts.hostname
670
- }
671
- });
672
- this.#coordinatorSocket = this.#createCoordinatorSocket(coordinatorHost);
682
+ if (this.runningInKubernetes) {
683
+ coordinatorHost = (await readFile("/etc/taskinfo/coordinator-host", "utf-8")).replace(
684
+ "\n",
685
+ ""
686
+ );
687
+ logger2.log("reconnecting", {
688
+ coordinatorHost: {
689
+ fromEnv: COORDINATOR_HOST,
690
+ fromVolume: coordinatorHost,
691
+ current: this.#coordinatorSocket.socket.io.opts.hostname
692
+ }
693
+ });
694
+ }
673
695
  } catch (error) {
674
696
  logger2.error("taskinfo read error during reconnect", { error });
675
- this.#coordinatorSocket.connect();
697
+ } finally {
698
+ this.#coordinatorSocket = this.#createCoordinatorSocket(coordinatorHost);
676
699
  }
677
700
  }
678
701
  #prepareForWait(reason, willCheckpointAndRestore) {
@@ -815,7 +838,6 @@ var ProdWorker = class {
815
838
  const completion = await this.#backgroundWorker.executeTaskRun(executionPayload);
816
839
  logger2.log("completed", completion);
817
840
  this.completed.add(executionPayload.execution.attempt.id);
818
- await this.#backgroundWorker.flushTelemetry();
819
841
  const { willCheckpointAndRestore, shouldExit } = await this.#coordinatorSocket.socket.emitWithAck("TASK_RUN_COMPLETED", {
820
842
  version: "v1",
821
843
  execution: executionPayload.execution,
@@ -866,30 +888,46 @@ var ProdWorker = class {
866
888
  process.exit(1);
867
889
  }
868
890
  } catch (e) {
869
- if (e instanceof UncaughtExceptionError) {
870
- logger3.error("uncaught exception", { message: e.originalError.message });
891
+ if (e instanceof TaskMetadataParseError) {
892
+ logger3.error("tasks metadata parse error", {
893
+ zodIssues: e.zodIssues,
894
+ tasks: e.tasks
895
+ });
871
896
  socket.emit("INDEXING_FAILED", {
872
897
  version: "v1",
873
898
  deploymentId: this.deploymentId,
874
899
  error: {
875
- name: e.originalError.name,
876
- message: e.originalError.message,
877
- stack: e.originalError.stack
900
+ name: "TaskMetadataParseError",
901
+ message: "There was an error parsing the task metadata",
902
+ stack: JSON.stringify({ zodIssues: e.zodIssues, tasks: e.tasks })
878
903
  }
879
904
  });
905
+ } else if (e instanceof UncaughtExceptionError) {
906
+ const error = {
907
+ name: e.originalError.name,
908
+ message: e.originalError.message,
909
+ stack: e.originalError.stack
910
+ };
911
+ logger3.error("uncaught exception", { originalError: error });
912
+ socket.emit("INDEXING_FAILED", {
913
+ version: "v1",
914
+ deploymentId: this.deploymentId,
915
+ error
916
+ });
880
917
  } else if (e instanceof Error) {
881
- logger3.error("error", { message: e.message });
918
+ const error = {
919
+ name: e.name,
920
+ message: e.message,
921
+ stack: e.stack
922
+ };
923
+ logger3.error("error", { error });
882
924
  socket.emit("INDEXING_FAILED", {
883
925
  version: "v1",
884
926
  deploymentId: this.deploymentId,
885
- error: {
886
- name: e.name,
887
- message: e.message,
888
- stack: e.stack
889
- }
927
+ error
890
928
  });
891
929
  } else if (typeof e === "string") {
892
- logger3.error("string error", { message: e });
930
+ logger3.error("string error", { error: { message: e } });
893
931
  socket.emit("INDEXING_FAILED", {
894
932
  version: "v1",
895
933
  deploymentId: this.deploymentId,
@@ -910,7 +948,7 @@ var ProdWorker = class {
910
948
  });
911
949
  }
912
950
  await setTimeout2(200);
913
- process.exit(1);
951
+ process.exit(111);
914
952
  }
915
953
  }
916
954
  if (this.paused) {
@@ -992,20 +1030,13 @@ var ProdWorker = class {
992
1030
  return reply.text("Received ACK from coordinator");
993
1031
  }
994
1032
  case "/preStop": {
995
- const schema = z.enum(["index", "create", "restore"]);
996
- const cause = schema.safeParse(url.searchParams.get("cause"));
1033
+ const cause = PreStopCauses.safeParse(url.searchParams.get("cause"));
997
1034
  if (!cause.success) {
998
1035
  logger2.error("Failed to parse cause", { cause });
999
- return;
1036
+ return reply.text("Failed to parse cause", 400);
1000
1037
  }
1001
1038
  switch (cause.data) {
1002
- case "index": {
1003
- break;
1004
- }
1005
- case "create": {
1006
- break;
1007
- }
1008
- case "restore": {
1039
+ case "terminate": {
1009
1040
  break;
1010
1041
  }
1011
1042
  default: {
@@ -1017,11 +1048,10 @@ var ProdWorker = class {
1017
1048
  return reply.text("preStop ok");
1018
1049
  }
1019
1050
  case "/postStart": {
1020
- const schema = z.enum(["index", "create", "restore"]);
1021
- const cause = schema.safeParse(url.searchParams.get("cause"));
1051
+ const cause = PostStartCauses.safeParse(url.searchParams.get("cause"));
1022
1052
  if (!cause.success) {
1023
1053
  logger2.error("Failed to parse cause", { cause });
1024
- return;
1054
+ return reply.text("Failed to parse cause", 400);
1025
1055
  }
1026
1056
  switch (cause.data) {
1027
1057
  case "index": {
@@ -1031,7 +1061,7 @@ var ProdWorker = class {
1031
1061
  break;
1032
1062
  }
1033
1063
  case "restore": {
1034
- await this.#reconnect(true);
1064
+ await this.#reconnect(true, true);
1035
1065
  break;
1036
1066
  }
1037
1067
  default: {
@@ -1076,11 +1106,7 @@ var ProdWorker = class {
1076
1106
  throw new Error(`Background Worker started without tasks`);
1077
1107
  }
1078
1108
  for (const task of this.#backgroundWorker.tasks) {
1079
- taskResources.push({
1080
- id: task.id,
1081
- filePath: task.filePath,
1082
- exportName: task.exportName
1083
- });
1109
+ taskResources.push(task);
1084
1110
  packageVersion = task.packageVersion;
1085
1111
  }
1086
1112
  if (!packageVersion) {
@@ -4,7 +4,11 @@ import {
4
4
  ProdWorkerToChildMessages,
5
5
  TaskExecutor,
6
6
  ZodIpcConnection,
7
- preciseDateOriginNow
7
+ DurableClock,
8
+ clock,
9
+ getEnvVar,
10
+ logLevels,
11
+ ZodSchemaParsedError
8
12
  } from "@trigger.dev/core/v3";
9
13
  import "source-map-support/register.js";
10
14
  import {
@@ -18,21 +22,23 @@ import {
18
22
  } from "@trigger.dev/core/v3";
19
23
 
20
24
  // package.json
21
- var version = "3.0.0-beta.1";
25
+ var version = "3.0.0-beta.11";
22
26
 
23
27
  // src/workers/prod/worker-facade.ts
24
28
  __WORKER_SETUP__;
25
29
  __IMPORTED_PROJECT_CONFIG__;
26
30
  var otelTracer = tracingSDK.getTracer("trigger-prod-worker", version);
27
31
  var otelLogger = tracingSDK.getLogger("trigger-prod-worker", version);
28
- var preciseDateOrigin = preciseDateOriginNow();
32
+ var durableClock = new DurableClock();
33
+ clock.setGlobalClock(durableClock);
29
34
  var tracer = new TriggerTracer({ tracer: otelTracer, logger: otelLogger });
30
- var consoleInterceptor = new ConsoleInterceptor(otelLogger, preciseDateOrigin);
35
+ var consoleInterceptor = new ConsoleInterceptor(otelLogger);
36
+ var triggerLogLevel = getEnvVar("TRIGGER_LOG_LEVEL");
37
+ var configLogLevel = triggerLogLevel ? triggerLogLevel : importedConfig ? importedConfig.logLevel : __PROJECT_CONFIG__.logLevel;
31
38
  var otelTaskLogger = new OtelTaskLogger({
32
39
  logger: otelLogger,
33
40
  tracer,
34
- level: "info",
35
- preciseDateOrigin
41
+ level: logLevels.includes(configLogLevel) ? configLogLevel : "log"
36
42
  });
37
43
  logger.setGlobalTaskLogger(otelTaskLogger);
38
44
  var TaskFileImports = {};
@@ -51,6 +57,7 @@ function getTasks() {
51
57
  filePath: taskFile.filePath,
52
58
  queue: task.__trigger.queue,
53
59
  retry: task.__trigger.retry,
60
+ machine: task.__trigger.machine,
54
61
  fns: task.__trigger.fns
55
62
  });
56
63
  }
@@ -152,10 +159,17 @@ var zodIpc = new ZodIpcConnection({
152
159
  }
153
160
  }
154
161
  });
155
- var prodRuntimeManager = new ProdRuntimeManager(zodIpc);
162
+ var prodRuntimeManager = new ProdRuntimeManager(zodIpc, {
163
+ waitThresholdInMs: parseInt(process.env.TRIGGER_RUNTIME_WAIT_THRESHOLD_IN_MS ?? "30000", 10)
164
+ });
156
165
  runtime.setGlobalRuntimeManager(prodRuntimeManager);
157
- zodIpc.send("TASKS_READY", { tasks: getTaskMetadata() }).catch((err) => {
158
- console.error("Failed to send TASKS_READY message", err);
166
+ var TASK_METADATA = getTaskMetadata();
167
+ zodIpc.send("TASKS_READY", { tasks: TASK_METADATA }).catch((err) => {
168
+ if (err instanceof ZodSchemaParsedError) {
169
+ zodIpc.send("TASKS_FAILED_TO_PARSE", { zodIssues: err.error.issues, tasks: TASK_METADATA });
170
+ } else {
171
+ console.error("Failed to send TASKS_READY message", err);
172
+ }
159
173
  });
160
174
  process.title = "trigger-prod-worker";
161
175
  async function asyncHeartbeat(initialDelayInSeconds = 30, intervalInSeconds = 5) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trigger.dev",
3
- "version": "3.0.0-beta.1",
3
+ "version": "3.0.0-beta.11",
4
4
  "description": "A Command-Line Interface for Trigger.dev (v3) projects",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -32,11 +32,10 @@
32
32
  "type": "module",
33
33
  "exports": "./dist/index.js",
34
34
  "bin": {
35
- "trigger.dev": "./dist/index.js"
35
+ "triggerdev": "./dist/index.js"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/gradient-string": "^1.1.2",
39
- "@types/jsonlines": "^0.1.5",
40
39
  "@types/mock-fs": "^4.13.1",
41
40
  "@types/node": "18",
42
41
  "@types/object-hash": "^3.0.6",
@@ -54,8 +53,8 @@
54
53
  "typescript": "^5.3.3",
55
54
  "vitest": "^0.34.4",
56
55
  "xdg-app-paths": "^8.3.0",
57
- "@trigger.dev/core-apps": "3.0.0-beta.0",
58
- "@trigger.dev/tsconfig": "0.0.0"
56
+ "@trigger.dev/tsconfig": "0.0.0",
57
+ "@trigger.dev/core-apps": "3.0.0-beta.11"
59
58
  },
60
59
  "watch": {
61
60
  "build:prod-containerfile": "src/Containerfile.prod"
@@ -75,7 +74,7 @@
75
74
  "@opentelemetry/sdk-trace-base": "^1.22.0",
76
75
  "@opentelemetry/sdk-trace-node": "^1.22.0",
77
76
  "@opentelemetry/semantic-conventions": "^1.22.0",
78
- "@trigger.dev/core": "^3.0.0-beta.0",
77
+ "@trigger.dev/core": "^3.0.0-beta.11",
79
78
  "@types/degit": "^2.8.3",
80
79
  "chalk": "^5.2.0",
81
80
  "chokidar": "^3.5.3",
@@ -92,7 +91,6 @@
92
91
  "import-meta-resolve": "^4.0.0",
93
92
  "ink": "^4.4.1",
94
93
  "jsonc-parser": "^3.2.1",
95
- "jsonlines": "^0.1.1",
96
94
  "liquidjs": "^10.9.2",
97
95
  "mock-fs": "^5.2.0",
98
96
  "nanoid": "^4.0.2",
@@ -109,7 +107,6 @@
109
107
  "simple-git": "^3.19.0",
110
108
  "socket.io-client": "^4.7.4",
111
109
  "source-map-support": "^0.5.21",
112
- "supports-color": "^9.4.0",
113
110
  "terminal-link": "^3.0.0",
114
111
  "tiny-invariant": "^1.2.0",
115
112
  "tsconfig-paths": "^4.2.0",