trigger.dev 0.0.0-v3-prerelease-20250108142426 → 0.0.0-v4-prerelease-20250916125920
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.
- package/README.md +28 -1
- package/dist/esm/apiClient.d.ts +158 -74
- package/dist/esm/apiClient.js +341 -76
- package/dist/esm/apiClient.js.map +1 -1
- package/dist/esm/build/buildWorker.d.ts +10 -6
- package/dist/esm/build/buildWorker.js +22 -38
- package/dist/esm/build/buildWorker.js.map +1 -1
- package/dist/esm/build/bundle.d.ts +18 -1
- package/dist/esm/build/bundle.js +142 -52
- package/dist/esm/build/bundle.js.map +1 -1
- package/dist/esm/build/entryPoints.d.ts +12 -0
- package/dist/esm/build/entryPoints.js +127 -0
- package/dist/esm/build/entryPoints.js.map +1 -0
- package/dist/esm/build/extensions.js +17 -0
- package/dist/esm/build/extensions.js.map +1 -1
- package/dist/esm/build/externals.js +184 -2
- package/dist/esm/build/externals.js.map +1 -1
- package/dist/esm/build/packageModules.d.ts +15 -5
- package/dist/esm/build/packageModules.js +154 -36
- package/dist/esm/build/packageModules.js.map +1 -1
- package/dist/esm/cli/common.d.ts +1 -1
- package/dist/esm/cli/common.js +38 -45
- package/dist/esm/cli/common.js.map +1 -1
- package/dist/esm/cli/index.js +19 -3
- package/dist/esm/cli/index.js.map +1 -1
- package/dist/esm/commands/analyze.d.ts +23 -0
- package/dist/esm/commands/analyze.js +122 -0
- package/dist/esm/commands/analyze.js.map +1 -0
- package/dist/esm/commands/deploy.d.ts +5 -2
- package/dist/esm/commands/deploy.js +271 -160
- package/dist/esm/commands/deploy.js.map +1 -1
- package/dist/esm/commands/dev.d.ts +36 -6
- package/dist/esm/commands/dev.js +71 -2
- package/dist/esm/commands/dev.js.map +1 -1
- package/dist/esm/commands/env.d.ts +2 -0
- package/dist/esm/commands/env.js +298 -0
- package/dist/esm/commands/env.js.map +1 -0
- package/dist/esm/commands/init.d.ts +9 -1
- package/dist/esm/commands/init.js +132 -65
- package/dist/esm/commands/init.js.map +1 -1
- package/dist/esm/commands/install-mcp.d.ts +50 -0
- package/dist/esm/commands/install-mcp.js +497 -0
- package/dist/esm/commands/install-mcp.js.map +1 -0
- package/dist/esm/commands/install-rules.d.ts +11 -0
- package/dist/esm/commands/install-rules.js +381 -0
- package/dist/esm/commands/install-rules.js.map +1 -0
- package/dist/esm/commands/list-profiles.d.ts +3 -7
- package/dist/esm/commands/list-profiles.js +7 -4
- package/dist/esm/commands/list-profiles.js.map +1 -1
- package/dist/esm/commands/login.d.ts +9 -5
- package/dist/esm/commands/login.js +40 -7
- package/dist/esm/commands/login.js.map +1 -1
- package/dist/esm/commands/logout.d.ts +1 -1
- package/dist/esm/commands/mcp.d.ts +38 -0
- package/dist/esm/commands/mcp.js +82 -0
- package/dist/esm/commands/mcp.js.map +1 -0
- package/dist/esm/commands/preview.d.ts +5 -0
- package/dist/esm/commands/preview.js +93 -0
- package/dist/esm/commands/preview.js.map +1 -0
- package/dist/esm/commands/promote.d.ts +3 -0
- package/dist/esm/commands/promote.js +86 -0
- package/dist/esm/commands/promote.js.map +1 -0
- package/dist/esm/commands/switch.d.ts +19 -0
- package/dist/esm/commands/switch.js +93 -0
- package/dist/esm/commands/switch.js.map +1 -0
- package/dist/esm/commands/trigger.d.ts +33 -0
- package/dist/esm/commands/trigger.js +88 -0
- package/dist/esm/commands/trigger.js.map +1 -0
- package/dist/esm/commands/update.d.ts +3 -2
- package/dist/esm/commands/update.js +23 -9
- package/dist/esm/commands/update.js.map +1 -1
- package/dist/esm/commands/whoami.d.ts +12 -1
- package/dist/esm/commands/whoami.js +36 -6
- package/dist/esm/commands/whoami.js.map +1 -1
- package/dist/esm/commands/workers/build.d.ts +4 -0
- package/dist/esm/commands/workers/build.js +345 -0
- package/dist/esm/commands/workers/build.js.map +1 -0
- package/dist/esm/commands/workers/create.d.ts +2 -0
- package/dist/esm/commands/workers/create.js +91 -0
- package/dist/esm/commands/workers/create.js.map +1 -0
- package/dist/esm/commands/workers/index.d.ts +2 -0
- package/dist/esm/commands/workers/index.js +13 -0
- package/dist/esm/commands/workers/index.js.map +1 -0
- package/dist/esm/commands/workers/list.d.ts +2 -0
- package/dist/esm/commands/workers/list.js +80 -0
- package/dist/esm/commands/workers/list.js.map +1 -0
- package/dist/esm/commands/workers/run.d.ts +2 -0
- package/dist/esm/commands/workers/run.js +105 -0
- package/dist/esm/commands/workers/run.js.map +1 -0
- package/dist/esm/config.d.ts +2 -1
- package/dist/esm/config.js +35 -8
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/deploy/buildImage.d.ts +12 -11
- package/dist/esm/deploy/buildImage.js +360 -115
- package/dist/esm/deploy/buildImage.js.map +1 -1
- package/dist/esm/dev/backgroundWorker.d.ts +6 -245
- package/dist/esm/dev/backgroundWorker.js +11 -320
- package/dist/esm/dev/backgroundWorker.js.map +1 -1
- package/dist/esm/dev/devOutput.js +48 -9
- package/dist/esm/dev/devOutput.js.map +1 -1
- package/dist/esm/dev/devSession.d.ts +2 -1
- package/dist/esm/dev/devSession.js +68 -65
- package/dist/esm/dev/devSession.js.map +1 -1
- package/dist/esm/dev/devSupervisor.d.ts +12 -0
- package/dist/esm/dev/devSupervisor.js +568 -0
- package/dist/esm/dev/devSupervisor.js.map +1 -0
- package/dist/esm/dev/lock.d.ts +1 -0
- package/dist/esm/dev/lock.js +80 -0
- package/dist/esm/dev/lock.js.map +1 -0
- package/dist/esm/dev/mcpServer.d.ts +10 -0
- package/dist/esm/dev/mcpServer.js +201 -0
- package/dist/esm/dev/mcpServer.js.map +1 -0
- package/dist/esm/dev/taskRunProcessPool.d.ts +39 -0
- package/dist/esm/dev/taskRunProcessPool.js +220 -0
- package/dist/esm/dev/taskRunProcessPool.js.map +1 -0
- package/dist/esm/dev/workerRuntime.d.ts +2 -2
- package/dist/esm/dev/workerRuntime.js +1 -265
- package/dist/esm/dev/workerRuntime.js.map +1 -1
- package/dist/esm/entryPoints/dev-index-worker.js +45 -8
- package/dist/esm/entryPoints/dev-index-worker.js.map +1 -1
- package/dist/esm/entryPoints/dev-run-controller.d.ts +58 -0
- package/dist/esm/entryPoints/dev-run-controller.js +652 -0
- package/dist/esm/entryPoints/dev-run-controller.js.map +1 -0
- package/dist/esm/entryPoints/dev-run-worker.js +394 -199
- package/dist/esm/entryPoints/dev-run-worker.js.map +1 -1
- package/dist/esm/entryPoints/managed/controller.d.ts +63 -0
- package/dist/esm/entryPoints/managed/controller.js +482 -0
- package/dist/esm/entryPoints/managed/controller.js.map +1 -0
- package/dist/esm/entryPoints/managed/env.d.ts +170 -0
- package/dist/esm/entryPoints/managed/env.js +199 -0
- package/dist/esm/entryPoints/managed/env.js.map +1 -0
- package/dist/esm/entryPoints/managed/execution.d.ts +141 -0
- package/dist/esm/entryPoints/managed/execution.js +869 -0
- package/dist/esm/entryPoints/managed/execution.js.map +1 -0
- package/dist/esm/entryPoints/managed/logger.d.ts +30 -0
- package/dist/esm/entryPoints/managed/logger.js +47 -0
- package/dist/esm/entryPoints/managed/logger.js.map +1 -0
- package/dist/esm/entryPoints/managed/notifier.d.ts +30 -0
- package/dist/esm/entryPoints/managed/notifier.js +63 -0
- package/dist/esm/entryPoints/managed/notifier.js.map +1 -0
- package/dist/esm/entryPoints/managed/overrides.d.ts +18 -0
- package/dist/esm/entryPoints/managed/overrides.js +19 -0
- package/dist/esm/entryPoints/managed/overrides.js.map +1 -0
- package/dist/esm/entryPoints/managed/poller.d.ts +31 -0
- package/dist/esm/entryPoints/managed/poller.js +89 -0
- package/dist/esm/entryPoints/managed/poller.js.map +1 -0
- package/dist/esm/entryPoints/managed/snapshot.d.ts +54 -0
- package/dist/esm/entryPoints/managed/snapshot.js +293 -0
- package/dist/esm/entryPoints/managed/snapshot.js.map +1 -0
- package/dist/esm/entryPoints/managed/taskRunProcessProvider.d.ts +62 -0
- package/dist/esm/entryPoints/managed/taskRunProcessProvider.js +252 -0
- package/dist/esm/entryPoints/managed/taskRunProcessProvider.js.map +1 -0
- package/dist/esm/entryPoints/{deploy-index-controller.js → managed-index-controller.js} +27 -3
- package/dist/esm/entryPoints/managed-index-controller.js.map +1 -0
- package/dist/esm/entryPoints/{deploy-index-worker.js → managed-index-worker.js} +50 -21
- package/dist/esm/entryPoints/managed-index-worker.js.map +1 -0
- package/dist/esm/entryPoints/managed-run-controller.js +13 -0
- package/dist/esm/entryPoints/managed-run-controller.js.map +1 -0
- package/dist/esm/entryPoints/managed-run-worker.js +512 -0
- package/dist/esm/entryPoints/managed-run-worker.js.map +1 -0
- package/dist/esm/executions/taskRunProcess.d.ts +28 -82
- package/dist/esm/executions/taskRunProcess.js +130 -74
- package/dist/esm/executions/taskRunProcess.js.map +1 -1
- package/dist/esm/indexing/indexWorkerManifest.d.ts +21 -5
- package/dist/esm/indexing/indexWorkerManifest.js +4 -4
- package/dist/esm/indexing/indexWorkerManifest.js.map +1 -1
- package/dist/esm/indexing/registerResources.d.ts +5 -0
- package/dist/esm/indexing/registerResources.js +44 -0
- package/dist/esm/indexing/registerResources.js.map +1 -0
- package/dist/esm/mcp/auth.d.ts +12 -0
- package/dist/esm/mcp/auth.js +152 -0
- package/dist/esm/mcp/auth.js.map +1 -0
- package/dist/esm/mcp/capabilities.d.ts +4 -0
- package/dist/esm/mcp/capabilities.js +22 -0
- package/dist/esm/mcp/capabilities.js.map +1 -0
- package/dist/esm/mcp/config.d.ts +82 -0
- package/dist/esm/mcp/config.js +87 -0
- package/dist/esm/mcp/config.js.map +1 -0
- package/dist/esm/mcp/context.d.ts +45 -0
- package/dist/esm/mcp/context.js +129 -0
- package/dist/esm/mcp/context.js.map +1 -0
- package/dist/esm/mcp/formatters.d.ts +7 -0
- package/dist/esm/mcp/formatters.js +330 -0
- package/dist/esm/mcp/formatters.js.map +1 -0
- package/dist/esm/mcp/logger.d.ts +11 -0
- package/dist/esm/mcp/logger.js +34 -0
- package/dist/esm/mcp/logger.js.map +1 -0
- package/dist/esm/mcp/mintlifyClient.d.ts +1 -0
- package/dist/esm/mcp/mintlifyClient.js +65 -0
- package/dist/esm/mcp/mintlifyClient.js.map +1 -0
- package/dist/esm/mcp/schemas.d.ts +324 -0
- package/dist/esm/mcp/schemas.js +144 -0
- package/dist/esm/mcp/schemas.js.map +1 -0
- package/dist/esm/mcp/tools/deploys.d.ts +174 -0
- package/dist/esm/mcp/tools/deploys.js +161 -0
- package/dist/esm/mcp/tools/deploys.js.map +1 -0
- package/dist/esm/mcp/tools/docs.d.ts +77 -0
- package/dist/esm/mcp/tools/docs.js +18 -0
- package/dist/esm/mcp/tools/docs.js.map +1 -0
- package/dist/esm/mcp/tools/orgs.d.ts +172 -0
- package/dist/esm/mcp/tools/orgs.js +172 -0
- package/dist/esm/mcp/tools/orgs.js.map +1 -0
- package/dist/esm/mcp/tools/previewBranches.d.ts +78 -0
- package/dist/esm/mcp/tools/previewBranches.js +28 -0
- package/dist/esm/mcp/tools/previewBranches.js.map +1 -0
- package/dist/esm/mcp/tools/runs.d.ts +335 -0
- package/dist/esm/mcp/tools/runs.js +160 -0
- package/dist/esm/mcp/tools/runs.js.map +1 -0
- package/dist/esm/mcp/tools/tasks.d.ts +200 -0
- package/dist/esm/mcp/tools/tasks.js +117 -0
- package/dist/esm/mcp/tools/tasks.js.map +1 -0
- package/dist/esm/mcp/tools.d.ts +2 -0
- package/dist/esm/mcp/tools.js +40 -0
- package/dist/esm/mcp/tools.js.map +1 -0
- package/dist/esm/mcp/types.d.ts +6 -0
- package/dist/esm/mcp/types.js +2 -0
- package/dist/esm/mcp/types.js.map +1 -0
- package/dist/esm/mcp/utils.d.ts +89 -0
- package/dist/esm/mcp/utils.js +95 -0
- package/dist/esm/mcp/utils.js.map +1 -0
- package/dist/esm/rules/install.d.ts +1 -0
- package/dist/esm/rules/install.js +2 -0
- package/dist/esm/rules/install.js.map +1 -0
- package/dist/esm/rules/manifest.d.ts +145 -0
- package/dist/esm/rules/manifest.js +110 -0
- package/dist/esm/rules/manifest.js.map +1 -0
- package/dist/esm/rules/types.d.ts +3 -0
- package/dist/esm/rules/types.js +3 -0
- package/dist/esm/rules/types.js.map +1 -0
- package/dist/esm/utilities/accessTokens.d.ts +12 -0
- package/dist/esm/utilities/accessTokens.js +30 -0
- package/dist/esm/utilities/accessTokens.js.map +1 -0
- package/dist/esm/utilities/analyze.d.ts +13 -0
- package/dist/esm/utilities/analyze.js +463 -0
- package/dist/esm/utilities/analyze.js.map +1 -0
- package/dist/esm/utilities/cliOutput.d.ts +6 -1
- package/dist/esm/utilities/cliOutput.js +11 -2
- package/dist/esm/utilities/cliOutput.js.map +1 -1
- package/dist/esm/utilities/configFiles.d.ts +65 -15
- package/dist/esm/utilities/configFiles.js +124 -26
- package/dist/esm/utilities/configFiles.js.map +1 -1
- package/dist/esm/utilities/eventBus.d.ts +7 -3
- package/dist/esm/utilities/eventBus.js.map +1 -1
- package/dist/esm/utilities/fileSystem.d.ts +7 -1
- package/dist/esm/utilities/fileSystem.js +42 -4
- package/dist/esm/utilities/fileSystem.js.map +1 -1
- package/dist/esm/utilities/gitMeta.d.ts +2 -0
- package/dist/esm/utilities/gitMeta.js +220 -0
- package/dist/esm/utilities/gitMeta.js.map +1 -0
- package/dist/esm/utilities/githubActions.d.ts +4 -0
- package/dist/esm/utilities/githubActions.js +18 -0
- package/dist/esm/utilities/githubActions.js.map +1 -0
- package/dist/esm/utilities/initialBanner.js +18 -6
- package/dist/esm/utilities/initialBanner.js.map +1 -1
- package/dist/esm/utilities/localEnvVars.d.ts +3 -0
- package/dist/esm/utilities/localEnvVars.js +19 -0
- package/dist/esm/utilities/localEnvVars.js.map +1 -0
- package/dist/esm/utilities/sanitizeEnvVars.d.ts +16 -3
- package/dist/esm/utilities/sanitizeEnvVars.js +15 -0
- package/dist/esm/utilities/sanitizeEnvVars.js.map +1 -1
- package/dist/esm/utilities/session.d.ts +14 -0
- package/dist/esm/utilities/session.js +44 -47
- package/dist/esm/utilities/session.js.map +1 -1
- package/dist/esm/utilities/supportsHyperlinks.d.ts +15 -0
- package/dist/esm/utilities/supportsHyperlinks.js +122 -0
- package/dist/esm/utilities/supportsHyperlinks.js.map +1 -0
- package/dist/esm/utilities/tempDirectories.d.ts +1 -0
- package/dist/esm/utilities/tempDirectories.js +19 -2
- package/dist/esm/utilities/tempDirectories.js.map +1 -1
- package/dist/esm/utilities/terminalLink.d.ts +56 -0
- package/dist/esm/utilities/terminalLink.js +76 -0
- package/dist/esm/utilities/terminalLink.js.map +1 -0
- package/dist/esm/utilities/windows.js +51 -1
- package/dist/esm/utilities/windows.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +44 -25
- package/dist/esm/entryPoints/deploy-index-controller.js.map +0 -1
- package/dist/esm/entryPoints/deploy-index-worker.js.map +0 -1
- package/dist/esm/entryPoints/deploy-run-controller.js +0 -1099
- package/dist/esm/entryPoints/deploy-run-controller.js.map +0 -1
- package/dist/esm/entryPoints/deploy-run-worker.js +0 -366
- package/dist/esm/entryPoints/deploy-run-worker.js.map +0 -1
- package/dist/esm/indexing/registerTasks.d.ts +0 -2
- package/dist/esm/indexing/registerTasks.js +0 -62
- package/dist/esm/indexing/registerTasks.js.map +0 -1
- package/dist/esm/telemetry/tracing.d.ts +0 -3
- package/dist/esm/telemetry/tracing.js +0 -58
- package/dist/esm/telemetry/tracing.js.map +0 -1
- /package/dist/esm/entryPoints/{deploy-index-controller.d.ts → managed-index-controller.d.ts} +0 -0
- /package/dist/esm/entryPoints/{deploy-index-worker.d.ts → managed-index-worker.d.ts} +0 -0
- /package/dist/esm/entryPoints/{deploy-run-controller.d.ts → managed-run-controller.d.ts} +0 -0
- /package/dist/esm/entryPoints/{deploy-run-worker.d.ts → managed-run-worker.d.ts} +0 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { tryCatch } from "@trigger.dev/core/utils";
|
|
2
|
+
import { assertExhaustive } from "@trigger.dev/core/utils";
|
|
3
|
+
export class SnapshotManager {
|
|
4
|
+
runFriendlyId;
|
|
5
|
+
runnerId;
|
|
6
|
+
logger;
|
|
7
|
+
metadataClient;
|
|
8
|
+
state;
|
|
9
|
+
isSuspendable = false;
|
|
10
|
+
onSnapshotChange;
|
|
11
|
+
onSuspendable;
|
|
12
|
+
changeQueue = [];
|
|
13
|
+
isProcessingQueue = false;
|
|
14
|
+
constructor(opts) {
|
|
15
|
+
this.runFriendlyId = opts.runFriendlyId;
|
|
16
|
+
this.runnerId = opts.runnerId;
|
|
17
|
+
this.logger = opts.logger;
|
|
18
|
+
this.metadataClient = opts.metadataClient;
|
|
19
|
+
this.state = {
|
|
20
|
+
id: opts.initialSnapshotId,
|
|
21
|
+
status: opts.initialStatus,
|
|
22
|
+
};
|
|
23
|
+
this.onSnapshotChange = opts.onSnapshotChange;
|
|
24
|
+
this.onSuspendable = opts.onSuspendable;
|
|
25
|
+
}
|
|
26
|
+
get snapshotId() {
|
|
27
|
+
return this.state.id;
|
|
28
|
+
}
|
|
29
|
+
get status() {
|
|
30
|
+
return this.state.status;
|
|
31
|
+
}
|
|
32
|
+
get suspendable() {
|
|
33
|
+
return this.isSuspendable;
|
|
34
|
+
}
|
|
35
|
+
async setSuspendable(suspendable) {
|
|
36
|
+
if (this.isSuspendable === suspendable) {
|
|
37
|
+
this.sendDebugLog(`skipping suspendable update, already ${suspendable}`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.sendDebugLog(`setting suspendable to ${suspendable}`);
|
|
41
|
+
return this.enqueueSnapshotChange({
|
|
42
|
+
id: crypto.randomUUID(),
|
|
43
|
+
type: "suspendable",
|
|
44
|
+
value: suspendable,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Update the snapshot ID and status without invoking any handlers
|
|
49
|
+
*
|
|
50
|
+
* @param snapshotId - The ID of the snapshot to update to
|
|
51
|
+
* @param status - The status to update to
|
|
52
|
+
*/
|
|
53
|
+
updateSnapshot(snapshotId, status) {
|
|
54
|
+
// Check if this is an old snapshot
|
|
55
|
+
if (snapshotId < this.state.id) {
|
|
56
|
+
this.sendDebugLog("skipping update for old snapshot", {
|
|
57
|
+
incomingId: snapshotId,
|
|
58
|
+
currentId: this.state.id,
|
|
59
|
+
});
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.state = { id: snapshotId, status };
|
|
63
|
+
}
|
|
64
|
+
async handleSnapshotChanges(snapshots) {
|
|
65
|
+
if (!this.statusCheck(snapshots)) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
return this.enqueueSnapshotChange({
|
|
69
|
+
id: crypto.randomUUID(),
|
|
70
|
+
type: "snapshot",
|
|
71
|
+
snapshots,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
get queueLength() {
|
|
75
|
+
return this.changeQueue.length;
|
|
76
|
+
}
|
|
77
|
+
statusCheck(snapshots) {
|
|
78
|
+
const latestSnapshot = snapshots[snapshots.length - 1];
|
|
79
|
+
if (!latestSnapshot) {
|
|
80
|
+
this.sendDebugLog("skipping status check for empty snapshots", {
|
|
81
|
+
snapshots,
|
|
82
|
+
});
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
const { run, snapshot } = latestSnapshot;
|
|
86
|
+
const statusCheckData = {
|
|
87
|
+
incomingId: snapshot.friendlyId,
|
|
88
|
+
incomingStatus: snapshot.executionStatus,
|
|
89
|
+
currentId: this.state.id,
|
|
90
|
+
currentStatus: this.state.status,
|
|
91
|
+
};
|
|
92
|
+
// Ensure run ID matches
|
|
93
|
+
if (run.friendlyId !== this.runFriendlyId) {
|
|
94
|
+
this.sendDebugLog("skipping update for mismatched run ID", {
|
|
95
|
+
statusCheckData,
|
|
96
|
+
});
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
// Skip if this is an old snapshot
|
|
100
|
+
if (snapshot.friendlyId < this.state.id) {
|
|
101
|
+
this.sendDebugLog("skipping update for old snapshot", {
|
|
102
|
+
statusCheckData,
|
|
103
|
+
});
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
// Skip if this is the current snapshot
|
|
107
|
+
if (snapshot.friendlyId === this.state.id) {
|
|
108
|
+
// DO NOT REMOVE (very noisy, but helpful for debugging)
|
|
109
|
+
// this.sendDebugLog("skipping update for duplicate snapshot", {
|
|
110
|
+
// statusCheckData,
|
|
111
|
+
// });
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
async enqueueSnapshotChange(change) {
|
|
117
|
+
return new Promise((resolve, reject) => {
|
|
118
|
+
// For suspendable changes, resolve and remove any pending suspendable changes since only the last one matters
|
|
119
|
+
if (change.type === "suspendable") {
|
|
120
|
+
const pendingSuspendable = this.changeQueue.filter((item) => item.change.type === "suspendable");
|
|
121
|
+
// Resolve any pending suspendable changes - they're effectively done since we're superseding them
|
|
122
|
+
for (const item of pendingSuspendable) {
|
|
123
|
+
item.resolve();
|
|
124
|
+
}
|
|
125
|
+
// Remove the exact items we just resolved
|
|
126
|
+
const resolvedIds = new Set(pendingSuspendable.map((item) => item.change.id));
|
|
127
|
+
this.changeQueue = this.changeQueue.filter((item) => !resolvedIds.has(item.change.id));
|
|
128
|
+
}
|
|
129
|
+
this.changeQueue.push({ change, resolve, reject });
|
|
130
|
+
// Sort queue:
|
|
131
|
+
// 1. Suspendable changes always go to the back
|
|
132
|
+
// 2. Snapshot changes are ordered by creation time, with the latest snapshot last
|
|
133
|
+
this.changeQueue.sort((a, b) => {
|
|
134
|
+
if (a.change.type === "suspendable" && b.change.type === "snapshot") {
|
|
135
|
+
return 1; // a goes after b
|
|
136
|
+
}
|
|
137
|
+
if (a.change.type === "snapshot" && b.change.type === "suspendable") {
|
|
138
|
+
return -1; // a goes before b
|
|
139
|
+
}
|
|
140
|
+
if (a.change.type === "snapshot" && b.change.type === "snapshot") {
|
|
141
|
+
const snapshotA = a.change.snapshots[a.change.snapshots.length - 1];
|
|
142
|
+
const snapshotB = b.change.snapshots[b.change.snapshots.length - 1];
|
|
143
|
+
if (!snapshotA || !snapshotB) {
|
|
144
|
+
return 0;
|
|
145
|
+
}
|
|
146
|
+
// Sort snapshot changes by creation time, old -> new
|
|
147
|
+
return snapshotA.snapshot.createdAt.getTime() - snapshotB.snapshot.createdAt.getTime();
|
|
148
|
+
}
|
|
149
|
+
return 0; // both suspendable, maintain insertion order
|
|
150
|
+
});
|
|
151
|
+
// Start processing if not already running
|
|
152
|
+
this.processQueue().catch((error) => {
|
|
153
|
+
this.sendDebugLog("error processing queue", { error: error.message });
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
async processQueue() {
|
|
158
|
+
if (this.isProcessingQueue) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
this.isProcessingQueue = true;
|
|
162
|
+
try {
|
|
163
|
+
while (this.queueLength > 0) {
|
|
164
|
+
// Remove first item from queue
|
|
165
|
+
const item = this.changeQueue.shift();
|
|
166
|
+
if (!item) {
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
const [error] = await tryCatch(this.applyChange(item.change));
|
|
170
|
+
// Resolve/reject promise
|
|
171
|
+
if (error) {
|
|
172
|
+
item.reject(error);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
item.resolve();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
const hasMoreItems = this.queueLength > 0;
|
|
181
|
+
this.isProcessingQueue = false;
|
|
182
|
+
if (hasMoreItems) {
|
|
183
|
+
this.processQueue().catch((error) => {
|
|
184
|
+
this.sendDebugLog("error processing queue (finally)", { error: error.message });
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async applyChange(change) {
|
|
190
|
+
switch (change.type) {
|
|
191
|
+
case "snapshot": {
|
|
192
|
+
const { snapshots } = change;
|
|
193
|
+
// Double check we should process this snapshot
|
|
194
|
+
if (!this.statusCheck(snapshots)) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const latestSnapshot = change.snapshots[change.snapshots.length - 1];
|
|
198
|
+
if (!latestSnapshot) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// These are the snapshots between the current and the latest one
|
|
202
|
+
const previousSnapshots = snapshots.slice(0, -1);
|
|
203
|
+
// Check if any previous snapshot is QUEUED or SUSPENDED
|
|
204
|
+
const deprecatedStatus = ["QUEUED", "SUSPENDED"];
|
|
205
|
+
const deprecatedSnapshots = previousSnapshots.filter((snap) => deprecatedStatus.includes(snap.snapshot.executionStatus));
|
|
206
|
+
let deprecated = false;
|
|
207
|
+
if (deprecatedSnapshots.length > 0) {
|
|
208
|
+
const hasBeenRestored = await this.hasBeenRestored();
|
|
209
|
+
if (hasBeenRestored) {
|
|
210
|
+
// It's normal for a restored run to have deprecation markers, e.g. it will have been SUSPENDED
|
|
211
|
+
deprecated = false;
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
deprecated = true;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const { snapshot } = latestSnapshot;
|
|
218
|
+
const oldState = { ...this.state };
|
|
219
|
+
this.updateSnapshot(snapshot.friendlyId, snapshot.executionStatus);
|
|
220
|
+
this.sendDebugLog(`status changed to ${snapshot.executionStatus}`, {
|
|
221
|
+
oldId: oldState.id,
|
|
222
|
+
newId: snapshot.friendlyId,
|
|
223
|
+
oldStatus: oldState.status,
|
|
224
|
+
newStatus: snapshot.executionStatus,
|
|
225
|
+
deprecated,
|
|
226
|
+
});
|
|
227
|
+
// Execute handler
|
|
228
|
+
await this.onSnapshotChange(latestSnapshot, deprecated);
|
|
229
|
+
// Check suspendable state after snapshot change
|
|
230
|
+
await this.checkSuspendableState();
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
case "suspendable": {
|
|
234
|
+
this.isSuspendable = change.value;
|
|
235
|
+
// Check suspendable state after suspendable change
|
|
236
|
+
await this.checkSuspendableState();
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
default: {
|
|
240
|
+
assertExhaustive(change);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
async hasBeenRestored() {
|
|
245
|
+
if (!this.metadataClient) {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
const [error, overrides] = await this.metadataClient.getEnvOverrides();
|
|
249
|
+
if (error) {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
if (!overrides.TRIGGER_RUNNER_ID) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
if (overrides.TRIGGER_RUNNER_ID === this.runnerId) {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
this.runnerId = overrides.TRIGGER_RUNNER_ID;
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
async checkSuspendableState() {
|
|
262
|
+
if (this.isSuspendable &&
|
|
263
|
+
(this.state.status === "EXECUTING_WITH_WAITPOINTS" ||
|
|
264
|
+
this.state.status === "QUEUED_EXECUTING")) {
|
|
265
|
+
// DO NOT REMOVE (very noisy, but helpful for debugging)
|
|
266
|
+
// this.sendDebugLog("run is now suspendable, executing handler");
|
|
267
|
+
await this.onSuspendable(this.state);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
stop() {
|
|
271
|
+
this.sendDebugLog("stop");
|
|
272
|
+
// Clear any pending changes
|
|
273
|
+
for (const item of this.changeQueue) {
|
|
274
|
+
item.reject(new Error("SnapshotManager stopped"));
|
|
275
|
+
}
|
|
276
|
+
this.changeQueue = [];
|
|
277
|
+
}
|
|
278
|
+
sendDebugLog(message, properties) {
|
|
279
|
+
this.logger.sendDebugLog({
|
|
280
|
+
runId: this.runFriendlyId,
|
|
281
|
+
message: `[snapshot] ${message}`,
|
|
282
|
+
properties: {
|
|
283
|
+
...properties,
|
|
284
|
+
snapshotId: this.state.id,
|
|
285
|
+
status: this.state.status,
|
|
286
|
+
suspendable: this.isSuspendable,
|
|
287
|
+
queueLength: this.queueLength,
|
|
288
|
+
isProcessingQueue: this.isProcessingQueue,
|
|
289
|
+
},
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../../src/entryPoints/managed/snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { WorkerManifest } from "@trigger.dev/core/v3";
|
|
2
|
+
import { TaskRunProcess } from "../../executions/taskRunProcess.js";
|
|
3
|
+
import { RunnerEnv } from "./env.js";
|
|
4
|
+
import { RunLogger } from "./logger.js";
|
|
5
|
+
export interface TaskRunProcessProviderOptions {
|
|
6
|
+
workerManifest: WorkerManifest;
|
|
7
|
+
env: RunnerEnv;
|
|
8
|
+
logger: RunLogger;
|
|
9
|
+
processKeepAliveEnabled: boolean;
|
|
10
|
+
processKeepAliveMaxExecutionCount: number;
|
|
11
|
+
}
|
|
12
|
+
export interface GetProcessOptions {
|
|
13
|
+
taskRunEnv: Record<string, string>;
|
|
14
|
+
isWarmStart?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class TaskRunProcessProvider {
|
|
17
|
+
private readonly workerManifest;
|
|
18
|
+
private readonly env;
|
|
19
|
+
private readonly logger;
|
|
20
|
+
private readonly processKeepAliveEnabled;
|
|
21
|
+
private readonly processKeepAliveMaxExecutionCount;
|
|
22
|
+
private persistentProcess;
|
|
23
|
+
private executionCount;
|
|
24
|
+
constructor(opts: TaskRunProcessProviderOptions);
|
|
25
|
+
get hasPersistentProcess(): boolean;
|
|
26
|
+
handleImmediateRetry(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Gets a TaskRunProcess, either by reusing an existing one or creating a new one
|
|
29
|
+
*/
|
|
30
|
+
getProcess(opts: GetProcessOptions): Promise<TaskRunProcess>;
|
|
31
|
+
/**
|
|
32
|
+
* Returns a process after execution, handling keep-alive logic and cleanup
|
|
33
|
+
*/
|
|
34
|
+
returnProcess(process: TaskRunProcess): Promise<void>;
|
|
35
|
+
suspendProcess(flush: boolean, process?: TaskRunProcess): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Handles process abort/kill scenarios
|
|
38
|
+
*/
|
|
39
|
+
handleProcessAbort(process: TaskRunProcess): Promise<void>;
|
|
40
|
+
killProcess(process: TaskRunProcess): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Forces cleanup of any persistent process
|
|
43
|
+
*/
|
|
44
|
+
cleanup(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Gets metrics about the provider state
|
|
47
|
+
*/
|
|
48
|
+
get metrics(): {
|
|
49
|
+
processKeepAlive: {
|
|
50
|
+
enabled: boolean;
|
|
51
|
+
executionCount: number;
|
|
52
|
+
maxExecutionCount: number;
|
|
53
|
+
hasPersistentProcess: boolean;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
private createTaskRunProcess;
|
|
57
|
+
private buildProcessEnvironment;
|
|
58
|
+
private shouldReusePersistentProcess;
|
|
59
|
+
private shouldKeepProcessAlive;
|
|
60
|
+
private cleanupProcess;
|
|
61
|
+
private sendDebugLog;
|
|
62
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { TaskRunProcess } from "../../executions/taskRunProcess.js";
|
|
2
|
+
export class TaskRunProcessProvider {
|
|
3
|
+
workerManifest;
|
|
4
|
+
env;
|
|
5
|
+
logger;
|
|
6
|
+
processKeepAliveEnabled;
|
|
7
|
+
processKeepAliveMaxExecutionCount;
|
|
8
|
+
// Process keep-alive state
|
|
9
|
+
persistentProcess = null;
|
|
10
|
+
executionCount = 0;
|
|
11
|
+
constructor(opts) {
|
|
12
|
+
this.workerManifest = opts.workerManifest;
|
|
13
|
+
this.env = opts.env;
|
|
14
|
+
this.logger = opts.logger;
|
|
15
|
+
this.processKeepAliveEnabled = opts.processKeepAliveEnabled;
|
|
16
|
+
this.processKeepAliveMaxExecutionCount = opts.processKeepAliveMaxExecutionCount;
|
|
17
|
+
}
|
|
18
|
+
get hasPersistentProcess() {
|
|
19
|
+
return !!this.persistentProcess;
|
|
20
|
+
}
|
|
21
|
+
async handleImmediateRetry() {
|
|
22
|
+
if (!this.processKeepAliveEnabled) {
|
|
23
|
+
// For immediate retries, we need to ensure we have a clean process
|
|
24
|
+
if (this.persistentProcess) {
|
|
25
|
+
// If the process is not prepared for the next attempt, we need to get a fresh one
|
|
26
|
+
if (!this.persistentProcess.isPreparedForNextAttempt) {
|
|
27
|
+
this.sendDebugLog("existing task run process not prepared for retry, will get fresh process");
|
|
28
|
+
await this.persistentProcess.kill("SIGKILL");
|
|
29
|
+
this.persistentProcess = null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Gets a TaskRunProcess, either by reusing an existing one or creating a new one
|
|
36
|
+
*/
|
|
37
|
+
async getProcess(opts) {
|
|
38
|
+
this.sendDebugLog("Getting TaskRunProcess", {
|
|
39
|
+
processKeepAliveEnabled: this.processKeepAliveEnabled,
|
|
40
|
+
hasPersistentProcess: !!this.persistentProcess,
|
|
41
|
+
executionCount: this.executionCount,
|
|
42
|
+
maxExecutionCount: this.processKeepAliveMaxExecutionCount,
|
|
43
|
+
isWarmStart: opts.isWarmStart,
|
|
44
|
+
});
|
|
45
|
+
// If process keep-alive is disabled, always create a new process
|
|
46
|
+
if (!this.processKeepAliveEnabled) {
|
|
47
|
+
this.sendDebugLog("Creating new TaskRunProcess (keep-alive disabled)");
|
|
48
|
+
return this.createTaskRunProcess(opts);
|
|
49
|
+
}
|
|
50
|
+
// If process keep-alive is enabled and we have a healthy persistent process, reuse it
|
|
51
|
+
if (this.shouldReusePersistentProcess()) {
|
|
52
|
+
this.sendDebugLog("Reusing persistent TaskRunProcess", {
|
|
53
|
+
executionCount: this.executionCount,
|
|
54
|
+
});
|
|
55
|
+
return this.persistentProcess;
|
|
56
|
+
}
|
|
57
|
+
// Create new process (keep-alive enabled but no reusable process available)
|
|
58
|
+
this.sendDebugLog("Creating new TaskRunProcess", {
|
|
59
|
+
hadPersistentProcess: !!this.persistentProcess,
|
|
60
|
+
reason: this.processKeepAliveEnabled
|
|
61
|
+
? "execution limit reached or unhealthy"
|
|
62
|
+
: "keep-alive disabled",
|
|
63
|
+
});
|
|
64
|
+
const existingPersistentProcess = this.persistentProcess;
|
|
65
|
+
// Clean up old persistent process if it exists
|
|
66
|
+
if (existingPersistentProcess) {
|
|
67
|
+
await this.cleanupProcess(existingPersistentProcess);
|
|
68
|
+
}
|
|
69
|
+
this.persistentProcess = this.createTaskRunProcess(opts);
|
|
70
|
+
this.executionCount = 0;
|
|
71
|
+
return this.persistentProcess;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Returns a process after execution, handling keep-alive logic and cleanup
|
|
75
|
+
*/
|
|
76
|
+
async returnProcess(process) {
|
|
77
|
+
this.sendDebugLog("Returning TaskRunProcess", {
|
|
78
|
+
processKeepAliveEnabled: this.processKeepAliveEnabled,
|
|
79
|
+
executionCount: this.executionCount,
|
|
80
|
+
maxExecutionCount: this.processKeepAliveMaxExecutionCount,
|
|
81
|
+
});
|
|
82
|
+
if (!this.processKeepAliveEnabled) {
|
|
83
|
+
// Keep-alive disabled - immediately cleanup the process
|
|
84
|
+
this.sendDebugLog("Keep-alive disabled, cleaning up process immediately");
|
|
85
|
+
await process.cleanup(true);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// Keep-alive enabled - check if we should keep the process alive
|
|
89
|
+
if (this.shouldKeepProcessAlive(process)) {
|
|
90
|
+
this.sendDebugLog("Keeping TaskRunProcess alive for next run", {
|
|
91
|
+
executionCount: this.executionCount,
|
|
92
|
+
maxExecutionCount: this.processKeepAliveMaxExecutionCount,
|
|
93
|
+
});
|
|
94
|
+
// Call cleanup(false) to prepare for next run but keep process alive
|
|
95
|
+
await process.cleanup(false);
|
|
96
|
+
this.persistentProcess = process;
|
|
97
|
+
this.executionCount++;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
this.sendDebugLog("Not keeping TaskRunProcess alive, cleaning up", {
|
|
101
|
+
executionCount: this.executionCount,
|
|
102
|
+
maxExecutionCount: this.processKeepAliveMaxExecutionCount,
|
|
103
|
+
isHealthy: process.isHealthy,
|
|
104
|
+
});
|
|
105
|
+
// Cleanup the process completely
|
|
106
|
+
await process.cleanup(true);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async suspendProcess(flush, process) {
|
|
110
|
+
if (this.persistentProcess) {
|
|
111
|
+
if (process) {
|
|
112
|
+
if (this.persistentProcess.pid === process.pid) {
|
|
113
|
+
this.sendDebugLog("Suspending matching persistent TaskRunProcess (process provided)", {
|
|
114
|
+
pid: process.pid,
|
|
115
|
+
flush,
|
|
116
|
+
});
|
|
117
|
+
this.persistentProcess = null;
|
|
118
|
+
this.executionCount = 0;
|
|
119
|
+
await process.suspend({ flush });
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
this.sendDebugLog("Suspending TaskRunProcess (does not match persistent process)", {
|
|
123
|
+
pid: process.pid,
|
|
124
|
+
flush,
|
|
125
|
+
});
|
|
126
|
+
await process.suspend({ flush });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
this.sendDebugLog("Suspending persistent TaskRunProcess (no process provided)", {
|
|
131
|
+
pid: this.persistentProcess.pid,
|
|
132
|
+
flush,
|
|
133
|
+
});
|
|
134
|
+
this.persistentProcess = null;
|
|
135
|
+
this.executionCount = 0;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
if (process) {
|
|
140
|
+
this.sendDebugLog("Suspending non-persistent TaskRunProcess (process provided)", {
|
|
141
|
+
pid: process.pid,
|
|
142
|
+
flush,
|
|
143
|
+
});
|
|
144
|
+
await process.suspend({ flush });
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
this.sendDebugLog("Suspending non-persistent TaskRunProcess (no process provided)", {
|
|
148
|
+
flush,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Handles process abort/kill scenarios
|
|
155
|
+
*/
|
|
156
|
+
async handleProcessAbort(process) {
|
|
157
|
+
this.sendDebugLog("Handling process abort");
|
|
158
|
+
// If this was our persistent process, clear it
|
|
159
|
+
if (this.persistentProcess?.pid === process.pid) {
|
|
160
|
+
this.persistentProcess = null;
|
|
161
|
+
this.executionCount = 0;
|
|
162
|
+
}
|
|
163
|
+
// Kill the process
|
|
164
|
+
await process.cleanup(true);
|
|
165
|
+
}
|
|
166
|
+
async killProcess(process) {
|
|
167
|
+
this.sendDebugLog("Killing process");
|
|
168
|
+
// If this was our persistent process, clear it
|
|
169
|
+
if (this.persistentProcess?.pid === process.pid) {
|
|
170
|
+
this.persistentProcess = null;
|
|
171
|
+
this.executionCount = 0;
|
|
172
|
+
}
|
|
173
|
+
// Kill the process
|
|
174
|
+
await this.cleanupProcess(process);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Forces cleanup of any persistent process
|
|
178
|
+
*/
|
|
179
|
+
async cleanup() {
|
|
180
|
+
if (this.persistentProcess) {
|
|
181
|
+
this.sendDebugLog("cleanup() called");
|
|
182
|
+
await this.cleanupProcess(this.persistentProcess);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Gets metrics about the provider state
|
|
187
|
+
*/
|
|
188
|
+
get metrics() {
|
|
189
|
+
return {
|
|
190
|
+
processKeepAlive: {
|
|
191
|
+
enabled: this.processKeepAliveEnabled,
|
|
192
|
+
executionCount: this.executionCount,
|
|
193
|
+
maxExecutionCount: this.processKeepAliveMaxExecutionCount,
|
|
194
|
+
hasPersistentProcess: !!this.persistentProcess,
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
createTaskRunProcess({ taskRunEnv, isWarmStart }) {
|
|
199
|
+
const processEnv = this.buildProcessEnvironment(taskRunEnv);
|
|
200
|
+
const taskRunProcess = new TaskRunProcess({
|
|
201
|
+
workerManifest: this.workerManifest,
|
|
202
|
+
env: processEnv,
|
|
203
|
+
serverWorker: {
|
|
204
|
+
id: "managed",
|
|
205
|
+
contentHash: this.env.TRIGGER_CONTENT_HASH,
|
|
206
|
+
version: this.env.TRIGGER_DEPLOYMENT_VERSION,
|
|
207
|
+
engine: "V2",
|
|
208
|
+
},
|
|
209
|
+
machineResources: {
|
|
210
|
+
cpu: Number(this.env.TRIGGER_MACHINE_CPU),
|
|
211
|
+
memory: Number(this.env.TRIGGER_MACHINE_MEMORY),
|
|
212
|
+
},
|
|
213
|
+
isWarmStart,
|
|
214
|
+
}).initialize();
|
|
215
|
+
return taskRunProcess;
|
|
216
|
+
}
|
|
217
|
+
buildProcessEnvironment(taskRunEnv) {
|
|
218
|
+
return {
|
|
219
|
+
...taskRunEnv,
|
|
220
|
+
...this.env.gatherProcessEnv(),
|
|
221
|
+
HEARTBEAT_INTERVAL_MS: String(this.env.TRIGGER_HEARTBEAT_INTERVAL_SECONDS * 1000),
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
shouldReusePersistentProcess() {
|
|
225
|
+
this.sendDebugLog("Checking if persistent process should be reused", {
|
|
226
|
+
executionCount: this.executionCount,
|
|
227
|
+
maxExecutionCount: this.processKeepAliveMaxExecutionCount,
|
|
228
|
+
pid: this.persistentProcess?.pid ?? "unknown",
|
|
229
|
+
isBeingKilled: this.persistentProcess?.isBeingKilled ?? "unknown",
|
|
230
|
+
});
|
|
231
|
+
return (!!this.persistentProcess &&
|
|
232
|
+
this.executionCount < this.processKeepAliveMaxExecutionCount &&
|
|
233
|
+
this.persistentProcess.isHealthy);
|
|
234
|
+
}
|
|
235
|
+
shouldKeepProcessAlive(process) {
|
|
236
|
+
return this.executionCount < this.processKeepAliveMaxExecutionCount && process.isHealthy;
|
|
237
|
+
}
|
|
238
|
+
async cleanupProcess(taskRunProcess) {
|
|
239
|
+
if (taskRunProcess && taskRunProcess.pid !== undefined) {
|
|
240
|
+
this.sendDebugLog("Cleaning up TaskRunProcess", { pid: taskRunProcess.pid });
|
|
241
|
+
await taskRunProcess.kill("SIGKILL").catch(() => { });
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
sendDebugLog(message, properties) {
|
|
245
|
+
this.logger.sendDebugLog({
|
|
246
|
+
runId: undefined, // Provider doesn't have access to current run ID
|
|
247
|
+
message: `[taskRunProcessProvider] ${message}`,
|
|
248
|
+
properties,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=taskRunProcessProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskRunProcessProvider.js","sourceRoot":"","sources":["../../../../src/entryPoints/managed/taskRunProcessProvider.ts"],"names":[],"mappings":"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"}
|