@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,374 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.startXpodRuntime = startXpodRuntime;
|
|
7
|
+
const community_server_1 = require("@solid/community-server");
|
|
8
|
+
const node_crypto_1 = require("node:crypto");
|
|
9
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
10
|
+
const node_net_1 = __importDefault(require("node:net"));
|
|
11
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
12
|
+
const global_logger_factory_1 = require("global-logger-factory");
|
|
13
|
+
const ConfigurableLoggerFactory_1 = require("../logging/ConfigurableLoggerFactory");
|
|
14
|
+
const db_1 = require("../identity/drizzle/db");
|
|
15
|
+
const runtime_1 = require("../api/runtime");
|
|
16
|
+
const Supervisor_1 = require("../supervisor/Supervisor");
|
|
17
|
+
const env_utils_1 = require("./env-utils");
|
|
18
|
+
const port_finder_1 = require("./port-finder");
|
|
19
|
+
const Proxy_1 = require("./Proxy");
|
|
20
|
+
const socket_fetch_1 = require("./socket-fetch");
|
|
21
|
+
const socket_http_1 = require("./socket-http");
|
|
22
|
+
const socket_utils_1 = require("./socket-utils");
|
|
23
|
+
function findPackageRoot(dir) {
|
|
24
|
+
let current = dir;
|
|
25
|
+
while (current !== node_path_1.default.dirname(current)) {
|
|
26
|
+
if (node_fs_1.default.existsSync(node_path_1.default.join(current, 'package.json'))) {
|
|
27
|
+
return current;
|
|
28
|
+
}
|
|
29
|
+
current = node_path_1.default.dirname(current);
|
|
30
|
+
}
|
|
31
|
+
return dir;
|
|
32
|
+
}
|
|
33
|
+
const PACKAGE_ROOT = findPackageRoot(__dirname);
|
|
34
|
+
const BASE_PROCESS_ENV = { ...process.env };
|
|
35
|
+
function ensureTrailingSlash(url) {
|
|
36
|
+
return url.endsWith('/') ? url : `${url}/`;
|
|
37
|
+
}
|
|
38
|
+
function withDefinedEntries(entries) {
|
|
39
|
+
const result = {};
|
|
40
|
+
for (const [key, value] of entries) {
|
|
41
|
+
if (value !== undefined) {
|
|
42
|
+
result[key] = value;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
function resolveRuntimeShorthand(env, options, mode, cssAuthMode, baseUrl, rootFilePath, sparqlEndpoint, identityDbUrl, usageDbUrl, logLevel) {
|
|
48
|
+
const envValue = (key) => env[key] ?? BASE_PROCESS_ENV[key];
|
|
49
|
+
return {
|
|
50
|
+
...withDefinedEntries([
|
|
51
|
+
['baseStorageDomain', envValue('CSS_BASE_STORAGE_DOMAIN')],
|
|
52
|
+
['minioAccessKey', envValue('CSS_MINIO_ACCESS_KEY')],
|
|
53
|
+
['minioSecretKey', envValue('CSS_MINIO_SECRET_KEY')],
|
|
54
|
+
['minioEndpoint', envValue('CSS_MINIO_ENDPOINT')],
|
|
55
|
+
['minioBucketName', envValue('CSS_MINIO_BUCKET_NAME')],
|
|
56
|
+
['redisClient', envValue('CSS_REDIS_CLIENT')],
|
|
57
|
+
['redisUsername', envValue('CSS_REDIS_USERNAME')],
|
|
58
|
+
['redisPassword', envValue('CSS_REDIS_PASSWORD')],
|
|
59
|
+
['emailConfigHost', envValue('CSS_EMAIL_CONFIG_HOST')],
|
|
60
|
+
['emailConfigPort', envValue('CSS_EMAIL_CONFIG_PORT')],
|
|
61
|
+
['emailConfigAuthUser', envValue('CSS_EMAIL_CONFIG_AUTH_USER')],
|
|
62
|
+
['emailConfigAuthPass', envValue('CSS_EMAIL_CONFIG_AUTH_PASS')],
|
|
63
|
+
['idpUrl', envValue('CSS_IDP_URL') ?? envValue('XPOD_CLOUD_API_ENDPOINT')],
|
|
64
|
+
['allowedHosts', envValue('CSS_ALLOWED_HOSTS')],
|
|
65
|
+
['nodeId', envValue('XPOD_NODE_ID')],
|
|
66
|
+
['nodeToken', envValue('XPOD_NODE_TOKEN')],
|
|
67
|
+
['serviceToken', envValue('XPOD_SERVICE_TOKEN')],
|
|
68
|
+
]),
|
|
69
|
+
baseUrl,
|
|
70
|
+
rootFilePath,
|
|
71
|
+
sparqlEndpoint,
|
|
72
|
+
identityDbUrl,
|
|
73
|
+
usageDbUrl,
|
|
74
|
+
logLevel,
|
|
75
|
+
authMode: cssAuthMode,
|
|
76
|
+
edition: mode === 'cloud' ? 'server' : 'local',
|
|
77
|
+
edgeNodesEnabled: options.edgeNodesEnabled ?? false,
|
|
78
|
+
centerRegistrationEnabled: options.centerRegistrationEnabled ?? false,
|
|
79
|
+
...(options.shorthand ?? {}),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function normalizeDatabaseUrl(value) {
|
|
83
|
+
if (value.startsWith('sqlite:') ||
|
|
84
|
+
value.startsWith('postgres://') ||
|
|
85
|
+
value.startsWith('postgresql://') ||
|
|
86
|
+
value.startsWith('mysql://')) {
|
|
87
|
+
return value;
|
|
88
|
+
}
|
|
89
|
+
return `sqlite:${node_path_1.default.resolve(value)}`;
|
|
90
|
+
}
|
|
91
|
+
function resolveTransport(options) {
|
|
92
|
+
if (options.transport === 'socket' || options.transport === 'port') {
|
|
93
|
+
return options.transport;
|
|
94
|
+
}
|
|
95
|
+
return process.platform === 'win32' ? 'port' : 'socket';
|
|
96
|
+
}
|
|
97
|
+
function createCssRuntimeConfig(configPath, runtimeRoot, open) {
|
|
98
|
+
if (!open) {
|
|
99
|
+
return configPath;
|
|
100
|
+
}
|
|
101
|
+
const runtimeConfigPath = node_path_1.default.join(runtimeRoot, 'css-runtime.config.json');
|
|
102
|
+
node_fs_1.default.writeFileSync(runtimeConfigPath, JSON.stringify({
|
|
103
|
+
'@context': [
|
|
104
|
+
'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld',
|
|
105
|
+
'https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld',
|
|
106
|
+
],
|
|
107
|
+
import: [
|
|
108
|
+
configPath,
|
|
109
|
+
node_path_1.default.join(PACKAGE_ROOT, 'config/runtime-open.json'),
|
|
110
|
+
],
|
|
111
|
+
}, null, 2));
|
|
112
|
+
return runtimeConfigPath;
|
|
113
|
+
}
|
|
114
|
+
function createOpenAuthContext(baseUrl, override) {
|
|
115
|
+
if (override) {
|
|
116
|
+
return override;
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
type: 'solid',
|
|
120
|
+
webId: new URL('test/profile/card#me', ensureTrailingSlash(baseUrl)).href,
|
|
121
|
+
accountId: 'xpod-open-account',
|
|
122
|
+
displayName: 'Xpod Open Mode',
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function initLogger(level) {
|
|
126
|
+
const loggerFactory = new ConfigurableLoggerFactory_1.ConfigurableLoggerFactory(level, {
|
|
127
|
+
fileName: node_path_1.default.join(process.cwd(), 'logs/xpod-%DATE%.log'),
|
|
128
|
+
showLocation: true,
|
|
129
|
+
});
|
|
130
|
+
(0, global_logger_factory_1.setGlobalLoggerFactory)(loggerFactory);
|
|
131
|
+
}
|
|
132
|
+
async function waitForTcpReady(port, host = '127.0.0.1', timeoutMs = 5_000) {
|
|
133
|
+
const deadline = Date.now() + timeoutMs;
|
|
134
|
+
while (Date.now() < deadline) {
|
|
135
|
+
const ready = await new Promise((resolve) => {
|
|
136
|
+
const socket = new node_net_1.default.Socket();
|
|
137
|
+
socket.setTimeout(500);
|
|
138
|
+
socket.once('connect', () => {
|
|
139
|
+
socket.destroy();
|
|
140
|
+
resolve(true);
|
|
141
|
+
});
|
|
142
|
+
socket.once('error', () => {
|
|
143
|
+
socket.destroy();
|
|
144
|
+
resolve(false);
|
|
145
|
+
});
|
|
146
|
+
socket.once('timeout', () => {
|
|
147
|
+
socket.destroy();
|
|
148
|
+
resolve(false);
|
|
149
|
+
});
|
|
150
|
+
socket.connect(port, host);
|
|
151
|
+
});
|
|
152
|
+
if (ready) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
156
|
+
}
|
|
157
|
+
throw new Error(`Timed out waiting for CSS on ${host}:${port}`);
|
|
158
|
+
}
|
|
159
|
+
async function startXpodRuntime(options = {}) {
|
|
160
|
+
const id = (0, node_crypto_1.randomUUID)().slice(0, 8);
|
|
161
|
+
const mode = options.mode ?? 'local';
|
|
162
|
+
const transport = resolveTransport(options);
|
|
163
|
+
const bindHost = options.bindHost ?? '127.0.0.1';
|
|
164
|
+
const runtimeRoot = node_path_1.default.resolve(options.runtimeRoot ?? node_path_1.default.join(process.cwd(), '.test-data', 'xpod-runtime', id));
|
|
165
|
+
const rootFilePath = node_path_1.default.resolve(options.rootFilePath ?? node_path_1.default.join(runtimeRoot, 'data'));
|
|
166
|
+
const sparqlEndpoint = normalizeDatabaseUrl(options.sparqlEndpoint ?? node_path_1.default.join(runtimeRoot, 'quadstore.sqlite'));
|
|
167
|
+
const identityDbUrl = normalizeDatabaseUrl(options.identityDbUrl ?? node_path_1.default.join(runtimeRoot, 'identity.sqlite'));
|
|
168
|
+
const usageDbUrl = normalizeDatabaseUrl(options.usageDbUrl ?? node_path_1.default.join(runtimeRoot, 'usage.sqlite'));
|
|
169
|
+
const cssAuthMode = options.authMode ?? (options.open ? 'allow-all' : 'acp');
|
|
170
|
+
const apiOpen = options.apiOpen ?? options.open ?? false;
|
|
171
|
+
const logLevel = options.logLevel ?? process.env.CSS_LOGGING_LEVEL ?? 'warn';
|
|
172
|
+
node_fs_1.default.mkdirSync(runtimeRoot, { recursive: true });
|
|
173
|
+
node_fs_1.default.mkdirSync(rootFilePath, { recursive: true });
|
|
174
|
+
const socketsRoot = node_path_1.default.join(runtimeRoot, 'sockets');
|
|
175
|
+
const ports = {
|
|
176
|
+
gateway: undefined,
|
|
177
|
+
css: undefined,
|
|
178
|
+
api: undefined,
|
|
179
|
+
};
|
|
180
|
+
const sockets = {
|
|
181
|
+
gateway: undefined,
|
|
182
|
+
css: undefined,
|
|
183
|
+
api: undefined,
|
|
184
|
+
};
|
|
185
|
+
if (transport === 'socket') {
|
|
186
|
+
sockets.gateway = node_path_1.default.resolve(options.gatewaySocketPath ?? node_path_1.default.join(socketsRoot, 'gateway.sock'));
|
|
187
|
+
sockets.api = node_path_1.default.resolve(options.apiSocketPath ?? node_path_1.default.join(socketsRoot, 'api.sock'));
|
|
188
|
+
ports.gateway = options.gatewayPort ?? await (0, port_finder_1.getFreePort)(5600);
|
|
189
|
+
ports.css = options.cssPort ?? await (0, port_finder_1.getFreePort)((ports.gateway ?? 5600) + 1);
|
|
190
|
+
ports.api = options.apiPort ?? await (0, port_finder_1.getFreePort)((ports.css ?? 5601) + 1);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
ports.gateway = options.gatewayPort ?? await (0, port_finder_1.getFreePort)(5600);
|
|
194
|
+
ports.css = options.cssPort ?? await (0, port_finder_1.getFreePort)((ports.gateway ?? 5600) + 1);
|
|
195
|
+
ports.api = options.apiPort ?? await (0, port_finder_1.getFreePort)((ports.css ?? 5601) + 1);
|
|
196
|
+
}
|
|
197
|
+
const baseUrl = ensureTrailingSlash(options.baseUrl ?? (transport === 'socket'
|
|
198
|
+
? 'http://localhost'
|
|
199
|
+
: `http://${bindHost}:${ports.gateway}`));
|
|
200
|
+
initLogger(logLevel);
|
|
201
|
+
const logger = (0, global_logger_factory_1.getLoggerFor)('XpodRuntime');
|
|
202
|
+
const envFilePath = options.envFile ? node_path_1.default.resolve(options.envFile) : undefined;
|
|
203
|
+
const envFromFile = envFilePath ? (0, env_utils_1.loadEnvFile)(envFilePath) : {};
|
|
204
|
+
const runtimeEnv = {
|
|
205
|
+
...envFromFile,
|
|
206
|
+
...options.env,
|
|
207
|
+
XPOD_ENV_PATH: envFilePath,
|
|
208
|
+
XPOD_EDITION: mode,
|
|
209
|
+
CSS_BASE_URL: baseUrl,
|
|
210
|
+
CSS_TOKEN_ENDPOINT: `${baseUrl}.oidc/token`,
|
|
211
|
+
CSS_ROOT_FILE_PATH: rootFilePath,
|
|
212
|
+
CSS_IDENTITY_DB_URL: identityDbUrl,
|
|
213
|
+
DATABASE_URL: identityDbUrl,
|
|
214
|
+
CSS_PORT: String(ports.css ?? 0),
|
|
215
|
+
API_PORT: String(ports.api ?? 0),
|
|
216
|
+
API_HOST: bindHost,
|
|
217
|
+
API_SOCKET_PATH: sockets.api,
|
|
218
|
+
XPOD_MAIN_PORT: String(ports.gateway ?? 0),
|
|
219
|
+
CORS_ORIGINS: new URL(baseUrl).origin,
|
|
220
|
+
CSS_LOGGING_LEVEL: logLevel,
|
|
221
|
+
};
|
|
222
|
+
const restoreEnv = (0, env_utils_1.applyEnv)(runtimeEnv);
|
|
223
|
+
let envRestored = false;
|
|
224
|
+
const restoreRuntimeEnv = () => {
|
|
225
|
+
if (envRestored) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
envRestored = true;
|
|
229
|
+
restoreEnv();
|
|
230
|
+
};
|
|
231
|
+
const runtimeShorthand = resolveRuntimeShorthand(runtimeEnv, options, mode, cssAuthMode, baseUrl, rootFilePath, sparqlEndpoint, identityDbUrl, usageDbUrl, logLevel);
|
|
232
|
+
const unregisterSocketFetch = transport === 'socket'
|
|
233
|
+
? (0, socket_fetch_1.registerSocketFetchOrigin)(baseUrl, sockets.gateway)
|
|
234
|
+
: async () => undefined;
|
|
235
|
+
const unregisterSocketHttp = transport === 'socket'
|
|
236
|
+
? (0, socket_http_1.registerSocketHttpOrigin)(baseUrl, sockets.gateway)
|
|
237
|
+
: async () => undefined;
|
|
238
|
+
const supervisor = new Supervisor_1.Supervisor({ handleProcessSignals: false });
|
|
239
|
+
let cssApp;
|
|
240
|
+
let apiService;
|
|
241
|
+
let gateway;
|
|
242
|
+
let stopped = false;
|
|
243
|
+
let stopPromise;
|
|
244
|
+
const stop = async () => {
|
|
245
|
+
if (stopPromise) {
|
|
246
|
+
return stopPromise;
|
|
247
|
+
}
|
|
248
|
+
stopPromise = (async () => {
|
|
249
|
+
if (stopped) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
stopped = true;
|
|
253
|
+
try {
|
|
254
|
+
if (gateway) {
|
|
255
|
+
await gateway.stop();
|
|
256
|
+
supervisor.setStatus('gateway', 'stopped');
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
logger.warn(`Failed to stop gateway: ${String(error)}`);
|
|
261
|
+
}
|
|
262
|
+
try {
|
|
263
|
+
if (apiService) {
|
|
264
|
+
await apiService.stop();
|
|
265
|
+
supervisor.setStatus('api', 'stopped');
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
logger.warn(`Failed to stop api: ${String(error)}`);
|
|
270
|
+
}
|
|
271
|
+
try {
|
|
272
|
+
if (cssApp) {
|
|
273
|
+
await cssApp.stop();
|
|
274
|
+
supervisor.setStatus('css', 'stopped');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
logger.warn(`Failed to stop css: ${String(error)}`);
|
|
279
|
+
}
|
|
280
|
+
if (sockets.css) {
|
|
281
|
+
(0, socket_utils_1.removeSocketPath)(sockets.css);
|
|
282
|
+
}
|
|
283
|
+
if (sockets.api) {
|
|
284
|
+
(0, socket_utils_1.removeSocketPath)(sockets.api);
|
|
285
|
+
}
|
|
286
|
+
await unregisterSocketFetch();
|
|
287
|
+
await unregisterSocketHttp();
|
|
288
|
+
await (0, db_1.closeAllIdentityConnections)();
|
|
289
|
+
restoreRuntimeEnv();
|
|
290
|
+
})();
|
|
291
|
+
return stopPromise;
|
|
292
|
+
};
|
|
293
|
+
supervisor.registerManaged('css', async () => {
|
|
294
|
+
if (cssApp) {
|
|
295
|
+
await cssApp.stop();
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
supervisor.registerManaged('api', async () => {
|
|
299
|
+
if (apiService) {
|
|
300
|
+
await apiService.stop();
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
supervisor.registerManaged('gateway', async () => {
|
|
304
|
+
if (gateway) {
|
|
305
|
+
await gateway.stop();
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
try {
|
|
309
|
+
const runner = new community_server_1.AppRunner();
|
|
310
|
+
const configPath = node_path_1.default.join(PACKAGE_ROOT, `config/${mode}.json`);
|
|
311
|
+
const cssConfigPath = createCssRuntimeConfig(configPath, runtimeRoot, options.open || cssAuthMode === 'allow-all');
|
|
312
|
+
supervisor.setStatus('css', 'starting', { startTime: Date.now() });
|
|
313
|
+
cssApp = await runner.create({
|
|
314
|
+
config: cssConfigPath,
|
|
315
|
+
loaderProperties: {
|
|
316
|
+
mainModulePath: PACKAGE_ROOT,
|
|
317
|
+
logLevel: logLevel,
|
|
318
|
+
},
|
|
319
|
+
shorthand: {
|
|
320
|
+
...(sockets.css ? { socket: sockets.css } : { port: ports.css }),
|
|
321
|
+
...runtimeShorthand,
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
await cssApp.start();
|
|
325
|
+
await waitForTcpReady(ports.css, '127.0.0.1');
|
|
326
|
+
supervisor.addLog('css', 'info', `CSS started (http://127.0.0.1:${ports.css})`);
|
|
327
|
+
supervisor.setStatus('css', 'running', { startTime: Date.now() });
|
|
328
|
+
supervisor.setStatus('api', 'starting', { startTime: Date.now() });
|
|
329
|
+
apiService = await (0, runtime_1.startApiService)({
|
|
330
|
+
open: apiOpen,
|
|
331
|
+
authContext: createOpenAuthContext(baseUrl, options.authContext),
|
|
332
|
+
initializeLogger: false,
|
|
333
|
+
});
|
|
334
|
+
supervisor.addLog('api', 'info', `API started (${transport === 'socket' ? `unix://${sockets.api}` : `http://127.0.0.1:${ports.api}`})`);
|
|
335
|
+
supervisor.setStatus('api', 'running', { startTime: Date.now() });
|
|
336
|
+
supervisor.setStatus('gateway', 'starting', { startTime: Date.now() });
|
|
337
|
+
gateway = new Proxy_1.GatewayProxy(ports.gateway, supervisor, bindHost, {
|
|
338
|
+
socketPath: sockets.gateway,
|
|
339
|
+
exitOnStop: false,
|
|
340
|
+
shutdownHandler: stop,
|
|
341
|
+
baseUrl,
|
|
342
|
+
});
|
|
343
|
+
gateway.setTargets({
|
|
344
|
+
css: { url: `http://127.0.0.1:${ports.css}` },
|
|
345
|
+
api: transport === 'socket' ? { socketPath: sockets.api } : { url: `http://127.0.0.1:${ports.api}` },
|
|
346
|
+
});
|
|
347
|
+
await gateway.start();
|
|
348
|
+
supervisor.addLog('xpod', 'info', `Gateway started (${transport === 'socket' ? `unix://${sockets.gateway}` : baseUrl})`);
|
|
349
|
+
supervisor.setStatus('gateway', 'running', { startTime: Date.now() });
|
|
350
|
+
restoreRuntimeEnv();
|
|
351
|
+
return {
|
|
352
|
+
id,
|
|
353
|
+
mode,
|
|
354
|
+
transport,
|
|
355
|
+
baseUrl,
|
|
356
|
+
supervisor,
|
|
357
|
+
ports,
|
|
358
|
+
sockets,
|
|
359
|
+
fetch: async (input, init) => {
|
|
360
|
+
if (typeof input === 'string' || input instanceof URL) {
|
|
361
|
+
return fetch(new URL(String(input), baseUrl), init);
|
|
362
|
+
}
|
|
363
|
+
return fetch(input, init);
|
|
364
|
+
},
|
|
365
|
+
stop,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
catch (error) {
|
|
369
|
+
restoreRuntimeEnv();
|
|
370
|
+
await stop();
|
|
371
|
+
throw error;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=XpodRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XpodRuntime.js","sourceRoot":"","sources":["../../src/runtime/XpodRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppRunner, type App } from '@solid/community-server';\nimport { randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nimport net from 'node:net';\nimport path from 'node:path';\nimport { setGlobalLoggerFactory, getLoggerFor } from 'global-logger-factory';\nimport { ConfigurableLoggerFactory } from '../logging/ConfigurableLoggerFactory';\nimport { closeAllIdentityConnections } from '../identity/drizzle/db';\nimport type { AuthContext } from '../api/auth/AuthContext';\nimport { startApiService, type ApiServiceHandle } from '../api/runtime';\nimport { Supervisor } from '../supervisor/Supervisor';\nimport { applyEnv, loadEnvFile } from './env-utils';\nimport { getFreePort } from './port-finder';\nimport { GatewayProxy } from './Proxy';\nimport { registerSocketFetchOrigin } from './socket-fetch';\nimport { registerSocketHttpOrigin } from './socket-http';\nimport { removeSocketPath } from './socket-utils';\n\nexport interface XpodRuntimeOptions {\n mode?: 'local' | 'cloud';\n open?: boolean;\n authMode?: 'acp' | 'acl' | 'allow-all';\n apiOpen?: boolean;\n authContext?: AuthContext;\n envFile?: string;\n env?: Record<string, string | undefined>;\n shorthand?: Record<string, string | number | boolean>;\n baseUrl?: string;\n bindHost?: string;\n transport?: 'auto' | 'socket' | 'port';\n runtimeRoot?: string;\n rootFilePath?: string;\n sparqlEndpoint?: string;\n identityDbUrl?: string;\n usageDbUrl?: string;\n logLevel?: string;\n gatewayPort?: number;\n cssPort?: number;\n apiPort?: number;\n gatewaySocketPath?: string;\n cssSocketPath?: string;\n apiSocketPath?: string;\n edgeNodesEnabled?: boolean;\n centerRegistrationEnabled?: boolean;\n}\n\nexport interface XpodRuntimeHandle {\n id: string;\n mode: 'local' | 'cloud';\n transport: 'socket' | 'port';\n baseUrl: string;\n supervisor: Supervisor;\n ports: {\n gateway?: number;\n css?: number;\n api?: number;\n };\n sockets: {\n gateway?: string;\n css?: string;\n api?: string;\n };\n fetch: (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n stop: () => Promise<void>;\n}\n\nfunction findPackageRoot(dir: string): string {\n let current = dir;\n while (current !== path.dirname(current)) {\n if (fs.existsSync(path.join(current, 'package.json'))) {\n return current;\n }\n current = path.dirname(current);\n }\n return dir;\n}\n\nconst PACKAGE_ROOT = findPackageRoot(__dirname);\nconst BASE_PROCESS_ENV = { ...process.env };\n\nfunction ensureTrailingSlash(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n}\n\nfunction withDefinedEntries(entries: Array<[string, string | number | boolean | undefined]>): Record<string, string | number | boolean> {\n const result: Record<string, string | number | boolean> = {};\n for (const [key, value] of entries) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction resolveRuntimeShorthand(\n env: Record<string, string | undefined>,\n options: XpodRuntimeOptions,\n mode: 'local' | 'cloud',\n cssAuthMode: 'acp' | 'acl' | 'allow-all',\n baseUrl: string,\n rootFilePath: string,\n sparqlEndpoint: string,\n identityDbUrl: string,\n usageDbUrl: string,\n logLevel: string,\n): Record<string, string | number | boolean> {\n const envValue = (key: string): string | undefined => env[key] ?? BASE_PROCESS_ENV[key];\n\n return {\n ...withDefinedEntries([\n ['baseStorageDomain', envValue('CSS_BASE_STORAGE_DOMAIN')],\n ['minioAccessKey', envValue('CSS_MINIO_ACCESS_KEY')],\n ['minioSecretKey', envValue('CSS_MINIO_SECRET_KEY')],\n ['minioEndpoint', envValue('CSS_MINIO_ENDPOINT')],\n ['minioBucketName', envValue('CSS_MINIO_BUCKET_NAME')],\n ['redisClient', envValue('CSS_REDIS_CLIENT')],\n ['redisUsername', envValue('CSS_REDIS_USERNAME')],\n ['redisPassword', envValue('CSS_REDIS_PASSWORD')],\n ['emailConfigHost', envValue('CSS_EMAIL_CONFIG_HOST')],\n ['emailConfigPort', envValue('CSS_EMAIL_CONFIG_PORT')],\n ['emailConfigAuthUser', envValue('CSS_EMAIL_CONFIG_AUTH_USER')],\n ['emailConfigAuthPass', envValue('CSS_EMAIL_CONFIG_AUTH_PASS')],\n ['idpUrl', envValue('CSS_IDP_URL') ?? envValue('XPOD_CLOUD_API_ENDPOINT')],\n ['allowedHosts', envValue('CSS_ALLOWED_HOSTS')],\n ['nodeId', envValue('XPOD_NODE_ID')],\n ['nodeToken', envValue('XPOD_NODE_TOKEN')],\n ['serviceToken', envValue('XPOD_SERVICE_TOKEN')],\n ]),\n baseUrl,\n rootFilePath,\n sparqlEndpoint,\n identityDbUrl,\n usageDbUrl,\n logLevel,\n authMode: cssAuthMode,\n edition: mode === 'cloud' ? 'server' : 'local',\n edgeNodesEnabled: options.edgeNodesEnabled ?? false,\n centerRegistrationEnabled: options.centerRegistrationEnabled ?? false,\n ...(options.shorthand ?? {}),\n };\n}\n\nfunction normalizeDatabaseUrl(value: string): string {\n if (\n value.startsWith('sqlite:') ||\n value.startsWith('postgres://') ||\n value.startsWith('postgresql://') ||\n value.startsWith('mysql://')\n ) {\n return value;\n }\n return `sqlite:${path.resolve(value)}`;\n}\n\nfunction resolveTransport(options: XpodRuntimeOptions): 'socket' | 'port' {\n if (options.transport === 'socket' || options.transport === 'port') {\n return options.transport;\n }\n return process.platform === 'win32' ? 'port' : 'socket';\n}\n\nfunction createCssRuntimeConfig(configPath: string, runtimeRoot: string, open: boolean): string {\n if (!open) {\n return configPath;\n }\n\n const runtimeConfigPath = path.join(runtimeRoot, 'css-runtime.config.json');\n fs.writeFileSync(runtimeConfigPath, JSON.stringify({\n '@context': [\n 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld',\n 'https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld',\n ],\n import: [\n configPath,\n path.join(PACKAGE_ROOT, 'config/runtime-open.json'),\n ],\n }, null, 2));\n\n return runtimeConfigPath;\n}\n\nfunction createOpenAuthContext(baseUrl: string, override?: AuthContext): AuthContext {\n if (override) {\n return override;\n }\n\n return {\n type: 'solid',\n webId: new URL('test/profile/card#me', ensureTrailingSlash(baseUrl)).href,\n accountId: 'xpod-open-account',\n displayName: 'Xpod Open Mode',\n };\n}\n\nfunction initLogger(level: string): void {\n const loggerFactory = new ConfigurableLoggerFactory(level, {\n fileName: path.join(process.cwd(), 'logs/xpod-%DATE%.log'),\n showLocation: true,\n });\n setGlobalLoggerFactory(loggerFactory);\n}\n\nasync function waitForTcpReady(port: number, host = '127.0.0.1', timeoutMs = 5_000): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n const ready = await new Promise<boolean>((resolve) => {\n const socket = new net.Socket();\n socket.setTimeout(500);\n socket.once('connect', () => {\n socket.destroy();\n resolve(true);\n });\n socket.once('error', () => {\n socket.destroy();\n resolve(false);\n });\n socket.once('timeout', () => {\n socket.destroy();\n resolve(false);\n });\n socket.connect(port, host);\n });\n\n if (ready) {\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n throw new Error(`Timed out waiting for CSS on ${host}:${port}`);\n}\n\nexport async function startXpodRuntime(options: XpodRuntimeOptions = {}): Promise<XpodRuntimeHandle> {\n const id = randomUUID().slice(0, 8);\n const mode = options.mode ?? 'local';\n const transport = resolveTransport(options);\n const bindHost = options.bindHost ?? '127.0.0.1';\n const runtimeRoot = path.resolve(options.runtimeRoot ?? path.join(process.cwd(), '.test-data', 'xpod-runtime', id));\n const rootFilePath = path.resolve(options.rootFilePath ?? path.join(runtimeRoot, 'data'));\n const sparqlEndpoint = normalizeDatabaseUrl(options.sparqlEndpoint ?? path.join(runtimeRoot, 'quadstore.sqlite'));\n const identityDbUrl = normalizeDatabaseUrl(options.identityDbUrl ?? path.join(runtimeRoot, 'identity.sqlite'));\n const usageDbUrl = normalizeDatabaseUrl(options.usageDbUrl ?? path.join(runtimeRoot, 'usage.sqlite'));\n const cssAuthMode = options.authMode ?? (options.open ? 'allow-all' : 'acp');\n const apiOpen = options.apiOpen ?? options.open ?? false;\n const logLevel = options.logLevel ?? process.env.CSS_LOGGING_LEVEL ?? 'warn';\n\n fs.mkdirSync(runtimeRoot, { recursive: true });\n fs.mkdirSync(rootFilePath, { recursive: true });\n\n const socketsRoot = path.join(runtimeRoot, 'sockets');\n const ports = {\n gateway: undefined as number | undefined,\n css: undefined as number | undefined,\n api: undefined as number | undefined,\n };\n const sockets = {\n gateway: undefined as string | undefined,\n css: undefined as string | undefined,\n api: undefined as string | undefined,\n };\n\n if (transport === 'socket') {\n sockets.gateway = path.resolve(options.gatewaySocketPath ?? path.join(socketsRoot, 'gateway.sock'));\n sockets.api = path.resolve(options.apiSocketPath ?? path.join(socketsRoot, 'api.sock'));\n ports.gateway = options.gatewayPort ?? await getFreePort(5600);\n ports.css = options.cssPort ?? await getFreePort((ports.gateway ?? 5600) + 1);\n ports.api = options.apiPort ?? await getFreePort((ports.css ?? 5601) + 1);\n } else {\n ports.gateway = options.gatewayPort ?? await getFreePort(5600);\n ports.css = options.cssPort ?? await getFreePort((ports.gateway ?? 5600) + 1);\n ports.api = options.apiPort ?? await getFreePort((ports.css ?? 5601) + 1);\n }\n\n const baseUrl = ensureTrailingSlash(\n options.baseUrl ?? (transport === 'socket'\n ? 'http://localhost'\n : `http://${bindHost}:${ports.gateway}`),\n );\n\n initLogger(logLevel);\n const logger = getLoggerFor('XpodRuntime');\n const envFilePath = options.envFile ? path.resolve(options.envFile) : undefined;\n const envFromFile = envFilePath ? loadEnvFile(envFilePath) : {};\n const runtimeEnv = {\n ...envFromFile,\n ...options.env,\n XPOD_ENV_PATH: envFilePath,\n XPOD_EDITION: mode,\n CSS_BASE_URL: baseUrl,\n CSS_TOKEN_ENDPOINT: `${baseUrl}.oidc/token`,\n CSS_ROOT_FILE_PATH: rootFilePath,\n CSS_IDENTITY_DB_URL: identityDbUrl,\n DATABASE_URL: identityDbUrl,\n CSS_PORT: String(ports.css ?? 0),\n API_PORT: String(ports.api ?? 0),\n API_HOST: bindHost,\n API_SOCKET_PATH: sockets.api,\n XPOD_MAIN_PORT: String(ports.gateway ?? 0),\n CORS_ORIGINS: new URL(baseUrl).origin,\n CSS_LOGGING_LEVEL: logLevel,\n };\n const restoreEnv = applyEnv(runtimeEnv);\n let envRestored = false;\n const restoreRuntimeEnv = (): void => {\n if (envRestored) {\n return;\n }\n envRestored = true;\n restoreEnv();\n };\n const runtimeShorthand = resolveRuntimeShorthand(\n runtimeEnv,\n options,\n mode,\n cssAuthMode,\n baseUrl,\n rootFilePath,\n sparqlEndpoint,\n identityDbUrl,\n usageDbUrl,\n logLevel,\n );\n\n const unregisterSocketFetch = transport === 'socket'\n ? registerSocketFetchOrigin(baseUrl, sockets.gateway!)\n : async(): Promise<void> => undefined;\n const unregisterSocketHttp = transport === 'socket'\n ? registerSocketHttpOrigin(baseUrl, sockets.gateway!)\n : async(): Promise<void> => undefined;\n\n const supervisor = new Supervisor({ handleProcessSignals: false });\n let cssApp: App | undefined;\n let apiService: ApiServiceHandle | undefined;\n let gateway: GatewayProxy | undefined;\n let stopped = false;\n let stopPromise: Promise<void> | undefined;\n\n const stop = async(): Promise<void> => {\n if (stopPromise) {\n return stopPromise;\n }\n\n stopPromise = (async() => {\n if (stopped) {\n return;\n }\n stopped = true;\n\n try {\n if (gateway) {\n await gateway.stop();\n supervisor.setStatus('gateway', 'stopped');\n }\n } catch (error) {\n logger.warn(`Failed to stop gateway: ${String(error)}`);\n }\n\n try {\n if (apiService) {\n await apiService.stop();\n supervisor.setStatus('api', 'stopped');\n }\n } catch (error) {\n logger.warn(`Failed to stop api: ${String(error)}`);\n }\n\n try {\n if (cssApp) {\n await cssApp.stop();\n supervisor.setStatus('css', 'stopped');\n }\n } catch (error) {\n logger.warn(`Failed to stop css: ${String(error)}`);\n }\n\n if (sockets.css) {\n removeSocketPath(sockets.css);\n }\n if (sockets.api) {\n removeSocketPath(sockets.api);\n }\n\n await unregisterSocketFetch();\n await unregisterSocketHttp();\n await closeAllIdentityConnections();\n restoreRuntimeEnv();\n })();\n\n return stopPromise;\n };\n\n supervisor.registerManaged('css', async() => {\n if (cssApp) {\n await cssApp.stop();\n }\n });\n supervisor.registerManaged('api', async() => {\n if (apiService) {\n await apiService.stop();\n }\n });\n supervisor.registerManaged('gateway', async() => {\n if (gateway) {\n await gateway.stop();\n }\n });\n\n try {\n const runner = new AppRunner();\n const configPath = path.join(PACKAGE_ROOT, `config/${mode}.json`);\n const cssConfigPath = createCssRuntimeConfig(\n configPath,\n runtimeRoot,\n options.open || cssAuthMode === 'allow-all',\n );\n\n supervisor.setStatus('css', 'starting', { startTime: Date.now() });\n cssApp = await runner.create({\n config: cssConfigPath,\n loaderProperties: {\n mainModulePath: PACKAGE_ROOT,\n logLevel: logLevel as any,\n },\n shorthand: {\n ...(sockets.css ? { socket: sockets.css } : { port: ports.css! }),\n ...runtimeShorthand,\n },\n });\n await cssApp.start();\n await waitForTcpReady(ports.css!, '127.0.0.1');\n supervisor.addLog('css', 'info', `CSS started (http://127.0.0.1:${ports.css})`);\n supervisor.setStatus('css', 'running', { startTime: Date.now() });\n\n supervisor.setStatus('api', 'starting', { startTime: Date.now() });\n apiService = await startApiService({\n open: apiOpen,\n authContext: createOpenAuthContext(baseUrl, options.authContext),\n initializeLogger: false,\n });\n supervisor.addLog('api', 'info', `API started (${transport === 'socket' ? `unix://${sockets.api}` : `http://127.0.0.1:${ports.api}`})`);\n supervisor.setStatus('api', 'running', { startTime: Date.now() });\n\n supervisor.setStatus('gateway', 'starting', { startTime: Date.now() });\n gateway = new GatewayProxy(ports.gateway, supervisor, bindHost, {\n socketPath: sockets.gateway,\n exitOnStop: false,\n shutdownHandler: stop,\n baseUrl,\n });\n gateway.setTargets({\n css: { url: `http://127.0.0.1:${ports.css}` },\n api: transport === 'socket' ? { socketPath: sockets.api } : { url: `http://127.0.0.1:${ports.api}` },\n });\n await gateway.start();\n supervisor.addLog('xpod', 'info', `Gateway started (${transport === 'socket' ? `unix://${sockets.gateway}` : baseUrl})`);\n supervisor.setStatus('gateway', 'running', { startTime: Date.now() });\n restoreRuntimeEnv();\n\n return {\n id,\n mode,\n transport,\n baseUrl,\n supervisor,\n ports,\n sockets,\n fetch: async(input: string | URL | Request, init?: RequestInit): Promise<Response> => {\n if (typeof input === 'string' || input instanceof URL) {\n return fetch(new URL(String(input), baseUrl), init);\n }\n return fetch(input, init);\n },\n stop,\n };\n } catch (error) {\n restoreRuntimeEnv();\n await stop();\n throw error;\n }\n}\n"]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.loadEnvFile = loadEnvFile;
|
|
7
|
+
exports.applyEnv = applyEnv;
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
function loadEnvFile(envPath) {
|
|
10
|
+
if (!node_fs_1.default.existsSync(envPath)) {
|
|
11
|
+
throw new Error(`Env file not found: ${envPath}`);
|
|
12
|
+
}
|
|
13
|
+
const values = {};
|
|
14
|
+
const content = node_fs_1.default.readFileSync(envPath, 'utf-8');
|
|
15
|
+
for (const line of content.split('\n')) {
|
|
16
|
+
const trimmed = line.trim();
|
|
17
|
+
if (!trimmed || trimmed.startsWith('#')) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
const eqIndex = trimmed.indexOf('=');
|
|
21
|
+
if (eqIndex === -1) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const key = trimmed.slice(0, eqIndex).trim();
|
|
25
|
+
let value = trimmed.slice(eqIndex + 1).trim();
|
|
26
|
+
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
|
|
27
|
+
value = value.slice(1, -1);
|
|
28
|
+
}
|
|
29
|
+
values[key] = value;
|
|
30
|
+
}
|
|
31
|
+
return values;
|
|
32
|
+
}
|
|
33
|
+
function applyEnv(overrides) {
|
|
34
|
+
const previous = new Map();
|
|
35
|
+
for (const [key, value] of Object.entries(overrides)) {
|
|
36
|
+
previous.set(key, process.env[key]);
|
|
37
|
+
if (value === undefined) {
|
|
38
|
+
delete process.env[key];
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
process.env[key] = value;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return () => {
|
|
45
|
+
for (const [key, value] of previous.entries()) {
|
|
46
|
+
if (value === undefined) {
|
|
47
|
+
delete process.env[key];
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
process.env[key] = value;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=env-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-utils.js","sourceRoot":"","sources":["../../src/runtime/env-utils.ts"],"names":[],"mappings":";;;;;AAEA,kCA2BC;AAED,4BAqBC;AApDD,sDAAyB;AAEzB,SAAgB,WAAW,CAAC,OAAe;IACzC,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,iBAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACrG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,QAAQ,CAAC,SAA6C;IACpE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IAEvD,KAAK,MAAM,CAAE,GAAG,EAAE,KAAK,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,GAAS,EAAE;QAChB,KAAK,MAAM,CAAE,GAAG,EAAE,KAAK,CAAE,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import fs from 'node:fs';\n\nexport function loadEnvFile(envPath: string): Record<string, string> {\n if (!fs.existsSync(envPath)) {\n throw new Error(`Env file not found: ${envPath}`);\n }\n\n const values: Record<string, string> = {};\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('#')) {\n continue;\n }\n\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) {\n continue;\n }\n\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n values[key] = value;\n }\n\n return values;\n}\n\nexport function applyEnv(overrides: Record<string, string | undefined>): () => void {\n const previous = new Map<string, string | undefined>();\n\n for (const [ key, value ] of Object.entries(overrides)) {\n previous.set(key, process.env[key]);\n if (value === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n }\n\n return (): void => {\n for (const [ key, value ] of previous.entries()) {\n if (value === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n }\n };\n}\n"]}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
export declare const PACKAGE_ROOT: string;
|
|
2
2
|
export { GatewayProxy } from './Proxy';
|
|
3
3
|
export { getFreePort } from './port-finder';
|
|
4
|
+
export { applyEnv, loadEnvFile } from './env-utils';
|
|
5
|
+
export { registerSocketFetchOrigin } from './socket-fetch';
|
|
6
|
+
export { startXpodRuntime } from './XpodRuntime';
|
|
7
|
+
export type { XpodRuntimeOptions, XpodRuntimeHandle } from './XpodRuntime';
|
package/dist/runtime/index.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getFreePort = exports.GatewayProxy = exports.PACKAGE_ROOT = void 0;
|
|
6
|
+
exports.startXpodRuntime = exports.registerSocketFetchOrigin = exports.loadEnvFile = exports.applyEnv = exports.getFreePort = exports.GatewayProxy = exports.PACKAGE_ROOT = void 0;
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
8
|
const fs_1 = __importDefault(require("fs"));
|
|
9
9
|
/** xpod package root: walk up from __dirname until we find package.json */
|
|
@@ -22,4 +22,11 @@ var Proxy_1 = require("./Proxy");
|
|
|
22
22
|
Object.defineProperty(exports, "GatewayProxy", { enumerable: true, get: function () { return Proxy_1.GatewayProxy; } });
|
|
23
23
|
var port_finder_1 = require("./port-finder");
|
|
24
24
|
Object.defineProperty(exports, "getFreePort", { enumerable: true, get: function () { return port_finder_1.getFreePort; } });
|
|
25
|
+
var env_utils_1 = require("./env-utils");
|
|
26
|
+
Object.defineProperty(exports, "applyEnv", { enumerable: true, get: function () { return env_utils_1.applyEnv; } });
|
|
27
|
+
Object.defineProperty(exports, "loadEnvFile", { enumerable: true, get: function () { return env_utils_1.loadEnvFile; } });
|
|
28
|
+
var socket_fetch_1 = require("./socket-fetch");
|
|
29
|
+
Object.defineProperty(exports, "registerSocketFetchOrigin", { enumerable: true, get: function () { return socket_fetch_1.registerSocketFetchOrigin; } });
|
|
30
|
+
var XpodRuntime_1 = require("./XpodRuntime");
|
|
31
|
+
Object.defineProperty(exports, "startXpodRuntime", { enumerable: true, get: function () { return XpodRuntime_1.startXpodRuntime; } });
|
|
25
32
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,4CAAoB;AAEpB,2EAA2E;AAC3E,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,OAAO,OAAO,KAAK,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,IAAI,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YACtD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAEY,QAAA,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;AAEvD,iCAAuC;AAA9B,qGAAA,YAAY,OAAA;AACrB,6CAA4C;AAAnC,0GAAA,WAAW,OAAA","sourcesContent":["import path from 'path';\nimport fs from 'fs';\n\n/** xpod package root: walk up from __dirname until we find package.json */\nfunction findPackageRoot(dir: string): string {\n let current = dir;\n while (current !== path.dirname(current)) {\n if (fs.existsSync(path.join(current, 'package.json'))) {\n return current;\n }\n current = path.dirname(current);\n }\n return dir;\n}\n\nexport const PACKAGE_ROOT = findPackageRoot(__dirname);\n\nexport { GatewayProxy } from './Proxy';\nexport { getFreePort } from './port-finder';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,4CAAoB;AAEpB,2EAA2E;AAC3E,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,OAAO,OAAO,KAAK,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,IAAI,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YACtD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAEY,QAAA,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;AAEvD,iCAAuC;AAA9B,qGAAA,YAAY,OAAA;AACrB,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AACpB,yCAAoD;AAA3C,qGAAA,QAAQ,OAAA;AAAE,wGAAA,WAAW,OAAA;AAC9B,+CAA2D;AAAlD,yHAAA,yBAAyB,OAAA;AAClC,6CAAiD;AAAxC,+GAAA,gBAAgB,OAAA","sourcesContent":["import path from 'path';\nimport fs from 'fs';\n\n/** xpod package root: walk up from __dirname until we find package.json */\nfunction findPackageRoot(dir: string): string {\n let current = dir;\n while (current !== path.dirname(current)) {\n if (fs.existsSync(path.join(current, 'package.json'))) {\n return current;\n }\n current = path.dirname(current);\n }\n return dir;\n}\n\nexport const PACKAGE_ROOT = findPackageRoot(__dirname);\n\nexport { GatewayProxy } from './Proxy';\nexport { getFreePort } from './port-finder';\nexport { applyEnv, loadEnvFile } from './env-utils';\nexport { registerSocketFetchOrigin } from './socket-fetch';\nexport { startXpodRuntime } from './XpodRuntime';\nexport type { XpodRuntimeOptions, XpodRuntimeHandle } from './XpodRuntime';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function registerSocketFetchOrigin(origin: string, socketPath: string): () => Promise<void>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerSocketFetchOrigin = registerSocketFetchOrigin;
|
|
4
|
+
const undici_1 = require("undici");
|
|
5
|
+
const originalFetch = globalThis.fetch.bind(globalThis);
|
|
6
|
+
const registry = new Map();
|
|
7
|
+
let patched = false;
|
|
8
|
+
const debugSocketFetch = process.env.XPOD_DEBUG_SOCKET_FETCH === 'true';
|
|
9
|
+
function resolveOrigin(input) {
|
|
10
|
+
if (typeof input === 'string') {
|
|
11
|
+
return new URL(input).origin;
|
|
12
|
+
}
|
|
13
|
+
if (input instanceof URL) {
|
|
14
|
+
return input.origin;
|
|
15
|
+
}
|
|
16
|
+
if (typeof Request !== 'undefined' && input instanceof Request) {
|
|
17
|
+
return new URL(input.url).origin;
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
function ensurePatched() {
|
|
22
|
+
if (patched) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
globalThis.fetch = (async (input, init) => {
|
|
26
|
+
const origin = resolveOrigin(input);
|
|
27
|
+
const entry = origin ? registry.get(origin) : undefined;
|
|
28
|
+
if (debugSocketFetch && origin) {
|
|
29
|
+
const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input instanceof Request ? input.url : String(input);
|
|
30
|
+
console.log(`[socket-fetch] ${entry ? 'rewrite' : 'passthrough'} ${url}`);
|
|
31
|
+
}
|
|
32
|
+
if (!entry) {
|
|
33
|
+
return originalFetch(input, init);
|
|
34
|
+
}
|
|
35
|
+
return originalFetch(input, {
|
|
36
|
+
...(init ?? {}),
|
|
37
|
+
dispatcher: entry.dispatcher,
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
patched = true;
|
|
41
|
+
}
|
|
42
|
+
async function maybeRestoreOriginalFetch() {
|
|
43
|
+
if (registry.size > 0 || !patched) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
globalThis.fetch = originalFetch;
|
|
47
|
+
patched = false;
|
|
48
|
+
}
|
|
49
|
+
function registerSocketFetchOrigin(origin, socketPath) {
|
|
50
|
+
const normalizedOrigin = new URL(origin).origin;
|
|
51
|
+
const existing = registry.get(normalizedOrigin);
|
|
52
|
+
if (!existing) {
|
|
53
|
+
registry.set(normalizedOrigin, {
|
|
54
|
+
dispatcher: new undici_1.Agent({
|
|
55
|
+
connect: {
|
|
56
|
+
socketPath,
|
|
57
|
+
},
|
|
58
|
+
}),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
ensurePatched();
|
|
62
|
+
return async () => {
|
|
63
|
+
const entry = registry.get(normalizedOrigin);
|
|
64
|
+
if (!entry) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
registry.delete(normalizedOrigin);
|
|
68
|
+
await entry.dispatcher.close();
|
|
69
|
+
await maybeRestoreOriginalFetch();
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=socket-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-fetch.js","sourceRoot":"","sources":["../../src/runtime/socket-fetch.ts"],"names":[],"mappings":"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","sourcesContent":["import { Agent } from 'undici';\n\ninterface SocketFetchEntry {\n dispatcher: Agent;\n}\n\nconst originalFetch = globalThis.fetch.bind(globalThis);\nconst registry = new Map<string, SocketFetchEntry>();\nlet patched = false;\nconst debugSocketFetch = process.env.XPOD_DEBUG_SOCKET_FETCH === 'true';\n\nfunction resolveOrigin(input: RequestInfo | URL): string | undefined {\n if (typeof input === 'string') {\n return new URL(input).origin;\n }\n if (input instanceof URL) {\n return input.origin;\n }\n if (typeof Request !== 'undefined' && input instanceof Request) {\n return new URL(input.url).origin;\n }\n return undefined;\n}\n\nfunction ensurePatched(): void {\n if (patched) {\n return;\n }\n\n globalThis.fetch = (async(input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const origin = resolveOrigin(input);\n const entry = origin ? registry.get(origin) : undefined;\n\n if (debugSocketFetch && origin) {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input instanceof Request ? input.url : String(input);\n console.log(`[socket-fetch] ${entry ? 'rewrite' : 'passthrough'} ${url}`);\n }\n\n if (!entry) {\n return originalFetch(input as any, init as any);\n }\n\n return originalFetch(input as any, {\n ...(init ?? {}),\n dispatcher: entry.dispatcher,\n } as any);\n }) as typeof fetch;\n\n patched = true;\n}\n\nasync function maybeRestoreOriginalFetch(): Promise<void> {\n if (registry.size > 0 || !patched) {\n return;\n }\n\n globalThis.fetch = originalFetch as typeof fetch;\n patched = false;\n}\n\nexport function registerSocketFetchOrigin(origin: string, socketPath: string): () => Promise<void> {\n const normalizedOrigin = new URL(origin).origin;\n const existing = registry.get(normalizedOrigin);\n if (!existing) {\n registry.set(normalizedOrigin, {\n dispatcher: new Agent({\n connect: {\n socketPath,\n },\n }),\n });\n }\n\n ensurePatched();\n\n return async(): Promise<void> => {\n const entry = registry.get(normalizedOrigin);\n if (!entry) {\n return;\n }\n\n registry.delete(normalizedOrigin);\n await entry.dispatcher.close();\n await maybeRestoreOriginalFetch();\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function registerSocketHttpOrigin(origin: string, socketPath: string): () => Promise<void>;
|