@undefineds.co/xpod 0.1.7 → 0.2.0-preview.2
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 +141 -2
- package/config/cli.json +9 -71
- package/config/cloud.json +34 -7
- package/config/local.json +6 -2
- package/config/resolver.json +11 -49
- package/config/runtime-open.json +22 -0
- package/config/xpod.base.json +32 -0
- package/config/xpod.cluster.json +2 -44
- package/config/xpod.json +5 -2
- package/dist/api/auth/AuthContext.d.ts +12 -1
- package/dist/api/auth/AuthContext.js +18 -1
- package/dist/api/auth/AuthContext.js.map +1 -1
- package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
- package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
- package/dist/api/auth/ServiceTokenAuthenticator.d.ts +18 -0
- package/dist/api/auth/ServiceTokenAuthenticator.js +50 -0
- package/dist/api/auth/ServiceTokenAuthenticator.js.map +1 -0
- package/dist/api/auth/index.d.ts +1 -0
- package/dist/api/auth/index.js +1 -0
- package/dist/api/auth/index.js.map +1 -1
- package/dist/api/chatkit/ai-provider.d.ts +0 -10
- package/dist/api/chatkit/ai-provider.js +11 -120
- package/dist/api/chatkit/ai-provider.js.map +1 -1
- package/dist/api/chatkit/default-agent.js +11 -8
- package/dist/api/chatkit/default-agent.js.map +1 -1
- package/dist/api/chatkit/pod-store.js +19 -3
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/chatkit/schema.d.ts +9 -3
- package/dist/api/chatkit/schema.js +14 -6
- package/dist/api/chatkit/schema.js.map +1 -1
- package/dist/api/container/business-token.d.ts +9 -0
- package/dist/api/container/business-token.js +32 -0
- package/dist/api/container/business-token.js.map +1 -0
- package/dist/api/container/cloud.js +36 -12
- package/dist/api/container/cloud.js.map +1 -1
- package/dist/api/container/common.js +12 -5
- package/dist/api/container/common.js.map +1 -1
- package/dist/api/container/index.js +94 -14
- package/dist/api/container/index.js.map +1 -1
- package/dist/api/container/local.js +2 -1
- package/dist/api/container/local.js.map +1 -1
- package/dist/api/container/routes.js +81 -9
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +8 -6
- package/dist/api/container/types.js.map +1 -1
- package/dist/api/handlers/AdminHandler.js +9 -9
- package/dist/api/handlers/AdminHandler.js.map +1 -1
- package/dist/api/handlers/ApiKeyHandler.js +0 -6
- package/dist/api/handlers/ApiKeyHandler.js.map +1 -1
- package/dist/api/handlers/EdgeNodeSignalHandler.d.ts +17 -0
- package/dist/api/handlers/EdgeNodeSignalHandler.js +171 -0
- package/dist/api/handlers/EdgeNodeSignalHandler.js.map +1 -0
- package/dist/api/handlers/PodManagementHandler.d.ts +5 -4
- package/dist/api/handlers/PodManagementHandler.js +11 -10
- package/dist/api/handlers/PodManagementHandler.js.map +1 -1
- package/dist/api/handlers/ProvisionHandler.d.ts +42 -0
- package/dist/api/handlers/ProvisionHandler.js +161 -0
- package/dist/api/handlers/ProvisionHandler.js.map +1 -0
- package/dist/api/handlers/QuotaHandler.d.ts +7 -7
- package/dist/api/handlers/QuotaHandler.js +143 -73
- package/dist/api/handlers/QuotaHandler.js.map +1 -1
- package/dist/api/handlers/SubdomainClientHandler.js +2 -2
- package/dist/api/handlers/SubdomainClientHandler.js.map +1 -1
- package/dist/api/handlers/SubdomainHandler.js +13 -8
- package/dist/api/handlers/SubdomainHandler.js.map +1 -1
- package/dist/api/handlers/UsageHandler.d.ts +14 -0
- package/dist/api/handlers/UsageHandler.js +123 -0
- package/dist/api/handlers/UsageHandler.js.map +1 -0
- package/dist/api/handlers/index.d.ts +3 -1
- package/dist/api/handlers/index.js +3 -1
- package/dist/api/handlers/index.js.map +1 -1
- package/dist/api/main.js +18 -0
- package/dist/api/main.js.map +1 -1
- package/dist/api/middleware/OpenAuthMiddleware.d.ts +12 -0
- package/dist/api/middleware/OpenAuthMiddleware.js +27 -0
- package/dist/api/middleware/OpenAuthMiddleware.js.map +1 -0
- package/dist/api/runtime.d.ts +15 -0
- package/dist/api/runtime.js +104 -0
- package/dist/api/runtime.js.map +1 -0
- package/dist/api/service/VercelChatService.d.ts +16 -7
- package/dist/api/service/VercelChatService.js +98 -178
- package/dist/api/service/VercelChatService.js.map +1 -1
- package/dist/api/store/DrizzleClientCredentialsStore.d.ts +6 -11
- package/dist/api/store/DrizzleClientCredentialsStore.js +9 -39
- package/dist/api/store/DrizzleClientCredentialsStore.js.map +1 -1
- package/dist/authorization/AuthModeSelector.d.ts +10 -0
- package/dist/authorization/AuthModeSelector.js +27 -0
- package/dist/authorization/AuthModeSelector.js.map +1 -0
- package/dist/authorization/AuthModeSelector.jsonld +81 -0
- package/dist/cli/commands/account.d.ts +6 -0
- package/dist/cli/commands/account.js +119 -0
- package/dist/cli/commands/account.js.map +1 -0
- package/dist/cli/commands/auth.js +20 -29
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/backup.d.ts +15 -0
- package/dist/cli/commands/backup.js +286 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/config.d.ts +34 -3
- package/dist/cli/commands/config.js +195 -258
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +6 -0
- package/dist/cli/commands/doctor.js +94 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/pod.d.ts +6 -0
- package/dist/cli/commands/pod.js +124 -0
- package/dist/cli/commands/pod.js.map +1 -0
- package/dist/cli/commands/start.js +28 -5
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lib/credentials-store.d.ts +17 -0
- package/dist/cli/lib/credentials-store.js +73 -0
- package/dist/cli/lib/credentials-store.js.map +1 -0
- package/dist/cli/lib/css-account.d.ts +17 -0
- package/dist/cli/lib/css-account.js +56 -0
- package/dist/cli/lib/css-account.js.map +1 -1
- package/dist/cli/lib/pod-thread-store.d.ts +57 -0
- package/dist/cli/lib/pod-thread-store.js +310 -0
- package/dist/cli/lib/pod-thread-store.js.map +1 -0
- package/dist/cli/lib/solid-auth.d.ts +20 -0
- package/dist/cli/lib/solid-auth.js +70 -0
- package/dist/cli/lib/solid-auth.js.map +1 -0
- package/dist/components/components.jsonld +5 -8
- package/dist/components/context.jsonld +114 -244
- package/dist/edge/EdgeNodeAgent.js +2 -2
- package/dist/edge/EdgeNodeAgent.js.map +1 -1
- package/dist/edge/EdgeNodeDnsCoordinator.d.ts +1 -7
- package/dist/edge/EdgeNodeDnsCoordinator.js +31 -41
- package/dist/edge/EdgeNodeDnsCoordinator.js.map +1 -1
- package/dist/edge/EdgeNodeDnsCoordinator.jsonld +1 -27
- package/dist/edge/EdgeNodeModeDetector.d.ts +1 -1
- package/dist/edge/EdgeNodeModeDetector.js +9 -11
- package/dist/edge/EdgeNodeModeDetector.js.map +1 -1
- package/dist/http/ClusterIngressRouter.js +3 -3
- package/dist/http/ClusterIngressRouter.js.map +1 -1
- package/dist/http/ClusterWebSocketConfigurator.js +2 -2
- package/dist/http/ClusterWebSocketConfigurator.js.map +1 -1
- package/dist/http/PodRoutingHttpHandler.js +2 -2
- package/dist/http/PodRoutingHttpHandler.js.map +1 -1
- package/dist/http/cluster/PodMigrationHttpHandler.d.ts +1 -1
- package/dist/http/cluster/PodMigrationHttpHandler.js +1 -1
- package/dist/http/cluster/PodMigrationHttpHandler.js.map +1 -1
- package/dist/identity/drizzle/EdgeNodeRepository.d.ts +37 -4
- package/dist/identity/drizzle/EdgeNodeRepository.js +120 -128
- package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -1
- package/dist/identity/drizzle/ServiceTokenRepository.d.ts +52 -0
- package/dist/identity/drizzle/ServiceTokenRepository.js +143 -0
- package/dist/identity/drizzle/ServiceTokenRepository.js.map +1 -0
- package/dist/identity/drizzle/db.d.ts +9 -0
- package/dist/identity/drizzle/db.js +208 -1
- package/dist/identity/drizzle/db.js.map +1 -1
- package/dist/identity/drizzle/schema.pg.d.ts +5 -0
- package/dist/identity/drizzle/schema.pg.js +49 -20
- package/dist/identity/drizzle/schema.pg.js.map +1 -1
- package/dist/identity/drizzle/schema.sqlite.d.ts +332 -57
- package/dist/identity/drizzle/schema.sqlite.js +48 -18
- package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +6 -4
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
- package/dist/index.d.ts +6 -9
- package/dist/index.js +12 -14
- package/dist/index.js.map +1 -1
- package/dist/main.js +25 -8
- package/dist/main.js.map +1 -1
- package/dist/provision/ProvisionCodeCodec.d.ts +39 -0
- package/dist/provision/ProvisionCodeCodec.js +65 -0
- package/dist/provision/ProvisionCodeCodec.js.map +1 -0
- package/dist/provision/ProvisionCodeCodec.jsonld +47 -0
- package/dist/provision/ProvisionPodCreator.d.ts +20 -0
- package/dist/provision/ProvisionPodCreator.js +84 -0
- package/dist/provision/ProvisionPodCreator.js.map +1 -0
- package/dist/provision/ProvisionPodCreator.jsonld +118 -0
- package/dist/quota/DrizzleQuotaService.d.ts +17 -3
- package/dist/quota/DrizzleQuotaService.js +108 -8
- package/dist/quota/DrizzleQuotaService.js.map +1 -1
- package/dist/quota/DrizzleQuotaService.jsonld +33 -22
- package/dist/quota/NoopQuotaService.d.ts +7 -1
- package/dist/quota/NoopQuotaService.js +12 -0
- package/dist/quota/NoopQuotaService.js.map +1 -1
- package/dist/quota/NoopQuotaService.jsonld +24 -0
- package/dist/quota/QuotaService.d.ts +17 -0
- package/dist/quota/QuotaService.js +5 -0
- package/dist/quota/QuotaService.js.map +1 -1
- package/dist/quota/QuotaService.jsonld +50 -0
- package/dist/runtime/Proxy.d.ts +22 -4
- package/dist/runtime/Proxy.js +154 -35
- package/dist/runtime/Proxy.js.map +1 -1
- package/dist/runtime/XpodRuntime.d.ts +49 -0
- package/dist/runtime/XpodRuntime.js +374 -0
- package/dist/runtime/XpodRuntime.js.map +1 -0
- package/dist/runtime/env-utils.d.ts +2 -0
- package/dist/runtime/env-utils.js +55 -0
- package/dist/runtime/env-utils.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +8 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/socket-fetch.d.ts +1 -0
- package/dist/runtime/socket-fetch.js +72 -0
- package/dist/runtime/socket-fetch.js.map +1 -0
- package/dist/runtime/socket-http.d.ts +1 -0
- package/dist/runtime/socket-http.js +142 -0
- package/dist/runtime/socket-http.js.map +1 -0
- package/dist/runtime/socket-utils.d.ts +2 -0
- package/dist/runtime/socket-utils.js +34 -0
- package/dist/runtime/socket-utils.js.map +1 -0
- package/dist/service/{EdgeNodeHeartbeatService.d.ts → EdgeNodeSignalClient.d.ts} +3 -3
- package/dist/service/{EdgeNodeHeartbeatService.js → EdgeNodeSignalClient.js} +4 -4
- package/dist/service/EdgeNodeSignalClient.js.map +1 -0
- package/dist/service/PodMigrationService.d.ts +1 -2
- package/dist/service/PodMigrationService.js +1 -2
- package/dist/service/PodMigrationService.js.map +1 -1
- package/dist/storage/SparqlUpdateResourceStore.js +1 -1
- package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
- package/dist/storage/accessors/MinioDataAccessor.d.ts +6 -0
- package/dist/storage/accessors/MinioDataAccessor.js +10 -0
- package/dist/storage/accessors/MinioDataAccessor.js.map +1 -1
- package/dist/storage/accessors/MinioDataAccessor.jsonld +4 -0
- package/dist/storage/accessors/MixDataAccessor.d.ts +2 -1
- package/dist/storage/accessors/MixDataAccessor.js +12 -1
- package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
- package/dist/storage/accessors/MixDataAccessor.jsonld +19 -0
- package/dist/storage/locking/UrlAwareRedisLocker.d.ts +18 -0
- package/dist/storage/locking/UrlAwareRedisLocker.js +60 -0
- package/dist/storage/locking/UrlAwareRedisLocker.js.map +1 -0
- package/dist/storage/locking/UrlAwareRedisLocker.jsonld +123 -0
- package/dist/storage/quota/UsageRepository.d.ts +41 -8
- package/dist/storage/quota/UsageRepository.js +252 -50
- package/dist/storage/quota/UsageRepository.js.map +1 -1
- package/dist/storage/sparql/ComunicaQuintEngine.d.ts +9 -0
- package/dist/storage/sparql/ComunicaQuintEngine.js +50 -9
- package/dist/storage/sparql/ComunicaQuintEngine.js.map +1 -1
- package/dist/storage/sparql/QueryOptimizer.js +13 -1
- package/dist/storage/sparql/QueryOptimizer.js.map +1 -1
- package/dist/storage/sparql/QuintQuerySource.d.ts +14 -0
- package/dist/storage/sparql/QuintQuerySource.js +152 -1
- package/dist/storage/sparql/QuintQuerySource.js.map +1 -1
- package/dist/storage/sparql/SubgraphQueryEngine.d.ts +1 -0
- package/dist/storage/sparql/SubgraphQueryEngine.js +6 -2
- package/dist/storage/sparql/SubgraphQueryEngine.js.map +1 -1
- package/dist/storage/sparql/SubgraphQueryEngine.jsonld +4 -0
- package/dist/subdomain/SubdomainClient.d.ts +3 -3
- package/dist/subdomain/SubdomainClient.js +1 -1
- package/dist/subdomain/SubdomainClient.js.map +1 -1
- package/dist/subdomain/SubdomainService.d.ts +15 -16
- package/dist/subdomain/SubdomainService.js +80 -54
- package/dist/subdomain/SubdomainService.js.map +1 -1
- package/dist/subdomain/SubdomainService.jsonld +22 -26
- package/dist/supervisor/Supervisor.d.ts +7 -2
- package/dist/supervisor/Supervisor.js +33 -1
- package/dist/supervisor/Supervisor.js.map +1 -1
- package/dist/test-utils/index.d.ts +4 -0
- package/dist/test-utils/index.js +8 -0
- package/dist/test-utils/index.js.map +1 -0
- package/dist/test-utils/no-auth-xpod.d.ts +11 -0
- package/dist/test-utils/no-auth-xpod.js +25 -0
- package/dist/test-utils/no-auth-xpod.js.map +1 -0
- package/dist/test-utils/seed-pod.d.ts +5 -0
- package/dist/test-utils/seed-pod.js +61 -0
- package/dist/test-utils/seed-pod.js.map +1 -0
- package/package.json +23 -5
- package/templates/identity/account/create-pod.html.ejs +110 -0
- package/templates/main.html.ejs +10 -0
- package/dist/api/handlers/DevHandler.d.ts +0 -18
- package/dist/api/handlers/DevHandler.js +0 -276
- package/dist/api/handlers/DevHandler.js.map +0 -1
- package/dist/api/handlers/SignalHandler.d.ts +0 -13
- package/dist/api/handlers/SignalHandler.js +0 -122
- package/dist/api/handlers/SignalHandler.js.map +0 -1
- package/dist/gateway/Proxy.d.ts +0 -24
- package/dist/gateway/Proxy.js +0 -209
- package/dist/gateway/Proxy.js.map +0 -1
- package/dist/gateway/Supervisor.d.ts +0 -2
- package/dist/gateway/Supervisor.js +0 -7
- package/dist/gateway/Supervisor.js.map +0 -1
- package/dist/gateway/port-finder.d.ts +0 -4
- package/dist/gateway/port-finder.js +0 -15
- package/dist/gateway/port-finder.js.map +0 -1
- package/dist/gateway/types.d.ts +0 -1
- package/dist/gateway/types.js +0 -3
- package/dist/gateway/types.js.map +0 -1
- package/dist/http/SignalInterceptHttpHandler.d.ts +0 -24
- package/dist/http/SignalInterceptHttpHandler.js +0 -47
- package/dist/http/SignalInterceptHttpHandler.js.map +0 -1
- package/dist/http/SignalInterceptHttpHandler.jsonld +0 -103
- package/dist/http/admin/EdgeNodeSignalHttpHandler.d.ts +0 -71
- package/dist/http/admin/EdgeNodeSignalHttpHandler.js +0 -674
- package/dist/http/admin/EdgeNodeSignalHttpHandler.js.map +0 -1
- package/dist/http/admin/EdgeNodeSignalHttpHandler.jsonld +0 -406
- package/dist/http/cluster/PodMigrationHttpHandler.jsonld +0 -169
- package/dist/quota/DefaultQuotaService.d.ts +0 -16
- package/dist/quota/DefaultQuotaService.js +0 -37
- package/dist/quota/DefaultQuotaService.js.map +0 -1
- package/dist/quota/DefaultQuotaService.jsonld +0 -85
- package/dist/service/EdgeNodeHeartbeatService.js.map +0 -1
- package/dist/service/PodMigrationService.jsonld +0 -76
- package/dist/storage/MigratableDataAccessor.d.ts +0 -63
- package/dist/storage/MigratableDataAccessor.js +0 -11
- package/dist/storage/MigratableDataAccessor.js.map +0 -1
- package/dist/storage/MigratableDataAccessor.jsonld +0 -60
- package/dist/storage/accessors/TieredMinioDataAccessor.d.ts +0 -150
- package/dist/storage/accessors/TieredMinioDataAccessor.js +0 -582
- package/dist/storage/accessors/TieredMinioDataAccessor.js.map +0 -1
- package/dist/storage/accessors/TieredMinioDataAccessor.jsonld +0 -333
- package/static/app/assets/index.css +0 -1
- package/static/app/assets/main.js +0 -11
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { createHash } from 'crypto';\nimport { spawn } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport { setGlobalLoggerFactory, getLoggerFor } from 'global-logger-factory';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { GatewayProxy, getFreePort, PACKAGE_ROOT } from './runtime';\nimport { ConfigurableLoggerFactory } from './logging/ConfigurableLoggerFactory';\nimport { Supervisor } from './supervisor';\n\ninterface RuntimeRecord {\n schemaVersion: '1.0';\n pid: number;\n mode: 'local' | 'cloud';\n port: number;\n baseUrl: string;\n publicUrl?: string;\n envPath?: string;\n configPath: string;\n startTime: string;\n}\n\ninterface HealthReport {\n schemaVersion: '1.0';\n healthy: boolean;\n checks: {\n gateway: 'pass' | 'fail';\n css: 'pass' | 'fail';\n api: 'pass' | 'fail';\n };\n timestamp: string;\n}\n\ninterface RunOptions {\n mode?: 'local' | 'cloud';\n config?: string;\n env?: string;\n port?: number;\n host?: string;\n}\n\nconst EXIT_OK = 0;\nconst EXIT_NOT_RUNNING = 10;\nconst EXIT_CONFIG_ERROR = 20;\nconst EXIT_INTERNAL_ERROR = 50;\n\nlet logger = getLoggerFor('Main');\n\nfunction initLogger(): void {\n const loggerFactory = new ConfigurableLoggerFactory(process.env.CSS_LOGGING_LEVEL || 'info', {\n fileName: path.join(process.cwd(), 'logs/xpod-%DATE%.log'),\n showLocation: true,\n });\n setGlobalLoggerFactory(loggerFactory);\n logger = getLoggerFor('Main');\n}\n\nfunction loadEnvFile(envPath: string): void {\n if (!fs.existsSync(envPath)) {\n throw new Error(`Env file not found: ${envPath}`);\n }\n\n const content = fs.readFileSync(envPath, 'utf-8');\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n\n process.env[key] = value;\n }\n}\n\nfunction ensureTrailingSlash(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n}\n\nfunction resolveInstanceKey(envPath?: string): string {\n if (!envPath) {\n return 'default';\n }\n const abs = path.resolve(envPath);\n return createHash('sha256').update(abs).digest('hex').slice(0, 12);\n}\n\nfunction getRuntimeFilePath(envPath?: string): string {\n const dir = path.join(process.cwd(), '.xpod/runtime');\n return path.join(dir, `${resolveInstanceKey(envPath)}.json`);\n}\n\nfunction saveRuntimeRecord(record: RuntimeRecord): void {\n const filePath = getRuntimeFilePath(record.envPath);\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, JSON.stringify(record, null, 2), 'utf-8');\n}\n\nfunction loadRuntimeRecord(envPath?: string): RuntimeRecord | undefined {\n const filePath = getRuntimeFilePath(envPath);\n if (!fs.existsSync(filePath)) {\n return undefined;\n }\n\n try {\n return JSON.parse(fs.readFileSync(filePath, 'utf-8')) as RuntimeRecord;\n } catch {\n return undefined;\n }\n}\n\nfunction deleteRuntimeRecord(envPath?: string): void {\n const filePath = getRuntimeFilePath(envPath);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n}\n\nfunction isProcessRunning(pid?: number): boolean {\n if (!pid || pid <= 0) {\n return false;\n }\n\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getVersion(): string {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(PACKAGE_ROOT, 'package.json'), 'utf-8')) as { version?: string };\n return pkg.version ?? 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nasync function checkGateway(baseUrl: string): Promise<boolean> {\n try {\n // Gateway internal endpoints are exposed under /service/* (legacy /_gateway/* has been removed).\n const res = await fetch(new URL('/service/status', ensureTrailingSlash(baseUrl)), {\n signal: AbortSignal.timeout(3000),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\nasync function checkCss(baseUrl: string): Promise<boolean> {\n try {\n // Prefer supervisor status rather than probing CSS routes which can fail on identifier-space/host mismatch.\n const res = await fetch(new URL('/service/status', ensureTrailingSlash(baseUrl)), {\n signal: AbortSignal.timeout(3000),\n });\n if (!res.ok) {\n return false;\n }\n const items = (await res.json()) as Array<{ name?: string; status?: string }>;\n const css = items.find((it) => it?.name === 'css');\n return css?.status === 'running';\n } catch {\n return false;\n }\n}\nasync function checkApi(baseUrl: string): Promise<boolean> {\n try {\n const res = await fetch(new URL('/service/status', ensureTrailingSlash(baseUrl)), {\n signal: AbortSignal.timeout(3000),\n });\n if (!res.ok) {\n return false;\n }\n const items = (await res.json()) as Array<{ name?: string; status?: string }>;\n const api = items.find((it) => it?.name === 'api');\n return api?.status === 'running';\n } catch {\n return false;\n }\n}\nasync function buildHealth(baseUrl: string): Promise<HealthReport> {\n const gateway = await checkGateway(baseUrl);\n const css = await checkCss(baseUrl);\n const api = await checkApi(baseUrl);\n\n return {\n schemaVersion: '1.0',\n healthy: gateway && css && api,\n checks: {\n gateway: gateway ? 'pass' : 'fail',\n css: css ? 'pass' : 'fail',\n api: api ? 'pass' : 'fail',\n },\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction outputJson(payload: unknown): void {\n process.stdout.write(`${JSON.stringify(payload)}\\n`);\n}\n\nfunction exitForCliError(error: unknown): never {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Failed to start: ${message}`);\n if (message.includes('Env file not found:') || message.includes('Config file not found:')) {\n process.exit(EXIT_CONFIG_ERROR);\n }\n process.exit(EXIT_INTERNAL_ERROR);\n}\n\nasync function startRuntime(options: RunOptions): Promise<void> {\n initLogger();\n const resolvedEnvPath = options.env ? path.resolve(options.env) : undefined;\n if (resolvedEnvPath) {\n process.env.XPOD_ENV_PATH = resolvedEnvPath;\n loadEnvFile(resolvedEnvPath);\n }\n\n const requestedPort = options.port !== undefined ? Number(options.port) : Number.NaN;\n const mainPort = Number.isFinite(requestedPort)\n ? requestedPort\n : parseInt(process.env.XPOD_PORT ?? process.env.PORT ?? '3000', 10);\n const host = options.host ?? '127.0.0.1';\n\n let configPath = path.join(PACKAGE_ROOT, 'config/local.json');\n if (options.config) {\n configPath = options.config;\n } else if (options.mode) {\n configPath = path.join(PACKAGE_ROOT, `config/${options.mode}.json`);\n }\n\n if (!fs.existsSync(configPath)) {\n throw new Error(`Config file not found: ${configPath}`);\n }\n\n const mode: 'local' | 'cloud' = options.mode ?? (configPath.includes('cloud') ? 'cloud' : 'local');\n\n const cssPort = await getFreePort(mainPort + 1);\n const apiPort = await getFreePort(cssPort + 1);\n const baseUrl = ensureTrailingSlash(process.env.CSS_BASE_URL || `http://${host}:${mainPort}`);\n\n // Make sure GatewayProxy has access to the effective baseUrl for host rewrites.\n process.env.CSS_BASE_URL = baseUrl;\n\n logger.info('Orchestration Plan:');\n logger.info(` - Main Entry: ${baseUrl} (${host}:${mainPort})`);\n logger.info(` - CSS (internal): http://localhost:${cssPort}`);\n logger.info(` - API (internal): http://localhost:${apiPort}`);\n\n const supervisor = new Supervisor();\n const cssBinary = require.resolve('@solid/community-server/bin/server.js');\n const cssModuleRoot = path.dirname(require.resolve('@solid/community-server/package.json'));\n\n supervisor.register({\n name: 'css',\n command: process.execPath,\n args: [\n cssBinary,\n '-c', configPath,\n '-m', cssModuleRoot,\n '-p', cssPort.toString(),\n '-b', baseUrl,\n ],\n env: {\n ...process.env,\n CSS_PORT: cssPort.toString(),\n CSS_BASE_URL: baseUrl,\n },\n });\n\n supervisor.register({\n name: 'api',\n command: process.execPath,\n args: [path.join(__dirname, 'api', 'main.js')],\n env: {\n ...process.env,\n API_PORT: apiPort.toString(),\n XPOD_MAIN_PORT: mainPort.toString(),\n CSS_INTERNAL_URL: `http://localhost:${cssPort}`,\n CSS_BASE_URL: baseUrl,\n CSS_TOKEN_ENDPOINT: `${baseUrl}.oidc/token`,\n },\n });\n\n // Default bind host: prefer explicit XPOD_LISTEN_HOST; otherwise derive from the public Base URL.\n // In local dev/sandboxed environments, binding 0.0.0.0 can fail with EPERM.\n const bindHost = process.env.XPOD_LISTEN_HOST || (() => {\n try {\n const hostname = new URL(baseUrl).hostname;\n if (hostname === 'localhost') return '127.0.0.1';\n if (hostname === '::1') return '::1';\n if (hostname.startsWith('127.')) return hostname;\n } catch {\n // ignore\n }\n return '0.0.0.0';\n })();\n\n const proxy = new GatewayProxy(mainPort, supervisor, bindHost);\n proxy.setTargets({\n css: `http://localhost:${cssPort}`,\n api: `http://localhost:${apiPort}`,\n });\n\n await supervisor.startAll();\n proxy.start();\n\n let restarting = false;\n const restart = async(): Promise<void> => {\n if (restarting) {\n return;\n }\n restarting = true;\n\n logger.info('Received SIGUSR1, restarting...');\n\n // Remove runtime record first so status does not point at a process going down.\n deleteRuntimeRecord(resolvedEnvPath);\n\n try {\n await proxy.stop();\n } catch (err) {\n logger.warn(`Failed to stop gateway server: ${String(err)}`);\n }\n\n await supervisor.stopAll();\n\n // Reload env from file (dashboard writes into the env file).\n if (resolvedEnvPath) {\n loadEnvFile(resolvedEnvPath);\n process.env.XPOD_ENV_PATH = resolvedEnvPath;\n }\n\n const child = spawn(process.execPath, process.argv.slice(1), {\n stdio: 'inherit',\n env: process.env,\n });\n child.unref();\n process.exit(EXIT_OK);\n };\n\n process.on('SIGUSR1', () => {\n void restart();\n });\n\n saveRuntimeRecord({\n schemaVersion: '1.0',\n pid: process.pid,\n mode,\n port: mainPort,\n baseUrl,\n publicUrl: process.env.CSS_PUBLIC_URL,\n envPath: resolvedEnvPath,\n configPath,\n startTime: new Date().toISOString(),\n });\n\n const shutdown = async(signal: string): Promise<void> => {\n logger.info(`Received ${signal}, shutting down...`);\n deleteRuntimeRecord(resolvedEnvPath);\n await proxy.stop();\n await supervisor.stopAll();\n process.exit(EXIT_OK);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n}\n\nasync function commandStatus(envPath?: string, asJson = false): Promise<void> {\n const resolvedEnvPath = envPath ? path.resolve(envPath) : undefined;\n const runtime = loadRuntimeRecord(resolvedEnvPath);\n if (!runtime) {\n const payload = {\n schemaVersion: '1.0',\n running: false,\n ready: false,\n baseUrl: '',\n port: 0,\n mode: 'local',\n version: getVersion(),\n };\n if (asJson) {\n outputJson(payload);\n } else {\n console.log('xpod is not running');\n }\n process.exit(EXIT_NOT_RUNNING);\n }\n\n const running = isProcessRunning(runtime.pid);\n const health = running ? await buildHealth(runtime.baseUrl) : undefined;\n\n const payload = {\n schemaVersion: '1.0',\n running,\n ready: Boolean(health?.healthy),\n baseUrl: runtime.baseUrl,\n publicUrl: runtime.publicUrl,\n port: runtime.port,\n mode: runtime.mode,\n pid: running ? runtime.pid : undefined,\n version: getVersion(),\n };\n\n if (asJson) {\n outputJson(payload);\n } else {\n console.log(payload);\n }\n\n process.exit(running ? EXIT_OK : EXIT_NOT_RUNNING);\n}\n\nasync function commandHealth(envPath?: string, asJson = false): Promise<void> {\n const resolvedEnvPath = envPath ? path.resolve(envPath) : undefined;\n const runtime = loadRuntimeRecord(resolvedEnvPath);\n if (!runtime || !isProcessRunning(runtime.pid)) {\n const payload: HealthReport = {\n schemaVersion: '1.0',\n healthy: false,\n checks: {\n gateway: 'fail',\n css: 'fail',\n api: 'fail',\n },\n timestamp: new Date().toISOString(),\n };\n\n if (asJson) {\n outputJson(payload);\n } else {\n console.log(payload);\n }\n process.exit(EXIT_NOT_RUNNING);\n }\n\n const payload = await buildHealth(runtime.baseUrl);\n if (asJson) {\n outputJson(payload);\n } else {\n console.log(payload);\n }\n process.exit(payload.healthy ? EXIT_OK : EXIT_INTERNAL_ERROR);\n}\n\nasync function commandStop(envPath?: string, timeoutMs = 10000, asJson = false): Promise<void> {\n const resolvedEnvPath = envPath ? path.resolve(envPath) : undefined;\n const runtime = loadRuntimeRecord(resolvedEnvPath);\n\n if (!runtime || !isProcessRunning(runtime.pid)) {\n deleteRuntimeRecord(resolvedEnvPath);\n const payload = { stopped: true, running: false };\n if (asJson) {\n outputJson(payload);\n } else {\n console.log('xpod is already stopped');\n }\n process.exit(EXIT_OK);\n }\n\n process.kill(runtime.pid, 'SIGTERM');\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (!isProcessRunning(runtime.pid)) {\n deleteRuntimeRecord(resolvedEnvPath);\n const payload = { stopped: true, pid: runtime.pid };\n if (asJson) {\n outputJson(payload);\n } else {\n console.log(`xpod stopped (pid=${runtime.pid})`);\n }\n process.exit(EXIT_OK);\n }\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n\n const payload = {\n stopped: false,\n pid: runtime.pid,\n message: `timeout waiting for process to stop (${timeoutMs}ms)`,\n };\n if (asJson) {\n outputJson(payload);\n } else {\n console.error(payload.message);\n }\n process.exit(EXIT_INTERNAL_ERROR);\n}\n\nasync function main(): Promise<void> {\n const rawArgs = hideBin(process.argv);\n const commandMode = [ 'run', 'status', 'health', 'stop' ].includes(rawArgs[0] ?? '');\n\n if (!commandMode) {\n // Backward-compatible legacy invocation: xpod --mode local --port 3000\n const argv = await yargs(rawArgs)\n .option('mode', { alias: 'm', type: 'string', choices: [ 'local', 'cloud' ], description: 'Run mode' })\n .option('config', { alias: 'c', type: 'string', description: 'Path to config file (overrides --mode)' })\n .option('env', { alias: 'e', type: 'string', description: 'Path to .env file' })\n .option('port', { alias: 'p', type: 'number', description: 'Gateway port', default: 3000 })\n .option('host', { type: 'string', description: 'Gateway host', default: '127.0.0.1' })\n .help()\n .parse();\n\n try {\n await startRuntime({\n mode: argv.mode as 'local' | 'cloud' | undefined,\n config: argv.config,\n env: argv.env,\n port: argv.port,\n host: argv.host,\n });\n } catch (error: unknown) {\n exitForCliError(error);\n }\n return;\n }\n\n await yargs(rawArgs)\n .scriptName('xpod')\n .command(\n 'run',\n 'Run xpod runtime',\n (y) => y\n .option('env', { alias: 'e', type: 'string', description: 'Path to .env file' })\n .option('mode', { alias: 'm', type: 'string', choices: [ 'local', 'cloud' ], description: 'Run mode' })\n .option('config', { alias: 'c', type: 'string', description: 'Path to config file (overrides --mode)' })\n .option('port', { alias: 'p', type: 'number', description: 'Gateway port', default: 3000 })\n .option('host', { type: 'string', description: 'Gateway host', default: '127.0.0.1' }),\n async(argv) => {\n try {\n await startRuntime({\n mode: argv.mode as 'local' | 'cloud' | undefined,\n config: argv.config,\n env: argv.env,\n port: argv.port,\n host: argv.host,\n });\n } catch (error: unknown) {\n exitForCliError(error);\n }\n },\n )\n .command(\n 'status',\n 'Show runtime status',\n (y) => y\n .option('env', { alias: 'e', type: 'string', description: 'Path to .env file' })\n .option('json', { type: 'boolean', default: false, description: 'Output JSON' }),\n async(argv) => {\n await commandStatus(argv.env, Boolean(argv.json));\n },\n )\n .command(\n 'health',\n 'Show runtime health',\n (y) => y\n .option('env', { alias: 'e', type: 'string', description: 'Path to .env file' })\n .option('json', { type: 'boolean', default: false, description: 'Output JSON' }),\n async(argv) => {\n await commandHealth(argv.env, Boolean(argv.json));\n },\n )\n .command(\n 'stop',\n 'Stop runtime process',\n (y) => y\n .option('env', { alias: 'e', type: 'string', description: 'Path to .env file' })\n .option('timeout', { type: 'number', default: 10000, description: 'Stop timeout in milliseconds' })\n .option('json', { type: 'boolean', default: false, description: 'Output JSON' }),\n async(argv) => {\n await commandStop(argv.env, argv.timeout as number, Boolean(argv.json));\n },\n )\n .demandCommand(1)\n .strict()\n .help()\n .parseAsync();\n}\n\nmain().catch(exitForCliError);\n"]}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { createHash } from 'crypto';\nimport { spawn } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport { setGlobalLoggerFactory, getLoggerFor } from 'global-logger-factory';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { GatewayProxy, getFreePort, PACKAGE_ROOT } from './runtime';\nimport { ConfigurableLoggerFactory } from './logging/ConfigurableLoggerFactory';\nimport { Supervisor } from './supervisor';\n\ninterface RuntimeRecord {\n schemaVersion: '1.0';\n pid: number;\n mode: 'local' | 'cloud';\n port: number;\n baseUrl: string;\n publicUrl?: string;\n envPath?: string;\n configPath: string;\n startTime: string;\n}\n\ninterface HealthReport {\n schemaVersion: '1.0';\n healthy: boolean;\n checks: {\n gateway: 'pass' | 'fail';\n css: 'pass' | 'fail';\n api: 'pass' | 'fail';\n };\n timestamp: string;\n}\n\ninterface RunOptions {\n mode?: 'local' | 'cloud';\n config?: string;\n env?: string;\n port?: number;\n host?: string;\n}\n\nconst EXIT_OK = 0;\nconst EXIT_NOT_RUNNING = 10;\nconst EXIT_CONFIG_ERROR = 20;\nconst EXIT_INTERNAL_ERROR = 50;\n\nlet logger = getLoggerFor('Main');\n\nfunction initLogger(): void {\n const loggerFactory = new ConfigurableLoggerFactory(process.env.CSS_LOGGING_LEVEL || 'info', {\n fileName: path.join(process.cwd(), 'logs/xpod-%DATE%.log'),\n showLocation: true,\n });\n setGlobalLoggerFactory(loggerFactory);\n logger = getLoggerFor('Main');\n}\n\nfunction loadEnvFile(envPath: string): void {\n if (!fs.existsSync(envPath)) {\n throw new Error(`Env file not found: ${envPath}`);\n }\n\n const content = fs.readFileSync(envPath, 'utf-8');\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n\n // Only set if not already defined — CLI / parent env takes precedence.\n if (process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n}\n\nfunction ensureTrailingSlash(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n}\n\nfunction resolveInstanceKey(envPath?: string): string {\n if (!envPath) {\n return 'default';\n }\n const abs = path.resolve(envPath);\n return createHash('sha256').update(abs).digest('hex').slice(0, 12);\n}\n\nfunction getRuntimeFilePath(envPath?: string): string {\n const dir = path.join(process.cwd(), '.xpod/runtime');\n return path.join(dir, `${resolveInstanceKey(envPath)}.json`);\n}\n\nfunction saveRuntimeRecord(record: RuntimeRecord): void {\n const filePath = getRuntimeFilePath(record.envPath);\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, JSON.stringify(record, null, 2), 'utf-8');\n}\n\nfunction loadRuntimeRecord(envPath?: string): RuntimeRecord | undefined {\n const filePath = getRuntimeFilePath(envPath);\n if (!fs.existsSync(filePath)) {\n return undefined;\n }\n\n try {\n return JSON.parse(fs.readFileSync(filePath, 'utf-8')) as RuntimeRecord;\n } catch {\n return undefined;\n }\n}\n\nfunction deleteRuntimeRecord(envPath?: string): void {\n const filePath = getRuntimeFilePath(envPath);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n}\n\nfunction isProcessRunning(pid?: number): boolean {\n if (!pid || pid <= 0) {\n return false;\n }\n\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getVersion(): string {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(PACKAGE_ROOT, 'package.json'), 'utf-8')) as { version?: string };\n return pkg.version ?? 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nasync function checkGateway(baseUrl: string): Promise<boolean> {\n try {\n // Gateway internal endpoints are exposed under /service/* (legacy /_gateway/* has been removed).\n const res = await fetch(new URL('/service/status', ensureTrailingSlash(baseUrl)), {\n signal: AbortSignal.timeout(3000),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\nasync function checkCss(baseUrl: string): Promise<boolean> {\n try {\n // Prefer supervisor status rather than probing CSS routes which can fail on identifier-space/host mismatch.\n const res = await fetch(new URL('/service/status', ensureTrailingSlash(baseUrl)), {\n signal: AbortSignal.timeout(3000),\n });\n if (!res.ok) {\n return false;\n }\n const items = (await res.json()) as Array<{ name?: string; status?: string }>;\n const css = items.find((it) => it?.name === 'css');\n return css?.status === 'running';\n } catch {\n return false;\n }\n}\nasync function checkApi(baseUrl: string): Promise<boolean> {\n try {\n const res = await fetch(new URL('/service/status', ensureTrailingSlash(baseUrl)), {\n signal: AbortSignal.timeout(3000),\n });\n if (!res.ok) {\n return false;\n }\n const items = (await res.json()) as Array<{ name?: string; status?: string }>;\n const api = items.find((it) => it?.name === 'api');\n return api?.status === 'running';\n } catch {\n return false;\n }\n}\nasync function buildHealth(baseUrl: string): Promise<HealthReport> {\n const gateway = await checkGateway(baseUrl);\n const css = await checkCss(baseUrl);\n const api = await checkApi(baseUrl);\n\n return {\n schemaVersion: '1.0',\n healthy: gateway && css && api,\n checks: {\n gateway: gateway ? 'pass' : 'fail',\n css: css ? 'pass' : 'fail',\n api: api ? 'pass' : 'fail',\n },\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction outputJson(payload: unknown): void {\n process.stdout.write(`${JSON.stringify(payload)}\\n`);\n}\n\nfunction exitForCliError(error: unknown): never {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Failed to start: ${message}`);\n if (message.includes('Env file not found:') || message.includes('Config file not found:')) {\n process.exit(EXIT_CONFIG_ERROR);\n }\n process.exit(EXIT_INTERNAL_ERROR);\n}\n\nasync function startRuntime(options: RunOptions): Promise<void> {\n initLogger();\n const resolvedEnvPath = options.env ? path.resolve(options.env) : undefined;\n if (resolvedEnvPath) {\n process.env.XPOD_ENV_PATH = resolvedEnvPath;\n loadEnvFile(resolvedEnvPath);\n }\n\n const requestedPort = options.port !== undefined ? Number(options.port) : Number.NaN;\n const mainPort = Number.isFinite(requestedPort)\n ? requestedPort\n : parseInt(process.env.XPOD_PORT ?? process.env.PORT ?? '3000', 10);\n const host = options.host ?? '127.0.0.1';\n\n let configPath = path.join(PACKAGE_ROOT, 'config/local.json');\n if (options.config) {\n configPath = options.config;\n } else if (options.mode) {\n configPath = path.join(PACKAGE_ROOT, `config/${options.mode}.json`);\n }\n\n if (!fs.existsSync(configPath)) {\n throw new Error(`Config file not found: ${configPath}`);\n }\n\n const mode: 'local' | 'cloud' = options.mode ?? (configPath.includes('cloud') ? 'cloud' : 'local');\n\n const cssPort = await getFreePort(mainPort + 1);\n const apiPort = await getFreePort(cssPort + 1);\n const baseUrl = ensureTrailingSlash(process.env.CSS_BASE_URL || `http://${host}:${mainPort}`);\n\n // Make sure GatewayProxy has access to the effective baseUrl for host rewrites.\n process.env.CSS_BASE_URL = baseUrl;\n\n logger.info('Orchestration Plan:');\n logger.info(` - Main Entry: ${baseUrl} (${host}:${mainPort})`);\n logger.info(` - CSS (internal): http://localhost:${cssPort}`);\n logger.info(` - API (internal): http://localhost:${apiPort}`);\n\n const supervisor = new Supervisor();\n const cssBinary = require.resolve('@solid/community-server/bin/server.js');\n const cssModuleRoot = path.dirname(require.resolve('@solid/community-server/package.json'));\n\n supervisor.register({\n name: 'css',\n command: process.execPath,\n args: [\n cssBinary,\n '-c', configPath,\n '-m', cssModuleRoot,\n '-p', cssPort.toString(),\n '-b', baseUrl,\n ],\n env: {\n ...process.env,\n CSS_PORT: cssPort.toString(),\n CSS_BASE_URL: baseUrl,\n },\n });\n\n // API server: resolve the entry point dynamically\n // In dev (ts-node): use ts-node to run the .ts file\n // In production: use the compiled .js file\n const isDevMode = __filename.endsWith('.ts');\n const apiArgs = isDevMode\n ? [\n '-r',\n require.resolve('ts-node/register/transpile-only'),\n path.join(__dirname, 'api', 'main.ts'),\n ]\n : [path.join(__dirname, 'api', 'main.js')];\n\n supervisor.register({\n name: 'api',\n command: process.execPath,\n args: apiArgs,\n env: {\n ...process.env,\n API_PORT: apiPort.toString(),\n XPOD_MAIN_PORT: mainPort.toString(),\n CSS_INTERNAL_URL: `http://localhost:${cssPort}`,\n CSS_BASE_URL: baseUrl,\n CSS_TOKEN_ENDPOINT: `${baseUrl}.oidc/token`,\n },\n });\n\n // Bind host: use CLI --host value; if not explicitly set, derive from the public Base URL.\n // In local dev/sandboxed environments, binding 0.0.0.0 can fail with EPERM.\n const bindHost = options.host || (() => {\n try {\n const hostname = new URL(baseUrl).hostname;\n if (hostname === 'localhost') return '127.0.0.1';\n if (hostname === '::1') return '::1';\n if (hostname.startsWith('127.')) return hostname;\n } catch {\n // ignore\n }\n return '0.0.0.0';\n })();\n\n const proxy = new GatewayProxy(mainPort, supervisor, bindHost, {\n exitOnStop: true,\n baseUrl,\n });\n proxy.setTargets({\n css: `http://localhost:${cssPort}`,\n api: `http://localhost:${apiPort}`,\n });\n\n await supervisor.startAll();\n await proxy.start();\n\n let restarting = false;\n const restart = async(): Promise<void> => {\n if (restarting) {\n return;\n }\n restarting = true;\n\n logger.info('Received SIGUSR1, restarting...');\n\n // Remove runtime record first so status does not point at a process going down.\n deleteRuntimeRecord(resolvedEnvPath);\n\n try {\n await proxy.stop();\n } catch (err) {\n logger.warn(`Failed to stop gateway server: ${String(err)}`);\n }\n\n await supervisor.stopAll();\n\n // Reload env from file (dashboard writes into the env file).\n if (resolvedEnvPath) {\n loadEnvFile(resolvedEnvPath);\n process.env.XPOD_ENV_PATH = resolvedEnvPath;\n }\n\n const child = spawn(process.execPath, process.argv.slice(1), {\n stdio: 'inherit',\n env: process.env,\n });\n child.unref();\n process.exit(EXIT_OK);\n };\n\n process.on('SIGUSR1', () => {\n void restart();\n });\n\n saveRuntimeRecord({\n schemaVersion: '1.0',\n pid: process.pid,\n mode,\n port: mainPort,\n baseUrl,\n publicUrl: process.env.CSS_PUBLIC_URL,\n envPath: resolvedEnvPath,\n configPath,\n startTime: new Date().toISOString(),\n });\n\n const shutdown = async(signal: string): Promise<void> => {\n logger.info(`Received ${signal}, shutting down...`);\n deleteRuntimeRecord(resolvedEnvPath);\n await proxy.stop();\n await supervisor.stopAll();\n process.exit(EXIT_OK);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n}\n\nasync function commandStatus(envPath?: string, asJson = false): Promise<void> {\n const resolvedEnvPath = envPath ? path.resolve(envPath) : undefined;\n const runtime = loadRuntimeRecord(resolvedEnvPath);\n if (!runtime) {\n const payload = {\n schemaVersion: '1.0',\n running: false,\n ready: false,\n baseUrl: '',\n port: 0,\n mode: 'local',\n version: getVersion(),\n };\n if (asJson) {\n outputJson(payload);\n } else {\n console.log('xpod is not running');\n }\n process.exit(EXIT_NOT_RUNNING);\n }\n\n const running = isProcessRunning(runtime.pid);\n const health = running ? await buildHealth(runtime.baseUrl) : undefined;\n\n const payload = {\n schemaVersion: '1.0',\n running,\n ready: Boolean(health?.healthy),\n baseUrl: runtime.baseUrl,\n publicUrl: runtime.publicUrl,\n port: runtime.port,\n mode: runtime.mode,\n pid: running ? runtime.pid : undefined,\n version: getVersion(),\n };\n\n if (asJson) {\n outputJson(payload);\n } else {\n console.log(payload);\n }\n\n process.exit(running ? EXIT_OK : EXIT_NOT_RUNNING);\n}\n\nasync function commandHealth(envPath?: string, asJson = false): Promise<void> {\n const resolvedEnvPath = envPath ? path.resolve(envPath) : undefined;\n const runtime = loadRuntimeRecord(resolvedEnvPath);\n if (!runtime || !isProcessRunning(runtime.pid)) {\n const payload: HealthReport = {\n schemaVersion: '1.0',\n healthy: false,\n checks: {\n gateway: 'fail',\n css: 'fail',\n api: 'fail',\n },\n timestamp: new Date().toISOString(),\n };\n\n if (asJson) {\n outputJson(payload);\n } else {\n console.log(payload);\n }\n process.exit(EXIT_NOT_RUNNING);\n }\n\n const payload = await buildHealth(runtime.baseUrl);\n if (asJson) {\n outputJson(payload);\n } else {\n console.log(payload);\n }\n process.exit(payload.healthy ? EXIT_OK : EXIT_INTERNAL_ERROR);\n}\n\nasync function commandStop(envPath?: string, timeoutMs = 10000, asJson = false): Promise<void> {\n const resolvedEnvPath = envPath ? path.resolve(envPath) : undefined;\n const runtime = loadRuntimeRecord(resolvedEnvPath);\n\n if (!runtime || !isProcessRunning(runtime.pid)) {\n deleteRuntimeRecord(resolvedEnvPath);\n const payload = { stopped: true, running: false };\n if (asJson) {\n outputJson(payload);\n } else {\n console.log('xpod is already stopped');\n }\n process.exit(EXIT_OK);\n }\n\n process.kill(runtime.pid, 'SIGTERM');\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (!isProcessRunning(runtime.pid)) {\n deleteRuntimeRecord(resolvedEnvPath);\n const payload = { stopped: true, pid: runtime.pid };\n if (asJson) {\n outputJson(payload);\n } else {\n console.log(`xpod stopped (pid=${runtime.pid})`);\n }\n process.exit(EXIT_OK);\n }\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n\n const payload = {\n stopped: false,\n pid: runtime.pid,\n message: `timeout waiting for process to stop (${timeoutMs}ms)`,\n };\n if (asJson) {\n outputJson(payload);\n } else {\n console.error(payload.message);\n }\n process.exit(EXIT_INTERNAL_ERROR);\n}\n\nasync function main(): Promise<void> {\n const rawArgs = hideBin(process.argv);\n const commandMode = [ 'run', 'status', 'health', 'stop' ].includes(rawArgs[0] ?? '');\n\n if (!commandMode) {\n // Backward-compatible legacy invocation: xpod --mode local --port 3000\n const argv = await yargs(rawArgs)\n .option('mode', { alias: 'm', type: 'string', choices: [ 'local', 'cloud' ], description: 'Run mode' })\n .option('config', { alias: 'c', type: 'string', description: 'Path to config file (overrides --mode)' })\n .option('env', { alias: 'e', type: 'string', description: 'Path to .env file' })\n .option('port', { alias: 'p', type: 'number', description: 'Gateway port', default: 3000 })\n .option('host', { type: 'string', description: 'Gateway bind host' })\n .help()\n .parse();\n\n try {\n await startRuntime({\n mode: argv.mode as 'local' | 'cloud' | undefined,\n config: argv.config,\n env: argv.env,\n port: argv.port,\n host: argv.host,\n });\n } catch (error: unknown) {\n exitForCliError(error);\n }\n return;\n }\n\n await yargs(rawArgs)\n .scriptName('xpod')\n .command(\n 'run',\n 'Run xpod runtime',\n (y) => y\n .option('env', { alias: 'e', type: 'string', description: 'Path to .env file' })\n .option('mode', { alias: 'm', type: 'string', choices: [ 'local', 'cloud' ], description: 'Run mode' })\n .option('config', { alias: 'c', type: 'string', description: 'Path to config file (overrides --mode)' })\n .option('port', { alias: 'p', type: 'number', description: 'Gateway port', default: 3000 })\n .option('host', { type: 'string', description: 'Gateway bind host' }),\n async(argv) => {\n try {\n await startRuntime({\n mode: argv.mode as 'local' | 'cloud' | undefined,\n config: argv.config,\n env: argv.env,\n port: argv.port,\n host: argv.host,\n });\n } catch (error: unknown) {\n exitForCliError(error);\n }\n },\n )\n .command(\n 'status',\n 'Show runtime status',\n (y) => y\n .option('env', { alias: 'e', type: 'string', description: 'Path to .env file' })\n .option('json', { type: 'boolean', default: false, description: 'Output JSON' }),\n async(argv) => {\n await commandStatus(argv.env, Boolean(argv.json));\n },\n )\n .command(\n 'health',\n 'Show runtime health',\n (y) => y\n .option('env', { alias: 'e', type: 'string', description: 'Path to .env file' })\n .option('json', { type: 'boolean', default: false, description: 'Output JSON' }),\n async(argv) => {\n await commandHealth(argv.env, Boolean(argv.json));\n },\n )\n .command(\n 'stop',\n 'Stop runtime process',\n (y) => y\n .option('env', { alias: 'e', type: 'string', description: 'Path to .env file' })\n .option('timeout', { type: 'number', default: 10000, description: 'Stop timeout in milliseconds' })\n .option('json', { type: 'boolean', default: false, description: 'Output JSON' }),\n async(argv) => {\n await commandStop(argv.env, argv.timeout as number, Boolean(argv.json));\n },\n )\n .demandCommand(1)\n .strict()\n .help()\n .parseAsync();\n}\n\nmain().catch(exitForCliError);\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProvisionCodeCodec
|
|
3
|
+
*
|
|
4
|
+
* 自包含的 provisionCode 编解码器。
|
|
5
|
+
* provisionCode 编码了 SP 的信息(publicUrl、serviceToken),
|
|
6
|
+
* CSS 侧解码后直接回调 SP,不需要查数据库。
|
|
7
|
+
*
|
|
8
|
+
* 格式: base64url(JSON payload) + "." + base64url(HMAC-SHA256 signature)
|
|
9
|
+
* 密钥: 从 baseUrl 派生,无需单独配置。
|
|
10
|
+
*/
|
|
11
|
+
export interface ProvisionCodePayload {
|
|
12
|
+
/** SP 的公网地址 */
|
|
13
|
+
spUrl: string;
|
|
14
|
+
/** Cloud → SP 回调认证 token */
|
|
15
|
+
serviceToken: string;
|
|
16
|
+
/** SP 节点 ID(可选,用于记录) */
|
|
17
|
+
nodeId?: string;
|
|
18
|
+
/** Cloud 分配的子域名,如 "abc123.undefineds.site" */
|
|
19
|
+
spDomain?: string;
|
|
20
|
+
/** 过期时间 (Unix timestamp, seconds) */
|
|
21
|
+
exp: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class ProvisionCodeCodec {
|
|
24
|
+
private readonly secret;
|
|
25
|
+
/**
|
|
26
|
+
* @param baseUrl — Cloud 的 baseUrl,用于派生签名密钥
|
|
27
|
+
*/
|
|
28
|
+
constructor(baseUrl: string);
|
|
29
|
+
/**
|
|
30
|
+
* 编码 provisionCode
|
|
31
|
+
*/
|
|
32
|
+
encode(payload: ProvisionCodePayload): string;
|
|
33
|
+
/**
|
|
34
|
+
* 解码并验证 provisionCode
|
|
35
|
+
* 返回 payload,过期或签名无效则返回 undefined
|
|
36
|
+
*/
|
|
37
|
+
decode(code: string): ProvisionCodePayload | undefined;
|
|
38
|
+
private sign;
|
|
39
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ProvisionCodeCodec
|
|
4
|
+
*
|
|
5
|
+
* 自包含的 provisionCode 编解码器。
|
|
6
|
+
* provisionCode 编码了 SP 的信息(publicUrl、serviceToken),
|
|
7
|
+
* CSS 侧解码后直接回调 SP,不需要查数据库。
|
|
8
|
+
*
|
|
9
|
+
* 格式: base64url(JSON payload) + "." + base64url(HMAC-SHA256 signature)
|
|
10
|
+
* 密钥: 从 baseUrl 派生,无需单独配置。
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.ProvisionCodeCodec = void 0;
|
|
14
|
+
const node_crypto_1 = require("node:crypto");
|
|
15
|
+
class ProvisionCodeCodec {
|
|
16
|
+
/**
|
|
17
|
+
* @param baseUrl — Cloud 的 baseUrl,用于派生签名密钥
|
|
18
|
+
*/
|
|
19
|
+
constructor(baseUrl) {
|
|
20
|
+
this.secret = Buffer.from((0, node_crypto_1.createHmac)('sha256', 'xpod-provision').update(baseUrl).digest());
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 编码 provisionCode
|
|
24
|
+
*/
|
|
25
|
+
encode(payload) {
|
|
26
|
+
const json = JSON.stringify(payload);
|
|
27
|
+
const data = Buffer.from(json, 'utf8').toString('base64url');
|
|
28
|
+
const sig = this.sign(data);
|
|
29
|
+
return `${data}.${sig}`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 解码并验证 provisionCode
|
|
33
|
+
* 返回 payload,过期或签名无效则返回 undefined
|
|
34
|
+
*/
|
|
35
|
+
decode(code) {
|
|
36
|
+
const dotIndex = code.indexOf('.');
|
|
37
|
+
if (dotIndex <= 0) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
const data = code.slice(0, dotIndex);
|
|
41
|
+
const sig = code.slice(dotIndex + 1);
|
|
42
|
+
if (this.sign(data) !== sig) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const payload = JSON.parse(Buffer.from(data, 'base64url').toString('utf8'));
|
|
47
|
+
if (!payload.spUrl || !payload.serviceToken || !payload.exp) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
// 检查过期
|
|
51
|
+
if (payload.exp < Math.floor(Date.now() / 1000)) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
return payload;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
sign(data) {
|
|
61
|
+
return (0, node_crypto_1.createHmac)('sha256', this.secret).update(data).digest('base64url');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.ProvisionCodeCodec = ProvisionCodeCodec;
|
|
65
|
+
//# sourceMappingURL=ProvisionCodeCodec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProvisionCodeCodec.js","sourceRoot":"","sources":["../../src/provision/ProvisionCodeCodec.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAEH,6CAAyC;AAezC,MAAa,kBAAkB;IAG7B;;OAEG;IACH,YAAmB,OAAe;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CACvB,IAAA,wBAAU,EAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAChE,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,OAA6B;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,IAAY;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAErC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAyB,CAAC;YAEpG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC5D,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,OAAO;YACP,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;gBAChD,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,IAAY;QACvB,OAAO,IAAA,wBAAU,EAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5E,CAAC;CACF;AA5DD,gDA4DC","sourcesContent":["/**\n * ProvisionCodeCodec\n *\n * 自包含的 provisionCode 编解码器。\n * provisionCode 编码了 SP 的信息(publicUrl、serviceToken),\n * CSS 侧解码后直接回调 SP,不需要查数据库。\n *\n * 格式: base64url(JSON payload) + \".\" + base64url(HMAC-SHA256 signature)\n * 密钥: 从 baseUrl 派生,无需单独配置。\n */\n\nimport { createHmac } from 'node:crypto';\n\nexport interface ProvisionCodePayload {\n /** SP 的公网地址 */\n spUrl: string;\n /** Cloud → SP 回调认证 token */\n serviceToken: string;\n /** SP 节点 ID(可选,用于记录) */\n nodeId?: string;\n /** Cloud 分配的子域名,如 \"abc123.undefineds.site\" */\n spDomain?: string;\n /** 过期时间 (Unix timestamp, seconds) */\n exp: number;\n}\n\nexport class ProvisionCodeCodec {\n private readonly secret: Buffer;\n\n /**\n * @param baseUrl — Cloud 的 baseUrl,用于派生签名密钥\n */\n public constructor(baseUrl: string) {\n this.secret = Buffer.from(\n createHmac('sha256', 'xpod-provision').update(baseUrl).digest(),\n );\n }\n\n /**\n * 编码 provisionCode\n */\n public encode(payload: ProvisionCodePayload): string {\n const json = JSON.stringify(payload);\n const data = Buffer.from(json, 'utf8').toString('base64url');\n const sig = this.sign(data);\n return `${data}.${sig}`;\n }\n\n /**\n * 解码并验证 provisionCode\n * 返回 payload,过期或签名无效则返回 undefined\n */\n public decode(code: string): ProvisionCodePayload | undefined {\n const dotIndex = code.indexOf('.');\n if (dotIndex <= 0) {\n return undefined;\n }\n\n const data = code.slice(0, dotIndex);\n const sig = code.slice(dotIndex + 1);\n\n if (this.sign(data) !== sig) {\n return undefined;\n }\n\n try {\n const payload = JSON.parse(Buffer.from(data, 'base64url').toString('utf8')) as ProvisionCodePayload;\n\n if (!payload.spUrl || !payload.serviceToken || !payload.exp) {\n return undefined;\n }\n\n // 检查过期\n if (payload.exp < Math.floor(Date.now() / 1000)) {\n return undefined;\n }\n\n return payload;\n } catch {\n return undefined;\n }\n }\n\n private sign(data: string): string {\n return createHmac('sha256', this.secret).update(data).digest('base64url');\n }\n}\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"@context": [
|
|
3
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld"
|
|
4
|
+
],
|
|
5
|
+
"@id": "npmd:@undefineds.co/xpod",
|
|
6
|
+
"components": [
|
|
7
|
+
{
|
|
8
|
+
"@id": "undefineds:dist/provision/ProvisionCodeCodec.jsonld#ProvisionCodeCodec",
|
|
9
|
+
"@type": "Class",
|
|
10
|
+
"requireElement": "ProvisionCodeCodec",
|
|
11
|
+
"parameters": [
|
|
12
|
+
{
|
|
13
|
+
"@id": "undefineds:dist/provision/ProvisionCodeCodec.jsonld#ProvisionCodeCodec_baseUrl",
|
|
14
|
+
"range": "xsd:string",
|
|
15
|
+
"comment": "— Cloud 的 baseUrl,用于派生签名密钥"
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"memberFields": [
|
|
19
|
+
{
|
|
20
|
+
"@id": "undefineds:dist/provision/ProvisionCodeCodec.jsonld#ProvisionCodeCodec__member_secret",
|
|
21
|
+
"memberFieldName": "secret"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"@id": "undefineds:dist/provision/ProvisionCodeCodec.jsonld#ProvisionCodeCodec__member_constructor",
|
|
25
|
+
"memberFieldName": "constructor"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"@id": "undefineds:dist/provision/ProvisionCodeCodec.jsonld#ProvisionCodeCodec__member_encode",
|
|
29
|
+
"memberFieldName": "encode"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"@id": "undefineds:dist/provision/ProvisionCodeCodec.jsonld#ProvisionCodeCodec__member_decode",
|
|
33
|
+
"memberFieldName": "decode"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"@id": "undefineds:dist/provision/ProvisionCodeCodec.jsonld#ProvisionCodeCodec__member_sign",
|
|
37
|
+
"memberFieldName": "sign"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"constructorArguments": [
|
|
41
|
+
{
|
|
42
|
+
"@id": "undefineds:dist/provision/ProvisionCodeCodec.jsonld#ProvisionCodeCodec_baseUrl"
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProvisionPodCreator
|
|
3
|
+
*
|
|
4
|
+
* 等位替换 CSS 的 BasePodCreator。
|
|
5
|
+
*
|
|
6
|
+
* 检查 settings 里有没有 provisionCode:
|
|
7
|
+
* - 有 → 解码 JWT,回调远端 SP 的 /provision/pods 创建 Pod
|
|
8
|
+
* - 没有 → 委托给原始 BasePodCreator(标准本地创建)
|
|
9
|
+
*/
|
|
10
|
+
import { BasePodCreator, type PodCreatorInput, type PodCreatorOutput, type BasePodCreatorArgs } from '@solid/community-server';
|
|
11
|
+
export interface ProvisionPodCreatorArgs extends BasePodCreatorArgs {
|
|
12
|
+
/** 与 ProvisionHandler 使用相同的 baseUrl 派生签名密钥 */
|
|
13
|
+
provisionBaseUrl?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class ProvisionPodCreator extends BasePodCreator {
|
|
16
|
+
private readonly provisionLogger;
|
|
17
|
+
private readonly codec;
|
|
18
|
+
constructor(args: ProvisionPodCreatorArgs);
|
|
19
|
+
handle(input: PodCreatorInput): Promise<PodCreatorOutput>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ProvisionPodCreator
|
|
4
|
+
*
|
|
5
|
+
* 等位替换 CSS 的 BasePodCreator。
|
|
6
|
+
*
|
|
7
|
+
* 检查 settings 里有没有 provisionCode:
|
|
8
|
+
* - 有 → 解码 JWT,回调远端 SP 的 /provision/pods 创建 Pod
|
|
9
|
+
* - 没有 → 委托给原始 BasePodCreator(标准本地创建)
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ProvisionPodCreator = void 0;
|
|
13
|
+
const global_logger_factory_1 = require("global-logger-factory");
|
|
14
|
+
const community_server_1 = require("@solid/community-server");
|
|
15
|
+
const ProvisionCodeCodec_1 = require("./ProvisionCodeCodec");
|
|
16
|
+
class ProvisionPodCreator extends community_server_1.BasePodCreator {
|
|
17
|
+
constructor(args) {
|
|
18
|
+
super(args);
|
|
19
|
+
this.provisionLogger = (0, global_logger_factory_1.getLoggerFor)(this);
|
|
20
|
+
this.codec = new ProvisionCodeCodec_1.ProvisionCodeCodec(args.provisionBaseUrl ?? args.baseUrl);
|
|
21
|
+
}
|
|
22
|
+
async handle(input) {
|
|
23
|
+
const provisionCode = input.settings?.provisionCode;
|
|
24
|
+
if (!provisionCode) {
|
|
25
|
+
// 标准模式:委托给 BasePodCreator
|
|
26
|
+
return super.handle(input);
|
|
27
|
+
}
|
|
28
|
+
// SP 模式:解码 provisionCode,回调远端 SP
|
|
29
|
+
const payload = this.codec.decode(provisionCode);
|
|
30
|
+
if (!payload) {
|
|
31
|
+
throw new Error('Invalid or expired provisionCode');
|
|
32
|
+
}
|
|
33
|
+
this.provisionLogger.info(`Provisioning pod on remote SP: ${payload.spUrl}`);
|
|
34
|
+
// 1. 确定 podName
|
|
35
|
+
const podName = input.name;
|
|
36
|
+
if (!podName) {
|
|
37
|
+
throw new Error('Pod name is required for remote provisioning');
|
|
38
|
+
}
|
|
39
|
+
// 2. 回调 SP 创建 Pod
|
|
40
|
+
const callbackUrl = `${payload.spUrl.replace(/\/$/, '')}/provision/pods`;
|
|
41
|
+
const spResponse = await fetch(callbackUrl, {
|
|
42
|
+
method: 'POST',
|
|
43
|
+
headers: {
|
|
44
|
+
'Content-Type': 'application/json',
|
|
45
|
+
'Authorization': `Bearer ${payload.serviceToken}`,
|
|
46
|
+
},
|
|
47
|
+
body: JSON.stringify({ podName }),
|
|
48
|
+
});
|
|
49
|
+
if (!spResponse.ok) {
|
|
50
|
+
const errBody = await spResponse.text();
|
|
51
|
+
this.provisionLogger.error(`SP callback failed: ${spResponse.status} ${errBody}`);
|
|
52
|
+
throw new Error(`Failed to create pod on SP: ${spResponse.status}`);
|
|
53
|
+
}
|
|
54
|
+
const spResult = await spResponse.json();
|
|
55
|
+
// storage URL 优先用 Cloud 分配的子域名,回调用实际地址
|
|
56
|
+
const storageBase = payload.spDomain
|
|
57
|
+
? `https://${payload.spDomain}`
|
|
58
|
+
: payload.spUrl.replace(/\/$/, '');
|
|
59
|
+
const podUrl = spResult.podUrl || `${storageBase}/${podName}/`;
|
|
60
|
+
// 3. 生成 WebID(指向 Cloud,storage 指向 SP)
|
|
61
|
+
const webId = input.webId ?? `${this.baseUrl}${podName}/profile/card#me`;
|
|
62
|
+
// 4. 链接 WebID 到账户 + 在本地 PodStore 记录
|
|
63
|
+
// base.path 必须在 Cloud 的 identifier space 内(CSS PodStore 会检查),
|
|
64
|
+
// 所以用 Cloud 本地路径;真实的 SP storage URL 通过 podUrl 返回。
|
|
65
|
+
const localBase = this.identifierGenerator.generate(podName);
|
|
66
|
+
const podSettings = {
|
|
67
|
+
...input.settings,
|
|
68
|
+
base: localBase,
|
|
69
|
+
webId,
|
|
70
|
+
oidcIssuer: this.baseUrl,
|
|
71
|
+
};
|
|
72
|
+
const webIdLink = await this.handleWebId(!input.webId, webId, input.accountId, podSettings);
|
|
73
|
+
const podId = await this.createPod(input.accountId, podSettings, !input.name, webIdLink);
|
|
74
|
+
this.provisionLogger.info(`Provisioned pod ${podName} on SP ${payload.spUrl}, podUrl: ${podUrl}`);
|
|
75
|
+
return {
|
|
76
|
+
podUrl,
|
|
77
|
+
webId,
|
|
78
|
+
podId,
|
|
79
|
+
webIdLink,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.ProvisionPodCreator = ProvisionPodCreator;
|
|
84
|
+
//# sourceMappingURL=ProvisionPodCreator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProvisionPodCreator.js","sourceRoot":"","sources":["../../src/provision/ProvisionPodCreator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ProvisionPodCreator\n *\n * 等位替换 CSS 的 BasePodCreator。\n *\n * 检查 settings 里有没有 provisionCode:\n * - 有 → 解码 JWT,回调远端 SP 的 /provision/pods 创建 Pod\n * - 没有 → 委托给原始 BasePodCreator(标准本地创建)\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport {\n BasePodCreator,\n type PodCreatorInput,\n type PodCreatorOutput,\n type BasePodCreatorArgs,\n} from '@solid/community-server';\nimport { ProvisionCodeCodec } from './ProvisionCodeCodec';\n\nexport interface ProvisionPodCreatorArgs extends BasePodCreatorArgs {\n /** 与 ProvisionHandler 使用相同的 baseUrl 派生签名密钥 */\n provisionBaseUrl?: string;\n}\n\nexport class ProvisionPodCreator extends BasePodCreator {\n private readonly provisionLogger = getLoggerFor(this);\n private readonly codec: ProvisionCodeCodec;\n\n public constructor(args: ProvisionPodCreatorArgs) {\n super(args);\n this.codec = new ProvisionCodeCodec(args.provisionBaseUrl ?? args.baseUrl);\n }\n\n public override async handle(input: PodCreatorInput): Promise<PodCreatorOutput> {\n const provisionCode = input.settings?.provisionCode as string | undefined;\n\n if (!provisionCode) {\n // 标准模式:委托给 BasePodCreator\n return super.handle(input);\n }\n\n // SP 模式:解码 provisionCode,回调远端 SP\n const payload = this.codec.decode(provisionCode);\n if (!payload) {\n throw new Error('Invalid or expired provisionCode');\n }\n\n this.provisionLogger.info(`Provisioning pod on remote SP: ${payload.spUrl}`);\n\n // 1. 确定 podName\n const podName = input.name;\n if (!podName) {\n throw new Error('Pod name is required for remote provisioning');\n }\n\n // 2. 回调 SP 创建 Pod\n const callbackUrl = `${payload.spUrl.replace(/\\/$/, '')}/provision/pods`;\n const spResponse = await fetch(callbackUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${payload.serviceToken}`,\n },\n body: JSON.stringify({ podName }),\n });\n\n if (!spResponse.ok) {\n const errBody = await spResponse.text();\n this.provisionLogger.error(`SP callback failed: ${spResponse.status} ${errBody}`);\n throw new Error(`Failed to create pod on SP: ${spResponse.status}`);\n }\n\n const spResult = await spResponse.json() as { podUrl?: string };\n\n // storage URL 优先用 Cloud 分配的子域名,回调用实际地址\n const storageBase = payload.spDomain\n ? `https://${payload.spDomain}`\n : payload.spUrl.replace(/\\/$/, '');\n const podUrl = spResult.podUrl || `${storageBase}/${podName}/`;\n\n // 3. 生成 WebID(指向 Cloud,storage 指向 SP)\n const webId = input.webId ?? `${this.baseUrl}${podName}/profile/card#me`;\n\n // 4. 链接 WebID 到账户 + 在本地 PodStore 记录\n // base.path 必须在 Cloud 的 identifier space 内(CSS PodStore 会检查),\n // 所以用 Cloud 本地路径;真实的 SP storage URL 通过 podUrl 返回。\n const localBase = this.identifierGenerator.generate(podName);\n const podSettings = {\n ...input.settings,\n base: localBase,\n webId,\n oidcIssuer: this.baseUrl,\n };\n\n const webIdLink = await this.handleWebId(!input.webId, webId, input.accountId, podSettings);\n const podId = await this.createPod(input.accountId, podSettings, !input.name, webIdLink);\n\n this.provisionLogger.info(`Provisioned pod ${podName} on SP ${payload.spUrl}, podUrl: ${podUrl}`);\n\n return {\n podUrl,\n webId,\n podId,\n webIdLink,\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
{
|
|
2
|
+
"@context": [
|
|
3
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld",
|
|
4
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld"
|
|
5
|
+
],
|
|
6
|
+
"@id": "npmd:@undefineds.co/xpod",
|
|
7
|
+
"components": [
|
|
8
|
+
{
|
|
9
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator",
|
|
10
|
+
"@type": "Class",
|
|
11
|
+
"requireElement": "ProvisionPodCreator",
|
|
12
|
+
"extends": [
|
|
13
|
+
"css:dist/identity/interaction/pod/util/BasePodCreator.jsonld#BasePodCreator"
|
|
14
|
+
],
|
|
15
|
+
"parameters": [
|
|
16
|
+
{
|
|
17
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_provisionBaseUrl",
|
|
18
|
+
"range": {
|
|
19
|
+
"@type": "ParameterRangeUnion",
|
|
20
|
+
"parameterRangeElements": [
|
|
21
|
+
"xsd:string",
|
|
22
|
+
{
|
|
23
|
+
"@type": "ParameterRangeUndefined"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
"comment": "与 ProvisionHandler 使用相同的 baseUrl 派生签名密钥"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_baseUrl",
|
|
31
|
+
"range": "xsd:string",
|
|
32
|
+
"comment": "Base URL of the server. Used to potentially set the `solid:oidcIssuer` triple and/or the pod URL if it is a root pod."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_identifierGenerator",
|
|
36
|
+
"range": "css:dist/pods/generate/IdentifierGenerator.jsonld#IdentifierGenerator",
|
|
37
|
+
"comment": "Generates the base URL of the pod based on the input `name`."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_relativeWebIdPath",
|
|
41
|
+
"range": "xsd:string",
|
|
42
|
+
"comment": "The path of where the WebID will be generated by the template, relative to the pod URL."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_webIdStore",
|
|
46
|
+
"range": "css:dist/identity/interaction/webid/util/WebIdStore.jsonld#WebIdStore",
|
|
47
|
+
"comment": "WebID data store."
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_podStore",
|
|
51
|
+
"range": "css:dist/identity/interaction/pod/util/PodStore.jsonld#PodStore",
|
|
52
|
+
"comment": "Pod data store."
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
"memberFields": [
|
|
56
|
+
{
|
|
57
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator__member_provisionLogger",
|
|
58
|
+
"memberFieldName": "provisionLogger"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator__member_codec",
|
|
62
|
+
"memberFieldName": "codec"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator__member_constructor",
|
|
66
|
+
"memberFieldName": "constructor"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator__member_handle",
|
|
70
|
+
"memberFieldName": "handle"
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"constructorArguments": [
|
|
74
|
+
{
|
|
75
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args__constructorArgument",
|
|
76
|
+
"fields": [
|
|
77
|
+
{
|
|
78
|
+
"keyRaw": "provisionBaseUrl",
|
|
79
|
+
"value": {
|
|
80
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_provisionBaseUrl"
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"keyRaw": "baseUrl",
|
|
85
|
+
"value": {
|
|
86
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_baseUrl"
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"keyRaw": "identifierGenerator",
|
|
91
|
+
"value": {
|
|
92
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_identifierGenerator"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"keyRaw": "relativeWebIdPath",
|
|
97
|
+
"value": {
|
|
98
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_relativeWebIdPath"
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"keyRaw": "webIdStore",
|
|
103
|
+
"value": {
|
|
104
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_webIdStore"
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"keyRaw": "podStore",
|
|
109
|
+
"value": {
|
|
110
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_podStore"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
}
|
|
@@ -1,16 +1,30 @@
|
|
|
1
|
-
import type { QuotaService } from './QuotaService';
|
|
1
|
+
import type { QuotaService, AccountQuota } from './QuotaService';
|
|
2
2
|
interface DrizzleQuotaServiceOptions {
|
|
3
3
|
identityDbUrl: string;
|
|
4
|
-
defaultAccountQuotaBytes?: number;
|
|
5
4
|
}
|
|
5
|
+
/**
|
|
6
|
+
* 统一 QuotaService 实现
|
|
7
|
+
*
|
|
8
|
+
* 查询优先级:DB 值 > 环境变量默认值 > 不限制 (null)
|
|
9
|
+
*/
|
|
6
10
|
export declare class DrizzleQuotaService implements QuotaService {
|
|
11
|
+
private readonly logger;
|
|
7
12
|
private readonly accountRepo;
|
|
8
13
|
private readonly usageRepo;
|
|
9
|
-
private readonly defaultQuota;
|
|
10
14
|
constructor(options: DrizzleQuotaServiceOptions);
|
|
15
|
+
getAccountQuota(accountId: string): Promise<AccountQuota>;
|
|
16
|
+
setAccountQuota(accountId: string, quota: Partial<AccountQuota>): Promise<void>;
|
|
17
|
+
getPodQuota(podId: string): Promise<AccountQuota>;
|
|
18
|
+
setPodQuota(podId: string, quota: Partial<AccountQuota>): Promise<void>;
|
|
19
|
+
clearAccountQuota(accountId: string): Promise<void>;
|
|
20
|
+
clearPodQuota(podId: string): Promise<void>;
|
|
11
21
|
getAccountLimit(accountId: string): Promise<number | null | undefined>;
|
|
12
22
|
getPodLimit(podId: string): Promise<number | null | undefined>;
|
|
13
23
|
setAccountLimit(accountId: string, limit: number | null): Promise<void>;
|
|
14
24
|
setPodLimit(podId: string, limit: number | null): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* 解析配额值:DB 值 > 环境变量默认值 > null (不限制)
|
|
27
|
+
*/
|
|
28
|
+
private resolve;
|
|
15
29
|
}
|
|
16
30
|
export {};
|