UNPKG

workflow

Version:

Workflow SDK - Build durable, resilient, and observable workflows

82 lines • 12.6 kB
/** * Built-in steps available in the workflow scope. Like a standard library, * they are available alongside user-defined steps, but users do not import * them. The runtime uses these steps internally. */ export async function __builtin_response_array_buffer() { 'use step'; return this.arrayBuffer(); } export async function __builtin_response_json() { 'use step'; return this.json(); } export async function __builtin_response_text() { 'use step'; return this.text(); } /** * Process-wide dedupe for the unsupported-world warning so high-volume * callers don't flood logs. */ const UNSUPPORTED_WORLD_WARNED = Symbol.for('@workflow/setAttributes//unsupportedWorldWarned'); const INTERNAL_ATTRIBUTES_MAX_ATTEMPTS = 3; function formatUnknownError(error) { if (error instanceof Error) { return error.stack ?? `${error.name}: ${error.message}`; } return String(error); } /** * Step bridge for workflow-body `setAttributes` calls. The VM-side * helper validates input and dispatches here via `useStep`. This step * runs in normal Node context with full world access. * * The dispatch reads the world and current run id directly from * `globalThis` symbols populated by the workflow/step runtime. This * intentionally avoids importing `@workflow/core` so the Next.js * deferred-entries discoverer can't walk a chain into world adapters * and `@vercel/queue` from this step file. */ export async function __builtin_set_attributes(changes, options) { 'use step'; if (changes.length === 0) return; const g = globalThis; const contextStorage = g[Symbol.for('WORKFLOW_STEP_CONTEXT_STORAGE')]; const store = contextStorage?.getStore?.(); const attempt = typeof store?.stepMetadata?.attempt === 'number' ? store.stepMetadata.attempt : INTERNAL_ATTRIBUTES_MAX_ATTEMPTS; const world = g[Symbol.for('@workflow/world//cache')]; if (typeof world?.runs?.experimentalSetAttributes !== 'function') { // World adapter doesn't implement attributes yet, so no-op the call, // but emit one process-wide warning so users know their writes are // being dropped. The VM-side validation already ran so the input // is well-formed. if (!g[UNSUPPORTED_WORLD_WARNED]) { g[UNSUPPORTED_WORLD_WARNED] = true; const worldName = world?.name ? ` (${world.name})` : ''; console.warn(`[workflow] setAttributes: the current world implementation${worldName} does not implement experimentalSetAttributes; this call (and any subsequent setAttributes calls in this process) is a no-op. Attributes will become available once the world adapter adds support.`); } return; } try { const runId = store?.workflowMetadata?.workflowRunId; if (!runId) { throw new Error('__builtin_set_attributes: no workflow run id available in step context'); } await world.runs.experimentalSetAttributes(runId, changes, options); } catch (error) { if (attempt < INTERNAL_ATTRIBUTES_MAX_ATTEMPTS) { throw error; } // Failing to post tags should not fail a run during the experimental phase. // After three attempts, log and let the internal step complete so the // runtime does not convert retry exhaustion into a FatalError. console.error(`[workflow] setAttributes: failed to post tags after ${INTERNAL_ATTRIBUTES_MAX_ATTEMPTS} attempts; dropping the internal attribute write. ${formatUnknownError(error)}`); } } __builtin_set_attributes.maxRetries = INTERNAL_ATTRIBUTES_MAX_ATTEMPTS - 1; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbHRpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJuYWwvYnVpbHRpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE1BQU0sQ0FBQyxLQUFLLFVBQVUsK0JBQStCO0lBR25ELFVBQVUsQ0FBQztJQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QjtJQUMzQyxVQUFVLENBQUM7SUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNyQixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUI7SUFDM0MsVUFBVSxDQUFDO0lBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FDekMsaURBQWlELENBQ2xELENBQUM7QUFFRixNQUFNLGdDQUFnQyxHQUFHLENBQUMsQ0FBQztBQUUzQyxTQUFTLGtCQUFrQixDQUFDLEtBQWM7SUFDeEMsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUMsS0FBSyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FDNUMsT0FBcUQsRUFDckQsT0FBK0M7SUFFL0MsVUFBVSxDQUFDO0lBQ1gsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPO0lBQ2pDLE1BQU0sQ0FBQyxHQUFHLFVBQXFDLENBQUM7SUFFaEQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FTdkQsQ0FBQztJQUNkLE1BQU0sS0FBSyxHQUFHLGNBQWMsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDO0lBQzNDLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEtBQUssUUFBUTtRQUM5QyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPO1FBQzVCLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQztJQUV2QyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQVd2QyxDQUFDO0lBQ2QsSUFBSSxPQUFPLEtBQUssRUFBRSxJQUFJLEVBQUUseUJBQXlCLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDakUscUVBQXFFO1FBQ3JFLG1FQUFtRTtRQUNuRSxpRUFBaUU7UUFDakUsa0JBQWtCO1FBQ2xCLElBQUksQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDO1lBQ2pDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNuQyxNQUFNLFNBQVMsR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hELE9BQU8sQ0FBQyxJQUFJLENBQ1YsNkRBQTZELFNBQVMscU1BQXFNLENBQzVRLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDO1FBQ3JELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQ2Isd0VBQXdFLENBQ3pFLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLE9BQU8sR0FBRyxnQ0FBZ0MsRUFBRSxDQUFDO1lBQy9DLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxzRUFBc0U7UUFDdEUsK0RBQStEO1FBQy9ELE9BQU8sQ0FBQyxLQUFLLENBQ1gsdURBQXVELGdDQUFnQyxxREFBcUQsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDeEssQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBR0Msd0JBR0QsQ0FBQyxVQUFVLEdBQUcsZ0NBQWdDLEdBQUcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCdWlsdC1pbiBzdGVwcyBhdmFpbGFibGUgaW4gdGhlIHdvcmtmbG93IHNjb3BlLiBMaWtlIGEgc3RhbmRhcmQgbGlicmFyeSxcbiAqIHRoZXkgYXJlIGF2YWlsYWJsZSBhbG9uZ3NpZGUgdXNlci1kZWZpbmVkIHN0ZXBzLCBidXQgdXNlcnMgZG8gbm90IGltcG9ydFxuICogdGhlbS4gVGhlIHJ1bnRpbWUgdXNlcyB0aGVzZSBzdGVwcyBpbnRlcm5hbGx5LlxuICovXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyKFxuICB0aGlzOiBSZXF1ZXN0IHwgUmVzcG9uc2Vcbikge1xuICAndXNlIHN0ZXAnO1xuICByZXR1cm4gdGhpcy5hcnJheUJ1ZmZlcigpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX19idWlsdGluX3Jlc3BvbnNlX2pzb24odGhpczogUmVxdWVzdCB8IFJlc3BvbnNlKSB7XG4gICd1c2Ugc3RlcCc7XG4gIHJldHVybiB0aGlzLmpzb24oKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9fYnVpbHRpbl9yZXNwb25zZV90ZXh0KHRoaXM6IFJlcXVlc3QgfCBSZXNwb25zZSkge1xuICAndXNlIHN0ZXAnO1xuICByZXR1cm4gdGhpcy50ZXh0KCk7XG59XG5cbi8qKlxuICogUHJvY2Vzcy13aWRlIGRlZHVwZSBmb3IgdGhlIHVuc3VwcG9ydGVkLXdvcmxkIHdhcm5pbmcgc28gaGlnaC12b2x1bWVcbiAqIGNhbGxlcnMgZG9uJ3QgZmxvb2QgbG9ncy5cbiAqL1xuY29uc3QgVU5TVVBQT1JURURfV09STERfV0FSTkVEID0gU3ltYm9sLmZvcihcbiAgJ0B3b3JrZmxvdy9zZXRBdHRyaWJ1dGVzLy91bnN1cHBvcnRlZFdvcmxkV2FybmVkJ1xuKTtcblxuY29uc3QgSU5URVJOQUxfQVRUUklCVVRFU19NQVhfQVRURU1QVFMgPSAzO1xuXG5mdW5jdGlvbiBmb3JtYXRVbmtub3duRXJyb3IoZXJyb3I6IHVua25vd24pIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3Iuc3RhY2sgPz8gYCR7ZXJyb3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gO1xuICB9XG4gIHJldHVybiBTdHJpbmcoZXJyb3IpO1xufVxuXG4vKipcbiAqIFN0ZXAgYnJpZGdlIGZvciB3b3JrZmxvdy1ib2R5IGBzZXRBdHRyaWJ1dGVzYCBjYWxscy4gVGhlIFZNLXNpZGVcbiAqIGhlbHBlciB2YWxpZGF0ZXMgaW5wdXQgYW5kIGRpc3BhdGNoZXMgaGVyZSB2aWEgYHVzZVN0ZXBgLiBUaGlzIHN0ZXBcbiAqIHJ1bnMgaW4gbm9ybWFsIE5vZGUgY29udGV4dCB3aXRoIGZ1bGwgd29ybGQgYWNjZXNzLlxuICpcbiAqIFRoZSBkaXNwYXRjaCByZWFkcyB0aGUgd29ybGQgYW5kIGN1cnJlbnQgcnVuIGlkIGRpcmVjdGx5IGZyb21cbiAqIGBnbG9iYWxUaGlzYCBzeW1ib2xzIHBvcHVsYXRlZCBieSB0aGUgd29ya2Zsb3cvc3RlcCBydW50aW1lLiBUaGlzXG4gKiBpbnRlbnRpb25hbGx5IGF2b2lkcyBpbXBvcnRpbmcgYEB3b3JrZmxvdy9jb3JlYCBzbyB0aGUgTmV4dC5qc1xuICogZGVmZXJyZWQtZW50cmllcyBkaXNjb3ZlcmVyIGNhbid0IHdhbGsgYSBjaGFpbiBpbnRvIHdvcmxkIGFkYXB0ZXJzXG4gKiBhbmQgYEB2ZXJjZWwvcXVldWVgIGZyb20gdGhpcyBzdGVwIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfX2J1aWx0aW5fc2V0X2F0dHJpYnV0ZXMoXG4gIGNoYW5nZXM6IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudWxsIH0+LFxuICBvcHRpb25zPzogeyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IGJvb2xlYW4gfVxuKSB7XG4gICd1c2Ugc3RlcCc7XG4gIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPjtcblxuICBjb25zdCBjb250ZXh0U3RvcmFnZSA9IGdbU3ltYm9sLmZvcignV09SS0ZMT1dfU1RFUF9DT05URVhUX1NUT1JBR0UnKV0gYXNcbiAgICB8IHtcbiAgICAgICAgZ2V0U3RvcmU6ICgpID0+XG4gICAgICAgICAgfCB7XG4gICAgICAgICAgICAgIHN0ZXBNZXRhZGF0YT86IHsgYXR0ZW1wdD86IG51bWJlciB9O1xuICAgICAgICAgICAgICB3b3JrZmxvd01ldGFkYXRhPzogeyB3b3JrZmxvd1J1bklkPzogc3RyaW5nIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0b3JlID0gY29udGV4dFN0b3JhZ2U/LmdldFN0b3JlPy4oKTtcbiAgY29uc3QgYXR0ZW1wdCA9XG4gICAgdHlwZW9mIHN0b3JlPy5zdGVwTWV0YWRhdGE/LmF0dGVtcHQgPT09ICdudW1iZXInXG4gICAgICA/IHN0b3JlLnN0ZXBNZXRhZGF0YS5hdHRlbXB0XG4gICAgICA6IElOVEVSTkFMX0FUVFJJQlVURVNfTUFYX0FUVEVNUFRTO1xuXG4gIGNvbnN0IHdvcmxkID0gZ1tTeW1ib2wuZm9yKCdAd29ya2Zsb3cvd29ybGQvL2NhY2hlJyldIGFzXG4gICAgfCB7XG4gICAgICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgICAgIHJ1bnM/OiB7XG4gICAgICAgICAgZXhwZXJpbWVudGFsU2V0QXR0cmlidXRlcz86IChcbiAgICAgICAgICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgICAgICAgICBjaGFuZ2VzOiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgbnVsbCB9PixcbiAgICAgICAgICAgIG9wdGlvbnM/OiB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbiB9XG4gICAgICAgICAgKSA9PiBQcm9taXNlPHVua25vd24+O1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIHwgdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIHdvcmxkPy5ydW5zPy5leHBlcmltZW50YWxTZXRBdHRyaWJ1dGVzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gV29ybGQgYWRhcHRlciBkb2Vzbid0IGltcGxlbWVudCBhdHRyaWJ1dGVzIHlldCwgc28gbm8tb3AgdGhlIGNhbGwsXG4gICAgLy8gYnV0IGVtaXQgb25lIHByb2Nlc3Mtd2lkZSB3YXJuaW5nIHNvIHVzZXJzIGtub3cgdGhlaXIgd3JpdGVzIGFyZVxuICAgIC8vIGJlaW5nIGRyb3BwZWQuIFRoZSBWTS1zaWRlIHZhbGlkYXRpb24gYWxyZWFkeSByYW4gc28gdGhlIGlucHV0XG4gICAgLy8gaXMgd2VsbC1mb3JtZWQuXG4gICAgaWYgKCFnW1VOU1VQUE9SVEVEX1dPUkxEX1dBUk5FRF0pIHtcbiAgICAgIGdbVU5TVVBQT1JURURfV09STERfV0FSTkVEXSA9IHRydWU7XG4gICAgICBjb25zdCB3b3JsZE5hbWUgPSB3b3JsZD8ubmFtZSA/IGAgKCR7d29ybGQubmFtZX0pYCA6ICcnO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW3dvcmtmbG93XSBzZXRBdHRyaWJ1dGVzOiB0aGUgY3VycmVudCB3b3JsZCBpbXBsZW1lbnRhdGlvbiR7d29ybGROYW1lfSBkb2VzIG5vdCBpbXBsZW1lbnQgZXhwZXJpbWVudGFsU2V0QXR0cmlidXRlczsgdGhpcyBjYWxsIChhbmQgYW55IHN1YnNlcXVlbnQgc2V0QXR0cmlidXRlcyBjYWxscyBpbiB0aGlzIHByb2Nlc3MpIGlzIGEgbm8tb3AuIEF0dHJpYnV0ZXMgd2lsbCBiZWNvbWUgYXZhaWxhYmxlIG9uY2UgdGhlIHdvcmxkIGFkYXB0ZXIgYWRkcyBzdXBwb3J0LmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcnVuSWQgPSBzdG9yZT8ud29ya2Zsb3dNZXRhZGF0YT8ud29ya2Zsb3dSdW5JZDtcbiAgICBpZiAoIXJ1bklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdfX2J1aWx0aW5fc2V0X2F0dHJpYnV0ZXM6IG5vIHdvcmtmbG93IHJ1biBpZCBhdmFpbGFibGUgaW4gc3RlcCBjb250ZXh0J1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBhd2FpdCB3b3JsZC5ydW5zLmV4cGVyaW1lbnRhbFNldEF0dHJpYnV0ZXMocnVuSWQsIGNoYW5nZXMsIG9wdGlvbnMpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChhdHRlbXB0IDwgSU5URVJOQUxfQVRUUklCVVRFU19NQVhfQVRURU1QVFMpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIEZhaWxpbmcgdG8gcG9zdCB0YWdzIHNob3VsZCBub3QgZmFpbCBhIHJ1biBkdXJpbmcgdGhlIGV4cGVyaW1lbnRhbCBwaGFzZS5cbiAgICAvLyBBZnRlciB0aHJlZSBhdHRlbXB0cywgbG9nIGFuZCBsZXQgdGhlIGludGVybmFsIHN0ZXAgY29tcGxldGUgc28gdGhlXG4gICAgLy8gcnVudGltZSBkb2VzIG5vdCBjb252ZXJ0IHJldHJ5IGV4aGF1c3Rpb24gaW50byBhIEZhdGFsRXJyb3IuXG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGBbd29ya2Zsb3ddIHNldEF0dHJpYnV0ZXM6IGZhaWxlZCB0byBwb3N0IHRhZ3MgYWZ0ZXIgJHtJTlRFUk5BTF9BVFRSSUJVVEVTX01BWF9BVFRFTVBUU30gYXR0ZW1wdHM7IGRyb3BwaW5nIHRoZSBpbnRlcm5hbCBhdHRyaWJ1dGUgd3JpdGUuICR7Zm9ybWF0VW5rbm93bkVycm9yKGVycm9yKX1gXG4gICAgKTtcbiAgfVxufVxuXG4oXG4gIF9fYnVpbHRpbl9zZXRfYXR0cmlidXRlcyBhcyB0eXBlb2YgX19idWlsdGluX3NldF9hdHRyaWJ1dGVzICYge1xuICAgIG1heFJldHJpZXM6IG51bWJlcjtcbiAgfVxuKS5tYXhSZXRyaWVzID0gSU5URVJOQUxfQVRUUklCVVRFU19NQVhfQVRURU1QVFMgLSAxO1xuIl19