@nextclaw/app-runtime 0.9.13 → 0.9.15
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 +2 -2
- package/dist/{main.js → app/main.js} +2 -2
- package/dist/app/main.js.map +1 -0
- package/dist/{commands → controllers}/create.controller.d.ts +2 -2
- package/dist/controllers/create.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/create.controller.js +2 -2
- package/dist/controllers/create.controller.js.map +1 -0
- package/dist/{commands → controllers}/dev.controller.js +1 -1
- package/dist/controllers/dev.controller.js.map +1 -0
- package/dist/{commands → controllers}/grant.controller.d.ts +3 -3
- package/dist/controllers/grant.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/grant.controller.js +2 -2
- package/dist/controllers/grant.controller.js.map +1 -0
- package/dist/{commands → controllers}/info.controller.d.ts +2 -2
- package/dist/controllers/info.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/info.controller.js +2 -2
- package/dist/controllers/info.controller.js.map +1 -0
- package/dist/{commands → controllers}/inspect.controller.js +8 -2
- package/dist/controllers/inspect.controller.js.map +1 -0
- package/dist/{commands → controllers}/install.controller.d.ts +2 -2
- package/dist/controllers/install.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/install.controller.js +2 -2
- package/dist/controllers/install.controller.js.map +1 -0
- package/dist/{commands → controllers}/list.controller.d.ts +2 -2
- package/dist/controllers/list.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/list.controller.js +2 -2
- package/dist/controllers/list.controller.js.map +1 -0
- package/dist/controllers/pack.controller.d.ts +19 -0
- package/dist/controllers/pack.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/pack.controller.js +8 -4
- package/dist/controllers/pack.controller.js.map +1 -0
- package/dist/{commands → controllers}/permissions.controller.d.ts +2 -2
- package/dist/controllers/permissions.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/permissions.controller.js +2 -2
- package/dist/controllers/permissions.controller.js.map +1 -0
- package/dist/{commands → controllers}/publish.controller.d.ts +3 -3
- package/dist/controllers/publish.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/publish.controller.js +2 -2
- package/dist/controllers/publish.controller.js.map +1 -0
- package/dist/{commands → controllers}/registry.controller.d.ts +2 -2
- package/dist/controllers/registry.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/registry.controller.js +2 -2
- package/dist/controllers/registry.controller.js.map +1 -0
- package/dist/{commands → controllers}/revoke.controller.d.ts +2 -2
- package/dist/controllers/revoke.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/revoke.controller.js +2 -2
- package/dist/controllers/revoke.controller.js.map +1 -0
- package/dist/{commands → controllers}/run.controller.js +8 -6
- package/dist/controllers/run.controller.js.map +1 -0
- package/dist/{commands → controllers}/uninstall.controller.d.ts +2 -2
- package/dist/controllers/uninstall.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/uninstall.controller.js +2 -2
- package/dist/controllers/uninstall.controller.js.map +1 -0
- package/dist/{commands → controllers}/update.controller.d.ts +2 -2
- package/dist/controllers/update.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/update.controller.js +2 -2
- package/dist/controllers/update.controller.js.map +1 -0
- package/dist/{commands → controllers}/validate-publish.controller.d.ts +3 -3
- package/dist/controllers/validate-publish.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/validate-publish.controller.js +9 -5
- package/dist/controllers/validate-publish.controller.js.map +1 -0
- package/dist/index.d.ts +51 -51
- package/dist/index.js +46 -45
- package/dist/package.js +1 -1
- package/dist/{runtime → services}/app-build.service.d.ts +2 -2
- package/dist/services/app-build.service.d.ts.map +1 -0
- package/dist/{runtime → services}/app-build.service.js +4 -2
- package/dist/services/app-build.service.js.map +1 -0
- package/dist/{bundle → services}/app-bundle.service.d.ts +18 -6
- package/dist/services/app-bundle.service.d.ts.map +1 -0
- package/dist/services/app-bundle.service.js +305 -0
- package/dist/services/app-bundle.service.js.map +1 -0
- package/dist/{permissions → services}/app-grant.service.d.ts +4 -4
- package/dist/services/app-grant.service.d.ts.map +1 -0
- package/dist/{permissions → services}/app-grant.service.js +7 -4
- package/dist/services/app-grant.service.js.map +1 -0
- package/dist/{paths → services}/app-home.service.d.ts +2 -1
- package/dist/services/app-home.service.d.ts.map +1 -0
- package/dist/{paths → services}/app-home.service.js +4 -1
- package/dist/services/app-home.service.js.map +1 -0
- package/dist/{host → services}/app-host.service.d.ts +2 -2
- package/dist/services/app-host.service.d.ts.map +1 -0
- package/dist/{host → services}/app-host.service.js +3 -3
- package/dist/services/app-host.service.js.map +1 -0
- package/dist/services/app-install-source.service.js +72 -0
- package/dist/services/app-install-source.service.js.map +1 -0
- package/dist/services/app-installation.service.d.ts +48 -0
- package/dist/services/app-installation.service.d.ts.map +1 -0
- package/dist/services/app-installation.service.js +411 -0
- package/dist/services/app-installation.service.js.map +1 -0
- package/dist/services/app-instance.service.d.ts +34 -0
- package/dist/services/app-instance.service.d.ts.map +1 -0
- package/dist/{host → services}/app-instance.service.js +4 -4
- package/dist/services/app-instance.service.js.map +1 -0
- package/dist/{manifest → services}/app-manifest.service.d.ts +12 -2
- package/dist/services/app-manifest.service.d.ts.map +1 -0
- package/dist/services/app-manifest.service.js +271 -0
- package/dist/services/app-manifest.service.js.map +1 -0
- package/dist/{publish → services}/app-marketplace-client.service.d.ts +2 -2
- package/dist/services/app-marketplace-client.service.d.ts.map +1 -0
- package/dist/{publish → services}/app-marketplace-client.service.js +2 -2
- package/dist/services/app-marketplace-client.service.js.map +1 -0
- package/dist/{publish → services}/app-marketplace-metadata.service.d.ts +7 -3
- package/dist/services/app-marketplace-metadata.service.d.ts.map +1 -0
- package/dist/{publish → services}/app-marketplace-metadata.service.js +45 -3
- package/dist/services/app-marketplace-metadata.service.js.map +1 -0
- package/dist/{permissions → services}/app-permissions.service.d.ts +3 -3
- package/dist/services/app-permissions.service.d.ts.map +1 -0
- package/dist/{permissions → services}/app-permissions.service.js +4 -1
- package/dist/services/app-permissions.service.js.map +1 -0
- package/dist/{publish → services}/app-publish-validation.service.d.ts +9 -7
- package/dist/services/app-publish-validation.service.d.ts.map +1 -0
- package/dist/{publish → services}/app-publish-validation.service.js +14 -10
- package/dist/services/app-publish-validation.service.js.map +1 -0
- package/dist/{publish → services}/app-publish.service.d.ts +5 -5
- package/dist/services/app-publish.service.d.ts.map +1 -0
- package/dist/{publish → services}/app-publish.service.js +10 -7
- package/dist/services/app-publish.service.js.map +1 -0
- package/dist/{registry → services}/app-registry-config.service.d.ts +3 -3
- package/dist/{registry → services}/app-registry-config.service.d.ts.map +1 -1
- package/dist/{registry → services}/app-registry-config.service.js +3 -3
- package/dist/services/app-registry-config.service.js.map +1 -0
- package/dist/{registry → services}/app-registry.service.d.ts +20 -5
- package/dist/services/app-registry.service.d.ts.map +1 -0
- package/dist/services/app-registry.service.js +228 -0
- package/dist/services/app-registry.service.js.map +1 -0
- package/dist/{registry → services}/app-remote-registry-client.service.d.ts +6 -2
- package/dist/services/app-remote-registry-client.service.d.ts.map +1 -0
- package/dist/{registry → services}/app-remote-registry-client.service.js +54 -8
- package/dist/services/app-remote-registry-client.service.js.map +1 -0
- package/dist/{cli → services}/app-runtime-cli.service.d.ts +1 -1
- package/dist/services/app-runtime-cli.service.d.ts.map +1 -0
- package/dist/{cli → services}/app-runtime-cli.service.js +19 -19
- package/dist/services/app-runtime-cli.service.js.map +1 -0
- package/dist/{cli → services}/app-runtime-options.service.d.ts +6 -6
- package/dist/services/app-runtime-options.service.d.ts.map +1 -0
- package/dist/{cli → services}/app-runtime-options.service.js +3 -9
- package/dist/services/app-runtime-options.service.js.map +1 -0
- package/dist/{runtime → services}/app-runtime-toolchain.service.d.ts +1 -1
- package/dist/services/app-runtime-toolchain.service.d.ts.map +1 -0
- package/dist/{runtime → services}/app-runtime-toolchain.service.js +1 -1
- package/dist/services/app-runtime-toolchain.service.js.map +1 -0
- package/dist/{scaffold → services}/app-scaffold.service.d.ts +1 -1
- package/dist/{scaffold → services}/app-scaffold.service.d.ts.map +1 -1
- package/dist/{scaffold → services}/app-scaffold.service.js +1 -1
- package/dist/{scaffold → services}/app-scaffold.service.js.map +1 -1
- package/dist/{scaffold → services}/app-ts-http-lite-scaffold-template.service.d.ts +1 -1
- package/dist/{scaffold → services}/app-ts-http-lite-scaffold-template.service.d.ts.map +1 -1
- package/dist/{scaffold → services}/app-ts-http-lite-scaffold-template.service.js +1 -1
- package/dist/{scaffold → services}/app-ts-http-lite-scaffold-template.service.js.map +1 -1
- package/dist/{scaffold → services}/app-ts-http-scaffold-template.service.d.ts +1 -1
- package/dist/{scaffold → services}/app-ts-http-scaffold-template.service.d.ts.map +1 -1
- package/dist/{scaffold → services}/app-ts-http-scaffold-template.service.js +1 -1
- package/dist/{scaffold → services}/app-ts-http-scaffold-template.service.js.map +1 -1
- package/dist/{bridge → services}/host-bridge.service.d.ts +2 -2
- package/dist/services/host-bridge.service.d.ts.map +1 -0
- package/dist/{bridge → services}/host-bridge.service.js +1 -1
- package/dist/services/host-bridge.service.js.map +1 -0
- package/dist/services/main-runner.service.d.ts +9 -0
- package/dist/services/main-runner.service.d.ts.map +1 -0
- package/dist/services/main-runner.service.js +6 -0
- package/dist/services/main-runner.service.js.map +1 -0
- package/dist/{publish → services}/platform-auth-state.service.d.ts +1 -1
- package/dist/services/platform-auth-state.service.d.ts.map +1 -0
- package/dist/{publish → services}/platform-auth-state.service.js +1 -1
- package/dist/services/platform-auth-state.service.js.map +1 -0
- package/dist/{ui → services}/ui-server.service.d.ts +3 -3
- package/dist/services/ui-server.service.d.ts.map +1 -0
- package/dist/{ui → services}/ui-server.service.js +1 -1
- package/dist/services/ui-server.service.js.map +1 -0
- package/dist/{runtime → services}/wasm-main-runner.service.d.ts +3 -3
- package/dist/services/wasm-main-runner.service.d.ts.map +1 -0
- package/dist/{runtime → services}/wasm-main-runner.service.js +2 -2
- package/dist/services/wasm-main-runner.service.js.map +1 -0
- package/dist/{sidecar → services}/wasm-sidecar-client.service.d.ts +1 -1
- package/dist/services/wasm-sidecar-client.service.d.ts.map +1 -0
- package/dist/{sidecar → services}/wasm-sidecar-client.service.js +1 -1
- package/dist/services/wasm-sidecar-client.service.js.map +1 -0
- package/dist/{runtime → services}/wasmtime-wasi-http-component.service.d.ts +1 -1
- package/dist/services/wasmtime-wasi-http-component.service.d.ts.map +1 -0
- package/dist/{runtime → services}/wasmtime-wasi-http-component.service.js +1 -1
- package/dist/services/wasmtime-wasi-http-component.service.js.map +1 -0
- package/dist/{bundle → types}/app-bundle.types.d.ts +1 -1
- package/dist/types/app-bundle.types.d.ts.map +1 -0
- package/dist/{install → types}/app-installation.types.d.ts +29 -7
- package/dist/types/app-installation.types.d.ts.map +1 -0
- package/dist/types/app-manifest.types.d.ts +119 -0
- package/dist/types/app-manifest.types.d.ts.map +1 -0
- package/dist/types/app-manifest.types.js +11 -0
- package/dist/types/app-manifest.types.js.map +1 -0
- package/dist/{permissions → types}/app-permissions.types.d.ts +2 -2
- package/dist/types/app-permissions.types.d.ts.map +1 -0
- package/dist/{publish → types}/app-publish.types.d.ts +11 -5
- package/dist/types/app-publish.types.d.ts.map +1 -0
- package/dist/{publish → types}/app-publish.types.js +1 -1
- package/dist/types/app-publish.types.js.map +1 -0
- package/dist/{registry → types}/app-registry.types.d.ts +11 -4
- package/dist/types/app-registry.types.d.ts.map +1 -0
- package/dist/{registry → types}/app-remote-registry.types.d.ts +3 -3
- package/dist/types/app-remote-registry.types.d.ts.map +1 -0
- package/dist/{registry → types}/app-remote-registry.types.js +1 -1
- package/dist/types/app-remote-registry.types.js.map +1 -0
- package/dist/{runtime → types}/main-runner.types.d.ts +3 -3
- package/dist/types/main-runner.types.d.ts.map +1 -0
- package/package.json +10 -3
- package/dist/bridge/host-bridge.service.d.ts.map +0 -1
- package/dist/bridge/host-bridge.service.js.map +0 -1
- package/dist/bundle/app-bundle.service.d.ts.map +0 -1
- package/dist/bundle/app-bundle.service.js +0 -196
- package/dist/bundle/app-bundle.service.js.map +0 -1
- package/dist/bundle/app-bundle.types.d.ts.map +0 -1
- package/dist/cli/app-runtime-cli.service.d.ts.map +0 -1
- package/dist/cli/app-runtime-cli.service.js.map +0 -1
- package/dist/cli/app-runtime-options.service.d.ts.map +0 -1
- package/dist/cli/app-runtime-options.service.js.map +0 -1
- package/dist/commands/create.controller.d.ts.map +0 -1
- package/dist/commands/create.controller.js.map +0 -1
- package/dist/commands/dev.controller.js.map +0 -1
- package/dist/commands/grant.controller.d.ts.map +0 -1
- package/dist/commands/grant.controller.js.map +0 -1
- package/dist/commands/info.controller.d.ts.map +0 -1
- package/dist/commands/info.controller.js.map +0 -1
- package/dist/commands/inspect.controller.js.map +0 -1
- package/dist/commands/install.controller.d.ts.map +0 -1
- package/dist/commands/install.controller.js.map +0 -1
- package/dist/commands/list.controller.d.ts.map +0 -1
- package/dist/commands/list.controller.js.map +0 -1
- package/dist/commands/pack.controller.d.ts +0 -17
- package/dist/commands/pack.controller.d.ts.map +0 -1
- package/dist/commands/pack.controller.js.map +0 -1
- package/dist/commands/permissions.controller.d.ts.map +0 -1
- package/dist/commands/permissions.controller.js.map +0 -1
- package/dist/commands/publish.controller.d.ts.map +0 -1
- package/dist/commands/publish.controller.js.map +0 -1
- package/dist/commands/registry.controller.d.ts.map +0 -1
- package/dist/commands/registry.controller.js.map +0 -1
- package/dist/commands/revoke.controller.d.ts.map +0 -1
- package/dist/commands/revoke.controller.js.map +0 -1
- package/dist/commands/run.controller.js.map +0 -1
- package/dist/commands/uninstall.controller.d.ts.map +0 -1
- package/dist/commands/uninstall.controller.js.map +0 -1
- package/dist/commands/update.controller.d.ts.map +0 -1
- package/dist/commands/update.controller.js.map +0 -1
- package/dist/commands/validate-publish.controller.d.ts.map +0 -1
- package/dist/commands/validate-publish.controller.js.map +0 -1
- package/dist/host/app-host.service.d.ts.map +0 -1
- package/dist/host/app-host.service.js.map +0 -1
- package/dist/host/app-instance.service.d.ts +0 -34
- package/dist/host/app-instance.service.d.ts.map +0 -1
- package/dist/host/app-instance.service.js.map +0 -1
- package/dist/install/app-installation.service.d.ts +0 -41
- package/dist/install/app-installation.service.d.ts.map +0 -1
- package/dist/install/app-installation.service.js +0 -276
- package/dist/install/app-installation.service.js.map +0 -1
- package/dist/install/app-installation.types.d.ts.map +0 -1
- package/dist/main.js.map +0 -1
- package/dist/manifest/app-manifest.service.d.ts.map +0 -1
- package/dist/manifest/app-manifest.service.js +0 -147
- package/dist/manifest/app-manifest.service.js.map +0 -1
- package/dist/manifest/app-manifest.types.d.ts +0 -68
- package/dist/manifest/app-manifest.types.d.ts.map +0 -1
- package/dist/paths/app-home.service.d.ts.map +0 -1
- package/dist/paths/app-home.service.js.map +0 -1
- package/dist/permissions/app-grant.service.d.ts.map +0 -1
- package/dist/permissions/app-grant.service.js.map +0 -1
- package/dist/permissions/app-permissions.service.d.ts.map +0 -1
- package/dist/permissions/app-permissions.service.js.map +0 -1
- package/dist/permissions/app-permissions.types.d.ts.map +0 -1
- package/dist/publish/app-marketplace-client.service.d.ts.map +0 -1
- package/dist/publish/app-marketplace-client.service.js.map +0 -1
- package/dist/publish/app-marketplace-metadata.service.d.ts.map +0 -1
- package/dist/publish/app-marketplace-metadata.service.js.map +0 -1
- package/dist/publish/app-publish-validation.service.d.ts.map +0 -1
- package/dist/publish/app-publish-validation.service.js.map +0 -1
- package/dist/publish/app-publish.service.d.ts.map +0 -1
- package/dist/publish/app-publish.service.js.map +0 -1
- package/dist/publish/app-publish.types.d.ts.map +0 -1
- package/dist/publish/app-publish.types.js.map +0 -1
- package/dist/publish/platform-auth-state.service.d.ts.map +0 -1
- package/dist/publish/platform-auth-state.service.js.map +0 -1
- package/dist/registry/app-registry-config.service.js.map +0 -1
- package/dist/registry/app-registry.service.d.ts.map +0 -1
- package/dist/registry/app-registry.service.js +0 -118
- package/dist/registry/app-registry.service.js.map +0 -1
- package/dist/registry/app-registry.types.d.ts.map +0 -1
- package/dist/registry/app-remote-registry-client.service.d.ts.map +0 -1
- package/dist/registry/app-remote-registry-client.service.js.map +0 -1
- package/dist/registry/app-remote-registry.types.d.ts.map +0 -1
- package/dist/registry/app-remote-registry.types.js.map +0 -1
- package/dist/runtime/app-build.service.d.ts.map +0 -1
- package/dist/runtime/app-build.service.js.map +0 -1
- package/dist/runtime/app-runtime-toolchain.service.d.ts.map +0 -1
- package/dist/runtime/app-runtime-toolchain.service.js.map +0 -1
- package/dist/runtime/main-runner.service.d.ts +0 -9
- package/dist/runtime/main-runner.service.d.ts.map +0 -1
- package/dist/runtime/main-runner.service.js +0 -6
- package/dist/runtime/main-runner.service.js.map +0 -1
- package/dist/runtime/main-runner.types.d.ts.map +0 -1
- package/dist/runtime/wasm-main-runner.service.d.ts.map +0 -1
- package/dist/runtime/wasm-main-runner.service.js.map +0 -1
- package/dist/runtime/wasmtime-wasi-http-component.service.d.ts.map +0 -1
- package/dist/runtime/wasmtime-wasi-http-component.service.js.map +0 -1
- package/dist/sidecar/wasm-sidecar-client.service.d.ts.map +0 -1
- package/dist/sidecar/wasm-sidecar-client.service.js.map +0 -1
- package/dist/ui/ui-server.service.d.ts.map +0 -1
- package/dist/ui/ui-server.service.js.map +0 -1
- /package/dist/{main.d.ts → app/main.d.ts} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-remote-registry-client.service.js","names":[],"sources":["../../src/registry/app-remote-registry-client.service.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { AppRegistryConfigService } from \"./app-registry-config.service.js\";\nimport type {\n AppRemoteRegistryDocument,\n AppRemoteRegistryResolution,\n AppRemoteRegistryVersion,\n} from \"./app-remote-registry.types.js\";\n\nexport class AppRemoteRegistryClientService {\n constructor(\n private readonly configService: AppRegistryConfigService = new AppRegistryConfigService(),\n ) {}\n\n resolve = async (params: {\n appId: string;\n version?: string;\n registryUrl?: string;\n }): Promise<AppRemoteRegistryResolution> => {\n const { appId, version: requestedVersion, registryUrl: overrideRegistryUrl } = params;\n const registryUrl = overrideRegistryUrl\n ? this.normalizeRegistryUrl(overrideRegistryUrl)\n : (await this.configService.getSnapshot()).currentUrl;\n const metadataUrl = new URL(encodeURIComponent(appId), registryUrl).toString();\n const response = await fetch(metadataUrl);\n if (!response.ok) {\n throw new Error(\n `无法从 registry 拉取 ${appId} metadata:${response.status} ${response.statusText}`,\n );\n }\n const document = this.parseDocument(await response.json(), appId);\n const version = requestedVersion ?? document[\"dist-tags\"].latest;\n const versionRecord = document.versions[version];\n if (!versionRecord) {\n throw new Error(`registry ${registryUrl} 未提供 ${appId}@${version}。`);\n }\n return {\n registryUrl,\n metadataUrl,\n appId,\n version,\n description: versionRecord.description ?? document.description,\n publisher: versionRecord.publisher,\n permissions: versionRecord.permissions,\n distributionMode: versionRecord.dist.kind === \"source\" ? \"source\" : \"bundle\",\n bundleUrl: new URL(\n versionRecord.dist.artifact ??\n versionRecord.dist.source ??\n versionRecord.dist.bundle,\n metadataUrl,\n ).toString(),\n sha256: versionRecord.dist.sha256,\n };\n };\n\n downloadBundle = async (params: {\n resolution: AppRemoteRegistryResolution;\n targetDirectory: string;\n }): Promise<{\n bundlePath: string;\n }> => {\n const { resolution, targetDirectory } = params;\n const response = await fetch(resolution.bundleUrl);\n if (!response.ok) {\n throw new Error(\n `无法下载 bundle:${resolution.bundleUrl} (${response.status} ${response.statusText})`,\n );\n }\n const bundleBytes = Buffer.from(await response.arrayBuffer());\n const actualSha256 = createHash(\"sha256\").update(bundleBytes).digest(\"hex\");\n if (actualSha256 !== resolution.sha256) {\n throw new Error(\n `bundle checksum 校验失败:期望 ${resolution.sha256},实际 ${actualSha256}`,\n );\n }\n const bundlePath = path.join(\n targetDirectory,\n `${this.normalizeBundleFileName(resolution.appId)}-${resolution.version}.napp`,\n );\n await writeFile(bundlePath, bundleBytes);\n return {\n bundlePath,\n };\n };\n\n private parseDocument = (\n rawDocument: unknown,\n appId: string,\n ): AppRemoteRegistryDocument => {\n if (!rawDocument || typeof rawDocument !== \"object\" || Array.isArray(rawDocument)) {\n throw new Error(`registry ${appId} metadata 必须是对象。`);\n }\n const candidate = rawDocument as Record<string, unknown>;\n const name = this.readRequiredString(candidate.name, \"name\");\n if (name !== appId) {\n throw new Error(`registry 返回的包名与请求不一致:请求 ${appId},收到 ${name}`);\n }\n const distTags = candidate[\"dist-tags\"];\n if (!distTags || typeof distTags !== \"object\" || Array.isArray(distTags)) {\n throw new Error(\"registry metadata 缺少 dist-tags。\");\n }\n const versions = candidate.versions;\n if (!versions || typeof versions !== \"object\" || Array.isArray(versions)) {\n throw new Error(\"registry metadata 缺少 versions。\");\n }\n return {\n name,\n description: this.readOptionalString(candidate.description, \"description\"),\n \"dist-tags\": {\n latest: this.readRequiredString(\n (distTags as Record<string, unknown>).latest,\n \"dist-tags.latest\",\n ),\n },\n versions: Object.fromEntries(\n Object.entries(versions).map(([version, rawVersion]) => [\n version,\n this.parseVersion(rawVersion, name, version),\n ]),\n ),\n };\n };\n\n private parseVersion = (\n rawVersion: unknown,\n appId: string,\n version: string,\n ): AppRemoteRegistryVersion => {\n if (!rawVersion || typeof rawVersion !== \"object\" || Array.isArray(rawVersion)) {\n throw new Error(`registry metadata 的 versions.${version} 必须是对象。`);\n }\n const candidate = rawVersion as Record<string, unknown>;\n const name = this.readRequiredString(candidate.name, `versions.${version}.name`);\n const parsedVersion = this.readRequiredString(\n candidate.version,\n `versions.${version}.version`,\n );\n if (name !== appId || parsedVersion !== version) {\n throw new Error(`registry metadata 的 versions.${version} 与 app id/version 不一致。`);\n }\n const dist = candidate.dist;\n if (!dist || typeof dist !== \"object\" || Array.isArray(dist)) {\n throw new Error(`registry metadata 的 versions.${version}.dist 必须是对象。`);\n }\n const distCandidate = dist as Record<string, unknown>;\n return {\n name,\n version: parsedVersion,\n description: this.readOptionalString(\n candidate.description,\n `versions.${version}.description`,\n ),\n publisher: this.parsePublisher(candidate.publisher, version),\n permissions: candidate.permissions as AppRemoteRegistryVersion[\"permissions\"],\n dist: {\n kind:\n distCandidate.kind === \"source\" || distCandidate.kind === \"bundle\"\n ? distCandidate.kind\n : undefined,\n artifact: this.readOptionalString(\n distCandidate.artifact,\n `versions.${version}.dist.artifact`,\n ),\n bundle: this.readRequiredString(\n distCandidate.bundle,\n `versions.${version}.dist.bundle`,\n ),\n source: this.readOptionalString(\n distCandidate.source,\n `versions.${version}.dist.source`,\n ),\n sha256: this.readRequiredString(\n distCandidate.sha256,\n `versions.${version}.dist.sha256`,\n ),\n },\n };\n };\n\n private parsePublisher = (\n rawPublisher: unknown,\n version: string,\n ): AppRemoteRegistryVersion[\"publisher\"] => {\n if (rawPublisher === undefined) {\n return undefined;\n }\n if (!rawPublisher || typeof rawPublisher !== \"object\" || Array.isArray(rawPublisher)) {\n throw new Error(`versions.${version}.publisher 必须是对象。`);\n }\n const candidate = rawPublisher as Record<string, unknown>;\n return {\n id: this.readRequiredString(candidate.id, `versions.${version}.publisher.id`),\n name: this.readRequiredString(candidate.name, `versions.${version}.publisher.name`),\n url: this.readOptionalString(candidate.url, `versions.${version}.publisher.url`),\n };\n };\n\n private readRequiredString = (value: unknown, fieldName: string): string => {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`${fieldName} 必须是非空字符串。`);\n }\n return value.trim();\n };\n\n private readOptionalString = (\n value: unknown,\n fieldName: string,\n ): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n return this.readRequiredString(value, fieldName);\n };\n\n private normalizeBundleFileName = (appId: string): string => {\n return appId.replace(/[^a-zA-Z0-9._-]+/g, \"-\");\n };\n\n private normalizeRegistryUrl = (registryUrl: string): string => {\n let normalized: URL;\n try {\n normalized = new URL(registryUrl);\n } catch {\n throw new Error(`非法 registry URL:${registryUrl}`);\n }\n if (normalized.protocol !== \"http:\" && normalized.protocol !== \"https:\") {\n throw new Error(`registry URL 只支持 http/https:${registryUrl}`);\n }\n const text = normalized.toString();\n return text.endsWith(\"/\") ? text : `${text}/`;\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-remote-registry.types.d.ts","names":[],"sources":["../../src/registry/app-remote-registry.types.ts"],"mappings":";;;;cAGa,wBAAA;AAAA,KAGD,YAAA;EACV,EAAA;EACA,IAAA;EACA,GAAA;AAAA;AAAA,KAGU,iBAAA;EACV,aAAA;EACA,QAAA;IACE,GAAA;EAAA;AAAA;AAAA,KAIQ,yBAAA;EACV,UAAA;EACA,UAAA;EACA,MAAA;AAAA;AAAA,KAGU,wBAAA;EACV,IAAA;EACA,OAAA;EACA,WAAA;EACA,SAAA,GAAY,YAAA;EACZ,WAAA,GAAc,cAAA;EACd,IAAA;IACE,IAAA,GAAO,mBAAA;IACP,QAAA;IACA,MAAA;IACA,MAAA;IACA,MAAA;EAAA;AAAA;AAAA,KAIQ,yBAAA;EACV,IAAA;EACA,WAAA;EACA,WAAA;IACE,MAAA;EAAA;EAEF,QAAA,EAAU,MAAA,SAAe,wBAAA;AAAA;AAAA,KAGf,2BAAA;EACV,WAAA;EACA,WAAA;EACA,KAAA;EACA,OAAA;EACA,WAAA;EACA,SAAA,GAAY,YAAA;EACZ,WAAA,GAAc,cAAA;EACd,gBAAA,EAAkB,mBAAA;EAClB,SAAA;EACA,MAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-remote-registry.types.js","names":[],"sources":["../../src/registry/app-remote-registry.types.ts"],"sourcesContent":["import type { AppPermissions } from \"../manifest/app-manifest.types.js\";\nimport type { AppDistributionMode } from \"../bundle/app-bundle.types.js\";\n\nexport const DEFAULT_APP_REGISTRY_URL =\n \"https://apps-registry.nextclaw.io/api/v1/apps/registry/\";\n\nexport type AppPublisher = {\n id: string;\n name: string;\n url?: string;\n};\n\nexport type AppRegistryConfig = {\n schemaVersion: 1;\n registry: {\n url: string;\n };\n};\n\nexport type AppRegistryConfigSnapshot = {\n defaultUrl: string;\n currentUrl: string;\n source: \"default\" | \"config\" | \"env\";\n};\n\nexport type AppRemoteRegistryVersion = {\n name: string;\n version: string;\n description?: string;\n publisher?: AppPublisher;\n permissions?: AppPermissions;\n dist: {\n kind?: AppDistributionMode;\n artifact?: string;\n bundle: string;\n source?: string;\n sha256: string;\n };\n};\n\nexport type AppRemoteRegistryDocument = {\n name: string;\n description?: string;\n \"dist-tags\": {\n latest: string;\n };\n versions: Record<string, AppRemoteRegistryVersion>;\n};\n\nexport type AppRemoteRegistryResolution = {\n registryUrl: string;\n metadataUrl: string;\n appId: string;\n version: string;\n description?: string;\n publisher?: AppPublisher;\n permissions?: AppPermissions;\n distributionMode: AppDistributionMode;\n bundleUrl: string;\n sha256: string;\n};\n"],"mappings":";AAGA,MAAa,2BACX"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-build.service.d.ts","names":[],"sources":["../../src/runtime/app-build.service.ts"],"mappings":";;;;KAKY,cAAA;EACV,YAAA;EACA,QAAA;EACA,aAAA;EACA,qBAAA;EACA,KAAA;EACA,aAAA;AAAA;AAAA,cAGW,eAAA;EAAA,iBAEQ,eAAA;EAAA,iBACA,gBAAA;cADA,eAAA,GAAiB,kBAAA,EACjB,gBAAA,GAAkB,0BAAA;EAGrC,KAAA,GAAe,MAAA;IACb,YAAA;IACA,OAAA;EAAA,MACE,OAAA,CAAQ,cAAA;EAAA,QAwCJ,UAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-build.service.js","names":[],"sources":["../../src/runtime/app-build.service.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { AppManifestService } from \"../manifest/app-manifest.service.js\";\nimport { AppRuntimeToolchainService } from \"./app-runtime-toolchain.service.js\";\n\nexport type AppBuildResult = {\n appDirectory: string;\n mainKind: string;\n mainEntryPath: string;\n installedDependencies: boolean;\n built: boolean;\n skippedReason?: string;\n};\n\nexport class AppBuildService {\n constructor(\n private readonly manifestService: AppManifestService = new AppManifestService(),\n private readonly toolchainService: AppRuntimeToolchainService = new AppRuntimeToolchainService(),\n ) {}\n\n build = async (params: {\n appDirectory: string;\n install: boolean;\n }): Promise<AppBuildResult> => {\n const appDirectory = path.resolve(params.appDirectory);\n const bundle = await this.manifestService.load(appDirectory);\n if (bundle.manifest.main.kind !== \"wasi-http-component\") {\n return {\n appDirectory,\n mainKind: bundle.manifest.main.kind,\n mainEntryPath: bundle.mainEntryPath,\n installedDependencies: false,\n built: false,\n skippedReason: \"main.kind=wasm 应用不需要 TS/WASI HTTP 构建。\",\n };\n }\n\n await this.toolchainService.assertReadyForWasiHttpBuild();\n const mainDirectory = path.join(appDirectory, \"main\");\n await access(path.join(mainDirectory, \"package.json\"));\n const shouldInstall = params.install || !(await this.pathExists(path.join(mainDirectory, \"node_modules\")));\n if (shouldInstall) {\n await this.toolchainService.runCommand({\n command: \"npm\",\n args: [\"install\"],\n cwd: mainDirectory,\n });\n }\n await this.toolchainService.runCommand({\n command: \"npm\",\n args: [\"run\", \"build\"],\n cwd: mainDirectory,\n });\n await access(bundle.mainEntryPath);\n return {\n appDirectory,\n mainKind: bundle.manifest.main.kind,\n mainEntryPath: bundle.mainEntryPath,\n installedDependencies: shouldInstall,\n built: true,\n };\n };\n\n private pathExists = async (targetPath: string): Promise<boolean> => {\n try {\n await access(targetPath);\n return true;\n } catch {\n return false;\n }\n };\n}\n"],"mappings":";;;;;AAcA,IAAa,kBAAb,MAA6B;CAC3B,YACE,kBAAuD,IAAI,oBAAoB,EAC/E,mBAAgE,IAAI,4BAA4B,EAChG;AAFiB,OAAA,kBAAA;AACA,OAAA,mBAAA;;CAGnB,QAAQ,OAAO,WAGgB;EAC7B,MAAM,eAAe,KAAK,QAAQ,OAAO,aAAa;EACtD,MAAM,SAAS,MAAM,KAAK,gBAAgB,KAAK,aAAa;AAC5D,MAAI,OAAO,SAAS,KAAK,SAAS,sBAChC,QAAO;GACL;GACA,UAAU,OAAO,SAAS,KAAK;GAC/B,eAAe,OAAO;GACtB,uBAAuB;GACvB,OAAO;GACP,eAAe;GAChB;AAGH,QAAM,KAAK,iBAAiB,6BAA6B;EACzD,MAAM,gBAAgB,KAAK,KAAK,cAAc,OAAO;AACrD,QAAM,OAAO,KAAK,KAAK,eAAe,eAAe,CAAC;EACtD,MAAM,gBAAgB,OAAO,WAAW,CAAE,MAAM,KAAK,WAAW,KAAK,KAAK,eAAe,eAAe,CAAC;AACzG,MAAI,cACF,OAAM,KAAK,iBAAiB,WAAW;GACrC,SAAS;GACT,MAAM,CAAC,UAAU;GACjB,KAAK;GACN,CAAC;AAEJ,QAAM,KAAK,iBAAiB,WAAW;GACrC,SAAS;GACT,MAAM,CAAC,OAAO,QAAQ;GACtB,KAAK;GACN,CAAC;AACF,QAAM,OAAO,OAAO,cAAc;AAClC,SAAO;GACL;GACA,UAAU,OAAO,SAAS,KAAK;GAC/B,eAAe,OAAO;GACtB,uBAAuB;GACvB,OAAO;GACR;;CAGH,aAAqB,OAAO,eAAyC;AACnE,MAAI;AACF,SAAM,OAAO,WAAW;AACxB,UAAO;UACD;AACN,UAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-runtime-toolchain.service.d.ts","names":[],"sources":["../../src/runtime/app-runtime-toolchain.service.ts"],"mappings":";KAGY,oBAAA;EACV,IAAA;EACA,OAAA;EACA,EAAA;EACA,OAAA;EACA,WAAA;EACA,KAAA;AAAA;AAAA,KAGU,sBAAA;EACV,EAAA;EACA,KAAA,EAAO,oBAAA;AAAA;AAAA,KAGG,uBAAA;EACV,MAAA;EACA,MAAA;AAAA;AAAA,cA+BW,0BAAA;EACX,MAAA,QAAmB,OAAA,CAAQ,sBAAA;EAQ3B,2BAAA,QAAwC,OAAA;EAcxC,UAAA,GAAoB,MAAA;IAClB,OAAA;IACA,IAAA;IACA,GAAA;EAAA,MACE,OAAA,CAAQ,uBAAA;EAAA,QASJ,SAAA;EAAA,QA0BA,cAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-runtime-toolchain.service.js","names":[],"sources":["../../src/runtime/app-runtime-toolchain.service.ts"],"sourcesContent":["import { spawn, type ChildProcessByStdio } from \"node:child_process\";\nimport type { Readable } from \"node:stream\";\n\nexport type AppRuntimeToolStatus = {\n name: string;\n command: string;\n ok: boolean;\n version?: string;\n installHint: string;\n error?: string;\n};\n\nexport type AppRuntimeDoctorResult = {\n ok: boolean;\n tools: AppRuntimeToolStatus[];\n};\n\nexport type AppRuntimeCommandResult = {\n stdout: string;\n stderr: string;\n};\n\ntype RequiredTool = {\n name: string;\n command: string;\n args: string[];\n installHint: string;\n};\n\nconst REQUIRED_TOOLS: RequiredTool[] = [\n {\n name: \"npm\",\n command: \"npm\",\n args: [\"--version\"],\n installHint: \"请安装 Node.js,或使用 NextClaw 桌面版内置运行环境。\",\n },\n {\n name: \"wasmtime\",\n command: \"wasmtime\",\n args: [\"--version\"],\n installHint: \"请安装 Wasmtime,或使用后续内置 Wasmtime 的 NextClaw 发行包。\",\n },\n {\n name: \"wkg\",\n command: \"wkg\",\n args: [\"--version\"],\n installHint: \"请安装 Bytecode Alliance wkg;有 Rust/Cargo 时可执行:cargo install wkg --locked。\",\n },\n];\n\nexport class AppRuntimeToolchainService {\n doctor = async (): Promise<AppRuntimeDoctorResult> => {\n const tools = await Promise.all(REQUIRED_TOOLS.map((tool) => this.checkTool(tool)));\n return {\n ok: tools.every((tool) => tool.ok),\n tools,\n };\n };\n\n assertReadyForWasiHttpBuild = async (): Promise<void> => {\n const result = await this.doctor();\n const missing = result.tools.filter((tool) => !tool.ok);\n if (missing.length === 0) {\n return;\n }\n throw new Error(\n [\n \"NApp WASI HTTP 开发环境尚未就绪。\",\n ...missing.map((tool) => `- 缺少 ${tool.name}: ${tool.installHint}`),\n ].join(\"\\n\"),\n );\n };\n\n runCommand = async (params: {\n command: string;\n args: string[];\n cwd: string;\n }): Promise<AppRuntimeCommandResult> => {\n const { command, args, cwd } = params;\n const child = spawn(command, args, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n return await this.collectProcess(child, command);\n };\n\n private checkTool = async (tool: RequiredTool): Promise<AppRuntimeToolStatus> => {\n try {\n const result = await this.runCommand({\n command: tool.command,\n args: tool.args,\n cwd: process.cwd(),\n });\n const version = (result.stdout || result.stderr).trim().split(/\\r?\\n/)[0]?.trim();\n return {\n name: tool.name,\n command: tool.command,\n ok: true,\n version,\n installHint: tool.installHint,\n };\n } catch (error) {\n return {\n name: tool.name,\n command: tool.command,\n ok: false,\n installHint: tool.installHint,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n };\n\n private collectProcess = async (\n child: ChildProcessByStdio<null, Readable, Readable>,\n command: string,\n ): Promise<AppRuntimeCommandResult> => {\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdoutChunks.push(chunk);\n });\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderrChunks.push(chunk);\n });\n const exitCode = await new Promise<number | null>((resolve, reject) => {\n child.once(\"error\", reject);\n child.once(\"exit\", resolve);\n });\n const stdout = Buffer.concat(stdoutChunks).toString(\"utf-8\");\n const stderr = Buffer.concat(stderrChunks).toString(\"utf-8\");\n if (exitCode !== 0) {\n throw new Error(`${command} exited with ${exitCode ?? \"unknown\"}\\n${stderr || stdout}`);\n }\n return {\n stdout,\n stderr,\n };\n };\n}\n"],"mappings":";;AA6BA,MAAM,iBAAiC;CACrC;EACE,MAAM;EACN,SAAS;EACT,MAAM,CAAC,YAAY;EACnB,aAAa;EACd;CACD;EACE,MAAM;EACN,SAAS;EACT,MAAM,CAAC,YAAY;EACnB,aAAa;EACd;CACD;EACE,MAAM;EACN,SAAS;EACT,MAAM,CAAC,YAAY;EACnB,aAAa;EACd;CACF;AAED,IAAa,6BAAb,MAAwC;CACtC,SAAS,YAA6C;EACpD,MAAM,QAAQ,MAAM,QAAQ,IAAI,eAAe,KAAK,SAAS,KAAK,UAAU,KAAK,CAAC,CAAC;AACnF,SAAO;GACL,IAAI,MAAM,OAAO,SAAS,KAAK,GAAG;GAClC;GACD;;CAGH,8BAA8B,YAA2B;EAEvD,MAAM,WADS,MAAM,KAAK,QAAQ,EACX,MAAM,QAAQ,SAAS,CAAC,KAAK,GAAG;AACvD,MAAI,QAAQ,WAAW,EACrB;AAEF,QAAM,IAAI,MACR,CACE,4BACA,GAAG,QAAQ,KAAK,SAAS,QAAQ,KAAK,KAAK,IAAI,KAAK,cAAc,CACnE,CAAC,KAAK,KAAK,CACb;;CAGH,aAAa,OAAO,WAIoB;EACtC,MAAM,EAAE,SAAS,MAAM,QAAQ;EAC/B,MAAM,QAAQ,MAAM,SAAS,MAAM;GACjC;GACA,OAAO;IAAC;IAAU;IAAQ;IAAO;GAClC,CAAC;AACF,SAAO,MAAM,KAAK,eAAe,OAAO,QAAQ;;CAGlD,YAAoB,OAAO,SAAsD;AAC/E,MAAI;GACF,MAAM,SAAS,MAAM,KAAK,WAAW;IACnC,SAAS,KAAK;IACd,MAAM,KAAK;IACX,KAAK,QAAQ,KAAK;IACnB,CAAC;GACF,MAAM,WAAW,OAAO,UAAU,OAAO,QAAQ,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,MAAM;AACjF,UAAO;IACL,MAAM,KAAK;IACX,SAAS,KAAK;IACd,IAAI;IACJ;IACA,aAAa,KAAK;IACnB;WACM,OAAO;AACd,UAAO;IACL,MAAM,KAAK;IACX,SAAS,KAAK;IACd,IAAI;IACJ,aAAa,KAAK;IAClB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;IAC9D;;;CAIL,iBAAyB,OACvB,OACA,YACqC;EACrC,MAAM,eAAyB,EAAE;EACjC,MAAM,eAAyB,EAAE;AACjC,QAAM,OAAO,GAAG,SAAS,UAAkB;AACzC,gBAAa,KAAK,MAAM;IACxB;AACF,QAAM,OAAO,GAAG,SAAS,UAAkB;AACzC,gBAAa,KAAK,MAAM;IACxB;EACF,MAAM,WAAW,MAAM,IAAI,SAAwB,SAAS,WAAW;AACrE,SAAM,KAAK,SAAS,OAAO;AAC3B,SAAM,KAAK,QAAQ,QAAQ;IAC3B;EACF,MAAM,SAAS,OAAO,OAAO,aAAa,CAAC,SAAS,QAAQ;EAC5D,MAAM,SAAS,OAAO,OAAO,aAAa,CAAC,SAAS,QAAQ;AAC5D,MAAI,aAAa,EACf,OAAM,IAAI,MAAM,GAAG,QAAQ,eAAe,YAAY,UAAU,IAAI,UAAU,SAAS;AAEzF,SAAO;GACL;GACA;GACD"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { MainRunRequest, MainRunResult } from "./main-runner.types.js";
|
|
2
|
-
|
|
3
|
-
//#region src/runtime/main-runner.service.d.ts
|
|
4
|
-
declare abstract class MainRunnerService {
|
|
5
|
-
abstract runDocumentSummary(request: MainRunRequest): Promise<MainRunResult>;
|
|
6
|
-
}
|
|
7
|
-
//#endregion
|
|
8
|
-
export { MainRunnerService };
|
|
9
|
-
//# sourceMappingURL=main-runner.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"main-runner.service.d.ts","names":[],"sources":["../../src/runtime/main-runner.service.ts"],"mappings":";;;uBAEsB,iBAAA;EAAA,SACX,kBAAA,CAAmB,OAAA,EAAS,cAAA,GAAiB,OAAA,CAAQ,aAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"main-runner.service.js","names":[],"sources":["../../src/runtime/main-runner.service.ts"],"sourcesContent":["import type { MainRunRequest, MainRunResult } from \"./main-runner.types.js\";\n\nexport abstract class MainRunnerService {\n abstract runDocumentSummary(request: MainRunRequest): Promise<MainRunResult>;\n}\n"],"mappings":";AAEA,IAAsB,oBAAtB,MAAwC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"main-runner.types.d.ts","names":[],"sources":["../../src/runtime/main-runner.types.ts"],"mappings":";;;KAEY,wBAAA;EACV,aAAA;EACA,SAAA;AAAA;AAAA,KAGU,cAAA;EACV,MAAA,EAAQ,iBAAA;EACR,KAAA,EAAO,wBAAA;AAAA;AAAA,KAGG,aAAA;EACV,UAAA;EACA,MAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wasm-main-runner.service.d.ts","names":[],"sources":["../../src/runtime/wasm-main-runner.service.ts"],"mappings":";;;;;cAIa,qBAAA,SAA8B,iBAAA;EAAA,iBAEtB,aAAA;cAAA,aAAA,GAAe,wBAAA;EAKlC,kBAAA,GAA4B,OAAA,EAAS,cAAA,KAAiB,OAAA,CAAQ,aAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wasm-main-runner.service.js","names":[],"sources":["../../src/runtime/wasm-main-runner.service.ts"],"sourcesContent":["import { MainRunnerService } from \"./main-runner.service.js\";\nimport type { MainRunRequest, MainRunResult } from \"./main-runner.types.js\";\nimport { WasmSidecarClientService } from \"../sidecar/wasm-sidecar-client.service.js\";\n\nexport class WasmMainRunnerService extends MainRunnerService {\n constructor(\n private readonly sidecarClient: WasmSidecarClientService = new WasmSidecarClientService(),\n ) {\n super();\n }\n\n runDocumentSummary = async (request: MainRunRequest): Promise<MainRunResult> => {\n if (request.bundle.manifest.main.kind !== \"wasm\") {\n throw new Error(\"runDocumentSummary 只支持 main.kind=wasm。\");\n }\n const output = await this.sidecarClient.runExport({\n wasmPath: request.bundle.mainEntryPath,\n exportName: request.bundle.manifest.main.export,\n args: [request.input.documentCount, request.input.textBytes],\n });\n return {\n exportName: request.bundle.manifest.main.export,\n output,\n };\n };\n}\n"],"mappings":";;;AAIA,IAAa,wBAAb,cAA2C,kBAAkB;CAC3D,YACE,gBAA2D,IAAI,0BAA0B,EACzF;AACA,SAAO;AAFU,OAAA,gBAAA;;CAKnB,qBAAqB,OAAO,YAAoD;AAC9E,MAAI,QAAQ,OAAO,SAAS,KAAK,SAAS,OACxC,OAAM,IAAI,MAAM,yCAAyC;EAE3D,MAAM,SAAS,MAAM,KAAK,cAAc,UAAU;GAChD,UAAU,QAAQ,OAAO;GACzB,YAAY,QAAQ,OAAO,SAAS,KAAK;GACzC,MAAM,CAAC,QAAQ,MAAM,eAAe,QAAQ,MAAM,UAAU;GAC7D,CAAC;AACF,SAAO;GACL,YAAY,QAAQ,OAAO,SAAS,KAAK;GACzC;GACD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wasmtime-wasi-http-component.service.d.ts","names":[],"sources":["../../src/runtime/wasmtime-wasi-http-component.service.ts"],"mappings":";;;KAMY,qCAAA;EACV,QAAA;EACA,aAAA;AAAA;AAAA,KAGU,+BAAA;EACV,GAAA;EACA,IAAA;AAAA;AAAA,cAGW,gCAAA;EAAA,QACH,OAAA;EAAA,QACA,MAAA;EAER,KAAA,GACE,OAAA,EAAS,qCAAA,KACR,OAAA,CAAQ,+BAAA;EAqCX,IAAA,QAAiB,OAAA;EAqBjB,aAAA,GACE,OAAA,EAAS,eAAA,EACT,QAAA,EAAU,cAAA,KACT,OAAA;EAAA,QAiCK,QAAA;EAAA,QAQA,kBAAA;EAAA,QAIA,iBAAA;EAAA,QAyBA,cAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wasmtime-wasi-http-component.service.js","names":[],"sources":["../../src/runtime/wasmtime-wasi-http-component.service.ts"],"sourcesContent":["import { spawn, type ChildProcessByStdio } from \"node:child_process\";\nimport { mkdir } from \"node:fs/promises\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport path from \"node:path\";\nimport type { Readable } from \"node:stream\";\n\nexport type WasmtimeWasiHttpComponentStartOptions = {\n wasmPath: string;\n dataDirectory: string;\n};\n\nexport type WasmtimeWasiHttpComponentHandle = {\n url: string;\n port: number;\n};\n\nexport class WasmtimeWasiHttpComponentService {\n private process?: ChildProcessByStdio<null, Readable, Readable>;\n private handle?: WasmtimeWasiHttpComponentHandle;\n\n start = async (\n options: WasmtimeWasiHttpComponentStartOptions,\n ): Promise<WasmtimeWasiHttpComponentHandle> => {\n if (this.process) {\n throw new Error(\"WASI HTTP component 已经启动。\");\n }\n const dataDirectory = path.resolve(options.dataDirectory);\n await mkdir(dataDirectory, { recursive: true });\n const port = await this.findAvailablePort();\n const child = spawn(\n \"wasmtime\",\n [\n \"serve\",\n \"-S\",\n \"cli=y\",\n \"-S\",\n \"http=y\",\n \"-S\",\n \"inherit-network=y\",\n \"--addr\",\n `127.0.0.1:${port}`,\n \"--dir\",\n `${dataDirectory}::/data`,\n options.wasmPath,\n ],\n {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n },\n );\n this.process = child;\n const handle = {\n url: `http://127.0.0.1:${port}`,\n port,\n };\n this.handle = handle;\n await this.waitUntilReady(handle.url, child);\n return handle;\n };\n\n stop = async (): Promise<void> => {\n const child = this.process;\n if (!child) {\n return;\n }\n await new Promise<void>((resolve) => {\n child.once(\"exit\", () => {\n resolve();\n });\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (!child.killed) {\n child.kill(\"SIGKILL\");\n }\n resolve();\n }, 1_000).unref();\n });\n this.process = undefined;\n this.handle = undefined;\n };\n\n handleRequest = async (\n request: IncomingMessage,\n response: ServerResponse,\n ): Promise<boolean> => {\n const handle = this.handle;\n if (!handle) {\n return false;\n }\n const requestUrl = new URL(request.url ?? \"/\", handle.url);\n if (!requestUrl.pathname.startsWith(\"/api/\")) {\n return false;\n }\n const headers = new Headers();\n for (const [key, value] of Object.entries(request.headers)) {\n if (value === undefined || key.toLowerCase() === \"host\") {\n continue;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n headers.append(key, item);\n }\n continue;\n }\n headers.set(key, value);\n }\n const body = await this.readBody(request);\n const upstreamResponse = await fetch(requestUrl, {\n method: request.method,\n headers,\n body: this.methodSupportsBody(request.method) ? body : undefined,\n });\n response.writeHead(upstreamResponse.status, Object.fromEntries(upstreamResponse.headers));\n response.end(Buffer.from(await upstreamResponse.arrayBuffer()));\n return true;\n };\n\n private readBody = async (request: IncomingMessage): Promise<Buffer> => {\n const chunks: Buffer[] = [];\n for await (const chunk of request) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks);\n };\n\n private methodSupportsBody = (method: string | undefined): boolean => {\n return method !== undefined && method !== \"GET\" && method !== \"HEAD\";\n };\n\n private findAvailablePort = async (): Promise<number> => {\n const server = createServer();\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(0, \"127.0.0.1\", () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n const address = server.address();\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n if (!address || typeof address === \"string\") {\n throw new Error(\"无法分配 WASI HTTP component 端口。\");\n }\n return address.port;\n };\n\n private waitUntilReady = async (\n url: string,\n child: ChildProcessByStdio<null, Readable, Readable>,\n ): Promise<void> => {\n const errors: string[] = [];\n child.stderr.on(\"data\", (chunk: Buffer) => {\n errors.push(chunk.toString(\"utf-8\"));\n });\n for (let attempt = 0; attempt < 50; attempt += 1) {\n if (child.exitCode !== null) {\n throw new Error(\n `WASI HTTP component 启动失败:${errors.join(\"\").trim() || `exit ${child.exitCode}`}`,\n );\n }\n try {\n await fetch(url);\n return;\n } catch {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n throw new Error(`WASI HTTP component 启动超时:${errors.join(\"\").trim()}`);\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wasm-sidecar-client.service.d.ts","names":[],"sources":["../../src/sidecar/wasm-sidecar-client.service.ts"],"mappings":";cAaa,wBAAA;EACX,SAAA,GAAmB,MAAA;IACjB,QAAA;IACA,UAAA;IACA,IAAA;EAAA,MACE,OAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wasm-sidecar-client.service.js","names":[],"sources":["../../src/sidecar/wasm-sidecar-client.service.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\n\ntype WasmRuntime = {\n instantiate(\n wasmBytes: Buffer,\n imports: Record<string, unknown>,\n ): Promise<{\n instance: {\n exports: Record<string, unknown>;\n };\n }>;\n};\n\nexport class WasmSidecarClientService {\n runExport = async (params: {\n wasmPath: string;\n exportName: string;\n args: number[];\n }): Promise<number> => {\n const { wasmPath, exportName, args } = params;\n const wasmBytes = await readFile(wasmPath);\n const wasmRuntime = (globalThis as typeof globalThis & { WebAssembly?: WasmRuntime })\n .WebAssembly;\n if (!wasmRuntime) {\n throw new Error(\"当前 Node 运行时不支持 WebAssembly。\");\n }\n const instance = await wasmRuntime.instantiate(wasmBytes, {});\n const exported = instance.instance.exports[exportName];\n if (typeof exported !== \"function\") {\n throw new Error(`Wasm 导出不存在或不可调用:${exportName}`);\n }\n const result = exported(...args);\n if (typeof result !== \"number\") {\n throw new Error(`Wasm 导出 ${exportName} 必须返回 number。`);\n }\n return result;\n };\n}\n"],"mappings":";;AAaA,IAAa,2BAAb,MAAsC;CACpC,YAAY,OAAO,WAII;EACrB,MAAM,EAAE,UAAU,YAAY,SAAS;EACvC,MAAM,YAAY,MAAM,SAAS,SAAS;EAC1C,MAAM,cAAe,WAClB;AACH,MAAI,CAAC,YACH,OAAM,IAAI,MAAM,8BAA8B;EAGhD,MAAM,YADW,MAAM,YAAY,YAAY,WAAW,EAAE,CAAC,EACnC,SAAS,QAAQ;AAC3C,MAAI,OAAO,aAAa,WACtB,OAAM,IAAI,MAAM,mBAAmB,aAAa;EAElD,MAAM,SAAS,SAAS,GAAG,KAAK;AAChC,MAAI,OAAO,WAAW,SACpB,OAAM,IAAI,MAAM,WAAW,WAAW,eAAe;AAEvD,SAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ui-server.service.d.ts","names":[],"sources":["../../src/ui/ui-server.service.ts"],"mappings":";;;;cAca,eAAA;EAAA,iBACkB,MAAA;cAAA,MAAA,EAAQ,iBAAA;EAErC,MAAA,GACE,OAAA,EAAS,eAAA,EACT,QAAA,EAAU,cAAA,KACT,OAAA;EAAA,QA8BK,kBAAA;EAAA,QAKA,MAAA;EAAA,QASA,wBAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ui-server.service.js","names":[],"sources":["../../src/ui/ui-server.service.ts"],"sourcesContent":["import { access, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { AppManifestBundle } from \"../manifest/app-manifest.types.js\";\n\nconst CONTENT_TYPE_BY_EXTENSION: Record<string, string> = {\n \".css\": \"text/css; charset=utf-8\",\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".png\": \"image/png\",\n \".svg\": \"image/svg+xml; charset=utf-8\",\n};\n\nexport class UiServerService {\n constructor(private readonly bundle: AppManifestBundle) {}\n\n handle = async (\n request: IncomingMessage,\n response: ServerResponse,\n ): Promise<boolean> => {\n const requestUrl = new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n const requestPath = requestUrl.pathname === \"/\" ? \"/index.html\" : requestUrl.pathname;\n const candidatePaths = [\n path.join(this.bundle.uiDirectoryPath, requestPath.slice(1)),\n path.join(this.bundle.assetsDirectoryPath, requestPath.slice(1)),\n ];\n\n for (const candidatePath of candidatePaths) {\n if (!(await this.isInsideAllowedDirectory(candidatePath))) {\n continue;\n }\n if (!(await this.exists(candidatePath))) {\n continue;\n }\n const content = await readFile(candidatePath);\n response.writeHead(200, {\n \"content-type\": this.resolveContentType(candidatePath),\n });\n response.end(content);\n return true;\n }\n\n response.writeHead(404, {\n \"content-type\": \"text/plain; charset=utf-8\",\n });\n response.end(`Not found: ${requestPath}`);\n return true;\n };\n\n private resolveContentType = (filePath: string): string => {\n const extension = path.extname(filePath).toLowerCase();\n return CONTENT_TYPE_BY_EXTENSION[extension] ?? \"application/octet-stream\";\n };\n\n private exists = async (filePath: string): Promise<boolean> => {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n };\n\n private isInsideAllowedDirectory = async (candidatePath: string): Promise<boolean> => {\n const allowedDirectories = [this.bundle.uiDirectoryPath, this.bundle.assetsDirectoryPath];\n return allowedDirectories.some((directoryPath) => {\n const relative = path.relative(directoryPath, candidatePath);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n });\n };\n}\n"],"mappings":";;;AAKA,MAAM,4BAAoD;CACxD,QAAQ;CACR,SAAS;CACT,OAAO;CACP,SAAS;CACT,QAAQ;CACR,QAAQ;CACT;AAED,IAAa,kBAAb,MAA6B;CAC3B,YAAY,QAA4C;AAA3B,OAAA,SAAA;;CAE7B,SAAS,OACP,SACA,aACqB;EACrB,MAAM,aAAa,IAAI,IAAI,QAAQ,OAAO,KAAK,mBAAmB;EAClE,MAAM,cAAc,WAAW,aAAa,MAAM,gBAAgB,WAAW;EAC7E,MAAM,iBAAiB,CACrB,KAAK,KAAK,KAAK,OAAO,iBAAiB,YAAY,MAAM,EAAE,CAAC,EAC5D,KAAK,KAAK,KAAK,OAAO,qBAAqB,YAAY,MAAM,EAAE,CAAC,CACjE;AAED,OAAK,MAAM,iBAAiB,gBAAgB;AAC1C,OAAI,CAAE,MAAM,KAAK,yBAAyB,cAAc,CACtD;AAEF,OAAI,CAAE,MAAM,KAAK,OAAO,cAAc,CACpC;GAEF,MAAM,UAAU,MAAM,SAAS,cAAc;AAC7C,YAAS,UAAU,KAAK,EACtB,gBAAgB,KAAK,mBAAmB,cAAc,EACvD,CAAC;AACF,YAAS,IAAI,QAAQ;AACrB,UAAO;;AAGT,WAAS,UAAU,KAAK,EACtB,gBAAgB,6BACjB,CAAC;AACF,WAAS,IAAI,cAAc,cAAc;AACzC,SAAO;;CAGT,sBAA8B,aAA6B;AAEzD,SAAO,0BADW,KAAK,QAAQ,SAAS,CAAC,aAAa,KACP;;CAGjD,SAAiB,OAAO,aAAuC;AAC7D,MAAI;AACF,SAAM,OAAO,SAAS;AACtB,UAAO;UACD;AACN,UAAO;;;CAIX,2BAAmC,OAAO,kBAA4C;AAEpF,SAD2B,CAAC,KAAK,OAAO,iBAAiB,KAAK,OAAO,oBAAoB,CAC/D,MAAM,kBAAkB;GAChD,MAAM,WAAW,KAAK,SAAS,eAAe,cAAc;AAC5D,UAAO,aAAa,MAAO,CAAC,SAAS,WAAW,KAAK,IAAI,CAAC,KAAK,WAAW,SAAS;IACnF"}
|
|
File without changes
|