@gigadrive/network-config 5.5.2 → 5.5.4

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/nextjs-adapter.ts","../src/manifest-schema.ts","../src/nextjs-constants.ts"],"sourcesContent":["import { Schema } from 'effect';\nimport type { NextAdapter } from 'next';\nimport { access, mkdir, readFile, realpath, stat, writeFile } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { StaticAssetHeaders, StaticAssetManifestEntry, StaticAssetManifestV1 } from './asset-manifest';\nimport type { NormalizedImagePolicy } from './image-policy';\nimport { decodeJson, decodeUnknown, HttpHeadersSchema } from './manifest-schema';\nimport { MAXIMUM_ENTRY_PAGE_PATHS } from './nextjs-constants';\nimport type {\n GigadriveNextBuildManifestV1,\n GigadriveNextBuildManifestV2Export,\n GigadriveNextBuildManifestV2Standalone,\n GigadriveNextPrerenderManifestV1,\n GigadriveNextPrerenderOutput,\n GigadriveNextServerDescriptor,\n GigadriveNextStaticAssetPrefix,\n JsonValue,\n} from './nextjs-manifest';\n\ntype BuildCompleteContext = Parameters<NonNullable<NextAdapter['onBuildComplete']>>[0];\ntype NextRouteOutput =\n | BuildCompleteContext['outputs']['pages'][number]\n | BuildCompleteContext['outputs']['pagesApi'][number]\n | BuildCompleteContext['outputs']['appPages'][number]\n | BuildCompleteContext['outputs']['appRoutes'][number]\n | NonNullable<BuildCompleteContext['outputs']['middleware']>;\ntype NextPrerenderOutput = BuildCompleteContext['outputs']['prerenders'][number];\ntype NextStaticFileOutput = BuildCompleteContext['outputs']['staticFiles'][number];\n\nconst PRODUCTION_BUILD_PHASE = 'phase-production-build';\nconst NEXT_ASSET_MANIFEST_PATH = '.gigadrive/assets/nextjs.json';\nconst NEXT_PRERENDER_MANIFEST_PATH = '.gigadrive/nextjs-prerenders.json';\nconst HTML_CONTENT_TYPE = 'text/html; charset=utf-8';\nconst DEFAULT_RSC_CONTENT_TYPE = 'text/x-component';\nconst INTERNAL_STATIC_RESPONSE_HEADERS = new Set(['x-next-cache-tags', 'x-nextjs-prerender']);\nconst NextStaticFileMetaSchema = Schema.Struct({\n status: Schema.optional(Schema.Int.pipe(Schema.between(100, 599))),\n headers: Schema.mutable(Schema.Record({ key: Schema.String, value: Schema.Unknown })),\n});\nconst runtimeDirectory = typeof __dirname === 'string' ? __dirname : path.dirname(fileURLToPath(import.meta.url));\n\nconst runtimeModulePath = (environmentName: string, fileName: string): string =>\n process.env[environmentName] ?? path.join(runtimeDirectory, fileName);\n\nconst CACHE_HANDLER_PATH = () => runtimeModulePath('GIGADRIVE_NEXT_CACHE_HANDLER_PATH', 'nextjs-cache-handler.js');\nconst CACHE_COMPONENTS_HANDLER_PATH = () =>\n runtimeModulePath('GIGADRIVE_NEXT_CACHE_COMPONENTS_HANDLER_PATH', 'nextjs-cache-components-handler.js');\nconst IMAGE_LOADER_PATH = () => runtimeModulePath('GIGADRIVE_NEXT_IMAGE_LOADER_PATH', 'nextjs-image-loader.js');\n\nconst toJsonValue = (value: unknown): JsonValue => {\n const serialized = JSON.stringify(value);\n return serialized === undefined ? null : (JSON.parse(serialized) as JsonValue);\n};\n\n/**\n * Next 16.2 introduced the adapter hooks (`modifyConfig` + `onBuildComplete`) and\n * the `cacheHandler`/`cacheHandlers`/`cacheComponents` config fields we inject.\n * Earlier releases keep the legacy standalone-only behavior with no injection.\n */\nconst supportsManagedRuntime = (nextVersion: string | undefined): boolean => {\n if (!nextVersion) return false;\n const [majorPart, minorPart] = nextVersion.split('.');\n const major = Number.parseInt(majorPart ?? '', 10);\n const minor = Number.parseInt(minorPart ?? '', 10);\n return Number.isFinite(major) && Number.isFinite(minor) && (major > 16 || (major === 16 && minor >= 2));\n};\n\n/**\n * Highest Next major validated to allow `output: 'standalone'` together with an\n * adapter. Next's own build source warns the combination \"might not be allowed\"\n * in a future release. We always emit `output: 'standalone'` on the managed path\n * (there is no per-route fallback to degrade to), so if a future major forbids\n * it the build fails loudly at `next build` rather than silently misdeploying.\n * The network canary drift test tracks releases past this bound.\n */\nconst MANAGED_STANDALONE_VALIDATED_MAX_MAJOR = 16;\n\nconst toPortableRelativePath = (from: string, to: string, allowCurrentDirectory = false): string => {\n const resolvedFrom = path.resolve(from);\n const resolvedTo = path.resolve(path.isAbsolute(to) ? to : path.join(from, to));\n const relativePath = path.relative(resolvedFrom, resolvedTo).replaceAll(path.sep, '/');\n const normalized = relativePath === '' ? '.' : relativePath;\n if (\n (!allowCurrentDirectory && normalized === '.') ||\n normalized.startsWith('/') ||\n /^[A-Za-z]:/.test(normalized) ||\n normalized.split('/').some((segment) => segment === '..')\n ) {\n throw new Error(`Next.js adapter output is outside the repository root: ${to}`);\n }\n return normalized;\n};\n\nasync function resolveReadablePath(repoRoot: string, filePath: string, resolvedRoot?: string) {\n const absolutePath = path.resolve(path.isAbsolute(filePath) ? filePath : path.join(repoRoot, filePath));\n const portablePath = toPortableRelativePath(repoRoot, absolutePath);\n await access(absolutePath);\n // Validate the symlink-resolved location as well; the call throws when the\n // real path escapes the repository root.\n const resolvedPath = await realpath(absolutePath);\n void toPortableRelativePath(resolvedRoot ?? (await realpath(repoRoot)), resolvedPath);\n const fileStat = await stat(absolutePath);\n return { portablePath, fileStat };\n}\n\nasync function requireReadableFile(repoRoot: string, filePath: string, resolvedRoot?: string): Promise<string> {\n const { portablePath, fileStat } = await resolveReadablePath(repoRoot, filePath, resolvedRoot);\n if (!fileStat.isFile()) throw new Error(`Next.js adapter output is not a readable file: ${filePath}`);\n return portablePath;\n}\n\nasync function mapInBatches<Input, Output>(\n values: Input[],\n mapper: (value: Input) => Promise<Output>,\n batchSize = 64\n): Promise<Output[]> {\n const results: Output[] = [];\n for (let index = 0; index < values.length; index += batchSize) {\n results.push(...(await Promise.all(values.slice(index, index + batchSize).map((value) => mapper(value)))));\n }\n return results;\n}\n\nconst isInsideDirectory = (directory: string, filePath: string): boolean => {\n const relativePath = path.relative(path.resolve(directory), path.resolve(filePath));\n return relativePath !== '' && !relativePath.startsWith('..') && !path.isAbsolute(relativePath);\n};\n\nconst isDynamicRoutePathname = (pathname: string): boolean => pathname.includes('[');\n\n// Next reports the Pages Router root as `<basePath>/index`, while its public URL\n// is the base path itself (or `/` when no base path is configured).\nconst normalizeStaticFilePathname = (pathname: string, basePath: string): string =>\n pathname === `${basePath}/index` ? basePath || '/' : pathname;\n\nconst getStaticStatus = (pathname: string, basePath: string, locales: readonly string[]): number | undefined => {\n const routePathname = basePath && pathname.startsWith(`${basePath}/`) ? pathname.slice(basePath.length) : pathname;\n const segments = routePathname.split('/').filter(Boolean);\n const [firstSegment, secondSegment] = segments;\n const statusPage =\n segments.length === 1\n ? firstSegment\n : segments.length === 2 && firstSegment && locales.includes(firstSegment)\n ? secondSegment\n : undefined;\n return statusPage === '404' ? 404 : statusPage === '500' ? 500 : undefined;\n};\n\nconst hasContentType = (headers: StaticAssetHeaders): boolean =>\n Object.keys(headers).some((name) => name.toLowerCase() === 'content-type');\n\nconst getPublicStaticResponseHeaders = (headers: Record<string, unknown>): StaticAssetHeaders | undefined => {\n const publicHeaders = Object.fromEntries(\n Object.entries(headers).filter(([name]) => !INTERNAL_STATIC_RESPONSE_HEADERS.has(name.toLowerCase()))\n );\n return decodeUnknown(HttpHeadersSchema, publicHeaders);\n};\n\nasync function getStaticFileResponseMetadata(\n projectDir: string,\n resolvedProjectDir: string,\n output: NextStaticFileOutput,\n rscContentType: string,\n basePath: string,\n locales: readonly string[]\n): Promise<Pick<StaticAssetManifestEntry, 'status' | 'headers'> | undefined> {\n if (output.filePath.endsWith('.body')) {\n const metaPath = `${output.filePath.slice(0, -'.body'.length)}.meta`;\n await requireReadableFile(projectDir, metaPath, resolvedProjectDir);\n const meta = decodeJson(NextStaticFileMetaSchema, await readFile(metaPath, 'utf8'));\n const headers = meta ? getPublicStaticResponseHeaders(meta.headers) : undefined;\n if (!meta || !headers || !hasContentType(headers)) return undefined;\n return {\n ...(meta.status !== undefined ? { status: meta.status } : {}),\n headers,\n };\n }\n if (output.filePath.endsWith('.html')) {\n const status = getStaticStatus(output.pathname, basePath, locales);\n return {\n ...(status !== undefined ? { status } : {}),\n headers: { 'content-type': HTML_CONTENT_TYPE },\n };\n }\n if (output.pathname.endsWith('.rsc')) return { headers: { 'content-type': rscContentType } };\n return {};\n}\n\nconst serializeStaticFileAsset = async (\n projectDir: string,\n resolvedProjectDir: string,\n basePath: string,\n rscContentType: string,\n locales: readonly string[],\n output: NextStaticFileOutput\n): Promise<StaticAssetManifestEntry | undefined> => {\n const [source, responseMetadata] = await Promise.all([\n requireReadableFile(projectDir, output.filePath, resolvedProjectDir),\n getStaticFileResponseMetadata(projectDir, resolvedProjectDir, output, rscContentType, basePath, locales),\n ]);\n if (!responseMetadata) return undefined;\n return {\n source,\n path: normalizeStaticFilePathname(output.pathname, basePath),\n ...responseMetadata,\n ...(output.immutableHash ? { immutable: true } : {}),\n };\n};\n\nasync function serializeAssetManifest(\n projectDir: string,\n resolvedProjectDir: string,\n distDir: string,\n basePath: string,\n rscContentType: string,\n locales: readonly string[],\n staticFiles: NextStaticFileOutput[]\n): Promise<StaticAssetManifestV1> {\n const staticDirectory = path.join(distDir, 'static');\n const staticEntries = await mapInBatches(\n staticFiles.filter(\n // The complete immutable subtree is already represented by a prefix.\n (output) => !isInsideDirectory(staticDirectory, output.filePath) && !isDynamicRoutePathname(output.pathname)\n ),\n (output) => serializeStaticFileAsset(projectDir, resolvedProjectDir, basePath, rscContentType, locales, output)\n );\n const assetsByPath = new Map<string, StaticAssetManifestEntry>();\n for (const entry of staticEntries) {\n if (!entry) continue;\n if (assetsByPath.has(entry.path)) throw new Error(`Duplicate Next.js static asset path: ${entry.path}`);\n assetsByPath.set(entry.path, entry);\n }\n return { version: 1, assets: [...assetsByPath.values()] };\n}\n\nconst getEntryPagePaths = (prerenders: GigadriveNextPrerenderOutput[]): string[] =>\n [\n ...new Set(\n prerenders\n .filter((output) => output.fallback?.postponedState === undefined)\n .map((output) => output.pathname)\n .filter((pathname) => pathname.startsWith('/') && !isDynamicRoutePathname(pathname))\n ),\n ]\n .sort((left, right) => left.split('/').length - right.split('/').length || left.localeCompare(right))\n .slice(0, MAXIMUM_ENTRY_PAGE_PATHS);\n\nconst NextPrerenderMetaSchema = Schema.Struct({\n routeCache: Schema.optional(Schema.Struct({ key: Schema.String })),\n});\n\n/**\n * Reads the runtime cache key Next recorded beside a prerender's HTML. Newer\n * Next versions scope keys by source route, so the pathname alone would miss the\n * entry. Using Next's own value avoids depending on how a version builds it.\n */\nconst readPrerenderCacheKey = async (repoRoot: string, htmlPath: string): Promise<string | undefined> => {\n if (!htmlPath.endsWith('.html')) return undefined;\n const metaPath = path.resolve(repoRoot, htmlPath.replace(/\\.html$/, '.meta'));\n const content = await readFile(metaPath, 'utf8').catch(() => undefined);\n return content === undefined ? undefined : decodeJson(NextPrerenderMetaSchema, content)?.routeCache?.key;\n};\n\nconst serializePrerenderOutput = async (\n repoRoot: string,\n resolvedRepoRoot: string,\n output: NextPrerenderOutput\n): Promise<GigadriveNextPrerenderOutput> => {\n const { bypassFor, ...prerenderConfig } = output.config;\n const cacheKey = output.fallback?.filePath\n ? await readPrerenderCacheKey(repoRoot, output.fallback.filePath)\n : undefined;\n const serializedOutput = {\n id: output.id,\n type: 'PRERENDER' as const,\n pathname: output.pathname,\n ...(output.route !== undefined ? { route: output.route } : {}),\n parentOutputId: output.parentOutputId,\n groupId: output.groupId,\n ...(cacheKey !== undefined ? { cacheKey } : {}),\n ...(output.pprChain ? { pprChain: output.pprChain } : {}),\n ...(output.parentFallbackMode !== undefined ? { parentFallbackMode: toJsonValue(output.parentFallbackMode) } : {}),\n ...(output.fallback\n ? {\n fallback: {\n ...(output.fallback.filePath\n ? { filePath: await requireReadableFile(repoRoot, output.fallback.filePath, resolvedRepoRoot) }\n : {}),\n ...(output.fallback.initialStatus !== undefined ? { initialStatus: output.fallback.initialStatus } : {}),\n ...(output.fallback.initialHeaders ? { initialHeaders: output.fallback.initialHeaders } : {}),\n ...(output.fallback.initialExpiration !== undefined\n ? { initialExpiration: output.fallback.initialExpiration }\n : {}),\n ...(output.fallback.initialRevalidate !== undefined\n ? { initialRevalidate: output.fallback.initialRevalidate }\n : {}),\n ...(output.fallback.postponedState !== undefined ? { postponedState: output.fallback.postponedState } : {}),\n },\n }\n : {}),\n config: {\n ...prerenderConfig,\n ...(bypassFor ? { bypassFor: toJsonValue(bypassFor) as JsonValue[] } : {}),\n },\n };\n if (output.routeType !== undefined) {\n return {\n ...serializedOutput,\n routeType: output.routeType,\n response: output.response,\n compute: output.compute,\n ...(output.htmlSize !== undefined ? { htmlSize: output.htmlSize } : {}),\n };\n }\n return serializedOutput;\n};\n\n/**\n * Collapses per-route runtime config onto the one standalone server. `maxDuration`\n * becomes the max across routes (one function honors one limit); `env` is the union\n * of every route's declared env (the single server runs them all in-process).\n */\nconst aggregateServerDescriptor = (outputs: NextRouteOutput[]): GigadriveNextServerDescriptor => {\n let maxDuration: number | undefined;\n const env: Record<string, string> = {};\n for (const output of outputs) {\n if (output.config.maxDuration !== undefined) {\n maxDuration = Math.max(maxDuration ?? 0, output.config.maxDuration);\n }\n if (output.config.env) Object.assign(env, output.config.env);\n }\n return {\n ...(maxDuration !== undefined ? { maxDuration } : {}),\n ...(Object.keys(env).length > 0 ? { env } : {}),\n };\n};\n\ntype CollectBuildTracesModule = {\n collectBuildTraces: (options: {\n dir: string;\n config: BuildCompleteContext['config'];\n distDir: string;\n edgeRuntimeRoutes: Record<string, never>;\n staticPages: string[];\n outputFileTracingRoot: string;\n }) => Promise<void>;\n};\n\n/**\n * Ignore globs that Turbopack's native server tracer applies on top of the\n * shared `collectBuildTraces` ignore list (see `ignores()` in Next's\n * `crates/next-api/src/next_server_nft.rs`). The JavaScript\n * `collectBuildTraces` fallback only carries the webpack-era ignores, so\n * tracing Next's server entries with it follows dev-only require edges —\n * `router-server` → `setup-dev-bundler` → hot reloaders → the application's\n * build toolchain (webpack, terser, esbuild, swc, babel plugins) — that\n * Turbopack severs natively, roughly quadrupling the standalone output.\n *\n * Passing these through `outputFileTracingExcludes['next-server']` reuses\n * `collectBuildTraces`' own extension point for the shared ignores, so they\n * apply during trace traversal exactly like Turbopack's graph-level ignores.\n * Only Next-internal dev/build-only modules are listed — never application\n * packages — so application dependencies are excluded solely when their every\n * require path runs through one of these modules, matching the native trace.\n * If a future Next release moves one of these files the glob simply stops\n * matching and the trace grows back; nothing breaks at runtime.\n */\nconst TURBOPACK_SERVER_TRACE_IGNORES = [\n // client components with a NODE_ENV guard the tracer cannot evaluate\n '**/next/dist/next-devtools/userspace/use-app-dev-rendering-indicator.js',\n '**/next/dist/client/dev/hot-reloader/app/hot-reloader-app.js',\n // server/lib/router-server.js requires this statically but only uses it in dev\n '**/next/dist/server/lib/router-utils/setup-dev-bundler.js',\n // server/next.js requires this statically but only uses it in dev\n '**/next/dist/server/dev/next-dev-server.js',\n // build-time-only browser support data pulled in via next/dist/compiled/babel*\n '**/next/dist/compiled/browserslist/**',\n '**/next/dist/compiled/jest-worker/**/*',\n '**/node_modules/react{,-dom,-server-dom-turbopack}/**/*.development.js',\n];\n\n/**\n * Next 16.3 stopped emitting the aggregated `next-server.js.nft.json` /\n * `next-minimal-server.js.nft.json` traces from Turbopack builds whenever an\n * adapter is configured, yet `next build` still runs the `output: 'standalone'`\n * writer after `onBuildComplete` — and that writer reads exactly this file, so\n * the build dies with ENOENT. Next 16.2 and all webpack builds still emit the\n * file, making this a no-op there. When the file is missing, regenerate both\n * aggregate traces with Next's own `collectBuildTraces` (the module the webpack\n * pipeline runs); without `buildTraceContext` it only writes the two aggregate\n * trace files and leaves Turbopack's per-entry traces untouched. The\n * regeneration also merges `TURBOPACK_SERVER_TRACE_IGNORES` into the config's\n * `outputFileTracingExcludes` so the fallback prunes the same dev-only require\n * edges as Turbopack's native tracer instead of dragging the application's\n * build toolchain into the standalone output.\n */\nasync function ensureStandaloneServerTraces(\n projectDir: string,\n repoRoot: string,\n distDir: string,\n config: BuildCompleteContext['config']\n): Promise<void> {\n const aggregateTracePath = path.join(distDir, 'next-server.js.nft.json');\n try {\n await access(aggregateTracePath);\n return;\n } catch {\n // Missing — Next will crash in its standalone writer unless we regenerate it.\n }\n let collectBuildTracesModule: CollectBuildTracesModule;\n try {\n const projectRequire = createRequire(path.join(projectDir, 'package.json'));\n collectBuildTracesModule = projectRequire('next/dist/build/collect-build-traces') as CollectBuildTracesModule;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Next.js did not emit ${aggregateTracePath} and the Gigadrive adapter could not load ` +\n `next/dist/build/collect-build-traces from the project to regenerate it: ${message}`\n );\n }\n const { outputFileTracingExcludes = {} } = config as {\n outputFileTracingExcludes?: Record<string, string[]>;\n };\n const tracingConfig = {\n ...config,\n outputFileTracingExcludes: {\n ...outputFileTracingExcludes,\n 'next-server': [...(outputFileTracingExcludes['next-server'] ?? []), ...TURBOPACK_SERVER_TRACE_IGNORES],\n },\n };\n try {\n await collectBuildTracesModule.collectBuildTraces({\n dir: projectDir,\n config: tracingConfig,\n distDir,\n edgeRuntimeRoutes: {},\n staticPages: [],\n outputFileTracingRoot: (config as { outputFileTracingRoot?: string }).outputFileTracingRoot ?? repoRoot,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Regenerating the Next.js standalone server traces (${aggregateTracePath}) failed: ${message}`);\n }\n}\n\nconst normalizeImages = (config: BuildCompleteContext['config']): NormalizedImagePolicy | undefined => {\n if (config.images.unoptimized) return undefined;\n return {\n localPatterns: config.images.localPatterns ?? [{ pathname: '/**' }],\n remotePatterns: config.images.remotePatterns.map((pattern) => {\n if (pattern instanceof URL) {\n return {\n protocol: pattern.protocol === 'http:' ? ('http' as const) : ('https' as const),\n hostname: pattern.hostname,\n port: pattern.port,\n pathname: pattern.pathname,\n search: pattern.search,\n };\n }\n return { ...pattern };\n }),\n widths: [...new Set([...config.images.deviceSizes, ...config.images.imageSizes])].sort((a, b) => a - b),\n heights: [],\n qualities: config.images.qualities ?? [75],\n formats: config.images.formats,\n minimumCacheTTL: config.images.minimumCacheTTL,\n dangerouslyAllowSVG: config.images.dangerouslyAllowSVG,\n contentSecurityPolicy: config.images.contentSecurityPolicy,\n contentDispositionType: config.images.contentDispositionType,\n maximumRedirects: config.images.maximumRedirects,\n maximumResponseBody: config.images.maximumResponseBody,\n variants: {},\n };\n};\n\n/**\n * Next.js deployment adapter used automatically by Gigadrive Network build workers.\n *\n * Next 16.2 and newer run the entire deployment as a single `output: 'standalone'`\n * server (one function per deployment) while the injected cache handlers, image\n * loader, and this hook's `onBuildComplete` metadata keep ISR, PPR, `use cache`,\n * and image optimization working through the platform's durable runtime-cache and\n * edge image services. Older releases retain the legacy standalone behavior without\n * the managed-runtime injections.\n */\nconst gigadriveNextAdapter: NextAdapter = {\n name: 'Gigadrive Network',\n\n modifyConfig(config, { phase, nextVersion }) {\n if (phase !== PRODUCTION_BUILD_PHASE) return config;\n\n const deploymentId = config.deploymentId ?? process.env.GIGADRIVE_DEPLOYMENT_ID;\n if (!supportsManagedRuntime(nextVersion)) {\n return {\n ...config,\n ...(deploymentId ? { deploymentId } : {}),\n output: config.output === 'export' ? 'export' : 'standalone',\n };\n }\n if (config.output === 'export') {\n return { ...config, ...(deploymentId ? { deploymentId } : {}) };\n }\n\n const injectCacheHandler = config.cacheHandler === undefined;\n const injectCacheComponentHandlers = config.cacheHandlers === undefined;\n const images = config.images;\n const injectImageLoader =\n images !== undefined && images.unoptimized !== true && images.loader === 'default' && !images.loaderFile;\n\n return {\n ...config,\n ...(deploymentId ? { deploymentId } : {}),\n // Run the whole deployment as one standalone Next server rather than a\n // serverless function per route. `onBuildComplete` still fires under\n // standalone (Next >= 16.2), and the standalone server natively honors the\n // injected cache handlers and resumes PPR from its incremental cache, so\n // ISR/PPR/`use cache` stay durable via the remote runtime-cache service.\n // Validated on Next 16.2.x (see MANAGED_STANDALONE_VALIDATED_MAX_MAJOR);\n // a future major that forbids adapter + standalone fails loudly at build.\n output: 'standalone',\n ...(injectCacheHandler ? { cacheHandler: CACHE_HANDLER_PATH() } : {}),\n ...(injectCacheComponentHandlers\n ? {\n cacheHandlers: {\n default: CACHE_COMPONENTS_HANDLER_PATH(),\n remote: CACHE_COMPONENTS_HANDLER_PATH(),\n },\n }\n : {}),\n ...(injectCacheHandler || injectCacheComponentHandlers ? { cacheMaxMemorySize: 0 } : {}),\n ...(injectImageLoader\n ? {\n images: {\n ...images,\n loader: 'custom',\n loaderFile: IMAGE_LOADER_PATH(),\n },\n }\n : {}),\n };\n },\n\n async onBuildComplete({ projectDir, repoRoot, distDir, config, nextVersion, buildId, routing, outputs }) {\n const metadataDirectory = path.join(projectDir, '.gigadrive');\n await mkdir(metadataDirectory, { recursive: true });\n const manifestPath = path.join(metadataDirectory, 'nextjs.json');\n const writeManifest = (manifest: unknown) =>\n writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n\n if (!supportsManagedRuntime(nextVersion)) {\n const manifest: GigadriveNextBuildManifestV1 = {\n version: 1,\n output: config.output === 'export' ? 'export' : 'standalone',\n distDir: toPortableRelativePath(projectDir, distDir),\n repoRootToProject: toPortableRelativePath(repoRoot, projectDir, true),\n nextVersion,\n buildId,\n };\n await writeManifest(manifest);\n return;\n }\n\n const portableDistDir = toPortableRelativePath(projectDir, distDir);\n const repoRootToProject = toPortableRelativePath(repoRoot, projectDir, true);\n\n if (config.output === 'export') {\n const manifest: GigadriveNextBuildManifestV2Export = {\n version: 2,\n mode: 'export',\n distDir: portableDistDir,\n repoRootToProject,\n nextVersion,\n buildId,\n };\n await writeManifest(manifest);\n return;\n }\n\n if (config.output === 'standalone') {\n await ensureStandaloneServerTraces(projectDir, repoRoot, distDir, config);\n }\n\n const [resolvedRepoRoot, resolvedProjectDir] = await Promise.all([realpath(repoRoot), realpath(projectDir)]);\n const prerenders = await mapInBatches(outputs.prerenders, (output) =>\n serializePrerenderOutput(repoRoot, resolvedRepoRoot, output)\n );\n const assetManifest = await serializeAssetManifest(\n projectDir,\n resolvedProjectDir,\n distDir,\n config.basePath,\n routing.rsc.contentTypeHeader ?? DEFAULT_RSC_CONTENT_TYPE,\n config.i18n?.locales ?? [],\n outputs.staticFiles\n );\n const prerenderManifest: GigadriveNextPrerenderManifestV1 = {\n version: 1,\n seedMethods: ['GET', 'HEAD'],\n prerenders,\n };\n await mkdir(path.join(metadataDirectory, 'assets'), { recursive: true });\n await Promise.all([\n writeFile(path.join(projectDir, NEXT_ASSET_MANIFEST_PATH), `${JSON.stringify(assetManifest)}\\n`, 'utf8'),\n writeFile(path.join(projectDir, NEXT_PRERENDER_MANIFEST_PATH), `${JSON.stringify(prerenderManifest)}\\n`, 'utf8'),\n ]);\n const server = aggregateServerDescriptor([\n ...outputs.pages,\n ...outputs.pagesApi,\n ...outputs.appPages,\n ...outputs.appRoutes,\n ...(outputs.middleware ? [outputs.middleware] : []),\n ]);\n const images = normalizeImages(config);\n // `.next/static` is thousands of content-hashed, immutable chunks. Register\n // the whole subtree as one edge-served prefix instead of enumerating files.\n const staticAssets: GigadriveNextStaticAssetPrefix[] = [\n { sourceDir: `${portableDistDir}/static`, urlPrefix: '_next/static', immutable: true },\n ];\n\n const manifest: GigadriveNextBuildManifestV2Standalone = {\n version: 2,\n mode: 'standalone-v2',\n distDir: portableDistDir,\n repoRootToProject,\n nextVersion,\n buildId,\n server,\n config: {\n basePath: config.basePath,\n trailingSlash: config.trailingSlash,\n cacheComponents: config.cacheComponents,\n ...(config.i18n ? { i18n: toJsonValue(config.i18n) } : {}),\n ...(images ? { images } : {}),\n },\n routing: {\n beforeMiddleware: toJsonValue(routing.beforeMiddleware) as JsonValue[],\n beforeFiles: toJsonValue(routing.beforeFiles) as JsonValue[],\n afterFiles: toJsonValue(routing.afterFiles) as JsonValue[],\n dynamicRoutes: toJsonValue(routing.dynamicRoutes) as JsonValue[],\n onMatch: toJsonValue(routing.onMatch) as JsonValue[],\n fallback: toJsonValue(routing.fallback) as JsonValue[],\n shouldNormalizeNextData: routing.shouldNormalizeNextData,\n rsc: toJsonValue(routing.rsc),\n },\n outputs: {\n prerenders: [],\n prerenderManifest: NEXT_PRERENDER_MANIFEST_PATH,\n assetManifest: NEXT_ASSET_MANIFEST_PATH,\n entryPagePaths: getEntryPagePaths(prerenders),\n staticAssets,\n middleware: outputs.middleware\n ? {\n present: true,\n matchers: (outputs.middleware.config.matchers ?? []).map(({ source, sourceRegex, has, missing }) => ({\n source,\n sourceRegex,\n has,\n missing,\n })),\n }\n : { present: false, matchers: [] },\n },\n };\n await writeManifest(manifest);\n },\n};\n\nexport { MANAGED_STANDALONE_VALIDATED_MAX_MAJOR };\nexport default gigadriveNextAdapter;\n","import { Option, Schema } from 'effect';\n\nconst HTTP_HEADER_NAME = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\nconst HTTP_HEADER_VALUE = /^[\\t\\x20-\\x7e\\x80-\\xff]*$/;\nconst URL_PATHNAME_FORBIDDEN_CHARACTER = /[\\x00-\\x1f\\x7f?#\\\\]/;\n\nconst isUrlDotSegment = (segment: string): boolean => {\n const decodedDots = segment.replace(/%2e/gi, '.');\n return decodedDots === '.' || decodedDots === '..';\n};\n\nconst isPortableRelativePath = (value: string, allowCurrentDirectory = false): boolean => {\n const normalized = value.replaceAll('\\\\', '/').replace(/^\\.\\//, '').replace(/\\/+$/, '');\n return (\n (allowCurrentDirectory || (normalized !== '' && normalized !== '.')) &&\n !normalized.startsWith('/') &&\n !/^[A-Za-z]:/.test(normalized) &&\n !normalized.includes(':') &&\n !normalized.split('/').includes('..')\n );\n};\n\nexport const PortableRelativePathSchema = Schema.String.pipe(Schema.filter((value) => isPortableRelativePath(value)));\n\nexport const RepositoryRelativePathSchema = Schema.String.pipe(\n Schema.filter((value) => isPortableRelativePath(value, true))\n);\n\nexport const UrlPathnameSchema = Schema.String.pipe(\n Schema.filter(\n (value) =>\n value.startsWith('/') && !URL_PATHNAME_FORBIDDEN_CHARACTER.test(value) && !value.split('/').some(isUrlDotSegment)\n )\n);\n\nexport const HttpHeaderValueSchema = Schema.String.pipe(Schema.pattern(HTTP_HEADER_VALUE));\nexport const HttpHeadersSchema = Schema.mutable(\n Schema.Record({\n key: Schema.String,\n value: Schema.Union(HttpHeaderValueSchema, Schema.mutable(Schema.Array(HttpHeaderValueSchema))),\n })\n).pipe(Schema.filter((headers) => Object.keys(headers).every((name) => HTTP_HEADER_NAME.test(name))));\nexport const HttpSingleValueHeadersSchema = Schema.mutable(\n Schema.Record({ key: Schema.String, value: HttpHeaderValueSchema })\n).pipe(Schema.filter((headers) => Object.keys(headers).every((name) => HTTP_HEADER_NAME.test(name))));\n\n/**\n * Decode an unknown value with an Effect schema.\n *\n * @param schema - Schema used to validate and decode the value.\n * @param value - Unknown input to decode.\n * @returns The decoded value, or `undefined` when validation fails.\n * @example\n * decodeUnknown(Schema.String, 'value');\n */\nexport const decodeUnknown = <A, I>(schema: Schema.Schema<A, I, never>, value: unknown): A | undefined =>\n Schema.decodeUnknownOption(schema, { onExcessProperty: 'preserve' })(value).pipe(Option.getOrUndefined);\n\n/**\n * Decode a JSON string with an Effect schema.\n *\n * @param schema - Schema used to validate and decode the parsed JSON value.\n * @param content - JSON string to parse and decode.\n * @returns The decoded value, or `undefined` when parsing or validation fails.\n * @example\n * decodeJson(Schema.Struct({ version: Schema.Number }), '{\"version\":1}');\n */\nexport const decodeJson = <A, I>(schema: Schema.Schema<A, I, never>, content: string): A | undefined =>\n decodeUnknown(Schema.parseJson(schema), content);\n","/**\n * A representative sample is enough for cache warming. The complete prerender\n * table stays in its sidecar so it cannot expand gateway configuration by\n * thousands of paths.\n */\nexport const MAXIMUM_ENTRY_PAGE_PATHS = 50;\n"],"mappings":"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","names":["Schema","Schema","manifest"]}
1
+ {"version":3,"sources":["../src/nextjs-adapter.ts","../src/manifest-schema.ts","../src/nextjs-constants.ts"],"sourcesContent":["import { Schema } from 'effect';\nimport type { NextAdapter } from 'next';\nimport { access, mkdir, readFile, realpath, stat, writeFile } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { StaticAssetHeaders, StaticAssetManifestEntry, StaticAssetManifestV1 } from './asset-manifest';\nimport type { NormalizedImagePolicy } from './image-policy';\nimport { decodeJson, decodeUnknown, HttpHeadersSchema } from './manifest-schema';\nimport { MAXIMUM_ENTRY_PAGE_PATHS } from './nextjs-constants';\nimport type {\n GigadriveNextBuildManifestV1,\n GigadriveNextBuildManifestV2Export,\n GigadriveNextBuildManifestV2Standalone,\n GigadriveNextPrerenderManifestV1,\n GigadriveNextPrerenderOutput,\n GigadriveNextServerDescriptor,\n GigadriveNextStaticAssetPrefix,\n JsonValue,\n} from './nextjs-manifest';\n\ntype BuildCompleteContext = Parameters<NonNullable<NextAdapter['onBuildComplete']>>[0];\ntype NextConfigComplete = Parameters<NonNullable<NextAdapter['modifyConfig']>>[0];\ntype ModifyConfigContext = Parameters<NonNullable<NextAdapter['modifyConfig']>>[1];\n/**\n * What Next 15 passes to `onBuildComplete`. Next 15 loads the adapter through\n * `experimental.adapterPath` (which `NEXT_ADAPTER_PATH` sets) but with an older\n * contract: `modifyConfig(config)` gets no context, and `onBuildComplete` gets\n * neither the project, the dist directory, the config nor the Next version.\n */\ntype Next15BuildCompleteContext = { readonly routes: unknown; readonly outputs: unknown };\ntype NextRouteOutput =\n | BuildCompleteContext['outputs']['pages'][number]\n | BuildCompleteContext['outputs']['pagesApi'][number]\n | BuildCompleteContext['outputs']['appPages'][number]\n | BuildCompleteContext['outputs']['appRoutes'][number]\n | NonNullable<BuildCompleteContext['outputs']['middleware']>;\ntype NextPrerenderOutput = BuildCompleteContext['outputs']['prerenders'][number];\ntype NextStaticFileOutput = BuildCompleteContext['outputs']['staticFiles'][number];\n\nconst PRODUCTION_BUILD_PHASE = 'phase-production-build';\nconst NEXT_ASSET_MANIFEST_PATH = '.gigadrive/assets/nextjs.json';\nconst NEXT_PRERENDER_MANIFEST_PATH = '.gigadrive/nextjs-prerenders.json';\nconst HTML_CONTENT_TYPE = 'text/html; charset=utf-8';\nconst DEFAULT_RSC_CONTENT_TYPE = 'text/x-component';\nconst INTERNAL_STATIC_RESPONSE_HEADERS = new Set(['x-next-cache-tags', 'x-nextjs-prerender']);\nconst NextStaticFileMetaSchema = Schema.Struct({\n status: Schema.optional(Schema.Int.pipe(Schema.between(100, 599))),\n headers: Schema.mutable(Schema.Record({ key: Schema.String, value: Schema.Unknown })),\n});\nconst runtimeDirectory = typeof __dirname === 'string' ? __dirname : path.dirname(fileURLToPath(import.meta.url));\n\nconst runtimeModulePath = (environmentName: string, fileName: string): string =>\n process.env[environmentName] ?? path.join(runtimeDirectory, fileName);\n\nconst CACHE_HANDLER_PATH = () => runtimeModulePath('GIGADRIVE_NEXT_CACHE_HANDLER_PATH', 'nextjs-cache-handler.js');\nconst CACHE_COMPONENTS_HANDLER_PATH = () =>\n runtimeModulePath('GIGADRIVE_NEXT_CACHE_COMPONENTS_HANDLER_PATH', 'nextjs-cache-components-handler.js');\nconst IMAGE_LOADER_PATH = () => runtimeModulePath('GIGADRIVE_NEXT_IMAGE_LOADER_PATH', 'nextjs-image-loader.js');\n\nconst toJsonValue = (value: unknown): JsonValue => {\n const serialized = JSON.stringify(value);\n return serialized === undefined ? null : (JSON.parse(serialized) as JsonValue);\n};\n\n/**\n * Next 16.2 introduced the adapter hooks (`modifyConfig` + `onBuildComplete`) and\n * the `cacheHandler`/`cacheHandlers`/`cacheComponents` config fields we inject.\n * Earlier releases keep the legacy standalone-only behavior with no injection.\n */\nconst supportsManagedRuntime = (nextVersion: string | undefined): boolean => {\n if (!nextVersion) return false;\n const [majorPart, minorPart] = nextVersion.split('.');\n const major = Number.parseInt(majorPart ?? '', 10);\n const minor = Number.parseInt(minorPart ?? '', 10);\n return Number.isFinite(major) && Number.isFinite(minor) && (major > 16 || (major === 16 && minor >= 2));\n};\n\n/**\n * Highest Next major validated to allow `output: 'standalone'` together with an\n * adapter. Next's own build source warns the combination \"might not be allowed\"\n * in a future release. We always emit `output: 'standalone'` on the managed path\n * (there is no per-route fallback to degrade to), so if a future major forbids\n * it the build fails loudly at `next build` rather than silently misdeploying.\n * The network canary drift test tracks releases past this bound.\n */\nconst MANAGED_STANDALONE_VALIDATED_MAX_MAJOR = 16;\n\nconst toPortableRelativePath = (from: string, to: string, allowCurrentDirectory = false): string => {\n const resolvedFrom = path.resolve(from);\n const resolvedTo = path.resolve(path.isAbsolute(to) ? to : path.join(from, to));\n const relativePath = path.relative(resolvedFrom, resolvedTo).replaceAll(path.sep, '/');\n const normalized = relativePath === '' ? '.' : relativePath;\n if (\n (!allowCurrentDirectory && normalized === '.') ||\n normalized.startsWith('/') ||\n /^[A-Za-z]:/.test(normalized) ||\n normalized.split('/').some((segment) => segment === '..')\n ) {\n throw new Error(`Next.js adapter output is outside the repository root: ${to}`);\n }\n return normalized;\n};\n\nasync function resolveReadablePath(repoRoot: string, filePath: string, resolvedRoot?: string) {\n const absolutePath = path.resolve(path.isAbsolute(filePath) ? filePath : path.join(repoRoot, filePath));\n const portablePath = toPortableRelativePath(repoRoot, absolutePath);\n await access(absolutePath);\n // Validate the symlink-resolved location as well; the call throws when the\n // real path escapes the repository root.\n const resolvedPath = await realpath(absolutePath);\n void toPortableRelativePath(resolvedRoot ?? (await realpath(repoRoot)), resolvedPath);\n const fileStat = await stat(absolutePath);\n return { portablePath, fileStat };\n}\n\nasync function requireReadableFile(repoRoot: string, filePath: string, resolvedRoot?: string): Promise<string> {\n const { portablePath, fileStat } = await resolveReadablePath(repoRoot, filePath, resolvedRoot);\n if (!fileStat.isFile()) throw new Error(`Next.js adapter output is not a readable file: ${filePath}`);\n return portablePath;\n}\n\nasync function mapInBatches<Input, Output>(\n values: Input[],\n mapper: (value: Input) => Promise<Output>,\n batchSize = 64\n): Promise<Output[]> {\n const results: Output[] = [];\n for (let index = 0; index < values.length; index += batchSize) {\n results.push(...(await Promise.all(values.slice(index, index + batchSize).map((value) => mapper(value)))));\n }\n return results;\n}\n\nconst isInsideDirectory = (directory: string, filePath: string): boolean => {\n const relativePath = path.relative(path.resolve(directory), path.resolve(filePath));\n return relativePath !== '' && !relativePath.startsWith('..') && !path.isAbsolute(relativePath);\n};\n\nconst isDynamicRoutePathname = (pathname: string): boolean => pathname.includes('[');\n\n// Next reports the Pages Router root as `<basePath>/index`, while its public URL\n// is the base path itself (or `/` when no base path is configured).\nconst normalizeStaticFilePathname = (pathname: string, basePath: string): string =>\n pathname === `${basePath}/index` ? basePath || '/' : pathname;\n\nconst getStaticStatus = (pathname: string, basePath: string, locales: readonly string[]): number | undefined => {\n const routePathname = basePath && pathname.startsWith(`${basePath}/`) ? pathname.slice(basePath.length) : pathname;\n const segments = routePathname.split('/').filter(Boolean);\n const [firstSegment, secondSegment] = segments;\n const statusPage =\n segments.length === 1\n ? firstSegment\n : segments.length === 2 && firstSegment && locales.includes(firstSegment)\n ? secondSegment\n : undefined;\n return statusPage === '404' ? 404 : statusPage === '500' ? 500 : undefined;\n};\n\nconst hasContentType = (headers: StaticAssetHeaders): boolean =>\n Object.keys(headers).some((name) => name.toLowerCase() === 'content-type');\n\nconst getPublicStaticResponseHeaders = (headers: Record<string, unknown>): StaticAssetHeaders | undefined => {\n const publicHeaders = Object.fromEntries(\n Object.entries(headers).filter(([name]) => !INTERNAL_STATIC_RESPONSE_HEADERS.has(name.toLowerCase()))\n );\n return decodeUnknown(HttpHeadersSchema, publicHeaders);\n};\n\nasync function getStaticFileResponseMetadata(\n projectDir: string,\n resolvedProjectDir: string,\n output: NextStaticFileOutput,\n rscContentType: string,\n basePath: string,\n locales: readonly string[]\n): Promise<Pick<StaticAssetManifestEntry, 'status' | 'headers'> | undefined> {\n if (output.filePath.endsWith('.body')) {\n const metaPath = `${output.filePath.slice(0, -'.body'.length)}.meta`;\n await requireReadableFile(projectDir, metaPath, resolvedProjectDir);\n const meta = decodeJson(NextStaticFileMetaSchema, await readFile(metaPath, 'utf8'));\n const headers = meta ? getPublicStaticResponseHeaders(meta.headers) : undefined;\n if (!meta || !headers || !hasContentType(headers)) return undefined;\n return {\n ...(meta.status !== undefined ? { status: meta.status } : {}),\n headers,\n };\n }\n if (output.filePath.endsWith('.html')) {\n const status = getStaticStatus(output.pathname, basePath, locales);\n return {\n ...(status !== undefined ? { status } : {}),\n headers: { 'content-type': HTML_CONTENT_TYPE },\n };\n }\n if (output.pathname.endsWith('.rsc')) return { headers: { 'content-type': rscContentType } };\n return {};\n}\n\nconst serializeStaticFileAsset = async (\n projectDir: string,\n resolvedProjectDir: string,\n basePath: string,\n rscContentType: string,\n locales: readonly string[],\n output: NextStaticFileOutput\n): Promise<StaticAssetManifestEntry | undefined> => {\n const [source, responseMetadata] = await Promise.all([\n requireReadableFile(projectDir, output.filePath, resolvedProjectDir),\n getStaticFileResponseMetadata(projectDir, resolvedProjectDir, output, rscContentType, basePath, locales),\n ]);\n if (!responseMetadata) return undefined;\n return {\n source,\n path: normalizeStaticFilePathname(output.pathname, basePath),\n ...responseMetadata,\n ...(output.immutableHash ? { immutable: true } : {}),\n };\n};\n\nasync function serializeAssetManifest(\n projectDir: string,\n resolvedProjectDir: string,\n distDir: string,\n basePath: string,\n rscContentType: string,\n locales: readonly string[],\n staticFiles: NextStaticFileOutput[]\n): Promise<StaticAssetManifestV1> {\n const staticDirectory = path.join(distDir, 'static');\n const staticEntries = await mapInBatches(\n staticFiles.filter(\n // The complete immutable subtree is already represented by a prefix.\n (output) => !isInsideDirectory(staticDirectory, output.filePath) && !isDynamicRoutePathname(output.pathname)\n ),\n (output) => serializeStaticFileAsset(projectDir, resolvedProjectDir, basePath, rscContentType, locales, output)\n );\n const assetsByPath = new Map<string, StaticAssetManifestEntry>();\n for (const entry of staticEntries) {\n if (!entry) continue;\n if (assetsByPath.has(entry.path)) throw new Error(`Duplicate Next.js static asset path: ${entry.path}`);\n assetsByPath.set(entry.path, entry);\n }\n return { version: 1, assets: [...assetsByPath.values()] };\n}\n\nconst getEntryPagePaths = (prerenders: GigadriveNextPrerenderOutput[]): string[] =>\n [\n ...new Set(\n prerenders\n .filter((output) => output.fallback?.postponedState === undefined)\n .map((output) => output.pathname)\n .filter((pathname) => pathname.startsWith('/') && !isDynamicRoutePathname(pathname))\n ),\n ]\n .sort((left, right) => left.split('/').length - right.split('/').length || left.localeCompare(right))\n .slice(0, MAXIMUM_ENTRY_PAGE_PATHS);\n\nconst NextPrerenderMetaSchema = Schema.Struct({\n routeCache: Schema.optional(Schema.Struct({ key: Schema.String })),\n});\n\n/**\n * Reads the runtime cache key Next recorded beside a prerender's HTML. Newer\n * Next versions scope keys by source route, so the pathname alone would miss the\n * entry. Using Next's own value avoids depending on how a version builds it.\n */\nconst readPrerenderCacheKey = async (repoRoot: string, htmlPath: string): Promise<string | undefined> => {\n if (!htmlPath.endsWith('.html')) return undefined;\n const metaPath = path.resolve(repoRoot, htmlPath.replace(/\\.html$/, '.meta'));\n const content = await readFile(metaPath, 'utf8').catch(() => undefined);\n return content === undefined ? undefined : decodeJson(NextPrerenderMetaSchema, content)?.routeCache?.key;\n};\n\nconst serializePrerenderOutput = async (\n repoRoot: string,\n resolvedRepoRoot: string,\n output: NextPrerenderOutput\n): Promise<GigadriveNextPrerenderOutput> => {\n const { bypassFor, ...prerenderConfig } = output.config;\n const cacheKey = output.fallback?.filePath\n ? await readPrerenderCacheKey(repoRoot, output.fallback.filePath)\n : undefined;\n const serializedOutput = {\n id: output.id,\n type: 'PRERENDER' as const,\n pathname: output.pathname,\n ...(output.route !== undefined ? { route: output.route } : {}),\n parentOutputId: output.parentOutputId,\n groupId: output.groupId,\n ...(cacheKey !== undefined ? { cacheKey } : {}),\n ...(output.pprChain ? { pprChain: output.pprChain } : {}),\n ...(output.parentFallbackMode !== undefined ? { parentFallbackMode: toJsonValue(output.parentFallbackMode) } : {}),\n ...(output.fallback\n ? {\n fallback: {\n ...(output.fallback.filePath\n ? { filePath: await requireReadableFile(repoRoot, output.fallback.filePath, resolvedRepoRoot) }\n : {}),\n ...(output.fallback.initialStatus !== undefined ? { initialStatus: output.fallback.initialStatus } : {}),\n ...(output.fallback.initialHeaders ? { initialHeaders: output.fallback.initialHeaders } : {}),\n ...(output.fallback.initialExpiration !== undefined\n ? { initialExpiration: output.fallback.initialExpiration }\n : {}),\n ...(output.fallback.initialRevalidate !== undefined\n ? { initialRevalidate: output.fallback.initialRevalidate }\n : {}),\n ...(output.fallback.postponedState !== undefined ? { postponedState: output.fallback.postponedState } : {}),\n },\n }\n : {}),\n config: {\n ...prerenderConfig,\n ...(bypassFor ? { bypassFor: toJsonValue(bypassFor) as JsonValue[] } : {}),\n },\n };\n if (output.routeType !== undefined) {\n return {\n ...serializedOutput,\n routeType: output.routeType,\n response: output.response,\n compute: output.compute,\n ...(output.htmlSize !== undefined ? { htmlSize: output.htmlSize } : {}),\n };\n }\n return serializedOutput;\n};\n\n/**\n * Collapses per-route runtime config onto the one standalone server. `maxDuration`\n * becomes the max across routes (one function honors one limit); `env` is the union\n * of every route's declared env (the single server runs them all in-process).\n */\nconst aggregateServerDescriptor = (outputs: NextRouteOutput[]): GigadriveNextServerDescriptor => {\n let maxDuration: number | undefined;\n const env: Record<string, string> = {};\n for (const output of outputs) {\n if (output.config.maxDuration !== undefined) {\n maxDuration = Math.max(maxDuration ?? 0, output.config.maxDuration);\n }\n if (output.config.env) Object.assign(env, output.config.env);\n }\n return {\n ...(maxDuration !== undefined ? { maxDuration } : {}),\n ...(Object.keys(env).length > 0 ? { env } : {}),\n };\n};\n\ntype CollectBuildTracesModule = {\n collectBuildTraces: (options: {\n dir: string;\n config: BuildCompleteContext['config'];\n distDir: string;\n edgeRuntimeRoutes: Record<string, never>;\n staticPages: string[];\n outputFileTracingRoot: string;\n }) => Promise<void>;\n};\n\n/**\n * Ignore globs that Turbopack's native server tracer applies on top of the\n * shared `collectBuildTraces` ignore list (see `ignores()` in Next's\n * `crates/next-api/src/next_server_nft.rs`). The JavaScript\n * `collectBuildTraces` fallback only carries the webpack-era ignores, so\n * tracing Next's server entries with it follows dev-only require edges —\n * `router-server` → `setup-dev-bundler` → hot reloaders → the application's\n * build toolchain (webpack, terser, esbuild, swc, babel plugins) — that\n * Turbopack severs natively, roughly quadrupling the standalone output.\n *\n * Passing these through `outputFileTracingExcludes['next-server']` reuses\n * `collectBuildTraces`' own extension point for the shared ignores, so they\n * apply during trace traversal exactly like Turbopack's graph-level ignores.\n * Only Next-internal dev/build-only modules are listed — never application\n * packages — so application dependencies are excluded solely when their every\n * require path runs through one of these modules, matching the native trace.\n * If a future Next release moves one of these files the glob simply stops\n * matching and the trace grows back; nothing breaks at runtime.\n */\nconst TURBOPACK_SERVER_TRACE_IGNORES = [\n // client components with a NODE_ENV guard the tracer cannot evaluate\n '**/next/dist/next-devtools/userspace/use-app-dev-rendering-indicator.js',\n '**/next/dist/client/dev/hot-reloader/app/hot-reloader-app.js',\n // server/lib/router-server.js requires this statically but only uses it in dev\n '**/next/dist/server/lib/router-utils/setup-dev-bundler.js',\n // server/next.js requires this statically but only uses it in dev\n '**/next/dist/server/dev/next-dev-server.js',\n // build-time-only browser support data pulled in via next/dist/compiled/babel*\n '**/next/dist/compiled/browserslist/**',\n '**/next/dist/compiled/jest-worker/**/*',\n '**/node_modules/react{,-dom,-server-dom-turbopack}/**/*.development.js',\n];\n\n/**\n * Next 16.3 stopped emitting the aggregated `next-server.js.nft.json` /\n * `next-minimal-server.js.nft.json` traces from Turbopack builds whenever an\n * adapter is configured, yet `next build` still runs the `output: 'standalone'`\n * writer after `onBuildComplete` — and that writer reads exactly this file, so\n * the build dies with ENOENT. Next 16.2 and all webpack builds still emit the\n * file, making this a no-op there. When the file is missing, regenerate both\n * aggregate traces with Next's own `collectBuildTraces` (the module the webpack\n * pipeline runs); without `buildTraceContext` it only writes the two aggregate\n * trace files and leaves Turbopack's per-entry traces untouched. The\n * regeneration also merges `TURBOPACK_SERVER_TRACE_IGNORES` into the config's\n * `outputFileTracingExcludes` so the fallback prunes the same dev-only require\n * edges as Turbopack's native tracer instead of dragging the application's\n * build toolchain into the standalone output.\n */\nasync function ensureStandaloneServerTraces(\n projectDir: string,\n repoRoot: string,\n distDir: string,\n config: BuildCompleteContext['config']\n): Promise<void> {\n const aggregateTracePath = path.join(distDir, 'next-server.js.nft.json');\n try {\n await access(aggregateTracePath);\n return;\n } catch {\n // Missing — Next will crash in its standalone writer unless we regenerate it.\n }\n let collectBuildTracesModule: CollectBuildTracesModule;\n try {\n const projectRequire = createRequire(path.join(projectDir, 'package.json'));\n collectBuildTracesModule = projectRequire('next/dist/build/collect-build-traces') as CollectBuildTracesModule;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Next.js did not emit ${aggregateTracePath} and the Gigadrive adapter could not load ` +\n `next/dist/build/collect-build-traces from the project to regenerate it: ${message}`\n );\n }\n const { outputFileTracingExcludes = {} } = config as {\n outputFileTracingExcludes?: Record<string, string[]>;\n };\n const tracingConfig = {\n ...config,\n outputFileTracingExcludes: {\n ...outputFileTracingExcludes,\n 'next-server': [...(outputFileTracingExcludes['next-server'] ?? []), ...TURBOPACK_SERVER_TRACE_IGNORES],\n },\n };\n try {\n await collectBuildTracesModule.collectBuildTraces({\n dir: projectDir,\n config: tracingConfig,\n distDir,\n edgeRuntimeRoutes: {},\n staticPages: [],\n outputFileTracingRoot: (config as { outputFileTracingRoot?: string }).outputFileTracingRoot ?? repoRoot,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Regenerating the Next.js standalone server traces (${aggregateTracePath}) failed: ${message}`);\n }\n}\n\nconst normalizeImages = (config: BuildCompleteContext['config']): NormalizedImagePolicy | undefined => {\n if (config.images.unoptimized) return undefined;\n return {\n localPatterns: config.images.localPatterns ?? [{ pathname: '/**' }],\n remotePatterns: config.images.remotePatterns.map((pattern) => {\n if (pattern instanceof URL) {\n return {\n protocol: pattern.protocol === 'http:' ? ('http' as const) : ('https' as const),\n hostname: pattern.hostname,\n port: pattern.port,\n pathname: pattern.pathname,\n search: pattern.search,\n };\n }\n return { ...pattern };\n }),\n widths: [...new Set([...config.images.deviceSizes, ...config.images.imageSizes])].sort((a, b) => a - b),\n heights: [],\n qualities: config.images.qualities ?? [75],\n formats: config.images.formats,\n minimumCacheTTL: config.images.minimumCacheTTL,\n dangerouslyAllowSVG: config.images.dangerouslyAllowSVG,\n contentSecurityPolicy: config.images.contentSecurityPolicy,\n contentDispositionType: config.images.contentDispositionType,\n maximumRedirects: config.images.maximumRedirects,\n maximumResponseBody: config.images.maximumResponseBody,\n variants: {},\n };\n};\n\n/**\n * Next.js deployment adapter used automatically by Gigadrive Network build workers.\n *\n * Next 16.2 and newer run the entire deployment as a single `output: 'standalone'`\n * server (one function per deployment) while the injected cache handlers, image\n * loader, and this hook's `onBuildComplete` metadata keep ISR, PPR, `use cache`,\n * and image optimization working through the platform's durable runtime-cache and\n * edge image services. Older releases retain the legacy standalone behavior without\n * the managed-runtime injections.\n */\n/**\n * The config this adapter returned to Next 15, kept for its `onBuildComplete`,\n * which receives none of it. Next 15 calls `modifyConfig` only for production\n * builds and servers, in the same process as the build, and keeps normalizing\n * the returned object (an export build moves `distDir` back to `.next`).\n */\nlet next15Config: NextConfigComplete | undefined;\n\n/**\n * The application directory of a Next 15 build. Next looks for its config file\n * in parent directories too, so a shared config can sit above the application.\n * Every output it reports lives under `<application>/<distDir>/server/`.\n */\nconst findNext15ProjectDir = (outputs: unknown, distDir: string): string | undefined => {\n const marker = `${path.sep}${path.normalize(distDir)}${path.sep}server${path.sep}`;\n const lists = typeof outputs === 'object' && outputs !== null ? Object.values(outputs) : [];\n for (const list of lists) {\n for (const output of Array.isArray(list) ? list : []) {\n const filePath: unknown =\n typeof output === 'object' && output !== null && 'filePath' in output ? output.filePath : undefined;\n const index = typeof filePath === 'string' ? filePath.indexOf(marker) : -1;\n if (typeof filePath === 'string' && index > 0) return filePath.slice(0, index);\n }\n }\n return undefined;\n};\n\n/** Reads the version of the Next.js the project at `projectDir` resolves. */\nconst readNextVersion = (projectDir: string): string => {\n const nextPackage: unknown = createRequire(path.join(projectDir, 'package.json'))('next/package.json');\n return typeof nextPackage === 'object' &&\n nextPackage !== null &&\n 'version' in nextPackage &&\n typeof nextPackage.version === 'string'\n ? nextPackage.version\n : '0.0.0';\n};\n\n/**\n * Writes the legacy standalone manifest for a Next 15 build from the config its\n * `modifyConfig` returned and the outputs of the build. Its build id is the one\n * Next wrote before calling `onBuildComplete`.\n */\nconst writeNext15Manifest = async (config: NextConfigComplete | undefined, outputs: unknown) => {\n const configuredDistDir = config?.distDir ?? '.next';\n const projectDir =\n findNext15ProjectDir(outputs, configuredDistDir) ??\n (config?.configFile ? path.dirname(config.configFile) : process.cwd());\n const distDir = path.resolve(projectDir, configuredDistDir);\n const repoRoot = config?.outputFileTracingRoot || projectDir;\n const buildId = (await readFile(path.join(distDir, 'BUILD_ID'), 'utf8')).trim();\n const manifest: GigadriveNextBuildManifestV1 = {\n version: 1,\n output: config?.output === 'export' ? 'export' : 'standalone',\n distDir: toPortableRelativePath(projectDir, distDir),\n repoRootToProject: toPortableRelativePath(repoRoot, projectDir, true),\n nextVersion: readNextVersion(projectDir),\n buildId,\n };\n await mkdir(path.join(projectDir, '.gigadrive'), { recursive: true });\n await writeFile(path.join(projectDir, '.gigadrive', 'nextjs.json'), `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n};\n\nconst gigadriveNextAdapter: NextAdapter = {\n name: 'Gigadrive Network',\n\n modifyConfig(config, context?: ModifyConfigContext) {\n // Next 15 passes no context. It only calls this for production builds and\n // servers, and an unknown version takes the legacy standalone path below.\n const { phase, nextVersion } = context ?? { phase: PRODUCTION_BUILD_PHASE, nextVersion: undefined };\n if (phase !== PRODUCTION_BUILD_PHASE) return config;\n\n const deploymentId = config.deploymentId ?? process.env.GIGADRIVE_DEPLOYMENT_ID;\n if (!supportsManagedRuntime(nextVersion)) {\n const legacyConfig = {\n ...config,\n ...(deploymentId ? { deploymentId } : {}),\n output: config.output === 'export' ? ('export' as const) : ('standalone' as const),\n };\n if (!context) next15Config = legacyConfig;\n return legacyConfig;\n }\n if (config.output === 'export') {\n return { ...config, ...(deploymentId ? { deploymentId } : {}) };\n }\n\n const injectCacheHandler = config.cacheHandler === undefined;\n const injectCacheComponentHandlers = config.cacheHandlers === undefined;\n const images = config.images;\n const injectImageLoader =\n images !== undefined && images.unoptimized !== true && images.loader === 'default' && !images.loaderFile;\n\n return {\n ...config,\n ...(deploymentId ? { deploymentId } : {}),\n // Run the whole deployment as one standalone Next server rather than a\n // serverless function per route. `onBuildComplete` still fires under\n // standalone (Next >= 16.2), and the standalone server natively honors the\n // injected cache handlers and resumes PPR from its incremental cache, so\n // ISR/PPR/`use cache` stay durable via the remote runtime-cache service.\n // Validated on Next 16.2.x (see MANAGED_STANDALONE_VALIDATED_MAX_MAJOR);\n // a future major that forbids adapter + standalone fails loudly at build.\n output: 'standalone',\n ...(injectCacheHandler ? { cacheHandler: CACHE_HANDLER_PATH() } : {}),\n ...(injectCacheComponentHandlers\n ? {\n cacheHandlers: {\n default: CACHE_COMPONENTS_HANDLER_PATH(),\n remote: CACHE_COMPONENTS_HANDLER_PATH(),\n },\n }\n : {}),\n ...(injectCacheHandler || injectCacheComponentHandlers ? { cacheMaxMemorySize: 0 } : {}),\n ...(injectImageLoader\n ? {\n images: {\n ...images,\n loader: 'custom',\n loaderFile: IMAGE_LOADER_PATH(),\n },\n }\n : {}),\n };\n },\n\n async onBuildComplete(context: BuildCompleteContext | Next15BuildCompleteContext) {\n if (!('projectDir' in context)) {\n await writeNext15Manifest(next15Config, context.outputs);\n return;\n }\n const { projectDir, repoRoot, distDir, config, nextVersion, buildId, routing, outputs } = context;\n const metadataDirectory = path.join(projectDir, '.gigadrive');\n await mkdir(metadataDirectory, { recursive: true });\n const manifestPath = path.join(metadataDirectory, 'nextjs.json');\n const writeManifest = (manifest: unknown) =>\n writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n\n if (!supportsManagedRuntime(nextVersion)) {\n const manifest: GigadriveNextBuildManifestV1 = {\n version: 1,\n output: config.output === 'export' ? 'export' : 'standalone',\n distDir: toPortableRelativePath(projectDir, distDir),\n repoRootToProject: toPortableRelativePath(repoRoot, projectDir, true),\n nextVersion,\n buildId,\n };\n await writeManifest(manifest);\n return;\n }\n\n const portableDistDir = toPortableRelativePath(projectDir, distDir);\n const repoRootToProject = toPortableRelativePath(repoRoot, projectDir, true);\n\n if (config.output === 'export') {\n const manifest: GigadriveNextBuildManifestV2Export = {\n version: 2,\n mode: 'export',\n distDir: portableDistDir,\n repoRootToProject,\n nextVersion,\n buildId,\n };\n await writeManifest(manifest);\n return;\n }\n\n if (config.output === 'standalone') {\n await ensureStandaloneServerTraces(projectDir, repoRoot, distDir, config);\n }\n\n const [resolvedRepoRoot, resolvedProjectDir] = await Promise.all([realpath(repoRoot), realpath(projectDir)]);\n const prerenders = await mapInBatches(outputs.prerenders, (output) =>\n serializePrerenderOutput(repoRoot, resolvedRepoRoot, output)\n );\n const assetManifest = await serializeAssetManifest(\n projectDir,\n resolvedProjectDir,\n distDir,\n config.basePath,\n routing.rsc.contentTypeHeader ?? DEFAULT_RSC_CONTENT_TYPE,\n config.i18n?.locales ?? [],\n outputs.staticFiles\n );\n const prerenderManifest: GigadriveNextPrerenderManifestV1 = {\n version: 1,\n seedMethods: ['GET', 'HEAD'],\n prerenders,\n };\n await mkdir(path.join(metadataDirectory, 'assets'), { recursive: true });\n await Promise.all([\n writeFile(path.join(projectDir, NEXT_ASSET_MANIFEST_PATH), `${JSON.stringify(assetManifest)}\\n`, 'utf8'),\n writeFile(path.join(projectDir, NEXT_PRERENDER_MANIFEST_PATH), `${JSON.stringify(prerenderManifest)}\\n`, 'utf8'),\n ]);\n const server = aggregateServerDescriptor([\n ...outputs.pages,\n ...outputs.pagesApi,\n ...outputs.appPages,\n ...outputs.appRoutes,\n ...(outputs.middleware ? [outputs.middleware] : []),\n ]);\n const images = normalizeImages(config);\n // `.next/static` is thousands of content-hashed, immutable chunks. Register\n // the whole subtree as one edge-served prefix instead of enumerating files.\n const staticAssets: GigadriveNextStaticAssetPrefix[] = [\n { sourceDir: `${portableDistDir}/static`, urlPrefix: '_next/static', immutable: true },\n ];\n\n const manifest: GigadriveNextBuildManifestV2Standalone = {\n version: 2,\n mode: 'standalone-v2',\n distDir: portableDistDir,\n repoRootToProject,\n nextVersion,\n buildId,\n server,\n config: {\n basePath: config.basePath,\n trailingSlash: config.trailingSlash,\n cacheComponents: config.cacheComponents,\n ...(config.i18n ? { i18n: toJsonValue(config.i18n) } : {}),\n ...(images ? { images } : {}),\n },\n routing: {\n beforeMiddleware: toJsonValue(routing.beforeMiddleware) as JsonValue[],\n beforeFiles: toJsonValue(routing.beforeFiles) as JsonValue[],\n afterFiles: toJsonValue(routing.afterFiles) as JsonValue[],\n dynamicRoutes: toJsonValue(routing.dynamicRoutes) as JsonValue[],\n onMatch: toJsonValue(routing.onMatch) as JsonValue[],\n fallback: toJsonValue(routing.fallback) as JsonValue[],\n shouldNormalizeNextData: routing.shouldNormalizeNextData,\n rsc: toJsonValue(routing.rsc),\n },\n outputs: {\n prerenders: [],\n prerenderManifest: NEXT_PRERENDER_MANIFEST_PATH,\n assetManifest: NEXT_ASSET_MANIFEST_PATH,\n entryPagePaths: getEntryPagePaths(prerenders),\n staticAssets,\n middleware: outputs.middleware\n ? {\n present: true,\n matchers: (outputs.middleware.config.matchers ?? []).map(({ source, sourceRegex, has, missing }) => ({\n source,\n sourceRegex,\n has,\n missing,\n })),\n }\n : { present: false, matchers: [] },\n },\n };\n await writeManifest(manifest);\n },\n};\n\nexport { MANAGED_STANDALONE_VALIDATED_MAX_MAJOR };\nexport default gigadriveNextAdapter;\n","import { Option, Schema } from 'effect';\n\nconst HTTP_HEADER_NAME = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\nconst HTTP_HEADER_VALUE = /^[\\t\\x20-\\x7e\\x80-\\xff]*$/;\nconst URL_PATHNAME_FORBIDDEN_CHARACTER = /[\\x00-\\x1f\\x7f?#\\\\]/;\n\nconst isUrlDotSegment = (segment: string): boolean => {\n const decodedDots = segment.replace(/%2e/gi, '.');\n return decodedDots === '.' || decodedDots === '..';\n};\n\nconst isPortableRelativePath = (value: string, allowCurrentDirectory = false): boolean => {\n const normalized = value.replaceAll('\\\\', '/').replace(/^\\.\\//, '').replace(/\\/+$/, '');\n return (\n (allowCurrentDirectory || (normalized !== '' && normalized !== '.')) &&\n !normalized.startsWith('/') &&\n !/^[A-Za-z]:/.test(normalized) &&\n !normalized.includes(':') &&\n !normalized.split('/').includes('..')\n );\n};\n\nexport const PortableRelativePathSchema = Schema.String.pipe(Schema.filter((value) => isPortableRelativePath(value)));\n\nexport const RepositoryRelativePathSchema = Schema.String.pipe(\n Schema.filter((value) => isPortableRelativePath(value, true))\n);\n\nexport const UrlPathnameSchema = Schema.String.pipe(\n Schema.filter(\n (value) =>\n value.startsWith('/') && !URL_PATHNAME_FORBIDDEN_CHARACTER.test(value) && !value.split('/').some(isUrlDotSegment)\n )\n);\n\nexport const HttpHeaderValueSchema = Schema.String.pipe(Schema.pattern(HTTP_HEADER_VALUE));\nexport const HttpHeadersSchema = Schema.mutable(\n Schema.Record({\n key: Schema.String,\n value: Schema.Union(HttpHeaderValueSchema, Schema.mutable(Schema.Array(HttpHeaderValueSchema))),\n })\n).pipe(Schema.filter((headers) => Object.keys(headers).every((name) => HTTP_HEADER_NAME.test(name))));\nexport const HttpSingleValueHeadersSchema = Schema.mutable(\n Schema.Record({ key: Schema.String, value: HttpHeaderValueSchema })\n).pipe(Schema.filter((headers) => Object.keys(headers).every((name) => HTTP_HEADER_NAME.test(name))));\n\n/**\n * Decode an unknown value with an Effect schema.\n *\n * @param schema - Schema used to validate and decode the value.\n * @param value - Unknown input to decode.\n * @returns The decoded value, or `undefined` when validation fails.\n * @example\n * decodeUnknown(Schema.String, 'value');\n */\nexport const decodeUnknown = <A, I>(schema: Schema.Schema<A, I, never>, value: unknown): A | undefined =>\n Schema.decodeUnknownOption(schema, { onExcessProperty: 'preserve' })(value).pipe(Option.getOrUndefined);\n\n/**\n * Decode a JSON string with an Effect schema.\n *\n * @param schema - Schema used to validate and decode the parsed JSON value.\n * @param content - JSON string to parse and decode.\n * @returns The decoded value, or `undefined` when parsing or validation fails.\n * @example\n * decodeJson(Schema.Struct({ version: Schema.Number }), '{\"version\":1}');\n */\nexport const decodeJson = <A, I>(schema: Schema.Schema<A, I, never>, content: string): A | undefined =>\n decodeUnknown(Schema.parseJson(schema), content);\n","/**\n * A representative sample is enough for cache warming. The complete prerender\n * table stays in its sidecar so it cannot expand gateway configuration by\n * thousands of paths.\n */\nexport const MAXIMUM_ENTRY_PAGE_PATHS = 50;\n"],"mappings":"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","names":["Schema","Schema","manifest"]}
@@ -120,17 +120,35 @@ var request = async (pathname, init, attempt = 0) => {
120
120
  }
121
121
  };
