trigger.dev 3.0.0-beta.4 → 3.0.0-beta.40

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,92 +2,71 @@
2
2
  import {
3
3
  ProdChildToWorkerMessages,
4
4
  ProdWorkerToChildMessages,
5
- TaskExecutor,
6
- ZodIpcConnection,
7
- DurableClock,
8
5
  clock,
9
- getEnvVar,
10
- logLevels,
11
- ZodSchemaParsedError
6
+ taskCatalog
12
7
  } from "@trigger.dev/core/v3";
13
- import "source-map-support/register.js";
14
8
  import {
15
9
  ConsoleInterceptor,
10
+ DevUsageManager,
11
+ DurableClock,
16
12
  OtelTaskLogger,
17
- ProdRuntimeManager,
13
+ ProdUsageManager,
14
+ TaskExecutor,
15
+ getEnvVar,
16
+ logLevels,
17
+ usage
18
+ } from "@trigger.dev/core/v3/workers";
19
+ import { ZodIpcConnection } from "@trigger.dev/core/v3/zodIpc";
20
+ import { ZodSchemaParsedError } from "@trigger.dev/core/v3/zodMessageHandler";
21
+ import "source-map-support/register.js";
22
+ import {
18
23
  TaskRunErrorCodes,
19
24
  TriggerTracer,
20
25
  logger,
21
26
  runtime
22
27
  } from "@trigger.dev/core/v3";
23
-
24
- // package.json
25
- var version = "3.0.0-beta.4";
26
-
27
- // src/workers/prod/worker-facade.ts
28
+ import { ProdRuntimeManager } from "@trigger.dev/core/v3/prod";
28
29
  __WORKER_SETUP__;
29
30
  __IMPORTED_PROJECT_CONFIG__;
30
- var otelTracer = tracingSDK.getTracer("trigger-prod-worker", version);
31
- var otelLogger = tracingSDK.getLogger("trigger-prod-worker", version);
31
+ var heartbeatIntervalMs = getEnvVar("USAGE_HEARTBEAT_INTERVAL_MS");
32
+ var usageEventUrl = getEnvVar("USAGE_EVENT_URL");
33
+ var triggerJWT = getEnvVar("TRIGGER_JWT");
34
+ var prodUsageManager = new ProdUsageManager(new DevUsageManager(), {
35
+ heartbeatIntervalMs: heartbeatIntervalMs ? parseInt(heartbeatIntervalMs, 10) : void 0,
36
+ url: usageEventUrl,
37
+ jwt: triggerJWT
38
+ });
39
+ usage.setGlobalUsageManager(prodUsageManager);
32
40
  var durableClock = new DurableClock();
33
41
  clock.setGlobalClock(durableClock);
34
42
  var tracer = new TriggerTracer({ tracer: otelTracer, logger: otelLogger });
35
- var consoleInterceptor = new ConsoleInterceptor(otelLogger);
43
+ var consoleInterceptor = new ConsoleInterceptor(otelLogger, true);
36
44
  var triggerLogLevel = getEnvVar("TRIGGER_LOG_LEVEL");
37
45
  var configLogLevel = triggerLogLevel ? triggerLogLevel : importedConfig ? importedConfig.logLevel : __PROJECT_CONFIG__.logLevel;
38
46
  var otelTaskLogger = new OtelTaskLogger({
39
47
  logger: otelLogger,
40
48
  tracer,
41
- level: logLevels.includes(configLogLevel) ? configLogLevel : "log"
49
+ level: logLevels.includes(configLogLevel) ? configLogLevel : "info"
42
50
  });
43
51
  logger.setGlobalTaskLogger(otelTaskLogger);
44
52
  var TaskFileImports = {};
45
53
  var TaskFiles = {};
46
54
  __TASKS__;
47
- function getTasks() {
48
- const result = [];
55
+ (() => {
49
56
  for (const [importName, taskFile] of Object.entries(TaskFiles)) {
50
57
  const fileImports = TaskFileImports[importName];
51
58
  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
- });
59
+ if (typeof task === "object" && task !== null && "id" in task && typeof task.id === "string") {
60
+ if (taskCatalog.taskExists(task.id)) {
61
+ taskCatalog.registerTaskFileMetadata(task.id, {
62
+ exportName,
63
+ filePath: taskFile.filePath
64
+ });
65
+ }
63
66
  }
64
67
  }
65
68
  }
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
- }
69
+ })();
91
70
  var _execution;
92
71
  var _isRunning = false;
