@trigger.dev/core 3.0.0-beta.29 → 3.0.0-beta.30
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/dist/v3/index.d.mts +13 -1
- package/dist/v3/index.d.ts +13 -1
- package/dist/v3/index.js +30 -1
- package/dist/v3/index.js.map +1 -1
- package/dist/v3/index.mjs +30 -2
- package/dist/v3/index.mjs.map +1 -1
- package/dist/v3/prod/index.js +1 -1
- package/dist/v3/prod/index.js.map +1 -1
- package/dist/v3/prod/index.mjs +1 -1
- package/dist/v3/prod/index.mjs.map +1 -1
- package/dist/v3/workers/index.js +2 -1
- package/dist/v3/workers/index.js.map +1 -1
- package/dist/v3/workers/index.mjs +2 -1
- package/dist/v3/workers/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/v3/prod/index.js
CHANGED
|
@@ -148,7 +148,7 @@ var _ProdRuntimeManager = class _ProdRuntimeManager {
|
|
|
148
148
|
const { checkpointCanceled, version } = await this.ipc.sendWithAck("CANCEL_CHECKPOINT", {
|
|
149
149
|
version: "v2",
|
|
150
150
|
reason: "WAIT_FOR_DURATION"
|
|
151
|
-
});
|
|
151
|
+
}, 31e3);
|
|
152
152
|
if (checkpointCanceled) {
|
|
153
153
|
return;
|
|
154
154
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/v3/utils/platform.ts","../../../src/v3/utils/globals.ts","../../../src/v3/clock/simpleClock.ts","../../../src/v3/clock/index.ts","../../../src/v3/clock-api.ts","../../../src/v3/utils/timers.ts","../../../src/v3/runtime/prodRuntimeManager.ts"],"names":["_globalThis","globalThis","global","GLOBAL_TRIGGER_DOT_DEV_KEY","Symbol","for","_global","registerGlobal","type","instance","allowOverride","api","err","Error","getGlobal","PreciseDate","SimpleClock","preciseNow","now","nowStruct","toStruct","seconds","nanos","reset","API_NAME","SIMPLE_CLOCK","ClockAPI","getInstance","_instance","setGlobalClock","clock","setInterval","setTimeout","unboundedTimeout","delay","value","options","maxDelay","fullTimeouts","Math","floor","remainingDelay","lastTimeoutResult","i","checkpointSafeTimeout","scanIntervalMs","start","Date","ProdRuntimeManager","constructor","ipc","_taskWaits","Map","_batchWaits","disable","waitForDuration","ms","internalTimeout","checkpointSafeInternalTimeout","waitThresholdInMs","externalResume","Promise","resolve","reject","_waitForDuration","willCheckpointAndRestore","sendWithAck","send","race","checkpointCanceled","version","reason","resumeAfterDuration","process","stdout","write","JSON","stringify","console","log","undefined","waitUntil","date","getTime","waitForTask","params","promise","set","id","friendlyId","result","waitForBatch","runs","length","items","all","map","runId","batchFriendlyId","runFriendlyIds","results","resumeTask","completion","execution","wait","get","run","delete"],"mappings":";;;;;;;;;;;;;;;;;AAAO,IAAMA,cAAc,OAAOC,eAAe,WAAWA,aAAaC;;;ACOzE,IAAMC,6BAA6BC,OAAOC,IAAI,oBAAoB;AAElE,IAAMC,UAAUN;AAET,SAASO,eACdC,MACAC,UACAC,gBAAgB,OACP;AACT,QAAMC,MAAOL,QAAQH,0BAAAA,IAA8BG,QAAQH,0BAAAA,KAA+B,CAAC;AAE3F,MAAI,CAACO,iBAAiBC,IAAIH,IAAAA,GAAO;AAE/B,UAAMI,MAAM,IAAIC,MAAM,yDAAyDL,IAAAA,EAAM;AACrF,WAAO;EACT;AAEAG,MAAIH,IAAAA,IAAQC;AAEZ,SAAO;AACT;AAhBgBF;AAkBT,SAASO,UACdN,MAC0C;AAC1C,SAAOF,QAAQH,0BAAAA,IAA8BK,IAAAA;AAC/C;AAJgBM;;;AC7BhB,SAASC,mBAAmB;AAGrB,IAAMC,eAAN,MAAMA,aAAAA;EACXC,aAA+B;AAC7B,UAAMC,MAAM,IAAIH,YAAAA;AAChB,UAAMI,YAAYD,IAAIE,SAAQ;AAE9B,WAAO;MAACD,UAAUE;MAASF,UAAUG;;EACvC;EAEAC,QAAQ;EAER;AACF;AAXaP;AAAN,IAAMA,cAAN;;;ACHP,IAAMQ,WAAW;AAMjB,IAAMC,eAAe,IAAIT,YAAAA;AANzB;AAQO,IAAMU,YAAN,MAAMA,UAAAA;EAGX,cAAsB;AAsBtB;EAtBuB;EAEvB,OAAcC,cAAwB;AACpC,QAAI,CAAC,KAAKC,WAAW;AACnB,WAAKA,YAAY,IAAIF,UAAAA;IACvB;AAEA,WAAO,KAAKE;EACd;EAEOC,eAAeC,QAAuB;AAC3C,WAAOvB,eAAeiB,UAAUM,MAAAA;EAClC;EAEOb,aAAwB;AAC7B,WAAO,sBAAK,wBAAL,WAAiBA,WAAU;EACpC;EAEOM,QAAc;AACnB,0BAAK,wBAAL,WAAiBA,MAAK;EACxB;AAKF;AAHE;cAAS,kCAAU;AACjB,SAAOT,UAAUU,QAAAA,KAAaC;AAChC,GAFS;AAzBEC;AAAN,IAAMA,WAAN;;;ACJA,IAAMI,QAAQJ,SAASC,YAAW;;;ACHzC,SAASI,aAAaC,kBAAkB;AAExC,eAAsBC,iBACpBC,QAAgB,GAChBC,OACAC,SACY;AACZ,QAAMC,WAAW;AAEjB,QAAMC,eAAeC,KAAKC,MAAMN,QAAQG,QAAAA;AACxC,QAAMI,iBAAiBP,QAAQG;AAE/B,MAAIK,oBAAoB,MAAMV,WAAWS,gBAAgBN,OAAOC,OAAAA;AAEhE,WAASO,IAAI,GAAGA,IAAIL,cAAcK,KAAK;AACrCD,wBAAoB,MAAMV,WAAWK,UAAUF,OAAOC,OAAAA;EACxD;AAEA,SAAOM;AACT;AAjBsBT;AAmBtB,eAAsBW,sBAAsBV,QAAgB,GAAkB;AAC5E,QAAMW,iBAAiB;AAGvB,mBAAiBC,SAASf,YAAYc,gBAAgBE,KAAK7B,IAAG,CAAA,GAAK;AACjE,QAAI6B,KAAK7B,IAAG,IAAK4B,QAAQZ,OAAO;AAC9B;IACF;EACF;AACF;AATsBU;;;ACJf,IAAMI,sBAAN,MAAMA,oBAAAA;EAYXC,YACUC,KAIAd,UAAqC,CAAC,GAC9C;eALQc;mBAIAd;SAhBVe,aAAgF,oBAAIC,IAAAA;SAEpFC,cAGI,oBAAID,IAAAA;EAYL;EAEHE,UAAgB;EAEhB;EAEA,MAAMC,gBAAgBC,IAA2B;AAC/C,UAAMtC,MAAM6B,KAAK7B,IAAG;AAEpB,UAAMuC,kBAAkBxB,iBAAiBuB,IAAI,UAAA;AAC7C,UAAME,gCAAgCd,sBAAsBY,EAAAA;AAE5D,QAAIA,MAAM,KAAKG,mBAAmB;AAChC,YAAMF;AACN;IACF;AAEA,UAAMG,iBAAiB,IAAIC,QAAoB,CAACC,SAASC,WAAW;AAClE,WAAKC,mBAAmB;QAAEF;QAASC;MAAO;IAC5C,CAAA;AAEA,UAAM,EAAEE,yBAAwB,IAAK,MAAM,KAAKf,IAAIgB,YAAY,qBAAqB;MACnFV;MACAtC;IACF,CAAA;AAEA,QAAI,CAAC+C,0BAA0B;AAC7B,YAAMR;AACN;IACF;AAEA,SAAKP,IAAIiB,KAAK,wBAAwB,CAAC,CAAA;AAIvC,UAAMN,QAAQO,KAAK;MAACX;MAAiBC;KAA8B;AAGnE5B,UAAMP,MAAK;AAGX,UAAM,EAAE8C,oBAAoBC,QAAO,IAAK,MAAM,KAAKpB,IAAIgB,YAAY,qBAAqB;MACtFI,SAAS;MACTC,QAAQ;IACV,CAAA;AAEA,QAAIF,oBAAoB;AAEtB;IACF;AAGA,UAAMT;EACR;EAEAY,sBAA4B;AAC1B,QAAI,CAAC,KAAKR,kBAAkB;AAC1B;IACF;AAEAS,YAAQC,OAAOC,MAAM,KAAA;AACrBF,YAAQC,OAAOC,MAAMC,KAAKC,UAAU/C,MAAMb,WAAU,CAAA,CAAA;AAEpD6D,YAAQC,IAAI,OAAOjD,MAAMb,WAAU,CAAA;AAGnCa,UAAMP,MAAK;AAEXuD,YAAQC,IAAI,QAAQjD,MAAMb,WAAU,CAAA;AAEpCwD,YAAQC,OAAOC,MAAM,MAAA;AACrBF,YAAQC,OAAOC,MAAMC,KAAKC,UAAU/C,MAAMb,WAAU,CAAA,CAAA;AAEpD,SAAK+C,iBAAiBF,QAAQ,UAAA;AAC9B,SAAKE,mBAAmBgB;EAC1B;EAEA,MAAMC,UAAUC,MAA2B;AACzC,WAAO,KAAK3B,gBAAgB2B,KAAKC,QAAO,IAAKpC,KAAK7B,IAAG,CAAA;EACvD;EAEA,MAAMkE,YAAYC,QAA8E;AAC9F,UAAMC,UAAU,IAAIzB,QAAgC,CAACC,YAAY;AAC/D,WAAKX,WAAWoC,IAAIF,OAAOG,IAAI;QAAE1B;MAAQ,CAAA;IAC3C,CAAA;AAEA,UAAM,KAAKZ,IAAIiB,KAAK,iBAAiB;MACnCsB,YAAYJ,OAAOG;IACrB,CAAA;AAEA,UAAME,SAAS,MAAMJ;AAErBxD,UAAMP,MAAK;AAEX,WAAOmE;EACT;EAEA,MAAMC,aAAaN,QAIsB;AACvC,QAAI,CAACA,OAAOO,KAAKC,QAAQ;AACvB,aAAOhC,QAAQC,QAAQ;QAAE0B,IAAIH,OAAOG;QAAIM,OAAO,CAAA;MAAG,CAAA;IACpD;AAEA,UAAMR,UAAUzB,QAAQkC,IACtBV,OAAOO,KAAKI,IAAI,CAACC,UAAU;AACzB,aAAO,IAAIpC,QAAgC,CAACC,SAASC,WAAW;AAC9D,aAAKZ,WAAWoC,IAAIU,OAAO;UAAEnC;QAAQ,CAAA;MACvC,CAAA;IACF,CAAA,CAAA;AAGF,UAAM,KAAKZ,IAAIiB,KAAK,kBAAkB;MACpC+B,iBAAiBb,OAAOG;MACxBW,gBAAgBd,OAAOO;IACzB,CAAA;AAEA,UAAMQ,UAAU,MAAMd;AAEtBxD,UAAMP,MAAK;AAEX,WAAO;MACLiE,IAAIH,OAAOG;MACXM,OAAOM;IACT;EACF;EAEAC,WAAWC,YAAoCC,WAAmC;AAChF,UAAMC,OAAO,KAAKrD,WAAWsD,IAAIF,UAAUG,IAAIlB,EAAE;AAEjD,QAAI,CAACgB,MAAM;AACT;IACF;AAEAA,SAAK1C,QAAQwC,UAAAA;AAEb,SAAKnD,WAAWwD,OAAOJ,UAAUG,IAAIlB,EAAE;EACzC;EAEA,IAAY7B,oBAA4B;AACtC,WAAO,KAAKvB,QAAQuB,qBAAqB;EAC3C;AACF;AAlKaX;AAAN,IAAMA,qBAAN","sourcesContent":["export const _globalThis = typeof globalThis === \"object\" ? globalThis : global;\n","import { ApiClientConfiguration } from \"../apiClientManager/types\";\nimport { Clock } from \"../clock/clock\";\nimport type { RuntimeManager } from \"../runtime/manager\";\nimport { TaskCatalog } from \"../task-catalog/catalog\";\nimport { TaskContext } from \"../taskContext/types\";\nimport { _globalThis } from \"./platform\";\n\nconst GLOBAL_TRIGGER_DOT_DEV_KEY = Symbol.for(`dev.trigger.ts.api`);\n\nconst _global = _globalThis as TriggerDotDevGlobal;\n\nexport function registerGlobal<Type extends keyof TriggerDotDevGlobalAPI>(\n type: Type,\n instance: TriggerDotDevGlobalAPI[Type],\n allowOverride = false\n): boolean {\n const api = (_global[GLOBAL_TRIGGER_DOT_DEV_KEY] = _global[GLOBAL_TRIGGER_DOT_DEV_KEY] ?? {});\n\n if (!allowOverride && api[type]) {\n // already registered an API of this type\n const err = new Error(`trigger.dev: Attempted duplicate registration of API: ${type}`);\n return false;\n }\n\n api[type] = instance;\n\n return true;\n}\n\nexport function getGlobal<Type extends keyof TriggerDotDevGlobalAPI>(\n type: Type\n): TriggerDotDevGlobalAPI[Type] | undefined {\n return _global[GLOBAL_TRIGGER_DOT_DEV_KEY]?.[type];\n}\n\nexport function unregisterGlobal(type: keyof TriggerDotDevGlobalAPI) {\n const api = _global[GLOBAL_TRIGGER_DOT_DEV_KEY];\n\n if (api) {\n delete api[type];\n }\n}\n\ntype TriggerDotDevGlobal = {\n [GLOBAL_TRIGGER_DOT_DEV_KEY]?: TriggerDotDevGlobalAPI;\n};\n\ntype TriggerDotDevGlobalAPI = {\n runtime?: RuntimeManager;\n logger?: any;\n clock?: Clock;\n [\"task-catalog\"]?: TaskCatalog;\n [\"task-context\"]?: TaskContext;\n [\"api-client\"]?: ApiClientConfiguration;\n};\n","import { PreciseDate } from \"@google-cloud/precise-date\";\nimport { Clock } from \"./clock\";\n\nexport class SimpleClock implements Clock {\n preciseNow(): [number, number] {\n const now = new PreciseDate();\n const nowStruct = now.toStruct();\n\n return [nowStruct.seconds, nowStruct.nanos];\n }\n\n reset() {\n // do nothing\n }\n}\n","const API_NAME = \"clock\";\n\nimport { getGlobal, registerGlobal } from \"../utils/globals\";\nimport type { Clock, ClockTime } from \"./clock\";\nimport { SimpleClock } from \"./simpleClock\";\n\nconst SIMPLE_CLOCK = new SimpleClock();\n\nexport class ClockAPI {\n private static _instance?: ClockAPI;\n\n private constructor() {}\n\n public static getInstance(): ClockAPI {\n if (!this._instance) {\n this._instance = new ClockAPI();\n }\n\n return this._instance;\n }\n\n public setGlobalClock(clock: Clock): boolean {\n return registerGlobal(API_NAME, clock);\n }\n\n public preciseNow(): ClockTime {\n return this.#getClock().preciseNow();\n }\n\n public reset(): void {\n this.#getClock().reset();\n }\n\n #getClock(): Clock {\n return getGlobal(API_NAME) ?? SIMPLE_CLOCK;\n }\n}\n","// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { ClockAPI } from \"./clock\";\n/** Entrypoint for clock API */\nexport const clock = ClockAPI.getInstance();\n","import { TimerOptions } from \"node:timers\";\nimport { setInterval, setTimeout } from \"node:timers/promises\";\n\nexport async function unboundedTimeout<T = void>(\n delay: number = 0,\n value?: T,\n options?: TimerOptions\n): Promise<T> {\n const maxDelay = 2147483647; // Highest value that will fit in a 32-bit signed integer\n\n const fullTimeouts = Math.floor(delay / maxDelay);\n const remainingDelay = delay % maxDelay;\n\n let lastTimeoutResult = await setTimeout(remainingDelay, value, options);\n\n for (let i = 0; i < fullTimeouts; i++) {\n lastTimeoutResult = await setTimeout(maxDelay, value, options);\n }\n\n return lastTimeoutResult;\n}\n\nexport async function checkpointSafeTimeout(delay: number = 0): Promise<void> {\n const scanIntervalMs = 1000;\n\n // Every scanIntervalMs, check if delay has elapsed\n for await (const start of setInterval(scanIntervalMs, Date.now())) {\n if (Date.now() - start > delay) {\n break;\n }\n }\n}\n","import { clock } from \"../clock-api\";\nimport { logger } from \"../logger-api\";\nimport {\n BatchTaskRunExecutionResult,\n ProdChildToWorkerMessages,\n ProdWorkerToChildMessages,\n TaskRunContext,\n TaskRunExecution,\n TaskRunExecutionResult,\n} from \"../schemas\";\nimport { checkpointSafeTimeout, unboundedTimeout } from \"../utils/timers\";\nimport { ZodIpcConnection } from \"../zodIpc\";\nimport { RuntimeManager } from \"./manager\";\n\nexport type ProdRuntimeManagerOptions = {\n waitThresholdInMs?: number;\n};\n\nexport class ProdRuntimeManager implements RuntimeManager {\n _taskWaits: Map<string, { resolve: (value: TaskRunExecutionResult) => void }> = new Map();\n\n _batchWaits: Map<\n string,\n { resolve: (value: BatchTaskRunExecutionResult) => void; reject: (err?: any) => void }\n > = new Map();\n\n _waitForDuration:\n | { resolve: (value: \"external\") => void; reject: (err?: any) => void }\n | undefined;\n\n constructor(\n private ipc: ZodIpcConnection<\n typeof ProdWorkerToChildMessages,\n typeof ProdChildToWorkerMessages\n >,\n private options: ProdRuntimeManagerOptions = {}\n ) {}\n\n disable(): void {\n // do nothing\n }\n\n async waitForDuration(ms: number): Promise<void> {\n const now = Date.now();\n\n const internalTimeout = unboundedTimeout(ms, \"internal\" as const);\n const checkpointSafeInternalTimeout = checkpointSafeTimeout(ms);\n\n if (ms <= this.waitThresholdInMs) {\n await internalTimeout;\n return;\n }\n\n const externalResume = new Promise<\"external\">((resolve, reject) => {\n this._waitForDuration = { resolve, reject };\n });\n\n const { willCheckpointAndRestore } = await this.ipc.sendWithAck(\"WAIT_FOR_DURATION\", {\n ms,\n now,\n });\n\n if (!willCheckpointAndRestore) {\n await internalTimeout;\n return;\n }\n\n this.ipc.send(\"READY_FOR_CHECKPOINT\", {});\n\n // internalTimeout acts as a backup and will be accurate if the checkpoint never happens\n // checkpointSafeInternalTimeout is accurate even after non-simulated restores\n await Promise.race([internalTimeout, checkpointSafeInternalTimeout]);\n\n // Resets the clock to the current time\n clock.reset();\n\n // The coordinator should cancel any in-progress checkpoints\n const { checkpointCanceled, version } = await this.ipc.sendWithAck(\"CANCEL_CHECKPOINT\", {\n version: \"v2\",\n reason: \"WAIT_FOR_DURATION\",\n });\n\n if (checkpointCanceled) {\n // There won't be a checkpoint or external resume and we've already completed our internal timeout\n return;\n }\n\n // No checkpoint was canceled, so we were checkpointed. We need to wait for the external resume message.\n await externalResume;\n }\n\n resumeAfterDuration(): void {\n if (!this._waitForDuration) {\n return;\n }\n\n process.stdout.write(\"pre\");\n process.stdout.write(JSON.stringify(clock.preciseNow()));\n\n console.log(\"pre\", clock.preciseNow());\n\n // Resets the clock to the current time\n clock.reset();\n\n console.log(\"post\", clock.preciseNow());\n\n process.stdout.write(\"post\");\n process.stdout.write(JSON.stringify(clock.preciseNow()));\n\n this._waitForDuration.resolve(\"external\");\n this._waitForDuration = undefined;\n }\n\n async waitUntil(date: Date): Promise<void> {\n return this.waitForDuration(date.getTime() - Date.now());\n }\n\n async waitForTask(params: { id: string; ctx: TaskRunContext }): Promise<TaskRunExecutionResult> {\n const promise = new Promise<TaskRunExecutionResult>((resolve) => {\n this._taskWaits.set(params.id, { resolve });\n });\n\n await this.ipc.send(\"WAIT_FOR_TASK\", {\n friendlyId: params.id,\n });\n\n const result = await promise;\n\n clock.reset();\n\n return result;\n }\n\n async waitForBatch(params: {\n id: string;\n runs: string[];\n ctx: TaskRunContext;\n }): Promise<BatchTaskRunExecutionResult> {\n if (!params.runs.length) {\n return Promise.resolve({ id: params.id, items: [] });\n }\n\n const promise = Promise.all(\n params.runs.map((runId) => {\n return new Promise<TaskRunExecutionResult>((resolve, reject) => {\n this._taskWaits.set(runId, { resolve });\n });\n })\n );\n\n await this.ipc.send(\"WAIT_FOR_BATCH\", {\n batchFriendlyId: params.id,\n runFriendlyIds: params.runs,\n });\n\n const results = await promise;\n\n clock.reset();\n\n return {\n id: params.id,\n items: results,\n };\n }\n\n resumeTask(completion: TaskRunExecutionResult, execution: TaskRunExecution): void {\n const wait = this._taskWaits.get(execution.run.id);\n\n if (!wait) {\n return;\n }\n\n wait.resolve(completion);\n\n this._taskWaits.delete(execution.run.id);\n }\n\n private get waitThresholdInMs(): number {\n return this.options.waitThresholdInMs ?? 30_000;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/v3/utils/platform.ts","../../../src/v3/utils/globals.ts","../../../src/v3/clock/simpleClock.ts","../../../src/v3/clock/index.ts","../../../src/v3/clock-api.ts","../../../src/v3/utils/timers.ts","../../../src/v3/runtime/prodRuntimeManager.ts"],"names":["_globalThis","globalThis","global","GLOBAL_TRIGGER_DOT_DEV_KEY","Symbol","for","_global","registerGlobal","type","instance","allowOverride","api","err","Error","getGlobal","PreciseDate","SimpleClock","preciseNow","now","nowStruct","toStruct","seconds","nanos","reset","API_NAME","SIMPLE_CLOCK","ClockAPI","getInstance","_instance","setGlobalClock","clock","setInterval","setTimeout","unboundedTimeout","delay","value","options","maxDelay","fullTimeouts","Math","floor","remainingDelay","lastTimeoutResult","i","checkpointSafeTimeout","scanIntervalMs","start","Date","ProdRuntimeManager","constructor","ipc","_taskWaits","Map","_batchWaits","disable","waitForDuration","ms","internalTimeout","checkpointSafeInternalTimeout","waitThresholdInMs","externalResume","Promise","resolve","reject","_waitForDuration","willCheckpointAndRestore","sendWithAck","send","race","checkpointCanceled","version","reason","resumeAfterDuration","process","stdout","write","JSON","stringify","console","log","undefined","waitUntil","date","getTime","waitForTask","params","promise","set","id","friendlyId","result","waitForBatch","runs","length","items","all","map","runId","batchFriendlyId","runFriendlyIds","results","resumeTask","completion","execution","wait","get","run","delete"],"mappings":";;;;;;;;;;;;;;;;;AAAO,IAAMA,cAAc,OAAOC,eAAe,WAAWA,aAAaC;;;ACOzE,IAAMC,6BAA6BC,OAAOC,IAAI,oBAAoB;AAElE,IAAMC,UAAUN;AAET,SAASO,eACdC,MACAC,UACAC,gBAAgB,OACP;AACT,QAAMC,MAAOL,QAAQH,0BAAAA,IAA8BG,QAAQH,0BAAAA,KAA+B,CAAC;AAE3F,MAAI,CAACO,iBAAiBC,IAAIH,IAAAA,GAAO;AAE/B,UAAMI,MAAM,IAAIC,MAAM,yDAAyDL,IAAAA,EAAM;AACrF,WAAO;EACT;AAEAG,MAAIH,IAAAA,IAAQC;AAEZ,SAAO;AACT;AAhBgBF;AAkBT,SAASO,UACdN,MAC0C;AAC1C,SAAOF,QAAQH,0BAAAA,IAA8BK,IAAAA;AAC/C;AAJgBM;;;AC7BhB,SAASC,mBAAmB;AAGrB,IAAMC,eAAN,MAAMA,aAAAA;EACXC,aAA+B;AAC7B,UAAMC,MAAM,IAAIH,YAAAA;AAChB,UAAMI,YAAYD,IAAIE,SAAQ;AAE9B,WAAO;MAACD,UAAUE;MAASF,UAAUG;;EACvC;EAEAC,QAAQ;EAER;AACF;AAXaP;AAAN,IAAMA,cAAN;;;ACHP,IAAMQ,WAAW;AAMjB,IAAMC,eAAe,IAAIT,YAAAA;AANzB;AAQO,IAAMU,YAAN,MAAMA,UAAAA;EAGX,cAAsB;AAsBtB;EAtBuB;EAEvB,OAAcC,cAAwB;AACpC,QAAI,CAAC,KAAKC,WAAW;AACnB,WAAKA,YAAY,IAAIF,UAAAA;IACvB;AAEA,WAAO,KAAKE;EACd;EAEOC,eAAeC,QAAuB;AAC3C,WAAOvB,eAAeiB,UAAUM,MAAAA;EAClC;EAEOb,aAAwB;AAC7B,WAAO,sBAAK,wBAAL,WAAiBA,WAAU;EACpC;EAEOM,QAAc;AACnB,0BAAK,wBAAL,WAAiBA,MAAK;EACxB;AAKF;AAHE;cAAS,kCAAU;AACjB,SAAOT,UAAUU,QAAAA,KAAaC;AAChC,GAFS;AAzBEC;AAAN,IAAMA,WAAN;;;ACJA,IAAMI,QAAQJ,SAASC,YAAW;;;ACHzC,SAASI,aAAaC,kBAAkB;AAExC,eAAsBC,iBACpBC,QAAgB,GAChBC,OACAC,SACY;AACZ,QAAMC,WAAW;AAEjB,QAAMC,eAAeC,KAAKC,MAAMN,QAAQG,QAAAA;AACxC,QAAMI,iBAAiBP,QAAQG;AAE/B,MAAIK,oBAAoB,MAAMV,WAAWS,gBAAgBN,OAAOC,OAAAA;AAEhE,WAASO,IAAI,GAAGA,IAAIL,cAAcK,KAAK;AACrCD,wBAAoB,MAAMV,WAAWK,UAAUF,OAAOC,OAAAA;EACxD;AAEA,SAAOM;AACT;AAjBsBT;AAmBtB,eAAsBW,sBAAsBV,QAAgB,GAAkB;AAC5E,QAAMW,iBAAiB;AAGvB,mBAAiBC,SAASf,YAAYc,gBAAgBE,KAAK7B,IAAG,CAAA,GAAK;AACjE,QAAI6B,KAAK7B,IAAG,IAAK4B,QAAQZ,OAAO;AAC9B;IACF;EACF;AACF;AATsBU;;;ACJf,IAAMI,sBAAN,MAAMA,oBAAAA;EAYXC,YACUC,KAIAd,UAAqC,CAAC,GAC9C;eALQc;mBAIAd;SAhBVe,aAAgF,oBAAIC,IAAAA;SAEpFC,cAGI,oBAAID,IAAAA;EAYL;EAEHE,UAAgB;EAEhB;EAEA,MAAMC,gBAAgBC,IAA2B;AAC/C,UAAMtC,MAAM6B,KAAK7B,IAAG;AAEpB,UAAMuC,kBAAkBxB,iBAAiBuB,IAAI,UAAA;AAC7C,UAAME,gCAAgCd,sBAAsBY,EAAAA;AAE5D,QAAIA,MAAM,KAAKG,mBAAmB;AAChC,YAAMF;AACN;IACF;AAEA,UAAMG,iBAAiB,IAAIC,QAAoB,CAACC,SAASC,WAAW;AAClE,WAAKC,mBAAmB;QAAEF;QAASC;MAAO;IAC5C,CAAA;AAEA,UAAM,EAAEE,yBAAwB,IAAK,MAAM,KAAKf,IAAIgB,YAAY,qBAAqB;MACnFV;MACAtC;IACF,CAAA;AAEA,QAAI,CAAC+C,0BAA0B;AAC7B,YAAMR;AACN;IACF;AAEA,SAAKP,IAAIiB,KAAK,wBAAwB,CAAC,CAAA;AAIvC,UAAMN,QAAQO,KAAK;MAACX;MAAiBC;KAA8B;AAGnE5B,UAAMP,MAAK;AAGX,UAAM,EAAE8C,oBAAoBC,QAAO,IAAK,MAAM,KAAKpB,IAAIgB,YACrD,qBACA;MACEI,SAAS;MACTC,QAAQ;IACV,GACA,IAAA;AAGF,QAAIF,oBAAoB;AAEtB;IACF;AAGA,UAAMT;EACR;EAEAY,sBAA4B;AAC1B,QAAI,CAAC,KAAKR,kBAAkB;AAC1B;IACF;AAEAS,YAAQC,OAAOC,MAAM,KAAA;AACrBF,YAAQC,OAAOC,MAAMC,KAAKC,UAAU/C,MAAMb,WAAU,CAAA,CAAA;AAEpD6D,YAAQC,IAAI,OAAOjD,MAAMb,WAAU,CAAA;AAGnCa,UAAMP,MAAK;AAEXuD,YAAQC,IAAI,QAAQjD,MAAMb,WAAU,CAAA;AAEpCwD,YAAQC,OAAOC,MAAM,MAAA;AACrBF,YAAQC,OAAOC,MAAMC,KAAKC,UAAU/C,MAAMb,WAAU,CAAA,CAAA;AAEpD,SAAK+C,iBAAiBF,QAAQ,UAAA;AAC9B,SAAKE,mBAAmBgB;EAC1B;EAEA,MAAMC,UAAUC,MAA2B;AACzC,WAAO,KAAK3B,gBAAgB2B,KAAKC,QAAO,IAAKpC,KAAK7B,IAAG,CAAA;EACvD;EAEA,MAAMkE,YAAYC,QAA8E;AAC9F,UAAMC,UAAU,IAAIzB,QAAgC,CAACC,YAAY;AAC/D,WAAKX,WAAWoC,IAAIF,OAAOG,IAAI;QAAE1B;MAAQ,CAAA;IAC3C,CAAA;AAEA,UAAM,KAAKZ,IAAIiB,KAAK,iBAAiB;MACnCsB,YAAYJ,OAAOG;IACrB,CAAA;AAEA,UAAME,SAAS,MAAMJ;AAErBxD,UAAMP,MAAK;AAEX,WAAOmE;EACT;EAEA,MAAMC,aAAaN,QAIsB;AACvC,QAAI,CAACA,OAAOO,KAAKC,QAAQ;AACvB,aAAOhC,QAAQC,QAAQ;QAAE0B,IAAIH,OAAOG;QAAIM,OAAO,CAAA;MAAG,CAAA;IACpD;AAEA,UAAMR,UAAUzB,QAAQkC,IACtBV,OAAOO,KAAKI,IAAI,CAACC,UAAU;AACzB,aAAO,IAAIpC,QAAgC,CAACC,SAASC,WAAW;AAC9D,aAAKZ,WAAWoC,IAAIU,OAAO;UAAEnC;QAAQ,CAAA;MACvC,CAAA;IACF,CAAA,CAAA;AAGF,UAAM,KAAKZ,IAAIiB,KAAK,kBAAkB;MACpC+B,iBAAiBb,OAAOG;MACxBW,gBAAgBd,OAAOO;IACzB,CAAA;AAEA,UAAMQ,UAAU,MAAMd;AAEtBxD,UAAMP,MAAK;AAEX,WAAO;MACLiE,IAAIH,OAAOG;MACXM,OAAOM;IACT;EACF;EAEAC,WAAWC,YAAoCC,WAAmC;AAChF,UAAMC,OAAO,KAAKrD,WAAWsD,IAAIF,UAAUG,IAAIlB,EAAE;AAEjD,QAAI,CAACgB,MAAM;AACT;IACF;AAEAA,SAAK1C,QAAQwC,UAAAA;AAEb,SAAKnD,WAAWwD,OAAOJ,UAAUG,IAAIlB,EAAE;EACzC;EAEA,IAAY7B,oBAA4B;AACtC,WAAO,KAAKvB,QAAQuB,qBAAqB;EAC3C;AACF;AAtKaX;AAAN,IAAMA,qBAAN","sourcesContent":["export const _globalThis = typeof globalThis === \"object\" ? globalThis : global;\n","import { ApiClientConfiguration } from \"../apiClientManager/types\";\nimport { Clock } from \"../clock/clock\";\nimport type { RuntimeManager } from \"../runtime/manager\";\nimport { TaskCatalog } from \"../task-catalog/catalog\";\nimport { TaskContext } from \"../taskContext/types\";\nimport { _globalThis } from \"./platform\";\n\nconst GLOBAL_TRIGGER_DOT_DEV_KEY = Symbol.for(`dev.trigger.ts.api`);\n\nconst _global = _globalThis as TriggerDotDevGlobal;\n\nexport function registerGlobal<Type extends keyof TriggerDotDevGlobalAPI>(\n type: Type,\n instance: TriggerDotDevGlobalAPI[Type],\n allowOverride = false\n): boolean {\n const api = (_global[GLOBAL_TRIGGER_DOT_DEV_KEY] = _global[GLOBAL_TRIGGER_DOT_DEV_KEY] ?? {});\n\n if (!allowOverride && api[type]) {\n // already registered an API of this type\n const err = new Error(`trigger.dev: Attempted duplicate registration of API: ${type}`);\n return false;\n }\n\n api[type] = instance;\n\n return true;\n}\n\nexport function getGlobal<Type extends keyof TriggerDotDevGlobalAPI>(\n type: Type\n): TriggerDotDevGlobalAPI[Type] | undefined {\n return _global[GLOBAL_TRIGGER_DOT_DEV_KEY]?.[type];\n}\n\nexport function unregisterGlobal(type: keyof TriggerDotDevGlobalAPI) {\n const api = _global[GLOBAL_TRIGGER_DOT_DEV_KEY];\n\n if (api) {\n delete api[type];\n }\n}\n\ntype TriggerDotDevGlobal = {\n [GLOBAL_TRIGGER_DOT_DEV_KEY]?: TriggerDotDevGlobalAPI;\n};\n\ntype TriggerDotDevGlobalAPI = {\n runtime?: RuntimeManager;\n logger?: any;\n clock?: Clock;\n [\"task-catalog\"]?: TaskCatalog;\n [\"task-context\"]?: TaskContext;\n [\"api-client\"]?: ApiClientConfiguration;\n};\n","import { PreciseDate } from \"@google-cloud/precise-date\";\nimport { Clock } from \"./clock\";\n\nexport class SimpleClock implements Clock {\n preciseNow(): [number, number] {\n const now = new PreciseDate();\n const nowStruct = now.toStruct();\n\n return [nowStruct.seconds, nowStruct.nanos];\n }\n\n reset() {\n // do nothing\n }\n}\n","const API_NAME = \"clock\";\n\nimport { getGlobal, registerGlobal } from \"../utils/globals\";\nimport type { Clock, ClockTime } from \"./clock\";\nimport { SimpleClock } from \"./simpleClock\";\n\nconst SIMPLE_CLOCK = new SimpleClock();\n\nexport class ClockAPI {\n private static _instance?: ClockAPI;\n\n private constructor() {}\n\n public static getInstance(): ClockAPI {\n if (!this._instance) {\n this._instance = new ClockAPI();\n }\n\n return this._instance;\n }\n\n public setGlobalClock(clock: Clock): boolean {\n return registerGlobal(API_NAME, clock);\n }\n\n public preciseNow(): ClockTime {\n return this.#getClock().preciseNow();\n }\n\n public reset(): void {\n this.#getClock().reset();\n }\n\n #getClock(): Clock {\n return getGlobal(API_NAME) ?? SIMPLE_CLOCK;\n }\n}\n","// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { ClockAPI } from \"./clock\";\n/** Entrypoint for clock API */\nexport const clock = ClockAPI.getInstance();\n","import { TimerOptions } from \"node:timers\";\nimport { setInterval, setTimeout } from \"node:timers/promises\";\n\nexport async function unboundedTimeout<T = void>(\n delay: number = 0,\n value?: T,\n options?: TimerOptions\n): Promise<T> {\n const maxDelay = 2147483647; // Highest value that will fit in a 32-bit signed integer\n\n const fullTimeouts = Math.floor(delay / maxDelay);\n const remainingDelay = delay % maxDelay;\n\n let lastTimeoutResult = await setTimeout(remainingDelay, value, options);\n\n for (let i = 0; i < fullTimeouts; i++) {\n lastTimeoutResult = await setTimeout(maxDelay, value, options);\n }\n\n return lastTimeoutResult;\n}\n\nexport async function checkpointSafeTimeout(delay: number = 0): Promise<void> {\n const scanIntervalMs = 1000;\n\n // Every scanIntervalMs, check if delay has elapsed\n for await (const start of setInterval(scanIntervalMs, Date.now())) {\n if (Date.now() - start > delay) {\n break;\n }\n }\n}\n","import { clock } from \"../clock-api\";\nimport { logger } from \"../logger-api\";\nimport {\n BatchTaskRunExecutionResult,\n ProdChildToWorkerMessages,\n ProdWorkerToChildMessages,\n TaskRunContext,\n TaskRunExecution,\n TaskRunExecutionResult,\n} from \"../schemas\";\nimport { checkpointSafeTimeout, unboundedTimeout } from \"../utils/timers\";\nimport { ZodIpcConnection } from \"../zodIpc\";\nimport { RuntimeManager } from \"./manager\";\n\nexport type ProdRuntimeManagerOptions = {\n waitThresholdInMs?: number;\n};\n\nexport class ProdRuntimeManager implements RuntimeManager {\n _taskWaits: Map<string, { resolve: (value: TaskRunExecutionResult) => void }> = new Map();\n\n _batchWaits: Map<\n string,\n { resolve: (value: BatchTaskRunExecutionResult) => void; reject: (err?: any) => void }\n > = new Map();\n\n _waitForDuration:\n | { resolve: (value: \"external\") => void; reject: (err?: any) => void }\n | undefined;\n\n constructor(\n private ipc: ZodIpcConnection<\n typeof ProdWorkerToChildMessages,\n typeof ProdChildToWorkerMessages\n >,\n private options: ProdRuntimeManagerOptions = {}\n ) {}\n\n disable(): void {\n // do nothing\n }\n\n async waitForDuration(ms: number): Promise<void> {\n const now = Date.now();\n\n const internalTimeout = unboundedTimeout(ms, \"internal\" as const);\n const checkpointSafeInternalTimeout = checkpointSafeTimeout(ms);\n\n if (ms <= this.waitThresholdInMs) {\n await internalTimeout;\n return;\n }\n\n const externalResume = new Promise<\"external\">((resolve, reject) => {\n this._waitForDuration = { resolve, reject };\n });\n\n const { willCheckpointAndRestore } = await this.ipc.sendWithAck(\"WAIT_FOR_DURATION\", {\n ms,\n now,\n });\n\n if (!willCheckpointAndRestore) {\n await internalTimeout;\n return;\n }\n\n this.ipc.send(\"READY_FOR_CHECKPOINT\", {});\n\n // internalTimeout acts as a backup and will be accurate if the checkpoint never happens\n // checkpointSafeInternalTimeout is accurate even after non-simulated restores\n await Promise.race([internalTimeout, checkpointSafeInternalTimeout]);\n\n // Resets the clock to the current time\n clock.reset();\n\n // The coordinator should cancel any in-progress checkpoints\n const { checkpointCanceled, version } = await this.ipc.sendWithAck(\n \"CANCEL_CHECKPOINT\",\n {\n version: \"v2\",\n reason: \"WAIT_FOR_DURATION\",\n },\n 31_000\n );\n\n if (checkpointCanceled) {\n // There won't be a checkpoint or external resume and we've already completed our internal timeout\n return;\n }\n\n // No checkpoint was canceled, so we were checkpointed. We need to wait for the external resume message.\n await externalResume;\n }\n\n resumeAfterDuration(): void {\n if (!this._waitForDuration) {\n return;\n }\n\n process.stdout.write(\"pre\");\n process.stdout.write(JSON.stringify(clock.preciseNow()));\n\n console.log(\"pre\", clock.preciseNow());\n\n // Resets the clock to the current time\n clock.reset();\n\n console.log(\"post\", clock.preciseNow());\n\n process.stdout.write(\"post\");\n process.stdout.write(JSON.stringify(clock.preciseNow()));\n\n this._waitForDuration.resolve(\"external\");\n this._waitForDuration = undefined;\n }\n\n async waitUntil(date: Date): Promise<void> {\n return this.waitForDuration(date.getTime() - Date.now());\n }\n\n async waitForTask(params: { id: string; ctx: TaskRunContext }): Promise<TaskRunExecutionResult> {\n const promise = new Promise<TaskRunExecutionResult>((resolve) => {\n this._taskWaits.set(params.id, { resolve });\n });\n\n await this.ipc.send(\"WAIT_FOR_TASK\", {\n friendlyId: params.id,\n });\n\n const result = await promise;\n\n clock.reset();\n\n return result;\n }\n\n async waitForBatch(params: {\n id: string;\n runs: string[];\n ctx: TaskRunContext;\n }): Promise<BatchTaskRunExecutionResult> {\n if (!params.runs.length) {\n return Promise.resolve({ id: params.id, items: [] });\n }\n\n const promise = Promise.all(\n params.runs.map((runId) => {\n return new Promise<TaskRunExecutionResult>((resolve, reject) => {\n this._taskWaits.set(runId, { resolve });\n });\n })\n );\n\n await this.ipc.send(\"WAIT_FOR_BATCH\", {\n batchFriendlyId: params.id,\n runFriendlyIds: params.runs,\n });\n\n const results = await promise;\n\n clock.reset();\n\n return {\n id: params.id,\n items: results,\n };\n }\n\n resumeTask(completion: TaskRunExecutionResult, execution: TaskRunExecution): void {\n const wait = this._taskWaits.get(execution.run.id);\n\n if (!wait) {\n return;\n }\n\n wait.resolve(completion);\n\n this._taskWaits.delete(execution.run.id);\n }\n\n private get waitThresholdInMs(): number {\n return this.options.waitThresholdInMs ?? 30_000;\n }\n}\n"]}
|
package/dist/v3/prod/index.mjs
CHANGED
|
@@ -146,7 +146,7 @@ var _ProdRuntimeManager = class _ProdRuntimeManager {
|
|
|
146
146
|
const { checkpointCanceled, version } = await this.ipc.sendWithAck("CANCEL_CHECKPOINT", {
|
|
147
147
|
version: "v2",
|
|
148
148
|
reason: "WAIT_FOR_DURATION"
|
|
149
|
-
});
|
|
149
|
+
}, 31e3);
|
|
150
150
|
if (checkpointCanceled) {
|
|
151
151
|
return;
|
|
152
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/v3/utils/platform.ts","../../../src/v3/utils/globals.ts","../../../src/v3/clock/simpleClock.ts","../../../src/v3/clock/index.ts","../../../src/v3/clock-api.ts","../../../src/v3/utils/timers.ts","../../../src/v3/runtime/prodRuntimeManager.ts"],"names":["_globalThis","globalThis","global","GLOBAL_TRIGGER_DOT_DEV_KEY","Symbol","for","_global","registerGlobal","type","instance","allowOverride","api","err","Error","getGlobal","PreciseDate","SimpleClock","preciseNow","now","nowStruct","toStruct","seconds","nanos","reset","API_NAME","SIMPLE_CLOCK","ClockAPI","getInstance","_instance","setGlobalClock","clock","setInterval","setTimeout","unboundedTimeout","delay","value","options","maxDelay","fullTimeouts","Math","floor","remainingDelay","lastTimeoutResult","i","checkpointSafeTimeout","scanIntervalMs","start","Date","ProdRuntimeManager","constructor","ipc","_taskWaits","Map","_batchWaits","disable","waitForDuration","ms","internalTimeout","checkpointSafeInternalTimeout","waitThresholdInMs","externalResume","Promise","resolve","reject","_waitForDuration","willCheckpointAndRestore","sendWithAck","send","race","checkpointCanceled","version","reason","resumeAfterDuration","process","stdout","write","JSON","stringify","console","log","undefined","waitUntil","date","getTime","waitForTask","params","promise","set","id","friendlyId","result","waitForBatch","runs","length","items","all","map","runId","batchFriendlyId","runFriendlyIds","results","resumeTask","completion","execution","wait","get","run","delete"],"mappings":"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","sourcesContent":["export const _globalThis = typeof globalThis === \"object\" ? globalThis : global;\n","import { ApiClientConfiguration } from \"../apiClientManager/types\";\nimport { Clock } from \"../clock/clock\";\nimport type { RuntimeManager } from \"../runtime/manager\";\nimport { TaskCatalog } from \"../task-catalog/catalog\";\nimport { TaskContext } from \"../taskContext/types\";\nimport { _globalThis } from \"./platform\";\n\nconst GLOBAL_TRIGGER_DOT_DEV_KEY = Symbol.for(`dev.trigger.ts.api`);\n\nconst _global = _globalThis as TriggerDotDevGlobal;\n\nexport function registerGlobal<Type extends keyof TriggerDotDevGlobalAPI>(\n type: Type,\n instance: TriggerDotDevGlobalAPI[Type],\n allowOverride = false\n): boolean {\n const api = (_global[GLOBAL_TRIGGER_DOT_DEV_KEY] = _global[GLOBAL_TRIGGER_DOT_DEV_KEY] ?? {});\n\n if (!allowOverride && api[type]) {\n // already registered an API of this type\n const err = new Error(`trigger.dev: Attempted duplicate registration of API: ${type}`);\n return false;\n }\n\n api[type] = instance;\n\n return true;\n}\n\nexport function getGlobal<Type extends keyof TriggerDotDevGlobalAPI>(\n type: Type\n): TriggerDotDevGlobalAPI[Type] | undefined {\n return _global[GLOBAL_TRIGGER_DOT_DEV_KEY]?.[type];\n}\n\nexport function unregisterGlobal(type: keyof TriggerDotDevGlobalAPI) {\n const api = _global[GLOBAL_TRIGGER_DOT_DEV_KEY];\n\n if (api) {\n delete api[type];\n }\n}\n\ntype TriggerDotDevGlobal = {\n [GLOBAL_TRIGGER_DOT_DEV_KEY]?: TriggerDotDevGlobalAPI;\n};\n\ntype TriggerDotDevGlobalAPI = {\n runtime?: RuntimeManager;\n logger?: any;\n clock?: Clock;\n [\"task-catalog\"]?: TaskCatalog;\n [\"task-context\"]?: TaskContext;\n [\"api-client\"]?: ApiClientConfiguration;\n};\n","import { PreciseDate } from \"@google-cloud/precise-date\";\nimport { Clock } from \"./clock\";\n\nexport class SimpleClock implements Clock {\n preciseNow(): [number, number] {\n const now = new PreciseDate();\n const nowStruct = now.toStruct();\n\n return [nowStruct.seconds, nowStruct.nanos];\n }\n\n reset() {\n // do nothing\n }\n}\n","const API_NAME = \"clock\";\n\nimport { getGlobal, registerGlobal } from \"../utils/globals\";\nimport type { Clock, ClockTime } from \"./clock\";\nimport { SimpleClock } from \"./simpleClock\";\n\nconst SIMPLE_CLOCK = new SimpleClock();\n\nexport class ClockAPI {\n private static _instance?: ClockAPI;\n\n private constructor() {}\n\n public static getInstance(): ClockAPI {\n if (!this._instance) {\n this._instance = new ClockAPI();\n }\n\n return this._instance;\n }\n\n public setGlobalClock(clock: Clock): boolean {\n return registerGlobal(API_NAME, clock);\n }\n\n public preciseNow(): ClockTime {\n return this.#getClock().preciseNow();\n }\n\n public reset(): void {\n this.#getClock().reset();\n }\n\n #getClock(): Clock {\n return getGlobal(API_NAME) ?? SIMPLE_CLOCK;\n }\n}\n","// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { ClockAPI } from \"./clock\";\n/** Entrypoint for clock API */\nexport const clock = ClockAPI.getInstance();\n","import { TimerOptions } from \"node:timers\";\nimport { setInterval, setTimeout } from \"node:timers/promises\";\n\nexport async function unboundedTimeout<T = void>(\n delay: number = 0,\n value?: T,\n options?: TimerOptions\n): Promise<T> {\n const maxDelay = 2147483647; // Highest value that will fit in a 32-bit signed integer\n\n const fullTimeouts = Math.floor(delay / maxDelay);\n const remainingDelay = delay % maxDelay;\n\n let lastTimeoutResult = await setTimeout(remainingDelay, value, options);\n\n for (let i = 0; i < fullTimeouts; i++) {\n lastTimeoutResult = await setTimeout(maxDelay, value, options);\n }\n\n return lastTimeoutResult;\n}\n\nexport async function checkpointSafeTimeout(delay: number = 0): Promise<void> {\n const scanIntervalMs = 1000;\n\n // Every scanIntervalMs, check if delay has elapsed\n for await (const start of setInterval(scanIntervalMs, Date.now())) {\n if (Date.now() - start > delay) {\n break;\n }\n }\n}\n","import { clock } from \"../clock-api\";\nimport { logger } from \"../logger-api\";\nimport {\n BatchTaskRunExecutionResult,\n ProdChildToWorkerMessages,\n ProdWorkerToChildMessages,\n TaskRunContext,\n TaskRunExecution,\n TaskRunExecutionResult,\n} from \"../schemas\";\nimport { checkpointSafeTimeout, unboundedTimeout } from \"../utils/timers\";\nimport { ZodIpcConnection } from \"../zodIpc\";\nimport { RuntimeManager } from \"./manager\";\n\nexport type ProdRuntimeManagerOptions = {\n waitThresholdInMs?: number;\n};\n\nexport class ProdRuntimeManager implements RuntimeManager {\n _taskWaits: Map<string, { resolve: (value: TaskRunExecutionResult) => void }> = new Map();\n\n _batchWaits: Map<\n string,\n { resolve: (value: BatchTaskRunExecutionResult) => void; reject: (err?: any) => void }\n > = new Map();\n\n _waitForDuration:\n | { resolve: (value: \"external\") => void; reject: (err?: any) => void }\n | undefined;\n\n constructor(\n private ipc: ZodIpcConnection<\n typeof ProdWorkerToChildMessages,\n typeof ProdChildToWorkerMessages\n >,\n private options: ProdRuntimeManagerOptions = {}\n ) {}\n\n disable(): void {\n // do nothing\n }\n\n async waitForDuration(ms: number): Promise<void> {\n const now = Date.now();\n\n const internalTimeout = unboundedTimeout(ms, \"internal\" as const);\n const checkpointSafeInternalTimeout = checkpointSafeTimeout(ms);\n\n if (ms <= this.waitThresholdInMs) {\n await internalTimeout;\n return;\n }\n\n const externalResume = new Promise<\"external\">((resolve, reject) => {\n this._waitForDuration = { resolve, reject };\n });\n\n const { willCheckpointAndRestore } = await this.ipc.sendWithAck(\"WAIT_FOR_DURATION\", {\n ms,\n now,\n });\n\n if (!willCheckpointAndRestore) {\n await internalTimeout;\n return;\n }\n\n this.ipc.send(\"READY_FOR_CHECKPOINT\", {});\n\n // internalTimeout acts as a backup and will be accurate if the checkpoint never happens\n // checkpointSafeInternalTimeout is accurate even after non-simulated restores\n await Promise.race([internalTimeout, checkpointSafeInternalTimeout]);\n\n // Resets the clock to the current time\n clock.reset();\n\n // The coordinator should cancel any in-progress checkpoints\n const { checkpointCanceled, version } = await this.ipc.sendWithAck(\"CANCEL_CHECKPOINT\", {\n version: \"v2\",\n reason: \"WAIT_FOR_DURATION\",\n });\n\n if (checkpointCanceled) {\n // There won't be a checkpoint or external resume and we've already completed our internal timeout\n return;\n }\n\n // No checkpoint was canceled, so we were checkpointed. We need to wait for the external resume message.\n await externalResume;\n }\n\n resumeAfterDuration(): void {\n if (!this._waitForDuration) {\n return;\n }\n\n process.stdout.write(\"pre\");\n process.stdout.write(JSON.stringify(clock.preciseNow()));\n\n console.log(\"pre\", clock.preciseNow());\n\n // Resets the clock to the current time\n clock.reset();\n\n console.log(\"post\", clock.preciseNow());\n\n process.stdout.write(\"post\");\n process.stdout.write(JSON.stringify(clock.preciseNow()));\n\n this._waitForDuration.resolve(\"external\");\n this._waitForDuration = undefined;\n }\n\n async waitUntil(date: Date): Promise<void> {\n return this.waitForDuration(date.getTime() - Date.now());\n }\n\n async waitForTask(params: { id: string; ctx: TaskRunContext }): Promise<TaskRunExecutionResult> {\n const promise = new Promise<TaskRunExecutionResult>((resolve) => {\n this._taskWaits.set(params.id, { resolve });\n });\n\n await this.ipc.send(\"WAIT_FOR_TASK\", {\n friendlyId: params.id,\n });\n\n const result = await promise;\n\n clock.reset();\n\n return result;\n }\n\n async waitForBatch(params: {\n id: string;\n runs: string[];\n ctx: TaskRunContext;\n }): Promise<BatchTaskRunExecutionResult> {\n if (!params.runs.length) {\n return Promise.resolve({ id: params.id, items: [] });\n }\n\n const promise = Promise.all(\n params.runs.map((runId) => {\n return new Promise<TaskRunExecutionResult>((resolve, reject) => {\n this._taskWaits.set(runId, { resolve });\n });\n })\n );\n\n await this.ipc.send(\"WAIT_FOR_BATCH\", {\n batchFriendlyId: params.id,\n runFriendlyIds: params.runs,\n });\n\n const results = await promise;\n\n clock.reset();\n\n return {\n id: params.id,\n items: results,\n };\n }\n\n resumeTask(completion: TaskRunExecutionResult, execution: TaskRunExecution): void {\n const wait = this._taskWaits.get(execution.run.id);\n\n if (!wait) {\n return;\n }\n\n wait.resolve(completion);\n\n this._taskWaits.delete(execution.run.id);\n }\n\n private get waitThresholdInMs(): number {\n return this.options.waitThresholdInMs ?? 30_000;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/v3/utils/platform.ts","../../../src/v3/utils/globals.ts","../../../src/v3/clock/simpleClock.ts","../../../src/v3/clock/index.ts","../../../src/v3/clock-api.ts","../../../src/v3/utils/timers.ts","../../../src/v3/runtime/prodRuntimeManager.ts"],"names":["_globalThis","globalThis","global","GLOBAL_TRIGGER_DOT_DEV_KEY","Symbol","for","_global","registerGlobal","type","instance","allowOverride","api","err","Error","getGlobal","PreciseDate","SimpleClock","preciseNow","now","nowStruct","toStruct","seconds","nanos","reset","API_NAME","SIMPLE_CLOCK","ClockAPI","getInstance","_instance","setGlobalClock","clock","setInterval","setTimeout","unboundedTimeout","delay","value","options","maxDelay","fullTimeouts","Math","floor","remainingDelay","lastTimeoutResult","i","checkpointSafeTimeout","scanIntervalMs","start","Date","ProdRuntimeManager","constructor","ipc","_taskWaits","Map","_batchWaits","disable","waitForDuration","ms","internalTimeout","checkpointSafeInternalTimeout","waitThresholdInMs","externalResume","Promise","resolve","reject","_waitForDuration","willCheckpointAndRestore","sendWithAck","send","race","checkpointCanceled","version","reason","resumeAfterDuration","process","stdout","write","JSON","stringify","console","log","undefined","waitUntil","date","getTime","waitForTask","params","promise","set","id","friendlyId","result","waitForBatch","runs","length","items","all","map","runId","batchFriendlyId","runFriendlyIds","results","resumeTask","completion","execution","wait","get","run","delete"],"mappings":"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","sourcesContent":["export const _globalThis = typeof globalThis === \"object\" ? globalThis : global;\n","import { ApiClientConfiguration } from \"../apiClientManager/types\";\nimport { Clock } from \"../clock/clock\";\nimport type { RuntimeManager } from \"../runtime/manager\";\nimport { TaskCatalog } from \"../task-catalog/catalog\";\nimport { TaskContext } from \"../taskContext/types\";\nimport { _globalThis } from \"./platform\";\n\nconst GLOBAL_TRIGGER_DOT_DEV_KEY = Symbol.for(`dev.trigger.ts.api`);\n\nconst _global = _globalThis as TriggerDotDevGlobal;\n\nexport function registerGlobal<Type extends keyof TriggerDotDevGlobalAPI>(\n type: Type,\n instance: TriggerDotDevGlobalAPI[Type],\n allowOverride = false\n): boolean {\n const api = (_global[GLOBAL_TRIGGER_DOT_DEV_KEY] = _global[GLOBAL_TRIGGER_DOT_DEV_KEY] ?? {});\n\n if (!allowOverride && api[type]) {\n // already registered an API of this type\n const err = new Error(`trigger.dev: Attempted duplicate registration of API: ${type}`);\n return false;\n }\n\n api[type] = instance;\n\n return true;\n}\n\nexport function getGlobal<Type extends keyof TriggerDotDevGlobalAPI>(\n type: Type\n): TriggerDotDevGlobalAPI[Type] | undefined {\n return _global[GLOBAL_TRIGGER_DOT_DEV_KEY]?.[type];\n}\n\nexport function unregisterGlobal(type: keyof TriggerDotDevGlobalAPI) {\n const api = _global[GLOBAL_TRIGGER_DOT_DEV_KEY];\n\n if (api) {\n delete api[type];\n }\n}\n\ntype TriggerDotDevGlobal = {\n [GLOBAL_TRIGGER_DOT_DEV_KEY]?: TriggerDotDevGlobalAPI;\n};\n\ntype TriggerDotDevGlobalAPI = {\n runtime?: RuntimeManager;\n logger?: any;\n clock?: Clock;\n [\"task-catalog\"]?: TaskCatalog;\n [\"task-context\"]?: TaskContext;\n [\"api-client\"]?: ApiClientConfiguration;\n};\n","import { PreciseDate } from \"@google-cloud/precise-date\";\nimport { Clock } from \"./clock\";\n\nexport class SimpleClock implements Clock {\n preciseNow(): [number, number] {\n const now = new PreciseDate();\n const nowStruct = now.toStruct();\n\n return [nowStruct.seconds, nowStruct.nanos];\n }\n\n reset() {\n // do nothing\n }\n}\n","const API_NAME = \"clock\";\n\nimport { getGlobal, registerGlobal } from \"../utils/globals\";\nimport type { Clock, ClockTime } from \"./clock\";\nimport { SimpleClock } from \"./simpleClock\";\n\nconst SIMPLE_CLOCK = new SimpleClock();\n\nexport class ClockAPI {\n private static _instance?: ClockAPI;\n\n private constructor() {}\n\n public static getInstance(): ClockAPI {\n if (!this._instance) {\n this._instance = new ClockAPI();\n }\n\n return this._instance;\n }\n\n public setGlobalClock(clock: Clock): boolean {\n return registerGlobal(API_NAME, clock);\n }\n\n public preciseNow(): ClockTime {\n return this.#getClock().preciseNow();\n }\n\n public reset(): void {\n this.#getClock().reset();\n }\n\n #getClock(): Clock {\n return getGlobal(API_NAME) ?? SIMPLE_CLOCK;\n }\n}\n","// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { ClockAPI } from \"./clock\";\n/** Entrypoint for clock API */\nexport const clock = ClockAPI.getInstance();\n","import { TimerOptions } from \"node:timers\";\nimport { setInterval, setTimeout } from \"node:timers/promises\";\n\nexport async function unboundedTimeout<T = void>(\n delay: number = 0,\n value?: T,\n options?: TimerOptions\n): Promise<T> {\n const maxDelay = 2147483647; // Highest value that will fit in a 32-bit signed integer\n\n const fullTimeouts = Math.floor(delay / maxDelay);\n const remainingDelay = delay % maxDelay;\n\n let lastTimeoutResult = await setTimeout(remainingDelay, value, options);\n\n for (let i = 0; i < fullTimeouts; i++) {\n lastTimeoutResult = await setTimeout(maxDelay, value, options);\n }\n\n return lastTimeoutResult;\n}\n\nexport async function checkpointSafeTimeout(delay: number = 0): Promise<void> {\n const scanIntervalMs = 1000;\n\n // Every scanIntervalMs, check if delay has elapsed\n for await (const start of setInterval(scanIntervalMs, Date.now())) {\n if (Date.now() - start > delay) {\n break;\n }\n }\n}\n","import { clock } from \"../clock-api\";\nimport { logger } from \"../logger-api\";\nimport {\n BatchTaskRunExecutionResult,\n ProdChildToWorkerMessages,\n ProdWorkerToChildMessages,\n TaskRunContext,\n TaskRunExecution,\n TaskRunExecutionResult,\n} from \"../schemas\";\nimport { checkpointSafeTimeout, unboundedTimeout } from \"../utils/timers\";\nimport { ZodIpcConnection } from \"../zodIpc\";\nimport { RuntimeManager } from \"./manager\";\n\nexport type ProdRuntimeManagerOptions = {\n waitThresholdInMs?: number;\n};\n\nexport class ProdRuntimeManager implements RuntimeManager {\n _taskWaits: Map<string, { resolve: (value: TaskRunExecutionResult) => void }> = new Map();\n\n _batchWaits: Map<\n string,\n { resolve: (value: BatchTaskRunExecutionResult) => void; reject: (err?: any) => void }\n > = new Map();\n\n _waitForDuration:\n | { resolve: (value: \"external\") => void; reject: (err?: any) => void }\n | undefined;\n\n constructor(\n private ipc: ZodIpcConnection<\n typeof ProdWorkerToChildMessages,\n typeof ProdChildToWorkerMessages\n >,\n private options: ProdRuntimeManagerOptions = {}\n ) {}\n\n disable(): void {\n // do nothing\n }\n\n async waitForDuration(ms: number): Promise<void> {\n const now = Date.now();\n\n const internalTimeout = unboundedTimeout(ms, \"internal\" as const);\n const checkpointSafeInternalTimeout = checkpointSafeTimeout(ms);\n\n if (ms <= this.waitThresholdInMs) {\n await internalTimeout;\n return;\n }\n\n const externalResume = new Promise<\"external\">((resolve, reject) => {\n this._waitForDuration = { resolve, reject };\n });\n\n const { willCheckpointAndRestore } = await this.ipc.sendWithAck(\"WAIT_FOR_DURATION\", {\n ms,\n now,\n });\n\n if (!willCheckpointAndRestore) {\n await internalTimeout;\n return;\n }\n\n this.ipc.send(\"READY_FOR_CHECKPOINT\", {});\n\n // internalTimeout acts as a backup and will be accurate if the checkpoint never happens\n // checkpointSafeInternalTimeout is accurate even after non-simulated restores\n await Promise.race([internalTimeout, checkpointSafeInternalTimeout]);\n\n // Resets the clock to the current time\n clock.reset();\n\n // The coordinator should cancel any in-progress checkpoints\n const { checkpointCanceled, version } = await this.ipc.sendWithAck(\n \"CANCEL_CHECKPOINT\",\n {\n version: \"v2\",\n reason: \"WAIT_FOR_DURATION\",\n },\n 31_000\n );\n\n if (checkpointCanceled) {\n // There won't be a checkpoint or external resume and we've already completed our internal timeout\n return;\n }\n\n // No checkpoint was canceled, so we were checkpointed. We need to wait for the external resume message.\n await externalResume;\n }\n\n resumeAfterDuration(): void {\n if (!this._waitForDuration) {\n return;\n }\n\n process.stdout.write(\"pre\");\n process.stdout.write(JSON.stringify(clock.preciseNow()));\n\n console.log(\"pre\", clock.preciseNow());\n\n // Resets the clock to the current time\n clock.reset();\n\n console.log(\"post\", clock.preciseNow());\n\n process.stdout.write(\"post\");\n process.stdout.write(JSON.stringify(clock.preciseNow()));\n\n this._waitForDuration.resolve(\"external\");\n this._waitForDuration = undefined;\n }\n\n async waitUntil(date: Date): Promise<void> {\n return this.waitForDuration(date.getTime() - Date.now());\n }\n\n async waitForTask(params: { id: string; ctx: TaskRunContext }): Promise<TaskRunExecutionResult> {\n const promise = new Promise<TaskRunExecutionResult>((resolve) => {\n this._taskWaits.set(params.id, { resolve });\n });\n\n await this.ipc.send(\"WAIT_FOR_TASK\", {\n friendlyId: params.id,\n });\n\n const result = await promise;\n\n clock.reset();\n\n return result;\n }\n\n async waitForBatch(params: {\n id: string;\n runs: string[];\n ctx: TaskRunContext;\n }): Promise<BatchTaskRunExecutionResult> {\n if (!params.runs.length) {\n return Promise.resolve({ id: params.id, items: [] });\n }\n\n const promise = Promise.all(\n params.runs.map((runId) => {\n return new Promise<TaskRunExecutionResult>((resolve, reject) => {\n this._taskWaits.set(runId, { resolve });\n });\n })\n );\n\n await this.ipc.send(\"WAIT_FOR_BATCH\", {\n batchFriendlyId: params.id,\n runFriendlyIds: params.runs,\n });\n\n const results = await promise;\n\n clock.reset();\n\n return {\n id: params.id,\n items: results,\n };\n }\n\n resumeTask(completion: TaskRunExecutionResult, execution: TaskRunExecution): void {\n const wait = this._taskWaits.get(execution.run.id);\n\n if (!wait) {\n return;\n }\n\n wait.resolve(completion);\n\n this._taskWaits.delete(execution.run.id);\n }\n\n private get waitThresholdInMs(): number {\n return this.options.waitThresholdInMs ?? 30_000;\n }\n}\n"]}
|
package/dist/v3/workers/index.js
CHANGED
|
@@ -941,7 +941,8 @@ zod.z.object({
|
|
|
941
941
|
variables: zod.z.record(zod.z.string())
|
|
942
942
|
});
|
|
943
943
|
zod.z.object({
|
|
944
|
-
imageReference: zod.z.string()
|
|
944
|
+
imageReference: zod.z.string(),
|
|
945
|
+
selfHosted: zod.z.boolean().optional()
|
|
945
946
|
});
|
|
946
947
|
zod.z.object({
|
|
947
948
|
id: zod.z.string(),
|