122
122
  var cachePath = (kind, key) => `/internal/runtime-cache/v1/entries/${encodeURIComponent(kind)}/${encodeURIComponent(key)}`;
123
- var readRuntimeCache = async (kind, key) => {
123
+ var readEntry = async (kind, key, headers = {}) => {
124
124
  try {
125
- const response = await request(cachePath(kind, key), { method: "GET" });
126
- if (response.status === 404) return void 0;
125
+ const response = await request(cachePath(kind, key), { method: "GET", headers });
127
126
  if (!response.ok) return void 0;
128
127
  const envelope = await response.json();
129
- return decodeBinary(envelope.value);
128
+ return { value: decodeBinary(envelope.value), tagState: envelope.tagState };
130
129
  } catch {
131
130
  return void 0;
132
131
  }
133
132
  };
133
+ var readRuntimeCache = async (kind, key) => (await readEntry(kind, key))?.value;
134
+ var MAX_SOFT_TAGS = 128;
135
+ var MAX_TAG_LENGTH = 256;
136
+ var MAX_SOFT_TAGS_HEADER_LENGTH = 4096;
137
+ var readRuntimeCacheWithTagState = async (kind, key, softTags) => {
138
+ const tags = [...new Set(softTags)];
139
+ const header = JSON.stringify(tags).replace(
140
+ /[\u007f-\uffff]/g,
141
+ (character) => `\\u${character.charCodeAt(0).toString(16).padStart(4, "0")}`
142
+ );
143
+ const sendable = tags.length <= MAX_SOFT_TAGS && tags.every((tag) => tag.length <= MAX_TAG_LENGTH) && header.length <= MAX_SOFT_TAGS_HEADER_LENGTH;
144
+ const entry = await readEntry(kind, key, sendable ? { "x-gigadrive-cache-soft-tags": header } : {});
145
+ if (!entry) return void 0;
146
+ const state = entry.tagState;
147
+ return {
148
+ value: entry.value,
149
+ ...typeof state?.stale === "number" && typeof state.expired === "number" ? { tagState: { stale: state.stale, expired: state.expired } } : {}
150
+ };
151
+ };
134
152
  var writeRuntimeCache = async (kind, key, value, tags = []) => {
135
153
  const response = await request(cachePath(kind, key), {
136
154
  method: "PUT",
@@ -209,9 +227,10 @@ var streamToBytes = async (stream) => {
209
227
  var cacheHandler = {
210
228
  async get(cacheKey, softTags) {
211
229
  await pendingWrites.get(cacheKey);
212
- const value = process.env.GIGADRIVE_NEXT_BUILD === "1" ? buildEntries.get(cacheKey) : await readRuntimeCache("component", cacheKey);
230
+ const read = process.env.GIGADRIVE_NEXT_BUILD === "1" ? { value: buildEntries.get(cacheKey), tagState: { stale: 0, expired: 0 } } : await readRuntimeCacheWithTagState("component", cacheKey, softTags);
231
+ const value = read?.value;
213
232
  if (!isSerializedCacheComponentEntry(value)) return void 0;
214
- const tagState = process.env.GIGADRIVE_NEXT_BUILD === "1" ? { stale: 0, expired: 0 } : await getRuntimeCacheTagState("component", [.../* @__PURE__ */ new Set([...value.tags, ...softTags])]);
233
+ const tagState = read?.tagState ?? await getRuntimeCacheTagState("component", [.../* @__PURE__ */ new Set([...value.tags, ...softTags])]);
215
234
  if (tagState.expired > value.timestamp) return void 0;
216
235
  return {
217
236
  ...value,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/nextjs-cache-components-handler.ts","../src/nextjs-cache-clock.ts","../src/nextjs-runtime-cache-client.ts"],"sourcesContent":["import { nextClockLagMs } from './nextjs-cache-clock';\nimport {\n getRuntimeCacheTagState,\n readRuntimeCache,\n revalidateRuntimeCacheTags,\n writeRuntimeCache,\n} from './nextjs-runtime-cache-client';\n\ninterface CacheComponentEntry {\n value: ReadableStream<Uint8Array>;\n tags: string[];\n stale: number;\n timestamp: number;\n expire: number;\n revalidate: number;\n}\n\ninterface SerializedCacheComponentEntry extends Omit<CacheComponentEntry, 'value'> {\n value: Uint8Array;\n}\n\nconst isSerializedCacheComponentEntry = (value: unknown): value is SerializedCacheComponentEntry => {\n if (typeof value !== 'object' || value === null) return false;\n const entry = value as Partial<SerializedCacheComponentEntry>;\n return (\n entry.value instanceof Uint8Array &&\n Array.isArray(entry.tags) &&\n entry.tags.every((tag) => typeof tag === 'string') &&\n typeof entry.stale === 'number' &&\n typeof entry.timestamp === 'number' &&\n typeof entry.expire === 'number' &&\n typeof entry.revalidate === 'number'\n );\n};\n\nconst pendingWrites = new Map<string, Promise<void>>();\nconst buildEntries = new Map<string, SerializedCacheComponentEntry>();\n\nconst streamToBytes = async (stream: ReadableStream<Uint8Array>): Promise<Uint8Array> => {\n const chunks: Uint8Array[] = [];\n let size = 0;\n const reader = stream.getReader();\n while (true) {\n const result = await reader.read();\n if (result.done) break;\n chunks.push(result.value);\n size += result.value.byteLength;\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n};\n\n/** Shared Network cache handler for Next.js Cache Components and `use cache`. */\nconst cacheHandler = {\n async get(cacheKey: string, softTags: string[]): Promise<CacheComponentEntry | undefined> {\n await pendingWrites.get(cacheKey);\n const value =\n process.env.GIGADRIVE_NEXT_BUILD === '1'\n ? buildEntries.get(cacheKey)\n : await readRuntimeCache('component', cacheKey);\n if (!isSerializedCacheComponentEntry(value)) return undefined;\n const tagState =\n process.env.GIGADRIVE_NEXT_BUILD === '1'\n ? { stale: 0, expired: 0 }\n : await getRuntimeCacheTagState('component', [...new Set([...value.tags, ...softTags])]);\n if (tagState.expired > value.timestamp) return undefined;\n return {\n ...value,\n // Build entries were stamped by Next itself, so only stored ones need moving.\n timestamp: process.env.GIGADRIVE_NEXT_BUILD === '1' ? value.timestamp : value.timestamp - nextClockLagMs(),\n ...(tagState.stale > value.timestamp ? { revalidate: -1 } : {}),\n value: new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(value.value);\n controller.close();\n },\n }),\n };\n },\n\n async set(cacheKey: string, pendingEntry: Promise<CacheComponentEntry>): Promise<void> {\n const write = (async () => {\n const entry = await pendingEntry;\n const value = await streamToBytes(entry.value);\n const serializedEntry = { ...entry, value };\n if (process.env.GIGADRIVE_NEXT_BUILD === '1') {\n buildEntries.set(cacheKey, serializedEntry);\n } else {\n const stored = { ...serializedEntry, timestamp: entry.timestamp + nextClockLagMs() };\n await writeRuntimeCache('component', cacheKey, stored, entry.tags);\n }\n })();\n pendingWrites.set(cacheKey, write);\n try {\n await write;\n } finally {\n if (pendingWrites.get(cacheKey) === write) pendingWrites.delete(cacheKey);\n }\n },\n\n async refreshTags(): Promise<void> {},\n\n getExpiration(): Promise<number> {\n return Promise.resolve(Infinity);\n },\n\n async updateTags(tags: string[], durations?: { expire?: number }): Promise<void> {\n if (process.env.GIGADRIVE_NEXT_BUILD === '1') {\n for (const [key, entry] of buildEntries) {\n if (entry.tags.some((tag) => tags.includes(tag))) buildEntries.delete(key);\n }\n return;\n }\n return revalidateRuntimeCacheTags('component', tags, durations);\n },\n};\n\nexport default cacheHandler;\n","/** Differences below this are ordinary timer noise, not a clock that fell behind. */\nconst NEGLIGIBLE_LAG_MS = 1_000;\n\n/**\n * How far Next's clock trails the wall clock.\n *\n * Next measures cache age with `performance.timeOrigin + performance.now()`,\n * which is built on the monotonic clock. A process resumed from a snapshot keeps\n * its monotonic clock from before the pause, while the wall clock is corrected,\n * so Next's clock falls behind by every moment spent paused. An entry stamped\n * with the wall clock then looks newer than it is and never goes stale.\n *\n * Stored timestamps use the wall clock, because other processes read them.\n * Anything handed to Next is shifted onto its clock by this amount.\n */\nexport const nextClockLagMs = (): number => {\n const lag = Date.now() - (performance.timeOrigin + performance.now());\n return Math.abs(lag) < NEGLIGIBLE_LAG_MS ? 0 : lag;\n};\n","interface RuntimeCacheEnvelope {\n value: unknown;\n}\n\ninterface AccessTokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\nexport interface RuntimeCacheTagState {\n stale: number;\n expired: number;\n}\n\nlet cachedToken: { value: string; expiresAt: number } | undefined;\n\nconst apiBaseUrl = (): string => (process.env.GIGADRIVE_API_URL ?? 'https://api.gigadrive.network').replace(/\\/$/, '');\n\nconst encodeBinary = (value: unknown, seen = new WeakSet<object>()): unknown => {\n if (value instanceof Uint8Array) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n if (value instanceof ArrayBuffer) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n // Next stores App Router RSC segment payloads as a `Map<string, Buffer>`\n // (`segmentData`). `Object.entries` on a Map yields nothing, so without an\n // explicit branch the whole map would serialize to `{}` and every prefetched\n // segment would be silently lost on the next read.\n if (value instanceof Map) {\n if (seen.has(value)) throw new Error('Next.js cache entry contains a circular value');\n seen.add(value);\n const entries = [...value.entries()].map(([key, item]) => [encodeBinary(key, seen), encodeBinary(item, seen)]);\n seen.delete(value);\n return { __gigadriveType: 'map', value: entries };\n }\n if (Array.isArray(value)) return value.map((item) => encodeBinary(item, seen));\n if (typeof value !== 'object' || value === null) return value;\n if (seen.has(value)) throw new Error('Next.js cache entry contains a circular value');\n seen.add(value);\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) result[key] = encodeBinary(item, seen);\n seen.delete(value);\n return result;\n};\n\nconst decodeBinary = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(decodeBinary);\n if (typeof value !== 'object' || value === null) return value;\n const record = value as Record<string, unknown>;\n if (record.__gigadriveType === 'bytes' && typeof record.value === 'string')\n return Buffer.from(record.value, 'base64');\n if (record.__gigadriveType === 'map' && Array.isArray(record.value)) {\n return new Map(\n (record.value as unknown[]).map((entry) => {\n const [key, item] = entry as [unknown, unknown];\n return [decodeBinary(key), decodeBinary(item)];\n })\n );\n }\n return Object.fromEntries(Object.entries(record).map(([key, item]) => [key, decodeBinary(item)]));\n};\n\nconst getAccessToken = async (): Promise<string> => {\n if (cachedToken && cachedToken.expiresAt > Date.now() + 30_000) return cachedToken.value;\n const clientId = process.env.GIGADRIVE_CLIENT_ID;\n const clientSecret = process.env.GIGADRIVE_CLIENT_SECRET;\n if (!clientId || !clientSecret) throw new Error('Gigadrive workload credentials are unavailable');\n\n const response = await fetch(`${apiBaseUrl()}/oauth2/token`, {\n method: 'POST',\n headers: {\n authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString('base64')}`,\n 'content-type': 'application/x-www-form-urlencoded',\n },\n body: 'grant_type=client_credentials',\n });\n if (!response.ok) throw new Error(`Gigadrive workload authentication failed with status ${response.status}`);\n const token = (await response.json()) as AccessTokenResponse;\n if (!token.access_token) throw new Error('Gigadrive workload authentication returned no access token');\n cachedToken = {\n value: token.access_token,\n expiresAt: Date.now() + Math.max(60, token.expires_in ?? 300) * 1000,\n };\n return token.access_token;\n};\n\nconst request = async (pathname: string, init: RequestInit, attempt = 0): Promise<Response> => {\n const token = await getAccessToken();\n try {\n const response = await fetch(`${apiBaseUrl()}${pathname}`, {\n ...init,\n headers: {\n authorization: `Bearer ${token}`,\n 'content-type': 'application/json',\n 'x-gigadrive-deployment-id': process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? '',\n 'x-gigadrive-build-id': process.env.NEXT_BUILD_ID ?? '',\n ...init.headers,\n },\n });\n if (response.status === 401 && attempt === 0) {\n cachedToken = undefined;\n return request(pathname, init, attempt + 1);\n }\n if (response.status >= 500 && attempt < 2) return request(pathname, init, attempt + 1);\n return response;\n } catch (error) {\n if (attempt < 2) return request(pathname, init, attempt + 1);\n throw error;\n }\n};\n\nconst cachePath = (kind: string, key: string): string =>\n `/internal/runtime-cache/v1/entries/${encodeURIComponent(kind)}/${encodeURIComponent(key)}`;\n\nexport const readRuntimeCache = async (kind: string, key: string): Promise<unknown | undefined> => {\n try {\n const response = await request(cachePath(kind, key), { method: 'GET' });\n if (response.status === 404) return undefined;\n if (!response.ok) return undefined;\n const envelope = (await response.json()) as RuntimeCacheEnvelope;\n return decodeBinary(envelope.value);\n } catch {\n return undefined;\n }\n};\n\nexport const writeRuntimeCache = async (\n kind: string,\n key: string,\n value: unknown,\n tags: readonly string[] = []\n): Promise<void> => {\n const response = await request(cachePath(kind, key), {\n method: 'PUT',\n body: JSON.stringify({ value: encodeBinary(value), tags }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache write failed with status ${response.status}`);\n};\n\nexport const revalidateRuntimeCacheTags = async (\n kind: string,\n tags: readonly string[],\n durations?: { expire?: number }\n): Promise<void> => {\n const response = await request('/internal/runtime-cache/v1/tags/revalidate', {\n method: 'POST',\n body: JSON.stringify({ kind, tags, durations }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache revalidation failed with status ${response.status}`);\n};\n\nexport const getRuntimeCacheTagExpiration = async (kind: string, tags: readonly string[]): Promise<number> => {\n try {\n const response = await request('/internal/runtime-cache/v1/tags/expiration', {\n method: 'POST',\n body: JSON.stringify({ kind, tags }),\n });\n if (!response.ok) return 0;\n const value = (await response.json()) as { expiration?: unknown };\n return typeof value.expiration === 'number' ? value.expiration : 0;\n } catch {\n return 0;\n }\n};\n\nexport const getRuntimeCacheTagState = async (kind: string, tags: readonly string[]): Promise<RuntimeCacheTagState> => {\n try {\n const response = await request('/internal/runtime-cache/v1/tags/state', {\n method: 'POST',\n body: JSON.stringify({ kind, tags }),\n });\n if (!response.ok) return { stale: 0, expired: 0 };\n const value = (await response.json()) as { stale?: unknown; expired?: unknown };\n return {\n stale: typeof value.stale === 'number' ? value.stale : 0,\n expired: typeof value.expired === 'number' ? value.expired : 0,\n };\n } catch {\n return { stale: 0, expired: 0 };\n }\n};\n\nexport const resetRuntimeCacheClientForTests = (): void => {\n cachedToken = undefined;\n};\n\n/**\n * Re-establishes the client's network state after a microVM resume.\n *\n * The guest runtime delivers SIGUSR2 when the instance is restored from a\n * suspend snapshot. At that moment every kept-alive TCP connection from before\n * the freeze is dead, and the cached OAuth token may have expired while the\n * clock was stopped. Dropping the token and dialing one throwaway read\n * re-opens TCP+TLS and refreshes the token concurrently with the guest's own\n * wake-up work, so the first real cache read after a resume does not\n * serialize behind reconnection.\n *\n * Registered only when a Gigadrive deployment marker is present in the\n * environment, so local `next dev`/`next build` never gains a signal listener.\n */\nconst registerResumeRewarm = (): void => {\n // Next exposes this marker before evaluating an Edge route bundle. Bail out\n // before touching `process`: its Edge compatibility proxy throws when the\n // Node-only signal API is read, including through Reflect.\n if (Reflect.has(globalThis, 'EdgeRuntime')) return;\n\n // The deployment id is intentionally available during `next build`, but the\n // shared cache client is also bundled into Edge routes at that point. Keep\n // every Node-only signal reference behind the build-phase guard so Turbopack\n // can eliminate this branch before its Edge runtime validation runs.\n if (process.env.GIGADRIVE_NEXT_BUILD === '1') return;\n\n const onGigadrive =\n process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? process.env.GIGADRIVE_CLIENT_ID;\n if (!onGigadrive) return;\n\n // Resolve the optional Node signal API reflectively so non-Node runtimes can\n // load the shared client while Node deployments retain resume rewarming.\n const runtimeProcess = Reflect.get(globalThis, 'process') as NodeJS.Process | undefined;\n const addSignalListener = runtimeProcess && Reflect.get(runtimeProcess, 'on');\n if (typeof addSignalListener !== 'function') return;\n\n Reflect.apply(addSignalListener, runtimeProcess, [\n 'SIGUSR2',\n () => {\n cachedToken = undefined;\n if (!process.env.GIGADRIVE_CLIENT_ID || !process.env.GIGADRIVE_CLIENT_SECRET) return;\n void readRuntimeCache('warmup', '__resume__');\n },\n ]);\n};\nregisterResumeRewarm();\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/nextjs-cache-components-handler.ts","../src/nextjs-cache-clock.ts","../src/nextjs-runtime-cache-client.ts"],"sourcesContent":["import { nextClockLagMs } from './nextjs-cache-clock';\nimport {\n getRuntimeCacheTagState,\n readRuntimeCacheWithTagState,\n revalidateRuntimeCacheTags,\n writeRuntimeCache,\n} from './nextjs-runtime-cache-client';\n\ninterface CacheComponentEntry {\n value: ReadableStream<Uint8Array>;\n tags: string[];\n stale: number;\n timestamp: number;\n expire: number;\n revalidate: number;\n}\n\ninterface SerializedCacheComponentEntry extends Omit<CacheComponentEntry, 'value'> {\n value: Uint8Array;\n}\n\nconst isSerializedCacheComponentEntry = (value: unknown): value is SerializedCacheComponentEntry => {\n if (typeof value !== 'object' || value === null) return false;\n const entry = value as Partial<SerializedCacheComponentEntry>;\n return (\n entry.value instanceof Uint8Array &&\n Array.isArray(entry.tags) &&\n entry.tags.every((tag) => typeof tag === 'string') &&\n typeof entry.stale === 'number' &&\n typeof entry.timestamp === 'number' &&\n typeof entry.expire === 'number' &&\n typeof entry.revalidate === 'number'\n );\n};\n\nconst pendingWrites = new Map<string, Promise<void>>();\nconst buildEntries = new Map<string, SerializedCacheComponentEntry>();\n\nconst streamToBytes = async (stream: ReadableStream<Uint8Array>): Promise<Uint8Array> => {\n const chunks: Uint8Array[] = [];\n let size = 0;\n const reader = stream.getReader();\n while (true) {\n const result = await reader.read();\n if (result.done) break;\n chunks.push(result.value);\n size += result.value.byteLength;\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n};\n\n/** Shared Network cache handler for Next.js Cache Components and `use cache`. */\nconst cacheHandler = {\n async get(cacheKey: string, softTags: string[]): Promise<CacheComponentEntry | undefined> {\n await pendingWrites.get(cacheKey);\n const read =\n process.env.GIGADRIVE_NEXT_BUILD === '1'\n ? { value: buildEntries.get(cacheKey), tagState: { stale: 0, expired: 0 } }\n : await readRuntimeCacheWithTagState('component', cacheKey, softTags);\n const value = read?.value;\n if (!isSerializedCacheComponentEntry(value)) return undefined;\n const tagState =\n read?.tagState ?? (await getRuntimeCacheTagState('component', [...new Set([...value.tags, ...softTags])]));\n if (tagState.expired > value.timestamp) return undefined;\n return {\n ...value,\n // Build entries were stamped by Next itself, so only stored ones need moving.\n timestamp: process.env.GIGADRIVE_NEXT_BUILD === '1' ? value.timestamp : value.timestamp - nextClockLagMs(),\n ...(tagState.stale > value.timestamp ? { revalidate: -1 } : {}),\n value: new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(value.value);\n controller.close();\n },\n }),\n };\n },\n\n async set(cacheKey: string, pendingEntry: Promise<CacheComponentEntry>): Promise<void> {\n const write = (async () => {\n const entry = await pendingEntry;\n const value = await streamToBytes(entry.value);\n const serializedEntry = { ...entry, value };\n if (process.env.GIGADRIVE_NEXT_BUILD === '1') {\n buildEntries.set(cacheKey, serializedEntry);\n } else {\n const stored = { ...serializedEntry, timestamp: entry.timestamp + nextClockLagMs() };\n await writeRuntimeCache('component', cacheKey, stored, entry.tags);\n }\n })();\n pendingWrites.set(cacheKey, write);\n try {\n await write;\n } finally {\n if (pendingWrites.get(cacheKey) === write) pendingWrites.delete(cacheKey);\n }\n },\n\n async refreshTags(): Promise<void> {},\n\n getExpiration(): Promise<number> {\n return Promise.resolve(Infinity);\n },\n\n async updateTags(tags: string[], durations?: { expire?: number }): Promise<void> {\n if (process.env.GIGADRIVE_NEXT_BUILD === '1') {\n for (const [key, entry] of buildEntries) {\n if (entry.tags.some((tag) => tags.includes(tag))) buildEntries.delete(key);\n }\n return;\n }\n return revalidateRuntimeCacheTags('component', tags, durations);\n },\n};\n\nexport default cacheHandler;\n","/** Differences below this are ordinary timer noise, not a clock that fell behind. */\nconst NEGLIGIBLE_LAG_MS = 1_000;\n\n/**\n * How far Next's clock trails the wall clock.\n *\n * Next measures cache age with `performance.timeOrigin + performance.now()`,\n * which is built on the monotonic clock. A process resumed from a snapshot keeps\n * its monotonic clock from before the pause, while the wall clock is corrected,\n * so Next's clock falls behind by every moment spent paused. An entry stamped\n * with the wall clock then looks newer than it is and never goes stale.\n *\n * Stored timestamps use the wall clock, because other processes read them.\n * Anything handed to Next is shifted onto its clock by this amount.\n */\nexport const nextClockLagMs = (): number => {\n const lag = Date.now() - (performance.timeOrigin + performance.now());\n return Math.abs(lag) < NEGLIGIBLE_LAG_MS ? 0 : lag;\n};\n","interface RuntimeCacheEnvelope {\n value: unknown;\n}\n\ninterface AccessTokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\nexport interface RuntimeCacheTagState {\n stale: number;\n expired: number;\n}\n\nlet cachedToken: { value: string; expiresAt: number } | undefined;\n\nconst apiBaseUrl = (): string => (process.env.GIGADRIVE_API_URL ?? 'https://api.gigadrive.network').replace(/\\/$/, '');\n\nconst encodeBinary = (value: unknown, seen = new WeakSet<object>()): unknown => {\n if (value instanceof Uint8Array) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n if (value instanceof ArrayBuffer) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n // Next stores App Router RSC segment payloads as a `Map<string, Buffer>`\n // (`segmentData`). `Object.entries` on a Map yields nothing, so without an\n // explicit branch the whole map would serialize to `{}` and every prefetched\n // segment would be silently lost on the next read.\n if (value instanceof Map) {\n if (seen.has(value)) throw new Error('Next.js cache entry contains a circular value');\n seen.add(value);\n const entries = [...value.entries()].map(([key, item]) => [encodeBinary(key, seen), encodeBinary(item, seen)]);\n seen.delete(value);\n return { __gigadriveType: 'map', value: entries };\n }\n if (Array.isArray(value)) return value.map((item) => encodeBinary(item, seen));\n if (typeof value !== 'object' || value === null) return value;\n if (seen.has(value)) throw new Error('Next.js cache entry contains a circular value');\n seen.add(value);\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) result[key] = encodeBinary(item, seen);\n seen.delete(value);\n return result;\n};\n\nconst decodeBinary = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(decodeBinary);\n if (typeof value !== 'object' || value === null) return value;\n const record = value as Record<string, unknown>;\n if (record.__gigadriveType === 'bytes' && typeof record.value === 'string')\n return Buffer.from(record.value, 'base64');\n if (record.__gigadriveType === 'map' && Array.isArray(record.value)) {\n return new Map(\n (record.value as unknown[]).map((entry) => {\n const [key, item] = entry as [unknown, unknown];\n return [decodeBinary(key), decodeBinary(item)];\n })\n );\n }\n return Object.fromEntries(Object.entries(record).map(([key, item]) => [key, decodeBinary(item)]));\n};\n\nconst getAccessToken = async (): Promise<string> => {\n if (cachedToken && cachedToken.expiresAt > Date.now() + 30_000) return cachedToken.value;\n const clientId = process.env.GIGADRIVE_CLIENT_ID;\n const clientSecret = process.env.GIGADRIVE_CLIENT_SECRET;\n if (!clientId || !clientSecret) throw new Error('Gigadrive workload credentials are unavailable');\n\n const response = await fetch(`${apiBaseUrl()}/oauth2/token`, {\n method: 'POST',\n headers: {\n authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString('base64')}`,\n 'content-type': 'application/x-www-form-urlencoded',\n },\n body: 'grant_type=client_credentials',\n });\n if (!response.ok) throw new Error(`Gigadrive workload authentication failed with status ${response.status}`);\n const token = (await response.json()) as AccessTokenResponse;\n if (!token.access_token) throw new Error('Gigadrive workload authentication returned no access token');\n cachedToken = {\n value: token.access_token,\n expiresAt: Date.now() + Math.max(60, token.expires_in ?? 300) * 1000,\n };\n return token.access_token;\n};\n\nconst request = async (pathname: string, init: RequestInit, attempt = 0): Promise<Response> => {\n const token = await getAccessToken();\n try {\n const response = await fetch(`${apiBaseUrl()}${pathname}`, {\n ...init,\n headers: {\n authorization: `Bearer ${token}`,\n 'content-type': 'application/json',\n 'x-gigadrive-deployment-id': process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? '',\n 'x-gigadrive-build-id': process.env.NEXT_BUILD_ID ?? '',\n ...init.headers,\n },\n });\n if (response.status === 401 && attempt === 0) {\n cachedToken = undefined;\n return request(pathname, init, attempt + 1);\n }\n if (response.status >= 500 && attempt < 2) return request(pathname, init, attempt + 1);\n return response;\n } catch (error) {\n if (attempt < 2) return request(pathname, init, attempt + 1);\n throw error;\n }\n};\n\nconst cachePath = (kind: string, key: string): string =>\n `/internal/runtime-cache/v1/entries/${encodeURIComponent(kind)}/${encodeURIComponent(key)}`;\n\n/** Reads and decodes an entry; anything that fails, malformed stored data included, is a miss. */\nconst readEntry = async (\n kind: string,\n key: string,\n headers: Record<string, string> = {}\n): Promise<{ value: unknown; tagState?: unknown } | undefined> => {\n try {\n const response = await request(cachePath(kind, key), { method: 'GET', headers });\n if (!response.ok) return undefined;\n const envelope = (await response.json()) as RuntimeCacheEnvelope & { tagState?: unknown };\n return { value: decodeBinary(envelope.value), tagState: envelope.tagState };\n } catch {\n return undefined;\n }\n};\n\nexport const readRuntimeCache = async (kind: string, key: string): Promise<unknown | undefined> =>\n (await readEntry(kind, key))?.value;\n\n/** The API's limits on the soft tags of a combined read. */\nconst MAX_SOFT_TAGS = 128;\nconst MAX_TAG_LENGTH = 256;\n/** Well under the header limits of the CDN and load balancer in front of the API. */\nconst MAX_SOFT_TAGS_HEADER_LENGTH = 4096;\n\n/**\n * Reads an entry and, in the same request, the tag state of its own tags plus `softTags`.\n *\n * Saves the separate tag-state round trip on every hit. `tagState` is absent when the API answers\n * the entry alone (an API without combined reads, or soft tags too many or too long to send), so\n * the caller asks for it separately.\n */\nexport const readRuntimeCacheWithTagState = async (\n kind: string,\n key: string,\n softTags: readonly string[]\n): Promise<{ value: unknown; tagState?: RuntimeCacheTagState } | undefined> => {\n const tags = [...new Set(softTags)];\n // Escape everything outside ASCII so the list is always a valid header value.\n const header = JSON.stringify(tags).replace(\n /[\\u007f-\\uffff]/g,\n (character) => `\\\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`\n );\n const sendable =\n tags.length <= MAX_SOFT_TAGS &&\n tags.every((tag) => tag.length <= MAX_TAG_LENGTH) &&\n header.length <= MAX_SOFT_TAGS_HEADER_LENGTH;\n const entry = await readEntry(kind, key, sendable ? { 'x-gigadrive-cache-soft-tags': header } : {});\n if (!entry) return undefined;\n const state = entry.tagState as { stale?: unknown; expired?: unknown } | undefined;\n return {\n value: entry.value,\n ...(typeof state?.stale === 'number' && typeof state.expired === 'number'\n ? { tagState: { stale: state.stale, expired: state.expired } }\n : {}),\n };\n};\n\nexport const writeRuntimeCache = async (\n kind: string,\n key: string,\n value: unknown,\n tags: readonly string[] = []\n): Promise<void> => {\n const response = await request(cachePath(kind, key), {\n method: 'PUT',\n body: JSON.stringify({ value: encodeBinary(value), tags }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache write failed with status ${response.status}`);\n};\n\nexport const revalidateRuntimeCacheTags = async (\n kind: string,\n tags: readonly string[],\n durations?: { expire?: number }\n): Promise<void> => {\n const response = await request('/internal/runtime-cache/v1/tags/revalidate', {\n method: 'POST',\n body: JSON.stringify({ kind, tags, durations }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache revalidation failed with status ${response.status}`);\n};\n\nexport const getRuntimeCacheTagExpiration = async (kind: string, tags: readonly string[]): Promise<number> => {\n try {\n const response = await request('/internal/runtime-cache/v1/tags/expiration', {\n method: 'POST',\n body: JSON.stringify({ kind, tags }),\n });\n if (!response.ok) return 0;\n const value = (await response.json()) as { expiration?: unknown };\n return typeof value.expiration === 'number' ? value.expiration : 0;\n } catch {\n return 0;\n }\n};\n\nexport const getRuntimeCacheTagState = async (kind: string, tags: readonly string[]): Promise<RuntimeCacheTagState> => {\n try {\n const response = await request('/internal/runtime-cache/v1/tags/state', {\n method: 'POST',\n body: JSON.stringify({ kind, tags }),\n });\n if (!response.ok) return { stale: 0, expired: 0 };\n const value = (await response.json()) as { stale?: unknown; expired?: unknown };\n return {\n stale: typeof value.stale === 'number' ? value.stale : 0,\n expired: typeof value.expired === 'number' ? value.expired : 0,\n };\n } catch {\n return { stale: 0, expired: 0 };\n }\n};\n\nexport const resetRuntimeCacheClientForTests = (): void => {\n cachedToken = undefined;\n};\n\n/**\n * Re-establishes the client's network state after a microVM resume.\n *\n * The guest runtime delivers SIGUSR2 when the instance is restored from a\n * suspend snapshot. At that moment every kept-alive TCP connection from before\n * the freeze is dead, and the cached OAuth token may have expired while the\n * clock was stopped. Dropping the token and dialing one throwaway read\n * re-opens TCP+TLS and refreshes the token concurrently with the guest's own\n * wake-up work, so the first real cache read after a resume does not\n * serialize behind reconnection.\n *\n * Registered only when a Gigadrive deployment marker is present in the\n * environment, so local `next dev`/`next build` never gains a signal listener.\n */\nconst registerResumeRewarm = (): void => {\n // Next exposes this marker before evaluating an Edge route bundle. Bail out\n // before touching `process`: its Edge compatibility proxy throws when the\n // Node-only signal API is read, including through Reflect.\n if (Reflect.has(globalThis, 'EdgeRuntime')) return;\n\n // The deployment id is intentionally available during `next build`, but the\n // shared cache client is also bundled into Edge routes at that point. Keep\n // every Node-only signal reference behind the build-phase guard so Turbopack\n // can eliminate this branch before its Edge runtime validation runs.\n if (process.env.GIGADRIVE_NEXT_BUILD === '1') return;\n\n const onGigadrive =\n process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? process.env.GIGADRIVE_CLIENT_ID;\n if (!onGigadrive) return;\n\n // Resolve the optional Node signal API reflectively so non-Node runtimes can\n // load the shared client while Node deployments retain resume rewarming.\n const runtimeProcess = Reflect.get(globalThis, 'process') as NodeJS.Process | undefined;\n const addSignalListener = runtimeProcess && Reflect.get(runtimeProcess, 'on');\n if (typeof addSignalListener !== 'function') return;\n\n Reflect.apply(addSignalListener, runtimeProcess, [\n 'SIGUSR2',\n () => {\n cachedToken = undefined;\n if (!process.env.GIGADRIVE_CLIENT_ID || !process.env.GIGADRIVE_CLIENT_SECRET) return;\n void readRuntimeCache('warmup', '__resume__');\n },\n ]);\n};\nregisterResumeRewarm();\n"],"mappings":"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","names":[]}
@@ -94,17 +94,35 @@ var request = async (pathname, init, attempt = 0) => {
94
94
  }
95
95
  };
96
96
  var cachePath = (kind, key) => `/internal/runtime-cache/v1/entries/${encodeURIComponent(kind)}/${encodeURIComponent(key)}`;
97
- var readRuntimeCache = async (kind, key) => {
97
+ var readEntry = async (kind, key, headers = {}) => {
98
98
  try {
99
- const response = await request(cachePath(kind, key), { method: "GET" });
100
- if (response.status === 404) return void 0;
99
+ const response = await request(cachePath(kind, key), { method: "GET", headers });
101
100
  if (!response.ok) return void 0;
102
101
  const envelope = await response.json();
103
- return decodeBinary(envelope.value);
102
+ return { value: decodeBinary(envelope.value), tagState: envelope.tagState };
104
103
  } catch {
105
104
  return void 0;
106
105
  }
107
106
  };
107
+ var readRuntimeCache = async (kind, key) => (await readEntry(kind, key))?.value;
108
+ var MAX_SOFT_TAGS = 128;
109
+ var MAX_TAG_LENGTH = 256;
110
+ var MAX_SOFT_TAGS_HEADER_LENGTH = 4096;
111
+ var readRuntimeCacheWithTagState = async (kind, key, softTags) => {
112
+ const tags = [...new Set(softTags)];
113
+ const header = JSON.stringify(tags).replace(
114
+ /[\u007f-\uffff]/g,
115
+ (character) => `\\u${character.charCodeAt(0).toString(16).padStart(4, "0")}`
116
+ );
117
+ const sendable = tags.length <= MAX_SOFT_TAGS && tags.every((tag) => tag.length <= MAX_TAG_LENGTH) && header.length <= MAX_SOFT_TAGS_HEADER_LENGTH;
118
+ const entry = await readEntry(kind, key, sendable ? { "x-gigadrive-cache-soft-tags": header } : {});
119
+ if (!entry) return void 0;
120
+ const state = entry.tagState;
121
+ return {
122
+ value: entry.value,
123
+ ...typeof state?.stale === "number" && typeof state.expired === "number" ? { tagState: { stale: state.stale, expired: state.expired } } : {}
124
+ };
125
+ };
108
126
  var writeRuntimeCache = async (kind, key, value, tags = []) => {
109
127
  const response = await request(cachePath(kind, key), {
110
128
  method: "PUT",
@@ -183,9 +201,10 @@ var streamToBytes = async (stream) => {
183
201
  var cacheHandler = {
184
202
  async get(cacheKey, softTags) {
185
203
  await pendingWrites.get(cacheKey);
186
- const value = process.env.GIGADRIVE_NEXT_BUILD === "1" ? buildEntries.get(cacheKey) : await readRuntimeCache("component", cacheKey);
204
+ const read = process.env.GIGADRIVE_NEXT_BUILD === "1" ? { value: buildEntries.get(cacheKey), tagState: { stale: 0, expired: 0 } } : await readRuntimeCacheWithTagState("component", cacheKey, softTags);
205
+ const value = read?.value;
187
206
  if (!isSerializedCacheComponentEntry(value)) return void 0;
188
- const tagState = process.env.GIGADRIVE_NEXT_BUILD === "1" ? { stale: 0, expired: 0 } : await getRuntimeCacheTagState("component", [.../* @__PURE__ */ new Set([...value.tags, ...softTags])]);
207
+ const tagState = read?.tagState ?? await getRuntimeCacheTagState("component", [.../* @__PURE__ */ new Set([...value.tags, ...softTags])]);
189
208
  if (tagState.expired > value.timestamp) return void 0;
190
209
  return {
191
210
  ...value,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/nextjs-cache-clock.ts","../src/nextjs-runtime-cache-client.ts","../src/nextjs-cache-components-handler.ts"],"sourcesContent":["/** Differences below this are ordinary timer noise, not a clock that fell behind. */\nconst NEGLIGIBLE_LAG_MS = 1_000;\n\n/**\n * How far Next's clock trails the wall clock.\n *\n * Next measures cache age with `performance.timeOrigin + performance.now()`,\n * which is built on the monotonic clock. A process resumed from a snapshot keeps\n * its monotonic clock from before the pause, while the wall clock is corrected,\n * so Next's clock falls behind by every moment spent paused. An entry stamped\n * with the wall clock then looks newer than it is and never goes stale.\n *\n * Stored timestamps use the wall clock, because other processes read them.\n * Anything handed to Next is shifted onto its clock by this amount.\n */\nexport const nextClockLagMs = (): number => {\n const lag = Date.now() - (performance.timeOrigin + performance.now());\n return Math.abs(lag) < NEGLIGIBLE_LAG_MS ? 0 : lag;\n};\n","interface RuntimeCacheEnvelope {\n value: unknown;\n}\n\ninterface AccessTokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\nexport interface RuntimeCacheTagState {\n stale: number;\n expired: number;\n}\n\nlet cachedToken: { value: string; expiresAt: number } | undefined;\n\nconst apiBaseUrl = (): string => (process.env.GIGADRIVE_API_URL ?? 'https://api.gigadrive.network').replace(/\\/$/, '');\n\nconst encodeBinary = (value: unknown, seen = new WeakSet<object>()): unknown => {\n if (value instanceof Uint8Array) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n if (value instanceof ArrayBuffer) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n // Next stores App Router RSC segment payloads as a `Map<string, Buffer>`\n // (`segmentData`). `Object.entries` on a Map yields nothing, so without an\n // explicit branch the whole map would serialize to `{}` and every prefetched\n // segment would be silently lost on the next read.\n if (value instanceof Map) {\n if (seen.has(value)) throw new Error('Next.js cache entry contains a circular value');\n seen.add(value);\n const entries = [...value.entries()].map(([key, item]) => [encodeBinary(key, seen), encodeBinary(item, seen)]);\n seen.delete(value);\n return { __gigadriveType: 'map', value: entries };\n }\n if (Array.isArray(value)) return value.map((item) => encodeBinary(item, seen));\n if (typeof value !== 'object' || value === null) return value;\n if (seen.has(value)) throw new Error('Next.js cache entry contains a circular value');\n seen.add(value);\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) result[key] = encodeBinary(item, seen);\n seen.delete(value);\n return result;\n};\n\nconst decodeBinary = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(decodeBinary);\n if (typeof value !== 'object' || value === null) return value;\n const record = value as Record<string, unknown>;\n if (record.__gigadriveType === 'bytes' && typeof record.value === 'string')\n return Buffer.from(record.value, 'base64');\n if (record.__gigadriveType === 'map' && Array.isArray(record.value)) {\n return new Map(\n (record.value as unknown[]).map((entry) => {\n const [key, item] = entry as [unknown, unknown];\n return [decodeBinary(key), decodeBinary(item)];\n })\n );\n }\n return Object.fromEntries(Object.entries(record).map(([key, item]) => [key, decodeBinary(item)]));\n};\n\nconst getAccessToken = async (): Promise<string> => {\n if (cachedToken && cachedToken.expiresAt > Date.now() + 30_000) return cachedToken.value;\n const clientId = process.env.GIGADRIVE_CLIENT_ID;\n const clientSecret = process.env.GIGADRIVE_CLIENT_SECRET;\n if (!clientId || !clientSecret) throw new Error('Gigadrive workload credentials are unavailable');\n\n const response = await fetch(`${apiBaseUrl()}/oauth2/token`, {\n method: 'POST',\n headers: {\n authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString('base64')}`,\n 'content-type': 'application/x-www-form-urlencoded',\n },\n body: 'grant_type=client_credentials',\n });\n if (!response.ok) throw new Error(`Gigadrive workload authentication failed with status ${response.status}`);\n const token = (await response.json()) as AccessTokenResponse;\n if (!token.access_token) throw new Error('Gigadrive workload authentication returned no access token');\n cachedToken = {\n value: token.access_token,\n expiresAt: Date.now() + Math.max(60, token.expires_in ?? 300) * 1000,\n };\n return token.access_token;\n};\n\nconst request = async (pathname: string, init: RequestInit, attempt = 0): Promise<Response> => {\n const token = await getAccessToken();\n try {\n const response = await fetch(`${apiBaseUrl()}${pathname}`, {\n ...init,\n headers: {\n authorization: `Bearer ${token}`,\n 'content-type': 'application/json',\n 'x-gigadrive-deployment-id': process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? '',\n 'x-gigadrive-build-id': process.env.NEXT_BUILD_ID ?? '',\n ...init.headers,\n },\n });\n if (response.status === 401 && attempt === 0) {\n cachedToken = undefined;\n return request(pathname, init, attempt + 1);\n }\n if (response.status >= 500 && attempt < 2) return request(pathname, init, attempt + 1);\n return response;\n } catch (error) {\n if (attempt < 2) return request(pathname, init, attempt + 1);\n throw error;\n }\n};\n\nconst cachePath = (kind: string, key: string): string =>\n `/internal/runtime-cache/v1/entries/${encodeURIComponent(kind)}/${encodeURIComponent(key)}`;\n\nexport const readRuntimeCache = async (kind: string, key: string): Promise<unknown | undefined> => {\n try {\n const response = await request(cachePath(kind, key), { method: 'GET' });\n if (response.status === 404) return undefined;\n if (!response.ok) return undefined;\n const envelope = (await response.json()) as RuntimeCacheEnvelope;\n return decodeBinary(envelope.value);\n } catch {\n return undefined;\n }\n};\n\nexport const writeRuntimeCache = async (\n kind: string,\n key: string,\n value: unknown,\n tags: readonly string[] = []\n): Promise<void> => {\n const response = await request(cachePath(kind, key), {\n method: 'PUT',\n body: JSON.stringify({ value: encodeBinary(value), tags }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache write failed with status ${response.status}`);\n};\n\nexport const revalidateRuntimeCacheTags = async (\n kind: string,\n tags: readonly string[],\n durations?: { expire?: number }\n): Promise<void> => {\n const response = await request('/internal/runtime-cache/v1/tags/revalidate', {\n method: 'POST',\n body: JSON.stringify({ kind, tags, durations }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache revalidation failed with status ${response.status}`);\n};\n\nexport const getRuntimeCacheTagExpiration = async (kind: string, tags: readonly string[]): Promise<number> => {\n try {\n const response = await request('/internal/runtime-cache/v1/tags/expiration', {\n method: 'POST',\n body: JSON.stringify({ kind, tags }),\n });\n if (!response.ok) return 0;\n const value = (await response.json()) as { expiration?: unknown };\n return typeof value.expiration === 'number' ? value.expiration : 0;\n } catch {\n return 0;\n }\n};\n\nexport const getRuntimeCacheTagState = async (kind: string, tags: readonly string[]): Promise<RuntimeCacheTagState> => {\n try {\n const response = await request('/internal/runtime-cache/v1/tags/state', {\n method: 'POST',\n body: JSON.stringify({ kind, tags }),\n });\n if (!response.ok) return { stale: 0, expired: 0 };\n const value = (await response.json()) as { stale?: unknown; expired?: unknown };\n return {\n stale: typeof value.stale === 'number' ? value.stale : 0,\n expired: typeof value.expired === 'number' ? value.expired : 0,\n };\n } catch {\n return { stale: 0, expired: 0 };\n }\n};\n\nexport const resetRuntimeCacheClientForTests = (): void => {\n cachedToken = undefined;\n};\n\n/**\n * Re-establishes the client's network state after a microVM resume.\n *\n * The guest runtime delivers SIGUSR2 when the instance is restored from a\n * suspend snapshot. At that moment every kept-alive TCP connection from before\n * the freeze is dead, and the cached OAuth token may have expired while the\n * clock was stopped. Dropping the token and dialing one throwaway read\n * re-opens TCP+TLS and refreshes the token concurrently with the guest's own\n * wake-up work, so the first real cache read after a resume does not\n * serialize behind reconnection.\n *\n * Registered only when a Gigadrive deployment marker is present in the\n * environment, so local `next dev`/`next build` never gains a signal listener.\n */\nconst registerResumeRewarm = (): void => {\n // Next exposes this marker before evaluating an Edge route bundle. Bail out\n // before touching `process`: its Edge compatibility proxy throws when the\n // Node-only signal API is read, including through Reflect.\n if (Reflect.has(globalThis, 'EdgeRuntime')) return;\n\n // The deployment id is intentionally available during `next build`, but the\n // shared cache client is also bundled into Edge routes at that point. Keep\n // every Node-only signal reference behind the build-phase guard so Turbopack\n // can eliminate this branch before its Edge runtime validation runs.\n if (process.env.GIGADRIVE_NEXT_BUILD === '1') return;\n\n const onGigadrive =\n process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? process.env.GIGADRIVE_CLIENT_ID;\n if (!onGigadrive) return;\n\n // Resolve the optional Node signal API reflectively so non-Node runtimes can\n // load the shared client while Node deployments retain resume rewarming.\n const runtimeProcess = Reflect.get(globalThis, 'process') as NodeJS.Process | undefined;\n const addSignalListener = runtimeProcess && Reflect.get(runtimeProcess, 'on');\n if (typeof addSignalListener !== 'function') return;\n\n Reflect.apply(addSignalListener, runtimeProcess, [\n 'SIGUSR2',\n () => {\n cachedToken = undefined;\n if (!process.env.GIGADRIVE_CLIENT_ID || !process.env.GIGADRIVE_CLIENT_SECRET) return;\n void readRuntimeCache('warmup', '__resume__');\n },\n ]);\n};\nregisterResumeRewarm();\n","import { nextClockLagMs } from './nextjs-cache-clock';\nimport {\n getRuntimeCacheTagState,\n readRuntimeCache,\n revalidateRuntimeCacheTags,\n writeRuntimeCache,\n} from './nextjs-runtime-cache-client';\n\ninterface CacheComponentEntry {\n value: ReadableStream<Uint8Array>;\n tags: string[];\n stale: number;\n timestamp: number;\n expire: number;\n revalidate: number;\n}\n\ninterface SerializedCacheComponentEntry extends Omit<CacheComponentEntry, 'value'> {\n value: Uint8Array;\n}\n\nconst isSerializedCacheComponentEntry = (value: unknown): value is SerializedCacheComponentEntry => {\n if (typeof value !== 'object' || value === null) return false;\n const entry = value as Partial<SerializedCacheComponentEntry>;\n return (\n entry.value instanceof Uint8Array &&\n Array.isArray(entry.tags) &&\n entry.tags.every((tag) => typeof tag === 'string') &&\n typeof entry.stale === 'number' &&\n typeof entry.timestamp === 'number' &&\n typeof entry.expire === 'number' &&\n typeof entry.revalidate === 'number'\n );\n};\n\nconst pendingWrites = new Map<string, Promise<void>>();\nconst buildEntries = new Map<string, SerializedCacheComponentEntry>();\n\nconst streamToBytes = async (stream: ReadableStream<Uint8Array>): Promise<Uint8Array> => {\n const chunks: Uint8Array[] = [];\n let size = 0;\n const reader = stream.getReader();\n while (true) {\n const result = await reader.read();\n if (result.done) break;\n chunks.push(result.value);\n size += result.value.byteLength;\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n};\n\n/** Shared Network cache handler for Next.js Cache Components and `use cache`. */\nconst cacheHandler = {\n async get(cacheKey: string, softTags: string[]): Promise<CacheComponentEntry | undefined> {\n await pendingWrites.get(cacheKey);\n const value =\n process.env.GIGADRIVE_NEXT_BUILD === '1'\n ? buildEntries.get(cacheKey)\n : await readRuntimeCache('component', cacheKey);\n if (!isSerializedCacheComponentEntry(value)) return undefined;\n const tagState =\n process.env.GIGADRIVE_NEXT_BUILD === '1'\n ? { stale: 0, expired: 0 }\n : await getRuntimeCacheTagState('component', [...new Set([...value.tags, ...softTags])]);\n if (tagState.expired > value.timestamp) return undefined;\n return {\n ...value,\n // Build entries were stamped by Next itself, so only stored ones need moving.\n timestamp: process.env.GIGADRIVE_NEXT_BUILD === '1' ? value.timestamp : value.timestamp - nextClockLagMs(),\n ...(tagState.stale > value.timestamp ? { revalidate: -1 } : {}),\n value: new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(value.value);\n controller.close();\n },\n }),\n };\n },\n\n async set(cacheKey: string, pendingEntry: Promise<CacheComponentEntry>): Promise<void> {\n const write = (async () => {\n const entry = await pendingEntry;\n const value = await streamToBytes(entry.value);\n const serializedEntry = { ...entry, value };\n if (process.env.GIGADRIVE_NEXT_BUILD === '1') {\n buildEntries.set(cacheKey, serializedEntry);\n } else {\n const stored = { ...serializedEntry, timestamp: entry.timestamp + nextClockLagMs() };\n await writeRuntimeCache('component', cacheKey, stored, entry.tags);\n }\n })();\n pendingWrites.set(cacheKey, write);\n try {\n await write;\n } finally {\n if (pendingWrites.get(cacheKey) === write) pendingWrites.delete(cacheKey);\n }\n },\n\n async refreshTags(): Promise<void> {},\n\n getExpiration(): Promise<number> {\n return Promise.resolve(Infinity);\n },\n\n async updateTags(tags: string[], durations?: { expire?: number }): Promise<void> {\n if (process.env.GIGADRIVE_NEXT_BUILD === '1') {\n for (const [key, entry] of buildEntries) {\n if (entry.tags.some((tag) => tags.includes(tag))) buildEntries.delete(key);\n }\n return;\n }\n return revalidateRuntimeCacheTags('component', tags, durations);\n },\n};\n\nexport default cacheHandler;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/nextjs-cache-clock.ts","../src/nextjs-runtime-cache-client.ts","../src/nextjs-cache-components-handler.ts"],"sourcesContent":["/** Differences below this are ordinary timer noise, not a clock that fell behind. */\nconst NEGLIGIBLE_LAG_MS = 1_000;\n\n/**\n * How far Next's clock trails the wall clock.\n *\n * Next measures cache age with `performance.timeOrigin + performance.now()`,\n * which is built on the monotonic clock. A process resumed from a snapshot keeps\n * its monotonic clock from before the pause, while the wall clock is corrected,\n * so Next's clock falls behind by every moment spent paused. An entry stamped\n * with the wall clock then looks newer than it is and never goes stale.\n *\n * Stored timestamps use the wall clock, because other processes read them.\n * Anything handed to Next is shifted onto its clock by this amount.\n */\nexport const nextClockLagMs = (): number => {\n const lag = Date.now() - (performance.timeOrigin + performance.now());\n return Math.abs(lag) < NEGLIGIBLE_LAG_MS ? 0 : lag;\n};\n","interface RuntimeCacheEnvelope {\n value: unknown;\n}\n\ninterface AccessTokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\nexport interface RuntimeCacheTagState {\n stale: number;\n expired: number;\n}\n\nlet cachedToken: { value: string; expiresAt: number } | undefined;\n\nconst apiBaseUrl = (): string => (process.env.GIGADRIVE_API_URL ?? 'https://api.gigadrive.network').replace(/\\/$/, '');\n\nconst encodeBinary = (value: unknown, seen = new WeakSet<object>()): unknown => {\n if (value instanceof Uint8Array) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n if (value instanceof ArrayBuffer) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n // Next stores App Router RSC segment payloads as a `Map<string, Buffer>`\n // (`segmentData`). `Object.entries` on a Map yields nothing, so without an\n // explicit branch the whole map would serialize to `{}` and every prefetched\n // segment would be silently lost on the next read.\n if (value instanceof Map) {\n if (seen.has(value)) throw new Error('Next.js cache entry contains a circular value');\n seen.add(value);\n const entries = [...value.entries()].map(([key, item]) => [encodeBinary(key, seen), encodeBinary(item, seen)]);\n seen.delete(value);\n return { __gigadriveType: 'map', value: entries };\n }\n if (Array.isArray(value)) return value.map((item) => encodeBinary(item, seen));\n if (typeof value !== 'object' || value === null) return value;\n if (seen.has(value)) throw new Error('Next.js cache entry contains a circular value');\n seen.add(value);\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) result[key] = encodeBinary(item, seen);\n seen.delete(value);\n return result;\n};\n\nconst decodeBinary = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(decodeBinary);\n if (typeof value !== 'object' || value === null) return value;\n const record = value as Record<string, unknown>;\n if (record.__gigadriveType === 'bytes' && typeof record.value === 'string')\n return Buffer.from(record.value, 'base64');\n if (record.__gigadriveType === 'map' && Array.isArray(record.value)) {\n return new Map(\n (record.value as unknown[]).map((entry) => {\n const [key, item] = entry as [unknown, unknown];\n return [decodeBinary(key), decodeBinary(item)];\n })\n );\n }\n return Object.fromEntries(Object.entries(record).map(([key, item]) => [key, decodeBinary(item)]));\n};\n\nconst getAccessToken = async (): Promise<string> => {\n if (cachedToken && cachedToken.expiresAt > Date.now() + 30_000) return cachedToken.value;\n const clientId = process.env.GIGADRIVE_CLIENT_ID;\n const clientSecret = process.env.GIGADRIVE_CLIENT_SECRET;\n if (!clientId || !clientSecret) throw new Error('Gigadrive workload credentials are unavailable');\n\n const response = await fetch(`${apiBaseUrl()}/oauth2/token`, {\n method: 'POST',\n headers: {\n authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString('base64')}`,\n 'content-type': 'application/x-www-form-urlencoded',\n },\n body: 'grant_type=client_credentials',\n });\n if (!response.ok) throw new Error(`Gigadrive workload authentication failed with status ${response.status}`);\n const token = (await response.json()) as AccessTokenResponse;\n if (!token.access_token) throw new Error('Gigadrive workload authentication returned no access token');\n cachedToken = {\n value: token.access_token,\n expiresAt: Date.now() + Math.max(60, token.expires_in ?? 300) * 1000,\n };\n return token.access_token;\n};\n\nconst request = async (pathname: string, init: RequestInit, attempt = 0): Promise<Response> => {\n const token = await getAccessToken();\n try {\n const response = await fetch(`${apiBaseUrl()}${pathname}`, {\n ...init,\n headers: {\n authorization: `Bearer ${token}`,\n 'content-type': 'application/json',\n 'x-gigadrive-deployment-id': process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? '',\n 'x-gigadrive-build-id': process.env.NEXT_BUILD_ID ?? '',\n ...init.headers,\n },\n });\n if (response.status === 401 && attempt === 0) {\n cachedToken = undefined;\n return request(pathname, init, attempt + 1);\n }\n if (response.status >= 500 && attempt < 2) return request(pathname, init, attempt + 1);\n return response;\n } catch (error) {\n if (attempt < 2) return request(pathname, init, attempt + 1);\n throw error;\n }\n};\n\nconst cachePath = (kind: string, key: string): string =>\n `/internal/runtime-cache/v1/entries/${encodeURIComponent(kind)}/${encodeURIComponent(key)}`;\n\n/** Reads and decodes an entry; anything that fails, malformed stored data included, is a miss. */\nconst readEntry = async (\n kind: string,\n key: string,\n headers: Record<string, string> = {}\n): Promise<{ value: unknown; tagState?: unknown } | undefined> => {\n try {\n const response = await request(cachePath(kind, key), { method: 'GET', headers });\n if (!response.ok) return undefined;\n const envelope = (await response.json()) as RuntimeCacheEnvelope & { tagState?: unknown };\n return { value: decodeBinary(envelope.value), tagState: envelope.tagState };\n } catch {\n return undefined;\n }\n};\n\nexport const readRuntimeCache = async (kind: string, key: string): Promise<unknown | undefined> =>\n (await readEntry(kind, key))?.value;\n\n/** The API's limits on the soft tags of a combined read. */\nconst MAX_SOFT_TAGS = 128;\nconst MAX_TAG_LENGTH = 256;\n/** Well under the header limits of the CDN and load balancer in front of the API. */\nconst MAX_SOFT_TAGS_HEADER_LENGTH = 4096;\n\n/**\n * Reads an entry and, in the same request, the tag state of its own tags plus `softTags`.\n *\n * Saves the separate tag-state round trip on every hit. `tagState` is absent when the API answers\n * the entry alone (an API without combined reads, or soft tags too many or too long to send), so\n * the caller asks for it separately.\n */\nexport const readRuntimeCacheWithTagState = async (\n kind: string,\n key: string,\n softTags: readonly string[]\n): Promise<{ value: unknown; tagState?: RuntimeCacheTagState } | undefined> => {\n const tags = [...new Set(softTags)];\n // Escape everything outside ASCII so the list is always a valid header value.\n const header = JSON.stringify(tags).replace(\n /[\\u007f-\\uffff]/g,\n (character) => `\\\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`\n );\n const sendable =\n tags.length <= MAX_SOFT_TAGS &&\n tags.every((tag) => tag.length <= MAX_TAG_LENGTH) &&\n header.length <= MAX_SOFT_TAGS_HEADER_LENGTH;\n const entry = await readEntry(kind, key, sendable ? { 'x-gigadrive-cache-soft-tags': header } : {});\n if (!entry) return undefined;\n const state = entry.tagState as { stale?: unknown; expired?: unknown } | undefined;\n return {\n value: entry.value,\n ...(typeof state?.stale === 'number' && typeof state.expired === 'number'\n ? { tagState: { stale: state.stale, expired: state.expired } }\n : {}),\n };\n};\n\nexport const writeRuntimeCache = async (\n kind: string,\n key: string,\n value: unknown,\n tags: readonly string[] = []\n): Promise<void> => {\n const response = await request(cachePath(kind, key), {\n method: 'PUT',\n body: JSON.stringify({ value: encodeBinary(value), tags }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache write failed with status ${response.status}`);\n};\n\nexport const revalidateRuntimeCacheTags = async (\n kind: string,\n tags: readonly string[],\n durations?: { expire?: number }\n): Promise<void> => {\n const response = await request('/internal/runtime-cache/v1/tags/revalidate', {\n method: 'POST',\n body: JSON.stringify({ kind, tags, durations }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache revalidation failed with status ${response.status}`);\n};\n\nexport const getRuntimeCacheTagExpiration = async (kind: string, tags: readonly string[]): Promise<number> => {\n try {\n const response = await request('/internal/runtime-cache/v1/tags/expiration', {\n method: 'POST',\n body: JSON.stringify({ kind, tags }),\n });\n if (!response.ok) return 0;\n const value = (await response.json()) as { expiration?: unknown };\n return typeof value.expiration === 'number' ? value.expiration : 0;\n } catch {\n return 0;\n }\n};\n\nexport const getRuntimeCacheTagState = async (kind: string, tags: readonly string[]): Promise<RuntimeCacheTagState> => {\n try {\n const response = await request('/internal/runtime-cache/v1/tags/state', {\n method: 'POST',\n body: JSON.stringify({ kind, tags }),\n });\n if (!response.ok) return { stale: 0, expired: 0 };\n const value = (await response.json()) as { stale?: unknown; expired?: unknown };\n return {\n stale: typeof value.stale === 'number' ? value.stale : 0,\n expired: typeof value.expired === 'number' ? value.expired : 0,\n };\n } catch {\n return { stale: 0, expired: 0 };\n }\n};\n\nexport const resetRuntimeCacheClientForTests = (): void => {\n cachedToken = undefined;\n};\n\n/**\n * Re-establishes the client's network state after a microVM resume.\n *\n * The guest runtime delivers SIGUSR2 when the instance is restored from a\n * suspend snapshot. At that moment every kept-alive TCP connection from before\n * the freeze is dead, and the cached OAuth token may have expired while the\n * clock was stopped. Dropping the token and dialing one throwaway read\n * re-opens TCP+TLS and refreshes the token concurrently with the guest's own\n * wake-up work, so the first real cache read after a resume does not\n * serialize behind reconnection.\n *\n * Registered only when a Gigadrive deployment marker is present in the\n * environment, so local `next dev`/`next build` never gains a signal listener.\n */\nconst registerResumeRewarm = (): void => {\n // Next exposes this marker before evaluating an Edge route bundle. Bail out\n // before touching `process`: its Edge compatibility proxy throws when the\n // Node-only signal API is read, including through Reflect.\n if (Reflect.has(globalThis, 'EdgeRuntime')) return;\n\n // The deployment id is intentionally available during `next build`, but the\n // shared cache client is also bundled into Edge routes at that point. Keep\n // every Node-only signal reference behind the build-phase guard so Turbopack\n // can eliminate this branch before its Edge runtime validation runs.\n if (process.env.GIGADRIVE_NEXT_BUILD === '1') return;\n\n const onGigadrive =\n process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? process.env.GIGADRIVE_CLIENT_ID;\n if (!onGigadrive) return;\n\n // Resolve the optional Node signal API reflectively so non-Node runtimes can\n // load the shared client while Node deployments retain resume rewarming.\n const runtimeProcess = Reflect.get(globalThis, 'process') as NodeJS.Process | undefined;\n const addSignalListener = runtimeProcess && Reflect.get(runtimeProcess, 'on');\n if (typeof addSignalListener !== 'function') return;\n\n Reflect.apply(addSignalListener, runtimeProcess, [\n 'SIGUSR2',\n () => {\n cachedToken = undefined;\n if (!process.env.GIGADRIVE_CLIENT_ID || !process.env.GIGADRIVE_CLIENT_SECRET) return;\n void readRuntimeCache('warmup', '__resume__');\n },\n ]);\n};\nregisterResumeRewarm();\n","import { nextClockLagMs } from './nextjs-cache-clock';\nimport {\n getRuntimeCacheTagState,\n readRuntimeCacheWithTagState,\n revalidateRuntimeCacheTags,\n writeRuntimeCache,\n} from './nextjs-runtime-cache-client';\n\ninterface CacheComponentEntry {\n value: ReadableStream<Uint8Array>;\n tags: string[];\n stale: number;\n timestamp: number;\n expire: number;\n revalidate: number;\n}\n\ninterface SerializedCacheComponentEntry extends Omit<CacheComponentEntry, 'value'> {\n value: Uint8Array;\n}\n\nconst isSerializedCacheComponentEntry = (value: unknown): value is SerializedCacheComponentEntry => {\n if (typeof value !== 'object' || value === null) return false;\n const entry = value as Partial<SerializedCacheComponentEntry>;\n return (\n entry.value instanceof Uint8Array &&\n Array.isArray(entry.tags) &&\n entry.tags.every((tag) => typeof tag === 'string') &&\n typeof entry.stale === 'number' &&\n typeof entry.timestamp === 'number' &&\n typeof entry.expire === 'number' &&\n typeof entry.revalidate === 'number'\n );\n};\n\nconst pendingWrites = new Map<string, Promise<void>>();\nconst buildEntries = new Map<string, SerializedCacheComponentEntry>();\n\nconst streamToBytes = async (stream: ReadableStream<Uint8Array>): Promise<Uint8Array> => {\n const chunks: Uint8Array[] = [];\n let size = 0;\n const reader = stream.getReader();\n while (true) {\n const result = await reader.read();\n if (result.done) break;\n chunks.push(result.value);\n size += result.value.byteLength;\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n};\n\n/** Shared Network cache handler for Next.js Cache Components and `use cache`. */\nconst cacheHandler = {\n async get(cacheKey: string, softTags: string[]): Promise<CacheComponentEntry | undefined> {\n await pendingWrites.get(cacheKey);\n const read =\n process.env.GIGADRIVE_NEXT_BUILD === '1'\n ? { value: buildEntries.get(cacheKey), tagState: { stale: 0, expired: 0 } }\n : await readRuntimeCacheWithTagState('component', cacheKey, softTags);\n const value = read?.value;\n if (!isSerializedCacheComponentEntry(value)) return undefined;\n const tagState =\n read?.tagState ?? (await getRuntimeCacheTagState('component', [...new Set([...value.tags, ...softTags])]));\n if (tagState.expired > value.timestamp) return undefined;\n return {\n ...value,\n // Build entries were stamped by Next itself, so only stored ones need moving.\n timestamp: process.env.GIGADRIVE_NEXT_BUILD === '1' ? value.timestamp : value.timestamp - nextClockLagMs(),\n ...(tagState.stale > value.timestamp ? { revalidate: -1 } : {}),\n value: new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(value.value);\n controller.close();\n },\n }),\n };\n },\n\n async set(cacheKey: string, pendingEntry: Promise<CacheComponentEntry>): Promise<void> {\n const write = (async () => {\n const entry = await pendingEntry;\n const value = await streamToBytes(entry.value);\n const serializedEntry = { ...entry, value };\n if (process.env.GIGADRIVE_NEXT_BUILD === '1') {\n buildEntries.set(cacheKey, serializedEntry);\n } else {\n const stored = { ...serializedEntry, timestamp: entry.timestamp + nextClockLagMs() };\n await writeRuntimeCache('component', cacheKey, stored, entry.tags);\n }\n })();\n pendingWrites.set(cacheKey, write);\n try {\n await write;\n } finally {\n if (pendingWrites.get(cacheKey) === write) pendingWrites.delete(cacheKey);\n }\n },\n\n async refreshTags(): Promise<void> {},\n\n getExpiration(): Promise<number> {\n return Promise.resolve(Infinity);\n },\n\n async updateTags(tags: string[], durations?: { expire?: number }): Promise<void> {\n if (process.env.GIGADRIVE_NEXT_BUILD === '1') {\n for (const [key, entry] of buildEntries) {\n if (entry.tags.some((tag) => tags.includes(tag))) buildEntries.delete(key);\n }\n return;\n }\n return revalidateRuntimeCacheTags('component', tags, durations);\n },\n};\n\nexport default cacheHandler;\n"],"mappings":"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","names":[]}