trigger.dev 3.0.0-beta.36 → 3.0.0-beta.37
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.
|
@@ -8,7 +8,7 @@ import { ZodMessageSender } from "@trigger.dev/core/v3/zodMessageHandler";
|
|
|
8
8
|
import "source-map-support/register.js";
|
|
9
9
|
|
|
10
10
|
// package.json
|
|
11
|
-
var version = "3.0.0-beta.
|
|
11
|
+
var version = "3.0.0-beta.37";
|
|
12
12
|
|
|
13
13
|
// src/workers/dev/worker-setup.ts
|
|
14
14
|
__SETUP_IMPORTED_PROJECT_CONFIG__;
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
PreStopCauses,
|
|
6
6
|
ProdWorkerToCoordinatorMessages
|
|
7
7
|
} from "@trigger.dev/core/v3";
|
|
8
|
-
import { ZodSocketConnection
|
|
8
|
+
import { ZodSocketConnection } from "@trigger.dev/core/v3/zodSocket";
|
|
9
9
|
|
|
10
10
|
// ../core-apps/src/http.ts
|
|
11
11
|
var HttpReply = class {
|
|
@@ -65,24 +65,6 @@ var SimpleLogger = class {
|
|
|
65
65
|
}
|
|
66
66
|
};
|
|
67
67
|
|
|
68
|
-
// ../core-apps/src/provider.ts
|
|
69
|
-
import {
|
|
70
|
-
ClientToSharedQueueMessages,
|
|
71
|
-
clientWebsocketMessages,
|
|
72
|
-
PlatformToProviderMessages,
|
|
73
|
-
ProviderToPlatformMessages,
|
|
74
|
-
SharedQueueToClientMessages
|
|
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
|
-
var HTTP_SERVER_PORT = Number(process.env.HTTP_SERVER_PORT || getRandomPortNumber());
|
|
79
|
-
var MACHINE_NAME = process.env.MACHINE_NAME || "local";
|
|
80
|
-
var PLATFORM_HOST = process.env.PLATFORM_HOST || "127.0.0.1";
|
|
81
|
-
var PLATFORM_WS_PORT = process.env.PLATFORM_WS_PORT || 3030;
|
|
82
|
-
var PLATFORM_SECRET = process.env.PLATFORM_SECRET || "provider-secret";
|
|
83
|
-
var SECURE_CONNECTION = ["1", "true"].includes(process.env.SECURE_CONNECTION ?? "false");
|
|
84
|
-
var logger = new SimpleLogger(`[${MACHINE_NAME}]`);
|
|
85
|
-
|
|
86
68
|
// src/workers/prod/entry-point.ts
|
|
87
69
|
import { readFile } from "node:fs/promises";
|
|
88
70
|
import { createServer } from "node:http";
|
|
@@ -171,6 +153,7 @@ var ProdBackgroundWorker = class {
|
|
|
171
153
|
attemptCreatedNotification = Evt.create();
|
|
172
154
|
_onClose = new Evt();
|
|
173
155
|
tasks = [];
|
|
156
|
+
stderr = [];
|
|
174
157
|
_taskRunProcess;
|
|
175
158
|
_taskRunProcessesBeingKilled = /* @__PURE__ */ new Map();
|
|
176
159
|
_closed = false;
|
|
@@ -234,6 +217,20 @@ var ProdBackgroundWorker = class {
|
|
|
234
217
|
child.kill();
|
|
235
218
|
reject(new Error("Worker timed out"));
|
|
236
219
|
}, 1e4);
|
|
220
|
+
child.stdout?.on("data", (data) => {
|
|
221
|
+
console.log(data.toString());
|
|
222
|
+
});
|
|
223
|
+
child.stderr?.on("data", (data) => {
|
|
224
|
+
console.error(data.toString());
|
|
225
|
+
this.stderr.push(data.toString());
|
|
226
|
+
});
|
|
227
|
+
child.on("exit", (code) => {
|
|
228
|
+
if (!resolved) {
|
|
229
|
+
clearTimeout(timeout);
|
|
230
|
+
resolved = true;
|
|
231
|
+
reject(new Error(`Worker exited with code ${code}`));
|
|
232
|
+
}
|
|
233
|
+
});
|
|
237
234
|
new ZodIpcConnection({
|
|
238
235
|
listenSchema: ProdChildToWorkerMessages,
|
|
239
236
|
emitSchema: ProdWorkerToChildMessages,
|
|
@@ -265,19 +262,6 @@ var ProdBackgroundWorker = class {
|
|
|
265
262
|
}
|
|
266
263
|
}
|
|
267
264
|
});
|
|
268
|
-
child.stdout?.on("data", (data) => {
|
|
269
|
-
console.log(data.toString());
|
|
270
|
-
});
|
|
271
|
-
child.stderr?.on("data", (data) => {
|
|
272
|
-
console.error(data.toString());
|
|
273
|
-
});
|
|
274
|
-
child.on("exit", (code) => {
|
|
275
|
-
if (!resolved) {
|
|
276
|
-
clearTimeout(timeout);
|
|
277
|
-
resolved = true;
|
|
278
|
-
reject(new Error(`Worker exited with code ${code}`));
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
265
|
});
|
|
282
266
|
this._initialized = true;
|
|
283
267
|
}
|
|
@@ -818,13 +802,13 @@ var TaskRunProcess = class {
|
|
|
818
802
|
|
|
819
803
|
// src/workers/prod/entry-point.ts
|
|
820
804
|
import { setTimeout as setTimeout2 } from "node:timers/promises";
|
|
821
|
-
var
|
|
805
|
+
var HTTP_SERVER_PORT = Number(process.env.HTTP_SERVER_PORT || getRandomPortNumber());
|
|
822
806
|
var COORDINATOR_HOST = process.env.COORDINATOR_HOST || "127.0.0.1";
|
|
823
807
|
var COORDINATOR_PORT = Number(process.env.COORDINATOR_PORT || 50080);
|
|
824
|
-
var
|
|
808
|
+
var MACHINE_NAME = process.env.MACHINE_NAME || "local";
|
|
825
809
|
var POD_NAME = process.env.POD_NAME || "some-pod";
|
|
826
810
|
var SHORT_HASH = process.env.TRIGGER_CONTENT_HASH.slice(0, 9);
|
|
827
|
-
var
|
|
811
|
+
var logger = new SimpleLogger(`[${MACHINE_NAME}][${SHORT_HASH}]`);
|
|
828
812
|
var ProdWorker = class {
|
|
829
813
|
constructor(port, host = "0.0.0.0") {
|
|
830
814
|
this.host = host;
|
|
@@ -854,24 +838,24 @@ var ProdWorker = class {
|
|
|
854
838
|
#httpServer;
|
|
855
839
|
#coordinatorSocket;
|
|
856
840
|
async #handleSignal(signal) {
|
|
857
|
-
|
|
841
|
+
logger.log("Received signal", { signal });
|
|
858
842
|
if (signal === "SIGTERM") {
|
|
859
843
|
let gracefulExitTimeoutElapsed = false;
|
|
860
844
|
if (this.executing) {
|
|
861
845
|
const terminationGracePeriodSeconds = 60 * 60;
|
|
862
|
-
|
|
846
|
+
logger.log("Waiting for attempt to complete before exiting", {
|
|
863
847
|
terminationGracePeriodSeconds
|
|
864
848
|
});
|
|
865
849
|
await setTimeout2(terminationGracePeriodSeconds * 1e3 - 5e3);
|
|
866
850
|
gracefulExitTimeoutElapsed = true;
|
|
867
|
-
|
|
851
|
+
logger.log("Termination timeout reached, exiting gracefully.");
|
|
868
852
|
} else {
|
|
869
|
-
|
|
853
|
+
logger.log("Not executing, exiting immediately.");
|
|
870
854
|
}
|
|
871
855
|
await this.#exitGracefully(gracefulExitTimeoutElapsed);
|
|
872
856
|
return;
|
|
873
857
|
}
|
|
874
|
-
|
|
858
|
+
logger.log("Unhandled signal", { signal });
|
|
875
859
|
}
|
|
876
860
|
async #exitGracefully(gracefulExitTimeoutElapsed = false) {
|
|
877
861
|
await this.#backgroundWorker.close(gracefulExitTimeoutElapsed);
|
|
@@ -894,7 +878,7 @@ var ProdWorker = class {
|
|
|
894
878
|
"\n",
|
|
895
879
|
""
|
|
896
880
|
);
|
|
897
|
-
|
|
881
|
+
logger.log("reconnecting", {
|
|
898
882
|
coordinatorHost: {
|
|
899
883
|
fromEnv: COORDINATOR_HOST,
|
|
900
884
|
fromVolume: coordinatorHost,
|
|
@@ -903,7 +887,7 @@ var ProdWorker = class {
|
|
|
903
887
|
});
|
|
904
888
|
}
|
|
905
889
|
} catch (error) {
|
|
906
|
-
|
|
890
|
+
logger.error("taskinfo read error during reconnect", {
|
|
907
891
|
error: error instanceof Error ? error.message : error
|
|
908
892
|
});
|
|
909
893
|
} finally {
|
|
@@ -932,7 +916,7 @@ var ProdWorker = class {
|
|
|
932
916
|
this.#coordinatorSocket.socket.emit("READY_FOR_CHECKPOINT", { version: "v1" });
|
|
933
917
|
});
|
|
934
918
|
backgroundWorker.onCancelCheckpoint.attach(async (message) => {
|
|
935
|
-
|
|
919
|
+
logger.log("onCancelCheckpoint", { message });
|
|
936
920
|
const { checkpointCanceled } = await this.#coordinatorSocket.socket.emitWithAck(
|
|
937
921
|
"CANCEL_CHECKPOINT",
|
|
938
922
|
{
|
|
@@ -940,7 +924,7 @@ var ProdWorker = class {
|
|
|
940
924
|
reason: message.reason
|
|
941
925
|
}
|
|
942
926
|
);
|
|
943
|
-
|
|
927
|
+
logger.log("onCancelCheckpoint coordinator response", { checkpointCanceled });
|
|
944
928
|
if (checkpointCanceled) {
|
|
945
929
|
if (message.reason === "WAIT_FOR_DURATION") {
|
|
946
930
|
this.paused = false;
|
|
@@ -951,7 +935,7 @@ var ProdWorker = class {
|
|
|
951
935
|
backgroundWorker.checkpointCanceledNotification.post({ checkpointCanceled });
|
|
952
936
|
});
|
|
953
937
|
backgroundWorker.onCreateTaskRunAttempt.attach(async (message) => {
|
|
954
|
-
|
|
938
|
+
logger.log("onCreateTaskRunAttempt()", { message });
|
|
955
939
|
const createAttempt = await this.#coordinatorSocket.socket.emitWithAck(
|
|
956
940
|
"CREATE_TASK_RUN_ATTEMPT",
|
|
957
941
|
{
|
|
@@ -979,7 +963,7 @@ var ProdWorker = class {
|
|
|
979
963
|
});
|
|
980
964
|
backgroundWorker.onWaitForDuration.attach(async (message) => {
|
|
981
965
|
if (!this.attemptFriendlyId) {
|
|
982
|
-
|
|
966
|
+
logger.error("Failed to send wait message, attempt friendly ID not set", { message });
|
|
983
967
|
this.#emitUnrecoverableError(
|
|
984
968
|
"NoAttemptId",
|
|
985
969
|
"Attempt ID not set before waiting for duration"
|
|
@@ -997,7 +981,7 @@ var ProdWorker = class {
|
|
|
997
981
|
});
|
|
998
982
|
backgroundWorker.onWaitForTask.attach(async (message) => {
|
|
999
983
|
if (!this.attemptFriendlyId) {
|
|
1000
|
-
|
|
984
|
+
logger.error("Failed to send wait message, attempt friendly ID not set", { message });
|
|
1001
985
|
this.#emitUnrecoverableError("NoAttemptId", "Attempt ID not set before waiting for task");
|
|
1002
986
|
return;
|
|
1003
987
|
}
|
|
@@ -1012,7 +996,7 @@ var ProdWorker = class {
|
|
|
1012
996
|
});
|
|
1013
997
|
backgroundWorker.onWaitForBatch.attach(async (message) => {
|
|
1014
998
|
if (!this.attemptFriendlyId) {
|
|
1015
|
-
|
|
999
|
+
logger.error("Failed to send wait message, attempt friendly ID not set", { message });
|
|
1016
1000
|
this.#emitUnrecoverableError("NoAttemptId", "Attempt ID not set before waiting for batch");
|
|
1017
1001
|
return;
|
|
1018
1002
|
}
|
|
@@ -1028,7 +1012,7 @@ var ProdWorker = class {
|
|
|
1028
1012
|
return backgroundWorker;
|
|
1029
1013
|
}
|
|
1030
1014
|
async #prepareForWait(reason, willCheckpointAndRestore) {
|
|
1031
|
-
|
|
1015
|
+
logger.log(`prepare for ${reason}`, { willCheckpointAndRestore });
|
|
1032
1016
|
this.#backgroundWorker.preCheckpointNotification.post({ willCheckpointAndRestore });
|
|
1033
1017
|
if (willCheckpointAndRestore) {
|
|
1034
1018
|
this.paused = true;
|
|
@@ -1040,10 +1024,10 @@ var ProdWorker = class {
|
|
|
1040
1024
|
}
|
|
1041
1025
|
}
|
|
1042
1026
|
async #prepareForRetry(willCheckpointAndRestore, shouldExit) {
|
|
1043
|
-
|
|
1027
|
+
logger.log("prepare for retry", { willCheckpointAndRestore, shouldExit });
|
|
1044
1028
|
if (shouldExit) {
|
|
1045
1029
|
if (willCheckpointAndRestore) {
|
|
1046
|
-
|
|
1030
|
+
logger.log("WARNING: Will checkpoint but also requested exit. This won't end well.");
|
|
1047
1031
|
}
|
|
1048
1032
|
await this.#exitGracefully();
|
|
1049
1033
|
return;
|
|
@@ -1082,7 +1066,7 @@ var ProdWorker = class {
|
|
|
1082
1066
|
// FIXME: If the the worker can't connect for a while, this runs MANY times - it should only run once
|
|
1083
1067
|
#createCoordinatorSocket(host) {
|
|
1084
1068
|
const extraHeaders = this.#returnValidatedExtraHeaders({
|
|
1085
|
-
"x-machine-name":
|
|
1069
|
+
"x-machine-name": MACHINE_NAME,
|
|
1086
1070
|
"x-pod-name": POD_NAME,
|
|
1087
1071
|
"x-trigger-content-hash": this.contentHash,
|
|
1088
1072
|
"x-trigger-project-ref": this.projectRef,
|
|
@@ -1094,9 +1078,9 @@ var ProdWorker = class {
|
|
|
1094
1078
|
if (this.attemptFriendlyId) {
|
|
1095
1079
|
extraHeaders["x-trigger-attempt-friendly-id"] = this.attemptFriendlyId;
|
|
1096
1080
|
}
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
const coordinatorConnection = new
|
|
1081
|
+
logger.log(`connecting to coordinator: ${host}:${COORDINATOR_PORT}`);
|
|
1082
|
+
logger.debug(`connecting with extra headers`, { extraHeaders });
|
|
1083
|
+
const coordinatorConnection = new ZodSocketConnection({
|
|
1100
1084
|
namespace: "prod-worker",
|
|
1101
1085
|
host,
|
|
1102
1086
|
port: COORDINATOR_PORT,
|
|
@@ -1106,21 +1090,21 @@ var ProdWorker = class {
|
|
|
1106
1090
|
handlers: {
|
|
1107
1091
|
RESUME_AFTER_DEPENDENCY: async ({ completions }) => {
|
|
1108
1092
|
if (!this.paused) {
|
|
1109
|
-
|
|
1093
|
+
logger.error("Failed to resume after dependency: Worker not paused");
|
|
1110
1094
|
return;
|
|
1111
1095
|
}
|
|
1112
1096
|
if (completions.length === 0) {
|
|
1113
|
-
|
|
1097
|
+
logger.error("Failed to resume after dependency: No completions");
|
|
1114
1098
|
return;
|
|
1115
1099
|
}
|
|
1116
1100
|
if (this.nextResumeAfter !== "WAIT_FOR_TASK" && this.nextResumeAfter !== "WAIT_FOR_BATCH") {
|
|
1117
|
-
|
|
1101
|
+
logger.error("Failed to resume after dependency: Invalid next resume", {
|
|
1118
1102
|
nextResumeAfter: this.nextResumeAfter
|
|
1119
1103
|
});
|
|
1120
1104
|
return;
|
|
1121
1105
|
}
|
|
1122
1106
|
if (this.nextResumeAfter === "WAIT_FOR_TASK" && completions.length > 1) {
|
|
1123
|
-
|
|
1107
|
+
logger.error(
|
|
1124
1108
|
"Failed to resume after dependency: Waiting for single task but got multiple completions",
|
|
1125
1109
|
{
|
|
1126
1110
|
completions
|
|
@@ -1140,13 +1124,13 @@ var ProdWorker = class {
|
|
|
1140
1124
|
},
|
|
1141
1125
|
RESUME_AFTER_DURATION: async (message) => {
|
|
1142
1126
|
if (!this.paused) {
|
|
1143
|
-
|
|
1127
|
+
logger.error("worker not paused", {
|
|
1144
1128
|
attemptId: message.attemptId
|
|
1145
1129
|
});
|
|
1146
1130
|
return;
|
|
1147
1131
|
}
|
|
1148
1132
|
if (this.nextResumeAfter !== "WAIT_FOR_DURATION") {
|
|
1149
|
-
|
|
1133
|
+
logger.error("not waiting to resume after duration", {
|
|
1150
1134
|
nextResumeAfter: this.nextResumeAfter
|
|
1151
1135
|
});
|
|
1152
1136
|
return;
|
|
@@ -1155,42 +1139,42 @@ var ProdWorker = class {
|
|
|
1155
1139
|
},
|
|
1156
1140
|
EXECUTE_TASK_RUN: async ({ executionPayload }) => {
|
|
1157
1141
|
if (this.executing) {
|
|
1158
|
-
|
|
1142
|
+
logger.error("dropping execute request, already executing");
|
|
1159
1143
|
return;
|
|
1160
1144
|
}
|
|
1161
1145
|
if (this.completed.has(executionPayload.execution.attempt.id)) {
|
|
1162
|
-
|
|
1146
|
+
logger.error("dropping execute request, already completed");
|
|
1163
1147
|
return;
|
|
1164
1148
|
}
|
|
1165
1149
|
this.executing = true;
|
|
1166
1150
|
this.attemptFriendlyId = executionPayload.execution.attempt.id;
|
|
1167
1151
|
const completion = await this.#backgroundWorker.executeTaskRun(executionPayload);
|
|
1168
|
-
|
|
1152
|
+
logger.log("completed", completion);
|
|
1169
1153
|
this.completed.add(executionPayload.execution.attempt.id);
|
|
1170
1154
|
const { willCheckpointAndRestore, shouldExit } = await this.#coordinatorSocket.socket.emitWithAck("TASK_RUN_COMPLETED", {
|
|
1171
1155
|
version: "v1",
|
|
1172
1156
|
execution: executionPayload.execution,
|
|
1173
1157
|
completion
|
|
1174
1158
|
});
|
|
1175
|
-
|
|
1159
|
+
logger.log("completion acknowledged", { willCheckpointAndRestore, shouldExit });
|
|
1176
1160
|
this.#prepareForRetry(willCheckpointAndRestore, shouldExit);
|
|
1177
1161
|
},
|
|
1178
1162
|
EXECUTE_TASK_RUN_LAZY_ATTEMPT: async (message) => {
|
|
1179
1163
|
if (this.executing) {
|
|
1180
|
-
|
|
1164
|
+
logger.error("dropping execute request, already executing");
|
|
1181
1165
|
return;
|
|
1182
1166
|
}
|
|
1183
1167
|
this.executing = true;
|
|
1184
1168
|
try {
|
|
1185
1169
|
const { completion, execution } = await this.#backgroundWorker.executeTaskRunLazyAttempt(message.lazyPayload);
|
|
1186
|
-
|
|
1170
|
+
logger.log("completed", completion);
|
|
1187
1171
|
this.completed.add(execution.attempt.id);
|
|
1188
1172
|
const { willCheckpointAndRestore, shouldExit } = await this.#coordinatorSocket.socket.emitWithAck("TASK_RUN_COMPLETED", {
|
|
1189
1173
|
version: "v1",
|
|
1190
1174
|
execution,
|
|
1191
1175
|
completion
|
|
1192
1176
|
});
|
|
1193
|
-
|
|
1177
|
+
logger.log("completion acknowledged", { willCheckpointAndRestore, shouldExit });
|
|
1194
1178
|
this.#prepareForRetry(willCheckpointAndRestore, shouldExit);
|
|
1195
1179
|
} catch (error) {
|
|
1196
1180
|
const completion = {
|
|
@@ -1217,15 +1201,15 @@ var ProdWorker = class {
|
|
|
1217
1201
|
},
|
|
1218
1202
|
REQUEST_ATTEMPT_CANCELLATION: async (message) => {
|
|
1219
1203
|
if (!this.executing) {
|
|
1220
|
-
|
|
1204
|
+
logger.log("dropping cancel request, not executing", { status: this.#status });
|
|
1221
1205
|
return;
|
|
1222
1206
|
}
|
|
1223
|
-
|
|
1207
|
+
logger.log("cancelling attempt", { attemptId: message.attemptId, status: this.#status });
|
|
1224
1208
|
await this.#backgroundWorker.cancelAttempt(message.attemptId);
|
|
1225
1209
|
},
|
|
1226
1210
|
REQUEST_EXIT: async (message) => {
|
|
1227
1211
|
if (message.version === "v2" && message.delayInMs) {
|
|
1228
|
-
|
|
1212
|
+
logger.log("exit requested with delay", { delayInMs: message.delayInMs });
|
|
1229
1213
|
await setTimeout2(message.delayInMs);
|
|
1230
1214
|
}
|
|
1231
1215
|
this.#coordinatorSocket.close();
|
|
@@ -1242,15 +1226,15 @@ var ProdWorker = class {
|
|
|
1242
1226
|
});
|
|
1243
1227
|
}
|
|
1244
1228
|
},
|
|
1245
|
-
onConnection: async (socket, handler, sender,
|
|
1246
|
-
|
|
1229
|
+
onConnection: async (socket, handler, sender, logger2) => {
|
|
1230
|
+
logger2.log("connected to coordinator", { status: this.#status });
|
|
1247
1231
|
if (this.waitForPostStart) {
|
|
1248
|
-
|
|
1232
|
+
logger2.log("skip connection handler, waiting for post start hook");
|
|
1249
1233
|
return;
|
|
1250
1234
|
}
|
|
1251
1235
|
if (this.paused) {
|
|
1252
1236
|
if (!this.nextResumeAfter) {
|
|
1253
|
-
|
|
1237
|
+
logger2.error("Missing next resume reason", { status: this.#status });
|
|
1254
1238
|
this.#emitUnrecoverableError(
|
|
1255
1239
|
"NoNextResume",
|
|
1256
1240
|
"Next resume reason not set while resuming from paused state"
|
|
@@ -1258,7 +1242,7 @@ var ProdWorker = class {
|
|
|
1258
1242
|
return;
|
|
1259
1243
|
}
|
|
1260
1244
|
if (!this.attemptFriendlyId) {
|
|
1261
|
-
|
|
1245
|
+
logger2.error("Missing friendly ID", { status: this.#status });
|
|
1262
1246
|
this.#emitUnrecoverableError(
|
|
1263
1247
|
"NoAttemptId",
|
|
1264
1248
|
"Attempt ID not set while resuming from paused state"
|
|
@@ -1282,15 +1266,16 @@ var ProdWorker = class {
|
|
|
1282
1266
|
supportsLazyAttempts: true
|
|
1283
1267
|
});
|
|
1284
1268
|
if (success) {
|
|
1285
|
-
|
|
1269
|
+
logger2.info("indexing done, shutting down..");
|
|
1286
1270
|
process.exit(0);
|
|
1287
1271
|
} else {
|
|
1288
|
-
|
|
1272
|
+
logger2.info("indexing failure, shutting down..");
|
|
1289
1273
|
process.exit(1);
|
|
1290
1274
|
}
|
|
1291
1275
|
} catch (e) {
|
|
1276
|
+
const stderr = this.#backgroundWorker.stderr.join("\n");
|
|
1292
1277
|
if (e instanceof TaskMetadataParseError) {
|
|
1293
|
-
|
|
1278
|
+
logger2.error("tasks metadata parse error", {
|
|
1294
1279
|
zodIssues: e.zodIssues,
|
|
1295
1280
|
tasks: e.tasks
|
|
1296
1281
|
});
|
|
@@ -1300,16 +1285,18 @@ var ProdWorker = class {
|
|
|
1300
1285
|
error: {
|
|
1301
1286
|
name: "TaskMetadataParseError",
|
|
1302
1287
|
message: "There was an error parsing the task metadata",
|
|
1303
|
-
stack: JSON.stringify({ zodIssues: e.zodIssues, tasks: e.tasks })
|
|
1288
|
+
stack: JSON.stringify({ zodIssues: e.zodIssues, tasks: e.tasks }),
|
|
1289
|
+
stderr
|
|
1304
1290
|
}
|
|
1305
1291
|
});
|
|
1306
1292
|
} else if (e instanceof UncaughtExceptionError) {
|
|
1307
1293
|
const error = {
|
|
1308
1294
|
name: e.originalError.name,
|
|
1309
1295
|
message: e.originalError.message,
|
|
1310
|
-
stack: e.originalError.stack
|
|
1296
|
+
stack: e.originalError.stack,
|
|
1297
|
+
stderr
|
|
1311
1298
|
};
|
|
1312
|
-
|
|
1299
|
+
logger2.error("uncaught exception", { originalError: error });
|
|
1313
1300
|
socket.emit("INDEXING_FAILED", {
|
|
1314
1301
|
version: "v1",
|
|
1315
1302
|
deploymentId: this.deploymentId,
|
|
@@ -1319,32 +1306,35 @@ var ProdWorker = class {
|
|
|
1319
1306
|
const error = {
|
|
1320
1307
|
name: e.name,
|
|
1321
1308
|
message: e.message,
|
|
1322
|
-
stack: e.stack
|
|
1309
|
+
stack: e.stack,
|
|
1310
|
+
stderr
|
|
1323
1311
|
};
|
|
1324
|
-
|
|
1312
|
+
logger2.error("error", { error });
|
|
1325
1313
|
socket.emit("INDEXING_FAILED", {
|
|
1326
1314
|
version: "v1",
|
|
1327
1315
|
deploymentId: this.deploymentId,
|
|
1328
1316
|
error
|
|
1329
1317
|
});
|
|
1330
1318
|
} else if (typeof e === "string") {
|
|
1331
|
-
|
|
1319
|
+
logger2.error("string error", { error: { message: e } });
|
|
1332
1320
|
socket.emit("INDEXING_FAILED", {
|
|
1333
1321
|
version: "v1",
|
|
1334
1322
|
deploymentId: this.deploymentId,
|
|
1335
1323
|
error: {
|
|
1336
1324
|
name: "Error",
|
|
1337
|
-
message: e
|
|
1325
|
+
message: e,
|
|
1326
|
+
stderr
|
|
1338
1327
|
}
|
|
1339
1328
|
});
|
|
1340
1329
|
} else {
|
|
1341
|
-
|
|
1330
|
+
logger2.error("unknown error", { error: e });
|
|
1342
1331
|
socket.emit("INDEXING_FAILED", {
|
|
1343
1332
|
version: "v1",
|
|
1344
1333
|
deploymentId: this.deploymentId,
|
|
1345
1334
|
error: {
|
|
1346
1335
|
name: "Error",
|
|
1347
|
-
message: "Unknown error"
|
|
1336
|
+
message: "Unknown error",
|
|
1337
|
+
stderr
|
|
1348
1338
|
}
|
|
1349
1339
|
});
|
|
1350
1340
|
}
|
|
@@ -1361,8 +1351,8 @@ var ProdWorker = class {
|
|
|
1361
1351
|
totalCompletions: this.completed.size
|
|
1362
1352
|
});
|
|
1363
1353
|
},
|
|
1364
|
-
onError: async (socket, err,
|
|
1365
|
-
|
|
1354
|
+
onError: async (socket, err, logger2) => {
|
|
1355
|
+
logger2.error("onError", {
|
|
1366
1356
|
error: {
|
|
1367
1357
|
name: err.name,
|
|
1368
1358
|
message: err.message
|
|
@@ -1370,14 +1360,14 @@ var ProdWorker = class {
|
|
|
1370
1360
|
});
|
|
1371
1361
|
await this.#reconnect();
|
|
1372
1362
|
},
|
|
1373
|
-
onDisconnect: async (socket, reason, description,
|
|
1363
|
+
onDisconnect: async (socket, reason, description, logger2) => {
|
|
1374
1364
|
}
|
|
1375
1365
|
});
|
|
1376
1366
|
return coordinatorConnection;
|
|
1377
1367
|
}
|
|
1378
1368
|
#createHttpServer() {
|
|
1379
1369
|
const httpServer = createServer(async (req, res) => {
|
|
1380
|
-
|
|
1370
|
+
logger.log(`[${req.method}]`, req.url);
|
|
1381
1371
|
const reply = new HttpReply(res);
|
|
1382
1372
|
try {
|
|
1383
1373
|
const url = new URL(req.url ?? "", `http://${req.headers.host}`);
|
|
@@ -1410,7 +1400,7 @@ var ProdWorker = class {
|
|
|
1410
1400
|
case "/preStop": {
|
|
1411
1401
|
const cause = PreStopCauses.safeParse(url.searchParams.get("cause"));
|
|
1412
1402
|
if (!cause.success) {
|
|
1413
|
-
|
|
1403
|
+
logger.error("Failed to parse cause", { cause });
|
|
1414
1404
|
return reply.text("Failed to parse cause", 400);
|
|
1415
1405
|
}
|
|
1416
1406
|
switch (cause.data) {
|
|
@@ -1418,7 +1408,7 @@ var ProdWorker = class {
|
|
|
1418
1408
|
break;
|
|
1419
1409
|
}
|
|
1420
1410
|
default: {
|
|
1421
|
-
|
|
1411
|
+
logger.error("Unhandled cause", { cause: cause.data });
|
|
1422
1412
|
break;
|
|
1423
1413
|
}
|
|
1424
1414
|
}
|
|
@@ -1427,7 +1417,7 @@ var ProdWorker = class {
|
|
|
1427
1417
|
case "/postStart": {
|
|
1428
1418
|
const cause = PostStartCauses.safeParse(url.searchParams.get("cause"));
|
|
1429
1419
|
if (!cause.success) {
|
|
1430
|
-
|
|
1420
|
+
logger.error("Failed to parse cause", { cause });
|
|
1431
1421
|
return reply.text("Failed to parse cause", 400);
|
|
1432
1422
|
}
|
|
1433
1423
|
switch (cause.data) {
|
|
@@ -1442,7 +1432,7 @@ var ProdWorker = class {
|
|
|
1442
1432
|
break;
|
|
1443
1433
|
}
|
|
1444
1434
|
default: {
|
|
1445
|
-
|
|
1435
|
+
logger.error("Unhandled cause", { cause: cause.data });
|
|
1446
1436
|
break;
|
|
1447
1437
|
}
|
|
1448
1438
|
}
|
|
@@ -1453,7 +1443,7 @@ var ProdWorker = class {
|
|
|
1453
1443
|
}
|
|
1454
1444
|
}
|
|
1455
1445
|
} catch (error) {
|
|
1456
|
-
|
|
1446
|
+
logger.error("HTTP server error", { error });
|
|
1457
1447
|
reply.empty(500);
|
|
1458
1448
|
}
|
|
1459
1449
|
});
|
|
@@ -1461,13 +1451,13 @@ var ProdWorker = class {
|
|
|
1461
1451
|
socket.end("HTTP/1.1 400 Bad Request\r\n\r\n");
|
|
1462
1452
|
});
|
|
1463
1453
|
httpServer.on("listening", () => {
|
|
1464
|
-
|
|
1454
|
+
logger.log("http server listening on port", this.#httpPort);
|
|
1465
1455
|
});
|
|
1466
1456
|
httpServer.on("error", async (error) => {
|
|
1467
1457
|
if (error.code != "EADDRINUSE") {
|
|
1468
1458
|
return;
|
|
1469
1459
|
}
|
|
1470
|
-
|
|
1460
|
+
logger.error(`port ${this.#httpPort} already in use, retrying with random port..`);
|
|
1471
1461
|
this.#httpPort = getRandomPortNumber();
|
|
1472
1462
|
await setTimeout2(100);
|
|
1473
1463
|
this.start();
|
|
@@ -1530,7 +1520,7 @@ var ProdWorker = class {
|
|
|
1530
1520
|
this.#httpServer.listen(this.#httpPort, this.host);
|
|
1531
1521
|
}
|
|
1532
1522
|
};
|
|
1533
|
-
var prodWorker = new ProdWorker(
|
|
1523
|
+
var prodWorker = new ProdWorker(HTTP_SERVER_PORT);
|
|
1534
1524
|
prodWorker.start();
|
|
1535
1525
|
function gatherProcessEnv() {
|
|
1536
1526
|
const env = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trigger.dev",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.37",
|
|
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",
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"typescript": "^5.3.3",
|
|
54
54
|
"vitest": "^0.34.4",
|
|
55
55
|
"xdg-app-paths": "^8.3.0",
|
|
56
|
-
"@trigger.dev/
|
|
57
|
-
"@trigger.dev/
|
|
56
|
+
"@trigger.dev/core-apps": "3.0.0-beta.37",
|
|
57
|
+
"@trigger.dev/tsconfig": "0.0.0"
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"@anatine/esbuild-decorators": "^0.2.19",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"@opentelemetry/sdk-trace-base": "^1.22.0",
|
|
73
73
|
"@opentelemetry/sdk-trace-node": "^1.22.0",
|
|
74
74
|
"@opentelemetry/semantic-conventions": "^1.22.0",
|
|
75
|
-
"@trigger.dev/core": "3.0.0-beta.
|
|
75
|
+
"@trigger.dev/core": "3.0.0-beta.37",
|
|
76
76
|
"@types/degit": "^2.8.3",
|
|
77
77
|
"chalk": "^5.2.0",
|
|
78
78
|
"chokidar": "^3.5.3",
|