93
72
  var zodIpc = new ZodIpcConnection({
@@ -102,7 +81,7 @@ var zodIpc = new ZodIpcConnection({
102
81
  execution,
103
82
  result: {
104
83
  ok: false,
105
- id: execution.attempt.id,
84
+ id: execution.run.id,
106
85
  error: {
107
86
  type: "INTERNAL_ERROR",
108
87
  code: TaskRunErrorCodes.TASK_ALREADY_RUNNING
@@ -112,14 +91,14 @@ var zodIpc = new ZodIpcConnection({
112
91
  return;
113
92
  }
114
93
  process.title = `trigger-prod-worker: ${execution.task.id} ${execution.run.id}`;
115
- const executor = taskExecutors.get(execution.task.id);
116
- if (!executor) {
117
- console.error(`Could not find executor for task ${execution.task.id}`);
94
+ const task = taskCatalog.getTask(execution.task.id);
95
+ if (!task) {
96
+ console.error(`Could not find task ${execution.task.id}`);
118
97
  await sender.send("TASK_RUN_COMPLETED", {
119
98
  execution,
120
99
  result: {
121
100
  ok: false,
122
- id: execution.attempt.id,
101
+ id: execution.run.id,
123
102
  error: {
124
103
  type: "INTERNAL_ERROR",
125
104
  code: TaskRunErrorCodes.COULD_NOT_FIND_EXECUTOR
@@ -128,51 +107,102 @@ var zodIpc = new ZodIpcConnection({
128
107
  });
129
108
  return;
130
109
  }
110
+ const executor = new TaskExecutor(task, {
111
+ tracer,
112
+ tracingSDK,
113
+ consoleInterceptor,
114
+ projectConfig: __PROJECT_CONFIG__,
115
+ importedConfig,
116
+ handleErrorFn: handleError
117
+ });
131
118
  try {
132
119
  _execution = execution;
133
120
  _isRunning = true;
134
- const result = await executor.execute(execution, metadata, traceContext);
135
- return sender.send("TASK_RUN_COMPLETED", {
121
+ const measurement = usage.start();
122
+ const { result } = await executor.execute(execution, metadata, traceContext, measurement);
123
+ const usageSample = usage.stop(measurement);
124
+ return await sender.send("TASK_RUN_COMPLETED", {
136
125
  execution,
137
- result
126
+ result: {
127
+ ...result,
128
+ usage: {
129
+ durationMs: usageSample.cpuTime
130
+ }
131
+ }
138
132
  });
139
133
  } finally {
140
134
  _execution = void 0;
141
135
  _isRunning = false;
142
136
  }
143
137
  },
144
- TASK_RUN_COMPLETED_NOTIFICATION: async ({ completion, execution }) => {
145
- prodRuntimeManager.resumeTask(completion, execution);
138
+ TASK_RUN_COMPLETED_NOTIFICATION: async ({ completion }) => {
139
+ prodRuntimeManager.resumeTask(completion);
146
140
  },
147
141
  WAIT_COMPLETED_NOTIFICATION: async () => {
148
- prodRuntimeManager.resumeAfterRestore();
142
+ prodRuntimeManager.resumeAfterDuration();
149
143
  },
150
144
  CLEANUP: async ({ flush, kill }, sender) => {
151
145
  if (kill) {
152
- await tracingSDK.flush();
146
+ await flushAll();
153
147
  await sender.send("READY_TO_DISPOSE", void 0);
154
148
  } else {
155
149
  if (flush) {
156
- await tracingSDK.flush();
150
+ await flushAll();
157
151
  }
158
152
  }
159
153
  }
160
154
  }
161
155
  });
156
+ async function flushAll(timeoutInMs = 1e4) {
157
+ const now = performance.now();
158
+ console.log(`Flushing at ${now}`);
159
+ await Promise.all([flushUsage(), flushTracingSDK()]);
160
+ const duration = performance.now() - now;
161
+ console.log(`Flushed in ${duration}ms`);
162
+ }
163
+ async function flushUsage() {
164
+ const now = performance.now();
165
+ console.log(`Flushing usage at ${now}`);
166
+ await prodUsageManager.flush();
167
+ const duration = performance.now() - now;
168
+ console.log(`Flushed usage in ${duration}ms`);
169
+ }
170
+ async function flushTracingSDK() {
171
+ const now = performance.now();
172
+ console.log(`Flushing tracingSDK at ${now}`);
173
+ await tracingSDK.flush();
174
+ const duration = performance.now() - now;
175
+ console.log(`Flushed tracingSDK in ${duration}ms`);
176
+ }
177
+ process.on("SIGTERM", async () => {
178
+ });
162
179
  var prodRuntimeManager = new ProdRuntimeManager(zodIpc, {
163
180
  waitThresholdInMs: parseInt(process.env.TRIGGER_RUNTIME_WAIT_THRESHOLD_IN_MS ?? "30000", 10)
164
181
  });
165
182
  runtime.setGlobalRuntimeManager(prodRuntimeManager);
166
- var TASK_METADATA = getTaskMetadata();
167
- zodIpc.send("TASKS_READY", { tasks: TASK_METADATA }).catch((err) => {
183
+ var taskMetadata = taskCatalog.getAllTaskMetadata();
184
+ if (typeof importedConfig?.machine === "string") {
185
+ taskMetadata = taskMetadata.map((task) => {
186
+ if (typeof task.machine?.preset !== "string") {
187
+ return {
188
+ ...task,
189
+ machine: {
190
+ preset: importedConfig.machine
191
+ }
192
+ };
193
+ }
194
+ return task;
195
+ });
196
+ }
197
+ zodIpc.send("TASKS_READY", { tasks: taskMetadata }).catch((err) => {
168
198
  if (err instanceof ZodSchemaParsedError) {
169
- zodIpc.send("TASKS_FAILED_TO_PARSE", { zodIssues: err.error.issues, tasks: TASK_METADATA });
199
+ zodIpc.send("TASKS_FAILED_TO_PARSE", { zodIssues: err.error.issues, tasks: taskMetadata });
170
200
  } else {
171
201
  console.error("Failed to send TASKS_READY message", err);
172
202
  }
173
203
  });
174
204
  process.title = "trigger-prod-worker";
175
- async function asyncHeartbeat(initialDelayInSeconds = 30, intervalInSeconds = 5) {
205
+ async function asyncHeartbeat(initialDelayInSeconds = 30, intervalInSeconds = 20) {
176
206
  async function _doHeartbeat() {
177
207
  while (true) {
178
208
  if (_isRunning && _execution) {
@@ -1,35 +1,24 @@
1
+ // package.json
2
+ var version = "3.0.0-beta.40";
3
+
1
4
  // src/workers/prod/worker-setup.ts
2
- import { Resource } from "@opentelemetry/resources";
5
+ import { taskCatalog } from "@trigger.dev/core/v3";
3
6
  import {
4
- SemanticInternalAttributes,
5
- TracingSDK
6
- } from "@trigger.dev/core/v3";
7
+ TracingSDK,
8
+ StandardTaskCatalog
9
+ } from "@trigger.dev/core/v3/workers";
7
10
  __SETUP_IMPORTED_PROJECT_CONFIG__;
8
11
  var tracingSDK = new TracingSDK({
9
12
  url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? "http://0.0.0.0:4318",
10
- resource: new Resource({
11
- [SemanticInternalAttributes.CLI_VERSION]: "3.0.0"
12
- }),
13
13
  instrumentations: setupImportedConfig?.instrumentations ?? [],
14
- diagLogLevel: process.env.OTEL_LOG_LEVEL ?? "none"
15
- });
16
- process.on("uncaughtException", (error, origin) => {
17
- process.send?.({
18
- type: "EVENT",
19
- message: {
20
- type: "UNCAUGHT_EXCEPTION",
21
- payload: {
22
- error: {
23
- name: error.name,
24
- message: error.message,
25
- stack: error.stack
26
- },
27
- origin
28
- },
29
- version: "v1"
30
- }
31
- });
14
+ diagLogLevel: process.env.OTEL_LOG_LEVEL ?? "none",
15
+ forceFlushTimeoutMillis: process.env.OTEL_FORCE_FLUSH_TIMEOUT ? parseInt(process.env.OTEL_FORCE_FLUSH_TIMEOUT, 10) : 5e3
32
16
  });
17
+ var otelTracer = tracingSDK.getTracer("trigger-prod-worker", version);
18
+ var otelLogger = tracingSDK.getLogger("trigger-prod-worker", version);
19
+ taskCatalog.setGlobalTaskCatalog(new StandardTaskCatalog());
33
20
  export {
21
+ otelLogger,
22
+ otelTracer,
34
23
  tracingSDK
35
24
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trigger.dev",
3
- "version": "3.0.0-beta.4",
3
+ "version": "3.0.0-beta.40",
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",
@@ -44,23 +43,21 @@
44
43
  "@types/semver": "^7.3.13",
45
44
  "@types/ws": "^8.5.3",
46
45
  "cpy-cli": "^5.0.0",
46
+ "nodemon": "^3.0.1",
47
47
  "npm-run-all": "^4.1.5",
48
- "npm-watch": "^0.11.0",
49
48
  "open": "^10.0.3",
50
49
  "p-retry": "^6.1.0",
51
50
  "rimraf": "^3.0.2",
52
51
  "tsup": "^8.0.1",
53
52
  "type-fest": "^3.6.0",
54
53
  "typescript": "^5.3.3",
55
- "vitest": "^0.34.4",
54
+ "vitest": "^1.6.0",
56
55
  "xdg-app-paths": "^8.3.0",
57
- "@trigger.dev/tsconfig": "0.0.0",
58
- "@trigger.dev/core-apps": "3.0.0-beta.3"
59
- },
60
- "watch": {
61
- "build:prod-containerfile": "src/Containerfile.prod"
56
+ "@trigger.dev/core-apps": "3.0.0-beta.40",
57
+ "@trigger.dev/tsconfig": "0.0.0"
62
58
  },
63
59
  "dependencies": {
60
+ "@anatine/esbuild-decorators": "^0.2.19",
64
61
  "@clack/prompts": "^0.7.0",
65
62
  "@depot/cli": "0.0.1-cli.2.55.0",
66
63
  "@opentelemetry/api": "^1.8.0",
@@ -75,7 +72,7 @@
75
72
  "@opentelemetry/sdk-trace-base": "^1.22.0",
76
73
  "@opentelemetry/sdk-trace-node": "^1.22.0",
77
74
  "@opentelemetry/semantic-conventions": "^1.22.0",
78
- "@trigger.dev/core": "^3.0.0-beta.3",
75
+ "@trigger.dev/core": "3.0.0-beta.40",
79
76
  "@types/degit": "^2.8.3",
80
77
  "chalk": "^5.2.0",
81
78
  "chokidar": "^3.5.3",
@@ -85,19 +82,17 @@
85
82
  "dotenv": "^16.4.4",
86
83
  "esbuild": "^0.19.11",
87
84
  "evt": "^2.4.13",
88
- "execa": "^8.0.0",
85
+ "execa": "^9.1.0",
89
86
  "find-up": "^7.0.0",
90
87
  "glob": "^10.3.10",
91
88
  "gradient-string": "^2.0.2",
92
89
  "import-meta-resolve": "^4.0.0",
93
90
  "ink": "^4.4.1",
94
91
  "jsonc-parser": "^3.2.1",
95
- "jsonlines": "^0.1.1",
96
92
  "liquidjs": "^10.9.2",
97
93
  "mock-fs": "^5.2.0",
98
94
  "nanoid": "^4.0.2",
99
95
  "node-fetch": "^3.3.0",
100
- "npm-check-updates": "^16.12.2",
101
96
  "object-hash": "^3.0.0",
102
97
  "p-debounce": "^4.0.0",
103
98
  "p-throttle": "^6.1.0",
@@ -109,7 +104,6 @@
109
104
  "simple-git": "^3.19.0",
110
105
  "socket.io-client": "^4.7.4",
111
106
  "source-map-support": "^0.5.21",
112
- "supports-color": "^9.4.0",
113
107
  "terminal-link": "^3.0.0",
114
108
  "tiny-invariant": "^1.2.0",
115
109
  "tsconfig-paths": "^4.2.0",
@@ -117,7 +111,8 @@
117
111
  "url": "^0.11.1",
118
112
  "ws": "^8.12.0",
119
113
  "zod": "3.22.3",
120
- "zod-validation-error": "^1.5.0"
114
+ "zod-validation-error": "^1.5.0",
115
+ "typescript": "^5.4.0"
121
116
  },
122
117
  "engines": {
123
118
  "node": ">=18.0.0"
@@ -131,9 +126,10 @@
131
126
  "dev": "npm run clean && run-p dev:**",
132
127
  "dev:main": "tsup --watch",
133
128
  "dev:workers": "tsup --config tsup.workers.config.ts --watch",
134
- "dev:prod-containerfile": "npm-watch",
129
+ "dev:test": "nodemon -w src/Containerfile.prod -x npm run build:prod-containerfile",
135
130
  "clean": "rimraf dist",
136
131
  "start": "node dist/index.js",
137
- "test": "vitest"
132
+ "test": "vitest",
133
+ "test:e2e": "vitest --run -c e2e/vite.config.js"
138
134
  }
139
135
  }