@forgeax/engine-host 0.1.27 → 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/__tests__/startup.test.d.ts +2 -0
- package/dist/__tests__/startup.test.d.ts.map +1 -0
- package/dist/backend.d.ts +7 -1
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.mjs +56 -16
- package/dist/backend.mjs.map +1 -1
- package/dist/frontend.d.ts.map +1 -1
- package/dist/frontend.mjs +34 -11
- package/dist/frontend.mjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +70 -29
- package/dist/index.mjs.map +1 -1
- package/dist/protocol.d.ts +2 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.mjs.map +1 -1
- package/dist/startup.d.ts +18 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.mjs +3 -1
- package/dist/transport.mjs.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/host.test.ts +109 -0
- package/src/__tests__/startup.test.ts +27 -0
- package/src/backend.ts +42 -17
- package/src/frontend.ts +11 -11
- package/src/index.ts +1 -0
- package/src/protocol.ts +6 -1
- package/src/startup.ts +43 -0
- package/src/transport.ts +2 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/protocol.ts","../src/transport.ts","../src/backend.ts","../src/frontend.ts"],"names":["removeError","hostFoundationPlugin","Context","report","host","projectPluginEntries","activeLoader"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { EntryOptions } from '@deepseek-ai/cordis-plugin-loader';\nimport type {\n GamePluginEntry,\n PluginCatalog,\n PluginCatalogRecord,\n PluginRealm,\n} from '@forgeax/engine-plugin/loader';\n\ndeclare module '@forgeax/engine-plugin' {\n interface EngineContextServices {\n hostAssembly:\n | import('./backend.js').BackendAssemblyAuthority\n | import('./frontend.js').FrontendAssemblyState;\n hostTransport:\n | import('./transport.js').HostTransportServer\n | import('./transport.js').HostTransportClient;\n }\n}\n\n/** Wire version for the backend-derived browser assembly. */\nexport const HOST_ASSEMBLY_SCHEMA_VERSION = 1 as const;\n\nexport type HostAssemblySchemaVersion = typeof HOST_ASSEMBLY_SCHEMA_VERSION;\n\nexport interface HostModuleDescriptor {\n /** The exact module name used by a Cordis Entry. */\n readonly name: string;\n /** Physical ForgeaX realm expected by the CatalogLoader. */\n readonly realm: PluginRealm;\n /** Code identity. The backend and browser must agree on this value. */\n readonly version: string;\n /** Optional content identity for a static or generated catalog. */\n readonly digest?: string;\n /** URL used by a live browser host. Static builds omit it and use a Catalog. */\n readonly url?: string;\n}\n\n/** One package's explicitly paired backend/frontend Entry projections. */\nexport interface HostPluginPair {\n readonly id: string;\n readonly backend?: HostPluginEndpoint;\n readonly frontend?: HostPluginEndpoint;\n}\n\nexport interface HostPluginEndpoint {\n readonly entry: GamePluginEntry;\n readonly module: HostModuleDescriptor;\n}\n\n/** Safe identity projection; backend Entry configuration never crosses the wire. */\nexport interface HostAssemblyPair {\n readonly id: string;\n readonly entryId: string;\n readonly module: HostModuleDescriptor;\n}\n\n/**\n * A serializable projection of the entries that a frontend may activate.\n * `EntryOptions` is intentionally retained so nested Groups and repeated Entry\n * instances keep native Loader identity and reconciliation semantics.\n */\nexport interface HostAssembly {\n readonly schemaVersion: HostAssemblySchemaVersion;\n /** Digest of entries, modules and explicitly projected configuration. */\n readonly revision: string;\n readonly entries: readonly GamePluginEntry[];\n readonly modules: readonly HostModuleDescriptor[];\n readonly pairs: readonly HostAssemblyPair[];\n /** Safe, frontend-visible configuration only. */\n readonly config?: unknown;\n}\n\nexport interface HostAssemblyInput {\n /** Backend Entries are local authority and are never serialized. */\n readonly backendEntries?: readonly GamePluginEntry[];\n readonly entries?: readonly GamePluginEntry[];\n readonly modules?: readonly HostModuleDescriptor[];\n readonly pairs?: readonly HostPluginPair[];\n readonly config?: unknown;\n}\n\nexport interface HostActivationEntry {\n readonly entryId: string;\n readonly fiberState: string;\n readonly failure?: HostErrorSummary;\n}\n\nexport interface HostErrorSummary {\n readonly code: string;\n readonly expected: string;\n readonly hint: string;\n readonly detail: Readonly<Record<string, unknown>>;\n}\n\nexport interface HostActivationReport {\n readonly state: 'created' | 'loading' | 'active' | 'failed' | 'disposed';\n readonly revision: string;\n readonly entries?: readonly HostActivationEntry[];\n readonly error?: HostErrorSummary;\n}\n\nexport interface HostAssemblyErrorDetailByCode {\n 'host-assembly-invalid': { readonly reason: string };\n 'host-assembly-revision-mismatch': { readonly actual: string; readonly expected: string };\n 'host-assembly-module-missing': { readonly name: string };\n 'host-assembly-module-version-mismatch': {\n readonly name: string;\n readonly actual: string;\n readonly expected: string;\n };\n 'host-assembly-reload-required': {\n readonly module: string;\n readonly actual: string;\n readonly expected: string;\n };\n 'host-assembly-service-unavailable': { readonly service: string };\n 'host-assembly-stale-request': { readonly service: string; readonly generation: number };\n 'host-assembly-request-aborted': { readonly service: string };\n 'host-transport-failure': { readonly service: string; readonly reason: string };\n 'host-assembly-not-ready': {\n readonly entryId: string;\n readonly fiberState: string;\n readonly failure?: HostErrorSummary;\n };\n}\n\nexport type HostAssemblyErrorCode = keyof HostAssemblyErrorDetailByCode;\n\nexport class HostAssemblyError<\n C extends HostAssemblyErrorCode = HostAssemblyErrorCode,\n> extends Error {\n readonly code: C;\n readonly expected: string;\n readonly hint: string;\n readonly detail: HostAssemblyErrorDetailByCode[C];\n\n constructor(code: C, expected: string, hint: string, detail: HostAssemblyErrorDetailByCode[C]) {\n super(`${code}: ${expected}`);\n this.name = 'HostAssemblyError';\n this.code = code;\n this.expected = expected;\n this.hint = hint;\n this.detail = detail;\n }\n}\n\n/**\n * Prove that the code selected by a local Catalog is the code named by an\n * assembly descriptor. An optional digest is still checked whenever either\n * side supplies one; an unrelated digest must never stand in for a version.\n */\nexport function assertHostModuleCatalogIdentity(\n module: HostModuleDescriptor,\n record: PluginCatalogRecord,\n): void {\n if (record.version !== undefined && record.version !== module.version) {\n throw new HostAssemblyError(\n 'host-assembly-module-version-mismatch',\n `module ${module.name} to load catalog version ${module.version}`,\n 'Regenerate the static Catalog from the same backend package revision.',\n { name: module.name, actual: record.version, expected: module.version },\n );\n }\n if (\n record.digest !== undefined &&\n module.digest !== undefined &&\n record.digest !== module.digest\n ) {\n throw new HostAssemblyError(\n 'host-assembly-module-version-mismatch',\n `module ${module.name} to load catalog digest ${module.digest ?? 'none'}`,\n 'Regenerate the static Catalog from the same backend package bytes.',\n { name: module.name, actual: record.digest, expected: module.digest ?? 'none' },\n );\n }\n const versionMatches = record.version !== undefined && record.version === module.version;\n const digestMatches =\n module.digest !== undefined && record.digest !== undefined && record.digest === module.digest;\n const staticWithoutIdentity =\n module.version === 'static' &&\n module.digest === undefined &&\n record.version === undefined &&\n record.digest === undefined;\n if (!versionMatches && !digestMatches && !staticWithoutIdentity) {\n throw new HostAssemblyError(\n 'host-assembly-module-version-mismatch',\n `module ${module.name} to have a matching catalog code identity for ${module.version}`,\n 'Add the generated module version or digest to the static Catalog.',\n {\n name: module.name,\n actual: record.version ?? record.digest ?? 'unknown',\n expected: module.version,\n },\n );\n }\n}\n\nexport interface HostAssemblyResult {\n readonly ok: true;\n readonly value: HostAssembly;\n}\n\nexport interface HostAssemblyFailure {\n readonly ok: false;\n readonly error: HostAssemblyError;\n}\n\nexport type HostAssemblyValidation = HostAssemblyResult | HostAssemblyFailure;\n\n/** JSON-stable projection used for revision identity and diagnostics. */\nexport function canonicalHostJson(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null || typeof value !== 'object') return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonicalHostJson).join(',')}]`;\n return `{${Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => `${JSON.stringify(key)}:${canonicalHostJson(item)}`)\n .join(',')}}`;\n}\n\n/** Small deterministic digest; it is an identity check, not a security hash. */\nexport function hostRevision(value: unknown): string {\n let hash = 2166136261;\n for (const char of canonicalHostJson(value)) {\n hash ^= char.codePointAt(0) ?? 0;\n hash = Math.imul(hash, 16777619);\n }\n return `fnv1a:${(hash >>> 0).toString(16).padStart(8, '0')}`;\n}\n\nfunction cloneEntry(entry: GamePluginEntry): GamePluginEntry {\n const config = entry.group\n ? (entry.config as readonly GamePluginEntry[] | undefined)?.map(cloneEntry)\n : entry.config;\n return {\n id: entry.id,\n name: entry.name,\n ...(config === undefined ? {} : { config }),\n ...(entry.group === undefined ? {} : { group: entry.group }),\n ...(entry.disabled === undefined ? {} : { disabled: entry.disabled }),\n ...(entry.inject === undefined ? {} : { inject: entry.inject }),\n ...(entry.realm === undefined ? {} : { realm: entry.realm }),\n };\n}\n\nfunction projectPairs(pairs: readonly HostPluginPair[]): {\n readonly entries: readonly GamePluginEntry[];\n readonly modules: readonly HostModuleDescriptor[];\n readonly projections: readonly HostAssemblyPair[];\n} {\n const entries: GamePluginEntry[] = [];\n const modules: HostModuleDescriptor[] = [];\n const projections: HostAssemblyPair[] = [];\n for (const pair of pairs) {\n if (\n pair.backend !== undefined &&\n pair.frontend !== undefined &&\n pair.backend.module.version !== pair.frontend.module.version\n ) {\n throw new HostAssemblyError(\n 'host-assembly-module-version-mismatch',\n `paired module ${pair.id} to use one code version on both hosts`,\n 'Resolve backend and frontend package entries from the same locked package revision.',\n {\n name: pair.id,\n actual: pair.backend.module.version,\n expected: pair.frontend.module.version,\n },\n );\n }\n if (pair.frontend === undefined) continue;\n entries.push(pair.frontend.entry);\n modules.push(pair.frontend.module);\n projections.push({\n id: pair.id,\n entryId: pair.frontend.entry.id,\n module: pair.frontend.module,\n });\n }\n return { entries, modules, projections };\n}\n\nfunction assemblyPairsFromInput(input: HostAssemblyInput): {\n readonly entries: readonly GamePluginEntry[];\n readonly modules: readonly HostModuleDescriptor[];\n readonly pairs: readonly HostAssemblyPair[];\n} {\n if (input.pairs !== undefined) {\n const projected = projectPairs(input.pairs);\n return {\n entries: input.entries ?? projected.entries,\n modules: input.modules ?? projected.modules,\n pairs: projected.projections,\n };\n }\n const entries = input.entries ?? [];\n const modules = [...(input.modules ?? [])];\n for (const [index, entry] of entries.entries()) {\n if (modules[index] !== undefined || modules.some((module) => module.name === entry.name))\n continue;\n modules.push({\n name: entry.name,\n realm: entry.realm ?? 'engine',\n version: 'unknown',\n });\n }\n return {\n entries,\n modules,\n pairs: entries.map((entry, index) => ({\n id: entry.id,\n entryId: entry.id,\n module:\n modules[index]?.name === entry.name\n ? modules[index]\n : (modules.find((module) => module.name === entry.name) ?? {\n name: entry.name,\n realm: entry.realm ?? 'engine',\n version: 'unknown',\n }),\n })),\n };\n}\n\n/** Build one disposable assembly projection from effective backend inputs. */\nexport function createHostAssembly(input: HostAssemblyInput): HostAssembly {\n const projected = assemblyPairsFromInput(input);\n const entries = projected.entries.map(cloneEntry);\n const modules = projected.modules.map((module) => ({ ...module }));\n const pairs = projected.pairs.map((pair) => ({ ...pair, module: { ...pair.module } }));\n const identity = {\n schemaVersion: HOST_ASSEMBLY_SCHEMA_VERSION,\n entries,\n modules,\n pairs,\n ...(input.config === undefined ? {} : { config: input.config }),\n };\n return {\n ...identity,\n revision: hostRevision(identity),\n };\n}\n\nfunction validateEntry(entry: EntryOptions, path: string): string | undefined {\n if (entry === null || typeof entry !== 'object') return `${path} must be an Entry object`;\n if (typeof entry.id !== 'string' || entry.id.length === 0) return `${path}.id must be non-empty`;\n if (typeof entry.name !== 'string' || entry.name.length === 0)\n return `${path}.name must be non-empty`;\n if (entry.group === true) {\n if (!Array.isArray(entry.config)) return `${path}.config must be an Entry array for a Group`;\n for (const [index, child] of entry.config.entries()) {\n const reason = validateEntry(child as EntryOptions, `${path}.config[${index}]`);\n if (reason !== undefined) return reason;\n }\n }\n return undefined;\n}\n\n/** Validate a received assembly before touching the native Loader. */\nexport function validateHostAssembly(assembly: HostAssembly): HostAssemblyValidation {\n if (assembly === null || typeof assembly !== 'object') {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly to be an object',\n 'Regenerate the frontend assembly from the active backend authority.',\n { reason: 'assembly is not an object' },\n ),\n };\n }\n if (assembly.schemaVersion !== HOST_ASSEMBLY_SCHEMA_VERSION) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n `assembly schema ${HOST_ASSEMBLY_SCHEMA_VERSION}`,\n 'Regenerate the frontend assembly with the matching Engine host package.',\n { reason: `unsupported schema ${String(assembly.schemaVersion)}` },\n ),\n };\n }\n if (!Array.isArray(assembly.entries) || !Array.isArray(assembly.modules)) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly entries and modules to be arrays',\n 'Regenerate the frontend assembly from the active backend authority.',\n { reason: 'entries or modules is not an array' },\n ),\n };\n }\n if (!Array.isArray(assembly.pairs)) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly pairs to be an array',\n 'Regenerate the assembly from the backend host using the matching host package.',\n { reason: 'pairs is not an array' },\n ),\n };\n }\n const seen = new Set<string>();\n for (const [index, entry] of assembly.entries.entries()) {\n const reason = validateEntry(entry, `entries[${index}]`);\n if (reason !== undefined) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'all assembly entries to be valid native EntryOptions',\n 'Repair the backend Entry projection before publishing it to a browser.',\n { reason },\n ),\n };\n }\n if (seen.has(entry.id)) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly Entry ids to be unique',\n 'Give repeated plugin instances independent stable ids.',\n { reason: `duplicate Entry id ${entry.id}` },\n ),\n };\n }\n seen.add(entry.id);\n }\n const seenModules = new Map<string, HostModuleDescriptor>();\n for (const [index, module] of assembly.modules.entries()) {\n if (\n module === null ||\n typeof module !== 'object' ||\n typeof module.name !== 'string' ||\n typeof module.realm !== 'string' ||\n typeof module.version !== 'string' ||\n module.name.length === 0 ||\n module.version.length === 0 ||\n (module.url !== undefined && typeof module.url !== 'string') ||\n (module.digest !== undefined &&\n (typeof module.digest !== 'string' || module.digest.length === 0))\n ) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'module names and versions to be non-empty',\n 'Regenerate the module projection from the resolved package metadata.',\n { reason: `invalid module at index ${index}` },\n ),\n };\n }\n const previousModule = seenModules.get(module.name);\n if (\n previousModule !== undefined &&\n (previousModule.realm !== module.realm ||\n previousModule.version !== module.version ||\n previousModule.url !== module.url ||\n previousModule.digest !== module.digest)\n ) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly module identity to be consistent for repeated Entries',\n 'Reuse one resolved module identity when a package has multiple Entry instances.',\n { reason: `module ${module.name} has conflicting identities` },\n ),\n };\n }\n seenModules.set(module.name, module);\n }\n const seenPairIds = new Set<string>();\n for (const [index, pair] of assembly.pairs.entries()) {\n const pairModule = pair?.module;\n if (\n pair === null ||\n typeof pair !== 'object' ||\n typeof pair.id !== 'string' ||\n pair.id.length === 0 ||\n typeof pair.entryId !== 'string' ||\n pair.entryId.length === 0 ||\n pairModule === null ||\n pairModule === undefined ||\n typeof pairModule !== 'object' ||\n typeof pairModule.name !== 'string' ||\n typeof pairModule.realm !== 'string' ||\n typeof pairModule.version !== 'string' ||\n pairModule.name.length === 0 ||\n pairModule.version.length === 0 ||\n (pairModule.url !== undefined && typeof pairModule.url !== 'string') ||\n (pairModule.digest !== undefined &&\n (typeof pairModule.digest !== 'string' || pairModule.digest.length === 0))\n ) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly pair identities and modules to be valid',\n 'Regenerate paired frontend entries from the backend package manifest.',\n { reason: `invalid pair at index ${index}` },\n ),\n };\n }\n if (seenPairIds.has(pair.id)) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly pair ids to be unique',\n 'Give each paired package instance an independent stable id.',\n { reason: `duplicate pair ${pair.id}` },\n ),\n };\n }\n seenPairIds.add(pair.id);\n if (!assembly.entries.some((entry) => entry.id === pair.entryId)) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n `pair ${pair.id} to reference an assembly Entry`,\n 'Keep paired identity and frontend Entry projection under one backend authority.',\n { reason: `missing frontend Entry ${pair.entryId}` },\n ),\n };\n }\n const module = assembly.modules.find(\n (candidate) =>\n candidate.name === pairModule.name &&\n candidate.realm === pairModule.realm &&\n candidate.version === pairModule.version &&\n candidate.url === pairModule.url &&\n candidate.digest === pairModule.digest,\n );\n if (module === undefined) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n `pair ${pair.id} to reference a resolved frontend module`,\n 'Keep module/code identity in the backend-derived assembly projection.',\n { reason: `missing frontend module ${pairModule.name}` },\n ),\n };\n }\n }\n const expected = hostRevision({\n schemaVersion: assembly.schemaVersion,\n entries: assembly.entries,\n modules: assembly.modules,\n pairs: assembly.pairs,\n ...(assembly.config === undefined ? {} : { config: assembly.config }),\n });\n if (expected !== assembly.revision) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-revision-mismatch',\n 'assembly revision to match its entries and modules',\n 'Discard the stale response and request the current backend assembly again.',\n { actual: assembly.revision, expected },\n ),\n };\n }\n return { ok: true, value: assembly };\n}\n\n/** Derive a static module descriptor set from an existing native Catalog. */\nexport function modulesFromCatalog(\n catalog: PluginCatalog,\n realm: PluginRealm,\n version = 'static',\n): HostModuleDescriptor[] {\n return [...catalog.entries()]\n .filter(([, record]) => record.realm === realm)\n .map(([name, record]) => ({\n name,\n realm,\n version: record.version ?? version,\n ...(record.digest === undefined ? {} : { digest: record.digest }),\n }));\n}\n","import { HostAssemblyError, type HostErrorSummary } from './protocol.js';\n\nexport const HOST_ASSEMBLY_SERVICE = 'host/assembly.get' as const;\nexport const HOST_ACTIVATION_REPORT_SERVICE = 'host/assembly.report' as const;\nexport const HOST_ASSEMBLY_CHANGED_TOPIC = 'host/assembly.changed' as const;\n\nexport interface HostRequestOptions {\n readonly signal?: AbortSignal;\n /** The service generation observed by the caller. */\n readonly generation?: number;\n}\n\nexport interface HostServiceRequest<T = unknown> {\n readonly service: string;\n readonly payload: T;\n readonly generation: number;\n readonly signal: AbortSignal;\n}\n\nexport type HostServiceHandler<TPayload = unknown, TResult = unknown> = (\n request: HostServiceRequest<TPayload>,\n) => Promise<TResult> | TResult;\n\nexport interface HostServiceSnapshot {\n readonly service: string;\n readonly generation: number;\n}\n\nexport interface HostTransportClient {\n readonly connected: boolean;\n readonly generation: number;\n request<TPayload, TResult>(\n service: string,\n payload: TPayload,\n options?: HostRequestOptions,\n ): Promise<TResult>;\n subscribe<T>(topic: string, listener: (payload: T) => void): () => void;\n /** Observe a terminal connection loss without issuing another request. */\n onDisconnect(listener: (error: HostAssemblyError) => void): () => void;\n close(reason?: unknown): void;\n}\n\nexport interface HostTransportServer {\n readonly connectedClients: number;\n register<TPayload, TResult>(\n service: string,\n handler: HostServiceHandler<TPayload, TResult>,\n ): () => void;\n invalidate(service: string): void;\n snapshot(service: string): HostServiceSnapshot | undefined;\n publish<T>(topic: string, payload: T): void;\n connect(): HostTransportClient;\n close(reason?: unknown): void;\n}\n\ninterface ServiceRecord {\n readonly identity: symbol;\n generation: number;\n handler: (request: HostServiceRequest<unknown>) => Promise<unknown> | unknown;\n pending: Set<AbortController>;\n}\n\ninterface ClientState {\n connected: boolean;\n readonly subscriptions: Map<string, Set<(payload: unknown) => void>>;\n readonly pending: Set<AbortController>;\n readonly disconnectListeners: Set<(error: HostAssemblyError) => void>;\n}\n\n/**\n * Create the small typed transport seam used by host plugins.\n *\n * This implementation is deliberately transport-neutral: the same request,\n * subscription, cancellation, and generation semantics can be adapted to a\n * WebSocket or MessagePort without moving business objects across the wire.\n * It is also useful for deterministic host and lifecycle tests.\n */\nexport function createHostTransport(): HostTransportServer {\n const services = new Map<string, ServiceRecord>();\n const generations = new Map<string, number>();\n const clients = new Set<ClientState>();\n let closed = false;\n\n const closeClient = (state: ClientState, reason?: unknown): void => {\n if (!state.connected) return;\n state.connected = false;\n for (const controller of state.pending) controller.abort();\n state.pending.clear();\n for (const callbacks of state.subscriptions.values()) callbacks.clear();\n state.subscriptions.clear();\n clients.delete(state);\n const error = new HostAssemblyError(\n 'host-transport-failure',\n 'the host connection to remain available',\n 'Reconnect the frontend host before issuing another request.',\n { service: 'host/socket', reason: String(reason ?? 'host connection closed') },\n );\n for (const listener of state.disconnectListeners) listener(error);\n state.disconnectListeners.clear();\n };\n\n const server: HostTransportServer = {\n get connectedClients() {\n return clients.size;\n },\n register(service, handler) {\n if (closed) throw new Error('host transport is closed');\n const previous = services.get(service);\n const generation = (generations.get(service) ?? 0) + 1;\n generations.set(service, generation);\n for (const controller of previous?.pending ?? []) controller.abort();\n const identity = Symbol(service);\n services.set(service, {\n identity,\n generation,\n handler: handler as unknown as (\n request: HostServiceRequest<unknown>,\n ) => Promise<unknown> | unknown,\n pending: new Set(),\n });\n return () => {\n const current = services.get(service);\n if (current?.identity !== identity) return;\n for (const controller of current.pending) controller.abort();\n generations.set(service, current.generation + 1);\n services.delete(service);\n };\n },\n invalidate(service) {\n const current = services.get(service);\n if (current === undefined) return;\n for (const controller of current.pending) controller.abort();\n generations.set(service, current.generation + 1);\n services.delete(service);\n },\n snapshot(service) {\n const current = services.get(service);\n return current === undefined ? undefined : { service, generation: current.generation };\n },\n publish(topic, payload) {\n for (const state of clients) {\n for (const listener of state.subscriptions.get(topic) ?? []) listener(payload);\n }\n },\n connect() {\n if (closed) throw new Error('host transport is closed');\n const state: ClientState = {\n connected: true,\n subscriptions: new Map(),\n pending: new Set(),\n disconnectListeners: new Set(),\n };\n clients.add(state);\n const client: HostTransportClient = {\n get connected() {\n return state.connected;\n },\n get generation() {\n let current = 0;\n for (const service of services.values()) current = Math.max(current, service.generation);\n return current;\n },\n async request(service, payload, options = {}) {\n if (!state.connected) {\n throw new HostAssemblyError(\n 'host-assembly-service-unavailable',\n `service ${service} to be available on the current connection`,\n 'Reconnect the frontend host before issuing another request.',\n { service },\n );\n }\n if (options.signal?.aborted) {\n throw new HostAssemblyError(\n 'host-assembly-request-aborted',\n `request ${service} to start with a live AbortSignal`,\n 'Start a fresh request with a live AbortSignal.',\n { service },\n );\n }\n const record = services.get(service);\n if (record === undefined) {\n const invalidatedGeneration = generations.get(service);\n if (\n options.generation !== undefined &&\n invalidatedGeneration !== undefined &&\n options.generation < invalidatedGeneration\n ) {\n throw new HostAssemblyError(\n 'host-assembly-stale-request',\n `request generation ${options.generation} to match the invalidated service ${service}`,\n 'Refresh the client capability after the backend service is enabled again.',\n { service, generation: options.generation },\n );\n }\n throw new HostAssemblyError(\n 'host-assembly-service-unavailable',\n `service ${service} to be registered`,\n 'Wait for the backend plugin to activate before using this capability.',\n { service },\n );\n }\n const generation = options.generation ?? record.generation;\n if (generation !== record.generation) {\n throw new HostAssemblyError(\n 'host-assembly-stale-request',\n `request generation ${generation} to match service ${service}`,\n 'Refresh the client capability and retry only when the owning business contract permits it.',\n { service, generation },\n );\n }\n const controller = new AbortController();\n const abortFromCaller = (): void => controller.abort();\n options.signal?.addEventListener('abort', abortFromCaller, { once: true });\n record.pending.add(controller);\n state.pending.add(controller);\n let removeAbortRequest: (() => void) | undefined;\n try {\n if (controller.signal.aborted) {\n throw new HostAssemblyError(\n 'host-assembly-request-aborted',\n `request ${service} not to be aborted before execution`,\n 'Start a fresh request with a live AbortSignal.',\n { service },\n );\n }\n let abortReject: ((reason: unknown) => void) | undefined;\n const aborted = new Promise<never>((_, reject) => {\n abortReject = reject;\n });\n const abortRequest = (): void => {\n abortReject?.(\n new HostAssemblyError(\n 'host-assembly-request-aborted',\n `request ${service} to finish before its service is closed or invalidated`,\n 'Treat the capability as withdrawn and refresh the service before retrying.',\n { service },\n ),\n );\n };\n controller.signal.addEventListener('abort', abortRequest, { once: true });\n removeAbortRequest = () => controller.signal.removeEventListener('abort', abortRequest);\n const result = await Promise.race([\n Promise.resolve(\n record.handler({\n service,\n payload,\n generation,\n signal: controller.signal,\n }),\n ),\n aborted,\n ]);\n if (controller.signal.aborted) {\n throw new HostAssemblyError(\n 'host-assembly-request-aborted',\n `request ${service} to finish before its service is invalidated`,\n 'Treat the capability as withdrawn and refresh the service before retrying.',\n { service },\n );\n }\n return result as never;\n } finally {\n removeAbortRequest?.();\n record.pending.delete(controller);\n state.pending.delete(controller);\n options.signal?.removeEventListener('abort', abortFromCaller);\n }\n },\n subscribe(topic, listener) {\n if (!state.connected) return () => {};\n const callbacks = state.subscriptions.get(topic) ?? new Set();\n callbacks.add(listener as (payload: unknown) => void);\n state.subscriptions.set(topic, callbacks);\n return () => {\n callbacks.delete(listener as (payload: unknown) => void);\n if (callbacks.size === 0) state.subscriptions.delete(topic);\n };\n },\n onDisconnect(listener) {\n if (!state.connected) {\n listener(\n new HostAssemblyError(\n 'host-transport-failure',\n 'the host connection to remain available',\n 'Reconnect the frontend host before issuing another request.',\n { service: 'host/socket', reason: 'host connection is already closed' },\n ),\n );\n return () => {};\n }\n state.disconnectListeners.add(listener);\n return () => state.disconnectListeners.delete(listener);\n },\n close(reason) {\n closeClient(state, reason);\n },\n };\n return client;\n },\n close(reason) {\n if (closed) return;\n closed = true;\n for (const service of services.values())\n for (const controller of service.pending) controller.abort();\n services.clear();\n for (const client of [...clients]) closeClient(client, reason);\n generations.clear();\n },\n };\n\n return server;\n}\n\n/** Minimal socket shape shared by browser WebSocket and Node `ws` instances. */\nexport interface HostSocketLike {\n readonly readyState?: number;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n addEventListener?(type: string, listener: (...args: unknown[]) => void): void;\n removeEventListener?(type: string, listener: (...args: unknown[]) => void): void;\n on?(type: string, listener: (...args: unknown[]) => void): void;\n off?(type: string, listener: (...args: unknown[]) => void): void;\n}\n\ntype HostWireMessage =\n | {\n readonly kind: 'request';\n readonly id: string;\n readonly service: string;\n readonly payload: unknown;\n readonly generation?: number;\n }\n | { readonly kind: 'cancel'; readonly id: string }\n | { readonly kind: 'subscribe'; readonly topic: string }\n | { readonly kind: 'unsubscribe'; readonly topic: string }\n | {\n readonly kind: 'response';\n readonly id: string;\n readonly ok: boolean;\n readonly value?: unknown;\n readonly error?: HostErrorSummary;\n readonly generation?: number;\n }\n | { readonly kind: 'event'; readonly topic: string; readonly payload: unknown };\n\nfunction addSocketListener(\n socket: HostSocketLike,\n type: string,\n listener: (...args: unknown[]) => void,\n): () => void {\n if (socket.addEventListener !== undefined) {\n socket.addEventListener(type, listener);\n return () => socket.removeEventListener?.(type, listener);\n }\n socket.on?.(type, listener);\n return () => socket.off?.(type, listener);\n}\n\nfunction socketPayload(value: unknown): string | undefined {\n const data = Array.isArray(value) ? value[0] : value;\n if (typeof data === 'string') return data;\n if (data instanceof ArrayBuffer) return new TextDecoder().decode(data);\n if (data instanceof Uint8Array) return new TextDecoder().decode(data);\n if (data !== null && typeof data === 'object' && 'data' in data)\n return socketPayload((data as { readonly data?: unknown }).data);\n return undefined;\n}\n\nfunction parseWire(value: unknown): HostWireMessage | undefined {\n const source = socketPayload(value);\n if (source === undefined) return undefined;\n try {\n const parsed = JSON.parse(source) as unknown;\n return parsed !== null &&\n typeof parsed === 'object' &&\n typeof (parsed as { kind?: unknown }).kind === 'string'\n ? (parsed as HostWireMessage)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction serializeError(service: string, error: unknown): HostErrorSummary {\n if (\n error !== null &&\n typeof error === 'object' &&\n typeof (error as { code?: unknown }).code === 'string' &&\n typeof (error as { expected?: unknown }).expected === 'string' &&\n typeof (error as { hint?: unknown }).hint === 'string'\n ) {\n const detail = (error as { readonly detail?: unknown }).detail;\n return {\n code: (error as { readonly code: string }).code,\n expected: (error as { readonly expected: string }).expected,\n hint: (error as { readonly hint: string }).hint,\n detail:\n detail !== null && typeof detail === 'object'\n ? (detail as Readonly<Record<string, unknown>>)\n : { reason: String(detail ?? 'unknown failure') },\n };\n }\n return {\n code: 'host-transport-failure',\n expected: `service ${service} to complete without an exception`,\n hint: 'Inspect the backend host process and reconnect before retrying.',\n detail: { service, reason: error instanceof Error ? error.message : String(error) },\n };\n}\n\nfunction errorFromSummary(service: string, summary: HostErrorSummary): HostAssemblyError {\n const detail = summary.detail as Record<string, unknown>;\n const supported = new Set([\n 'host-assembly-invalid',\n 'host-assembly-revision-mismatch',\n 'host-assembly-module-missing',\n 'host-assembly-module-version-mismatch',\n 'host-assembly-reload-required',\n 'host-assembly-service-unavailable',\n 'host-assembly-stale-request',\n 'host-assembly-request-aborted',\n 'host-assembly-not-ready',\n 'host-transport-failure',\n ]);\n if (supported.has(summary.code)) {\n return new HostAssemblyError(\n summary.code as never,\n summary.expected,\n summary.hint,\n detail as never,\n );\n }\n return new HostAssemblyError('host-transport-failure', summary.expected, summary.hint, {\n service,\n reason: summary.detail.reason ? String(summary.detail.reason) : summary.code,\n });\n}\n\nfunction transportFailure(service: string, reason: string): HostAssemblyError {\n return new HostAssemblyError(\n 'host-transport-failure',\n `service ${service} to remain connected`,\n 'Reconnect the frontend host and inspect the backend transport diagnostics.',\n { service, reason },\n );\n}\n\nfunction sendWire(socket: HostSocketLike, message: HostWireMessage): void {\n socket.send(JSON.stringify(message));\n}\n\n/** Connect one browser WebSocket (or an already-open Node `ws`) to a host server. */\nexport async function createHostWebSocketClient(\n socket: HostSocketLike,\n): Promise<HostTransportClient> {\n if (socket.readyState !== undefined && socket.readyState !== 1) {\n await new Promise<void>((resolve, reject) => {\n const removeOpen = addSocketListener(socket, 'open', () => {\n removeOpen();\n removeError();\n resolve();\n });\n const removeError = addSocketListener(socket, 'error', (cause) => {\n removeOpen();\n removeError();\n reject(transportFailure('host/connect', String(cause ?? 'socket error')));\n });\n });\n }\n const pending = new Map<\n string,\n {\n readonly resolve: (value: unknown) => void;\n readonly reject: (reason: unknown) => void;\n readonly cleanup: () => void;\n }\n >();\n const subscriptions = new Map<string, Set<(payload: unknown) => void>>();\n const disconnectListeners = new Set<(error: HostAssemblyError) => void>();\n let connected = true;\n let generation = 0;\n let sequence = 0;\n const disconnectError = (reason: unknown): HostAssemblyError =>\n transportFailure('host/socket', reason instanceof Error ? reason.message : String(reason));\n const failPending = (reason: unknown): void => {\n if (!connected) return;\n connected = false;\n for (const request of pending.values()) {\n request.cleanup();\n request.reject(reason);\n }\n pending.clear();\n subscriptions.clear();\n const error = disconnectError(reason);\n for (const listener of disconnectListeners) listener(error);\n disconnectListeners.clear();\n };\n const removeMessage = addSocketListener(socket, 'message', (event) => {\n const message = parseWire(event);\n if (message === undefined) return;\n if (message.kind === 'event') {\n for (const listener of subscriptions.get(message.topic) ?? []) listener(message.payload);\n return;\n }\n if (message.kind !== 'response') return;\n if (message.generation !== undefined) generation = Math.max(generation, message.generation);\n const request = pending.get(message.id);\n if (request === undefined) return;\n pending.delete(message.id);\n request.cleanup();\n if (message.ok) request.resolve(message.value);\n else\n request.reject(\n errorFromSummary(\n 'host/socket',\n message.error ?? serializeError('host/socket', 'unknown response failure'),\n ),\n );\n });\n const removeClose = addSocketListener(socket, 'close', (reason) => {\n removeMessage();\n removeClose();\n removeError();\n failPending(disconnectError(reason));\n });\n const removeError = addSocketListener(socket, 'error', (reason) => {\n failPending(disconnectError(reason));\n });\n const client: HostTransportClient = {\n get connected() {\n return connected;\n },\n get generation() {\n return generation;\n },\n request<TPayload, TResult>(\n service: string,\n payload: TPayload,\n options: HostRequestOptions = {},\n ): Promise<TResult> {\n if (!connected) return Promise.reject(disconnectError('socket is closed'));\n if (options.signal?.aborted)\n return Promise.reject(\n new HostAssemblyError(\n 'host-assembly-request-aborted',\n `request ${service} to start with a live AbortSignal`,\n 'Start a fresh request with a live AbortSignal.',\n { service },\n ),\n );\n sequence += 1;\n const id = `${Date.now().toString(36)}-${sequence.toString(36)}`;\n return new Promise<TResult>((resolve, reject) => {\n const abort = (): void => {\n const request = pending.get(id);\n if (request === undefined) return;\n pending.delete(id);\n request.cleanup();\n try {\n sendWire(socket, { kind: 'cancel', id });\n } catch {\n // The close/error listener reports the transport failure separately.\n }\n reject(\n new HostAssemblyError(\n 'host-assembly-request-aborted',\n `request ${service} to finish before cancellation`,\n 'Start a fresh request with a live AbortSignal.',\n { service },\n ),\n );\n };\n const cleanup = (): void => options.signal?.removeEventListener('abort', abort);\n pending.set(id, {\n resolve: resolve as unknown as (value: unknown) => void,\n reject,\n cleanup,\n });\n options.signal?.addEventListener('abort', abort, { once: true });\n if (options.signal?.aborted) {\n abort();\n return;\n }\n try {\n sendWire(socket, {\n kind: 'request',\n id,\n service,\n payload,\n ...(options.generation === undefined ? {} : { generation: options.generation }),\n });\n } catch (cause) {\n const request = pending.get(id);\n request?.cleanup();\n pending.delete(id);\n reject(disconnectError(cause));\n }\n });\n },\n subscribe(topic, listener) {\n if (!connected) return () => {};\n const listeners = subscriptions.get(topic) ?? new Set();\n listeners.add(listener as (payload: unknown) => void);\n subscriptions.set(topic, listeners);\n sendWire(socket, { kind: 'subscribe', topic });\n return () => {\n listeners.delete(listener as (payload: unknown) => void);\n if (listeners.size !== 0) return;\n subscriptions.delete(topic);\n sendWire(socket, { kind: 'unsubscribe', topic });\n };\n },\n onDisconnect(listener) {\n if (!connected) {\n listener(disconnectError('socket is already closed'));\n return () => {};\n }\n disconnectListeners.add(listener);\n return () => disconnectListeners.delete(listener);\n },\n close(reason) {\n if (!connected) return;\n failPending(disconnectError(reason ?? 'client closed the host connection'));\n removeMessage();\n removeClose();\n removeError();\n socket.close();\n },\n };\n return client;\n}\n\n/** Open a browser-native WebSocket and install the typed host client. */\nexport async function connectHostWebSocket(url: string): Promise<HostTransportClient> {\n const Constructor = globalThis.WebSocket;\n if (typeof Constructor !== 'function')\n throw transportFailure('host/connect', 'the current runtime does not provide WebSocket');\n return createHostWebSocketClient(new Constructor(url) as unknown as HostSocketLike);\n}\n\n/** Attach one accepted process-side socket to an Engine host transport server. */\nexport function attachHostWebSocketServer(\n socket: HostSocketLike,\n server: HostTransportServer,\n): () => void {\n const client = server.connect();\n const pending = new Map<string, AbortController>();\n const subscriptions = new Map<string, () => void>();\n let disposed = false;\n const removeMessage = addSocketListener(socket, 'message', (event) => {\n const message = parseWire(event);\n if (message === undefined || disposed) return;\n if (message.kind === 'cancel') {\n pending.get(message.id)?.abort();\n return;\n }\n if (message.kind === 'subscribe') {\n subscriptions.get(message.topic)?.();\n subscriptions.set(\n message.topic,\n client.subscribe(message.topic, (payload) => {\n if (!disposed) sendWire(socket, { kind: 'event', topic: message.topic, payload });\n }),\n );\n return;\n }\n if (message.kind === 'unsubscribe') {\n subscriptions.get(message.topic)?.();\n subscriptions.delete(message.topic);\n return;\n }\n if (message.kind !== 'request') return;\n const controller = new AbortController();\n pending.set(message.id, controller);\n void client\n .request(message.service, message.payload, {\n signal: controller.signal,\n ...(message.generation === undefined ? {} : { generation: message.generation }),\n })\n .then((value) => {\n if (!disposed)\n sendWire(socket, {\n kind: 'response',\n id: message.id,\n ok: true,\n value,\n generation: client.generation,\n });\n })\n .catch((error) => {\n if (!disposed)\n sendWire(socket, {\n kind: 'response',\n id: message.id,\n ok: false,\n error: serializeError(message.service, error),\n generation: client.generation,\n });\n })\n .finally(() => pending.delete(message.id));\n });\n const removeClose = addSocketListener(socket, 'close', () => dispose());\n const removeError = addSocketListener(socket, 'error', () => dispose());\n function dispose(): void {\n if (disposed) return;\n disposed = true;\n removeMessage();\n removeClose();\n removeError();\n for (const controller of pending.values()) controller.abort();\n pending.clear();\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n client.close('host socket disconnected');\n }\n return dispose;\n}\n","import { Context, type Fiber, type Plugin } from '@forgeax/engine-plugin';\nimport {\n bootstrapCatalogLoader,\n type CatalogLoader,\n type CatalogLoaderBootstrapResult,\n type GamePluginEntry,\n type PluginCatalog,\n type PluginRealm,\n projectPluginEntries,\n} from '@forgeax/engine-plugin/loader';\nimport {\n assertHostModuleCatalogIdentity,\n createHostAssembly,\n type HostActivationReport,\n type HostAssembly,\n HostAssemblyError,\n type HostAssemblyInput,\n type HostModuleDescriptor,\n type HostPluginPair,\n modulesFromCatalog,\n validateHostAssembly,\n} from './protocol.js';\nimport {\n createHostTransport,\n HOST_ACTIVATION_REPORT_SERVICE,\n HOST_ASSEMBLY_CHANGED_TOPIC,\n HOST_ASSEMBLY_SERVICE,\n type HostTransportServer,\n} from './transport.js';\n\nexport interface BackendAssemblyAuthority {\n readonly current: HostAssembly;\n readonly generation: number;\n subscribe(listener: (assembly: HostAssembly) => void): () => void;\n}\n\nexport interface BackendHostOptions {\n /** Existing domain context may be supplied when App/ECS owns the root. */\n readonly context?: Context;\n /** Always-loaded bootstrap capabilities. Their effects remain Cordis-owned. */\n readonly startupPlugins?: readonly Plugin[];\n /** Optional native Catalog used to activate backend Entries. */\n readonly catalog?: PluginCatalog;\n readonly realm?: PluginRealm;\n readonly entries?: readonly GamePluginEntry[];\n /** Paired backend/frontend identities. Backend Entries are activated locally. */\n readonly pairs?: readonly HostPluginPair[];\n readonly assembly?: HostAssembly;\n readonly modules?: readonly HostModuleDescriptor[];\n readonly config?: unknown;\n readonly transport?: HostTransportServer;\n readonly onActivationReport?: (report: HostActivationReport) => void | Promise<void>;\n}\n\nexport interface BackendHost {\n readonly context: Context;\n readonly loader?: CatalogLoader;\n readonly assembly: BackendAssemblyAuthority;\n readonly transport: HostTransportServer;\n readonly ownedContext: boolean;\n /** Reconcile backend Entries and publish the matching frontend assembly atomically. */\n update(input: HostAssemblyInput | readonly GamePluginEntry[]): Promise<HostAssembly>;\n dispose(): Promise<void>;\n}\n\nfunction effectiveAssemblyInput(\n current: HostAssembly,\n input: HostAssemblyInput,\n): HostAssemblyInput {\n const preservePairs =\n input.pairs === undefined && input.entries === undefined && input.modules === undefined;\n const entriesById = new Map(current.entries.map((entry) => [entry.id, entry]));\n const modulesByName = new Map(current.modules.map((module) => [module.name, module]));\n const pairs = current.pairs.flatMap((pair) => {\n const entry = entriesById.get(pair.entryId);\n const module = modulesByName.get(pair.module.name);\n return entry === undefined || module === undefined\n ? []\n : [{ id: pair.id, frontend: { entry, module } }];\n });\n return {\n entries: input.entries ?? current.entries,\n modules: input.modules ?? current.modules,\n ...(input.pairs !== undefined ? { pairs: input.pairs } : preservePairs ? { pairs } : {}),\n ...(input.config === undefined\n ? current.config === undefined\n ? {}\n : { config: current.config }\n : { config: input.config }),\n ...(input.backendEntries === undefined ? {} : { backendEntries: input.backendEntries }),\n };\n}\n\nfunction authorityOf(initial: HostAssembly): {\n readonly authority: BackendAssemblyAuthority;\n readonly publish: (input: HostAssemblyInput) => HostAssembly;\n} {\n let current = initial;\n let generation = 1;\n const listeners = new Set<(assembly: HostAssembly) => void>();\n const authority: BackendAssemblyAuthority = {\n get current() {\n return current;\n },\n get generation() {\n return generation;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n return {\n authority,\n publish(input) {\n const next = createHostAssembly(input);\n const checked = validateHostAssembly(next);\n if (!checked.ok) throw checked.error;\n current = checked.value;\n generation += 1;\n for (const listener of listeners) listener(current);\n return current;\n },\n };\n}\n\nfunction hostFoundationPlugin(\n assembly: BackendAssemblyAuthority,\n transport: HostTransportServer,\n): Plugin {\n return {\n name: 'forgeax:backend-host-foundation',\n provide: ['hostAssembly', 'hostTransport'],\n apply(ctx) {\n ctx.provide('hostAssembly', assembly);\n ctx.provide('hostTransport', transport);\n },\n };\n}\n\nfunction assertBackendCatalogIdentity(\n catalog: PluginCatalog | undefined,\n modules: readonly HostModuleDescriptor[],\n): void {\n if (catalog === undefined) return;\n for (const module of modules) {\n const record = catalog.get(module.name);\n if (record !== undefined) assertHostModuleCatalogIdentity(module, record);\n }\n}\n\n/**\n * Start the backend side of the generic Engine host.\n *\n * The function only creates the Cordis root and loads declared bootstrap and\n * Catalog entries. Project, App, World and game policy arrive as plugins.\n */\nexport async function createBackendHost(options: BackendHostOptions = {}): Promise<BackendHost> {\n const context = options.context ?? new Context();\n const ownedContext = options.context === undefined;\n const realm = options.realm ?? 'engine';\n const catalog = options.catalog;\n const pairedBackendEntries =\n options.pairs?.flatMap((pair) => (pair.backend === undefined ? [] : [pair.backend.entry])) ??\n [];\n const entries =\n options.entries ??\n options.assembly?.entries ??\n options.pairs?.flatMap((pair) => (pair.frontend === undefined ? [] : [pair.frontend.entry])) ??\n [];\n const modules =\n options.modules ??\n options.assembly?.modules ??\n (options.pairs === undefined\n ? catalog === undefined\n ? []\n : modulesFromCatalog(catalog, realm)\n : options.pairs.flatMap((pair) =>\n pair.frontend === undefined ? [] : [pair.frontend.module],\n ));\n const initialAssembly =\n options.assembly ??\n createHostAssembly({\n entries,\n modules,\n ...(options.pairs === undefined ? {} : { pairs: options.pairs }),\n ...(options.config === undefined ? {} : { config: options.config }),\n });\n const checkedInitial = validateHostAssembly(initialAssembly);\n if (!checkedInitial.ok) {\n if (ownedContext) await context.fiber.dispose();\n throw checkedInitial.error;\n }\n const backendModules =\n options.pairs === undefined\n ? modules\n : options.pairs.flatMap((pair) => (pair.backend === undefined ? [] : [pair.backend.module]));\n assertBackendCatalogIdentity(catalog, backendModules);\n const authority = authorityOf(checkedInitial.value);\n const assembly = authority.authority;\n // A DevKit frontend may intentionally reconnect against the provider-only\n // snapshot that bootstrapped this host, while the authority already points\n // at the promoted full assembly from an earlier client. Keep that one\n // staged revision valid for activation reports; all other revisions must\n // still match the current authority exactly.\n const bootstrapRevision = checkedInitial.value.revision;\n const transport = options.transport ?? createHostTransport();\n let foundationFiber: Fiber | undefined;\n let loaderFiber: Fiber | undefined;\n let loader: CatalogLoader | undefined;\n let backendEntries =\n options.pairs === undefined\n ? (options.entries ?? options.assembly?.entries ?? [])\n : pairedBackendEntries;\n const startupFibers: Fiber[] = [];\n let unregisterAssemblyService: (() => void) | undefined;\n let unregisterActivationService: (() => void) | undefined;\n let unsubscribeAssembly: (() => void) | undefined;\n try {\n foundationFiber = await context.plugin(hostFoundationPlugin(assembly, transport));\n for (const plugin of options.startupPlugins ?? [])\n startupFibers.push(await context.plugin(plugin));\n if (catalog !== undefined) {\n const bootstrapped = await bootstrapCatalogLoader(context, catalog, realm, {\n catalogDigest: checkedInitial.value.revision,\n supportedRealms: [realm],\n });\n if (!bootstrapped.ok) throw bootstrapped.error;\n loaderFiber = bootstrapped.value.fiber;\n loader = bootstrapped.value.loader;\n if (backendEntries.length > 0) {\n await loader.root.update(projectPluginEntries(backendEntries, realm, realm));\n await loader.await();\n }\n }\n unregisterAssemblyService = transport.register(HOST_ASSEMBLY_SERVICE, () => assembly.current);\n unregisterActivationService = transport.register(\n HOST_ACTIVATION_REPORT_SERVICE,\n async ({ payload }) => {\n const report = payload as HostActivationReport;\n if (\n report.revision !== assembly.current.revision &&\n report.revision !== bootstrapRevision\n ) {\n throw new HostAssemblyError(\n 'host-assembly-revision-mismatch',\n `activation report revision ${report.revision} to match ${assembly.current.revision}`,\n 'Discard the stale frontend report and fetch the current backend assembly.',\n { actual: report.revision, expected: assembly.current.revision },\n );\n }\n await options.onActivationReport?.(report);\n return { accepted: true };\n },\n );\n unsubscribeAssembly = assembly.subscribe((next) => {\n transport.publish(HOST_ASSEMBLY_CHANGED_TOPIC, next);\n });\n } catch (error) {\n unregisterActivationService?.();\n unregisterAssemblyService?.();\n unsubscribeAssembly?.();\n await loaderFiber?.dispose();\n for (const fiber of startupFibers.reverse()) await fiber.dispose();\n await foundationFiber?.dispose();\n if (ownedContext) await context.fiber.dispose();\n throw error;\n }\n\n let disposed = false;\n const host: BackendHost = {\n context,\n ...(loader === undefined ? {} : { loader }),\n assembly,\n transport,\n ownedContext,\n async update(nextInput) {\n if (disposed) {\n throw new HostAssemblyError(\n 'host-assembly-service-unavailable',\n 'backend host to remain active while updating Entries',\n 'Create a new host instance before updating the disposed host.',\n { service: 'host-assembly' },\n );\n }\n const input: HostAssemblyInput = Array.isArray(nextInput)\n ? {\n entries: nextInput as readonly GamePluginEntry[],\n backendEntries: nextInput as readonly GamePluginEntry[],\n }\n : (nextInput as HostAssemblyInput);\n const effectiveInput = effectiveAssemblyInput(assembly.current, input);\n const candidate = createHostAssembly(effectiveInput);\n const checkedCandidate = validateHostAssembly(candidate);\n if (!checkedCandidate.ok) throw checkedCandidate.error;\n const candidateBackendModules =\n input.pairs === undefined\n ? checkedCandidate.value.modules\n : input.pairs.flatMap((pair) =>\n pair.backend === undefined ? [] : [pair.backend.module],\n );\n assertBackendCatalogIdentity(catalog, candidateBackendModules);\n const nextBackendEntries =\n input.backendEntries ??\n (input.pairs === undefined\n ? (input.entries ?? backendEntries)\n : input.pairs.flatMap((pair) =>\n pair.backend === undefined ? [] : [pair.backend.entry],\n ));\n if (loader === undefined && nextBackendEntries.length > 0) {\n throw new HostAssemblyError(\n 'host-assembly-service-unavailable',\n 'a CatalogLoader to be installed before updating Entries',\n 'Provide a backend Catalog when the host owns plugin Entry activation.',\n { service: 'loader' },\n );\n }\n if (loader !== undefined) {\n await loader.root.update(projectPluginEntries(nextBackendEntries, realm, realm));\n await loader.await();\n }\n backendEntries = nextBackendEntries;\n return authority.publish(effectiveInput);\n },\n async dispose() {\n if (disposed) return;\n disposed = true;\n unsubscribeAssembly?.();\n unregisterActivationService?.();\n unregisterAssemblyService?.();\n transport.close();\n await loaderFiber?.dispose();\n for (const fiber of startupFibers.reverse()) await fiber.dispose();\n await foundationFiber?.dispose();\n if (ownedContext) await context.fiber.dispose();\n },\n };\n return host;\n}\n\nexport type { CatalogLoaderBootstrapResult };\nexport { HostAssemblyError };\n","import { Context, type Fiber, inspectCatalogPlugins, type Plugin } from '@forgeax/engine-plugin';\nimport {\n type CatalogLoader,\n type GamePluginEntry,\n installCatalogLoader,\n type PluginCatalog,\n type PluginCatalogRecord,\n type PluginRealm,\n projectPluginEntries,\n} from '@forgeax/engine-plugin/loader';\nimport {\n assertHostModuleCatalogIdentity,\n createHostAssembly,\n type HostActivationEntry,\n type HostActivationReport,\n type HostAssembly,\n HostAssemblyError,\n type HostErrorSummary,\n modulesFromCatalog,\n validateHostAssembly,\n} from './protocol.js';\nimport {\n HOST_ACTIVATION_REPORT_SERVICE,\n HOST_ASSEMBLY_SERVICE,\n type HostTransportClient,\n} from './transport.js';\n\nexport type FrontendHostState = 'created' | 'loading' | 'active' | 'failed' | 'disposed';\n\nexport interface FrontendHostStatus {\n readonly state: FrontendHostState;\n readonly revision: string;\n readonly entries?: readonly HostActivationEntry[];\n readonly error?: unknown;\n}\n\nexport interface FrontendAssemblyState {\n readonly current: HostAssembly;\n readonly status: FrontendHostStatus;\n}\n\nexport interface FrontendHostOptions {\n /** App may provide its existing Engine Context; the host owns only its Fiber. */\n readonly context?: Context;\n readonly startupPlugins?: readonly Plugin[];\n readonly catalog?: PluginCatalog;\n /**\n * Optional local assembly snapshot used for the first staged activation.\n * When a transport is also present, the backend remains authoritative for\n * later updates; this snapshot lets callers activate provider-only entries\n * before their host-owned services are ready.\n */\n readonly assembly?: HostAssembly;\n readonly entries?: readonly GamePluginEntry[];\n readonly realm?: PluginRealm;\n readonly config?: unknown;\n readonly transport?: HostTransportClient;\n readonly moduleVersions?: ReadonlyMap<string, string>;\n readonly reportStatus?: (status: FrontendHostStatus) => void | Promise<void>;\n readonly autoActivate?: boolean;\n}\n\nexport interface FrontendHost {\n readonly context: Context;\n readonly loader?: CatalogLoader;\n readonly assembly: FrontendAssemblyState;\n readonly transport?: HostTransportClient;\n readonly ownedContext: boolean;\n readonly status: FrontendHostStatus;\n activate(assembly?: HostAssembly): Promise<void>;\n update(assembly: HostAssembly): Promise<void>;\n dispose(): Promise<void>;\n}\n\nfunction hostFoundationPlugin(\n assembly: FrontendAssemblyState,\n transport: HostTransportClient | undefined,\n): Plugin {\n return {\n name: 'forgeax:frontend-host-foundation',\n provide: ['hostAssembly', 'hostTransport'],\n apply(ctx) {\n ctx.provide('hostAssembly', assembly);\n if (transport !== undefined) ctx.provide('hostTransport', transport);\n },\n };\n}\n\nfunction dynamicModuleRecord(\n name: string,\n realm: PluginRealm,\n version: string,\n url: string | undefined,\n digest: string | undefined,\n): PluginCatalogRecord {\n if (url === undefined) {\n return {\n realm,\n version,\n ...(digest === undefined ? {} : { digest }),\n load: async () => {\n throw new HostAssemblyError(\n 'host-assembly-module-missing',\n `module ${name} to have a browser URL or static Catalog record`,\n 'Add the module to the frozen Catalog or publish its browser entry from the backend.',\n { name },\n );\n },\n };\n }\n return {\n realm,\n version,\n ...(digest === undefined ? {} : { digest }),\n load: () => import(/* @vite-ignore */ url),\n };\n}\n\nfunction catalogForAssembly(\n assembly: HostAssembly,\n staticCatalog: PluginCatalog | undefined,\n): PluginCatalog {\n const catalog = new Map<string, PluginCatalogRecord>();\n for (const module of assembly.modules) {\n const existing = staticCatalog?.get(module.name);\n if (existing !== undefined) {\n assertHostModuleCatalogIdentity(module, existing);\n catalog.set(module.name, existing);\n continue;\n }\n catalog.set(\n module.name,\n dynamicModuleRecord(module.name, module.realm, module.version, module.url, module.digest),\n );\n }\n for (const [name, record] of staticCatalog ?? []) {\n if (!catalog.has(name)) catalog.set(name, record);\n }\n return catalog;\n}\n\nfunction assertModuleVersions(\n assembly: HostAssembly,\n versions: ReadonlyMap<string, string> | undefined,\n): void {\n if (versions === undefined) return;\n for (const module of assembly.modules) {\n const actual = versions.get(module.name);\n if (actual === undefined || actual === module.version) continue;\n throw new HostAssemblyError(\n 'host-assembly-module-version-mismatch',\n `module ${module.name} to use version ${module.version}`,\n 'Refresh the browser module graph from the same backend assembly revision.',\n { name: module.name, actual, expected: module.version },\n );\n }\n}\n\nfunction moduleIdentity(module: {\n readonly version: string;\n readonly digest?: string;\n readonly url?: string;\n}): string {\n return `${module.version}@${module.digest ?? module.url ?? '<catalog>'}`;\n}\n\n/**\n * The native Loader keeps the imported module graph for its lifetime. A new\n * module URL or code identity therefore cannot be applied by Entry.update;\n * accepting it would report a new assembly while executing the old code.\n */\nfunction assertModuleReloadBoundary(previous: HostAssembly, next: HostAssembly): void {\n const previousModules = new Map(previous.modules.map((module) => [module.name, module]));\n const nextModules = new Map(next.modules.map((module) => [module.name, module]));\n const names = new Set([...previousModules.keys(), ...nextModules.keys()]);\n for (const name of names) {\n const before = previousModules.get(name);\n const after = nextModules.get(name);\n const beforeIdentity = before === undefined ? '<absent>' : moduleIdentity(before);\n const afterIdentity = after === undefined ? '<absent>' : moduleIdentity(after);\n if (\n before === undefined ||\n after === undefined ||\n before.realm !== after.realm ||\n beforeIdentity !== afterIdentity\n ) {\n throw new HostAssemblyError(\n 'host-assembly-reload-required',\n `module ${name} to keep its loaded code identity ${beforeIdentity}`,\n 'Reload the frontend host to install the new module graph before activating this assembly.',\n { module: name, actual: beforeIdentity, expected: afterIdentity },\n );\n }\n }\n}\n\nfunction staticAssembly(options: FrontendHostOptions, realm: PluginRealm): HostAssembly {\n const entries = options.entries ?? [];\n const modules =\n options.catalog === undefined ? [] : modulesFromCatalog(options.catalog, realm, 'static');\n return createHostAssembly({\n entries,\n modules,\n ...(options.config === undefined ? {} : { config: options.config }),\n });\n}\n\nfunction errorSummary(error: unknown): HostErrorSummary | undefined {\n if (\n error === null ||\n typeof error !== 'object' ||\n typeof (error as { code?: unknown }).code !== 'string' ||\n typeof (error as { expected?: unknown }).expected !== 'string' ||\n typeof (error as { hint?: unknown }).hint !== 'string'\n )\n return undefined;\n const detail = (error as { readonly detail?: unknown }).detail;\n return {\n code: (error as { readonly code: string }).code,\n expected: (error as { readonly expected: string }).expected,\n hint: (error as { readonly hint: string }).hint,\n detail:\n detail !== null && typeof detail === 'object'\n ? (detail as Readonly<Record<string, unknown>>)\n : { reason: String(detail ?? 'unknown failure') },\n };\n}\n\nasync function fetchInitialAssembly(\n options: FrontendHostOptions,\n realm: PluginRealm,\n): Promise<HostAssembly> {\n // An explicit assembly is an intentional bootstrap snapshot. DevKit uses\n // it to stage provider-only entries on reconnect before installing the\n // GameHost service; the transport still supplies the authoritative full\n // assembly immediately afterwards.\n if (options.assembly !== undefined) return options.assembly;\n if (options.transport !== undefined)\n return options.transport.request<undefined, HostAssembly>(HOST_ASSEMBLY_SERVICE, undefined);\n if (\n options.entries !== undefined ||\n options.catalog !== undefined ||\n options.config !== undefined\n )\n return staticAssembly(options, realm);\n throw new HostAssemblyError(\n 'host-assembly-service-unavailable',\n 'a static assembly or backend transport to be provided',\n 'Pass the frozen assembly for a static player or connect the frontend host to a backend host.',\n { service: HOST_ASSEMBLY_SERVICE },\n );\n}\n\nfunction readiness(loader: CatalogLoader): readonly HostActivationEntry[] {\n return inspectCatalogPlugins(loader).live.map((entry) => ({\n entryId: entry.entryId,\n fiberState: entry.fiberState,\n ...(entry.failure === undefined\n ? {}\n : {\n failure: {\n code: entry.failure.code,\n expected: entry.failure.expected,\n hint: entry.failure.hint,\n detail: entry.failure.detail,\n },\n }),\n }));\n}\n\nfunction assertReady(entries: readonly HostActivationEntry[]): void {\n const failed = entries.find(\n (entry) => entry.fiberState !== 'active' && entry.fiberState !== 'disabled',\n );\n if (failed === undefined) return;\n throw new HostAssemblyError(\n 'host-assembly-not-ready',\n `Entry ${failed.entryId} to reach active or disabled Fiber state`,\n 'Inspect the Entry failure or waiting dependency and repair the frontend package graph.',\n {\n entryId: failed.entryId,\n fiberState: failed.fiberState,\n ...(failed.failure === undefined ? {} : { failure: failed.failure }),\n },\n );\n}\n\n/** Start one independent browser-side manager and its native Cordis Loader. */\nexport async function createFrontendHost(options: FrontendHostOptions = {}): Promise<FrontendHost> {\n const realm = options.realm ?? 'engine';\n const initial = await fetchInitialAssembly(options, realm);\n const context = options.context ?? new Context();\n const ownedContext = options.context === undefined;\n const checked = validateHostAssembly(initial);\n if (!checked.ok) throw checked.error;\n let current = checked.value;\n let status: FrontendHostStatus = {\n state: 'created',\n revision: current.revision,\n };\n const state: FrontendAssemblyState = {\n get current() {\n return current;\n },\n get status() {\n return status;\n },\n };\n const startupFibers: Fiber[] = [];\n let foundationFiber: Fiber | undefined;\n let loaderFiber: Fiber | undefined;\n let loader: CatalogLoader | undefined;\n let disposed = false;\n let removeTransportDisconnect: (() => void) | undefined;\n const report = async (next: FrontendHostStatus): Promise<void> => {\n status = next;\n await options.reportStatus?.(next);\n if (options.transport !== undefined) {\n const report: {\n state: HostActivationReport['state'];\n revision: string;\n entries?: readonly HostActivationEntry[];\n error?: HostErrorSummary;\n } = {\n state: next.state,\n revision: next.revision,\n };\n if (next.entries !== undefined) report.entries = next.entries;\n const failure = errorSummary(next.error);\n if (failure !== undefined) report.error = failure;\n try {\n await options.transport.request(HOST_ACTIVATION_REPORT_SERVICE, report);\n } catch (error) {\n const failed: FrontendHostStatus = {\n ...next,\n state: next.state === 'active' ? 'failed' : next.state,\n error,\n };\n status = failed;\n await options.reportStatus?.(failed);\n throw error;\n }\n }\n };\n if (options.transport !== undefined) {\n removeTransportDisconnect = options.transport.onDisconnect((error) => {\n if (disposed) return;\n const failed: FrontendHostStatus = {\n state: 'failed',\n revision: current.revision,\n error,\n };\n status = failed;\n void Promise.resolve(options.reportStatus?.(failed)).catch(() => {});\n });\n }\n\n try {\n foundationFiber = await context.plugin(hostFoundationPlugin(state, options.transport));\n for (const plugin of options.startupPlugins ?? [])\n startupFibers.push(await context.plugin(plugin));\n if (options.autoActivate !== false) {\n // Activation is performed below through the returned host so its status\n // callback and failure rollback cover the first assembly as well.\n const host = {\n context,\n ...(options.transport === undefined ? {} : { transport: options.transport }),\n assembly: state,\n ...(ownedContext ? { ownedContext: true } : { ownedContext: false }),\n get status() {\n return status;\n },\n activate: async (_next?: HostAssembly) => {},\n update: async (_next: HostAssembly) => {},\n dispose: async () => {},\n } as FrontendHost;\n await activateFrontendHost(\n host,\n initial,\n options,\n realm,\n () => loader,\n (value) => {\n loader = value.loader;\n loaderFiber = value.fiber;\n },\n report,\n () => {\n current = initial;\n },\n );\n }\n } catch (error) {\n removeTransportDisconnect?.();\n await loaderFiber?.dispose();\n for (const fiber of startupFibers.reverse()) await fiber.dispose();\n await foundationFiber?.dispose();\n if (ownedContext) await context.fiber.dispose();\n throw error;\n }\n\n const host: FrontendHost = {\n context,\n ...(loader === undefined ? {} : { loader }),\n ...(options.transport === undefined ? {} : { transport: options.transport }),\n assembly: state,\n ownedContext,\n get status() {\n return status;\n },\n async activate(next = current) {\n await activateFrontendHost(\n host,\n next,\n options,\n realm,\n () => loader,\n (value) => {\n loader = value.loader;\n loaderFiber = value.fiber;\n (host as { loader?: CatalogLoader }).loader = value.loader;\n },\n report,\n () => {\n current = next;\n },\n );\n },\n async update(next) {\n await host.activate(next);\n },\n async dispose() {\n if (disposed) return;\n disposed = true;\n removeTransportDisconnect?.();\n await loaderFiber?.dispose();\n for (const fiber of startupFibers.reverse()) await fiber.dispose();\n await foundationFiber?.dispose();\n if (ownedContext) await context.fiber.dispose();\n status = { state: 'disposed', revision: current.revision };\n },\n };\n return host;\n}\n\nasync function activateFrontendHost(\n host: FrontendHost,\n next: HostAssembly,\n options: FrontendHostOptions,\n realm: PluginRealm,\n getLoader: () => CatalogLoader | undefined,\n setLoader: (value: { loader: CatalogLoader; fiber: Fiber }) => void,\n report: (status: FrontendHostStatus) => Promise<void>,\n commit: () => void,\n): Promise<void> {\n if (host.status.state === 'disposed') {\n throw new HostAssemblyError(\n 'host-assembly-service-unavailable',\n 'frontend host to remain active while activating an assembly',\n 'Create a new frontend host for the next browser connection.',\n { service: 'host-assembly' },\n );\n }\n const checked = validateHostAssembly(next);\n if (!checked.ok) {\n await report({ state: 'failed', revision: next.revision, error: checked.error });\n throw checked.error;\n }\n const activeLoader = getLoader();\n try {\n if (activeLoader !== undefined)\n assertModuleReloadBoundary(host.assembly.current, checked.value);\n await report({ state: 'loading', revision: next.revision });\n assertModuleVersions(checked.value, options.moduleVersions);\n let loader = activeLoader;\n if (loader === undefined) {\n const catalog = catalogForAssembly(checked.value, options.catalog);\n const installed = await installCatalogLoader(host.context, catalog, realm);\n loader = installed.loader;\n setLoader(installed);\n }\n const entries = projectPluginEntries(checked.value.entries, realm, realm);\n await loader.root.update(entries);\n await loader.await();\n const actualEntries = readiness(loader);\n assertReady(actualEntries);\n commit();\n await report({ state: 'active', revision: checked.value.revision, entries: actualEntries });\n } catch (error) {\n if (error instanceof HostAssemblyError && error.code === 'host-assembly-reload-required') {\n // The old Loader and its active Fibers are still authoritative. Do not\n // publish a failed status for the candidate revision or disguise a\n // required page reload as an in-place activation failure.\n throw error;\n }\n const activeLoader = getLoader();\n const actualEntries = activeLoader === undefined ? undefined : readiness(activeLoader);\n await report({\n state: 'failed',\n revision: next.revision,\n ...(actualEntries === undefined ? {} : { entries: actualEntries }),\n error,\n });\n throw error;\n }\n}\n\nexport { HostAssemblyError };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/protocol.ts","../src/startup.ts","../src/transport.ts","../src/backend.ts","../src/frontend.ts"],"names":["removeError","Context","hostFoundationPlugin","report","host","projectPluginEntries","activeLoader"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { EntryOptions } from '@deepseek-ai/cordis-plugin-loader';\nimport type {\n GamePluginEntry,\n PluginCatalog,\n PluginCatalogRecord,\n PluginRealm,\n} from '@forgeax/engine-plugin/loader';\n\ndeclare module '@forgeax/engine-plugin' {\n interface EngineContextServices {\n hostAssembly:\n | import('./backend.js').BackendAssemblyAuthority\n | import('./frontend.js').FrontendAssemblyState;\n hostTransport:\n | import('./transport.js').HostTransportServer\n | import('./transport.js').HostTransportClient;\n }\n}\n\n/** Wire version for the backend-derived browser assembly. */\nexport const HOST_ASSEMBLY_SCHEMA_VERSION = 1 as const;\n\nexport type HostAssemblySchemaVersion = typeof HOST_ASSEMBLY_SCHEMA_VERSION;\n\nexport interface HostModuleDescriptor {\n /** The exact module name used by a Cordis Entry. */\n readonly name: string;\n /** Physical ForgeaX realm expected by the CatalogLoader. */\n readonly realm: PluginRealm;\n /** Code identity. The backend and browser must agree on this value. */\n readonly version: string;\n /** Optional content identity for a static or generated catalog. */\n readonly digest?: string;\n /** URL used by a live browser host. Static builds omit it and use a Catalog. */\n readonly url?: string;\n}\n\n/** One package's explicitly paired backend/frontend Entry projections. */\nexport interface HostPluginPair {\n readonly id: string;\n readonly backend?: HostPluginEndpoint;\n readonly frontend?: HostPluginEndpoint;\n}\n\nexport interface HostPluginEndpoint {\n readonly entry: GamePluginEntry;\n readonly module: HostModuleDescriptor;\n}\n\n/** Safe identity projection; backend Entry configuration never crosses the wire. */\nexport interface HostAssemblyPair {\n readonly id: string;\n readonly entryId: string;\n readonly module: HostModuleDescriptor;\n}\n\n/**\n * A serializable projection of the entries that a frontend may activate.\n * `EntryOptions` is intentionally retained so nested Groups and repeated Entry\n * instances keep native Loader identity and reconciliation semantics.\n */\nexport interface HostAssembly {\n readonly schemaVersion: HostAssemblySchemaVersion;\n /** Digest of entries, modules and explicitly projected configuration. */\n readonly revision: string;\n readonly entries: readonly GamePluginEntry[];\n readonly modules: readonly HostModuleDescriptor[];\n readonly pairs: readonly HostAssemblyPair[];\n /** Safe, frontend-visible configuration only. */\n readonly config?: unknown;\n}\n\nexport interface HostAssemblyInput {\n /** Backend Entries are local authority and are never serialized. */\n readonly backendEntries?: readonly GamePluginEntry[];\n readonly entries?: readonly GamePluginEntry[];\n readonly modules?: readonly HostModuleDescriptor[];\n readonly pairs?: readonly HostPluginPair[];\n readonly config?: unknown;\n}\n\nexport interface HostActivationEntry {\n readonly entryId: string;\n readonly fiberState: string;\n readonly failure?: HostErrorSummary;\n}\n\nexport interface HostErrorSummary {\n readonly code: string;\n readonly expected: string;\n readonly hint: string;\n readonly detail: Readonly<Record<string, unknown>>;\n}\n\nexport interface HostActivationReport {\n readonly state: 'created' | 'loading' | 'active' | 'failed' | 'disposed';\n readonly revision: string;\n readonly entries?: readonly HostActivationEntry[];\n readonly error?: HostErrorSummary;\n}\n\nexport interface HostAssemblyErrorDetailByCode {\n 'host-assembly-invalid': { readonly reason: string };\n 'host-assembly-revision-mismatch': { readonly actual: string; readonly expected: string };\n 'host-assembly-module-missing': { readonly name: string };\n 'host-assembly-module-version-mismatch': {\n readonly name: string;\n readonly actual: string;\n readonly expected: string;\n };\n 'host-assembly-reload-required': {\n readonly module: string;\n readonly actual: string;\n readonly expected: string;\n };\n 'host-assembly-service-unavailable': { readonly service: string };\n 'host-assembly-stale-request': { readonly service: string; readonly generation: number };\n 'host-assembly-request-aborted': { readonly service: string };\n 'host-transport-failure': {\n readonly service: string;\n readonly reason: string;\n /** Business error code received from a remote host service, if any. */\n readonly remoteCode?: string;\n };\n 'host-assembly-not-ready': {\n readonly entryId: string;\n readonly fiberState: string;\n readonly failure?: HostErrorSummary;\n };\n}\n\nexport type HostAssemblyErrorCode = keyof HostAssemblyErrorDetailByCode;\n\nexport class HostAssemblyError<\n C extends HostAssemblyErrorCode = HostAssemblyErrorCode,\n> extends Error {\n readonly code: C;\n readonly expected: string;\n readonly hint: string;\n readonly detail: HostAssemblyErrorDetailByCode[C];\n\n constructor(code: C, expected: string, hint: string, detail: HostAssemblyErrorDetailByCode[C]) {\n super(`${code}: ${expected}`);\n this.name = 'HostAssemblyError';\n this.code = code;\n this.expected = expected;\n this.hint = hint;\n this.detail = detail;\n }\n}\n\n/**\n * Prove that the code selected by a local Catalog is the code named by an\n * assembly descriptor. An optional digest is still checked whenever either\n * side supplies one; an unrelated digest must never stand in for a version.\n */\nexport function assertHostModuleCatalogIdentity(\n module: HostModuleDescriptor,\n record: PluginCatalogRecord,\n): void {\n if (record.version !== undefined && record.version !== module.version) {\n throw new HostAssemblyError(\n 'host-assembly-module-version-mismatch',\n `module ${module.name} to load catalog version ${module.version}`,\n 'Regenerate the static Catalog from the same backend package revision.',\n { name: module.name, actual: record.version, expected: module.version },\n );\n }\n if (\n record.digest !== undefined &&\n module.digest !== undefined &&\n record.digest !== module.digest\n ) {\n throw new HostAssemblyError(\n 'host-assembly-module-version-mismatch',\n `module ${module.name} to load catalog digest ${module.digest ?? 'none'}`,\n 'Regenerate the static Catalog from the same backend package bytes.',\n { name: module.name, actual: record.digest, expected: module.digest ?? 'none' },\n );\n }\n const versionMatches = record.version !== undefined && record.version === module.version;\n const digestMatches =\n module.digest !== undefined && record.digest !== undefined && record.digest === module.digest;\n const staticWithoutIdentity =\n module.version === 'static' &&\n module.digest === undefined &&\n record.version === undefined &&\n record.digest === undefined;\n if (!versionMatches && !digestMatches && !staticWithoutIdentity) {\n throw new HostAssemblyError(\n 'host-assembly-module-version-mismatch',\n `module ${module.name} to have a matching catalog code identity for ${module.version}`,\n 'Add the generated module version or digest to the static Catalog.',\n {\n name: module.name,\n actual: record.version ?? record.digest ?? 'unknown',\n expected: module.version,\n },\n );\n }\n}\n\nexport interface HostAssemblyResult {\n readonly ok: true;\n readonly value: HostAssembly;\n}\n\nexport interface HostAssemblyFailure {\n readonly ok: false;\n readonly error: HostAssemblyError;\n}\n\nexport type HostAssemblyValidation = HostAssemblyResult | HostAssemblyFailure;\n\n/** JSON-stable projection used for revision identity and diagnostics. */\nexport function canonicalHostJson(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null || typeof value !== 'object') return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonicalHostJson).join(',')}]`;\n return `{${Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => `${JSON.stringify(key)}:${canonicalHostJson(item)}`)\n .join(',')}}`;\n}\n\n/** Small deterministic digest; it is an identity check, not a security hash. */\nexport function hostRevision(value: unknown): string {\n let hash = 2166136261;\n for (const char of canonicalHostJson(value)) {\n hash ^= char.codePointAt(0) ?? 0;\n hash = Math.imul(hash, 16777619);\n }\n return `fnv1a:${(hash >>> 0).toString(16).padStart(8, '0')}`;\n}\n\nfunction cloneEntry(entry: GamePluginEntry): GamePluginEntry {\n const config = entry.group\n ? (entry.config as readonly GamePluginEntry[] | undefined)?.map(cloneEntry)\n : entry.config;\n return {\n id: entry.id,\n name: entry.name,\n ...(config === undefined ? {} : { config }),\n ...(entry.group === undefined ? {} : { group: entry.group }),\n ...(entry.disabled === undefined ? {} : { disabled: entry.disabled }),\n ...(entry.inject === undefined ? {} : { inject: entry.inject }),\n ...(entry.realm === undefined ? {} : { realm: entry.realm }),\n };\n}\n\nfunction projectPairs(pairs: readonly HostPluginPair[]): {\n readonly entries: readonly GamePluginEntry[];\n readonly modules: readonly HostModuleDescriptor[];\n readonly projections: readonly HostAssemblyPair[];\n} {\n const entries: GamePluginEntry[] = [];\n const modules: HostModuleDescriptor[] = [];\n const projections: HostAssemblyPair[] = [];\n for (const pair of pairs) {\n if (\n pair.backend !== undefined &&\n pair.frontend !== undefined &&\n pair.backend.module.version !== pair.frontend.module.version\n ) {\n throw new HostAssemblyError(\n 'host-assembly-module-version-mismatch',\n `paired module ${pair.id} to use one code version on both hosts`,\n 'Resolve backend and frontend package entries from the same locked package revision.',\n {\n name: pair.id,\n actual: pair.backend.module.version,\n expected: pair.frontend.module.version,\n },\n );\n }\n if (pair.frontend === undefined) continue;\n entries.push(pair.frontend.entry);\n modules.push(pair.frontend.module);\n projections.push({\n id: pair.id,\n entryId: pair.frontend.entry.id,\n module: pair.frontend.module,\n });\n }\n return { entries, modules, projections };\n}\n\nfunction assemblyPairsFromInput(input: HostAssemblyInput): {\n readonly entries: readonly GamePluginEntry[];\n readonly modules: readonly HostModuleDescriptor[];\n readonly pairs: readonly HostAssemblyPair[];\n} {\n if (input.pairs !== undefined) {\n const projected = projectPairs(input.pairs);\n return {\n entries: input.entries ?? projected.entries,\n modules: input.modules ?? projected.modules,\n pairs: projected.projections,\n };\n }\n const entries = input.entries ?? [];\n const modules = [...(input.modules ?? [])];\n for (const [index, entry] of entries.entries()) {\n if (modules[index] !== undefined || modules.some((module) => module.name === entry.name))\n continue;\n modules.push({\n name: entry.name,\n realm: entry.realm ?? 'engine',\n version: 'unknown',\n });\n }\n return {\n entries,\n modules,\n pairs: entries.map((entry, index) => ({\n id: entry.id,\n entryId: entry.id,\n module:\n modules[index]?.name === entry.name\n ? modules[index]\n : (modules.find((module) => module.name === entry.name) ?? {\n name: entry.name,\n realm: entry.realm ?? 'engine',\n version: 'unknown',\n }),\n })),\n };\n}\n\n/** Build one disposable assembly projection from effective backend inputs. */\nexport function createHostAssembly(input: HostAssemblyInput): HostAssembly {\n const projected = assemblyPairsFromInput(input);\n const entries = projected.entries.map(cloneEntry);\n const modules = projected.modules.map((module) => ({ ...module }));\n const pairs = projected.pairs.map((pair) => ({ ...pair, module: { ...pair.module } }));\n const identity = {\n schemaVersion: HOST_ASSEMBLY_SCHEMA_VERSION,\n entries,\n modules,\n pairs,\n ...(input.config === undefined ? {} : { config: input.config }),\n };\n return {\n ...identity,\n revision: hostRevision(identity),\n };\n}\n\nfunction validateEntry(entry: EntryOptions, path: string): string | undefined {\n if (entry === null || typeof entry !== 'object') return `${path} must be an Entry object`;\n if (typeof entry.id !== 'string' || entry.id.length === 0) return `${path}.id must be non-empty`;\n if (typeof entry.name !== 'string' || entry.name.length === 0)\n return `${path}.name must be non-empty`;\n if (entry.group === true) {\n if (!Array.isArray(entry.config)) return `${path}.config must be an Entry array for a Group`;\n for (const [index, child] of entry.config.entries()) {\n const reason = validateEntry(child as EntryOptions, `${path}.config[${index}]`);\n if (reason !== undefined) return reason;\n }\n }\n return undefined;\n}\n\n/** Validate a received assembly before touching the native Loader. */\nexport function validateHostAssembly(assembly: HostAssembly): HostAssemblyValidation {\n if (assembly === null || typeof assembly !== 'object') {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly to be an object',\n 'Regenerate the frontend assembly from the active backend authority.',\n { reason: 'assembly is not an object' },\n ),\n };\n }\n if (assembly.schemaVersion !== HOST_ASSEMBLY_SCHEMA_VERSION) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n `assembly schema ${HOST_ASSEMBLY_SCHEMA_VERSION}`,\n 'Regenerate the frontend assembly with the matching Engine host package.',\n { reason: `unsupported schema ${String(assembly.schemaVersion)}` },\n ),\n };\n }\n if (!Array.isArray(assembly.entries) || !Array.isArray(assembly.modules)) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly entries and modules to be arrays',\n 'Regenerate the frontend assembly from the active backend authority.',\n { reason: 'entries or modules is not an array' },\n ),\n };\n }\n if (!Array.isArray(assembly.pairs)) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly pairs to be an array',\n 'Regenerate the assembly from the backend host using the matching host package.',\n { reason: 'pairs is not an array' },\n ),\n };\n }\n const seen = new Set<string>();\n for (const [index, entry] of assembly.entries.entries()) {\n const reason = validateEntry(entry, `entries[${index}]`);\n if (reason !== undefined) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'all assembly entries to be valid native EntryOptions',\n 'Repair the backend Entry projection before publishing it to a browser.',\n { reason },\n ),\n };\n }\n if (seen.has(entry.id)) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly Entry ids to be unique',\n 'Give repeated plugin instances independent stable ids.',\n { reason: `duplicate Entry id ${entry.id}` },\n ),\n };\n }\n seen.add(entry.id);\n }\n const seenModules = new Map<string, HostModuleDescriptor>();\n for (const [index, module] of assembly.modules.entries()) {\n if (\n module === null ||\n typeof module !== 'object' ||\n typeof module.name !== 'string' ||\n typeof module.realm !== 'string' ||\n typeof module.version !== 'string' ||\n module.name.length === 0 ||\n module.version.length === 0 ||\n (module.url !== undefined && typeof module.url !== 'string') ||\n (module.digest !== undefined &&\n (typeof module.digest !== 'string' || module.digest.length === 0))\n ) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'module names and versions to be non-empty',\n 'Regenerate the module projection from the resolved package metadata.',\n { reason: `invalid module at index ${index}` },\n ),\n };\n }\n const previousModule = seenModules.get(module.name);\n if (\n previousModule !== undefined &&\n (previousModule.realm !== module.realm ||\n previousModule.version !== module.version ||\n previousModule.url !== module.url ||\n previousModule.digest !== module.digest)\n ) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly module identity to be consistent for repeated Entries',\n 'Reuse one resolved module identity when a package has multiple Entry instances.',\n { reason: `module ${module.name} has conflicting identities` },\n ),\n };\n }\n seenModules.set(module.name, module);\n }\n const seenPairIds = new Set<string>();\n for (const [index, pair] of assembly.pairs.entries()) {\n const pairModule = pair?.module;\n if (\n pair === null ||\n typeof pair !== 'object' ||\n typeof pair.id !== 'string' ||\n pair.id.length === 0 ||\n typeof pair.entryId !== 'string' ||\n pair.entryId.length === 0 ||\n pairModule === null ||\n pairModule === undefined ||\n typeof pairModule !== 'object' ||\n typeof pairModule.name !== 'string' ||\n typeof pairModule.realm !== 'string' ||\n typeof pairModule.version !== 'string' ||\n pairModule.name.length === 0 ||\n pairModule.version.length === 0 ||\n (pairModule.url !== undefined && typeof pairModule.url !== 'string') ||\n (pairModule.digest !== undefined &&\n (typeof pairModule.digest !== 'string' || pairModule.digest.length === 0))\n ) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly pair identities and modules to be valid',\n 'Regenerate paired frontend entries from the backend package manifest.',\n { reason: `invalid pair at index ${index}` },\n ),\n };\n }\n if (seenPairIds.has(pair.id)) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n 'assembly pair ids to be unique',\n 'Give each paired package instance an independent stable id.',\n { reason: `duplicate pair ${pair.id}` },\n ),\n };\n }\n seenPairIds.add(pair.id);\n if (!assembly.entries.some((entry) => entry.id === pair.entryId)) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n `pair ${pair.id} to reference an assembly Entry`,\n 'Keep paired identity and frontend Entry projection under one backend authority.',\n { reason: `missing frontend Entry ${pair.entryId}` },\n ),\n };\n }\n const module = assembly.modules.find(\n (candidate) =>\n candidate.name === pairModule.name &&\n candidate.realm === pairModule.realm &&\n candidate.version === pairModule.version &&\n candidate.url === pairModule.url &&\n candidate.digest === pairModule.digest,\n );\n if (module === undefined) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-invalid',\n `pair ${pair.id} to reference a resolved frontend module`,\n 'Keep module/code identity in the backend-derived assembly projection.',\n { reason: `missing frontend module ${pairModule.name}` },\n ),\n };\n }\n }\n const expected = hostRevision({\n schemaVersion: assembly.schemaVersion,\n entries: assembly.entries,\n modules: assembly.modules,\n pairs: assembly.pairs,\n ...(assembly.config === undefined ? {} : { config: assembly.config }),\n });\n if (expected !== assembly.revision) {\n return {\n ok: false,\n error: new HostAssemblyError(\n 'host-assembly-revision-mismatch',\n 'assembly revision to match its entries and modules',\n 'Discard the stale response and request the current backend assembly again.',\n { actual: assembly.revision, expected },\n ),\n };\n }\n return { ok: true, value: assembly };\n}\n\n/** Derive a static module descriptor set from an existing native Catalog. */\nexport function modulesFromCatalog(\n catalog: PluginCatalog,\n realm: PluginRealm,\n version = 'static',\n): HostModuleDescriptor[] {\n return [...catalog.entries()]\n .filter(([, record]) => record.realm === realm)\n .map(([name, record]) => ({\n name,\n realm,\n version: record.version ?? version,\n ...(record.digest === undefined ? {} : { digest: record.digest }),\n }));\n}\n","import { Context, type Fiber, type Plugin } from '@forgeax/engine-plugin';\n\n/**\n * The product-neutral host bootstrap. It owns only a Cordis Context and the\n * supplied startup entries; assembly, transport, Project, and App are all\n * ordinary plugins layered above this seam.\n */\nexport interface HostStartupOptions {\n readonly context?: Context;\n readonly startupPlugins?: readonly Plugin[];\n}\n\nexport interface HostStartup {\n readonly context: Context;\n readonly ownedContext: boolean;\n readonly fibers: readonly Fiber[];\n dispose(): Promise<void>;\n}\n\nexport async function createHostStartup(options: HostStartupOptions = {}): Promise<HostStartup> {\n const context = options.context ?? new Context();\n const ownedContext = options.context === undefined;\n const fibers: Fiber[] = [];\n let disposed = false;\n try {\n for (const plugin of options.startupPlugins ?? []) fibers.push(await context.plugin(plugin));\n } catch (error) {\n for (const fiber of fibers.reverse()) await fiber.dispose();\n if (ownedContext) await context.fiber.dispose();\n throw error;\n }\n return {\n context,\n ownedContext,\n fibers,\n async dispose(): Promise<void> {\n if (disposed) return;\n disposed = true;\n for (const fiber of [...fibers].reverse()) await fiber.dispose();\n if (ownedContext) await context.fiber.dispose();\n },\n };\n}\n","import { HostAssemblyError, type HostErrorSummary } from './protocol.js';\n\nexport const HOST_ASSEMBLY_SERVICE = 'host/assembly.get' as const;\nexport const HOST_ACTIVATION_REPORT_SERVICE = 'host/assembly.report' as const;\nexport const HOST_ASSEMBLY_CHANGED_TOPIC = 'host/assembly.changed' as const;\n\nexport interface HostRequestOptions {\n readonly signal?: AbortSignal;\n /** The service generation observed by the caller. */\n readonly generation?: number;\n}\n\nexport interface HostServiceRequest<T = unknown> {\n readonly service: string;\n readonly payload: T;\n readonly generation: number;\n readonly signal: AbortSignal;\n}\n\nexport type HostServiceHandler<TPayload = unknown, TResult = unknown> = (\n request: HostServiceRequest<TPayload>,\n) => Promise<TResult> | TResult;\n\nexport interface HostServiceSnapshot {\n readonly service: string;\n readonly generation: number;\n}\n\nexport interface HostTransportClient {\n readonly connected: boolean;\n readonly generation: number;\n request<TPayload, TResult>(\n service: string,\n payload: TPayload,\n options?: HostRequestOptions,\n ): Promise<TResult>;\n subscribe<T>(topic: string, listener: (payload: T) => void): () => void;\n /** Observe a terminal connection loss without issuing another request. */\n onDisconnect(listener: (error: HostAssemblyError) => void): () => void;\n close(reason?: unknown): void;\n}\n\nexport interface HostTransportServer {\n readonly connectedClients: number;\n register<TPayload, TResult>(\n service: string,\n handler: HostServiceHandler<TPayload, TResult>,\n ): () => void;\n invalidate(service: string): void;\n snapshot(service: string): HostServiceSnapshot | undefined;\n publish<T>(topic: string, payload: T): void;\n connect(): HostTransportClient;\n close(reason?: unknown): void;\n}\n\ninterface ServiceRecord {\n readonly identity: symbol;\n generation: number;\n handler: (request: HostServiceRequest<unknown>) => Promise<unknown> | unknown;\n pending: Set<AbortController>;\n}\n\ninterface ClientState {\n connected: boolean;\n readonly subscriptions: Map<string, Set<(payload: unknown) => void>>;\n readonly pending: Set<AbortController>;\n readonly disconnectListeners: Set<(error: HostAssemblyError) => void>;\n}\n\n/**\n * Create the small typed transport seam used by host plugins.\n *\n * This implementation is deliberately transport-neutral: the same request,\n * subscription, cancellation, and generation semantics can be adapted to a\n * WebSocket or MessagePort without moving business objects across the wire.\n * It is also useful for deterministic host and lifecycle tests.\n */\nexport function createHostTransport(): HostTransportServer {\n const services = new Map<string, ServiceRecord>();\n const generations = new Map<string, number>();\n const clients = new Set<ClientState>();\n let closed = false;\n\n const closeClient = (state: ClientState, reason?: unknown): void => {\n if (!state.connected) return;\n state.connected = false;\n for (const controller of state.pending) controller.abort();\n state.pending.clear();\n for (const callbacks of state.subscriptions.values()) callbacks.clear();\n state.subscriptions.clear();\n clients.delete(state);\n const error = new HostAssemblyError(\n 'host-transport-failure',\n 'the host connection to remain available',\n 'Reconnect the frontend host before issuing another request.',\n { service: 'host/socket', reason: String(reason ?? 'host connection closed') },\n );\n for (const listener of state.disconnectListeners) listener(error);\n state.disconnectListeners.clear();\n };\n\n const server: HostTransportServer = {\n get connectedClients() {\n return clients.size;\n },\n register(service, handler) {\n if (closed) throw new Error('host transport is closed');\n const previous = services.get(service);\n const generation = (generations.get(service) ?? 0) + 1;\n generations.set(service, generation);\n for (const controller of previous?.pending ?? []) controller.abort();\n const identity = Symbol(service);\n services.set(service, {\n identity,\n generation,\n handler: handler as unknown as (\n request: HostServiceRequest<unknown>,\n ) => Promise<unknown> | unknown,\n pending: new Set(),\n });\n return () => {\n const current = services.get(service);\n if (current?.identity !== identity) return;\n for (const controller of current.pending) controller.abort();\n generations.set(service, current.generation + 1);\n services.delete(service);\n };\n },\n invalidate(service) {\n const current = services.get(service);\n if (current === undefined) return;\n for (const controller of current.pending) controller.abort();\n generations.set(service, current.generation + 1);\n services.delete(service);\n },\n snapshot(service) {\n const current = services.get(service);\n return current === undefined ? undefined : { service, generation: current.generation };\n },\n publish(topic, payload) {\n for (const state of clients) {\n for (const listener of state.subscriptions.get(topic) ?? []) listener(payload);\n }\n },\n connect() {\n if (closed) throw new Error('host transport is closed');\n const state: ClientState = {\n connected: true,\n subscriptions: new Map(),\n pending: new Set(),\n disconnectListeners: new Set(),\n };\n clients.add(state);\n const client: HostTransportClient = {\n get connected() {\n return state.connected;\n },\n get generation() {\n let current = 0;\n for (const service of services.values()) current = Math.max(current, service.generation);\n return current;\n },\n async request(service, payload, options = {}) {\n if (!state.connected) {\n throw new HostAssemblyError(\n 'host-assembly-service-unavailable',\n `service ${service} to be available on the current connection`,\n 'Reconnect the frontend host before issuing another request.',\n { service },\n );\n }\n if (options.signal?.aborted) {\n throw new HostAssemblyError(\n 'host-assembly-request-aborted',\n `request ${service} to start with a live AbortSignal`,\n 'Start a fresh request with a live AbortSignal.',\n { service },\n );\n }\n const record = services.get(service);\n if (record === undefined) {\n const invalidatedGeneration = generations.get(service);\n if (\n options.generation !== undefined &&\n invalidatedGeneration !== undefined &&\n options.generation < invalidatedGeneration\n ) {\n throw new HostAssemblyError(\n 'host-assembly-stale-request',\n `request generation ${options.generation} to match the invalidated service ${service}`,\n 'Refresh the client capability after the backend service is enabled again.',\n { service, generation: options.generation },\n );\n }\n throw new HostAssemblyError(\n 'host-assembly-service-unavailable',\n `service ${service} to be registered`,\n 'Wait for the backend plugin to activate before using this capability.',\n { service },\n );\n }\n const generation = options.generation ?? record.generation;\n if (generation !== record.generation) {\n throw new HostAssemblyError(\n 'host-assembly-stale-request',\n `request generation ${generation} to match service ${service}`,\n 'Refresh the client capability and retry only when the owning business contract permits it.',\n { service, generation },\n );\n }\n const controller = new AbortController();\n const abortFromCaller = (): void => controller.abort();\n options.signal?.addEventListener('abort', abortFromCaller, { once: true });\n record.pending.add(controller);\n state.pending.add(controller);\n let removeAbortRequest: (() => void) | undefined;\n try {\n if (controller.signal.aborted) {\n throw new HostAssemblyError(\n 'host-assembly-request-aborted',\n `request ${service} not to be aborted before execution`,\n 'Start a fresh request with a live AbortSignal.',\n { service },\n );\n }\n let abortReject: ((reason: unknown) => void) | undefined;\n const aborted = new Promise<never>((_, reject) => {\n abortReject = reject;\n });\n const abortRequest = (): void => {\n abortReject?.(\n new HostAssemblyError(\n 'host-assembly-request-aborted',\n `request ${service} to finish before its service is closed or invalidated`,\n 'Treat the capability as withdrawn and refresh the service before retrying.',\n { service },\n ),\n );\n };\n controller.signal.addEventListener('abort', abortRequest, { once: true });\n removeAbortRequest = () => controller.signal.removeEventListener('abort', abortRequest);\n const result = await Promise.race([\n Promise.resolve(\n record.handler({\n service,\n payload,\n generation,\n signal: controller.signal,\n }),\n ),\n aborted,\n ]);\n if (controller.signal.aborted) {\n throw new HostAssemblyError(\n 'host-assembly-request-aborted',\n `request ${service} to finish before its service is invalidated`,\n 'Treat the capability as withdrawn and refresh the service before retrying.',\n { service },\n );\n }\n return result as never;\n } finally {\n removeAbortRequest?.();\n record.pending.delete(controller);\n state.pending.delete(controller);\n options.signal?.removeEventListener('abort', abortFromCaller);\n }\n },\n subscribe(topic, listener) {\n if (!state.connected) return () => {};\n const callbacks = state.subscriptions.get(topic) ?? new Set();\n callbacks.add(listener as (payload: unknown) => void);\n state.subscriptions.set(topic, callbacks);\n return () => {\n callbacks.delete(listener as (payload: unknown) => void);\n if (callbacks.size === 0) state.subscriptions.delete(topic);\n };\n },\n onDisconnect(listener) {\n if (!state.connected) {\n listener(\n new HostAssemblyError(\n 'host-transport-failure',\n 'the host connection to remain available',\n 'Reconnect the frontend host before issuing another request.',\n { service: 'host/socket', reason: 'host connection is already closed' },\n ),\n );\n return () => {};\n }\n state.disconnectListeners.add(listener);\n return () => state.disconnectListeners.delete(listener);\n },\n close(reason) {\n closeClient(state, reason);\n },\n };\n return client;\n },\n close(reason) {\n if (closed) return;\n closed = true;\n for (const service of services.values())\n for (const controller of service.pending) controller.abort();\n services.clear();\n for (const client of [...clients]) closeClient(client, reason);\n generations.clear();\n },\n };\n\n return server;\n}\n\n/** Minimal socket shape shared by browser WebSocket and Node `ws` instances. */\nexport interface HostSocketLike {\n readonly readyState?: number;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n addEventListener?(type: string, listener: (...args: unknown[]) => void): void;\n removeEventListener?(type: string, listener: (...args: unknown[]) => void): void;\n on?(type: string, listener: (...args: unknown[]) => void): void;\n off?(type: string, listener: (...args: unknown[]) => void): void;\n}\n\ntype HostWireMessage =\n | {\n readonly kind: 'request';\n readonly id: string;\n readonly service: string;\n readonly payload: unknown;\n readonly generation?: number;\n }\n | { readonly kind: 'cancel'; readonly id: string }\n | { readonly kind: 'subscribe'; readonly topic: string }\n | { readonly kind: 'unsubscribe'; readonly topic: string }\n | {\n readonly kind: 'response';\n readonly id: string;\n readonly ok: boolean;\n readonly value?: unknown;\n readonly error?: HostErrorSummary;\n readonly generation?: number;\n }\n | { readonly kind: 'event'; readonly topic: string; readonly payload: unknown };\n\nfunction addSocketListener(\n socket: HostSocketLike,\n type: string,\n listener: (...args: unknown[]) => void,\n): () => void {\n if (socket.addEventListener !== undefined) {\n socket.addEventListener(type, listener);\n return () => socket.removeEventListener?.(type, listener);\n }\n socket.on?.(type, listener);\n return () => socket.off?.(type, listener);\n}\n\nfunction socketPayload(value: unknown): string | undefined {\n const data = Array.isArray(value) ? value[0] : value;\n if (typeof data === 'string') return data;\n if (data instanceof ArrayBuffer) return new TextDecoder().decode(data);\n if (data instanceof Uint8Array) return new TextDecoder().decode(data);\n if (data !== null && typeof data === 'object' && 'data' in data)\n return socketPayload((data as { readonly data?: unknown }).data);\n return undefined;\n}\n\nfunction parseWire(value: unknown): HostWireMessage | undefined {\n const source = socketPayload(value);\n if (source === undefined) return undefined;\n try {\n const parsed = JSON.parse(source) as unknown;\n return parsed !== null &&\n typeof parsed === 'object' &&\n typeof (parsed as { kind?: unknown }).kind === 'string'\n ? (parsed as HostWireMessage)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction serializeError(service: string, error: unknown): HostErrorSummary {\n if (\n error !== null &&\n typeof error === 'object' &&\n typeof (error as { code?: unknown }).code === 'string' &&\n typeof (error as { expected?: unknown }).expected === 'string' &&\n typeof (error as { hint?: unknown }).hint === 'string'\n ) {\n const detail = (error as { readonly detail?: unknown }).detail;\n return {\n code: (error as { readonly code: string }).code,\n expected: (error as { readonly expected: string }).expected,\n hint: (error as { readonly hint: string }).hint,\n detail:\n detail !== null && typeof detail === 'object'\n ? (detail as Readonly<Record<string, unknown>>)\n : { reason: String(detail ?? 'unknown failure') },\n };\n }\n return {\n code: 'host-transport-failure',\n expected: `service ${service} to complete without an exception`,\n hint: 'Inspect the backend host process and reconnect before retrying.',\n detail: { service, reason: error instanceof Error ? error.message : String(error) },\n };\n}\n\nfunction errorFromSummary(service: string, summary: HostErrorSummary): HostAssemblyError {\n const detail = summary.detail as Record<string, unknown>;\n const supported = new Set([\n 'host-assembly-invalid',\n 'host-assembly-revision-mismatch',\n 'host-assembly-module-missing',\n 'host-assembly-module-version-mismatch',\n 'host-assembly-reload-required',\n 'host-assembly-service-unavailable',\n 'host-assembly-stale-request',\n 'host-assembly-request-aborted',\n 'host-assembly-not-ready',\n 'host-transport-failure',\n ]);\n if (supported.has(summary.code)) {\n return new HostAssemblyError(\n summary.code as never,\n summary.expected,\n summary.hint,\n detail as never,\n );\n }\n return new HostAssemblyError('host-transport-failure', summary.expected, summary.hint, {\n ...detail,\n service,\n reason: summary.detail.reason ? String(summary.detail.reason) : summary.code,\n remoteCode: summary.code,\n });\n}\n\nfunction transportFailure(service: string, reason: string): HostAssemblyError {\n return new HostAssemblyError(\n 'host-transport-failure',\n `service ${service} to remain connected`,\n 'Reconnect the frontend host and inspect the backend transport diagnostics.',\n { service, reason },\n );\n}\n\nfunction sendWire(socket: HostSocketLike, message: HostWireMessage): void {\n socket.send(JSON.stringify(message));\n}\n\n/** Connect one browser WebSocket (or an already-open Node `ws`) to a host server. */\nexport async function createHostWebSocketClient(\n socket: HostSocketLike,\n): Promise<HostTransportClient> {\n if (socket.readyState !== undefined && socket.readyState !== 1) {\n await new Promise<void>((resolve, reject) => {\n const removeOpen = addSocketListener(socket, 'open', () => {\n removeOpen();\n removeError();\n resolve();\n });\n const removeError = addSocketListener(socket, 'error', (cause) => {\n removeOpen();\n removeError();\n reject(transportFailure('host/connect', String(cause ?? 'socket error')));\n });\n });\n }\n const pending = new Map<\n string,\n {\n readonly resolve: (value: unknown) => void;\n readonly reject: (reason: unknown) => void;\n readonly cleanup: () => void;\n }\n >();\n const subscriptions = new Map<string, Set<(payload: unknown) => void>>();\n const disconnectListeners = new Set<(error: HostAssemblyError) => void>();\n let connected = true;\n let generation = 0;\n let sequence = 0;\n const disconnectError = (reason: unknown): HostAssemblyError =>\n transportFailure('host/socket', reason instanceof Error ? reason.message : String(reason));\n const failPending = (reason: unknown): void => {\n if (!connected) return;\n connected = false;\n for (const request of pending.values()) {\n request.cleanup();\n request.reject(reason);\n }\n pending.clear();\n subscriptions.clear();\n const error = disconnectError(reason);\n for (const listener of disconnectListeners) listener(error);\n disconnectListeners.clear();\n };\n const removeMessage = addSocketListener(socket, 'message', (event) => {\n const message = parseWire(event);\n if (message === undefined) return;\n if (message.kind === 'event') {\n for (const listener of subscriptions.get(message.topic) ?? []) listener(message.payload);\n return;\n }\n if (message.kind !== 'response') return;\n if (message.generation !== undefined) generation = Math.max(generation, message.generation);\n const request = pending.get(message.id);\n if (request === undefined) return;\n pending.delete(message.id);\n request.cleanup();\n if (message.ok) request.resolve(message.value);\n else\n request.reject(\n errorFromSummary(\n 'host/socket',\n message.error ?? serializeError('host/socket', 'unknown response failure'),\n ),\n );\n });\n const removeClose = addSocketListener(socket, 'close', (reason) => {\n removeMessage();\n removeClose();\n removeError();\n failPending(disconnectError(reason));\n });\n const removeError = addSocketListener(socket, 'error', (reason) => {\n failPending(disconnectError(reason));\n });\n const client: HostTransportClient = {\n get connected() {\n return connected;\n },\n get generation() {\n return generation;\n },\n request<TPayload, TResult>(\n service: string,\n payload: TPayload,\n options: HostRequestOptions = {},\n ): Promise<TResult> {\n if (!connected) return Promise.reject(disconnectError('socket is closed'));\n if (options.signal?.aborted)\n return Promise.reject(\n new HostAssemblyError(\n 'host-assembly-request-aborted',\n `request ${service} to start with a live AbortSignal`,\n 'Start a fresh request with a live AbortSignal.',\n { service },\n ),\n );\n sequence += 1;\n const id = `${Date.now().toString(36)}-${sequence.toString(36)}`;\n return new Promise<TResult>((resolve, reject) => {\n const abort = (): void => {\n const request = pending.get(id);\n if (request === undefined) return;\n pending.delete(id);\n request.cleanup();\n try {\n sendWire(socket, { kind: 'cancel', id });\n } catch {\n // The close/error listener reports the transport failure separately.\n }\n reject(\n new HostAssemblyError(\n 'host-assembly-request-aborted',\n `request ${service} to finish before cancellation`,\n 'Start a fresh request with a live AbortSignal.',\n { service },\n ),\n );\n };\n const cleanup = (): void => options.signal?.removeEventListener('abort', abort);\n pending.set(id, {\n resolve: resolve as unknown as (value: unknown) => void,\n reject,\n cleanup,\n });\n options.signal?.addEventListener('abort', abort, { once: true });\n if (options.signal?.aborted) {\n abort();\n return;\n }\n try {\n sendWire(socket, {\n kind: 'request',\n id,\n service,\n payload,\n ...(options.generation === undefined ? {} : { generation: options.generation }),\n });\n } catch (cause) {\n const request = pending.get(id);\n request?.cleanup();\n pending.delete(id);\n reject(disconnectError(cause));\n }\n });\n },\n subscribe(topic, listener) {\n if (!connected) return () => {};\n const listeners = subscriptions.get(topic) ?? new Set();\n listeners.add(listener as (payload: unknown) => void);\n subscriptions.set(topic, listeners);\n sendWire(socket, { kind: 'subscribe', topic });\n return () => {\n listeners.delete(listener as (payload: unknown) => void);\n if (listeners.size !== 0) return;\n subscriptions.delete(topic);\n sendWire(socket, { kind: 'unsubscribe', topic });\n };\n },\n onDisconnect(listener) {\n if (!connected) {\n listener(disconnectError('socket is already closed'));\n return () => {};\n }\n disconnectListeners.add(listener);\n return () => disconnectListeners.delete(listener);\n },\n close(reason) {\n if (!connected) return;\n failPending(disconnectError(reason ?? 'client closed the host connection'));\n removeMessage();\n removeClose();\n removeError();\n socket.close();\n },\n };\n return client;\n}\n\n/** Open a browser-native WebSocket and install the typed host client. */\nexport async function connectHostWebSocket(url: string): Promise<HostTransportClient> {\n const Constructor = globalThis.WebSocket;\n if (typeof Constructor !== 'function')\n throw transportFailure('host/connect', 'the current runtime does not provide WebSocket');\n return createHostWebSocketClient(new Constructor(url) as unknown as HostSocketLike);\n}\n\n/** Attach one accepted process-side socket to an Engine host transport server. */\nexport function attachHostWebSocketServer(\n socket: HostSocketLike,\n server: HostTransportServer,\n): () => void {\n const client = server.connect();\n const pending = new Map<string, AbortController>();\n const subscriptions = new Map<string, () => void>();\n let disposed = false;\n const removeMessage = addSocketListener(socket, 'message', (event) => {\n const message = parseWire(event);\n if (message === undefined || disposed) return;\n if (message.kind === 'cancel') {\n pending.get(message.id)?.abort();\n return;\n }\n if (message.kind === 'subscribe') {\n subscriptions.get(message.topic)?.();\n subscriptions.set(\n message.topic,\n client.subscribe(message.topic, (payload) => {\n if (!disposed) sendWire(socket, { kind: 'event', topic: message.topic, payload });\n }),\n );\n return;\n }\n if (message.kind === 'unsubscribe') {\n subscriptions.get(message.topic)?.();\n subscriptions.delete(message.topic);\n return;\n }\n if (message.kind !== 'request') return;\n const controller = new AbortController();\n pending.set(message.id, controller);\n void client\n .request(message.service, message.payload, {\n signal: controller.signal,\n ...(message.generation === undefined ? {} : { generation: message.generation }),\n })\n .then((value) => {\n if (!disposed)\n sendWire(socket, {\n kind: 'response',\n id: message.id,\n ok: true,\n value,\n generation: client.generation,\n });\n })\n .catch((error) => {\n if (!disposed)\n sendWire(socket, {\n kind: 'response',\n id: message.id,\n ok: false,\n error: serializeError(message.service, error),\n generation: client.generation,\n });\n })\n .finally(() => pending.delete(message.id));\n });\n const removeClose = addSocketListener(socket, 'close', () => dispose());\n const removeError = addSocketListener(socket, 'error', () => dispose());\n function dispose(): void {\n if (disposed) return;\n disposed = true;\n removeMessage();\n removeClose();\n removeError();\n for (const controller of pending.values()) controller.abort();\n pending.clear();\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n client.close('host socket disconnected');\n }\n return dispose;\n}\n","import { Context, type Fiber, type Plugin } from '@forgeax/engine-plugin';\nimport {\n bootstrapCatalogLoader,\n type CatalogLoader,\n type CatalogLoaderBootstrapResult,\n type GamePluginEntry,\n type PluginCatalog,\n type PluginRealm,\n projectPluginEntries,\n} from '@forgeax/engine-plugin/loader';\nimport {\n assertHostModuleCatalogIdentity,\n createHostAssembly,\n type HostActivationReport,\n type HostAssembly,\n HostAssemblyError,\n type HostAssemblyInput,\n type HostModuleDescriptor,\n type HostPluginPair,\n modulesFromCatalog,\n validateHostAssembly,\n} from './protocol.js';\nimport { createHostStartup, type HostStartup } from './startup.js';\nimport {\n createHostTransport,\n HOST_ACTIVATION_REPORT_SERVICE,\n HOST_ASSEMBLY_CHANGED_TOPIC,\n HOST_ASSEMBLY_SERVICE,\n type HostTransportServer,\n} from './transport.js';\n\nexport interface BackendAssemblyAuthority {\n readonly current: HostAssembly;\n readonly generation: number;\n subscribe(listener: (assembly: HostAssembly) => void): () => void;\n}\n\nexport interface BackendHostOptions {\n /** Existing domain context may be supplied when App/ECS owns the root. */\n readonly context?: Context;\n /** Always-loaded bootstrap capabilities. Their effects remain Cordis-owned. */\n readonly startupPlugins?: readonly Plugin[];\n /** Optional native Catalog used to activate backend Entries. */\n readonly catalog?: PluginCatalog;\n readonly realm?: PluginRealm;\n readonly entries?: readonly GamePluginEntry[];\n /** Paired backend/frontend identities. Backend Entries are activated locally. */\n readonly pairs?: readonly HostPluginPair[];\n readonly assembly?: HostAssembly;\n readonly modules?: readonly HostModuleDescriptor[];\n readonly config?: unknown;\n readonly transport?: HostTransportServer;\n readonly onActivationReport?: (report: HostActivationReport) => void | Promise<void>;\n}\n\nexport interface BackendHost {\n readonly context: Context;\n readonly loader?: CatalogLoader;\n readonly assembly: BackendAssemblyAuthority;\n readonly transport: HostTransportServer;\n readonly ownedContext: boolean;\n /** Reconcile backend Entries and publish the matching frontend assembly atomically. */\n update(\n input: HostAssemblyInput | readonly GamePluginEntry[],\n /** Replace the one admitted bootstrap revision for staged frontend reconnects. */\n options?: { readonly bootstrap?: boolean },\n ): Promise<HostAssembly>;\n /** Observe accepted reports without replacing the owning host's callback. */\n subscribeActivationReports(\n listener: (report: HostActivationReport) => void | Promise<void>,\n ): () => void;\n dispose(): Promise<void>;\n}\n\nfunction effectiveAssemblyInput(\n current: HostAssembly,\n input: HostAssemblyInput,\n): HostAssemblyInput {\n const preservePairs =\n input.pairs === undefined && input.entries === undefined && input.modules === undefined;\n const entriesById = new Map(current.entries.map((entry) => [entry.id, entry]));\n const modulesByName = new Map(current.modules.map((module) => [module.name, module]));\n const pairs = current.pairs.flatMap((pair) => {\n const entry = entriesById.get(pair.entryId);\n const module = modulesByName.get(pair.module.name);\n return entry === undefined || module === undefined\n ? []\n : [{ id: pair.id, frontend: { entry, module } }];\n });\n return {\n entries: input.entries ?? current.entries,\n modules: input.modules ?? current.modules,\n ...(input.pairs !== undefined ? { pairs: input.pairs } : preservePairs ? { pairs } : {}),\n ...(input.config === undefined\n ? current.config === undefined\n ? {}\n : { config: current.config }\n : { config: input.config }),\n ...(input.backendEntries === undefined ? {} : { backendEntries: input.backendEntries }),\n };\n}\n\nfunction authorityOf(initial: HostAssembly): {\n readonly authority: BackendAssemblyAuthority;\n readonly publish: (input: HostAssemblyInput) => HostAssembly;\n} {\n let current = initial;\n let generation = 1;\n const listeners = new Set<(assembly: HostAssembly) => void>();\n const authority: BackendAssemblyAuthority = {\n get current() {\n return current;\n },\n get generation() {\n return generation;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n return {\n authority,\n publish(input) {\n const next = createHostAssembly(input);\n const checked = validateHostAssembly(next);\n if (!checked.ok) throw checked.error;\n current = checked.value;\n generation += 1;\n for (const listener of listeners) listener(current);\n return current;\n },\n };\n}\n\nfunction hostFoundationPlugin(\n assembly: BackendAssemblyAuthority,\n transport: HostTransportServer,\n): Plugin {\n return {\n name: 'forgeax:backend-host-foundation',\n provide: ['hostAssembly', 'hostTransport'],\n apply(ctx) {\n ctx.provide('hostAssembly', assembly);\n ctx.provide('hostTransport', transport);\n },\n };\n}\n\nfunction assertBackendCatalogIdentity(\n catalog: PluginCatalog | undefined,\n modules: readonly HostModuleDescriptor[],\n): void {\n if (catalog === undefined) return;\n for (const module of modules) {\n const record = catalog.get(module.name);\n if (record !== undefined) assertHostModuleCatalogIdentity(module, record);\n }\n}\n\n/**\n * Start the backend side of the generic Engine host.\n *\n * The function only creates the Cordis root and loads declared bootstrap and\n * Catalog entries. Project, App, World and game policy arrive as plugins.\n */\nexport async function createBackendHost(options: BackendHostOptions = {}): Promise<BackendHost> {\n const context = options.context ?? new Context();\n const realm = options.realm ?? 'engine';\n const catalog = options.catalog;\n const pairedBackendEntries =\n options.pairs?.flatMap((pair) => (pair.backend === undefined ? [] : [pair.backend.entry])) ??\n [];\n const entries =\n options.entries ??\n options.assembly?.entries ??\n options.pairs?.flatMap((pair) => (pair.frontend === undefined ? [] : [pair.frontend.entry])) ??\n [];\n const modules =\n options.modules ??\n options.assembly?.modules ??\n (options.pairs === undefined\n ? catalog === undefined\n ? []\n : modulesFromCatalog(catalog, realm)\n : options.pairs.flatMap((pair) =>\n pair.frontend === undefined ? [] : [pair.frontend.module],\n ));\n const initialAssembly =\n options.assembly ??\n createHostAssembly({\n entries,\n modules,\n ...(options.pairs === undefined ? {} : { pairs: options.pairs }),\n ...(options.config === undefined ? {} : { config: options.config }),\n });\n const checkedInitial = validateHostAssembly(initialAssembly);\n if (!checkedInitial.ok) {\n if (options.context === undefined) await context.fiber.dispose();\n throw checkedInitial.error;\n }\n const backendModules =\n options.pairs === undefined\n ? modules\n : options.pairs.flatMap((pair) => (pair.backend === undefined ? [] : [pair.backend.module]));\n assertBackendCatalogIdentity(catalog, backendModules);\n const authority = authorityOf(checkedInitial.value);\n const assembly = authority.authority;\n // A DevKit frontend may intentionally reconnect against the provider-only\n // snapshot that bootstrapped this host, while the authority already points\n // at the promoted full assembly from an earlier client. Keep that one\n // staged revision valid for activation reports; all other revisions must\n // still match the current authority exactly.\n let bootstrapRevision = checkedInitial.value.revision;\n const activationListeners = new Set<(report: HostActivationReport) => void | Promise<void>>();\n const transport = options.transport ?? createHostTransport();\n let startup: HostStartup | undefined;\n let loaderFiber: Fiber | undefined;\n let loader: CatalogLoader | undefined;\n let backendEntries =\n options.pairs === undefined\n ? (options.entries ?? options.assembly?.entries ?? [])\n : pairedBackendEntries;\n let unregisterAssemblyService: (() => void) | undefined;\n let unregisterActivationService: (() => void) | undefined;\n let unsubscribeAssembly: (() => void) | undefined;\n try {\n startup = await createHostStartup({\n context,\n startupPlugins: [\n hostFoundationPlugin(assembly, transport),\n ...(options.startupPlugins ?? []),\n ],\n });\n if (catalog !== undefined) {\n const bootstrapped = await bootstrapCatalogLoader(context, catalog, realm, {\n catalogDigest: checkedInitial.value.revision,\n supportedRealms: [realm],\n });\n if (!bootstrapped.ok) throw bootstrapped.error;\n loaderFiber = bootstrapped.value.fiber;\n loader = bootstrapped.value.loader;\n if (backendEntries.length > 0) {\n await loader.root.update(projectPluginEntries(backendEntries, realm, realm));\n await loader.await();\n }\n }\n unregisterAssemblyService = transport.register(HOST_ASSEMBLY_SERVICE, () => assembly.current);\n unregisterActivationService = transport.register(\n HOST_ACTIVATION_REPORT_SERVICE,\n async ({ payload }) => {\n const report = payload as HostActivationReport;\n if (\n report.revision !== assembly.current.revision &&\n report.revision !== bootstrapRevision\n ) {\n throw new HostAssemblyError(\n 'host-assembly-revision-mismatch',\n `activation report revision ${report.revision} to match ${assembly.current.revision}`,\n 'Discard the stale frontend report and fetch the current backend assembly.',\n { actual: report.revision, expected: assembly.current.revision },\n );\n }\n await options.onActivationReport?.(report);\n for (const listener of activationListeners) await listener(report);\n return { accepted: true };\n },\n );\n unsubscribeAssembly = assembly.subscribe((next) => {\n transport.publish(HOST_ASSEMBLY_CHANGED_TOPIC, next);\n });\n } catch (error) {\n unregisterActivationService?.();\n unregisterAssemblyService?.();\n unsubscribeAssembly?.();\n await loaderFiber?.dispose();\n await startup?.dispose();\n throw error;\n }\n\n let disposed = false;\n const host: BackendHost = {\n context,\n ...(loader === undefined ? {} : { loader }),\n assembly,\n transport,\n ownedContext: options.context === undefined,\n subscribeActivationReports(listener) {\n if (disposed) {\n throw new HostAssemblyError(\n 'host-assembly-service-unavailable',\n 'the backend host to remain active while observing activation reports',\n 'Subscribe on an active host instance.',\n { service: HOST_ACTIVATION_REPORT_SERVICE },\n );\n }\n activationListeners.add(listener);\n return () => {\n activationListeners.delete(listener);\n };\n },\n async update(nextInput, updateOptions) {\n if (disposed) {\n throw new HostAssemblyError(\n 'host-assembly-service-unavailable',\n 'backend host to remain active while updating Entries',\n 'Create a new host instance before updating the disposed host.',\n { service: 'host-assembly' },\n );\n }\n const input: HostAssemblyInput = Array.isArray(nextInput)\n ? {\n entries: nextInput as readonly GamePluginEntry[],\n backendEntries: nextInput as readonly GamePluginEntry[],\n }\n : (nextInput as HostAssemblyInput);\n const effectiveInput = effectiveAssemblyInput(assembly.current, input);\n const candidate = createHostAssembly(effectiveInput);\n const checkedCandidate = validateHostAssembly(candidate);\n if (!checkedCandidate.ok) throw checkedCandidate.error;\n const candidateBackendModules =\n input.pairs === undefined\n ? checkedCandidate.value.modules\n : input.pairs.flatMap((pair) =>\n pair.backend === undefined ? [] : [pair.backend.module],\n );\n assertBackendCatalogIdentity(catalog, candidateBackendModules);\n const nextBackendEntries =\n input.backendEntries ??\n (input.pairs === undefined\n ? (input.entries ?? backendEntries)\n : input.pairs.flatMap((pair) =>\n pair.backend === undefined ? [] : [pair.backend.entry],\n ));\n if (loader === undefined && nextBackendEntries.length > 0) {\n throw new HostAssemblyError(\n 'host-assembly-service-unavailable',\n 'a CatalogLoader to be installed before updating Entries',\n 'Provide a backend Catalog when the host owns plugin Entry activation.',\n { service: 'loader' },\n );\n }\n if (loader !== undefined) {\n await loader.root.update(projectPluginEntries(nextBackendEntries, realm, realm));\n await loader.await();\n }\n backendEntries = nextBackendEntries;\n if (updateOptions?.bootstrap === true) bootstrapRevision = checkedCandidate.value.revision;\n return authority.publish(effectiveInput);\n },\n async dispose() {\n if (disposed) return;\n disposed = true;\n activationListeners.clear();\n unsubscribeAssembly?.();\n unregisterActivationService?.();\n unregisterAssemblyService?.();\n transport.close();\n await loaderFiber?.dispose();\n await startup?.dispose();\n },\n };\n return host;\n}\n\nexport type { CatalogLoaderBootstrapResult };\nexport { HostAssemblyError };\n","import { Context, type Fiber, inspectCatalogPlugins, type Plugin } from '@forgeax/engine-plugin';\nimport {\n type CatalogLoader,\n type GamePluginEntry,\n installCatalogLoader,\n type PluginCatalog,\n type PluginCatalogRecord,\n type PluginRealm,\n projectPluginEntries,\n} from '@forgeax/engine-plugin/loader';\nimport {\n assertHostModuleCatalogIdentity,\n createHostAssembly,\n type HostActivationEntry,\n type HostActivationReport,\n type HostAssembly,\n HostAssemblyError,\n type HostErrorSummary,\n modulesFromCatalog,\n validateHostAssembly,\n} from './protocol.js';\nimport { createHostStartup, type HostStartup } from './startup.js';\nimport {\n HOST_ACTIVATION_REPORT_SERVICE,\n HOST_ASSEMBLY_SERVICE,\n type HostTransportClient,\n} from './transport.js';\n\nexport type FrontendHostState = 'created' | 'loading' | 'active' | 'failed' | 'disposed';\n\nexport interface FrontendHostStatus {\n readonly state: FrontendHostState;\n readonly revision: string;\n readonly entries?: readonly HostActivationEntry[];\n readonly error?: unknown;\n}\n\nexport interface FrontendAssemblyState {\n readonly current: HostAssembly;\n readonly status: FrontendHostStatus;\n}\n\nexport interface FrontendHostOptions {\n /** App may provide its existing Engine Context; the host owns only its Fiber. */\n readonly context?: Context;\n readonly startupPlugins?: readonly Plugin[];\n readonly catalog?: PluginCatalog;\n /**\n * Optional local assembly snapshot used for the first staged activation.\n * When a transport is also present, the backend remains authoritative for\n * later updates; this snapshot lets callers activate provider-only entries\n * before their host-owned services are ready.\n */\n readonly assembly?: HostAssembly;\n readonly entries?: readonly GamePluginEntry[];\n readonly realm?: PluginRealm;\n readonly config?: unknown;\n readonly transport?: HostTransportClient;\n readonly moduleVersions?: ReadonlyMap<string, string>;\n readonly reportStatus?: (status: FrontendHostStatus) => void | Promise<void>;\n readonly autoActivate?: boolean;\n}\n\nexport interface FrontendHost {\n readonly context: Context;\n readonly loader?: CatalogLoader;\n readonly assembly: FrontendAssemblyState;\n readonly transport?: HostTransportClient;\n readonly ownedContext: boolean;\n readonly status: FrontendHostStatus;\n activate(assembly?: HostAssembly): Promise<void>;\n update(assembly: HostAssembly): Promise<void>;\n dispose(): Promise<void>;\n}\n\nfunction hostFoundationPlugin(\n assembly: FrontendAssemblyState,\n transport: HostTransportClient | undefined,\n): Plugin {\n return {\n name: 'forgeax:frontend-host-foundation',\n provide: ['hostAssembly', 'hostTransport'],\n apply(ctx) {\n ctx.provide('hostAssembly', assembly);\n if (transport !== undefined) ctx.provide('hostTransport', transport);\n },\n };\n}\n\nfunction dynamicModuleRecord(\n name: string,\n realm: PluginRealm,\n version: string,\n url: string | undefined,\n digest: string | undefined,\n): PluginCatalogRecord {\n if (url === undefined) {\n return {\n realm,\n version,\n ...(digest === undefined ? {} : { digest }),\n load: async () => {\n throw new HostAssemblyError(\n 'host-assembly-module-missing',\n `module ${name} to have a browser URL or static Catalog record`,\n 'Add the module to the frozen Catalog or publish its browser entry from the backend.',\n { name },\n );\n },\n };\n }\n return {\n realm,\n version,\n ...(digest === undefined ? {} : { digest }),\n load: () => import(/* @vite-ignore */ url),\n };\n}\n\nfunction catalogForAssembly(\n assembly: HostAssembly,\n staticCatalog: PluginCatalog | undefined,\n): PluginCatalog {\n const catalog = new Map<string, PluginCatalogRecord>();\n for (const module of assembly.modules) {\n const existing = staticCatalog?.get(module.name);\n if (existing !== undefined) {\n assertHostModuleCatalogIdentity(module, existing);\n catalog.set(module.name, existing);\n continue;\n }\n catalog.set(\n module.name,\n dynamicModuleRecord(module.name, module.realm, module.version, module.url, module.digest),\n );\n }\n for (const [name, record] of staticCatalog ?? []) {\n if (!catalog.has(name)) catalog.set(name, record);\n }\n return catalog;\n}\n\nfunction assertModuleVersions(\n assembly: HostAssembly,\n versions: ReadonlyMap<string, string> | undefined,\n): void {\n if (versions === undefined) return;\n for (const module of assembly.modules) {\n const actual = versions.get(module.name);\n if (actual === undefined || actual === module.version) continue;\n throw new HostAssemblyError(\n 'host-assembly-module-version-mismatch',\n `module ${module.name} to use version ${module.version}`,\n 'Refresh the browser module graph from the same backend assembly revision.',\n { name: module.name, actual, expected: module.version },\n );\n }\n}\n\nfunction moduleIdentity(module: {\n readonly version: string;\n readonly digest?: string;\n readonly url?: string;\n}): string {\n return `${module.version}@${module.digest ?? module.url ?? '<catalog>'}`;\n}\n\n/**\n * The native Loader keeps the imported module graph for its lifetime. A new\n * module URL or code identity therefore cannot be applied by Entry.update;\n * accepting it would report a new assembly while executing the old code.\n */\nfunction assertModuleReloadBoundary(previous: HostAssembly, next: HostAssembly): void {\n const previousModules = new Map(previous.modules.map((module) => [module.name, module]));\n const nextModules = new Map(next.modules.map((module) => [module.name, module]));\n const names = new Set([...previousModules.keys(), ...nextModules.keys()]);\n for (const name of names) {\n const before = previousModules.get(name);\n const after = nextModules.get(name);\n const beforeIdentity = before === undefined ? '<absent>' : moduleIdentity(before);\n const afterIdentity = after === undefined ? '<absent>' : moduleIdentity(after);\n if (\n before === undefined ||\n after === undefined ||\n before.realm !== after.realm ||\n beforeIdentity !== afterIdentity\n ) {\n throw new HostAssemblyError(\n 'host-assembly-reload-required',\n `module ${name} to keep its loaded code identity ${beforeIdentity}`,\n 'Reload the frontend host to install the new module graph before activating this assembly.',\n { module: name, actual: beforeIdentity, expected: afterIdentity },\n );\n }\n }\n}\n\nfunction staticAssembly(options: FrontendHostOptions, realm: PluginRealm): HostAssembly {\n const entries = options.entries ?? [];\n const modules =\n options.catalog === undefined ? [] : modulesFromCatalog(options.catalog, realm, 'static');\n return createHostAssembly({\n entries,\n modules,\n ...(options.config === undefined ? {} : { config: options.config }),\n });\n}\n\nfunction errorSummary(error: unknown): HostErrorSummary | undefined {\n if (\n error === null ||\n typeof error !== 'object' ||\n typeof (error as { code?: unknown }).code !== 'string' ||\n typeof (error as { expected?: unknown }).expected !== 'string' ||\n typeof (error as { hint?: unknown }).hint !== 'string'\n )\n return undefined;\n const detail = (error as { readonly detail?: unknown }).detail;\n return {\n code: (error as { readonly code: string }).code,\n expected: (error as { readonly expected: string }).expected,\n hint: (error as { readonly hint: string }).hint,\n detail:\n detail !== null && typeof detail === 'object'\n ? (detail as Readonly<Record<string, unknown>>)\n : { reason: String(detail ?? 'unknown failure') },\n };\n}\n\nasync function fetchInitialAssembly(\n options: FrontendHostOptions,\n realm: PluginRealm,\n): Promise<HostAssembly> {\n // An explicit assembly is an intentional bootstrap snapshot. DevKit uses\n // it to stage provider-only entries on reconnect before installing the\n // GameHost service; the transport still supplies the authoritative full\n // assembly immediately afterwards.\n if (options.assembly !== undefined) return options.assembly;\n if (options.transport !== undefined)\n return options.transport.request<undefined, HostAssembly>(HOST_ASSEMBLY_SERVICE, undefined);\n if (\n options.entries !== undefined ||\n options.catalog !== undefined ||\n options.config !== undefined\n )\n return staticAssembly(options, realm);\n throw new HostAssemblyError(\n 'host-assembly-service-unavailable',\n 'a static assembly or backend transport to be provided',\n 'Pass the frozen assembly for a static player or connect the frontend host to a backend host.',\n { service: HOST_ASSEMBLY_SERVICE },\n );\n}\n\nfunction readiness(loader: CatalogLoader): readonly HostActivationEntry[] {\n return inspectCatalogPlugins(loader).live.map((entry) => ({\n entryId: entry.entryId,\n fiberState: entry.fiberState,\n ...(entry.failure === undefined\n ? {}\n : {\n failure: {\n code: entry.failure.code,\n expected: entry.failure.expected,\n hint: entry.failure.hint,\n detail: entry.failure.detail,\n },\n }),\n }));\n}\n\nfunction assertReady(entries: readonly HostActivationEntry[]): void {\n const failed = entries.find(\n (entry) => entry.fiberState !== 'active' && entry.fiberState !== 'disabled',\n );\n if (failed === undefined) return;\n throw new HostAssemblyError(\n 'host-assembly-not-ready',\n `Entry ${failed.entryId} to reach active or disabled Fiber state`,\n 'Inspect the Entry failure or waiting dependency and repair the frontend package graph.',\n {\n entryId: failed.entryId,\n fiberState: failed.fiberState,\n ...(failed.failure === undefined ? {} : { failure: failed.failure }),\n },\n );\n}\n\n/** Start one independent browser-side manager and its native Cordis Loader. */\nexport async function createFrontendHost(options: FrontendHostOptions = {}): Promise<FrontendHost> {\n const realm = options.realm ?? 'engine';\n const initial = await fetchInitialAssembly(options, realm);\n const context = options.context ?? new Context();\n const ownedContext = options.context === undefined;\n const checked = validateHostAssembly(initial);\n if (!checked.ok) throw checked.error;\n let current = checked.value;\n let status: FrontendHostStatus = {\n state: 'created',\n revision: current.revision,\n };\n const state: FrontendAssemblyState = {\n get current() {\n return current;\n },\n get status() {\n return status;\n },\n };\n let startup: HostStartup | undefined;\n let loaderFiber: Fiber | undefined;\n let loader: CatalogLoader | undefined;\n let disposed = false;\n let removeTransportDisconnect: (() => void) | undefined;\n const report = async (next: FrontendHostStatus): Promise<void> => {\n status = next;\n await options.reportStatus?.(next);\n if (options.transport !== undefined) {\n const report: {\n state: HostActivationReport['state'];\n revision: string;\n entries?: readonly HostActivationEntry[];\n error?: HostErrorSummary;\n } = {\n state: next.state,\n revision: next.revision,\n };\n if (next.entries !== undefined) report.entries = next.entries;\n const failure = errorSummary(next.error);\n if (failure !== undefined) report.error = failure;\n try {\n await options.transport.request(HOST_ACTIVATION_REPORT_SERVICE, report);\n } catch (error) {\n const failed: FrontendHostStatus = {\n ...next,\n state: next.state === 'active' ? 'failed' : next.state,\n error,\n };\n status = failed;\n await options.reportStatus?.(failed);\n throw error;\n }\n }\n };\n if (options.transport !== undefined) {\n removeTransportDisconnect = options.transport.onDisconnect((error) => {\n if (disposed) return;\n const failed: FrontendHostStatus = {\n state: 'failed',\n revision: current.revision,\n error,\n };\n status = failed;\n void Promise.resolve(options.reportStatus?.(failed)).catch(() => {});\n });\n }\n\n try {\n startup = await createHostStartup({\n context,\n startupPlugins: [\n hostFoundationPlugin(state, options.transport),\n ...(options.startupPlugins ?? []),\n ],\n });\n if (options.autoActivate !== false) {\n // Activation is performed below through the returned host so its status\n // callback and failure rollback cover the first assembly as well.\n const host = {\n context,\n ...(options.transport === undefined ? {} : { transport: options.transport }),\n assembly: state,\n ...(ownedContext ? { ownedContext: true } : { ownedContext: false }),\n get status() {\n return status;\n },\n activate: async (_next?: HostAssembly) => {},\n update: async (_next: HostAssembly) => {},\n dispose: async () => {},\n } as FrontendHost;\n await activateFrontendHost(\n host,\n initial,\n options,\n realm,\n () => loader,\n (value) => {\n loader = value.loader;\n loaderFiber = value.fiber;\n },\n report,\n () => {\n current = initial;\n },\n );\n }\n } catch (error) {\n removeTransportDisconnect?.();\n await loaderFiber?.dispose();\n await startup?.dispose();\n throw error;\n }\n\n const host: FrontendHost = {\n context,\n ...(loader === undefined ? {} : { loader }),\n ...(options.transport === undefined ? {} : { transport: options.transport }),\n assembly: state,\n ownedContext,\n get status() {\n return status;\n },\n async activate(next = current) {\n await activateFrontendHost(\n host,\n next,\n options,\n realm,\n () => loader,\n (value) => {\n loader = value.loader;\n loaderFiber = value.fiber;\n (host as { loader?: CatalogLoader }).loader = value.loader;\n },\n report,\n () => {\n current = next;\n },\n );\n },\n async update(next) {\n await host.activate(next);\n },\n async dispose() {\n if (disposed) return;\n disposed = true;\n removeTransportDisconnect?.();\n await loaderFiber?.dispose();\n await startup?.dispose();\n status = { state: 'disposed', revision: current.revision };\n },\n };\n return host;\n}\n\nasync function activateFrontendHost(\n host: FrontendHost,\n next: HostAssembly,\n options: FrontendHostOptions,\n realm: PluginRealm,\n getLoader: () => CatalogLoader | undefined,\n setLoader: (value: { loader: CatalogLoader; fiber: Fiber }) => void,\n report: (status: FrontendHostStatus) => Promise<void>,\n commit: () => void,\n): Promise<void> {\n if (host.status.state === 'disposed') {\n throw new HostAssemblyError(\n 'host-assembly-service-unavailable',\n 'frontend host to remain active while activating an assembly',\n 'Create a new frontend host for the next browser connection.',\n { service: 'host-assembly' },\n );\n }\n const checked = validateHostAssembly(next);\n if (!checked.ok) {\n await report({ state: 'failed', revision: next.revision, error: checked.error });\n throw checked.error;\n }\n const activeLoader = getLoader();\n try {\n if (activeLoader !== undefined)\n assertModuleReloadBoundary(host.assembly.current, checked.value);\n await report({ state: 'loading', revision: next.revision });\n assertModuleVersions(checked.value, options.moduleVersions);\n let loader = activeLoader;\n if (loader === undefined) {\n const catalog = catalogForAssembly(checked.value, options.catalog);\n const installed = await installCatalogLoader(host.context, catalog, realm);\n loader = installed.loader;\n setLoader(installed);\n }\n const entries = projectPluginEntries(checked.value.entries, realm, realm);\n await loader.root.update(entries);\n await loader.await();\n const actualEntries = readiness(loader);\n assertReady(actualEntries);\n commit();\n await report({ state: 'active', revision: checked.value.revision, entries: actualEntries });\n } catch (error) {\n if (error instanceof HostAssemblyError && error.code === 'host-assembly-reload-required') {\n // The old Loader and its active Fibers are still authoritative. Do not\n // publish a failed status for the candidate revision or disguise a\n // required page reload as an in-place activation failure.\n throw error;\n }\n const activeLoader = getLoader();\n const actualEntries = activeLoader === undefined ? undefined : readiness(activeLoader);\n await report({\n state: 'failed',\n revision: next.revision,\n ...(actualEntries === undefined ? {} : { entries: actualEntries }),\n error,\n });\n throw error;\n }\n}\n\nexport { HostAssemblyError };\n"]}
|