{"version":3,"sources":["../src/program.ts","../src/program-browser.ts"],"names":["source"],"mappings":"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","file":"program-browser.mjs","sourcesContent":["import { err, ok, type Result } from '@forgeax/engine-types';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { type Node, parse } from 'acorn';\n\nexport interface PackProgramSource {\n  readonly entry: string;\n  readonly export: string;\n  readonly modules: Readonly<Record<string, string>>;\n  /** Exact identities supplied by the executing host, never bundled substitutes. */\n  readonly imports?: Readonly<Record<string, string>>;\n}\n\nexport interface PackProgram extends PackProgramSource {\n  readonly digest: string;\n}\n\nexport interface PackProgramImport {\n  readonly identity: string;\n  readonly url: string;\n}\n\n/** Host publication keeps native ESM URLs alive for the consuming realm. */\nexport interface PackProgramHost {\n  publish(\n    program: PackProgram,\n    imports: Readonly<Record<string, PackProgramImport>>,\n  ): Promise<string>;\n}\n\n/** Native module identity depends on the graph and its bindings, not the selected export. */\nexport function packProgramModuleIdentity(\n  value: PackProgram,\n  hostImports: Readonly<Record<string, PackProgramImport>> = {},\n): Result<string, PackProgramError> {\n  const verified = verifyPackProgram(value);\n  if (!verified.ok) return verified;\n  const program = verified.value;\n  const bindings: string[][] = [];\n  for (const [specifier, identity] of Object.entries(program.imports ?? {})) {\n    const supplied = hostImports[specifier];\n    if (\n      !supplied ||\n      supplied.identity !== identity ||\n      !/^(?:https?:|file:|data:|blob:|node:)/.test(supplied.url)\n    )\n      return err(\n        failure(\n          'pack-program-dependency-unavailable',\n          specifier,\n          'host import identity or module URL is unavailable',\n        ),\n      );\n    bindings.push([specifier, identity, supplied.url]);\n  }\n  return ok(\n    `sha256:${bytesToHex(\n      sha256(new TextEncoder().encode(JSON.stringify([program.modules, bindings]))),\n    )}`,\n  );\n}\n\n/** Link a complete closure before making any module visible; cycles retain native ESM semantics. */\nexport function linkPackProgram(\n  program: PackProgram,\n  baseUrl: string,\n  hostImports: Readonly<Record<string, PackProgramImport>> = {},\n) {\n  const checked = verifyPackProgram(program);\n  if (!checked.ok) return checked;\n  const files: { url: string; source: string }[] = [];\n  for (const [filename, text] of Object.entries(checked.value.modules)) {\n    let source = text;\n    const parsed = importsOf(source, filename);\n    if (!parsed.ok) return parsed;\n    for (const item of [...parsed.value].sort((a, b) => b.start - a.start)) {\n      const local = localImport(filename, item.specifier);\n      const host = hostImports[item.specifier];\n      if (\n        local === undefined &&\n        (!host ||\n          host.identity !== program.imports?.[item.specifier] ||\n          !/^(?:https?:|file:|data:|blob:|node:)/.test(host.url))\n      )\n        return err(failure('pack-program-dependency-unavailable', filename, item.specifier));\n      const url = local === undefined ? host?.url : new URL(local, baseUrl).href;\n      if (url === undefined)\n        return err(failure('pack-program-dependency-unavailable', filename, item.specifier));\n      source = source.slice(0, item.start) + JSON.stringify(url) + source.slice(item.end);\n    }\n    files.push({ url: new URL(filename, baseUrl).href, source });\n  }\n  return ok({ entryUrl: new URL(program.entry, baseUrl).href, files });\n}\n\nexport type PackProgramError = {\n  readonly expected: string;\n  readonly hint: string;\n  readonly detail: { readonly module: string; readonly reason: string };\n} & {\n  readonly code:\n    | 'pack-program-invalid'\n    | 'pack-program-dependency-unavailable'\n    | 'pack-program-integrity-mismatch'\n    | 'pack-program-load-failed';\n};\n\ninterface ModuleImport {\n  readonly start: number;\n  readonly end: number;\n  readonly specifier: string;\n}\n\nfunction failure(code: PackProgramError['code'], module: string, reason: string): PackProgramError {\n  return {\n    code,\n    expected: 'valid ESM bytes and their complete, identity-matched module closure',\n    hint: 'repair the program or supply the recorded host imports before admitting this Pack',\n    detail: { module, reason },\n  };\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n  return (\n    value !== null &&\n    typeof value === 'object' &&\n    (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)\n  );\n}\n\nfunction modulePath(value: string): boolean {\n  return /^(?:[A-Za-z0-9_-][A-Za-z0-9._-]*\\/)*[A-Za-z0-9_-][A-Za-z0-9._-]*\\.(?:js|mjs)$/.test(\n    value,\n  );\n}\n\nfunction importsOf(\n  source: string,\n  filename: string,\n): Result<readonly ModuleImport[], PackProgramError> {\n  const imports: ModuleImport[] = [];\n  try {\n    const root = parse(source, { ecmaVersion: 2022, sourceType: 'module' });\n    const visit = (node: Node): void => {\n      const fields = node as unknown as Record<string, unknown>;\n      if (\n        [\n          'ImportDeclaration',\n          'ExportNamedDeclaration',\n          'ExportAllDeclaration',\n          'ImportExpression',\n        ].includes(node.type) &&\n        fields.source !== null\n      ) {\n        const sourceNode = fields.source as\n          | { start: number; end: number; value?: unknown }\n          | undefined;\n        if (sourceNode !== undefined) {\n          if (typeof sourceNode.value !== 'string')\n            throw new TypeError('imports must have literal specifiers');\n          imports.push({\n            start: sourceNode.start,\n            end: sourceNode.end,\n            specifier: sourceNode.value,\n          });\n        }\n      }\n      for (const value of Object.values(fields)) {\n        for (const child of Array.isArray(value) ? value : [value]) {\n          if (child !== null && typeof child === 'object' && typeof child.type === 'string')\n            visit(child as Node);\n        }\n      }\n    };\n    visit(root);\n    return ok(imports);\n  } catch (cause) {\n    return err(failure('pack-program-invalid', filename, String(cause)));\n  }\n}\n\nfunction localImport(filename: string, specifier: string): string | undefined {\n  if (!specifier.startsWith('./') && !specifier.startsWith('../')) return undefined;\n  const root = 'https://pack.invalid/closure/';\n  const resolved = new URL(specifier, root + filename).href;\n  return resolved.startsWith(root) ? resolved.slice(root.length) : '';\n}\n\n/** Parse and seal JavaScript without evaluating, transpiling or bundling it. */\nexport function preparePackProgram(\n  input: PackProgramSource,\n): Result<PackProgram, PackProgramError> {\n  if (\n    !record(input) ||\n    Object.keys(input).some((key) => !['entry', 'export', 'modules', 'imports'].includes(key)) ||\n    typeof input.entry !== 'string' ||\n    !modulePath(input.entry) ||\n    typeof input.export !== 'string' ||\n    !input.export ||\n    !record(input.modules) ||\n    !Object.hasOwn(input.modules, input.entry) ||\n    (input.imports !== undefined && !record(input.imports))\n  ) {\n    return err(\n      failure(\n        'pack-program-invalid',\n        '',\n        'expected entry, export, module texts and optional host import identities',\n      ),\n    );\n  }\n  const modules: Record<string, string> = {};\n  const imports: Record<string, string> = {};\n  for (const name of Object.keys(input.imports ?? {}).sort()) {\n    const identity = input.imports?.[name];\n    if (\n      !name ||\n      name.startsWith('.') ||\n      name.startsWith('/') ||\n      !identity ||\n      typeof identity !== 'string'\n    )\n      return err(\n        failure(\n          'pack-program-invalid',\n          name,\n          'host imports require a bare specifier and non-empty identity',\n        ),\n      );\n    Object.defineProperty(imports, name, { value: identity, enumerable: true });\n  }\n  for (const filename of Object.keys(input.modules).sort()) {\n    const source = input.modules[filename];\n    if (!modulePath(filename) || typeof source !== 'string')\n      return err(\n        failure(\n          'pack-program-invalid',\n          filename,\n          'expected a relative .js/.mjs path and JavaScript text',\n        ),\n      );\n    const parsed = importsOf(source, filename);\n    if (!parsed.ok) return parsed;\n    for (const item of parsed.value) {\n      const local = localImport(filename, item.specifier);\n      if (\n        local === undefined\n          ? !Object.hasOwn(imports, item.specifier)\n          : !local || !Object.hasOwn(input.modules, local)\n      )\n        return err(failure('pack-program-dependency-unavailable', filename, item.specifier));\n    }\n    Object.defineProperty(modules, filename, { value: source, enumerable: true });\n  }\n  const source: PackProgramSource = {\n    entry: input.entry,\n    export: input.export,\n    modules: Object.freeze(modules),\n    ...(Object.keys(imports).length ? { imports: Object.freeze(imports) } : {}),\n  };\n  const digest = `sha256:${bytesToHex(sha256(new TextEncoder().encode(JSON.stringify(source))))}`;\n  return ok(Object.freeze({ ...source, digest }));\n}\n\nexport function verifyPackProgram(value: PackProgram): Result<PackProgram, PackProgramError> {\n  if (!record(value) || typeof value.digest !== 'string')\n    return err(failure('pack-program-invalid', '', 'missing program digest'));\n  const { digest, ...source } = value;\n  const prepared = preparePackProgram(source);\n  if (!prepared.ok) return prepared;\n  return digest === prepared.value.digest\n    ? prepared\n    : err(\n        failure(\n          'pack-program-integrity-mismatch',\n          value.entry,\n          'program bytes do not match the recorded digest',\n        ),\n      );\n}\n\n/** Explicit execution; the returned export is validated by its domain owner. */\nexport async function loadPackProgram(\n  value: PackProgram,\n  hostImports: Readonly<Record<string, PackProgramImport>> = {},\n  host?: PackProgramHost,\n): Promise<Result<unknown, PackProgramError>> {\n  const verified = verifyPackProgram(value);\n  if (!verified.ok) return verified;\n  const program = verified.value;\n  const moduleIdentity = packProgramModuleIdentity(program, hostImports);\n  if (!moduleIdentity.ok) return moduleIdentity;\n  const urls = new Map<string, string>();\n  const visiting = new Set<string>();\n  const locate = (filename: string): string => {\n    const existing = urls.get(filename);\n    if (existing !== undefined) return existing;\n    if (visiting.has(filename))\n      throw new TypeError('cyclic modules require a host-served module closure');\n    visiting.add(filename);\n    let source = program.modules[filename];\n    if (source === undefined) throw new TypeError(`missing module ${filename}`);\n    const parsed = importsOf(source, filename);\n    if (!parsed.ok) throw new TypeError(parsed.error.detail.reason);\n    for (const item of [...parsed.value].sort((left, right) => right.start - left.start)) {\n      const local = localImport(filename, item.specifier);\n      const url = local === undefined ? hostImports[item.specifier]?.url : locate(local);\n      if (url === undefined) throw new TypeError(`missing module ${item.specifier}`);\n      source = source.slice(0, item.start) + JSON.stringify(url) + source.slice(item.end);\n    }\n    const url = `data:text/javascript;charset=utf-8,${encodeURIComponent(source)}#${encodeURIComponent(`${moduleIdentity.value}/${filename}`)}`;\n    urls.set(filename, url);\n    visiting.delete(filename);\n    return url;\n  };\n  try {\n    const url =\n      host === undefined ? locate(program.entry) : await host.publish(program, hostImports);\n    const namespace = await import(/* @vite-ignore */ url);\n    if (!Object.hasOwn(namespace, program.export))\n      throw new TypeError(`missing export ${program.export}`);\n    return ok(namespace[program.export]);\n  } catch (cause) {\n    return err(failure('pack-program-load-failed', program.entry, String(cause)));\n  }\n}\n","import { linkPackProgram, type PackProgramHost, packProgramModuleIdentity } from './program.js';\n\nconst CACHE = 'forgeax-program-modules/1';\n\n/** The host serves this script in its application scope; only program URLs are intercepted. */\nexport const PACK_PROGRAM_WORKER_SOURCE = `\nself.addEventListener('install', event => event.waitUntil(self.skipWaiting()));\nself.addEventListener('activate', event => event.waitUntil(self.clients.claim()));\nself.addEventListener('fetch', event => {\n  const base = new URL('__forgeax_programs__/', self.registration.scope).href;\n  if (event.request.method !== 'GET' || !event.request.url.startsWith(base)) return;\n  event.respondWith(caches.open(${JSON.stringify(CACHE)}).then(async cache =>\n    await cache.match(event.request) || new Response('Program module unavailable', { status: 404 })));\n});\n`;\n\n/** The page prepares its application scope before a Worker uses native program URLs. */\nexport async function prepareBrowserPackProgramScope(workerUrl: string): Promise<string> {\n  if (!('serviceWorker' in navigator) || !globalThis.caches)\n    throw new TypeError('Pack module delivery requires ServiceWorker and CacheStorage');\n  const script = new URL(workerUrl, location.href);\n  const scope = new URL('./', script).href;\n  return new Promise<string>((resolve, reject) => {\n    let finished = false;\n    let stage = 'registration lookup';\n    const stop = () => {\n      finished = true;\n      clearTimeout(timeout);\n      navigator.serviceWorker.removeEventListener('controllerchange', changed);\n    };\n    const failed = (cause: unknown) => {\n      if (finished) return;\n      stop();\n      reject(cause);\n    };\n    const changed = () => {\n      if (finished || navigator.serviceWorker.controller?.scriptURL !== script.href) return;\n      stop();\n      resolve(scope);\n    };\n    const timeout = setTimeout(\n      () => failed(new Error(`Pack service worker preparation timed out during ${stage}`)),\n      10000,\n    );\n    void (async () => {\n      const existing = await navigator.serviceWorker.getRegistration(scope);\n      if (finished) return;\n      if (existing?.active && existing.active.scriptURL !== script.href)\n        throw new TypeError(\n          'Host must integrate Pack program delivery into its existing service worker',\n        );\n      stage = 'registration';\n      await navigator.serviceWorker.register(script.href, { scope, type: 'module' });\n      if (finished) return;\n      stage = 'page control';\n      navigator.serviceWorker.addEventListener('controllerchange', changed);\n      changed();\n    })().catch(failed);\n  });\n}\n\n/** Publish from either browser realm into a scope already prepared by its page. */\nexport function createBrowserPackProgramHost(scopeUrl: string): PackProgramHost {\n  const scope = new URL(scopeUrl).href;\n  if (!/^https?:/.test(scope) || !scope.endsWith('/'))\n    throw new TypeError('Pack program delivery requires an absolute HTTP application scope');\n  return {\n    async publish(program, imports) {\n      const cache = await caches.open(CACHE);\n      const base = new URL(\n        `__forgeax_programs__/${packProgramModuleIdentity(program, imports).unwrap().replace(':', '-')}/`,\n        scope,\n      ).href;\n      const linked = linkPackProgram(program, base, imports).unwrap();\n      // Await the entire closure before returning its entry URL. Cycles see all their peers.\n      await Promise.all(\n        linked.files.map((file) =>\n          cache.put(\n            file.url,\n            new Response(file.source, {\n              headers: { 'content-type': 'text/javascript; charset=utf-8' },\n            }),\n          ),\n        ),\n      );\n      return linked.entryUrl;\n    },\n  };\n}\n"]}