UNPKG

inngest

Version:

Official SDK for Inngest.com. Inngest is the reliability layer for modern applications. Inngest combines durable execution, events, and queues into a zero-infra platform with built-in observability.

162 lines (160 loc) 6.54 kB
const require_consts = require('../../helpers/consts.cjs'); const require_version = require('../../version.cjs'); const require_env = require('../../helpers/env.cjs'); const require_types = require('../../types.cjs'); const require_InngestExecution = require('../execution/InngestExecution.cjs'); const require_functions = require('../../helpers/functions.cjs'); const require_strings = require('../../helpers/strings.cjs'); const require_Inngest = require('../Inngest.cjs'); const require_InngestCommHandler = require('../InngestCommHandler.cjs'); const require_connect = require('../../proto/src/components/connect/protobuf/connect.cjs'); const require_util = require('./util.cjs'); //#region src/components/connect/config.ts /** * Connection configuration preparation. * * Encapsulates signing key hashing, function config building, * InngestCommHandler creation, and connection data assembly — everything * needed before handing off to a connection strategy. */ const InngestBranchEnvironmentSigningKeyPrefix = "signkey-branch-"; /** * Collect per-app client + functions from ConnectApp definitions. */ function collectFunctions(apps) { const result = {}; for (const app of apps) { const client = app.client; if (result[client.id]) throw new Error(`Duplicate app id: ${client.id}`); result[client.id] = { client: app.client, functions: app.functions ?? client.funcs }; } return result; } /** * Prepare all connection configuration: signing keys, function configs, * connection data, and request handlers. */ function prepareConnectionConfig(apps, inngest) { const envName = inngest.env ?? require_env.getEnvironmentName(); const hashedSigningKey = inngest.signingKey ? require_strings.hashSigningKey(inngest.signingKey) : void 0; if (inngest.signingKey && inngest.signingKey.startsWith(InngestBranchEnvironmentSigningKeyPrefix) && !envName) throw new Error("Environment is required when using branch environment signing keys"); const hashedFallbackKey = inngest.signingKeyFallback ? require_strings.hashSigningKey(inngest.signingKeyFallback) : void 0; const capabilities = { trust_probe: "v1", connect: "v1" }; const functions = collectFunctions(apps); const functionConfigs = {}; for (const [appId, { client, functions: fns }] of Object.entries(functions)) functionConfigs[appId] = { client, functions: fns.flatMap((f) => f["getConfig"]({ baseUrl: new URL("wss://connect"), appPrefix: client.id, isConnect: true })) }; inngest[require_Inngest.internalLoggerSymbol].debug({ functionSlugs: Object.entries(functionConfigs).map(([appId, { functions: fns }]) => { return JSON.stringify({ appId, functions: fns.map((f) => ({ id: f.id, stepUrls: Object.values(f.steps).map((s) => s.runtime["url"]) })) }); }) }, "Prepared sync data"); const connectionData = { manualReadinessAck: true, marshaledCapabilities: JSON.stringify(capabilities), apps: Object.entries(functionConfigs).map(([appId, { client, functions: fns }]) => ({ appName: appId, appVersion: client.appVersion, functions: new TextEncoder().encode(JSON.stringify(fns)) })) }; const requestHandlers = {}; for (const [appId, { client, functions: fns }] of Object.entries(functions)) { const inngestCommHandler = new require_InngestCommHandler.InngestCommHandler({ client, functions: fns, frameworkName: "connect", defaultMaxRuntime: require_types.DefaultMaxRuntime.connect, skipSignatureValidation: true, handler: (msg) => { const asString = new TextDecoder().decode(msg.requestPayload); const parsed = require_functions.parseFnData(JSON.parse(asString), void 0, inngest[require_Inngest.internalLoggerSymbol]); const userTraceCtx = require_util.parseTraceCtx(msg.userTraceCtx); return { body() { return parsed; }, method() { return "POST"; }, headers(key) { switch (key) { case require_consts.headerKeys.ContentLength.toString(): return asString.length.toString(); case require_consts.headerKeys.InngestExpectedServerKind.toString(): return "connect"; case require_consts.headerKeys.RequestVersion.toString(): return parsed.version.toString(); case require_consts.headerKeys.RequestId.toString(): return msg.requestId; case require_consts.headerKeys.InngestJobId.toString(): return msg.jobId; case require_consts.headerKeys.Signature.toString(): return null; case require_consts.headerKeys.TraceParent.toString(): return userTraceCtx?.traceParent ?? null; case require_consts.headerKeys.TraceState.toString(): return userTraceCtx?.traceState ?? null; default: return null; } }, transformResponse({ body, headers, status }) { let sdkResponseStatus = require_connect.SDKResponseStatus.DONE; switch (status) { case 200: sdkResponseStatus = require_connect.SDKResponseStatus.DONE; break; case 206: sdkResponseStatus = require_connect.SDKResponseStatus.NOT_COMPLETED; break; case 500: sdkResponseStatus = require_connect.SDKResponseStatus.ERROR; break; } return require_connect.SDKResponse.create({ requestId: msg.requestId, accountId: msg.accountId, envId: msg.envId, appId: msg.appId, status: sdkResponseStatus, body: new TextEncoder().encode(body), noRetry: headers[require_consts.headerKeys.NoRetry] === "true", retryAfter: headers[require_consts.headerKeys.RetryAfter], sdkVersion: `inngest-js:v${require_version.version}`, requestVersion: parseInt(headers[require_consts.headerKeys.RequestVersion] ?? require_InngestExecution.PREFERRED_ASYNC_EXECUTION_VERSION.toString(), 10), systemTraceCtx: msg.systemTraceCtx, userTraceCtx: msg.userTraceCtx, runId: msg.runId }); }, url() { const baseUrl = new URL("http://connect.inngest.com"); baseUrl.searchParams.set(require_consts.queryKeys.FnId, msg.functionSlug); if (msg.stepId) baseUrl.searchParams.set(require_consts.queryKeys.StepId, msg.stepId); return baseUrl; } }; } }); if (!inngestCommHandler.checkModeConfiguration()) throw new Error("Signing key is required"); requestHandlers[appId] = inngestCommHandler.createHandler(); } return { hashedSigningKey, hashedFallbackKey, envName, connectionData, requestHandlers }; } //#endregion exports.prepareConnectionConfig = prepareConnectionConfig; //# sourceMappingURL=config.cjs.map