@undefineds.co/xpod 0.1.7 → 0.2.0
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 +164 -3
- 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/agents/AgentExecutorFactory.js +1 -1
- package/dist/agents/AgentExecutorFactory.js.map +1 -1
- package/dist/agents/AgentManager.js +1 -1
- package/dist/agents/AgentManager.js.map +1 -1
- package/dist/agents/config/agent-meta-schema.d.ts +7 -7
- package/dist/agents/config/agent-meta-schema.js +1 -1
- package/dist/agents/config/agent-meta-schema.js.map +1 -1
- package/dist/agents/config/resolve.js +1 -1
- package/dist/agents/config/resolve.js.map +1 -1
- package/dist/agents/schema/agent-config.d.ts +18 -18
- package/dist/agents/schema/agent-config.js +1 -1
- package/dist/agents/schema/agent-config.js.map +1 -1
- package/dist/agents/schema/tables.d.ts +8 -8
- package/dist/agents/schema/tables.js +1 -1
- package/dist/agents/schema/tables.js.map +1 -1
- package/dist/ai/schema/config.d.ts +7 -7
- package/dist/ai/schema/config.js +1 -1
- package/dist/ai/schema/config.js.map +1 -1
- package/dist/ai/schema/model.d.ts +13 -13
- package/dist/ai/schema/model.js +1 -1
- package/dist/ai/schema/model.js.map +1 -1
- package/dist/ai/schema/provider.d.ts +7 -7
- package/dist/ai/schema/provider.js +1 -1
- package/dist/ai/schema/provider.js.map +1 -1
- package/dist/ai/schema/vector-store.d.ts +17 -17
- package/dist/ai/schema/vector-store.js +1 -1
- package/dist/ai/schema/vector-store.js.map +1 -1
- package/dist/ai/service/CredentialReaderImpl.js +1 -1
- package/dist/ai/service/CredentialReaderImpl.js.map +1 -1
- package/dist/ai/service/DefaultAiConfigService.js.map +1 -1
- package/dist/api/ApiServer.d.ts +3 -1
- package/dist/api/ApiServer.js +14 -1
- package/dist/api/ApiServer.js.map +1 -1
- 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.d.ts +6 -0
- package/dist/api/chatkit/pod-store.js +103 -36
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/chatkit/schema.d.ts +32 -26
- package/dist/api/chatkit/schema.js +16 -8
- 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 +13 -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 +125 -0
- package/dist/api/runtime.js.map +1 -0
- package/dist/api/service/VectorStoreService.js +1 -1
- package/dist/api/service/VectorStoreService.js.map +1 -1
- 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/credential/schema/tables.d.ts +14 -14
- package/dist/credential/schema/tables.js +1 -1
- package/dist/credential/schema/tables.js.map +1 -1
- 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 +142 -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 +235 -3
- 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/task/DrizzleTaskQueue.d.ts +1 -1
- package/dist/task/DrizzleTaskQueue.js +1 -1
- package/dist/task/DrizzleTaskQueue.js.map +1 -1
- package/dist/task/schema.d.ts +10 -10
- package/dist/task/schema.js +1 -1
- package/dist/task/schema.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 +38 -10
- 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
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.doctorCommand = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
function check(ok, label) {
|
|
8
|
+
const icon = ok ? '✓' : '✗';
|
|
9
|
+
console.log(`${icon} ${label}`);
|
|
10
|
+
return { ok, label };
|
|
11
|
+
}
|
|
12
|
+
async function checkNodeVersion() {
|
|
13
|
+
const major = parseInt(process.versions.node.split('.')[0], 10);
|
|
14
|
+
return check(major >= 18, `Node.js v${process.versions.node} (≥ 18)`);
|
|
15
|
+
}
|
|
16
|
+
async function checkServerReachable(url) {
|
|
17
|
+
if (!url)
|
|
18
|
+
return check(true, 'Server check skipped (no --url)');
|
|
19
|
+
const base = url.endsWith('/') ? url : `${url}/`;
|
|
20
|
+
try {
|
|
21
|
+
const res = await fetch(`${base}.account/`, {
|
|
22
|
+
headers: { Accept: 'application/json' },
|
|
23
|
+
signal: AbortSignal.timeout(5000),
|
|
24
|
+
});
|
|
25
|
+
return check(res.ok, `Server reachable at ${base}`);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return check(false, `Server unreachable at ${base}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function checkFileExists(filePath, label) {
|
|
32
|
+
return check((0, fs_1.existsSync)((0, path_1.resolve)(filePath)), label);
|
|
33
|
+
}
|
|
34
|
+
function checkBuildFreshness() {
|
|
35
|
+
const distPath = (0, path_1.resolve)('dist');
|
|
36
|
+
const srcPath = (0, path_1.resolve)('src');
|
|
37
|
+
if (!(0, fs_1.existsSync)(distPath)) {
|
|
38
|
+
return check(false, 'dist/ exists');
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const distStat = (0, fs_1.statSync)(distPath);
|
|
42
|
+
const srcStat = (0, fs_1.statSync)(srcPath);
|
|
43
|
+
const fresh = distStat.mtimeMs >= srcStat.mtimeMs;
|
|
44
|
+
return check(fresh, fresh ? 'dist/ up to date' : 'dist/ outdated (run yarn build)');
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return check(true, 'dist/ exists');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function checkPortAvailable(port) {
|
|
51
|
+
try {
|
|
52
|
+
const output = (0, child_process_1.execSync)(`lsof -i :${port} -t 2>/dev/null`, { encoding: 'utf-8' }).trim();
|
|
53
|
+
if (output) {
|
|
54
|
+
return check(false, `Port ${port} in use (PID: ${output.split('\n')[0]})`);
|
|
55
|
+
}
|
|
56
|
+
return check(true, `Port ${port} available`);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// lsof returns non-zero when no process found — port is free
|
|
60
|
+
return check(true, `Port ${port} available`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.doctorCommand = {
|
|
64
|
+
command: 'doctor',
|
|
65
|
+
describe: 'Check environment and diagnose issues',
|
|
66
|
+
builder: (yargs) => yargs
|
|
67
|
+
.option('url', {
|
|
68
|
+
alias: 'u',
|
|
69
|
+
type: 'string',
|
|
70
|
+
description: 'Server URL to check connectivity',
|
|
71
|
+
}),
|
|
72
|
+
handler: async (argv) => {
|
|
73
|
+
console.log('Running diagnostics...\n');
|
|
74
|
+
const results = [];
|
|
75
|
+
results.push(await checkNodeVersion());
|
|
76
|
+
results.push(checkPortAvailable(3000));
|
|
77
|
+
results.push(await checkServerReachable(argv.url));
|
|
78
|
+
results.push(checkFileExists('.env.local', '.env.local found'));
|
|
79
|
+
results.push(checkFileExists('.env.server', '.env.server found'));
|
|
80
|
+
results.push(checkFileExists('config/local.json', 'config/local.json found'));
|
|
81
|
+
results.push(checkFileExists('config/cloud.json', 'config/cloud.json found'));
|
|
82
|
+
results.push(checkFileExists('node_modules', 'node_modules/ exists'));
|
|
83
|
+
results.push(checkBuildFreshness());
|
|
84
|
+
const failed = results.filter((r) => !r.ok);
|
|
85
|
+
console.log('');
|
|
86
|
+
if (failed.length === 0) {
|
|
87
|
+
console.log('All checks passed.');
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
console.log(`${failed.length} issue(s) found.`);
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport { execSync } from 'child_process';\nimport { existsSync, statSync } from 'fs';\nimport { resolve } from 'path';\n\ninterface DoctorArgs {\n url?: string;\n}\n\ninterface CheckResult {\n ok: boolean;\n label: string;\n}\n\nfunction check(ok: boolean, label: string): CheckResult {\n const icon = ok ? '✓' : '✗';\n console.log(`${icon} ${label}`);\n return { ok, label };\n}\n\nasync function checkNodeVersion(): Promise<CheckResult> {\n const major = parseInt(process.versions.node.split('.')[0], 10);\n return check(major >= 18, `Node.js v${process.versions.node} (≥ 18)`);\n}\n\nasync function checkServerReachable(url?: string): Promise<CheckResult> {\n if (!url) return check(true, 'Server check skipped (no --url)');\n const base = url.endsWith('/') ? url : `${url}/`;\n try {\n const res = await fetch(`${base}.account/`, {\n headers: { Accept: 'application/json' },\n signal: AbortSignal.timeout(5000),\n });\n return check(res.ok, `Server reachable at ${base}`);\n } catch {\n return check(false, `Server unreachable at ${base}`);\n }\n}\n\nfunction checkFileExists(filePath: string, label: string): CheckResult {\n return check(existsSync(resolve(filePath)), label);\n}\n\nfunction checkBuildFreshness(): CheckResult {\n const distPath = resolve('dist');\n const srcPath = resolve('src');\n if (!existsSync(distPath)) {\n return check(false, 'dist/ exists');\n }\n try {\n const distStat = statSync(distPath);\n const srcStat = statSync(srcPath);\n const fresh = distStat.mtimeMs >= srcStat.mtimeMs;\n return check(fresh, fresh ? 'dist/ up to date' : 'dist/ outdated (run yarn build)');\n } catch {\n return check(true, 'dist/ exists');\n }\n}\n\nfunction checkPortAvailable(port: number): CheckResult {\n try {\n const output = execSync(`lsof -i :${port} -t 2>/dev/null`, { encoding: 'utf-8' }).trim();\n if (output) {\n return check(false, `Port ${port} in use (PID: ${output.split('\\n')[0]})`);\n }\n return check(true, `Port ${port} available`);\n } catch {\n // lsof returns non-zero when no process found — port is free\n return check(true, `Port ${port} available`);\n }\n}\n\nexport const doctorCommand: CommandModule<object, DoctorArgs> = {\n command: 'doctor',\n describe: 'Check environment and diagnose issues',\n builder: (yargs) =>\n yargs\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server URL to check connectivity',\n }),\n handler: async (argv) => {\n console.log('Running diagnostics...\\n');\n\n const results: CheckResult[] = [];\n\n results.push(await checkNodeVersion());\n results.push(checkPortAvailable(3000));\n results.push(await checkServerReachable(argv.url));\n results.push(checkFileExists('.env.local', '.env.local found'));\n results.push(checkFileExists('.env.server', '.env.server found'));\n results.push(checkFileExists('config/local.json', 'config/local.json found'));\n results.push(checkFileExists('config/cloud.json', 'config/cloud.json found'));\n results.push(checkFileExists('node_modules', 'node_modules/ exists'));\n results.push(checkBuildFreshness());\n\n const failed = results.filter((r) => !r.ok);\n console.log('');\n if (failed.length === 0) {\n console.log('All checks passed.');\n } else {\n console.log(`${failed.length} issue(s) found.`);\n }\n },\n};\n"]}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.podCommand = void 0;
|
|
4
|
+
const css_account_1 = require("../lib/css-account");
|
|
5
|
+
const credentials_store_1 = require("../lib/credentials-store");
|
|
6
|
+
function resolveUrl(url, credUrl) {
|
|
7
|
+
const raw = url || credUrl || process.env.CSS_BASE_URL || 'http://localhost:3000';
|
|
8
|
+
return raw.endsWith('/') ? raw : `${raw}/`;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Try to login via email/password (CSS Account Token) or fall back to
|
|
12
|
+
* client credentials from ~/.xpod/credentials.json.
|
|
13
|
+
*
|
|
14
|
+
* Returns { token, mode } where mode indicates which auth was used.
|
|
15
|
+
*/
|
|
16
|
+
async function resolveLogin(email, password, baseUrl) {
|
|
17
|
+
if (email && password) {
|
|
18
|
+
if (!(await (0, css_account_1.checkServer)(baseUrl))) {
|
|
19
|
+
console.error(`Cannot reach server at ${baseUrl}`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
const token = await (0, css_account_1.login)(email, password, baseUrl);
|
|
23
|
+
if (!token) {
|
|
24
|
+
console.error('Login failed. Check email/password.');
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
return { token, mode: 'account' };
|
|
28
|
+
}
|
|
29
|
+
// Fall back to credentials store — get CSS Account Token via OIDC isn't possible,
|
|
30
|
+
// but pod/account commands need CSS Account Token. For now, require email/password
|
|
31
|
+
// for commands that use .account/ API.
|
|
32
|
+
console.error('This command requires --email and --password (or run `xpod auth create-credentials` for other commands).');
|
|
33
|
+
console.error('Pod management commands use the CSS Account API which requires email/password authentication.');
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
const podCreateCommand = {
|
|
37
|
+
command: 'create <name>',
|
|
38
|
+
describe: 'Create a new pod',
|
|
39
|
+
builder: (yargs) => yargs
|
|
40
|
+
.positional('name', { type: 'string', demandOption: true, description: 'Pod name' })
|
|
41
|
+
.option('email', { type: 'string', description: 'Account email' })
|
|
42
|
+
.option('password', { type: 'string', description: 'Account password' }),
|
|
43
|
+
handler: async (argv) => {
|
|
44
|
+
const creds = (0, credentials_store_1.loadCredentials)();
|
|
45
|
+
const baseUrl = resolveUrl(argv.url, creds?.url);
|
|
46
|
+
const { token } = await resolveLogin(argv.email, argv.password, baseUrl);
|
|
47
|
+
const data = await (0, css_account_1.getAccountData)(token, baseUrl);
|
|
48
|
+
if (!data?.controls.pod) {
|
|
49
|
+
console.error('Cannot find pod creation endpoint.');
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
const result = await (0, css_account_1.createPod)(token, data.controls.pod, argv.name);
|
|
53
|
+
if (!result) {
|
|
54
|
+
console.error(`Failed to create pod "${argv.name}".`);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
console.log(`Pod created:`);
|
|
58
|
+
console.log(` URL: ${result.podUrl}`);
|
|
59
|
+
console.log(` WebID: ${result.webId}`);
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
const podListCommand = {
|
|
63
|
+
command: 'list',
|
|
64
|
+
describe: 'List all pods for the account',
|
|
65
|
+
builder: (yargs) => yargs
|
|
66
|
+
.option('email', { type: 'string', description: 'Account email' })
|
|
67
|
+
.option('password', { type: 'string', description: 'Account password' }),
|
|
68
|
+
handler: async (argv) => {
|
|
69
|
+
const creds = (0, credentials_store_1.loadCredentials)();
|
|
70
|
+
const baseUrl = resolveUrl(argv.url, creds?.url);
|
|
71
|
+
const { token } = await resolveLogin(argv.email, argv.password, baseUrl);
|
|
72
|
+
const data = await (0, css_account_1.getAccountData)(token, baseUrl);
|
|
73
|
+
if (!data) {
|
|
74
|
+
console.error('Failed to get account info.');
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
const podEntries = Object.entries(data.pods);
|
|
78
|
+
if (podEntries.length === 0) {
|
|
79
|
+
console.log('No pods found.');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
console.log(`Found ${podEntries.length} pod(s):\n`);
|
|
83
|
+
for (const [url, name] of podEntries) {
|
|
84
|
+
console.log(` ${name}`);
|
|
85
|
+
console.log(` URL: ${url}`);
|
|
86
|
+
}
|
|
87
|
+
const webIdEntries = Object.entries(data.webIds);
|
|
88
|
+
if (webIdEntries.length > 0) {
|
|
89
|
+
console.log(`\nWebIDs:`);
|
|
90
|
+
for (const [url] of webIdEntries) {
|
|
91
|
+
console.log(` ${url}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
const podDeleteCommand = {
|
|
97
|
+
command: 'delete <name>',
|
|
98
|
+
describe: 'Delete a pod (not yet supported)',
|
|
99
|
+
builder: (yargs) => yargs
|
|
100
|
+
.positional('name', { type: 'string', demandOption: true, description: 'Pod name' })
|
|
101
|
+
.option('email', { type: 'string', description: 'Account email' })
|
|
102
|
+
.option('password', { type: 'string', description: 'Account password' }),
|
|
103
|
+
handler: async () => {
|
|
104
|
+
console.error('Pod deletion is not yet supported by CSS.');
|
|
105
|
+
console.error('Please delete the pod manually through the server admin interface.');
|
|
106
|
+
process.exit(1);
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
exports.podCommand = {
|
|
110
|
+
command: 'pod',
|
|
111
|
+
describe: 'Pod management',
|
|
112
|
+
builder: (yargs) => yargs
|
|
113
|
+
.option('url', {
|
|
114
|
+
alias: 'u',
|
|
115
|
+
type: 'string',
|
|
116
|
+
description: 'Server base URL',
|
|
117
|
+
})
|
|
118
|
+
.command(podCreateCommand)
|
|
119
|
+
.command(podListCommand)
|
|
120
|
+
.command(podDeleteCommand)
|
|
121
|
+
.demandCommand(1, 'Please specify a pod subcommand'),
|
|
122
|
+
handler: () => { },
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=pod.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pod.js","sourceRoot":"","sources":["../../../src/cli/commands/pod.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport {\n checkServer,\n login,\n getAccountData,\n createPod,\n} from '../lib/css-account';\nimport { loadCredentials } from '../lib/credentials-store';\n\ninterface PodArgs {\n url?: string;\n}\n\ninterface PodAuthArgs extends PodArgs {\n email?: string;\n password?: string;\n}\n\ninterface PodCreateArgs extends PodAuthArgs {\n name: string;\n}\n\nfunction resolveUrl(url?: string, credUrl?: string): string {\n const raw = url || credUrl || process.env.CSS_BASE_URL || 'http://localhost:3000';\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n\n/**\n * Try to login via email/password (CSS Account Token) or fall back to\n * client credentials from ~/.xpod/credentials.json.\n *\n * Returns { token, mode } where mode indicates which auth was used.\n */\nasync function resolveLogin(\n email: string | undefined,\n password: string | undefined,\n baseUrl: string,\n): Promise<{ token: string; mode: 'account' }> {\n if (email && password) {\n if (!(await checkServer(baseUrl))) {\n console.error(`Cannot reach server at ${baseUrl}`);\n process.exit(1);\n }\n const token = await login(email, password, baseUrl);\n if (!token) {\n console.error('Login failed. Check email/password.');\n process.exit(1);\n }\n return { token, mode: 'account' };\n }\n\n // Fall back to credentials store — get CSS Account Token via OIDC isn't possible,\n // but pod/account commands need CSS Account Token. For now, require email/password\n // for commands that use .account/ API.\n console.error('This command requires --email and --password (or run `xpod auth create-credentials` for other commands).');\n console.error('Pod management commands use the CSS Account API which requires email/password authentication.');\n process.exit(1);\n}\n\nconst podCreateCommand: CommandModule<PodArgs, PodCreateArgs> = {\n command: 'create <name>',\n describe: 'Create a new pod',\n builder: (yargs) =>\n yargs\n .positional('name', { type: 'string', demandOption: true, description: 'Pod name' })\n .option('email', { type: 'string', description: 'Account email' })\n .option('password', { type: 'string', description: 'Account password' }),\n handler: async (argv) => {\n const creds = loadCredentials();\n const baseUrl = resolveUrl(argv.url, creds?.url);\n const { token } = await resolveLogin(argv.email, argv.password, baseUrl);\n\n const data = await getAccountData(token, baseUrl);\n if (!data?.controls.pod) {\n console.error('Cannot find pod creation endpoint.');\n process.exit(1);\n }\n\n const result = await createPod(token, data.controls.pod, argv.name);\n if (!result) {\n console.error(`Failed to create pod \"${argv.name}\".`);\n process.exit(1);\n }\n\n console.log(`Pod created:`);\n console.log(` URL: ${result.podUrl}`);\n console.log(` WebID: ${result.webId}`);\n },\n};\n\nconst podListCommand: CommandModule<PodArgs, PodAuthArgs> = {\n command: 'list',\n describe: 'List all pods for the account',\n builder: (yargs) =>\n yargs\n .option('email', { type: 'string', description: 'Account email' })\n .option('password', { type: 'string', description: 'Account password' }),\n handler: async (argv) => {\n const creds = loadCredentials();\n const baseUrl = resolveUrl(argv.url, creds?.url);\n const { token } = await resolveLogin(argv.email, argv.password, baseUrl);\n\n const data = await getAccountData(token, baseUrl);\n if (!data) {\n console.error('Failed to get account info.');\n process.exit(1);\n }\n\n const podEntries = Object.entries(data.pods);\n if (podEntries.length === 0) {\n console.log('No pods found.');\n return;\n }\n\n console.log(`Found ${podEntries.length} pod(s):\\n`);\n for (const [url, name] of podEntries) {\n console.log(` ${name}`);\n console.log(` URL: ${url}`);\n }\n\n const webIdEntries = Object.entries(data.webIds);\n if (webIdEntries.length > 0) {\n console.log(`\\nWebIDs:`);\n for (const [url] of webIdEntries) {\n console.log(` ${url}`);\n }\n }\n },\n};\n\nconst podDeleteCommand: CommandModule<PodArgs, PodAuthArgs & { name: string }> = {\n command: 'delete <name>',\n describe: 'Delete a pod (not yet supported)',\n builder: (yargs) =>\n yargs\n .positional('name', { type: 'string', demandOption: true, description: 'Pod name' })\n .option('email', { type: 'string', description: 'Account email' })\n .option('password', { type: 'string', description: 'Account password' }),\n handler: async () => {\n console.error('Pod deletion is not yet supported by CSS.');\n console.error('Please delete the pod manually through the server admin interface.');\n process.exit(1);\n },\n};\n\nexport const podCommand: CommandModule<object, PodArgs> = {\n command: 'pod',\n describe: 'Pod management',\n builder: (yargs) =>\n yargs\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL',\n })\n .command(podCreateCommand)\n .command(podListCommand)\n .command(podDeleteCommand)\n .demandCommand(1, 'Please specify a pod subcommand'),\n handler: () => {},\n};\n"]}
|
|
@@ -83,43 +83,66 @@ exports.startCommand = {
|
|
|
83
83
|
const cssPort = await (0, runtime_1.getFreePort)(mainPort + 1);
|
|
84
84
|
const apiPort = await (0, runtime_1.getFreePort)(cssPort + 1);
|
|
85
85
|
const baseUrl = process.env.CSS_BASE_URL || `http://${argv.host}:${mainPort}/`;
|
|
86
|
+
// SP 模式:全部通过环境变量配置(.env.local 或 --env 参数)
|
|
87
|
+
// XPOD_SERVICE_TOKEN, XPOD_NODE_ID, XPOD_NODE_TOKEN, XPOD_CLOUD_API_ENDPOINT, CSS_IDP_URL
|
|
88
|
+
const idpUrl = process.env.CSS_IDP_URL || process.env.XPOD_CLOUD_API_ENDPOINT;
|
|
86
89
|
console.log('Starting xpod...');
|
|
87
90
|
console.log(` Gateway: ${baseUrl} (${argv.host}:${mainPort})`);
|
|
88
91
|
console.log(` CSS (internal): http://localhost:${cssPort}`);
|
|
89
92
|
console.log(` API (internal): http://localhost:${apiPort}`);
|
|
93
|
+
if (idpUrl) {
|
|
94
|
+
console.log(` SP mode: Cloud IdP = ${idpUrl}`);
|
|
95
|
+
}
|
|
90
96
|
const supervisor = new supervisor_1.Supervisor();
|
|
91
97
|
const cssBinary = require.resolve('@solid/community-server/bin/server.js');
|
|
92
98
|
const cssModuleRoot = path_1.default.dirname(require.resolve('@solid/community-server/package.json'));
|
|
99
|
+
const cssArgs = [cssBinary, '-c', configPath, '-m', cssModuleRoot, '-p', cssPort.toString(), '-b', baseUrl];
|
|
100
|
+
if (idpUrl) {
|
|
101
|
+
cssArgs.push('--idpUrl', idpUrl);
|
|
102
|
+
}
|
|
93
103
|
supervisor.register({
|
|
94
104
|
name: 'css',
|
|
95
105
|
command: process.execPath,
|
|
96
|
-
args:
|
|
106
|
+
args: cssArgs,
|
|
97
107
|
env: {
|
|
98
108
|
...process.env,
|
|
99
109
|
CSS_PORT: cssPort.toString(),
|
|
100
110
|
CSS_BASE_URL: baseUrl,
|
|
101
111
|
},
|
|
102
112
|
});
|
|
113
|
+
const isDevMode = __filename.endsWith('.ts');
|
|
114
|
+
const apiArgs = isDevMode
|
|
115
|
+
? [
|
|
116
|
+
'-r',
|
|
117
|
+
require.resolve('ts-node/register/transpile-only'),
|
|
118
|
+
path_1.default.resolve(__dirname, '..', '..', 'api', 'main.ts'),
|
|
119
|
+
]
|
|
120
|
+
: [path_1.default.resolve(__dirname, '..', '..', 'api', 'main.js')];
|
|
103
121
|
supervisor.register({
|
|
104
122
|
name: 'api',
|
|
105
123
|
command: process.execPath,
|
|
106
|
-
args:
|
|
124
|
+
args: apiArgs,
|
|
107
125
|
env: {
|
|
108
126
|
...process.env,
|
|
109
127
|
API_PORT: apiPort.toString(),
|
|
110
128
|
XPOD_MAIN_PORT: mainPort.toString(),
|
|
111
129
|
CSS_INTERNAL_URL: `http://localhost:${cssPort}`,
|
|
112
130
|
CSS_BASE_URL: baseUrl,
|
|
113
|
-
CSS_TOKEN_ENDPOINT:
|
|
131
|
+
CSS_TOKEN_ENDPOINT: idpUrl
|
|
132
|
+
? `${idpUrl.replace(/\/$/, '')}/.oidc/token`
|
|
133
|
+
: `${baseUrl}.oidc/token`,
|
|
114
134
|
},
|
|
115
135
|
});
|
|
116
|
-
const proxy = new runtime_1.GatewayProxy(mainPort, supervisor
|
|
136
|
+
const proxy = new runtime_1.GatewayProxy(mainPort, supervisor, '0.0.0.0', {
|
|
137
|
+
exitOnStop: true,
|
|
138
|
+
baseUrl,
|
|
139
|
+
});
|
|
117
140
|
proxy.setTargets({
|
|
118
141
|
css: `http://localhost:${cssPort}`,
|
|
119
142
|
api: `http://localhost:${apiPort}`,
|
|
120
143
|
});
|
|
121
144
|
await supervisor.startAll();
|
|
122
|
-
proxy.start();
|
|
145
|
+
await proxy.start();
|
|
123
146
|
const shutdown = async (signal) => {
|
|
124
147
|
console.log(`\nReceived ${signal}, shutting down...`);
|
|
125
148
|
await supervisor.stopAll();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport path from 'path';\nimport fs from 'fs';\nimport { Supervisor } from '../../supervisor';\nimport { GatewayProxy, getFreePort, PACKAGE_ROOT } from '../../runtime';\n\ninterface StartArgs {\n mode?: string;\n config?: string;\n env?: string;\n port: number;\n host: string;\n}\n\nfunction loadEnvFile(envPath: string): void {\n if (!fs.existsSync(envPath)) {\n console.warn(`Env file not found: ${envPath}`);\n return;\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 const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n}\n\nexport const startCommand: CommandModule<object, StartArgs> = {\n command: 'start',\n describe: 'Start xpod services',\n builder: (yargs) =>\n yargs\n .option('mode', {\n alias: 'm',\n type: 'string',\n choices: ['local', 'cloud'],\n description: 'Run mode',\n })\n .option('config', {\n alias: 'c',\n type: 'string',\n description: 'Path to config file (overrides --mode)',\n })\n .option('env', {\n alias: 'e',\n type: 'string',\n description: 'Path to .env file',\n })\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n }),\n handler: async (argv) => {\n if (argv.env) {\n loadEnvFile(argv.env);\n }\n\n const mainPort =\n argv.port !== 3000\n ? argv.port\n : parseInt(process.env.XPOD_PORT ?? process.env.PORT ?? '3000', 10);\n\n let configPath: string;\n if (argv.config) {\n configPath = argv.config;\n } else if (argv.mode) {\n configPath = path.join(PACKAGE_ROOT, `config/${argv.mode}.json`);\n } else {\n configPath = path.join(PACKAGE_ROOT, 'config/local.json');\n }\n\n const cssPort = await getFreePort(mainPort + 1);\n const apiPort = await getFreePort(cssPort + 1);\n\n const baseUrl = process.env.CSS_BASE_URL || `http://${argv.host}:${mainPort}/`;\n\n console.log('Starting xpod...');\n console.log(` Gateway: ${baseUrl} (${argv.host}:${mainPort})`);\n console.log(` CSS (internal): http://localhost:${cssPort}`);\n console.log(` 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: [cssBinary, '-c', configPath, '-m', cssModuleRoot, '-p', cssPort.toString(), '-b', baseUrl],\n env: {\n ...process.env as Record<string, string>,\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.resolve(__dirname, '..', '..', 'api', 'main.js')],\n env: {\n ...process.env as Record<string, string>,\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 const proxy = new GatewayProxy(mainPort, supervisor);\n proxy.setTargets({\n css: `http://localhost:${cssPort}`,\n api: `http://localhost:${apiPort}`,\n });\n\n await supervisor.startAll();\n proxy.start();\n\n const shutdown = async (signal: string): Promise<void> => {\n console.log(`\\nReceived ${signal}, shutting down...`);\n await supervisor.stopAll();\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport path from 'path';\nimport fs from 'fs';\nimport { Supervisor } from '../../supervisor';\nimport { GatewayProxy, getFreePort, PACKAGE_ROOT } from '../../runtime';\n\ninterface StartArgs {\n mode?: string;\n config?: string;\n env?: string;\n port: number;\n host: string;\n}\n\nfunction loadEnvFile(envPath: string): void {\n if (!fs.existsSync(envPath)) {\n console.warn(`Env file not found: ${envPath}`);\n return;\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 const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n}\n\nexport const startCommand: CommandModule<object, StartArgs> = {\n command: 'start',\n describe: 'Start xpod services',\n builder: (yargs) =>\n yargs\n .option('mode', {\n alias: 'm',\n type: 'string',\n choices: ['local', 'cloud'],\n description: 'Run mode',\n })\n .option('config', {\n alias: 'c',\n type: 'string',\n description: 'Path to config file (overrides --mode)',\n })\n .option('env', {\n alias: 'e',\n type: 'string',\n description: 'Path to .env file',\n })\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n }),\n handler: async (argv) => {\n if (argv.env) {\n loadEnvFile(argv.env);\n }\n\n const mainPort =\n argv.port !== 3000\n ? argv.port\n : parseInt(process.env.XPOD_PORT ?? process.env.PORT ?? '3000', 10);\n\n let configPath: string;\n if (argv.config) {\n configPath = argv.config;\n } else if (argv.mode) {\n configPath = path.join(PACKAGE_ROOT, `config/${argv.mode}.json`);\n } else {\n configPath = path.join(PACKAGE_ROOT, 'config/local.json');\n }\n\n const cssPort = await getFreePort(mainPort + 1);\n const apiPort = await getFreePort(cssPort + 1);\n\n const baseUrl = process.env.CSS_BASE_URL || `http://${argv.host}:${mainPort}/`;\n\n // SP 模式:全部通过环境变量配置(.env.local 或 --env 参数)\n // XPOD_SERVICE_TOKEN, XPOD_NODE_ID, XPOD_NODE_TOKEN, XPOD_CLOUD_API_ENDPOINT, CSS_IDP_URL\n const idpUrl = process.env.CSS_IDP_URL || process.env.XPOD_CLOUD_API_ENDPOINT;\n\n console.log('Starting xpod...');\n console.log(` Gateway: ${baseUrl} (${argv.host}:${mainPort})`);\n console.log(` CSS (internal): http://localhost:${cssPort}`);\n console.log(` API (internal): http://localhost:${apiPort}`);\n if (idpUrl) {\n console.log(` SP mode: Cloud IdP = ${idpUrl}`);\n }\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 const cssArgs = [cssBinary, '-c', configPath, '-m', cssModuleRoot, '-p', cssPort.toString(), '-b', baseUrl];\n if (idpUrl) {\n cssArgs.push('--idpUrl', idpUrl);\n }\n\n supervisor.register({\n name: 'css',\n command: process.execPath,\n args: cssArgs,\n env: {\n ...process.env as Record<string, string>,\n CSS_PORT: cssPort.toString(),\n CSS_BASE_URL: baseUrl,\n },\n });\n\n const isDevMode = __filename.endsWith('.ts');\n const apiArgs = isDevMode\n ? [\n '-r',\n require.resolve('ts-node/register/transpile-only'),\n path.resolve(__dirname, '..', '..', 'api', 'main.ts'),\n ]\n : [path.resolve(__dirname, '..', '..', 'api', 'main.js')];\n\n supervisor.register({\n name: 'api',\n command: process.execPath,\n args: apiArgs,\n env: {\n ...process.env as Record<string, string>,\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: idpUrl\n ? `${idpUrl.replace(/\\/$/, '')}/.oidc/token`\n : `${baseUrl}.oidc/token`,\n },\n });\n\n const proxy = new GatewayProxy(mainPort, supervisor, '0.0.0.0', {\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 const shutdown = async (signal: string): Promise<void> => {\n console.log(`\\nReceived ${signal}, shutting down...`);\n await supervisor.stopAll();\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n },\n};\n"]}
|
package/dist/cli/index.js
CHANGED
|
@@ -13,6 +13,10 @@ const logs_1 = require("./commands/logs");
|
|
|
13
13
|
const auth_1 = require("./commands/auth");
|
|
14
14
|
const config_1 = require("./commands/config");
|
|
15
15
|
const import_1 = require("./commands/import");
|
|
16
|
+
const pod_1 = require("./commands/pod");
|
|
17
|
+
const account_1 = require("./commands/account");
|
|
18
|
+
const backup_1 = require("./commands/backup");
|
|
19
|
+
const doctor_1 = require("./commands/doctor");
|
|
16
20
|
(0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
17
21
|
.scriptName('xpod')
|
|
18
22
|
.usage('$0 <command> [options]')
|
|
@@ -23,6 +27,11 @@ const import_1 = require("./commands/import");
|
|
|
23
27
|
.command(auth_1.authCommand)
|
|
24
28
|
.command(config_1.configCommand)
|
|
25
29
|
.command(import_1.importCommand)
|
|
30
|
+
.command(pod_1.podCommand)
|
|
31
|
+
.command(account_1.accountCommand)
|
|
32
|
+
.command(backup_1.backupCommand)
|
|
33
|
+
.command(backup_1.restoreCommand)
|
|
34
|
+
.command(doctor_1.doctorCommand)
|
|
26
35
|
.demandCommand(1, 'Please specify a command')
|
|
27
36
|
.strict()
|
|
28
37
|
.help()
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;AACA,kDAA0B;AAC1B,2CAAwC;AACxC,4CAAgD;AAChD,0CAA8C;AAC9C,8CAAkD;AAClD,0CAA8C;AAC9C,0CAA8C;AAC9C,8CAAkD;AAClD,8CAAkD;AAElD,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACzB,UAAU,CAAC,MAAM,CAAC;KAClB,KAAK,CAAC,wBAAwB,CAAC;KAC/B,OAAO,CAAC,oBAAY,CAAC;KACrB,OAAO,CAAC,kBAAW,CAAC;KACpB,OAAO,CAAC,sBAAa,CAAC;KACtB,OAAO,CAAC,kBAAW,CAAC;KACpB,OAAO,CAAC,kBAAW,CAAC;KACpB,OAAO,CAAC,sBAAa,CAAC;KACtB,OAAO,CAAC,sBAAa,CAAC;KACtB,aAAa,CAAC,CAAC,EAAE,0BAA0B,CAAC;KAC5C,MAAM,EAAE;KACR,IAAI,EAAE;KACN,KAAK,EAAE,CAAC","sourcesContent":["#!/usr/bin/env node\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { startCommand } from './commands/start';\nimport { stopCommand } from './commands/stop';\nimport { statusCommand } from './commands/status';\nimport { logsCommand } from './commands/logs';\nimport { authCommand } from './commands/auth';\nimport { configCommand } from './commands/config';\nimport { importCommand } from './commands/import';\n\nyargs(hideBin(process.argv))\n .scriptName('xpod')\n .usage('$0 <command> [options]')\n .command(startCommand)\n .command(stopCommand)\n .command(statusCommand)\n .command(logsCommand)\n .command(authCommand)\n .command(configCommand)\n .command(importCommand)\n .demandCommand(1, 'Please specify a command')\n .strict()\n .help()\n .parse();\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;AACA,kDAA0B;AAC1B,2CAAwC;AACxC,4CAAgD;AAChD,0CAA8C;AAC9C,8CAAkD;AAClD,0CAA8C;AAC9C,0CAA8C;AAC9C,8CAAkD;AAClD,8CAAkD;AAClD,wCAA4C;AAC5C,gDAAoD;AACpD,8CAAkE;AAClE,8CAAkD;AAElD,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACzB,UAAU,CAAC,MAAM,CAAC;KAClB,KAAK,CAAC,wBAAwB,CAAC;KAC/B,OAAO,CAAC,oBAAY,CAAC;KACrB,OAAO,CAAC,kBAAW,CAAC;KACpB,OAAO,CAAC,sBAAa,CAAC;KACtB,OAAO,CAAC,kBAAW,CAAC;KACpB,OAAO,CAAC,kBAAW,CAAC;KACpB,OAAO,CAAC,sBAAa,CAAC;KACtB,OAAO,CAAC,sBAAa,CAAC;KACtB,OAAO,CAAC,gBAAU,CAAC;KACnB,OAAO,CAAC,wBAAc,CAAC;KACvB,OAAO,CAAC,sBAAa,CAAC;KACtB,OAAO,CAAC,uBAAc,CAAC;KACvB,OAAO,CAAC,sBAAa,CAAC;KACtB,aAAa,CAAC,CAAC,EAAE,0BAA0B,CAAC;KAC5C,MAAM,EAAE;KACR,IAAI,EAAE;KACN,KAAK,EAAE,CAAC","sourcesContent":["#!/usr/bin/env node\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { startCommand } from './commands/start';\nimport { stopCommand } from './commands/stop';\nimport { statusCommand } from './commands/status';\nimport { logsCommand } from './commands/logs';\nimport { authCommand } from './commands/auth';\nimport { configCommand } from './commands/config';\nimport { importCommand } from './commands/import';\nimport { podCommand } from './commands/pod';\nimport { accountCommand } from './commands/account';\nimport { backupCommand, restoreCommand } from './commands/backup';\nimport { doctorCommand } from './commands/doctor';\n\nyargs(hideBin(process.argv))\n .scriptName('xpod')\n .usage('$0 <command> [options]')\n .command(startCommand)\n .command(stopCommand)\n .command(statusCommand)\n .command(logsCommand)\n .command(authCommand)\n .command(configCommand)\n .command(importCommand)\n .command(podCommand)\n .command(accountCommand)\n .command(backupCommand)\n .command(restoreCommand)\n .command(doctorCommand)\n .demandCommand(1, 'Please specify a command')\n .strict()\n .help()\n .parse();\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface StoredConfig {
|
|
2
|
+
url: string;
|
|
3
|
+
webId: string;
|
|
4
|
+
}
|
|
5
|
+
export interface StoredSecrets {
|
|
6
|
+
clientId: string;
|
|
7
|
+
clientSecret: string;
|
|
8
|
+
}
|
|
9
|
+
export interface StoredCredentials extends StoredConfig, StoredSecrets {
|
|
10
|
+
}
|
|
11
|
+
export declare function getConfigPath(): string;
|
|
12
|
+
export declare function getSecretsPath(): string;
|
|
13
|
+
export declare function saveCredentials(creds: StoredCredentials): void;
|
|
14
|
+
export declare function loadConfig(): StoredConfig | null;
|
|
15
|
+
export declare function loadSecrets(): StoredSecrets | null;
|
|
16
|
+
export declare function loadCredentials(): StoredCredentials | null;
|
|
17
|
+
export declare function clearCredentials(): void;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getConfigPath = getConfigPath;
|
|
4
|
+
exports.getSecretsPath = getSecretsPath;
|
|
5
|
+
exports.saveCredentials = saveCredentials;
|
|
6
|
+
exports.loadConfig = loadConfig;
|
|
7
|
+
exports.loadSecrets = loadSecrets;
|
|
8
|
+
exports.loadCredentials = loadCredentials;
|
|
9
|
+
exports.clearCredentials = clearCredentials;
|
|
10
|
+
/**
|
|
11
|
+
* CLI credential storage split into two files:
|
|
12
|
+
*
|
|
13
|
+
* ~/.xpod/config.json — base config (url, webId), chmod 644
|
|
14
|
+
* ~/.xpod/secrets.json — secrets (clientId, clientSecret), chmod 600
|
|
15
|
+
*/
|
|
16
|
+
const fs_1 = require("fs");
|
|
17
|
+
const path_1 = require("path");
|
|
18
|
+
const os_1 = require("os");
|
|
19
|
+
function xpodDir() {
|
|
20
|
+
return (0, path_1.join)((0, os_1.homedir)(), '.xpod');
|
|
21
|
+
}
|
|
22
|
+
function getConfigPath() {
|
|
23
|
+
return (0, path_1.join)(xpodDir(), 'config.json');
|
|
24
|
+
}
|
|
25
|
+
function getSecretsPath() {
|
|
26
|
+
return (0, path_1.join)(xpodDir(), 'secrets.json');
|
|
27
|
+
}
|
|
28
|
+
function saveCredentials(creds) {
|
|
29
|
+
const dir = xpodDir();
|
|
30
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
31
|
+
const configPath = getConfigPath();
|
|
32
|
+
(0, fs_1.writeFileSync)(configPath, JSON.stringify({ url: creds.url, webId: creds.webId }, null, 2) + '\n', 'utf-8');
|
|
33
|
+
(0, fs_1.chmodSync)(configPath, 0o644);
|
|
34
|
+
const secretsPath = getSecretsPath();
|
|
35
|
+
(0, fs_1.writeFileSync)(secretsPath, JSON.stringify({ clientId: creds.clientId, clientSecret: creds.clientSecret }, null, 2) + '\n', 'utf-8');
|
|
36
|
+
(0, fs_1.chmodSync)(secretsPath, 0o600);
|
|
37
|
+
}
|
|
38
|
+
function readJson(filePath) {
|
|
39
|
+
try {
|
|
40
|
+
return JSON.parse((0, fs_1.readFileSync)(filePath, 'utf-8'));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function loadConfig() {
|
|
47
|
+
const data = readJson(getConfigPath());
|
|
48
|
+
if (data && typeof data.url === 'string' && typeof data.webId === 'string') {
|
|
49
|
+
return { url: data.url, webId: data.webId };
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
function loadSecrets() {
|
|
54
|
+
const data = readJson(getSecretsPath());
|
|
55
|
+
if (data && typeof data.clientId === 'string' && typeof data.clientSecret === 'string') {
|
|
56
|
+
return { clientId: data.clientId, clientSecret: data.clientSecret };
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
function loadCredentials() {
|
|
61
|
+
const config = loadConfig();
|
|
62
|
+
const secrets = loadSecrets();
|
|
63
|
+
if (!config || !secrets)
|
|
64
|
+
return null;
|
|
65
|
+
return { ...config, ...secrets };
|
|
66
|
+
}
|
|
67
|
+
function clearCredentials() {
|
|
68
|
+
for (const p of [getConfigPath(), getSecretsPath()]) {
|
|
69
|
+
if ((0, fs_1.existsSync)(p))
|
|
70
|
+
(0, fs_1.unlinkSync)(p);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=credentials-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials-store.js","sourceRoot":"","sources":["../../../src/cli/lib/credentials-store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CLI credential storage split into two files:\n *\n * ~/.xpod/config.json — base config (url, webId), chmod 644\n * ~/.xpod/secrets.json — secrets (clientId, clientSecret), chmod 600\n */\nimport { mkdirSync, writeFileSync, readFileSync, unlinkSync, chmodSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nexport interface StoredConfig {\n url: string;\n webId: string;\n}\n\nexport interface StoredSecrets {\n clientId: string;\n clientSecret: string;\n}\n\nexport interface StoredCredentials extends StoredConfig, StoredSecrets {}\n\nfunction xpodDir(): string {\n return join(homedir(), '.xpod');\n}\n\nexport function getConfigPath(): string {\n return join(xpodDir(), 'config.json');\n}\n\nexport function getSecretsPath(): string {\n return join(xpodDir(), 'secrets.json');\n}\n\nexport function saveCredentials(creds: StoredCredentials): void {\n const dir = xpodDir();\n mkdirSync(dir, { recursive: true });\n\n const configPath = getConfigPath();\n writeFileSync(configPath, JSON.stringify({ url: creds.url, webId: creds.webId }, null, 2) + '\\n', 'utf-8');\n chmodSync(configPath, 0o644);\n\n const secretsPath = getSecretsPath();\n writeFileSync(secretsPath, JSON.stringify({ clientId: creds.clientId, clientSecret: creds.clientSecret }, null, 2) + '\\n', 'utf-8');\n chmodSync(secretsPath, 0o600);\n}\n\nfunction readJson<T>(filePath: string): T | null {\n try {\n return JSON.parse(readFileSync(filePath, 'utf-8')) as T;\n } catch {\n return null;\n }\n}\n\nexport function loadConfig(): StoredConfig | null {\n const data = readJson<Record<string, unknown>>(getConfigPath());\n if (data && typeof data.url === 'string' && typeof data.webId === 'string') {\n return { url: data.url, webId: data.webId };\n }\n return null;\n}\n\nexport function loadSecrets(): StoredSecrets | null {\n const data = readJson<Record<string, unknown>>(getSecretsPath());\n if (data && typeof data.clientId === 'string' && typeof data.clientSecret === 'string') {\n return { clientId: data.clientId, clientSecret: data.clientSecret };\n }\n return null;\n}\n\nexport function loadCredentials(): StoredCredentials | null {\n const config = loadConfig();\n const secrets = loadSecrets();\n if (!config || !secrets) return null;\n return { ...config, ...secrets };\n}\n\nexport function clearCredentials(): void {\n for (const p of [getConfigPath(), getSecretsPath()]) {\n if (existsSync(p)) unlinkSync(p);\n }\n}\n"]}
|
|
@@ -8,6 +8,12 @@ export interface AccountControls {
|
|
|
8
8
|
clientCredentials?: string;
|
|
9
9
|
webId?: string[];
|
|
10
10
|
}
|
|
11
|
+
export interface AccountData {
|
|
12
|
+
controls: AccountControls;
|
|
13
|
+
pods: Record<string, string>;
|
|
14
|
+
webIds: Record<string, string>;
|
|
15
|
+
clientCredentials: Record<string, string>;
|
|
16
|
+
}
|
|
11
17
|
export interface ClientCredential {
|
|
12
18
|
id: string;
|
|
13
19
|
secret?: string;
|
|
@@ -26,6 +32,17 @@ export declare function login(email: string, password: string, baseUrl?: string)
|
|
|
26
32
|
* Fetch account controls (endpoints for pod/credential management).
|
|
27
33
|
*/
|
|
28
34
|
export declare function getAccountControls(token: string, baseUrl?: string): Promise<AccountControls | null>;
|
|
35
|
+
/**
|
|
36
|
+
* Fetch full account data including pods, webIds, and credentials.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getAccountData(token: string, baseUrl?: string): Promise<AccountData | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Create a new pod for the account.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createPod(token: string, podEndpoint: string, podName: string): Promise<{
|
|
43
|
+
podUrl: string;
|
|
44
|
+
webId: string;
|
|
45
|
+
} | null>;
|
|
29
46
|
/**
|
|
30
47
|
* Create a new client credential bound to a WebID.
|
|
31
48
|
*/
|
|
@@ -8,6 +8,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
8
8
|
exports.checkServer = checkServer;
|
|
9
9
|
exports.login = login;
|
|
10
10
|
exports.getAccountControls = getAccountControls;
|
|
11
|
+
exports.getAccountData = getAccountData;
|
|
12
|
+
exports.createPod = createPod;
|
|
11
13
|
exports.createClientCredentials = createClientCredentials;
|
|
12
14
|
exports.listClientCredentials = listClientCredentials;
|
|
13
15
|
exports.revokeClientCredential = revokeClientCredential;
|
|
@@ -76,6 +78,60 @@ async function getAccountControls(token, baseUrl) {
|
|
|
76
78
|
return null;
|
|
77
79
|
}
|
|
78
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Fetch full account data including pods, webIds, and credentials.
|
|
83
|
+
*/
|
|
84
|
+
async function getAccountData(token, baseUrl) {
|
|
85
|
+
const base = resolveBaseUrl(baseUrl);
|
|
86
|
+
try {
|
|
87
|
+
const res = await fetch(`${base}.account/`, {
|
|
88
|
+
headers: {
|
|
89
|
+
Accept: 'application/json',
|
|
90
|
+
Authorization: `CSS-Account-Token ${token}`,
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
if (!res.ok)
|
|
94
|
+
return null;
|
|
95
|
+
const data = (await res.json());
|
|
96
|
+
return {
|
|
97
|
+
controls: {
|
|
98
|
+
pod: data.controls?.account?.pod,
|
|
99
|
+
clientCredentials: data.controls?.account?.clientCredentials,
|
|
100
|
+
},
|
|
101
|
+
pods: data.pods ?? {},
|
|
102
|
+
webIds: data.webIds ?? {},
|
|
103
|
+
clientCredentials: data.clientCredentials ?? {},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Create a new pod for the account.
|
|
112
|
+
*/
|
|
113
|
+
async function createPod(token, podEndpoint, podName) {
|
|
114
|
+
try {
|
|
115
|
+
const res = await fetch(podEndpoint, {
|
|
116
|
+
method: 'POST',
|
|
117
|
+
headers: {
|
|
118
|
+
'Content-Type': 'application/json',
|
|
119
|
+
Accept: 'application/json',
|
|
120
|
+
Authorization: `CSS-Account-Token ${token}`,
|
|
121
|
+
},
|
|
122
|
+
body: JSON.stringify({ name: podName }),
|
|
123
|
+
});
|
|
124
|
+
if (!res.ok)
|
|
125
|
+
return null;
|
|
126
|
+
const data = (await res.json());
|
|
127
|
+
if (!data.pod || !data.webId)
|
|
128
|
+
return null;
|
|
129
|
+
return { podUrl: data.pod, webId: data.webId };
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
79
135
|
/**
|
|
80
136
|
* Create a new client credential bound to a WebID.
|
|
81
137
|
*/
|