trigger.dev 3.0.0-beta.35 → 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
|
}
|
|
@@ -704,10 +688,14 @@ var TaskRunProcess = class {
|
|
|
704
688
|
killChildProcess,
|
|
705
689
|
killParentProcess
|
|
706
690
|
});
|
|
707
|
-
await this._ipc?.sendWithAck(
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
691
|
+
await this._ipc?.sendWithAck(
|
|
692
|
+
"CLEANUP",
|
|
693
|
+
{
|
|
694
|
+
flush: true,
|
|
695
|
+
kill: killParentProcess
|
|
696
|
+
},
|
|
697
|
+
3e4
|
|
698
|
+
);
|
|
711
699
|
if (killChildProcess) {
|
|
712
700
|
this._gracefulExitTimeoutElapsed = true;
|
|
713
701
|
await this.kill("SIGKILL");
|
|
@@ -814,13 +802,13 @@ var TaskRunProcess = class {
|
|
|
814
802
|
|
|
815
803
|
// src/workers/prod/entry-point.ts
|
|
816
804
|
import { setTimeout as setTimeout2 } from "node:timers/promises";
|
|
817
|
-
var
|
|
805
|
+
var HTTP_SERVER_PORT = Number(process.env.HTTP_SERVER_PORT || getRandomPortNumber());
|
|
818
806
|
var COORDINATOR_HOST = process.env.COORDINATOR_HOST || "127.0.0.1";
|
|
819
807
|
var COORDINATOR_PORT = Number(process.env.COORDINATOR_PORT || 50080);
|
|
820
|
-
var
|
|
808
|
+
var MACHINE_NAME = process.env.MACHINE_NAME || "local";
|
|
821
809
|
var POD_NAME = process.env.POD_NAME || "some-pod";
|
|
822
810
|
var SHORT_HASH = process.env.TRIGGER_CONTENT_HASH.slice(0, 9);
|
|
823
|
-
var
|
|
811
|
+
var logger = new SimpleLogger(`[${MACHINE_NAME}][${SHORT_HASH}]`);
|
|
824
812
|
var ProdWorker = class {
|
|
825
813
|
constructor(port, host = "0.0.0.0") {
|
|
826
814
|
this.host = host;
|
|
@@ -850,24 +838,24 @@ var ProdWorker = class {
|
|
|
850
838
|
#httpServer;
|
|
851
839
|
#coordinatorSocket;
|
|
852
840
|
async #handleSignal(signal) {
|
|
853
|
-
|
|
841
|
+
logger.log("Received signal", { signal });
|
|
854
842
|
if (signal === "SIGTERM") {
|
|
855
843
|
let gracefulExitTimeoutElapsed = false;
|
|
856
844
|
if (this.executing) {
|
|
857
845
|
const terminationGracePeriodSeconds = 60 * 60;
|
|
858
|
-
|
|
846
|
+
logger.log("Waiting for attempt to complete before exiting", {
|
|
859
847
|
terminationGracePeriodSeconds
|
|
860
848
|
});
|
|
861
849
|
await setTimeout2(terminationGracePeriodSeconds * 1e3 - 5e3);
|
|
862
850
|
gracefulExitTimeoutElapsed = true;
|
|
863
|
-
|
|
851
|
+
logger.log("Termination timeout reached, exiting gracefully.");
|
|
864
852
|
} else {
|
|
865
|
-
|
|
853
|
+
logger.log("Not executing, exiting immediately.");
|
|
866
854
|
}
|
|
867
855
|
await this.#exitGracefully(gracefulExitTimeoutElapsed);
|
|
868
856
|
return;
|
|
869
857
|
}
|
|
870
|
-
|
|
858
|
+
logger.log("Unhandled signal", { signal });
|
|
871
859
|
}
|
|
872
860
|
async #exitGracefully(gracefulExitTimeoutElapsed = false) {
|
|
873
861
|
await this.#backgroundWorker.close(gracefulExitTimeoutElapsed);
|
|
@@ -890,7 +878,7 @@ var ProdWorker = class {
|
|
|
890
878
|
"\n",
|
|
891
879
|
""
|
|
892
880
|
);
|
|
893
|
-
|
|
881
|
+
logger.log("reconnecting", {
|
|
894
882
|
coordinatorHost: {
|
|
895
883
|
fromEnv: COORDINATOR_HOST,
|
|
896
884
|
fromVolume: coordinatorHost,
|
|
@@ -899,7 +887,7 @@ var ProdWorker = class {
|
|
|
899
887
|
});
|
|
900
888
|
}
|
|
901
889
|
} catch (error) {
|
|
902
|
-
|
|
890
|
+
logger.error("taskinfo read error during reconnect", {
|
|
903
891
|
error: error instanceof Error ? error.message : error
|
|
904
892
|
});
|
|
905
893
|
} finally {
|
|
@@ -928,7 +916,7 @@ var ProdWorker = class {
|
|
|
928
916
|
this.#coordinatorSocket.socket.emit("READY_FOR_CHECKPOINT", { version: "v1" });
|
|
929
917
|
});
|
|
930
918
|
backgroundWorker.onCancelCheckpoint.attach(async (message) => {
|
|
931
|
-
|
|
919
|
+
logger.log("onCancelCheckpoint", { message });
|
|
932
920
|
const { checkpointCanceled } = await this.#coordinatorSocket.socket.emitWithAck(
|
|
933
921
|
"CANCEL_CHECKPOINT",
|
|
934
922
|
{
|
|
@@ -936,7 +924,7 @@ var ProdWorker = class {
|
|
|
936
924
|
reason: message.reason
|
|
937
925
|
}
|
|
938
926
|
);
|
|
939
|
-
|
|
927
|
+
logger.log("onCancelCheckpoint coordinator response", { checkpointCanceled });
|
|
940
928
|
if (checkpointCanceled) {
|
|
941
929
|
if (message.reason === "WAIT_FOR_DURATION") {
|
|
942
930
|
this.paused = false;
|
|
@@ -947,7 +935,7 @@ var ProdWorker = class {
|
|
|
947
935
|
backgroundWorker.checkpointCanceledNotification.post({ checkpointCanceled });
|
|
948
936
|
});
|
|
949
937
|
backgroundWorker.onCreateTaskRunAttempt.attach(async (message) => {
|
|
950
|
-
|
|
938
|
+
logger.log("onCreateTaskRunAttempt()", { message });
|
|
951
939
|
const createAttempt = await this.#coordinatorSocket.socket.emitWithAck(
|
|
952
940
|
"CREATE_TASK_RUN_ATTEMPT",
|
|
953
941
|
{
|
|
@@ -975,7 +963,7 @@ var ProdWorker = class {
|
|
|
975
963
|
});
|
|
976
964
|
backgroundWorker.onWaitForDuration.attach(async (message) => {
|
|
977
965
|
if (!this.attemptFriendlyId) {
|
|
978
|
-
|
|
966
|
+
logger.error("Failed to send wait message, attempt friendly ID not set", { message });
|
|
979
967
|
this.#emitUnrecoverableError(
|
|
980
968
|
"NoAttemptId",
|
|
981
969
|
"Attempt ID not set before waiting for duration"
|
|
@@ -993,7 +981,7 @@ var ProdWorker = class {
|
|
|
993
981
|
});
|
|
994
982
|
backgroundWorker.onWaitForTask.attach(async (message) => {
|
|
995
983
|
if (!this.attemptFriendlyId) {
|
|
996
|
-
|
|
984
|
+
logger.error("Failed to send wait message, attempt friendly ID not set", { message });
|
|
997
985
|
this.#emitUnrecoverableError("NoAttemptId", "Attempt ID not set before waiting for task");
|
|
998
986
|
return;
|
|
999
987
|
}
|
|
@@ -1008,7 +996,7 @@ var ProdWorker = class {
|
|
|
1008
996
|
});
|
|
1009
997
|
backgroundWorker.onWaitForBatch.attach(async (message) => {
|
|
1010
998
|
if (!this.attemptFriendlyId) {
|
|
1011
|
-
|
|
999
|
+
logger.error("Failed to send wait message, attempt friendly ID not set", { message });
|
|
1012
1000
|
this.#emitUnrecoverableError("NoAttemptId", "Attempt ID not set before waiting for batch");
|
|
1013
1001
|
return;
|
|
1014
1002
|
}
|
|
@@ -1024,7 +1012,7 @@ var ProdWorker = class {
|
|
|
1024
1012
|
return backgroundWorker;
|
|
1025
1013
|
}
|
|
1026
1014
|
async #prepareForWait(reason, willCheckpointAndRestore) {
|
|
1027
|
-
|
|
1015
|
+
logger.log(`prepare for ${reason}`, { willCheckpointAndRestore });
|
|
1028
1016
|
this.#backgroundWorker.preCheckpointNotification.post({ willCheckpointAndRestore });
|
|
1029
1017
|
if (willCheckpointAndRestore) {
|
|
1030
1018
|
this.paused = true;
|
|
@@ -1036,10 +1024,10 @@ var ProdWorker = class {
|
|
|
1036
1024
|
}
|
|
1037
1025
|
}
|
|
1038
1026
|
async #prepareForRetry(willCheckpointAndRestore, shouldExit) {
|
|
1039
|
-
|
|
1027
|
+
logger.log("prepare for retry", { willCheckpointAndRestore, shouldExit });
|
|
1040
1028
|
if (shouldExit) {
|
|
1041
1029
|
if (willCheckpointAndRestore) {
|
|
1042
|
-
|
|
1030
|
+
logger.log("WARNING: Will checkpoint but also requested exit. This won't end well.");
|
|
1043
1031
|
}
|
|
1044
1032
|
await this.#exitGracefully();
|
|
1045
1033
|
return;
|
|
@@ -1078,7 +1066,7 @@ var ProdWorker = class {
|
|
|
1078
1066
|
// FIXME: If the the worker can't connect for a while, this runs MANY times - it should only run once
|
|
1079
1067
|
#createCoordinatorSocket(host) {
|
|
1080
1068
|
const extraHeaders = this.#returnValidatedExtraHeaders({
|
|
1081
|
-
"x-machine-name":
|
|
1069
|
+
"x-machine-name": MACHINE_NAME,
|
|
1082
1070
|
"x-pod-name": POD_NAME,
|
|
1083
1071
|
"x-trigger-content-hash": this.contentHash,
|
|
1084
1072
|
"x-trigger-project-ref": this.projectRef,
|
|
@@ -1090,9 +1078,9 @@ var ProdWorker = class {
|
|
|
1090
1078
|
if (this.attemptFriendlyId) {
|
|
1091
1079
|
extraHeaders["x-trigger-attempt-friendly-id"] = this.attemptFriendlyId;
|
|
1092
1080
|
}
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
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({
|
|
1096
1084
|
namespace: "prod-worker",
|
|
1097
1085
|
host,
|
|
1098
1086
|
port: COORDINATOR_PORT,
|
|
@@ -1102,21 +1090,21 @@ var ProdWorker = class {
|
|
|
1102
1090
|
handlers: {
|
|
1103
1091
|
RESUME_AFTER_DEPENDENCY: async ({ completions }) => {
|
|
1104
1092
|
if (!this.paused) {
|
|
1105
|
-
|
|
1093
|
+
logger.error("Failed to resume after dependency: Worker not paused");
|
|
1106
1094
|
return;
|
|
1107
1095
|
}
|
|
1108
1096
|
if (completions.length === 0) {
|
|
1109
|
-
|
|
1097
|
+
logger.error("Failed to resume after dependency: No completions");
|
|
1110
1098
|
return;
|
|
1111
1099
|
}
|
|
1112
1100
|
if (this.nextResumeAfter !== "WAIT_FOR_TASK" && this.nextResumeAfter !== "WAIT_FOR_BATCH") {
|
|
1113
|
-
|
|
1101
|
+
logger.error("Failed to resume after dependency: Invalid next resume", {
|
|
1114
1102
|
nextResumeAfter: this.nextResumeAfter
|
|
1115
1103
|
});
|
|
1116
1104
|
return;
|
|
1117
1105
|
}
|
|
1118
1106
|
if (this.nextResumeAfter === "WAIT_FOR_TASK" && completions.length > 1) {
|
|
1119
|
-
|
|
1107
|
+
logger.error(
|
|
1120
1108
|
"Failed to resume after dependency: Waiting for single task but got multiple completions",
|
|
1121
1109
|
{
|
|
1122
1110
|
completions
|
|
@@ -1136,13 +1124,13 @@ var ProdWorker = class {
|
|
|
1136
1124
|
},
|
|
1137
1125
|
RESUME_AFTER_DURATION: async (message) => {
|
|
1138
1126
|
if (!this.paused) {
|
|
1139
|
-
|
|
1127
|
+
logger.error("worker not paused", {
|
|
1140
1128
|
attemptId: message.attemptId
|
|
1141
1129
|
});
|
|
1142
1130
|
return;
|
|
1143
1131
|
}
|
|
1144
1132
|
if (this.nextResumeAfter !== "WAIT_FOR_DURATION") {
|
|
1145
|
-
|
|
1133
|
+
logger.error("not waiting to resume after duration", {
|
|
1146
1134
|
nextResumeAfter: this.nextResumeAfter
|
|
1147
1135
|
});
|
|
1148
1136
|
return;
|
|
@@ -1151,42 +1139,42 @@ var ProdWorker = class {
|
|
|
1151
1139
|
},
|
|
1152
1140
|
EXECUTE_TASK_RUN: async ({ executionPayload }) => {
|
|
1153
1141
|
if (this.executing) {
|
|
1154
|
-
|
|
1142
|
+
logger.error("dropping execute request, already executing");
|
|
1155
1143
|
return;
|
|
1156
1144
|
}
|
|
1157
1145
|
if (this.completed.has(executionPayload.execution.attempt.id)) {
|
|
1158
|
-
|
|
1146
|
+
logger.error("dropping execute request, already completed");
|
|
1159
1147
|
return;
|
|
1160
1148
|
}
|
|
1161
1149
|
this.executing = true;
|
|
1162
1150
|
this.attemptFriendlyId = executionPayload.execution.attempt.id;
|
|
1163
1151
|
const completion = await this.#backgroundWorker.executeTaskRun(executionPayload);
|
|
1164
|
-
|
|
1152
|
+
logger.log("completed", completion);
|
|
1165
1153
|
this.completed.add(executionPayload.execution.attempt.id);
|
|
1166
1154
|
const { willCheckpointAndRestore, shouldExit } = await this.#coordinatorSocket.socket.emitWithAck("TASK_RUN_COMPLETED", {
|
|
1167
1155
|
version: "v1",
|
|
1168
1156
|
execution: executionPayload.execution,
|
|
1169
1157
|
completion
|
|
1170
1158
|
});
|
|
1171
|
-
|
|
1159
|
+
logger.log("completion acknowledged", { willCheckpointAndRestore, shouldExit });
|
|
1172
1160
|
this.#prepareForRetry(willCheckpointAndRestore, shouldExit);
|
|
1173
1161
|
},
|
|
1174
1162
|
EXECUTE_TASK_RUN_LAZY_ATTEMPT: async (message) => {
|
|
1175
1163
|
if (this.executing) {
|
|
1176
|
-
|
|
1164
|
+
logger.error("dropping execute request, already executing");
|
|
1177
1165
|
return;
|
|
1178
1166
|
}
|
|
1179
1167
|
this.executing = true;
|
|
1180
1168
|
try {
|
|
1181
1169
|
const { completion, execution } = await this.#backgroundWorker.executeTaskRunLazyAttempt(message.lazyPayload);
|
|
1182
|
-
|
|
1170
|
+
logger.log("completed", completion);
|
|
1183
1171
|
this.completed.add(execution.attempt.id);
|
|
1184
1172
|
const { willCheckpointAndRestore, shouldExit } = await this.#coordinatorSocket.socket.emitWithAck("TASK_RUN_COMPLETED", {
|
|
1185
1173
|
version: "v1",
|
|
1186
1174
|
execution,
|
|
1187
1175
|
completion
|
|
1188
1176
|
});
|
|
1189
|
-
|
|
1177
|
+
logger.log("completion acknowledged", { willCheckpointAndRestore, shouldExit });
|
|
1190
1178
|
this.#prepareForRetry(willCheckpointAndRestore, shouldExit);
|
|
1191
1179
|
} catch (error) {
|
|
1192
1180
|
const completion = {
|
|
@@ -1213,15 +1201,15 @@ var ProdWorker = class {
|
|
|
1213
1201
|
},
|
|
1214
1202
|
REQUEST_ATTEMPT_CANCELLATION: async (message) => {
|
|
1215
1203
|
if (!this.executing) {
|
|
1216
|
-
|
|
1204
|
+
logger.log("dropping cancel request, not executing", { status: this.#status });
|
|
1217
1205
|
return;
|
|
1218
1206
|
}
|
|
1219
|
-
|
|
1207
|
+
logger.log("cancelling attempt", { attemptId: message.attemptId, status: this.#status });
|
|
1220
1208
|
await this.#backgroundWorker.cancelAttempt(message.attemptId);
|
|
1221
1209
|
},
|
|
1222
1210
|
REQUEST_EXIT: async (message) => {
|
|
1223
1211
|
if (message.version === "v2" && message.delayInMs) {
|
|
1224
|
-
|
|
1212
|
+
logger.log("exit requested with delay", { delayInMs: message.delayInMs });
|
|
1225
1213
|
await setTimeout2(message.delayInMs);
|
|
1226
1214
|
}
|
|
1227
1215
|
this.#coordinatorSocket.close();
|
|
@@ -1238,15 +1226,15 @@ var ProdWorker = class {
|
|
|
1238
1226
|
});
|
|
1239
1227
|
}
|
|
1240
1228
|
},
|
|
1241
|
-
onConnection: async (socket, handler, sender,
|
|
1242
|
-
|
|
1229
|
+
onConnection: async (socket, handler, sender, logger2) => {
|
|
1230
|
+
logger2.log("connected to coordinator", { status: this.#status });
|
|
1243
1231
|
if (this.waitForPostStart) {
|
|
1244
|
-
|
|
1232
|
+
logger2.log("skip connection handler, waiting for post start hook");
|
|
1245
1233
|
return;
|
|
1246
1234
|
}
|
|
1247
1235
|
if (this.paused) {
|
|
1248
1236
|
if (!this.nextResumeAfter) {
|
|
1249
|
-
|
|
1237
|
+
logger2.error("Missing next resume reason", { status: this.#status });
|
|
1250
1238
|
this.#emitUnrecoverableError(
|
|
1251
1239
|
"NoNextResume",
|
|
1252
1240
|
"Next resume reason not set while resuming from paused state"
|
|
@@ -1254,7 +1242,7 @@ var ProdWorker = class {
|
|
|
1254
1242
|
return;
|
|
1255
1243
|
}
|
|
1256
1244
|
if (!this.attemptFriendlyId) {
|
|
1257
|
-
|
|
1245
|
+
logger2.error("Missing friendly ID", { status: this.#status });
|
|
1258
1246
|
this.#emitUnrecoverableError(
|
|
1259
1247
|
"NoAttemptId",
|
|
1260
1248
|
"Attempt ID not set while resuming from paused state"
|
|
@@ -1278,15 +1266,16 @@ var ProdWorker = class {
|
|
|
1278
1266
|
supportsLazyAttempts: true
|
|
1279
1267
|
});
|
|
1280
1268
|
if (success) {
|
|
1281
|
-
|
|
1269
|
+
logger2.info("indexing done, shutting down..");
|
|
1282
1270
|
process.exit(0);
|
|
1283
1271
|
} else {
|
|
1284
|
-
|
|
1272
|
+
logger2.info("indexing failure, shutting down..");
|
|
1285
1273
|
process.exit(1);
|
|
1286
1274
|
}
|
|
1287
1275
|
} catch (e) {
|
|
1276
|
+
const stderr = this.#backgroundWorker.stderr.join("\n");
|
|
1288
1277
|
if (e instanceof TaskMetadataParseError) {
|
|
1289
|
-
|
|
1278
|
+
logger2.error("tasks metadata parse error", {
|
|
1290
1279
|
zodIssues: e.zodIssues,
|
|
1291
1280
|
tasks: e.tasks
|
|
1292
1281
|
});
|
|
@@ -1296,16 +1285,18 @@ var ProdWorker = class {
|
|
|
1296
1285
|
error: {
|
|
1297
1286
|
name: "TaskMetadataParseError",
|
|
1298
1287
|
message: "There was an error parsing the task metadata",
|
|
1299
|
-
stack: JSON.stringify({ zodIssues: e.zodIssues, tasks: e.tasks })
|
|
1288
|
+
stack: JSON.stringify({ zodIssues: e.zodIssues, tasks: e.tasks }),
|
|
1289
|
+
stderr
|
|
1300
1290
|
}
|
|
1301
1291
|
});
|
|
1302
1292
|
} else if (e instanceof UncaughtExceptionError) {
|
|
1303
1293
|
const error = {
|
|
1304
1294
|
name: e.originalError.name,
|
|
1305
1295
|
message: e.originalError.message,
|
|
1306
|
-
stack: e.originalError.stack
|
|
1296
|
+
stack: e.originalError.stack,
|
|
1297
|
+
stderr
|
|
1307
1298
|
};
|
|
1308
|
-
|
|
1299
|
+
logger2.error("uncaught exception", { originalError: error });
|
|
1309
1300
|
socket.emit("INDEXING_FAILED", {
|
|
1310
1301
|
version: "v1",
|
|
1311
1302
|
deploymentId: this.deploymentId,
|
|
@@ -1315,32 +1306,35 @@ var ProdWorker = class {
|
|
|
1315
1306
|
const error = {
|
|
1316
1307
|
name: e.name,
|
|
1317
1308
|
message: e.message,
|
|
1318
|
-
stack: e.stack
|
|
1309
|
+
stack: e.stack,
|
|
1310
|
+
stderr
|
|
1319
1311
|
};
|
|
1320
|
-
|
|
1312
|
+
logger2.error("error", { error });
|
|
1321
1313
|
socket.emit("INDEXING_FAILED", {
|
|
1322
1314
|
version: "v1",
|
|
1323
1315
|
deploymentId: this.deploymentId,
|
|
1324
1316
|
error
|
|
1325
1317
|
});
|
|
1326
1318
|
} else if (typeof e === "string") {
|
|
1327
|
-
|
|
1319
|
+
logger2.error("string error", { error: { message: e } });
|
|
1328
1320
|
socket.emit("INDEXING_FAILED", {
|
|
1329
1321
|
version: "v1",
|
|
1330
1322
|
deploymentId: this.deploymentId,
|
|
1331
1323
|
error: {
|
|
1332
1324
|
name: "Error",
|
|
1333
|
-
message: e
|
|
1325
|
+
message: e,
|
|
1326
|
+
stderr
|
|
1334
1327
|
}
|
|
1335
1328
|
});
|
|
1336
1329
|
} else {
|
|
1337
|
-
|
|
1330
|
+
logger2.error("unknown error", { error: e });
|
|
1338
1331
|
socket.emit("INDEXING_FAILED", {
|
|
1339
1332
|
version: "v1",
|
|
1340
1333
|
deploymentId: this.deploymentId,
|
|
1341
1334
|
error: {
|
|
1342
1335
|
name: "Error",
|
|
1343
|
-
message: "Unknown error"
|
|
1336
|
+
message: "Unknown error",
|
|
1337
|
+
stderr
|
|
1344
1338
|
}
|
|
1345
1339
|
});
|
|
1346
1340
|
}
|
|
@@ -1357,8 +1351,8 @@ var ProdWorker = class {
|
|
|
1357
1351
|
totalCompletions: this.completed.size
|
|
1358
1352
|
});
|
|
1359
1353
|
},
|
|
1360
|
-
onError: async (socket, err,
|
|
1361
|
-
|
|
1354
|
+
onError: async (socket, err, logger2) => {
|
|
1355
|
+
logger2.error("onError", {
|
|
1362
1356
|
error: {
|
|
1363
1357
|
name: err.name,
|
|
1364
1358
|
message: err.message
|
|
@@ -1366,14 +1360,14 @@ var ProdWorker = class {
|
|
|
1366
1360
|
});
|
|
1367
1361
|
await this.#reconnect();
|
|
1368
1362
|
},
|
|
1369
|
-
onDisconnect: async (socket, reason, description,
|
|
1363
|
+
onDisconnect: async (socket, reason, description, logger2) => {
|
|
1370
1364
|
}
|
|
1371
1365
|
});
|
|
1372
1366
|
return coordinatorConnection;
|
|
1373
1367
|
}
|
|
1374
1368
|
#createHttpServer() {
|
|
1375
1369
|
const httpServer = createServer(async (req, res) => {
|
|
1376
|
-
|
|
1370
|
+
logger.log(`[${req.method}]`, req.url);
|
|
1377
1371
|
const reply = new HttpReply(res);
|
|
1378
1372
|
try {
|
|
1379
1373
|
const url = new URL(req.url ?? "", `http://${req.headers.host}`);
|
|
@@ -1406,7 +1400,7 @@ var ProdWorker = class {
|
|
|
1406
1400
|
case "/preStop": {
|
|
1407
1401
|
const cause = PreStopCauses.safeParse(url.searchParams.get("cause"));
|
|
1408
1402
|
if (!cause.success) {
|
|
1409
|
-
|
|
1403
|
+
logger.error("Failed to parse cause", { cause });
|
|
1410
1404
|
return reply.text("Failed to parse cause", 400);
|
|
1411
1405
|
}
|
|
1412
1406
|
switch (cause.data) {
|
|
@@ -1414,7 +1408,7 @@ var ProdWorker = class {
|
|
|
1414
1408
|
break;
|
|
1415
1409
|
}
|
|
1416
1410
|
default: {
|
|
1417
|
-
|
|
1411
|
+
logger.error("Unhandled cause", { cause: cause.data });
|
|
1418
1412
|
break;
|
|
1419
1413
|
}
|
|
1420
1414
|
}
|
|
@@ -1423,7 +1417,7 @@ var ProdWorker = class {
|
|
|
1423
1417
|
case "/postStart": {
|
|
1424
1418
|
const cause = PostStartCauses.safeParse(url.searchParams.get("cause"));
|
|
1425
1419
|
if (!cause.success) {
|
|
1426
|
-
|
|
1420
|
+
logger.error("Failed to parse cause", { cause });
|
|
1427
1421
|
return reply.text("Failed to parse cause", 400);
|
|
1428
1422
|
}
|
|
1429
1423
|
switch (cause.data) {
|
|
@@ -1438,7 +1432,7 @@ var ProdWorker = class {
|
|
|
1438
1432
|
break;
|
|
1439
1433
|
}
|
|
1440
1434
|
default: {
|
|
1441
|
-
|
|
1435
|
+
logger.error("Unhandled cause", { cause: cause.data });
|
|
1442
1436
|
break;
|
|
1443
1437
|
}
|
|
1444
1438
|
}
|
|
@@ -1449,7 +1443,7 @@ var ProdWorker = class {
|
|
|
1449
1443
|
}
|
|
1450
1444
|
}
|
|
1451
1445
|
} catch (error) {
|
|
1452
|
-
|
|
1446
|
+
logger.error("HTTP server error", { error });
|
|
1453
1447
|
reply.empty(500);
|
|
1454
1448
|
}
|
|
1455
1449
|
});
|
|
@@ -1457,13 +1451,13 @@ var ProdWorker = class {
|
|
|
1457
1451
|
socket.end("HTTP/1.1 400 Bad Request\r\n\r\n");
|
|
1458
1452
|
});
|
|
1459
1453
|
httpServer.on("listening", () => {
|
|
1460
|
-
|
|
1454
|
+
logger.log("http server listening on port", this.#httpPort);
|
|
1461
1455
|
});
|
|
1462
1456
|
httpServer.on("error", async (error) => {
|
|
1463
1457
|
if (error.code != "EADDRINUSE") {
|
|
1464
1458
|
return;
|
|
1465
1459
|
}
|
|
1466
|
-
|
|
1460
|
+
logger.error(`port ${this.#httpPort} already in use, retrying with random port..`);
|
|
1467
1461
|
this.#httpPort = getRandomPortNumber();
|
|
1468
1462
|
await setTimeout2(100);
|
|
1469
1463
|
this.start();
|
|
@@ -1526,7 +1520,7 @@ var ProdWorker = class {
|
|
|
1526
1520
|
this.#httpServer.listen(this.#httpPort, this.host);
|
|
1527
1521
|
}
|
|
1528
1522
|
};
|
|
1529
|
-
var prodWorker = new ProdWorker(
|
|
1523
|
+
var prodWorker = new ProdWorker(HTTP_SERVER_PORT);
|
|
1530
1524
|
prodWorker.start();
|
|
1531
1525
|
function gatherProcessEnv() {
|
|
1532
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,7 +53,7 @@
|
|
|
53
53
|
"typescript": "^5.3.3",
|
|
54
54
|
"vitest": "^0.34.4",
|
|
55
55
|
"xdg-app-paths": "^8.3.0",
|
|
56
|
-
"@trigger.dev/core-apps": "3.0.0-beta.
|
|
56
|
+
"@trigger.dev/core-apps": "3.0.0-beta.37",
|
|
57
57
|
"@trigger.dev/tsconfig": "0.0.0"
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
@@ -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",
|