@workflow/next 5.0.0-beta.5 → 5.0.0-beta.6
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/builder-deferred.d.ts.map +1 -1
- package/dist/builder-deferred.js +3 -2
- package/dist/builder-deferred.js.map +1 -1
- package/dist/builder-eager.d.ts.map +1 -1
- package/dist/builder-eager.js +5 -0
- package/dist/builder-eager.js.map +1 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +31 -6
- package/dist/loader.js.map +1 -1
- package/dist/socket-server.d.ts +20 -0
- package/dist/socket-server.d.ts.map +1 -1
- package/dist/socket-server.js +28 -1
- package/dist/socket-server.js.map +1 -1
- package/docs/next.mdx +5 -3
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder-eager.js","sourceRoot":"","sources":["../src/builder-eager.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants } from 'node:fs';\nimport { access, copyFile, mkdir, stat, writeFile } from 'node:fs/promises';\nimport { extname, join, resolve } from 'node:path';\nimport type { WorkflowManifest } from '@workflow/builders';\nimport Watchpack from 'watchpack';\n\nlet CachedNextBuilderEager: any;\n\n// Create the eager Next builder dynamically by extending the ESM BaseBuilder.\n// Exported as getNextBuilderEager() to allow CommonJS modules to import from\n// the ESM @workflow/builders package via dynamic import at runtime.\nexport async function getNextBuilderEager() {\n if (CachedNextBuilderEager) {\n return CachedNextBuilderEager;\n }\n\n const {\n BaseBuilder: BaseBuilderClass,\n WORKFLOW_QUEUE_TRIGGER,\n // biome-ignore lint/security/noGlobalEval: Need to use eval here to avoid TypeScript from transpiling the import statement into `require()`\n } = (await eval(\n 'import(\"@workflow/builders\")'\n )) as typeof import('@workflow/builders');\n\n class NextBuilder extends BaseBuilderClass {\n async build() {\n const outputDir = await this.findAppDirectory();\n const workflowGeneratedDir = join(outputDir, '.well-known/workflow/v1');\n\n // Ensure output directories exist\n await mkdir(workflowGeneratedDir, { recursive: true });\n await writeFile(join(workflowGeneratedDir, '.gitignore'), '*');\n\n const inputFiles = await this.getInputFiles();\n const tsconfigPath = await this.findTsConfigPath();\n\n const options = {\n inputFiles,\n workflowGeneratedDir,\n tsconfigPath,\n };\n\n // V2: Build combined route (replaces separate step + flow routes)\n const combinedResult = await this.buildCombinedFunction(options);\n await this.buildWebhookRoute({ workflowGeneratedDir });\n\n const writeManifest = async (\n sourceManifest: WorkflowManifest | undefined\n ) => {\n const manifest = {\n steps: { ...sourceManifest?.steps },\n workflows: { ...sourceManifest?.workflows },\n classes: { ...sourceManifest?.classes },\n };\n\n // Write manifest\n const workflowBundlePath = join(workflowGeneratedDir, 'flow/route.js');\n const manifestJson = await this.createManifest({\n workflowBundlePath,\n manifestDir: workflowGeneratedDir,\n manifest,\n });\n\n // Expose manifest as a static file when WORKFLOW_PUBLIC_MANIFEST=1.\n if (this.shouldExposePublicManifest && manifestJson) {\n const publicManifestDir = join(\n this.config.workingDir,\n 'public/.well-known/workflow/v1'\n );\n await mkdir(publicManifestDir, { recursive: true });\n await copyFile(\n join(workflowGeneratedDir, 'manifest.json'),\n join(publicManifestDir, 'manifest.json')\n );\n }\n };\n\n await writeManifest(combinedResult?.manifest);\n\n await this.writeFunctionsConfig(outputDir);\n\n if (this.config.watch) {\n // TODO: implement watch mode for combined bundle\n // For now, fall back to full rebuild on file changes\n let stepsCtx = combinedResult?.stepsContext;\n if (!stepsCtx) {\n throw new Error(\n 'Invariant: expected steps build context in watch mode'\n );\n }\n\n // Use stepsCtx for the watch rebuild (workflow interim ctx from combined)\n let workflowsCtx = {\n interimBundleCtx: combinedResult?.interimBundleCtx!,\n bundleFinal: combinedResult?.bundleFinal!,\n };\n\n const normalizePath = (pathname: string) =>\n pathname.replace(/\\\\/g, '/');\n const knownFiles = new Set<string>();\n type WatchpackTimeInfoEntry = {\n safeTime: number;\n timestamp?: number;\n };\n let previousTimeInfo = new Map<string, WatchpackTimeInfoEntry>();\n\n const watchableExtensions = new Set([\n '.js',\n '.jsx',\n '.ts',\n '.tsx',\n '.mts',\n '.cts',\n '.cjs',\n '.mjs',\n ]);\n const ignoredPathFragments = [\n '/.git/',\n '/node_modules/',\n '/.next/',\n '/.turbo/',\n '/.vercel/',\n '/dist/',\n '/build/',\n '/out/',\n '/.cache/',\n '/.yarn/',\n '/.pnpm-store/',\n '/.parcel-cache/',\n '/.well-known/workflow/',\n ];\n const normalizedGeneratedDir = workflowGeneratedDir.replace(/\\\\/g, '/');\n ignoredPathFragments.push(normalizedGeneratedDir);\n\n // There is a node.js bug on MacOS which causes closing file watchers to be really slow.\n // This limits the number of watchers to mitigate the issue.\n // https://github.com/nodejs/node/issues/29949\n process.env.WATCHPACK_WATCHER_LIMIT =\n process.platform === 'darwin' ? '20' : undefined;\n\n const watcher = new Watchpack({\n // Watchpack default is 200ms which adds 200ms of dead time on bootup.\n aggregateTimeout: 5,\n ignored: (pathname: string) => {\n const normalizedPath = pathname.replace(/\\\\/g, '/');\n const extension = extname(normalizedPath);\n if (extension && !watchableExtensions.has(extension)) {\n return true;\n }\n if (normalizedPath.startsWith(normalizedGeneratedDir)) {\n return true;\n }\n for (const fragment of ignoredPathFragments) {\n if (normalizedPath.includes(fragment)) {\n return true;\n }\n }\n return false;\n },\n });\n\n const readTimeInfoEntries = () => {\n const rawEntries = watcher.getTimeInfoEntries() as Map<\n string,\n WatchpackTimeInfoEntry\n >;\n const normalizedEntries = new Map<string, WatchpackTimeInfoEntry>();\n for (const [path, info] of rawEntries) {\n normalizedEntries.set(normalizePath(path), info);\n }\n return normalizedEntries;\n };\n\n let rebuildQueue = Promise.resolve();\n\n const enqueue = (task: () => Promise<void>) => {\n rebuildQueue = rebuildQueue.then(task).catch((error) => {\n console.error('Failed to process file change', error);\n });\n return rebuildQueue;\n };\n\n const fullRebuild = async () => {\n const newInputFiles = await this.getInputFiles();\n options.inputFiles = newInputFiles;\n\n await stepsCtx!.dispose();\n await workflowsCtx.interimBundleCtx.dispose();\n\n const newCombined = await this.buildCombinedFunction(options);\n if (!newCombined?.stepsContext) {\n throw new Error(\n 'Invariant: expected steps build context after rebuild'\n );\n }\n stepsCtx = newCombined.stepsContext;\n\n if (!newCombined?.interimBundleCtx || !newCombined?.bundleFinal) {\n throw new Error(\n 'Invariant: expected workflows bundle context after rebuild'\n );\n }\n workflowsCtx = {\n interimBundleCtx: newCombined.interimBundleCtx,\n bundleFinal: newCombined.bundleFinal,\n };\n\n await writeManifest(newCombined.manifest);\n };\n\n const logBuildMessages = (\n result: {\n errors?: import('esbuild').Message[];\n warnings?: import('esbuild').Message[];\n },\n label: string\n ) => {\n const logByType = (\n messages: import('esbuild').Message[] | undefined,\n method: 'error' | 'warn'\n ) => {\n if (!messages || messages.length === 0) {\n return;\n }\n const descriptor = method === 'error' ? 'errors' : 'warnings';\n console[method](`${descriptor} while rebuilding ${label}`);\n for (const message of messages) {\n console[method](message);\n }\n };\n\n logByType(result.errors, 'error');\n logByType(result.warnings, 'warn');\n };\n\n const rebuildExistingFiles = async () => {\n const rebuiltStepStart = Date.now();\n const stepsResult = await stepsCtx!.rebuild();\n logBuildMessages(stepsResult, 'steps bundle');\n console.log(\n 'Rebuilt steps bundle',\n `${Date.now() - rebuiltStepStart}ms`\n );\n\n const rebuiltWorkflowStart = Date.now();\n const workflowResult = await workflowsCtx.interimBundleCtx.rebuild();\n logBuildMessages(workflowResult, 'workflows bundle');\n\n if (\n !workflowResult.outputFiles ||\n workflowResult.outputFiles.length === 0\n ) {\n console.error(\n 'No output generated while rebuilding workflows bundle'\n );\n return;\n }\n await workflowsCtx.bundleFinal(workflowResult.outputFiles[0].text);\n console.log(\n 'Rebuilt workflow bundle',\n `${Date.now() - rebuiltWorkflowStart}ms`\n );\n };\n\n const isWatchableFile = (path: string) =>\n watchableExtensions.has(extname(path));\n\n const getComparableTimestamp = (entry: WatchpackTimeInfoEntry) =>\n entry.timestamp ?? entry.safeTime;\n\n const findRemovedFiles = (\n currentEntries: Map<string, WatchpackTimeInfoEntry>,\n previousEntries: Map<string, WatchpackTimeInfoEntry>\n ) => {\n const removed: string[] = [];\n for (const path of previousEntries.keys()) {\n if (!currentEntries.has(path) && isWatchableFile(path)) {\n removed.push(path);\n }\n }\n return removed;\n };\n\n const findAddedAndModifiedFiles = (\n currentEntries: Map<string, WatchpackTimeInfoEntry>,\n previousEntries: Map<string, WatchpackTimeInfoEntry>\n ) => {\n const added: string[] = [];\n const modified: string[] = [];\n\n for (const [path, info] of currentEntries) {\n if (!isWatchableFile(path)) {\n continue;\n }\n\n const previous = previousEntries.get(path);\n if (!previous) {\n added.push(path);\n continue;\n }\n\n if (\n getComparableTimestamp(info) !== getComparableTimestamp(previous)\n ) {\n modified.push(path);\n }\n }\n\n return { added, modified };\n };\n\n const determineFileChanges = (\n currentEntries: Map<string, WatchpackTimeInfoEntry>,\n previousEntries: Map<string, WatchpackTimeInfoEntry>\n ) => {\n const removedFiles = findRemovedFiles(\n currentEntries,\n previousEntries\n );\n const { added, modified } = findAddedAndModifiedFiles(\n currentEntries,\n previousEntries\n );\n\n return {\n addedFiles: added,\n modifiedFiles: modified,\n removedFiles,\n };\n };\n\n let isInitial = true;\n\n watcher.on('aggregated', () => {\n const currentEntries = readTimeInfoEntries();\n const { addedFiles, modifiedFiles, removedFiles } =\n determineFileChanges(currentEntries, previousTimeInfo);\n\n previousTimeInfo = currentEntries;\n\n if (isInitial) {\n isInitial = false;\n return;\n }\n\n if (\n addedFiles.length === 0 &&\n modifiedFiles.length === 0 &&\n removedFiles.length === 0\n ) {\n return;\n }\n\n for (const removal of removedFiles) {\n knownFiles.delete(removal);\n }\n for (const added of addedFiles) {\n knownFiles.add(added);\n }\n\n enqueue(async () => {\n if (addedFiles.length > 0 || removedFiles.length > 0) {\n await fullRebuild();\n return;\n }\n\n if (modifiedFiles.length > 0) {\n await rebuildExistingFiles();\n }\n });\n });\n\n watcher.watch({\n directories: [this.config.workingDir],\n startTime: 0,\n });\n }\n }\n\n protected async getInputFiles(): Promise<string[]> {\n const inputFiles = await super.getInputFiles();\n return inputFiles.filter((item) => {\n // Match App Router entrypoints: route.ts, page.ts, layout.ts in app/ or src/app/ directories\n // Matches: /app/page.ts, /app/dashboard/page.ts, /src/app/route.ts, etc.\n if (\n item.match(\n /(^|.*[/\\\\])(app|src[/\\\\]app)([/\\\\](route|page|layout)\\.|[/\\\\].*[/\\\\](route|page|layout)\\.)/\n )\n ) {\n return true;\n }\n // Match Pages Router entrypoints: files in pages/ or src/pages/\n if (item.match(/[/\\\\](pages|src[/\\\\]pages)[/\\\\]/)) {\n return true;\n }\n return false;\n });\n }\n\n private async writeFunctionsConfig(outputDir: string) {\n // we don't run this in development mode as it's not needed\n if (process.env.NODE_ENV === 'development') {\n return;\n }\n\n // V2 combined config: single trigger handles both workflow and step execution.\n // The step route no longer needs its own trigger since steps are executed\n // inline by the combined handler or queued back to __wkf_workflow_* with stepId.\n const generatedConfig = {\n version: '0',\n workflows: {\n maxDuration: 'max',\n experimentalTriggers: [WORKFLOW_QUEUE_TRIGGER],\n },\n };\n\n await writeFile(\n join(outputDir, '.well-known/workflow/v1/config.json'),\n JSON.stringify(generatedConfig, null, 2)\n );\n }\n\n /**\n * V2: Build combined route that handles both workflow and step execution.\n */\n private async buildCombinedFunction({\n inputFiles,\n workflowGeneratedDir,\n tsconfigPath,\n }: {\n inputFiles: string[];\n workflowGeneratedDir: string;\n tsconfigPath?: string;\n }) {\n const flowRouteDir = join(workflowGeneratedDir, 'flow');\n await mkdir(flowRouteDir, { recursive: true });\n\n return await this.createCombinedBundle({\n format: 'esm',\n inputFiles,\n stepsOutfile: join(flowRouteDir, '__step_registrations.js'),\n flowOutfile: join(flowRouteDir, 'route.js'),\n bundleFinalOutput: false,\n externalizeNonSteps: true,\n tsconfigPath,\n });\n }\n\n private async buildWebhookRoute({\n workflowGeneratedDir,\n }: {\n workflowGeneratedDir: string;\n }): Promise<void> {\n const webhookRouteFile = join(\n workflowGeneratedDir,\n 'webhook/[token]/route.js'\n );\n await this.createWebhookBundle({\n outfile: webhookRouteFile,\n bundle: false, // Next.js doesn't need bundling\n });\n }\n\n private async findAppDirectory(): Promise<string> {\n const appDir = resolve(this.config.workingDir, 'app');\n const srcAppDir = resolve(this.config.workingDir, 'src/app');\n const pagesDir = resolve(this.config.workingDir, 'pages');\n const srcPagesDir = resolve(this.config.workingDir, 'src/pages');\n\n // Helper to check if a path exists and is a directory\n const isDirectory = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.F_OK);\n const stats = await stat(path);\n if (!stats.isDirectory()) {\n throw new Error(`Path exists but is not a directory: ${path}`);\n }\n return true;\n } catch (e) {\n if (e instanceof Error && e.message.includes('not a directory')) {\n throw e;\n }\n return false;\n }\n };\n\n // Check if app directory exists\n if (await isDirectory(appDir)) {\n return appDir;\n }\n\n // Check if src/app directory exists\n if (await isDirectory(srcAppDir)) {\n return srcAppDir;\n }\n\n // If no app directory exists, check for pages directory and create app next to it\n if (await isDirectory(pagesDir)) {\n // Create app directory next to pages directory\n await mkdir(appDir, { recursive: true });\n return appDir;\n }\n\n if (await isDirectory(srcPagesDir)) {\n // Create src/app directory next to src/pages directory\n await mkdir(srcAppDir, { recursive: true });\n return srcAppDir;\n }\n\n throw new Error(\n 'Could not find Next.js app or pages directory. Expected one of: \"app\", \"src/app\", \"pages\", or \"src/pages\" to exist.'\n );\n }\n }\n\n CachedNextBuilderEager = NextBuilder;\n return NextBuilder;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"builder-eager.js","sourceRoot":"","sources":["../src/builder-eager.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants } from 'node:fs';\nimport { access, copyFile, mkdir, stat, writeFile } from 'node:fs/promises';\nimport { extname, join, resolve } from 'node:path';\nimport type { WorkflowManifest } from '@workflow/builders';\nimport Watchpack from 'watchpack';\nimport { cleanupStaleSocketInfoFiles } from './socket-server.js';\n\nlet CachedNextBuilderEager: any;\n\n// Create the eager Next builder dynamically by extending the ESM BaseBuilder.\n// Exported as getNextBuilderEager() to allow CommonJS modules to import from\n// the ESM @workflow/builders package via dynamic import at runtime.\nexport async function getNextBuilderEager() {\n if (CachedNextBuilderEager) {\n return CachedNextBuilderEager;\n }\n\n const {\n BaseBuilder: BaseBuilderClass,\n WORKFLOW_QUEUE_TRIGGER,\n // biome-ignore lint/security/noGlobalEval: Need to use eval here to avoid TypeScript from transpiling the import statement into `require()`\n } = (await eval(\n 'import(\"@workflow/builders\")'\n )) as typeof import('@workflow/builders');\n\n class NextBuilder extends BaseBuilderClass {\n async build() {\n // Eager mode never starts a discovery socket server, so any leftover\n // workflow-socket.json is from a previous deferred-mode build and\n // would make the webpack loader connect to a dead port.\n await cleanupStaleSocketInfoFiles(\n join(\n this.config.workingDir,\n (this.config as { distDir?: string }).distDir || '.next'\n )\n );\n\n const outputDir = await this.findAppDirectory();\n const workflowGeneratedDir = join(outputDir, '.well-known/workflow/v1');\n\n // Ensure output directories exist\n await mkdir(workflowGeneratedDir, { recursive: true });\n await writeFile(join(workflowGeneratedDir, '.gitignore'), '*');\n\n const inputFiles = await this.getInputFiles();\n const tsconfigPath = await this.findTsConfigPath();\n\n const options = {\n inputFiles,\n workflowGeneratedDir,\n tsconfigPath,\n };\n\n // V2: Build combined route (replaces separate step + flow routes)\n const combinedResult = await this.buildCombinedFunction(options);\n await this.buildWebhookRoute({ workflowGeneratedDir });\n\n const writeManifest = async (\n sourceManifest: WorkflowManifest | undefined\n ) => {\n const manifest = {\n steps: { ...sourceManifest?.steps },\n workflows: { ...sourceManifest?.workflows },\n classes: { ...sourceManifest?.classes },\n };\n\n // Write manifest\n const workflowBundlePath = join(workflowGeneratedDir, 'flow/route.js');\n const manifestJson = await this.createManifest({\n workflowBundlePath,\n manifestDir: workflowGeneratedDir,\n manifest,\n });\n\n // Expose manifest as a static file when WORKFLOW_PUBLIC_MANIFEST=1.\n if (this.shouldExposePublicManifest && manifestJson) {\n const publicManifestDir = join(\n this.config.workingDir,\n 'public/.well-known/workflow/v1'\n );\n await mkdir(publicManifestDir, { recursive: true });\n await copyFile(\n join(workflowGeneratedDir, 'manifest.json'),\n join(publicManifestDir, 'manifest.json')\n );\n }\n };\n\n await writeManifest(combinedResult?.manifest);\n\n await this.writeFunctionsConfig(outputDir);\n\n if (this.config.watch) {\n // TODO: implement watch mode for combined bundle\n // For now, fall back to full rebuild on file changes\n let stepsCtx = combinedResult?.stepsContext;\n if (!stepsCtx) {\n throw new Error(\n 'Invariant: expected steps build context in watch mode'\n );\n }\n\n // Use stepsCtx for the watch rebuild (workflow interim ctx from combined)\n let workflowsCtx = {\n interimBundleCtx: combinedResult?.interimBundleCtx!,\n bundleFinal: combinedResult?.bundleFinal!,\n };\n\n const normalizePath = (pathname: string) =>\n pathname.replace(/\\\\/g, '/');\n const knownFiles = new Set<string>();\n type WatchpackTimeInfoEntry = {\n safeTime: number;\n timestamp?: number;\n };\n let previousTimeInfo = new Map<string, WatchpackTimeInfoEntry>();\n\n const watchableExtensions = new Set([\n '.js',\n '.jsx',\n '.ts',\n '.tsx',\n '.mts',\n '.cts',\n '.cjs',\n '.mjs',\n ]);\n const ignoredPathFragments = [\n '/.git/',\n '/node_modules/',\n '/.next/',\n '/.turbo/',\n '/.vercel/',\n '/dist/',\n '/build/',\n '/out/',\n '/.cache/',\n '/.yarn/',\n '/.pnpm-store/',\n '/.parcel-cache/',\n '/.well-known/workflow/',\n ];\n const normalizedGeneratedDir = workflowGeneratedDir.replace(/\\\\/g, '/');\n ignoredPathFragments.push(normalizedGeneratedDir);\n\n // There is a node.js bug on MacOS which causes closing file watchers to be really slow.\n // This limits the number of watchers to mitigate the issue.\n // https://github.com/nodejs/node/issues/29949\n process.env.WATCHPACK_WATCHER_LIMIT =\n process.platform === 'darwin' ? '20' : undefined;\n\n const watcher = new Watchpack({\n // Watchpack default is 200ms which adds 200ms of dead time on bootup.\n aggregateTimeout: 5,\n ignored: (pathname: string) => {\n const normalizedPath = pathname.replace(/\\\\/g, '/');\n const extension = extname(normalizedPath);\n if (extension && !watchableExtensions.has(extension)) {\n return true;\n }\n if (normalizedPath.startsWith(normalizedGeneratedDir)) {\n return true;\n }\n for (const fragment of ignoredPathFragments) {\n if (normalizedPath.includes(fragment)) {\n return true;\n }\n }\n return false;\n },\n });\n\n const readTimeInfoEntries = () => {\n const rawEntries = watcher.getTimeInfoEntries() as Map<\n string,\n WatchpackTimeInfoEntry\n >;\n const normalizedEntries = new Map<string, WatchpackTimeInfoEntry>();\n for (const [path, info] of rawEntries) {\n normalizedEntries.set(normalizePath(path), info);\n }\n return normalizedEntries;\n };\n\n let rebuildQueue = Promise.resolve();\n\n const enqueue = (task: () => Promise<void>) => {\n rebuildQueue = rebuildQueue.then(task).catch((error) => {\n console.error('Failed to process file change', error);\n });\n return rebuildQueue;\n };\n\n const fullRebuild = async () => {\n const newInputFiles = await this.getInputFiles();\n options.inputFiles = newInputFiles;\n\n await stepsCtx!.dispose();\n await workflowsCtx.interimBundleCtx.dispose();\n\n const newCombined = await this.buildCombinedFunction(options);\n if (!newCombined?.stepsContext) {\n throw new Error(\n 'Invariant: expected steps build context after rebuild'\n );\n }\n stepsCtx = newCombined.stepsContext;\n\n if (!newCombined?.interimBundleCtx || !newCombined?.bundleFinal) {\n throw new Error(\n 'Invariant: expected workflows bundle context after rebuild'\n );\n }\n workflowsCtx = {\n interimBundleCtx: newCombined.interimBundleCtx,\n bundleFinal: newCombined.bundleFinal,\n };\n\n await writeManifest(newCombined.manifest);\n };\n\n const logBuildMessages = (\n result: {\n errors?: import('esbuild').Message[];\n warnings?: import('esbuild').Message[];\n },\n label: string\n ) => {\n const logByType = (\n messages: import('esbuild').Message[] | undefined,\n method: 'error' | 'warn'\n ) => {\n if (!messages || messages.length === 0) {\n return;\n }\n const descriptor = method === 'error' ? 'errors' : 'warnings';\n console[method](`${descriptor} while rebuilding ${label}`);\n for (const message of messages) {\n console[method](message);\n }\n };\n\n logByType(result.errors, 'error');\n logByType(result.warnings, 'warn');\n };\n\n const rebuildExistingFiles = async () => {\n const rebuiltStepStart = Date.now();\n const stepsResult = await stepsCtx!.rebuild();\n logBuildMessages(stepsResult, 'steps bundle');\n console.log(\n 'Rebuilt steps bundle',\n `${Date.now() - rebuiltStepStart}ms`\n );\n\n const rebuiltWorkflowStart = Date.now();\n const workflowResult = await workflowsCtx.interimBundleCtx.rebuild();\n logBuildMessages(workflowResult, 'workflows bundle');\n\n if (\n !workflowResult.outputFiles ||\n workflowResult.outputFiles.length === 0\n ) {\n console.error(\n 'No output generated while rebuilding workflows bundle'\n );\n return;\n }\n await workflowsCtx.bundleFinal(workflowResult.outputFiles[0].text);\n console.log(\n 'Rebuilt workflow bundle',\n `${Date.now() - rebuiltWorkflowStart}ms`\n );\n };\n\n const isWatchableFile = (path: string) =>\n watchableExtensions.has(extname(path));\n\n const getComparableTimestamp = (entry: WatchpackTimeInfoEntry) =>\n entry.timestamp ?? entry.safeTime;\n\n const findRemovedFiles = (\n currentEntries: Map<string, WatchpackTimeInfoEntry>,\n previousEntries: Map<string, WatchpackTimeInfoEntry>\n ) => {\n const removed: string[] = [];\n for (const path of previousEntries.keys()) {\n if (!currentEntries.has(path) && isWatchableFile(path)) {\n removed.push(path);\n }\n }\n return removed;\n };\n\n const findAddedAndModifiedFiles = (\n currentEntries: Map<string, WatchpackTimeInfoEntry>,\n previousEntries: Map<string, WatchpackTimeInfoEntry>\n ) => {\n const added: string[] = [];\n const modified: string[] = [];\n\n for (const [path, info] of currentEntries) {\n if (!isWatchableFile(path)) {\n continue;\n }\n\n const previous = previousEntries.get(path);\n if (!previous) {\n added.push(path);\n continue;\n }\n\n if (\n getComparableTimestamp(info) !== getComparableTimestamp(previous)\n ) {\n modified.push(path);\n }\n }\n\n return { added, modified };\n };\n\n const determineFileChanges = (\n currentEntries: Map<string, WatchpackTimeInfoEntry>,\n previousEntries: Map<string, WatchpackTimeInfoEntry>\n ) => {\n const removedFiles = findRemovedFiles(\n currentEntries,\n previousEntries\n );\n const { added, modified } = findAddedAndModifiedFiles(\n currentEntries,\n previousEntries\n );\n\n return {\n addedFiles: added,\n modifiedFiles: modified,\n removedFiles,\n };\n };\n\n let isInitial = true;\n\n watcher.on('aggregated', () => {\n const currentEntries = readTimeInfoEntries();\n const { addedFiles, modifiedFiles, removedFiles } =\n determineFileChanges(currentEntries, previousTimeInfo);\n\n previousTimeInfo = currentEntries;\n\n if (isInitial) {\n isInitial = false;\n return;\n }\n\n if (\n addedFiles.length === 0 &&\n modifiedFiles.length === 0 &&\n removedFiles.length === 0\n ) {\n return;\n }\n\n for (const removal of removedFiles) {\n knownFiles.delete(removal);\n }\n for (const added of addedFiles) {\n knownFiles.add(added);\n }\n\n enqueue(async () => {\n if (addedFiles.length > 0 || removedFiles.length > 0) {\n await fullRebuild();\n return;\n }\n\n if (modifiedFiles.length > 0) {\n await rebuildExistingFiles();\n }\n });\n });\n\n watcher.watch({\n directories: [this.config.workingDir],\n startTime: 0,\n });\n }\n }\n\n protected async getInputFiles(): Promise<string[]> {\n const inputFiles = await super.getInputFiles();\n return inputFiles.filter((item) => {\n // Match App Router entrypoints: route.ts, page.ts, layout.ts in app/ or src/app/ directories\n // Matches: /app/page.ts, /app/dashboard/page.ts, /src/app/route.ts, etc.\n if (\n item.match(\n /(^|.*[/\\\\])(app|src[/\\\\]app)([/\\\\](route|page|layout)\\.|[/\\\\].*[/\\\\](route|page|layout)\\.)/\n )\n ) {\n return true;\n }\n // Match Pages Router entrypoints: files in pages/ or src/pages/\n if (item.match(/[/\\\\](pages|src[/\\\\]pages)[/\\\\]/)) {\n return true;\n }\n return false;\n });\n }\n\n private async writeFunctionsConfig(outputDir: string) {\n // we don't run this in development mode as it's not needed\n if (process.env.NODE_ENV === 'development') {\n return;\n }\n\n // V2 combined config: single trigger handles both workflow and step execution.\n // The step route no longer needs its own trigger since steps are executed\n // inline by the combined handler or queued back to __wkf_workflow_* with stepId.\n const generatedConfig = {\n version: '0',\n workflows: {\n maxDuration: 'max',\n experimentalTriggers: [WORKFLOW_QUEUE_TRIGGER],\n },\n };\n\n await writeFile(\n join(outputDir, '.well-known/workflow/v1/config.json'),\n JSON.stringify(generatedConfig, null, 2)\n );\n }\n\n /**\n * V2: Build combined route that handles both workflow and step execution.\n */\n private async buildCombinedFunction({\n inputFiles,\n workflowGeneratedDir,\n tsconfigPath,\n }: {\n inputFiles: string[];\n workflowGeneratedDir: string;\n tsconfigPath?: string;\n }) {\n const flowRouteDir = join(workflowGeneratedDir, 'flow');\n await mkdir(flowRouteDir, { recursive: true });\n\n return await this.createCombinedBundle({\n format: 'esm',\n inputFiles,\n stepsOutfile: join(flowRouteDir, '__step_registrations.js'),\n flowOutfile: join(flowRouteDir, 'route.js'),\n bundleFinalOutput: false,\n externalizeNonSteps: true,\n tsconfigPath,\n });\n }\n\n private async buildWebhookRoute({\n workflowGeneratedDir,\n }: {\n workflowGeneratedDir: string;\n }): Promise<void> {\n const webhookRouteFile = join(\n workflowGeneratedDir,\n 'webhook/[token]/route.js'\n );\n await this.createWebhookBundle({\n outfile: webhookRouteFile,\n bundle: false, // Next.js doesn't need bundling\n });\n }\n\n private async findAppDirectory(): Promise<string> {\n const appDir = resolve(this.config.workingDir, 'app');\n const srcAppDir = resolve(this.config.workingDir, 'src/app');\n const pagesDir = resolve(this.config.workingDir, 'pages');\n const srcPagesDir = resolve(this.config.workingDir, 'src/pages');\n\n // Helper to check if a path exists and is a directory\n const isDirectory = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.F_OK);\n const stats = await stat(path);\n if (!stats.isDirectory()) {\n throw new Error(`Path exists but is not a directory: ${path}`);\n }\n return true;\n } catch (e) {\n if (e instanceof Error && e.message.includes('not a directory')) {\n throw e;\n }\n return false;\n }\n };\n\n // Check if app directory exists\n if (await isDirectory(appDir)) {\n return appDir;\n }\n\n // Check if src/app directory exists\n if (await isDirectory(srcAppDir)) {\n return srcAppDir;\n }\n\n // If no app directory exists, check for pages directory and create app next to it\n if (await isDirectory(pagesDir)) {\n // Create app directory next to pages directory\n await mkdir(appDir, { recursive: true });\n return appDir;\n }\n\n if (await isDirectory(srcPagesDir)) {\n // Create src/app directory next to src/pages directory\n await mkdir(srcAppDir, { recursive: true });\n return srcAppDir;\n }\n\n throw new Error(\n 'Could not find Next.js app or pages directory. Expected one of: \"app\", \"src/app\", \"pages\", or \"src/pages\" to exist.'\n );\n }\n }\n\n CachedNextBuilderEager = NextBuilder;\n return NextBuilder;\n}\n"]}
|
package/dist/loader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAooBA,KAAK,qBAAqB,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CACZ,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,GAAG,KACZ,IAAI,CAAC;IACV,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,IAAI,EAAE,qBAAqB,EAC3B,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,SAAS,EAAE,GAAG,GACb,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CA+IjC"}
|
package/dist/loader.js
CHANGED
|
@@ -17,6 +17,31 @@ const discoveredPatternStateByFilePath = new Map();
|
|
|
17
17
|
let socketClientPromise = null;
|
|
18
18
|
let socketClient = null;
|
|
19
19
|
let socketClientKey = null;
|
|
20
|
+
/**
|
|
21
|
+
* Wrap a TCP connect failure with context about where the connection was
|
|
22
|
+
* attempted, where the credentials came from, and which source file was
|
|
23
|
+
* being processed when it failed. ECONNREFUSED is the common case here, and
|
|
24
|
+
* the message points the user at the most likely root cause (stale
|
|
25
|
+
* socket-info file).
|
|
26
|
+
*/
|
|
27
|
+
function annotateConnectionError(originalError, credentials) {
|
|
28
|
+
const errorCode = originalError instanceof Error &&
|
|
29
|
+
'code' in originalError &&
|
|
30
|
+
typeof originalError.code === 'string'
|
|
31
|
+
? originalError.code
|
|
32
|
+
: undefined;
|
|
33
|
+
const errorMessage = originalError instanceof Error
|
|
34
|
+
? originalError.message
|
|
35
|
+
: String(originalError);
|
|
36
|
+
const lines = [
|
|
37
|
+
`Workflow discovery socket connect failed: ${errorCode ?? errorMessage} (127.0.0.1:${credentials.port})`,
|
|
38
|
+
];
|
|
39
|
+
const annotated = new Error(lines.join('\n'));
|
|
40
|
+
if (originalError instanceof Error) {
|
|
41
|
+
annotated.cause = originalError;
|
|
42
|
+
}
|
|
43
|
+
return annotated;
|
|
44
|
+
}
|
|
20
45
|
const ROUTE_STUB_FILE_MARKER = 'WORKFLOW_ROUTE_STUB_FILE';
|
|
21
46
|
const ROUTE_STUB_BUILD_WAIT_TIMEOUT_MS = 120_000;
|
|
22
47
|
let pendingDeferredRouteStubBuildPromise = null;
|
|
@@ -108,10 +133,10 @@ function getSocketInfoFilePath() {
|
|
|
108
133
|
// Fallback for worker processes that don't inherit dynamic env updates
|
|
109
134
|
// from the process that created the socket server.
|
|
110
135
|
const distDir = process.env.WORKFLOW_NEXT_DIST_DIR || '.next';
|
|
111
|
-
const cwdFallbackPath = (0, node_path_1.join)(process.cwd(), distDir,
|
|
136
|
+
const cwdFallbackPath = (0, node_path_1.join)(process.cwd(), distDir, socket_server_js_1.SOCKET_INFO_FILENAME);
|
|
112
137
|
const projectRoot = process.env.WORKFLOW_PROJECT_ROOT;
|
|
113
138
|
if (projectRoot) {
|
|
114
|
-
const projectRootFallbackPath = (0, node_path_1.join)(projectRoot, distDir,
|
|
139
|
+
const projectRootFallbackPath = (0, node_path_1.join)(projectRoot, distDir, socket_server_js_1.SOCKET_INFO_FILENAME);
|
|
115
140
|
if ((0, node_fs_1.existsSync)(projectRootFallbackPath)) {
|
|
116
141
|
return projectRootFallbackPath;
|
|
117
142
|
}
|
|
@@ -197,12 +222,12 @@ async function getSocketClient() {
|
|
|
197
222
|
};
|
|
198
223
|
const onError = (error) => {
|
|
199
224
|
cleanup();
|
|
200
|
-
reject(error);
|
|
225
|
+
reject(annotateConnectionError(error, socketCredentials));
|
|
201
226
|
};
|
|
202
227
|
const timeout = setTimeout(() => {
|
|
203
228
|
cleanup();
|
|
204
229
|
socket.destroy();
|
|
205
|
-
reject(new Error('Socket connection timeout'));
|
|
230
|
+
reject(annotateConnectionError(new Error('Socket connection timeout'), socketCredentials));
|
|
206
231
|
}, 1000);
|
|
207
232
|
const cleanup = () => {
|
|
208
233
|
clearTimeout(timeout);
|
|
@@ -271,7 +296,7 @@ async function createSocketConnection(socketCredentials, timeoutMs = 1_000) {
|
|
|
271
296
|
const timeout = setTimeout(() => {
|
|
272
297
|
cleanup();
|
|
273
298
|
socket.destroy();
|
|
274
|
-
reject(new Error('Socket connection timeout'));
|
|
299
|
+
reject(annotateConnectionError(new Error('Socket connection timeout'), socketCredentials));
|
|
275
300
|
}, timeoutMs);
|
|
276
301
|
const cleanup = () => {
|
|
277
302
|
clearTimeout(timeout);
|
|
@@ -286,7 +311,7 @@ async function createSocketConnection(socketCredentials, timeoutMs = 1_000) {
|
|
|
286
311
|
const onError = (error) => {
|
|
287
312
|
cleanup();
|
|
288
313
|
socket.destroy();
|
|
289
|
-
reject(error);
|
|
314
|
+
reject(annotateConnectionError(error, socketCredentials));
|
|
290
315
|
};
|
|
291
316
|
socket.on('connect', onConnect);
|
|
292
317
|
socket.on('error', onError);
|
package/dist/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { connect, type Socket } from 'node:net';\nimport { dirname, join, relative } from 'node:path';\nimport { transform } from '@swc/core';\nimport {\n parseMessage,\n type SocketMessage,\n serializeMessage,\n} from './socket-server.js';\n\ntype DecoratorOptionsWithConfigPath =\n import('@workflow/builders').DecoratorOptionsWithConfigPath;\ntype WorkflowPatternMatch = import('@workflow/builders').WorkflowPatternMatch;\n\n// Cache decorator options per working directory to avoid reading tsconfig for every file\nconst decoratorOptionsCache = new Map<\n string,\n Promise<DecoratorOptionsWithConfigPath>\n>();\n// Cache for shared utilities from @workflow/builders (ESM module loaded dynamically in CommonJS context)\nlet cachedBuildersModule: typeof import('@workflow/builders') | null = null;\ntype LoaderStaticDependencies = {\n swcPluginPath: string;\n files: string[];\n};\nlet cachedLoaderStaticDependencies: LoaderStaticDependencies | null = null;\n\ntype DiscoveredPatternState = {\n hasWorkflow: boolean;\n hasStep: boolean;\n hasSerde: boolean;\n};\nconst discoveredPatternStateByFilePath = new Map<\n string,\n DiscoveredPatternState\n>();\n\n// Cache socket connection to avoid reconnecting on every file.\nlet socketClientPromise: Promise<Socket | null> | null = null;\nlet socketClient: Socket | null = null;\nlet socketClientKey: string | null = null;\n\ntype SocketCredentials = {\n port: number;\n authToken: string;\n};\n\nconst ROUTE_STUB_FILE_MARKER = 'WORKFLOW_ROUTE_STUB_FILE';\nconst ROUTE_STUB_BUILD_WAIT_TIMEOUT_MS = 120_000;\nlet pendingDeferredRouteStubBuildPromise: Promise<void> | null = null;\n\nfunction registerFileDependency(\n loaderContext: WorkflowLoaderContext,\n dependencyPath: string\n): void {\n loaderContext.addDependency?.(dependencyPath);\n loaderContext.addBuildDependency?.(dependencyPath);\n}\n\nfunction updateDiscoveredPatternState(\n filePath: string,\n nextState: DiscoveredPatternState\n): { shouldNotify: boolean; previousState?: DiscoveredPatternState } {\n const previousState = discoveredPatternStateByFilePath.get(filePath);\n const hasAnyPattern =\n nextState.hasWorkflow || nextState.hasStep || nextState.hasSerde;\n\n if (!hasAnyPattern) {\n if (!previousState) {\n return { shouldNotify: false };\n }\n discoveredPatternStateByFilePath.delete(filePath);\n return { shouldNotify: true, previousState };\n }\n\n if (\n previousState &&\n previousState.hasWorkflow === nextState.hasWorkflow &&\n previousState.hasStep === nextState.hasStep &&\n previousState.hasSerde === nextState.hasSerde\n ) {\n return { shouldNotify: false, previousState };\n }\n\n discoveredPatternStateByFilePath.set(filePath, nextState);\n return { shouldNotify: true, previousState };\n}\n\nfunction addIfExists(files: Set<string>, dependencyPath: string): void {\n if (existsSync(dependencyPath)) {\n files.add(dependencyPath);\n }\n}\n\nfunction resolveLoaderStaticDependencies(): LoaderStaticDependencies {\n if (cachedLoaderStaticDependencies) {\n return cachedLoaderStaticDependencies;\n }\n\n const swcPluginPath = require.resolve('@workflow/swc-plugin');\n const swcPluginBuildHashPath = require.resolve(\n '@workflow/swc-plugin/build-hash.json'\n );\n const workflowBuildersPath = require.resolve('@workflow/builders');\n\n // Derive package.json paths from resolved entrypoints to avoid\n // Turbopack loader-eval failures around ../package.json resolution.\n const swcPluginPackageJsonPath = join(dirname(swcPluginPath), 'package.json');\n const workflowBuildersPackageJsonPath = join(\n dirname(workflowBuildersPath),\n '../package.json'\n );\n\n const files = new Set<string>([\n __filename,\n require.resolve('./socket-server'),\n swcPluginPath,\n swcPluginBuildHashPath,\n workflowBuildersPath,\n ]);\n addIfExists(files, swcPluginPackageJsonPath);\n addIfExists(files, workflowBuildersPackageJsonPath);\n\n cachedLoaderStaticDependencies = {\n swcPluginPath,\n files: Array.from(files),\n };\n return cachedLoaderStaticDependencies;\n}\n\nfunction registerTransformDependencies(\n loaderContext: WorkflowLoaderContext\n): string {\n const staticDependencies = resolveLoaderStaticDependencies();\n for (const dependencyPath of staticDependencies.files) {\n registerFileDependency(loaderContext, dependencyPath);\n }\n\n return staticDependencies.swcPluginPath;\n}\n\nfunction resetSocketClient(cachedSocket?: Socket): void {\n if (cachedSocket && socketClient && socketClient !== cachedSocket) {\n return;\n }\n\n socketClientPromise = null;\n socketClient = null;\n socketClientKey = null;\n}\n\nasync function writeSocketMessage(\n socket: Socket,\n message: string\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n socket.write(message, (error?: Error | null) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n}\n\nfunction getSocketInfoFilePath(): string | null {\n const configuredPath = process.env.WORKFLOW_SOCKET_INFO_PATH;\n if (configuredPath) {\n return configuredPath;\n }\n\n // Fallback for worker processes that don't inherit dynamic env updates\n // from the process that created the socket server.\n const distDir = process.env.WORKFLOW_NEXT_DIST_DIR || '.next';\n const cwdFallbackPath = join(\n process.cwd(),\n distDir,\n 'cache',\n 'workflow-socket.json'\n );\n const projectRoot = process.env.WORKFLOW_PROJECT_ROOT;\n if (projectRoot) {\n const projectRootFallbackPath = join(\n projectRoot,\n distDir,\n 'cache',\n 'workflow-socket.json'\n );\n if (existsSync(projectRootFallbackPath)) {\n return projectRootFallbackPath;\n }\n }\n return cwdFallbackPath;\n}\n\nfunction getSocketCredentialsFromEnv(): SocketCredentials | null {\n const socketPort = process.env.WORKFLOW_SOCKET_PORT;\n const authToken = process.env.WORKFLOW_SOCKET_AUTH;\n if (!socketPort || !authToken) {\n return null;\n }\n\n const port = Number.parseInt(socketPort, 10);\n if (Number.isNaN(port)) {\n return null;\n }\n return { port, authToken };\n}\n\nasync function getSocketCredentialsFromFile(): Promise<SocketCredentials | null> {\n const socketInfoFilePath = getSocketInfoFilePath();\n if (!socketInfoFilePath) {\n return null;\n }\n if (!existsSync(socketInfoFilePath)) {\n return null;\n }\n\n try {\n const raw = await readFile(socketInfoFilePath, 'utf8');\n const parsed = JSON.parse(raw) as {\n port?: unknown;\n authToken?: unknown;\n };\n const authToken =\n typeof parsed.authToken === 'string' ? parsed.authToken : null;\n const numericPort =\n typeof parsed.port === 'number'\n ? parsed.port\n : Number.parseInt(String(parsed.port), 10);\n\n if (!authToken || Number.isNaN(numericPort)) {\n return null;\n }\n return {\n port: numericPort,\n authToken,\n };\n } catch {\n return null;\n }\n}\n\nasync function getSocketCredentials(): Promise<SocketCredentials | null> {\n const envCredentials = getSocketCredentialsFromEnv();\n if (envCredentials) {\n return envCredentials;\n }\n return await getSocketCredentialsFromFile();\n}\n\nasync function getSocketClient(): Promise<Socket | null> {\n const socketCredentials = await getSocketCredentials();\n if (!socketCredentials) {\n return null;\n }\n\n if (socketClient?.destroyed) {\n resetSocketClient(socketClient);\n }\n\n const currentSocketKey = `${socketCredentials.port}:${socketCredentials.authToken}`;\n if (socketClientKey && socketClientKey !== currentSocketKey) {\n if (socketClient) {\n resetSocketClient(socketClient);\n } else {\n resetSocketClient();\n }\n }\n\n if (!socketClientPromise) {\n socketClientPromise = (async () => {\n try {\n const socket = connect({\n port: socketCredentials.port,\n host: '127.0.0.1',\n });\n\n // Wait for connection\n await new Promise<void>((resolve, reject) => {\n const onConnect = () => {\n socket.setNoDelay(true);\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const timeout = setTimeout(() => {\n cleanup();\n socket.destroy();\n reject(new Error('Socket connection timeout'));\n }, 1000);\n const cleanup = () => {\n clearTimeout(timeout);\n socket.off('connect', onConnect);\n socket.off('error', onError);\n };\n\n socket.on('connect', onConnect);\n socket.on('error', onError);\n });\n\n socket.on('close', () => {\n resetSocketClient(socket);\n });\n socket.on('error', () => {\n resetSocketClient(socket);\n });\n\n socketClient = socket;\n socketClientKey = currentSocketKey;\n return socket;\n } catch (error) {\n resetSocketClient();\n throw error;\n }\n })();\n }\n return socketClientPromise;\n}\n\nasync function notifySocketServer(\n filename: string,\n hasWorkflow: boolean,\n hasStep: boolean,\n hasSerde: boolean\n): Promise<void> {\n const socketCredentials = await getSocketCredentials();\n if (!socketCredentials) {\n return;\n }\n\n const socket = await getSocketClient();\n if (!socket) {\n throw new Error('Invariant: missing workflow socket connection');\n }\n\n const message: SocketMessage = {\n type: 'file-discovered',\n filePath: filename,\n hasWorkflow,\n hasStep,\n hasSerde,\n };\n const serializedMessage = serializeMessage(\n message,\n socketCredentials.authToken\n );\n\n try {\n await writeSocketMessage(socket, serializedMessage);\n } catch (error) {\n resetSocketClient(socket);\n const reconnectedSocket = await getSocketClient();\n if (!reconnectedSocket) {\n throw error;\n }\n await writeSocketMessage(reconnectedSocket, serializedMessage);\n }\n}\n\nfunction isWorkflowRouteStubSource(source: string): boolean {\n return source.includes(ROUTE_STUB_FILE_MARKER);\n}\n\nasync function createSocketConnection(\n socketCredentials: SocketCredentials,\n timeoutMs = 1_000\n): Promise<Socket> {\n return await new Promise<Socket>((resolve, reject) => {\n const socket = connect({\n port: socketCredentials.port,\n host: '127.0.0.1',\n });\n const timeout = setTimeout(() => {\n cleanup();\n socket.destroy();\n reject(new Error('Socket connection timeout'));\n }, timeoutMs);\n const cleanup = () => {\n clearTimeout(timeout);\n socket.off('connect', onConnect);\n socket.off('error', onError);\n };\n const onConnect = () => {\n socket.setNoDelay(true);\n cleanup();\n resolve(socket);\n };\n const onError = (error: Error) => {\n cleanup();\n socket.destroy();\n reject(error);\n };\n\n socket.on('connect', onConnect);\n socket.on('error', onError);\n });\n}\n\nasync function waitForDeferredBuildComplete(\n socket: Socket,\n authToken: string,\n timeoutMs = ROUTE_STUB_BUILD_WAIT_TIMEOUT_MS\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n let buffer = '';\n const timeout = setTimeout(() => {\n cleanup();\n reject(\n new Error('Timed out waiting for deferred route build completion')\n );\n }, timeoutMs);\n const cleanup = () => {\n clearTimeout(timeout);\n socket.off('data', onData);\n socket.off('error', onError);\n socket.off('close', onClose);\n socket.off('end', onClose);\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const onClose = () => {\n cleanup();\n reject(new Error('Socket closed before deferred route build completed'));\n };\n const onData = (chunk: Buffer) => {\n buffer += chunk.toString();\n let newlineIndex = buffer.indexOf('\\n');\n while (newlineIndex !== -1) {\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n newlineIndex = buffer.indexOf('\\n');\n\n const message = parseMessage(line, authToken);\n if (message?.type === 'build-complete') {\n cleanup();\n resolve();\n return;\n }\n }\n };\n\n socket.on('data', onData);\n socket.on('error', onError);\n socket.on('close', onClose);\n socket.on('end', onClose);\n });\n}\n\nasync function triggerDeferredRouteStubBuildAndWait(): Promise<void> {\n const socketCredentials = await getSocketCredentials();\n if (!socketCredentials) {\n return;\n }\n const socket = await createSocketConnection(socketCredentials);\n try {\n await writeSocketMessage(\n socket,\n serializeMessage({ type: 'trigger-build' }, socketCredentials.authToken)\n );\n await waitForDeferredBuildComplete(socket, socketCredentials.authToken);\n } finally {\n socket.destroy();\n }\n}\n\nasync function ensureDeferredRouteStubBuildAndWait(): Promise<void> {\n if (pendingDeferredRouteStubBuildPromise) {\n return pendingDeferredRouteStubBuildPromise;\n }\n const pendingPromise = triggerDeferredRouteStubBuildAndWait();\n pendingDeferredRouteStubBuildPromise = pendingPromise.finally(() => {\n if (pendingDeferredRouteStubBuildPromise === pendingPromise) {\n pendingDeferredRouteStubBuildPromise = null;\n }\n });\n return pendingDeferredRouteStubBuildPromise;\n}\n\nasync function getBuildersModule(): Promise<\n typeof import('@workflow/builders')\n> {\n if (cachedBuildersModule) {\n return cachedBuildersModule;\n }\n // Dynamic import to handle ESM module from CommonJS context\n // biome-ignore lint/security/noGlobalEval: Need to use eval here to avoid TypeScript from transpiling the import statement into `require()`\n cachedBuildersModule = (await eval(\n 'import(\"@workflow/builders\")'\n )) as typeof import('@workflow/builders');\n return cachedBuildersModule;\n}\n\nasync function getDecoratorOptions(\n workingDir: string\n): Promise<DecoratorOptionsWithConfigPath> {\n const cached = decoratorOptionsCache.get(workingDir);\n if (cached) {\n return cached;\n }\n\n const promise = (async (): Promise<DecoratorOptionsWithConfigPath> => {\n const { getDecoratorOptionsForDirectoryWithConfigPath } =\n await getBuildersModule();\n return getDecoratorOptionsForDirectoryWithConfigPath(workingDir);\n })();\n\n decoratorOptionsCache.set(workingDir, promise);\n return promise;\n}\n\nasync function detectPatterns(source: string): Promise<WorkflowPatternMatch> {\n const { detectWorkflowPatterns } = await getBuildersModule();\n return detectWorkflowPatterns(source);\n}\n\nasync function checkGeneratedFile(filePath: string): Promise<boolean> {\n const { isGeneratedWorkflowFile } = await getBuildersModule();\n return isGeneratedWorkflowFile(filePath);\n}\n\nasync function checkShouldTransform(\n filePath: string,\n patterns: WorkflowPatternMatch\n): Promise<boolean> {\n const { shouldTransformFile } = await getBuildersModule();\n return shouldTransformFile(filePath, patterns);\n}\n\nasync function getModuleSpecifier(\n filePath: string,\n projectRoot: string\n): Promise<string | undefined> {\n const { resolveModuleSpecifier } = await getBuildersModule();\n return resolveModuleSpecifier(filePath, projectRoot).moduleSpecifier;\n}\n\nasync function resolveWorkflowAliasPath(\n filePath: string,\n workingDir: string\n): Promise<string | undefined> {\n const { resolveWorkflowAliasRelativePath } = await getBuildersModule();\n return resolveWorkflowAliasRelativePath(filePath, workingDir);\n}\n\nasync function getRelativeFilenameForSwc(\n filename: string,\n workingDir: string\n): Promise<string> {\n const normalizedWorkingDir = workingDir\n .replace(/\\\\/g, '/')\n .replace(/\\/$/, '');\n const normalizedFilepath = filename.replace(/\\\\/g, '/');\n\n // Windows fix: Use case-insensitive comparison to work around drive letter casing issues\n const lowerWd = normalizedWorkingDir.toLowerCase();\n const lowerPath = normalizedFilepath.toLowerCase();\n\n let relativeFilename: string;\n if (lowerPath.startsWith(`${lowerWd}/`)) {\n // File is under working directory - manually calculate relative path\n relativeFilename = normalizedFilepath.substring(\n normalizedWorkingDir.length + 1\n );\n } else if (lowerPath === lowerWd) {\n // File IS the working directory (shouldn't happen)\n relativeFilename = '.';\n } else {\n // Use relative() for files outside working directory\n relativeFilename = relative(workingDir, filename).replace(/\\\\/g, '/');\n\n if (relativeFilename.startsWith('../')) {\n const aliasedRelativePath = await resolveWorkflowAliasPath(\n filename,\n workingDir\n );\n if (aliasedRelativePath) {\n relativeFilename = aliasedRelativePath;\n } else {\n relativeFilename = relativeFilename\n .split('/')\n .filter((part) => part !== '..')\n .join('/');\n }\n }\n }\n\n // Final safety check - ensure we never pass an absolute path to SWC\n if (relativeFilename.includes(':') || relativeFilename.startsWith('/')) {\n // This should rarely happen, but use filename split as last resort\n relativeFilename = normalizedFilepath.split('/').pop() || 'unknown.ts';\n }\n\n return relativeFilename;\n}\n\n// This loader applies the \"use workflow\"/\"use step\" transform.\n// All files use step mode; the SWC plugin decides per-function whether\n// to emit workflow or step bindings based on the source's directives.\ntype WorkflowLoaderContext = {\n resourcePath: string;\n async?: () => (\n error: Error | null,\n content?: string,\n sourceMap?: any\n ) => void;\n addDependency?: (dependency: string) => void;\n addBuildDependency?: (dependency: string) => void;\n};\n\nexport default function workflowLoader(\n this: WorkflowLoaderContext,\n source: string | Buffer,\n sourceMap: any\n): string | Promise<string> | void {\n const callback = this.async?.();\n const run = async (): Promise<{ code: string; map: any }> => {\n const filename = this.resourcePath;\n const normalizedSource = source.toString();\n const workingDir = process.cwd();\n const swcPluginPath = registerTransformDependencies(this);\n const sourceForTransform = normalizedSource;\n\n const isGeneratedWorkflowFile = await checkGeneratedFile(filename);\n // Skip generated workflow route files to avoid re-processing them.\n // Deferred route stubs are a special case: wait for the generated route\n // output to become available before returning.\n if (isGeneratedWorkflowFile) {\n if (\n process.env.WORKFLOW_NEXT_LAZY_DISCOVERY === '1' &&\n isWorkflowRouteStubSource(normalizedSource)\n ) {\n try {\n await ensureDeferredRouteStubBuildAndWait();\n const refreshedSource = await readFile(filename, 'utf8');\n if (!isWorkflowRouteStubSource(refreshedSource)) {\n return { code: refreshedSource, map: sourceMap };\n }\n } catch (error) {\n console.warn(\n `[workflow] Failed waiting for deferred route build for ${filename}, using stub output`,\n error\n );\n }\n }\n return { code: normalizedSource, map: sourceMap };\n }\n\n // Detect workflow patterns in the source code.\n const patterns = await detectPatterns(sourceForTransform);\n // Always notify discovery tracking, even for `false/false`, so files that\n // previously had workflow/step usage are removed from the tracked sets.\n const nextPatternState: DiscoveredPatternState = {\n hasWorkflow: patterns.hasUseWorkflow,\n hasStep: patterns.hasUseStep,\n hasSerde: patterns.hasSerde,\n };\n const { shouldNotify } = updateDiscoveredPatternState(\n filename,\n nextPatternState\n );\n if (shouldNotify) {\n await notifySocketServer(\n filename,\n nextPatternState.hasWorkflow,\n nextPatternState.hasStep,\n nextPatternState.hasSerde\n );\n }\n\n // Check if file needs transformation based on patterns and path\n if (!(await checkShouldTransform(filename, patterns))) {\n return { code: normalizedSource, map: sourceMap };\n }\n\n const isTypeScript =\n filename.endsWith('.ts') ||\n filename.endsWith('.tsx') ||\n filename.endsWith('.mts') ||\n filename.endsWith('.cts');\n\n // Calculate relative filename for SWC plugin\n // The SWC plugin uses filename to generate workflowId, so it must be relative\n const relativeFilename = await getRelativeFilenameForSwc(\n filename,\n workingDir\n );\n\n // Get decorator options from tsconfig (cached per working directory)\n const { options: decoratorOptions, configPath } =\n await getDecoratorOptions(workingDir);\n if (configPath) {\n registerFileDependency(this, configPath);\n }\n\n // Resolve module specifier for packages (node_modules or workspace packages)\n const moduleSpecifier = await getModuleSpecifier(filename, workingDir);\n const mode = 'step';\n\n // Transform with SWC\n const result = await transform(sourceForTransform, {\n filename: relativeFilename,\n jsc: {\n parser: {\n ...(isTypeScript\n ? {\n syntax: 'typescript',\n tsx: filename.endsWith('.tsx'),\n decorators: decoratorOptions.decorators,\n }\n : {\n syntax: 'ecmascript',\n jsx: filename.endsWith('.jsx'),\n decorators: decoratorOptions.decorators,\n }),\n },\n target: 'es2022',\n experimental: {\n plugins: [[swcPluginPath, { mode, moduleSpecifier }]],\n },\n transform: {\n react: {\n runtime: 'preserve',\n },\n legacyDecorator: decoratorOptions.legacyDecorator,\n decoratorMetadata: decoratorOptions.decoratorMetadata,\n },\n },\n minify: false,\n inputSourceMap: sourceMap,\n sourceMaps: true,\n inlineSourcesContent: true,\n });\n\n let transformedMap = sourceMap;\n if (typeof result.map === 'string') {\n try {\n transformedMap = JSON.parse(result.map);\n } catch {\n transformedMap = result.map;\n }\n } else if (result.map) {\n transformedMap = result.map;\n }\n\n return { code: result.code, map: transformedMap };\n };\n\n if (!callback) {\n return run().then((result) => result.code);\n }\n\n void run()\n .then((result) => callback(null, result.code, result.map))\n .catch((error: unknown) => {\n callback(error instanceof Error ? error : new Error(String(error)));\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { connect, type Socket } from 'node:net';\nimport { dirname, join, relative } from 'node:path';\nimport { transform } from '@swc/core';\nimport {\n parseMessage,\n SOCKET_INFO_FILENAME,\n type SocketMessage,\n serializeMessage,\n} from './socket-server.js';\n\ntype DecoratorOptionsWithConfigPath =\n import('@workflow/builders').DecoratorOptionsWithConfigPath;\ntype WorkflowPatternMatch = import('@workflow/builders').WorkflowPatternMatch;\n\n// Cache decorator options per working directory to avoid reading tsconfig for every file\nconst decoratorOptionsCache = new Map<\n string,\n Promise<DecoratorOptionsWithConfigPath>\n>();\n// Cache for shared utilities from @workflow/builders (ESM module loaded dynamically in CommonJS context)\nlet cachedBuildersModule: typeof import('@workflow/builders') | null = null;\ntype LoaderStaticDependencies = {\n swcPluginPath: string;\n files: string[];\n};\nlet cachedLoaderStaticDependencies: LoaderStaticDependencies | null = null;\n\ntype DiscoveredPatternState = {\n hasWorkflow: boolean;\n hasStep: boolean;\n hasSerde: boolean;\n};\nconst discoveredPatternStateByFilePath = new Map<\n string,\n DiscoveredPatternState\n>();\n\n// Cache socket connection to avoid reconnecting on every file.\nlet socketClientPromise: Promise<Socket | null> | null = null;\nlet socketClient: Socket | null = null;\nlet socketClientKey: string | null = null;\n\ntype SocketCredentials = {\n port: number;\n authToken: string;\n};\n\n/**\n * Wrap a TCP connect failure with context about where the connection was\n * attempted, where the credentials came from, and which source file was\n * being processed when it failed. ECONNREFUSED is the common case here, and\n * the message points the user at the most likely root cause (stale\n * socket-info file).\n */\nfunction annotateConnectionError(\n originalError: unknown,\n credentials: SocketCredentials\n): Error {\n const errorCode =\n originalError instanceof Error &&\n 'code' in originalError &&\n typeof (originalError as { code?: unknown }).code === 'string'\n ? ((originalError as { code: string }).code as string)\n : undefined;\n const errorMessage =\n originalError instanceof Error\n ? originalError.message\n : String(originalError);\n\n const lines = [\n `Workflow discovery socket connect failed: ${errorCode ?? errorMessage} (127.0.0.1:${credentials.port})`,\n ];\n\n const annotated = new Error(lines.join('\\n'));\n if (originalError instanceof Error) {\n (annotated as { cause?: unknown }).cause = originalError;\n }\n return annotated;\n}\n\nconst ROUTE_STUB_FILE_MARKER = 'WORKFLOW_ROUTE_STUB_FILE';\nconst ROUTE_STUB_BUILD_WAIT_TIMEOUT_MS = 120_000;\nlet pendingDeferredRouteStubBuildPromise: Promise<void> | null = null;\n\nfunction registerFileDependency(\n loaderContext: WorkflowLoaderContext,\n dependencyPath: string\n): void {\n loaderContext.addDependency?.(dependencyPath);\n loaderContext.addBuildDependency?.(dependencyPath);\n}\n\nfunction updateDiscoveredPatternState(\n filePath: string,\n nextState: DiscoveredPatternState\n): { shouldNotify: boolean; previousState?: DiscoveredPatternState } {\n const previousState = discoveredPatternStateByFilePath.get(filePath);\n const hasAnyPattern =\n nextState.hasWorkflow || nextState.hasStep || nextState.hasSerde;\n\n if (!hasAnyPattern) {\n if (!previousState) {\n return { shouldNotify: false };\n }\n discoveredPatternStateByFilePath.delete(filePath);\n return { shouldNotify: true, previousState };\n }\n\n if (\n previousState &&\n previousState.hasWorkflow === nextState.hasWorkflow &&\n previousState.hasStep === nextState.hasStep &&\n previousState.hasSerde === nextState.hasSerde\n ) {\n return { shouldNotify: false, previousState };\n }\n\n discoveredPatternStateByFilePath.set(filePath, nextState);\n return { shouldNotify: true, previousState };\n}\n\nfunction addIfExists(files: Set<string>, dependencyPath: string): void {\n if (existsSync(dependencyPath)) {\n files.add(dependencyPath);\n }\n}\n\nfunction resolveLoaderStaticDependencies(): LoaderStaticDependencies {\n if (cachedLoaderStaticDependencies) {\n return cachedLoaderStaticDependencies;\n }\n\n const swcPluginPath = require.resolve('@workflow/swc-plugin');\n const swcPluginBuildHashPath = require.resolve(\n '@workflow/swc-plugin/build-hash.json'\n );\n const workflowBuildersPath = require.resolve('@workflow/builders');\n\n // Derive package.json paths from resolved entrypoints to avoid\n // Turbopack loader-eval failures around ../package.json resolution.\n const swcPluginPackageJsonPath = join(dirname(swcPluginPath), 'package.json');\n const workflowBuildersPackageJsonPath = join(\n dirname(workflowBuildersPath),\n '../package.json'\n );\n\n const files = new Set<string>([\n __filename,\n require.resolve('./socket-server'),\n swcPluginPath,\n swcPluginBuildHashPath,\n workflowBuildersPath,\n ]);\n addIfExists(files, swcPluginPackageJsonPath);\n addIfExists(files, workflowBuildersPackageJsonPath);\n\n cachedLoaderStaticDependencies = {\n swcPluginPath,\n files: Array.from(files),\n };\n return cachedLoaderStaticDependencies;\n}\n\nfunction registerTransformDependencies(\n loaderContext: WorkflowLoaderContext\n): string {\n const staticDependencies = resolveLoaderStaticDependencies();\n for (const dependencyPath of staticDependencies.files) {\n registerFileDependency(loaderContext, dependencyPath);\n }\n\n return staticDependencies.swcPluginPath;\n}\n\nfunction resetSocketClient(cachedSocket?: Socket): void {\n if (cachedSocket && socketClient && socketClient !== cachedSocket) {\n return;\n }\n\n socketClientPromise = null;\n socketClient = null;\n socketClientKey = null;\n}\n\nasync function writeSocketMessage(\n socket: Socket,\n message: string\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n socket.write(message, (error?: Error | null) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n}\n\nfunction getSocketInfoFilePath(): string | null {\n const configuredPath = process.env.WORKFLOW_SOCKET_INFO_PATH;\n if (configuredPath) {\n return configuredPath;\n }\n\n // Fallback for worker processes that don't inherit dynamic env updates\n // from the process that created the socket server.\n const distDir = process.env.WORKFLOW_NEXT_DIST_DIR || '.next';\n const cwdFallbackPath = join(process.cwd(), distDir, SOCKET_INFO_FILENAME);\n const projectRoot = process.env.WORKFLOW_PROJECT_ROOT;\n if (projectRoot) {\n const projectRootFallbackPath = join(\n projectRoot,\n distDir,\n SOCKET_INFO_FILENAME\n );\n if (existsSync(projectRootFallbackPath)) {\n return projectRootFallbackPath;\n }\n }\n return cwdFallbackPath;\n}\n\nfunction getSocketCredentialsFromEnv(): SocketCredentials | null {\n const socketPort = process.env.WORKFLOW_SOCKET_PORT;\n const authToken = process.env.WORKFLOW_SOCKET_AUTH;\n if (!socketPort || !authToken) {\n return null;\n }\n\n const port = Number.parseInt(socketPort, 10);\n if (Number.isNaN(port)) {\n return null;\n }\n return { port, authToken };\n}\n\nasync function getSocketCredentialsFromFile(): Promise<SocketCredentials | null> {\n const socketInfoFilePath = getSocketInfoFilePath();\n if (!socketInfoFilePath) {\n return null;\n }\n if (!existsSync(socketInfoFilePath)) {\n return null;\n }\n\n try {\n const raw = await readFile(socketInfoFilePath, 'utf8');\n const parsed = JSON.parse(raw) as {\n port?: unknown;\n authToken?: unknown;\n };\n const authToken =\n typeof parsed.authToken === 'string' ? parsed.authToken : null;\n const numericPort =\n typeof parsed.port === 'number'\n ? parsed.port\n : Number.parseInt(String(parsed.port), 10);\n\n if (!authToken || Number.isNaN(numericPort)) {\n return null;\n }\n return {\n port: numericPort,\n authToken,\n };\n } catch {\n return null;\n }\n}\n\nasync function getSocketCredentials(): Promise<SocketCredentials | null> {\n const envCredentials = getSocketCredentialsFromEnv();\n if (envCredentials) {\n return envCredentials;\n }\n return await getSocketCredentialsFromFile();\n}\n\nasync function getSocketClient(): Promise<Socket | null> {\n const socketCredentials = await getSocketCredentials();\n if (!socketCredentials) {\n return null;\n }\n\n if (socketClient?.destroyed) {\n resetSocketClient(socketClient);\n }\n\n const currentSocketKey = `${socketCredentials.port}:${socketCredentials.authToken}`;\n if (socketClientKey && socketClientKey !== currentSocketKey) {\n if (socketClient) {\n resetSocketClient(socketClient);\n } else {\n resetSocketClient();\n }\n }\n\n if (!socketClientPromise) {\n socketClientPromise = (async () => {\n try {\n const socket = connect({\n port: socketCredentials.port,\n host: '127.0.0.1',\n });\n\n // Wait for connection\n await new Promise<void>((resolve, reject) => {\n const onConnect = () => {\n socket.setNoDelay(true);\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(annotateConnectionError(error, socketCredentials));\n };\n const timeout = setTimeout(() => {\n cleanup();\n socket.destroy();\n reject(\n annotateConnectionError(\n new Error('Socket connection timeout'),\n socketCredentials\n )\n );\n }, 1000);\n const cleanup = () => {\n clearTimeout(timeout);\n socket.off('connect', onConnect);\n socket.off('error', onError);\n };\n\n socket.on('connect', onConnect);\n socket.on('error', onError);\n });\n\n socket.on('close', () => {\n resetSocketClient(socket);\n });\n socket.on('error', () => {\n resetSocketClient(socket);\n });\n\n socketClient = socket;\n socketClientKey = currentSocketKey;\n return socket;\n } catch (error) {\n resetSocketClient();\n throw error;\n }\n })();\n }\n return socketClientPromise;\n}\n\nasync function notifySocketServer(\n filename: string,\n hasWorkflow: boolean,\n hasStep: boolean,\n hasSerde: boolean\n): Promise<void> {\n const socketCredentials = await getSocketCredentials();\n if (!socketCredentials) {\n return;\n }\n\n const socket = await getSocketClient();\n if (!socket) {\n throw new Error('Invariant: missing workflow socket connection');\n }\n\n const message: SocketMessage = {\n type: 'file-discovered',\n filePath: filename,\n hasWorkflow,\n hasStep,\n hasSerde,\n };\n const serializedMessage = serializeMessage(\n message,\n socketCredentials.authToken\n );\n\n try {\n await writeSocketMessage(socket, serializedMessage);\n } catch (error) {\n resetSocketClient(socket);\n const reconnectedSocket = await getSocketClient();\n if (!reconnectedSocket) {\n throw error;\n }\n await writeSocketMessage(reconnectedSocket, serializedMessage);\n }\n}\n\nfunction isWorkflowRouteStubSource(source: string): boolean {\n return source.includes(ROUTE_STUB_FILE_MARKER);\n}\n\nasync function createSocketConnection(\n socketCredentials: SocketCredentials,\n timeoutMs = 1_000\n): Promise<Socket> {\n return await new Promise<Socket>((resolve, reject) => {\n const socket = connect({\n port: socketCredentials.port,\n host: '127.0.0.1',\n });\n const timeout = setTimeout(() => {\n cleanup();\n socket.destroy();\n reject(\n annotateConnectionError(\n new Error('Socket connection timeout'),\n socketCredentials\n )\n );\n }, timeoutMs);\n const cleanup = () => {\n clearTimeout(timeout);\n socket.off('connect', onConnect);\n socket.off('error', onError);\n };\n const onConnect = () => {\n socket.setNoDelay(true);\n cleanup();\n resolve(socket);\n };\n const onError = (error: Error) => {\n cleanup();\n socket.destroy();\n reject(annotateConnectionError(error, socketCredentials));\n };\n\n socket.on('connect', onConnect);\n socket.on('error', onError);\n });\n}\n\nasync function waitForDeferredBuildComplete(\n socket: Socket,\n authToken: string,\n timeoutMs = ROUTE_STUB_BUILD_WAIT_TIMEOUT_MS\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n let buffer = '';\n const timeout = setTimeout(() => {\n cleanup();\n reject(\n new Error('Timed out waiting for deferred route build completion')\n );\n }, timeoutMs);\n const cleanup = () => {\n clearTimeout(timeout);\n socket.off('data', onData);\n socket.off('error', onError);\n socket.off('close', onClose);\n socket.off('end', onClose);\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const onClose = () => {\n cleanup();\n reject(new Error('Socket closed before deferred route build completed'));\n };\n const onData = (chunk: Buffer) => {\n buffer += chunk.toString();\n let newlineIndex = buffer.indexOf('\\n');\n while (newlineIndex !== -1) {\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n newlineIndex = buffer.indexOf('\\n');\n\n const message = parseMessage(line, authToken);\n if (message?.type === 'build-complete') {\n cleanup();\n resolve();\n return;\n }\n }\n };\n\n socket.on('data', onData);\n socket.on('error', onError);\n socket.on('close', onClose);\n socket.on('end', onClose);\n });\n}\n\nasync function triggerDeferredRouteStubBuildAndWait(): Promise<void> {\n const socketCredentials = await getSocketCredentials();\n if (!socketCredentials) {\n return;\n }\n const socket = await createSocketConnection(socketCredentials);\n try {\n await writeSocketMessage(\n socket,\n serializeMessage({ type: 'trigger-build' }, socketCredentials.authToken)\n );\n await waitForDeferredBuildComplete(socket, socketCredentials.authToken);\n } finally {\n socket.destroy();\n }\n}\n\nasync function ensureDeferredRouteStubBuildAndWait(): Promise<void> {\n if (pendingDeferredRouteStubBuildPromise) {\n return pendingDeferredRouteStubBuildPromise;\n }\n const pendingPromise = triggerDeferredRouteStubBuildAndWait();\n pendingDeferredRouteStubBuildPromise = pendingPromise.finally(() => {\n if (pendingDeferredRouteStubBuildPromise === pendingPromise) {\n pendingDeferredRouteStubBuildPromise = null;\n }\n });\n return pendingDeferredRouteStubBuildPromise;\n}\n\nasync function getBuildersModule(): Promise<\n typeof import('@workflow/builders')\n> {\n if (cachedBuildersModule) {\n return cachedBuildersModule;\n }\n // Dynamic import to handle ESM module from CommonJS context\n // biome-ignore lint/security/noGlobalEval: Need to use eval here to avoid TypeScript from transpiling the import statement into `require()`\n cachedBuildersModule = (await eval(\n 'import(\"@workflow/builders\")'\n )) as typeof import('@workflow/builders');\n return cachedBuildersModule;\n}\n\nasync function getDecoratorOptions(\n workingDir: string\n): Promise<DecoratorOptionsWithConfigPath> {\n const cached = decoratorOptionsCache.get(workingDir);\n if (cached) {\n return cached;\n }\n\n const promise = (async (): Promise<DecoratorOptionsWithConfigPath> => {\n const { getDecoratorOptionsForDirectoryWithConfigPath } =\n await getBuildersModule();\n return getDecoratorOptionsForDirectoryWithConfigPath(workingDir);\n })();\n\n decoratorOptionsCache.set(workingDir, promise);\n return promise;\n}\n\nasync function detectPatterns(source: string): Promise<WorkflowPatternMatch> {\n const { detectWorkflowPatterns } = await getBuildersModule();\n return detectWorkflowPatterns(source);\n}\n\nasync function checkGeneratedFile(filePath: string): Promise<boolean> {\n const { isGeneratedWorkflowFile } = await getBuildersModule();\n return isGeneratedWorkflowFile(filePath);\n}\n\nasync function checkShouldTransform(\n filePath: string,\n patterns: WorkflowPatternMatch\n): Promise<boolean> {\n const { shouldTransformFile } = await getBuildersModule();\n return shouldTransformFile(filePath, patterns);\n}\n\nasync function getModuleSpecifier(\n filePath: string,\n projectRoot: string\n): Promise<string | undefined> {\n const { resolveModuleSpecifier } = await getBuildersModule();\n return resolveModuleSpecifier(filePath, projectRoot).moduleSpecifier;\n}\n\nasync function resolveWorkflowAliasPath(\n filePath: string,\n workingDir: string\n): Promise<string | undefined> {\n const { resolveWorkflowAliasRelativePath } = await getBuildersModule();\n return resolveWorkflowAliasRelativePath(filePath, workingDir);\n}\n\nasync function getRelativeFilenameForSwc(\n filename: string,\n workingDir: string\n): Promise<string> {\n const normalizedWorkingDir = workingDir\n .replace(/\\\\/g, '/')\n .replace(/\\/$/, '');\n const normalizedFilepath = filename.replace(/\\\\/g, '/');\n\n // Windows fix: Use case-insensitive comparison to work around drive letter casing issues\n const lowerWd = normalizedWorkingDir.toLowerCase();\n const lowerPath = normalizedFilepath.toLowerCase();\n\n let relativeFilename: string;\n if (lowerPath.startsWith(`${lowerWd}/`)) {\n // File is under working directory - manually calculate relative path\n relativeFilename = normalizedFilepath.substring(\n normalizedWorkingDir.length + 1\n );\n } else if (lowerPath === lowerWd) {\n // File IS the working directory (shouldn't happen)\n relativeFilename = '.';\n } else {\n // Use relative() for files outside working directory\n relativeFilename = relative(workingDir, filename).replace(/\\\\/g, '/');\n\n if (relativeFilename.startsWith('../')) {\n const aliasedRelativePath = await resolveWorkflowAliasPath(\n filename,\n workingDir\n );\n if (aliasedRelativePath) {\n relativeFilename = aliasedRelativePath;\n } else {\n relativeFilename = relativeFilename\n .split('/')\n .filter((part) => part !== '..')\n .join('/');\n }\n }\n }\n\n // Final safety check - ensure we never pass an absolute path to SWC\n if (relativeFilename.includes(':') || relativeFilename.startsWith('/')) {\n // This should rarely happen, but use filename split as last resort\n relativeFilename = normalizedFilepath.split('/').pop() || 'unknown.ts';\n }\n\n return relativeFilename;\n}\n\n// This loader applies the \"use workflow\"/\"use step\" transform.\n// All files use step mode; the SWC plugin decides per-function whether\n// to emit workflow or step bindings based on the source's directives.\ntype WorkflowLoaderContext = {\n resourcePath: string;\n async?: () => (\n error: Error | null,\n content?: string,\n sourceMap?: any\n ) => void;\n addDependency?: (dependency: string) => void;\n addBuildDependency?: (dependency: string) => void;\n};\n\nexport default function workflowLoader(\n this: WorkflowLoaderContext,\n source: string | Buffer,\n sourceMap: any\n): string | Promise<string> | void {\n const callback = this.async?.();\n const run = async (): Promise<{ code: string; map: any }> => {\n const filename = this.resourcePath;\n const normalizedSource = source.toString();\n const workingDir = process.cwd();\n const swcPluginPath = registerTransformDependencies(this);\n const sourceForTransform = normalizedSource;\n\n const isGeneratedWorkflowFile = await checkGeneratedFile(filename);\n // Skip generated workflow route files to avoid re-processing them.\n // Deferred route stubs are a special case: wait for the generated route\n // output to become available before returning.\n if (isGeneratedWorkflowFile) {\n if (\n process.env.WORKFLOW_NEXT_LAZY_DISCOVERY === '1' &&\n isWorkflowRouteStubSource(normalizedSource)\n ) {\n try {\n await ensureDeferredRouteStubBuildAndWait();\n const refreshedSource = await readFile(filename, 'utf8');\n if (!isWorkflowRouteStubSource(refreshedSource)) {\n return { code: refreshedSource, map: sourceMap };\n }\n } catch (error) {\n console.warn(\n `[workflow] Failed waiting for deferred route build for ${filename}, using stub output`,\n error\n );\n }\n }\n return { code: normalizedSource, map: sourceMap };\n }\n\n // Detect workflow patterns in the source code.\n const patterns = await detectPatterns(sourceForTransform);\n // Always notify discovery tracking, even for `false/false`, so files that\n // previously had workflow/step usage are removed from the tracked sets.\n const nextPatternState: DiscoveredPatternState = {\n hasWorkflow: patterns.hasUseWorkflow,\n hasStep: patterns.hasUseStep,\n hasSerde: patterns.hasSerde,\n };\n const { shouldNotify } = updateDiscoveredPatternState(\n filename,\n nextPatternState\n );\n if (shouldNotify) {\n await notifySocketServer(\n filename,\n nextPatternState.hasWorkflow,\n nextPatternState.hasStep,\n nextPatternState.hasSerde\n );\n }\n\n // Check if file needs transformation based on patterns and path\n if (!(await checkShouldTransform(filename, patterns))) {\n return { code: normalizedSource, map: sourceMap };\n }\n\n const isTypeScript =\n filename.endsWith('.ts') ||\n filename.endsWith('.tsx') ||\n filename.endsWith('.mts') ||\n filename.endsWith('.cts');\n\n // Calculate relative filename for SWC plugin\n // The SWC plugin uses filename to generate workflowId, so it must be relative\n const relativeFilename = await getRelativeFilenameForSwc(\n filename,\n workingDir\n );\n\n // Get decorator options from tsconfig (cached per working directory)\n const { options: decoratorOptions, configPath } =\n await getDecoratorOptions(workingDir);\n if (configPath) {\n registerFileDependency(this, configPath);\n }\n\n // Resolve module specifier for packages (node_modules or workspace packages)\n const moduleSpecifier = await getModuleSpecifier(filename, workingDir);\n const mode = 'step';\n\n // Transform with SWC\n const result = await transform(sourceForTransform, {\n filename: relativeFilename,\n jsc: {\n parser: {\n ...(isTypeScript\n ? {\n syntax: 'typescript',\n tsx: filename.endsWith('.tsx'),\n decorators: decoratorOptions.decorators,\n }\n : {\n syntax: 'ecmascript',\n jsx: filename.endsWith('.jsx'),\n decorators: decoratorOptions.decorators,\n }),\n },\n target: 'es2022',\n experimental: {\n plugins: [[swcPluginPath, { mode, moduleSpecifier }]],\n },\n transform: {\n react: {\n runtime: 'preserve',\n },\n legacyDecorator: decoratorOptions.legacyDecorator,\n decoratorMetadata: decoratorOptions.decoratorMetadata,\n },\n },\n minify: false,\n inputSourceMap: sourceMap,\n sourceMaps: true,\n inlineSourcesContent: true,\n });\n\n let transformedMap = sourceMap;\n if (typeof result.map === 'string') {\n try {\n transformedMap = JSON.parse(result.map);\n } catch {\n transformedMap = result.map;\n }\n } else if (result.map) {\n transformedMap = result.map;\n }\n\n return { code: result.code, map: transformedMap };\n };\n\n if (!callback) {\n return run().then((result) => result.code);\n }\n\n void run()\n .then((result) => callback(null, result.code, result.map))\n .catch((error: unknown) => {\n callback(error instanceof Error ? error : new Error(String(error)));\n });\n}\n"]}
|
package/dist/socket-server.d.ts
CHANGED
|
@@ -28,6 +28,26 @@ export interface SocketIO {
|
|
|
28
28
|
emit(event: 'build-complete'): void;
|
|
29
29
|
getAuthToken(): string;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Filename for the socket-info file.
|
|
33
|
+
*/
|
|
34
|
+
export declare const SOCKET_INFO_FILENAME = "workflow-socket.json";
|
|
35
|
+
/**
|
|
36
|
+
* Previous filesystem location for the socket-info file. This file lives
|
|
37
|
+
* inside `.next/cache/`, which Vercel and Turborepo preserve across builds —
|
|
38
|
+
* a stale file from a prior build would cause the loader to attempt to
|
|
39
|
+
* connect to a dead port (ECONNREFUSED). The current location is a sibling
|
|
40
|
+
* of `cache/` so it isn't preserved.
|
|
41
|
+
*
|
|
42
|
+
* Exported so the builders can unlink the legacy path at boot, cleaning up
|
|
43
|
+
* any leftover file written by older versions of the SDK.
|
|
44
|
+
*/
|
|
45
|
+
export declare const LEGACY_SOCKET_INFO_RELATIVE_PATH: string;
|
|
46
|
+
/**
|
|
47
|
+
* Remove any stale socket-info files at boot.
|
|
48
|
+
* @param distDir absolute path to the project's `.next` directory.
|
|
49
|
+
*/
|
|
50
|
+
export declare function cleanupStaleSocketInfoFiles(distDir: string): Promise<void>;
|
|
31
51
|
/**
|
|
32
52
|
* Serialize a message with authentication preamble
|
|
33
53
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-server.d.ts","sourceRoot":"","sources":["../src/socket-server.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,GACD;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,CAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,KACd,IAAI,CAAC;IACV,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,YAAY,IAAI,MAAM,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"socket-server.d.ts","sourceRoot":"","sources":["../src/socket-server.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,GACD;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,CAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,KACd,IAAI,CAAC;IACV,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,YAAY,IAAI,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAE3D;;;;;;;;;GASG;AACH,eAAO,MAAM,gCAAgC,QAG5C,CAAC;AAMF;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAChB,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,aAAa,GAAG,IAAI,CAoCtB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,QAAQ,CAAC,CAoGnB"}
|
package/dist/socket-server.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LEGACY_SOCKET_INFO_RELATIVE_PATH = exports.SOCKET_INFO_FILENAME = void 0;
|
|
4
|
+
exports.cleanupStaleSocketInfoFiles = cleanupStaleSocketInfoFiles;
|
|
3
5
|
exports.serializeMessage = serializeMessage;
|
|
4
6
|
exports.parseMessage = parseMessage;
|
|
5
7
|
exports.createSocketServer = createSocketServer;
|
|
@@ -19,8 +21,33 @@ const MESSAGE_PREAMBLE = 'WF:';
|
|
|
19
21
|
function generateAuthToken() {
|
|
20
22
|
return (0, node_crypto_1.randomBytes)(16).toString('hex');
|
|
21
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Filename for the socket-info file.
|
|
26
|
+
*/
|
|
27
|
+
exports.SOCKET_INFO_FILENAME = 'workflow-socket.json';
|
|
28
|
+
/**
|
|
29
|
+
* Previous filesystem location for the socket-info file. This file lives
|
|
30
|
+
* inside `.next/cache/`, which Vercel and Turborepo preserve across builds —
|
|
31
|
+
* a stale file from a prior build would cause the loader to attempt to
|
|
32
|
+
* connect to a dead port (ECONNREFUSED). The current location is a sibling
|
|
33
|
+
* of `cache/` so it isn't preserved.
|
|
34
|
+
*
|
|
35
|
+
* Exported so the builders can unlink the legacy path at boot, cleaning up
|
|
36
|
+
* any leftover file written by older versions of the SDK.
|
|
37
|
+
*/
|
|
38
|
+
exports.LEGACY_SOCKET_INFO_RELATIVE_PATH = (0, node_path_1.join)('cache', exports.SOCKET_INFO_FILENAME);
|
|
22
39
|
function getDefaultSocketInfoFilePath() {
|
|
23
|
-
return (0, node_path_1.join)(process.cwd(), '.next',
|
|
40
|
+
return (0, node_path_1.join)(process.cwd(), '.next', exports.SOCKET_INFO_FILENAME);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Remove any stale socket-info files at boot.
|
|
44
|
+
* @param distDir absolute path to the project's `.next` directory.
|
|
45
|
+
*/
|
|
46
|
+
async function cleanupStaleSocketInfoFiles(distDir) {
|
|
47
|
+
await Promise.all([
|
|
48
|
+
(0, promises_1.rm)((0, node_path_1.join)(distDir, exports.SOCKET_INFO_FILENAME), { force: true }),
|
|
49
|
+
(0, promises_1.rm)((0, node_path_1.join)(distDir, exports.LEGACY_SOCKET_INFO_RELATIVE_PATH), { force: true }),
|
|
50
|
+
]);
|
|
24
51
|
}
|
|
25
52
|
/**
|
|
26
53
|
* Serialize a message with authentication preamble
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-server.js","sourceRoot":"","sources":["../src/socket-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { createServer, type Server, type Socket } from 'node:net';\nimport { dirname, join } from 'node:path';\n\n/**\n * Magic preamble that must prefix all messages to authenticate them as workflow messages.\n * This prevents accidental processing of messages from port scanners or other local processes.\n */\nconst MESSAGE_PREAMBLE = 'WF:';\n\n/**\n * Generate a random authentication token for this server session.\n * Clients must include this token in all messages.\n */\nfunction generateAuthToken(): string {\n return randomBytes(16).toString('hex');\n}\n\n/**\n * Message types that can be sent between loader and builder\n */\nexport type SocketMessage =\n | {\n type: 'file-discovered';\n filePath: string;\n hasWorkflow: boolean;\n hasStep: boolean;\n hasSerde: boolean;\n }\n | { type: 'trigger-build' }\n | { type: 'build-complete' };\n\n/**\n * Configuration for the socket server\n */\nexport interface SocketServerConfig {\n isDevServer: boolean;\n onFileDiscovered: (\n filePath: string,\n hasWorkflow: boolean,\n hasStep: boolean,\n hasSerde: boolean\n ) => void;\n onTriggerBuild: () => void;\n socketInfoFilePath?: string;\n}\n\n/**\n * Interface for the socket IO instance returned by createSocketServer\n */\nexport interface SocketIO {\n emit(event: 'build-complete'): void;\n getAuthToken(): string;\n}\n\nfunction getDefaultSocketInfoFilePath(): string {\n return join(process.cwd(), '.next', 'cache', 'workflow-socket.json');\n}\n\n/**\n * Serialize a message with authentication preamble\n */\nexport function serializeMessage(\n message: SocketMessage,\n authToken: string\n): string {\n return `${MESSAGE_PREAMBLE}${authToken}:${JSON.stringify(message)}\\n`;\n}\n\n/**\n * Parse and authenticate a message from the socket\n * Returns the parsed message if valid, null otherwise\n */\nexport function parseMessage(\n line: string,\n authToken: string\n): SocketMessage | null {\n const trimmed = line.trim();\n if (!trimmed) {\n return null;\n }\n\n // Check for preamble\n if (!trimmed.startsWith(MESSAGE_PREAMBLE)) {\n console.warn('Received message without valid preamble, ignoring');\n return null;\n }\n\n // Extract auth token and payload\n const withoutPreamble = trimmed.slice(MESSAGE_PREAMBLE.length);\n const colonIndex = withoutPreamble.indexOf(':');\n if (colonIndex === -1) {\n console.warn('Received message without auth token separator, ignoring');\n return null;\n }\n\n const messageToken = withoutPreamble.slice(0, colonIndex);\n const payload = withoutPreamble.slice(colonIndex + 1);\n\n // Verify auth token\n if (messageToken !== authToken) {\n console.warn('Received message with invalid auth token, ignoring');\n return null;\n }\n\n // Parse JSON payload\n try {\n return JSON.parse(payload) as SocketMessage;\n } catch (error) {\n console.error('Failed to parse socket message JSON:', error);\n return null;\n }\n}\n\n/**\n * Create a TCP socket server for loader<->builder communication.\n * Returns a SocketIO interface for broadcasting messages and the auth token.\n *\n * SECURITY: Server listens on 127.0.0.1 (localhost only) and uses\n * message authentication to prevent processing of unauthorized messages.\n */\nexport async function createSocketServer(\n config: SocketServerConfig\n): Promise<SocketIO> {\n const authToken = generateAuthToken();\n const clients = new Set<Socket>();\n let buildTriggered = false;\n\n const server: Server = createServer((socket: Socket) => {\n socket.setNoDelay(true);\n clients.add(socket);\n\n // Send build-complete if build already finished (production mode)\n if (buildTriggered && !config.isDevServer) {\n socket.write(serializeMessage({ type: 'build-complete' }, authToken));\n }\n\n let buffer = '';\n\n socket.on('data', (data: Buffer) => {\n buffer += data.toString();\n\n // Process complete messages (newline-delimited)\n let newlineIndex = buffer.indexOf('\\n');\n while (newlineIndex !== -1) {\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n newlineIndex = buffer.indexOf('\\n');\n\n const message = parseMessage(line, authToken);\n if (!message) {\n continue;\n }\n\n if (message.type === 'file-discovered') {\n config.onFileDiscovered(\n message.filePath,\n message.hasWorkflow,\n message.hasStep,\n message.hasSerde\n );\n } else if (message.type === 'trigger-build') {\n config.onTriggerBuild();\n }\n }\n });\n\n socket.on('end', () => {\n clients.delete(socket);\n });\n\n socket.on('error', (err: Error) => {\n console.error('Socket error:', err);\n clients.delete(socket);\n });\n });\n\n // Listen on random available port (localhost only)\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', () => {\n const address = server.address();\n if (address && typeof address === 'object') {\n const socketInfoFilePath =\n config.socketInfoFilePath || getDefaultSocketInfoFilePath();\n void (async () => {\n try {\n await mkdir(dirname(socketInfoFilePath), { recursive: true });\n await writeFile(\n socketInfoFilePath,\n JSON.stringify(\n {\n port: address.port,\n authToken,\n },\n null,\n 2\n )\n );\n process.env.WORKFLOW_SOCKET_INFO_PATH = socketInfoFilePath;\n process.env.WORKFLOW_SOCKET_PORT = String(address.port);\n process.env.WORKFLOW_SOCKET_AUTH = authToken;\n resolve();\n } catch (error) {\n reject(error);\n }\n })();\n return;\n }\n reject(new Error('Failed to obtain workflow socket server address'));\n });\n });\n\n return {\n emit: (_event: 'build-complete') => {\n buildTriggered = true;\n const message = serializeMessage({ type: 'build-complete' }, authToken);\n for (const client of clients) {\n client.write(message);\n }\n },\n getAuthToken: () => authToken,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"socket-server.js","sourceRoot":"","sources":["../src/socket-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { mkdir, rm, writeFile } from 'node:fs/promises';\nimport { createServer, type Server, type Socket } from 'node:net';\nimport { dirname, join } from 'node:path';\n\n/**\n * Magic preamble that must prefix all messages to authenticate them as workflow messages.\n * This prevents accidental processing of messages from port scanners or other local processes.\n */\nconst MESSAGE_PREAMBLE = 'WF:';\n\n/**\n * Generate a random authentication token for this server session.\n * Clients must include this token in all messages.\n */\nfunction generateAuthToken(): string {\n return randomBytes(16).toString('hex');\n}\n\n/**\n * Message types that can be sent between loader and builder\n */\nexport type SocketMessage =\n | {\n type: 'file-discovered';\n filePath: string;\n hasWorkflow: boolean;\n hasStep: boolean;\n hasSerde: boolean;\n }\n | { type: 'trigger-build' }\n | { type: 'build-complete' };\n\n/**\n * Configuration for the socket server\n */\nexport interface SocketServerConfig {\n isDevServer: boolean;\n onFileDiscovered: (\n filePath: string,\n hasWorkflow: boolean,\n hasStep: boolean,\n hasSerde: boolean\n ) => void;\n onTriggerBuild: () => void;\n socketInfoFilePath?: string;\n}\n\n/**\n * Interface for the socket IO instance returned by createSocketServer\n */\nexport interface SocketIO {\n emit(event: 'build-complete'): void;\n getAuthToken(): string;\n}\n\n/**\n * Filename for the socket-info file.\n */\nexport const SOCKET_INFO_FILENAME = 'workflow-socket.json';\n\n/**\n * Previous filesystem location for the socket-info file. This file lives\n * inside `.next/cache/`, which Vercel and Turborepo preserve across builds —\n * a stale file from a prior build would cause the loader to attempt to\n * connect to a dead port (ECONNREFUSED). The current location is a sibling\n * of `cache/` so it isn't preserved.\n *\n * Exported so the builders can unlink the legacy path at boot, cleaning up\n * any leftover file written by older versions of the SDK.\n */\nexport const LEGACY_SOCKET_INFO_RELATIVE_PATH = join(\n 'cache',\n SOCKET_INFO_FILENAME\n);\n\nfunction getDefaultSocketInfoFilePath(): string {\n return join(process.cwd(), '.next', SOCKET_INFO_FILENAME);\n}\n\n/**\n * Remove any stale socket-info files at boot.\n * @param distDir absolute path to the project's `.next` directory.\n */\nexport async function cleanupStaleSocketInfoFiles(\n distDir: string\n): Promise<void> {\n await Promise.all([\n rm(join(distDir, SOCKET_INFO_FILENAME), { force: true }),\n rm(join(distDir, LEGACY_SOCKET_INFO_RELATIVE_PATH), { force: true }),\n ]);\n}\n\n/**\n * Serialize a message with authentication preamble\n */\nexport function serializeMessage(\n message: SocketMessage,\n authToken: string\n): string {\n return `${MESSAGE_PREAMBLE}${authToken}:${JSON.stringify(message)}\\n`;\n}\n\n/**\n * Parse and authenticate a message from the socket\n * Returns the parsed message if valid, null otherwise\n */\nexport function parseMessage(\n line: string,\n authToken: string\n): SocketMessage | null {\n const trimmed = line.trim();\n if (!trimmed) {\n return null;\n }\n\n // Check for preamble\n if (!trimmed.startsWith(MESSAGE_PREAMBLE)) {\n console.warn('Received message without valid preamble, ignoring');\n return null;\n }\n\n // Extract auth token and payload\n const withoutPreamble = trimmed.slice(MESSAGE_PREAMBLE.length);\n const colonIndex = withoutPreamble.indexOf(':');\n if (colonIndex === -1) {\n console.warn('Received message without auth token separator, ignoring');\n return null;\n }\n\n const messageToken = withoutPreamble.slice(0, colonIndex);\n const payload = withoutPreamble.slice(colonIndex + 1);\n\n // Verify auth token\n if (messageToken !== authToken) {\n console.warn('Received message with invalid auth token, ignoring');\n return null;\n }\n\n // Parse JSON payload\n try {\n return JSON.parse(payload) as SocketMessage;\n } catch (error) {\n console.error('Failed to parse socket message JSON:', error);\n return null;\n }\n}\n\n/**\n * Create a TCP socket server for loader<->builder communication.\n * Returns a SocketIO interface for broadcasting messages and the auth token.\n *\n * SECURITY: Server listens on 127.0.0.1 (localhost only) and uses\n * message authentication to prevent processing of unauthorized messages.\n */\nexport async function createSocketServer(\n config: SocketServerConfig\n): Promise<SocketIO> {\n const authToken = generateAuthToken();\n const clients = new Set<Socket>();\n let buildTriggered = false;\n\n const server: Server = createServer((socket: Socket) => {\n socket.setNoDelay(true);\n clients.add(socket);\n\n // Send build-complete if build already finished (production mode)\n if (buildTriggered && !config.isDevServer) {\n socket.write(serializeMessage({ type: 'build-complete' }, authToken));\n }\n\n let buffer = '';\n\n socket.on('data', (data: Buffer) => {\n buffer += data.toString();\n\n // Process complete messages (newline-delimited)\n let newlineIndex = buffer.indexOf('\\n');\n while (newlineIndex !== -1) {\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n newlineIndex = buffer.indexOf('\\n');\n\n const message = parseMessage(line, authToken);\n if (!message) {\n continue;\n }\n\n if (message.type === 'file-discovered') {\n config.onFileDiscovered(\n message.filePath,\n message.hasWorkflow,\n message.hasStep,\n message.hasSerde\n );\n } else if (message.type === 'trigger-build') {\n config.onTriggerBuild();\n }\n }\n });\n\n socket.on('end', () => {\n clients.delete(socket);\n });\n\n socket.on('error', (err: Error) => {\n console.error('Socket error:', err);\n clients.delete(socket);\n });\n });\n\n // Listen on random available port (localhost only)\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', () => {\n const address = server.address();\n if (address && typeof address === 'object') {\n const socketInfoFilePath =\n config.socketInfoFilePath || getDefaultSocketInfoFilePath();\n void (async () => {\n try {\n await mkdir(dirname(socketInfoFilePath), { recursive: true });\n await writeFile(\n socketInfoFilePath,\n JSON.stringify(\n {\n port: address.port,\n authToken,\n },\n null,\n 2\n )\n );\n process.env.WORKFLOW_SOCKET_INFO_PATH = socketInfoFilePath;\n process.env.WORKFLOW_SOCKET_PORT = String(address.port);\n process.env.WORKFLOW_SOCKET_AUTH = authToken;\n resolve();\n } catch (error) {\n reject(error);\n }\n })();\n return;\n }\n reject(new Error('Failed to obtain workflow socket server address'));\n });\n });\n\n return {\n emit: (_event: 'build-complete') => {\n buildTriggered = true;\n const message = serializeMessage({ type: 'build-complete' }, authToken);\n for (const client of clients) {\n client.write(message);\n }\n },\n getAuthToken: () => authToken,\n };\n}\n"]}
|
package/docs/next.mdx
CHANGED
|
@@ -75,9 +75,9 @@ To enable helpful hints in your IDE, setup the workflow plugin in `tsconfig.json
|
|
|
75
75
|
</Accordion>
|
|
76
76
|
|
|
77
77
|
<Accordion type="single" collapsible>
|
|
78
|
-
<AccordionItem value="
|
|
78
|
+
<AccordionItem value="configure-proxy-handler" className="[&_h3]:my-0">
|
|
79
79
|
<AccordionTrigger className="text-sm">
|
|
80
|
-
|
|
80
|
+
<h3 id="configure-proxy-handler">Configure Proxy Handler (if applicable)</h3>
|
|
81
81
|
</AccordionTrigger>
|
|
82
82
|
<AccordionContent className="[&_p]:my-2">
|
|
83
83
|
|
|
@@ -85,7 +85,9 @@ If your Next.js app has a [proxy handler](https://nextjs.org/docs/app/api-refere
|
|
|
85
85
|
(formerly known as "middleware"), you'll need to update the matcher pattern to exclude Workflow's
|
|
86
86
|
internal paths to prevent the proxy handler from running on them.
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
If you see `[local world] Queue operation failed` with `Cannot perform ArrayBuffer.prototype.slice on a detached ArrayBuffer`, your proxy matcher is still intercepting Workflow's internal `POST /.well-known/workflow/v1/flow` request. This is especially easy to miss in Next.js 16, where `proxy.ts` replaced `middleware.ts`.
|
|
89
|
+
|
|
90
|
+
Add `.well-known/workflow/*` to your matcher exclusion list:
|
|
89
91
|
|
|
90
92
|
```typescript title="proxy.ts" lineNumbers
|
|
91
93
|
import { NextResponse } from "next/server";
|