@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.
Files changed (350) hide show
  1. package/README.md +164 -3
  2. package/config/cli.json +9 -71
  3. package/config/cloud.json +34 -7
  4. package/config/local.json +6 -2
  5. package/config/resolver.json +11 -49
  6. package/config/runtime-open.json +22 -0
  7. package/config/xpod.base.json +32 -0
  8. package/config/xpod.cluster.json +2 -44
  9. package/config/xpod.json +5 -2
  10. package/dist/agents/AgentExecutorFactory.js +1 -1
  11. package/dist/agents/AgentExecutorFactory.js.map +1 -1
  12. package/dist/agents/AgentManager.js +1 -1
  13. package/dist/agents/AgentManager.js.map +1 -1
  14. package/dist/agents/config/agent-meta-schema.d.ts +7 -7
  15. package/dist/agents/config/agent-meta-schema.js +1 -1
  16. package/dist/agents/config/agent-meta-schema.js.map +1 -1
  17. package/dist/agents/config/resolve.js +1 -1
  18. package/dist/agents/config/resolve.js.map +1 -1
  19. package/dist/agents/schema/agent-config.d.ts +18 -18
  20. package/dist/agents/schema/agent-config.js +1 -1
  21. package/dist/agents/schema/agent-config.js.map +1 -1
  22. package/dist/agents/schema/tables.d.ts +8 -8
  23. package/dist/agents/schema/tables.js +1 -1
  24. package/dist/agents/schema/tables.js.map +1 -1
  25. package/dist/ai/schema/config.d.ts +7 -7
  26. package/dist/ai/schema/config.js +1 -1
  27. package/dist/ai/schema/config.js.map +1 -1
  28. package/dist/ai/schema/model.d.ts +13 -13
  29. package/dist/ai/schema/model.js +1 -1
  30. package/dist/ai/schema/model.js.map +1 -1
  31. package/dist/ai/schema/provider.d.ts +7 -7
  32. package/dist/ai/schema/provider.js +1 -1
  33. package/dist/ai/schema/provider.js.map +1 -1
  34. package/dist/ai/schema/vector-store.d.ts +17 -17
  35. package/dist/ai/schema/vector-store.js +1 -1
  36. package/dist/ai/schema/vector-store.js.map +1 -1
  37. package/dist/ai/service/CredentialReaderImpl.js +1 -1
  38. package/dist/ai/service/CredentialReaderImpl.js.map +1 -1
  39. package/dist/ai/service/DefaultAiConfigService.js.map +1 -1
  40. package/dist/api/ApiServer.d.ts +3 -1
  41. package/dist/api/ApiServer.js +14 -1
  42. package/dist/api/ApiServer.js.map +1 -1
  43. package/dist/api/auth/AuthContext.d.ts +12 -1
  44. package/dist/api/auth/AuthContext.js +18 -1
  45. package/dist/api/auth/AuthContext.js.map +1 -1
  46. package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
  47. package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
  48. package/dist/api/auth/ServiceTokenAuthenticator.d.ts +18 -0
  49. package/dist/api/auth/ServiceTokenAuthenticator.js +50 -0
  50. package/dist/api/auth/ServiceTokenAuthenticator.js.map +1 -0
  51. package/dist/api/auth/index.d.ts +1 -0
  52. package/dist/api/auth/index.js +1 -0
  53. package/dist/api/auth/index.js.map +1 -1
  54. package/dist/api/chatkit/ai-provider.d.ts +0 -10
  55. package/dist/api/chatkit/ai-provider.js +11 -120
  56. package/dist/api/chatkit/ai-provider.js.map +1 -1
  57. package/dist/api/chatkit/default-agent.js +11 -8
  58. package/dist/api/chatkit/default-agent.js.map +1 -1
  59. package/dist/api/chatkit/pod-store.d.ts +6 -0
  60. package/dist/api/chatkit/pod-store.js +103 -36
  61. package/dist/api/chatkit/pod-store.js.map +1 -1
  62. package/dist/api/chatkit/schema.d.ts +32 -26
  63. package/dist/api/chatkit/schema.js +16 -8
  64. package/dist/api/chatkit/schema.js.map +1 -1
  65. package/dist/api/container/business-token.d.ts +9 -0
  66. package/dist/api/container/business-token.js +32 -0
  67. package/dist/api/container/business-token.js.map +1 -0
  68. package/dist/api/container/cloud.js +36 -12
  69. package/dist/api/container/cloud.js.map +1 -1
  70. package/dist/api/container/common.js +13 -5
  71. package/dist/api/container/common.js.map +1 -1
  72. package/dist/api/container/index.js +94 -14
  73. package/dist/api/container/index.js.map +1 -1
  74. package/dist/api/container/local.js +2 -1
  75. package/dist/api/container/local.js.map +1 -1
  76. package/dist/api/container/routes.js +81 -9
  77. package/dist/api/container/routes.js.map +1 -1
  78. package/dist/api/container/types.d.ts +8 -6
  79. package/dist/api/container/types.js.map +1 -1
  80. package/dist/api/handlers/AdminHandler.js +9 -9
  81. package/dist/api/handlers/AdminHandler.js.map +1 -1
  82. package/dist/api/handlers/ApiKeyHandler.js +0 -6
  83. package/dist/api/handlers/ApiKeyHandler.js.map +1 -1
  84. package/dist/api/handlers/EdgeNodeSignalHandler.d.ts +17 -0
  85. package/dist/api/handlers/EdgeNodeSignalHandler.js +171 -0
  86. package/dist/api/handlers/EdgeNodeSignalHandler.js.map +1 -0
  87. package/dist/api/handlers/PodManagementHandler.d.ts +5 -4
  88. package/dist/api/handlers/PodManagementHandler.js +11 -10
  89. package/dist/api/handlers/PodManagementHandler.js.map +1 -1
  90. package/dist/api/handlers/ProvisionHandler.d.ts +42 -0
  91. package/dist/api/handlers/ProvisionHandler.js +161 -0
  92. package/dist/api/handlers/ProvisionHandler.js.map +1 -0
  93. package/dist/api/handlers/QuotaHandler.d.ts +7 -7
  94. package/dist/api/handlers/QuotaHandler.js +143 -73
  95. package/dist/api/handlers/QuotaHandler.js.map +1 -1
  96. package/dist/api/handlers/SubdomainClientHandler.js +2 -2
  97. package/dist/api/handlers/SubdomainClientHandler.js.map +1 -1
  98. package/dist/api/handlers/SubdomainHandler.js +13 -8
  99. package/dist/api/handlers/SubdomainHandler.js.map +1 -1
  100. package/dist/api/handlers/UsageHandler.d.ts +14 -0
  101. package/dist/api/handlers/UsageHandler.js +123 -0
  102. package/dist/api/handlers/UsageHandler.js.map +1 -0
  103. package/dist/api/handlers/index.d.ts +3 -1
  104. package/dist/api/handlers/index.js +3 -1
  105. package/dist/api/handlers/index.js.map +1 -1
  106. package/dist/api/main.js +18 -0
  107. package/dist/api/main.js.map +1 -1
  108. package/dist/api/middleware/OpenAuthMiddleware.d.ts +12 -0
  109. package/dist/api/middleware/OpenAuthMiddleware.js +27 -0
  110. package/dist/api/middleware/OpenAuthMiddleware.js.map +1 -0
  111. package/dist/api/runtime.d.ts +15 -0
  112. package/dist/api/runtime.js +125 -0
  113. package/dist/api/runtime.js.map +1 -0
  114. package/dist/api/service/VectorStoreService.js +1 -1
  115. package/dist/api/service/VectorStoreService.js.map +1 -1
  116. package/dist/api/service/VercelChatService.d.ts +16 -7
  117. package/dist/api/service/VercelChatService.js +98 -178
  118. package/dist/api/service/VercelChatService.js.map +1 -1
  119. package/dist/api/store/DrizzleClientCredentialsStore.d.ts +6 -11
  120. package/dist/api/store/DrizzleClientCredentialsStore.js +9 -39
  121. package/dist/api/store/DrizzleClientCredentialsStore.js.map +1 -1
  122. package/dist/authorization/AuthModeSelector.d.ts +10 -0
  123. package/dist/authorization/AuthModeSelector.js +27 -0
  124. package/dist/authorization/AuthModeSelector.js.map +1 -0
  125. package/dist/authorization/AuthModeSelector.jsonld +81 -0
  126. package/dist/cli/commands/account.d.ts +6 -0
  127. package/dist/cli/commands/account.js +119 -0
  128. package/dist/cli/commands/account.js.map +1 -0
  129. package/dist/cli/commands/auth.js +20 -29
  130. package/dist/cli/commands/auth.js.map +1 -1
  131. package/dist/cli/commands/backup.d.ts +15 -0
  132. package/dist/cli/commands/backup.js +286 -0
  133. package/dist/cli/commands/backup.js.map +1 -0
  134. package/dist/cli/commands/config.d.ts +34 -3
  135. package/dist/cli/commands/config.js +195 -258
  136. package/dist/cli/commands/config.js.map +1 -1
  137. package/dist/cli/commands/doctor.d.ts +6 -0
  138. package/dist/cli/commands/doctor.js +94 -0
  139. package/dist/cli/commands/doctor.js.map +1 -0
  140. package/dist/cli/commands/pod.d.ts +6 -0
  141. package/dist/cli/commands/pod.js +124 -0
  142. package/dist/cli/commands/pod.js.map +1 -0
  143. package/dist/cli/commands/start.js +28 -5
  144. package/dist/cli/commands/start.js.map +1 -1
  145. package/dist/cli/index.js +9 -0
  146. package/dist/cli/index.js.map +1 -1
  147. package/dist/cli/lib/credentials-store.d.ts +17 -0
  148. package/dist/cli/lib/credentials-store.js +73 -0
  149. package/dist/cli/lib/credentials-store.js.map +1 -0
  150. package/dist/cli/lib/css-account.d.ts +17 -0
  151. package/dist/cli/lib/css-account.js +56 -0
  152. package/dist/cli/lib/css-account.js.map +1 -1
  153. package/dist/cli/lib/pod-thread-store.d.ts +57 -0
  154. package/dist/cli/lib/pod-thread-store.js +310 -0
  155. package/dist/cli/lib/pod-thread-store.js.map +1 -0
  156. package/dist/cli/lib/solid-auth.d.ts +20 -0
  157. package/dist/cli/lib/solid-auth.js +70 -0
  158. package/dist/cli/lib/solid-auth.js.map +1 -0
  159. package/dist/components/components.jsonld +5 -8
  160. package/dist/components/context.jsonld +114 -244
  161. package/dist/credential/schema/tables.d.ts +14 -14
  162. package/dist/credential/schema/tables.js +1 -1
  163. package/dist/credential/schema/tables.js.map +1 -1
  164. package/dist/edge/EdgeNodeAgent.js +2 -2
  165. package/dist/edge/EdgeNodeAgent.js.map +1 -1
  166. package/dist/edge/EdgeNodeDnsCoordinator.d.ts +1 -7
  167. package/dist/edge/EdgeNodeDnsCoordinator.js +31 -41
  168. package/dist/edge/EdgeNodeDnsCoordinator.js.map +1 -1
  169. package/dist/edge/EdgeNodeDnsCoordinator.jsonld +1 -27
  170. package/dist/edge/EdgeNodeModeDetector.d.ts +1 -1
  171. package/dist/edge/EdgeNodeModeDetector.js +9 -11
  172. package/dist/edge/EdgeNodeModeDetector.js.map +1 -1
  173. package/dist/http/ClusterIngressRouter.js +3 -3
  174. package/dist/http/ClusterIngressRouter.js.map +1 -1
  175. package/dist/http/ClusterWebSocketConfigurator.js +2 -2
  176. package/dist/http/ClusterWebSocketConfigurator.js.map +1 -1
  177. package/dist/http/PodRoutingHttpHandler.js +2 -2
  178. package/dist/http/PodRoutingHttpHandler.js.map +1 -1
  179. package/dist/http/cluster/PodMigrationHttpHandler.d.ts +1 -1
  180. package/dist/http/cluster/PodMigrationHttpHandler.js +1 -1
  181. package/dist/http/cluster/PodMigrationHttpHandler.js.map +1 -1
  182. package/dist/identity/drizzle/EdgeNodeRepository.d.ts +37 -4
  183. package/dist/identity/drizzle/EdgeNodeRepository.js +120 -128
  184. package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -1
  185. package/dist/identity/drizzle/ServiceTokenRepository.d.ts +52 -0
  186. package/dist/identity/drizzle/ServiceTokenRepository.js +142 -0
  187. package/dist/identity/drizzle/ServiceTokenRepository.js.map +1 -0
  188. package/dist/identity/drizzle/db.d.ts +9 -0
  189. package/dist/identity/drizzle/db.js +235 -3
  190. package/dist/identity/drizzle/db.js.map +1 -1
  191. package/dist/identity/drizzle/schema.pg.d.ts +5 -0
  192. package/dist/identity/drizzle/schema.pg.js +49 -20
  193. package/dist/identity/drizzle/schema.pg.js.map +1 -1
  194. package/dist/identity/drizzle/schema.sqlite.d.ts +332 -57
  195. package/dist/identity/drizzle/schema.sqlite.js +48 -18
  196. package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
  197. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +6 -4
  198. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
  199. package/dist/index.d.ts +6 -9
  200. package/dist/index.js +12 -14
  201. package/dist/index.js.map +1 -1
  202. package/dist/main.js +25 -8
  203. package/dist/main.js.map +1 -1
  204. package/dist/provision/ProvisionCodeCodec.d.ts +39 -0
  205. package/dist/provision/ProvisionCodeCodec.js +65 -0
  206. package/dist/provision/ProvisionCodeCodec.js.map +1 -0
  207. package/dist/provision/ProvisionCodeCodec.jsonld +47 -0
  208. package/dist/provision/ProvisionPodCreator.d.ts +20 -0
  209. package/dist/provision/ProvisionPodCreator.js +84 -0
  210. package/dist/provision/ProvisionPodCreator.js.map +1 -0
  211. package/dist/provision/ProvisionPodCreator.jsonld +118 -0
  212. package/dist/quota/DrizzleQuotaService.d.ts +17 -3
  213. package/dist/quota/DrizzleQuotaService.js +108 -8
  214. package/dist/quota/DrizzleQuotaService.js.map +1 -1
  215. package/dist/quota/DrizzleQuotaService.jsonld +33 -22
  216. package/dist/quota/NoopQuotaService.d.ts +7 -1
  217. package/dist/quota/NoopQuotaService.js +12 -0
  218. package/dist/quota/NoopQuotaService.js.map +1 -1
  219. package/dist/quota/NoopQuotaService.jsonld +24 -0
  220. package/dist/quota/QuotaService.d.ts +17 -0
  221. package/dist/quota/QuotaService.js +5 -0
  222. package/dist/quota/QuotaService.js.map +1 -1
  223. package/dist/quota/QuotaService.jsonld +50 -0
  224. package/dist/runtime/Proxy.d.ts +22 -4
  225. package/dist/runtime/Proxy.js +154 -35
  226. package/dist/runtime/Proxy.js.map +1 -1
  227. package/dist/runtime/XpodRuntime.d.ts +49 -0
  228. package/dist/runtime/XpodRuntime.js +374 -0
  229. package/dist/runtime/XpodRuntime.js.map +1 -0
  230. package/dist/runtime/env-utils.d.ts +2 -0
  231. package/dist/runtime/env-utils.js +55 -0
  232. package/dist/runtime/env-utils.js.map +1 -0
  233. package/dist/runtime/index.d.ts +4 -0
  234. package/dist/runtime/index.js +8 -1
  235. package/dist/runtime/index.js.map +1 -1
  236. package/dist/runtime/socket-fetch.d.ts +1 -0
  237. package/dist/runtime/socket-fetch.js +72 -0
  238. package/dist/runtime/socket-fetch.js.map +1 -0
  239. package/dist/runtime/socket-http.d.ts +1 -0
  240. package/dist/runtime/socket-http.js +142 -0
  241. package/dist/runtime/socket-http.js.map +1 -0
  242. package/dist/runtime/socket-utils.d.ts +2 -0
  243. package/dist/runtime/socket-utils.js +34 -0
  244. package/dist/runtime/socket-utils.js.map +1 -0
  245. package/dist/service/{EdgeNodeHeartbeatService.d.ts → EdgeNodeSignalClient.d.ts} +3 -3
  246. package/dist/service/{EdgeNodeHeartbeatService.js → EdgeNodeSignalClient.js} +4 -4
  247. package/dist/service/EdgeNodeSignalClient.js.map +1 -0
  248. package/dist/service/PodMigrationService.d.ts +1 -2
  249. package/dist/service/PodMigrationService.js +1 -2
  250. package/dist/service/PodMigrationService.js.map +1 -1
  251. package/dist/storage/SparqlUpdateResourceStore.js +1 -1
  252. package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
  253. package/dist/storage/accessors/MinioDataAccessor.d.ts +6 -0
  254. package/dist/storage/accessors/MinioDataAccessor.js +10 -0
  255. package/dist/storage/accessors/MinioDataAccessor.js.map +1 -1
  256. package/dist/storage/accessors/MinioDataAccessor.jsonld +4 -0
  257. package/dist/storage/accessors/MixDataAccessor.d.ts +2 -1
  258. package/dist/storage/accessors/MixDataAccessor.js +12 -1
  259. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  260. package/dist/storage/accessors/MixDataAccessor.jsonld +19 -0
  261. package/dist/storage/locking/UrlAwareRedisLocker.d.ts +18 -0
  262. package/dist/storage/locking/UrlAwareRedisLocker.js +60 -0
  263. package/dist/storage/locking/UrlAwareRedisLocker.js.map +1 -0
  264. package/dist/storage/locking/UrlAwareRedisLocker.jsonld +123 -0
  265. package/dist/storage/quota/UsageRepository.d.ts +41 -8
  266. package/dist/storage/quota/UsageRepository.js +252 -50
  267. package/dist/storage/quota/UsageRepository.js.map +1 -1
  268. package/dist/storage/sparql/ComunicaQuintEngine.d.ts +9 -0
  269. package/dist/storage/sparql/ComunicaQuintEngine.js +50 -9
  270. package/dist/storage/sparql/ComunicaQuintEngine.js.map +1 -1
  271. package/dist/storage/sparql/QueryOptimizer.js +13 -1
  272. package/dist/storage/sparql/QueryOptimizer.js.map +1 -1
  273. package/dist/storage/sparql/QuintQuerySource.d.ts +14 -0
  274. package/dist/storage/sparql/QuintQuerySource.js +152 -1
  275. package/dist/storage/sparql/QuintQuerySource.js.map +1 -1
  276. package/dist/storage/sparql/SubgraphQueryEngine.d.ts +1 -0
  277. package/dist/storage/sparql/SubgraphQueryEngine.js +6 -2
  278. package/dist/storage/sparql/SubgraphQueryEngine.js.map +1 -1
  279. package/dist/storage/sparql/SubgraphQueryEngine.jsonld +4 -0
  280. package/dist/subdomain/SubdomainClient.d.ts +3 -3
  281. package/dist/subdomain/SubdomainClient.js +1 -1
  282. package/dist/subdomain/SubdomainClient.js.map +1 -1
  283. package/dist/subdomain/SubdomainService.d.ts +15 -16
  284. package/dist/subdomain/SubdomainService.js +80 -54
  285. package/dist/subdomain/SubdomainService.js.map +1 -1
  286. package/dist/subdomain/SubdomainService.jsonld +22 -26
  287. package/dist/supervisor/Supervisor.d.ts +7 -2
  288. package/dist/supervisor/Supervisor.js +33 -1
  289. package/dist/supervisor/Supervisor.js.map +1 -1
  290. package/dist/task/DrizzleTaskQueue.d.ts +1 -1
  291. package/dist/task/DrizzleTaskQueue.js +1 -1
  292. package/dist/task/DrizzleTaskQueue.js.map +1 -1
  293. package/dist/task/schema.d.ts +10 -10
  294. package/dist/task/schema.js +1 -1
  295. package/dist/task/schema.js.map +1 -1
  296. package/dist/test-utils/index.d.ts +4 -0
  297. package/dist/test-utils/index.js +8 -0
  298. package/dist/test-utils/index.js.map +1 -0
  299. package/dist/test-utils/no-auth-xpod.d.ts +11 -0
  300. package/dist/test-utils/no-auth-xpod.js +25 -0
  301. package/dist/test-utils/no-auth-xpod.js.map +1 -0
  302. package/dist/test-utils/seed-pod.d.ts +5 -0
  303. package/dist/test-utils/seed-pod.js +61 -0
  304. package/dist/test-utils/seed-pod.js.map +1 -0
  305. package/package.json +38 -10
  306. package/templates/identity/account/create-pod.html.ejs +110 -0
  307. package/templates/main.html.ejs +10 -0
  308. package/dist/api/handlers/DevHandler.d.ts +0 -18
  309. package/dist/api/handlers/DevHandler.js +0 -276
  310. package/dist/api/handlers/DevHandler.js.map +0 -1
  311. package/dist/api/handlers/SignalHandler.d.ts +0 -13
  312. package/dist/api/handlers/SignalHandler.js +0 -122
  313. package/dist/api/handlers/SignalHandler.js.map +0 -1
  314. package/dist/gateway/Proxy.d.ts +0 -24
  315. package/dist/gateway/Proxy.js +0 -209
  316. package/dist/gateway/Proxy.js.map +0 -1
  317. package/dist/gateway/Supervisor.d.ts +0 -2
  318. package/dist/gateway/Supervisor.js +0 -7
  319. package/dist/gateway/Supervisor.js.map +0 -1
  320. package/dist/gateway/port-finder.d.ts +0 -4
  321. package/dist/gateway/port-finder.js +0 -15
  322. package/dist/gateway/port-finder.js.map +0 -1
  323. package/dist/gateway/types.d.ts +0 -1
  324. package/dist/gateway/types.js +0 -3
  325. package/dist/gateway/types.js.map +0 -1
  326. package/dist/http/SignalInterceptHttpHandler.d.ts +0 -24
  327. package/dist/http/SignalInterceptHttpHandler.js +0 -47
  328. package/dist/http/SignalInterceptHttpHandler.js.map +0 -1
  329. package/dist/http/SignalInterceptHttpHandler.jsonld +0 -103
  330. package/dist/http/admin/EdgeNodeSignalHttpHandler.d.ts +0 -71
  331. package/dist/http/admin/EdgeNodeSignalHttpHandler.js +0 -674
  332. package/dist/http/admin/EdgeNodeSignalHttpHandler.js.map +0 -1
  333. package/dist/http/admin/EdgeNodeSignalHttpHandler.jsonld +0 -406
  334. package/dist/http/cluster/PodMigrationHttpHandler.jsonld +0 -169
  335. package/dist/quota/DefaultQuotaService.d.ts +0 -16
  336. package/dist/quota/DefaultQuotaService.js +0 -37
  337. package/dist/quota/DefaultQuotaService.js.map +0 -1
  338. package/dist/quota/DefaultQuotaService.jsonld +0 -85
  339. package/dist/service/EdgeNodeHeartbeatService.js.map +0 -1
  340. package/dist/service/PodMigrationService.jsonld +0 -76
  341. package/dist/storage/MigratableDataAccessor.d.ts +0 -63
  342. package/dist/storage/MigratableDataAccessor.js +0 -11
  343. package/dist/storage/MigratableDataAccessor.js.map +0 -1
  344. package/dist/storage/MigratableDataAccessor.jsonld +0 -60
  345. package/dist/storage/accessors/TieredMinioDataAccessor.d.ts +0 -150
  346. package/dist/storage/accessors/TieredMinioDataAccessor.js +0 -582
  347. package/dist/storage/accessors/TieredMinioDataAccessor.js.map +0 -1
  348. package/dist/storage/accessors/TieredMinioDataAccessor.jsonld +0 -333
  349. package/static/app/assets/index.css +0 -1
  350. 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,2 @@
1
+ export declare function loadEnvFile(envPath: string): Record<string, string>;
2
+ export declare function applyEnv(overrides: Record<string, string | undefined>): () => void;
@@ -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"]}
@@ -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';
@@ -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>;