@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,142 @@
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.registerSocketHttpOrigin = registerSocketHttpOrigin;
7
+ const node_http_1 = __importDefault(require("node:http"));
8
+ const node_https_1 = __importDefault(require("node:https"));
9
+ const node_url_1 = require("node:url");
10
+ const registry = new Map();
11
+ const originalHttpRequest = node_http_1.default.request.bind(node_http_1.default);
12
+ const originalHttpsRequest = node_https_1.default.request.bind(node_https_1.default);
13
+ const originalHttpGet = node_http_1.default.get.bind(node_http_1.default);
14
+ const originalHttpsGet = node_https_1.default.get.bind(node_https_1.default);
15
+ let patched = false;
16
+ const debugSocketHttp = process.env.XPOD_DEBUG_SOCKET_HTTP === 'true';
17
+ function hasHostHeader(headers) {
18
+ if (!headers) {
19
+ return false;
20
+ }
21
+ if (Array.isArray(headers)) {
22
+ return headers.some(([key]) => key.toLowerCase() === 'host');
23
+ }
24
+ return Object.keys(headers).some((key) => key.toLowerCase() === 'host');
25
+ }
26
+ function withHostHeader(headers, host) {
27
+ if (!headers) {
28
+ return { host };
29
+ }
30
+ if (Array.isArray(headers)) {
31
+ return hasHostHeader(headers) ? headers : [...headers, ['host', host]];
32
+ }
33
+ return hasHostHeader(headers) ? headers : { ...headers, host };
34
+ }
35
+ function toUrlFromOptions(options, defaultProtocol) {
36
+ const protocol = options.protocol ?? defaultProtocol;
37
+ const host = options.hostname ?? options.host ?? (typeof options.headers === 'object' && options.headers && 'host' in options.headers
38
+ ? String(options.headers.host)
39
+ : undefined);
40
+ if (!host) {
41
+ return undefined;
42
+ }
43
+ const path = options.path ?? '/';
44
+ const authority = typeof host === 'string' && host.includes(':') ? host : `${host}${options.port ? `:${options.port}` : ''}`;
45
+ return new node_url_1.URL(`${protocol}//${authority}${path}`);
46
+ }
47
+ function rewriteRequestOptions(url, options, socketPath) {
48
+ const rewritten = {
49
+ ...options,
50
+ socketPath,
51
+ path: `${url.pathname}${url.search}`,
52
+ headers: withHostHeader(options.headers, url.host),
53
+ };
54
+ delete rewritten.host;
55
+ delete rewritten.hostname;
56
+ delete rewritten.port;
57
+ return rewritten;
58
+ }
59
+ function hasExplicitSocketPath(input, options) {
60
+ if (typeof input === 'object' && !(input instanceof node_url_1.URL) && input && 'socketPath' in input && input.socketPath) {
61
+ return true;
62
+ }
63
+ return typeof options === 'object' && !!options && 'socketPath' in options && !!options.socketPath;
64
+ }
65
+ function createPatchedRequest(original, defaultProtocol) {
66
+ return ((input, options, callback) => {
67
+ let url;
68
+ let requestOptions = {};
69
+ let cb;
70
+ if (typeof input === 'string' || input instanceof node_url_1.URL) {
71
+ url = new node_url_1.URL(input.toString());
72
+ if (typeof options === 'function') {
73
+ cb = options;
74
+ }
75
+ else {
76
+ requestOptions = { ...(options ?? {}) };
77
+ cb = callback;
78
+ }
79
+ }
80
+ else {
81
+ requestOptions = { ...(input ?? {}) };
82
+ if (typeof options === 'function') {
83
+ cb = options;
84
+ }
85
+ else {
86
+ requestOptions = { ...requestOptions, ...(options ?? {}) };
87
+ cb = callback;
88
+ }
89
+ url = toUrlFromOptions(requestOptions, defaultProtocol);
90
+ }
91
+ const explicitSocketPath = hasExplicitSocketPath(input, options);
92
+ const entry = !explicitSocketPath && url ? registry.get(url.origin) : undefined;
93
+ if (debugSocketHttp && url) {
94
+ console.log(`[socket-http] ${entry ? 'rewrite' : 'passthrough'} ${url.toString()}${explicitSocketPath ? ' (explicit-socket)' : ''}`);
95
+ }
96
+ if (!url || !entry) {
97
+ return original(input, options, callback);
98
+ }
99
+ const rewritten = rewriteRequestOptions(url, requestOptions, entry.socketPath);
100
+ return cb ? original(rewritten, cb) : original(rewritten);
101
+ });
102
+ }
103
+ function createPatchedGet(protocol) {
104
+ return ((input, options, callback) => {
105
+ const requester = protocol === 'http' ? node_http_1.default.request : node_https_1.default.request;
106
+ const req = requester(input, options, callback);
107
+ req.end();
108
+ return req;
109
+ });
110
+ }
111
+ function ensurePatched() {
112
+ if (patched) {
113
+ return;
114
+ }
115
+ node_http_1.default.request = createPatchedRequest(originalHttpRequest, 'http:');
116
+ node_https_1.default.request = createPatchedRequest(originalHttpsRequest, 'https:');
117
+ node_http_1.default.get = createPatchedGet('http');
118
+ node_https_1.default.get = createPatchedGet('https');
119
+ patched = true;
120
+ }
121
+ async function maybeRestoreOriginalHttp() {
122
+ if (registry.size > 0 || !patched) {
123
+ return;
124
+ }
125
+ node_http_1.default.request = originalHttpRequest;
126
+ node_https_1.default.request = originalHttpsRequest;
127
+ node_http_1.default.get = originalHttpGet;
128
+ node_https_1.default.get = originalHttpsGet;
129
+ patched = false;
130
+ }
131
+ function registerSocketHttpOrigin(origin, socketPath) {
132
+ const normalizedOrigin = new node_url_1.URL(origin).origin;
133
+ if (!registry.has(normalizedOrigin)) {
134
+ registry.set(normalizedOrigin, { socketPath });
135
+ }
136
+ ensurePatched();
137
+ return async () => {
138
+ registry.delete(normalizedOrigin);
139
+ await maybeRestoreOriginalHttp();
140
+ };
141
+ }
142
+ //# sourceMappingURL=socket-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-http.js","sourceRoot":"","sources":["../../src/runtime/socket-http.ts"],"names":[],"mappings":"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","sourcesContent":["import http from 'node:http';\nimport https from 'node:https';\nimport type { RequestOptions } from 'node:http';\nimport { URL } from 'node:url';\n\ninterface SocketHttpEntry {\n socketPath: string;\n}\n\nconst registry = new Map<string, SocketHttpEntry>();\nconst originalHttpRequest = http.request.bind(http);\nconst originalHttpsRequest = https.request.bind(https);\nconst originalHttpGet = http.get.bind(http);\nconst originalHttpsGet = https.get.bind(https);\nlet patched = false;\nconst debugSocketHttp = process.env.XPOD_DEBUG_SOCKET_HTTP === 'true';\n\nfunction hasHostHeader(headers: RequestOptions['headers']): boolean {\n if (!headers) {\n return false;\n }\n\n if (Array.isArray(headers)) {\n return headers.some(([key]) => key.toLowerCase() === 'host');\n }\n\n return Object.keys(headers).some((key) => key.toLowerCase() === 'host');\n}\n\nfunction withHostHeader(headers: RequestOptions['headers'], host: string): RequestOptions['headers'] {\n if (!headers) {\n return { host };\n }\n\n if (Array.isArray(headers)) {\n return hasHostHeader(headers) ? headers : [ ...headers, [ 'host', host ] ];\n }\n\n return hasHostHeader(headers) ? headers : { ...headers, host };\n}\n\nfunction toUrlFromOptions(options: RequestOptions, defaultProtocol: 'http:' | 'https:'): URL | undefined {\n const protocol = options.protocol ?? defaultProtocol;\n const host = options.hostname ?? options.host ?? (typeof options.headers === 'object' && options.headers && 'host' in options.headers\n ? String((options.headers as Record<string, unknown>).host)\n : undefined);\n\n if (!host) {\n return undefined;\n }\n\n const path = options.path ?? '/';\n const authority = typeof host === 'string' && host.includes(':') ? host : `${host}${options.port ? `:${options.port}` : ''}`;\n return new URL(`${protocol}//${authority}${path}`);\n}\n\nfunction rewriteRequestOptions(url: URL, options: RequestOptions, socketPath: string): RequestOptions {\n const rewritten: RequestOptions = {\n ...options,\n socketPath,\n path: `${url.pathname}${url.search}`,\n headers: withHostHeader(options.headers, url.host),\n };\n\n delete rewritten.host;\n delete rewritten.hostname;\n delete rewritten.port;\n\n return rewritten;\n}\n\nfunction hasExplicitSocketPath(input: string | URL | RequestOptions, options?: RequestOptions | ((...args: any[]) => void)): boolean {\n if (typeof input === 'object' && !(input instanceof URL) && input && 'socketPath' in input && input.socketPath) {\n return true;\n }\n\n return typeof options === 'object' && !!options && 'socketPath' in options && !!options.socketPath;\n}\n\nfunction createPatchedRequest(\n original: typeof http.request,\n defaultProtocol: 'http:' | 'https:',\n): typeof http.request {\n return ((input: string | URL | RequestOptions, options?: RequestOptions | ((...args: any[]) => void), callback?: (...args: any[]) => void) => {\n let url: URL | undefined;\n let requestOptions: RequestOptions = {};\n let cb: ((...args: any[]) => void) | undefined;\n\n if (typeof input === 'string' || input instanceof URL) {\n url = new URL(input.toString());\n if (typeof options === 'function') {\n cb = options;\n } else {\n requestOptions = { ...(options ?? {}) };\n cb = callback;\n }\n } else {\n requestOptions = { ...(input ?? {}) };\n if (typeof options === 'function') {\n cb = options;\n } else {\n requestOptions = { ...requestOptions, ...(options ?? {}) };\n cb = callback;\n }\n url = toUrlFromOptions(requestOptions, defaultProtocol);\n }\n\n const explicitSocketPath = hasExplicitSocketPath(input, options);\n const entry = !explicitSocketPath && url ? registry.get(url.origin) : undefined;\n if (debugSocketHttp && url) {\n console.log(`[socket-http] ${entry ? 'rewrite' : 'passthrough'} ${url.toString()}${explicitSocketPath ? ' (explicit-socket)' : ''}`);\n }\n if (!url || !entry) {\n return original(input as any, options as any, callback as any);\n }\n\n const rewritten = rewriteRequestOptions(url, requestOptions, entry.socketPath);\n return cb ? original(rewritten, cb as any) : original(rewritten);\n }) as typeof http.request;\n}\n\nfunction createPatchedGet(protocol: 'http' | 'https'): typeof http.get {\n return ((input: string | URL | RequestOptions, options?: RequestOptions | ((...args: any[]) => void), callback?: (...args: any[]) => void) => {\n const requester = protocol === 'http' ? http.request : https.request;\n const req = requester(input as any, options as any, callback as any);\n req.end();\n return req;\n }) as typeof http.get;\n}\n\nfunction ensurePatched(): void {\n if (patched) {\n return;\n }\n\n http.request = createPatchedRequest(originalHttpRequest, 'http:');\n https.request = createPatchedRequest(originalHttpsRequest, 'https:');\n http.get = createPatchedGet('http');\n https.get = createPatchedGet('https');\n patched = true;\n}\n\nasync function maybeRestoreOriginalHttp(): Promise<void> {\n if (registry.size > 0 || !patched) {\n return;\n }\n\n http.request = originalHttpRequest;\n https.request = originalHttpsRequest;\n http.get = originalHttpGet;\n https.get = originalHttpsGet;\n patched = false;\n}\n\nexport function registerSocketHttpOrigin(origin: string, socketPath: string): () => Promise<void> {\n const normalizedOrigin = new URL(origin).origin;\n if (!registry.has(normalizedOrigin)) {\n registry.set(normalizedOrigin, { socketPath });\n }\n\n ensurePatched();\n\n return async(): Promise<void> => {\n registry.delete(normalizedOrigin);\n await maybeRestoreOriginalHttp();\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function prepareSocketPath(socketPath: string): void;
2
+ export declare function removeSocketPath(socketPath: string): void;
@@ -0,0 +1,34 @@
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.prepareSocketPath = prepareSocketPath;
7
+ exports.removeSocketPath = removeSocketPath;
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ function prepareSocketPath(socketPath) {
11
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(socketPath), { recursive: true });
12
+ removeSocketPath(socketPath);
13
+ }
14
+ function removeSocketPath(socketPath) {
15
+ if (!node_fs_1.default.existsSync(socketPath)) {
16
+ return;
17
+ }
18
+ try {
19
+ const stat = node_fs_1.default.statSync(socketPath);
20
+ if (!stat.isSocket()) {
21
+ return;
22
+ }
23
+ }
24
+ catch {
25
+ return;
26
+ }
27
+ try {
28
+ node_fs_1.default.unlinkSync(socketPath);
29
+ }
30
+ catch {
31
+ // ignore cleanup errors
32
+ }
33
+ }
34
+ //# sourceMappingURL=socket-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-utils.js","sourceRoot":"","sources":["../../src/runtime/socket-utils.ts"],"names":[],"mappings":";;;;;AAGA,8CAGC;AAED,4CAmBC;AA3BD,sDAAyB;AACzB,0DAA6B;AAE7B,SAAgB,iBAAiB,CAAC,UAAkB;IAClD,iBAAE,CAAC,SAAS,CAAC,mBAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAC/B,CAAC;AAED,SAAgB,gBAAgB,CAAC,UAAkB;IACjD,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,iBAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,iBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;AACH,CAAC","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nexport function prepareSocketPath(socketPath: string): void {\n fs.mkdirSync(path.dirname(socketPath), { recursive: true });\n removeSocketPath(socketPath);\n}\n\nexport function removeSocketPath(socketPath: string): void {\n if (!fs.existsSync(socketPath)) {\n return;\n }\n\n try {\n const stat = fs.statSync(socketPath);\n if (!stat.isSocket()) {\n return;\n }\n } catch {\n return;\n }\n\n try {\n fs.unlinkSync(socketPath);\n } catch {\n // ignore cleanup errors\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- export interface EdgeNodeHeartbeatServiceOptions {
1
+ export interface EdgeNodeSignalClientOptions {
2
2
  edgeNodesEnabled?: string | boolean;
3
3
  signalEndpoint?: string;
4
4
  nodeId?: string;
@@ -28,7 +28,7 @@ export interface EdgeNodeHeartbeatServiceOptions {
28
28
  ipv6?: string;
29
29
  };
30
30
  }
31
- export declare class EdgeNodeHeartbeatService {
31
+ export declare class EdgeNodeSignalClient {
32
32
  private readonly logger;
33
33
  private readonly interval?;
34
34
  private readonly endpoint?;
@@ -52,7 +52,7 @@ export declare class EdgeNodeHeartbeatService {
52
52
  private readonly networkSupplier?;
53
53
  private readonly intervalMs;
54
54
  private readonly onHeartbeatResponse?;
55
- constructor(options: EdgeNodeHeartbeatServiceOptions);
55
+ constructor(options: EdgeNodeSignalClientOptions);
56
56
  dispose(): void;
57
57
  private sendHeartbeat;
58
58
  private buildPayload;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EdgeNodeHeartbeatService = void 0;
3
+ exports.EdgeNodeSignalClient = void 0;
4
4
  const global_logger_factory_1 = require("global-logger-factory");
5
- class EdgeNodeHeartbeatService {
5
+ class EdgeNodeSignalClient {
6
6
  constructor(options) {
7
7
  this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
8
8
  this.intervalMs = 30_000;
@@ -258,5 +258,5 @@ class EdgeNodeHeartbeatService {
258
258
  return result.length > 0 ? result : undefined;
259
259
  }
260
260
  }
261
- exports.EdgeNodeHeartbeatService = EdgeNodeHeartbeatService;
262
- //# sourceMappingURL=EdgeNodeHeartbeatService.js.map
261
+ exports.EdgeNodeSignalClient = EdgeNodeSignalClient;
262
+ //# sourceMappingURL=EdgeNodeSignalClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EdgeNodeSignalClient.js","sourceRoot":"","sources":["../../src/service/EdgeNodeSignalClient.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\n\nexport interface EdgeNodeSignalClientOptions {\n edgeNodesEnabled?: string | boolean;\n signalEndpoint?: string;\n nodeId?: string;\n nodeToken?: string;\n baseUrl?: string;\n publicAddress?: string;\n ipv4?: string;\n ipv6?: string;\n pods?: string | string[];\n capabilities?: string | string[];\n reachability?: string;\n directCandidates?: string | string[];\n tunnel?: string;\n certificate?: string;\n metrics?: string;\n metadata?: string;\n intervalMs?: number | string;\n onHeartbeatResponse?: (data: unknown) => void;\n metadataSupplier?: () => Record<string, unknown> | undefined;\n metricsSupplier?: () => Record<string, unknown> | undefined;\n tunnelSupplier?: () => Record<string, unknown> | undefined;\n networkSupplier?: () => Promise<{ ipv4?: string; ipv6?: string }> | { ipv4?: string; ipv6?: string };\n}\n\ntype HeartbeatPayload = {\n nodeId: string;\n token: string;\n baseUrl?: string;\n publicAddress?: string;\n ipv4?: string;\n ipv6?: string;\n pods?: string[];\n capabilities?: string[];\n reachability?: Record<string, unknown>;\n directCandidates?: string[];\n tunnel?: Record<string, unknown>;\n certificate?: Record<string, unknown>;\n metrics?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n};\n\nexport class EdgeNodeSignalClient {\n private readonly logger = getLoggerFor(this);\n private readonly interval?: NodeJS.Timeout;\n private readonly endpoint?: string;\n private readonly baseNodeId?: string;\n private readonly baseToken?: string;\n private readonly baseUrl?: string;\n private readonly publicAddress?: string;\n private readonly baseIpv4?: string;\n private readonly baseIpv6?: string;\n private readonly basePods?: string[];\n private readonly baseCapabilities?: string[];\n private readonly baseReachability?: Record<string, unknown>;\n private readonly baseDirectCandidates?: string[];\n private readonly baseTunnel?: Record<string, unknown>;\n private readonly baseCertificate?: Record<string, unknown>;\n private readonly baseMetrics?: Record<string, unknown>;\n private readonly baseMetadata?: Record<string, unknown>;\n private readonly tunnelSupplier?: () => Record<string, unknown> | undefined;\n private readonly metricsSupplier?: () => Record<string, unknown> | undefined;\n private readonly metadataSupplier?: () => Record<string, unknown> | undefined;\n private readonly networkSupplier?: () => Promise<{ ipv4?: string; ipv6?: string }> | { ipv4?: string; ipv6?: string };\n private readonly intervalMs: number = 30_000;\n private readonly onHeartbeatResponse?: (data: unknown) => void;\n\n public constructor(options: EdgeNodeSignalClientOptions) {\n const enabled = this.normalizeBoolean(options.edgeNodesEnabled);\n const endpoint = this.normalizeString(options.signalEndpoint);\n const nodeId = this.normalizeString(options.nodeId);\n const nodeToken = this.normalizeString(options.nodeToken);\n\n if (!enabled) {\n this.logger.debug('Edge node heartbeat service disabled.');\n return;\n }\n\n if (!endpoint || !nodeId || !nodeToken) {\n this.logger.warn('Edge node heartbeat service missing configuration (signal endpoint, nodeId, nodeToken).');\n return;\n }\n\n this.intervalMs = this.normalizeInterval(options.intervalMs) ?? this.intervalMs;\n this.endpoint = endpoint;\n this.onHeartbeatResponse = options.onHeartbeatResponse;\n this.metadataSupplier = options.metadataSupplier;\n this.metricsSupplier = options.metricsSupplier;\n this.tunnelSupplier = options.tunnelSupplier;\n this.networkSupplier = options.networkSupplier;\n\n this.baseNodeId = nodeId;\n this.baseToken = nodeToken;\n this.baseUrl = this.normalizeString(options.baseUrl);\n this.publicAddress = this.normalizeString(options.publicAddress);\n this.baseIpv4 = this.normalizeString(options.ipv4);\n this.baseIpv6 = this.normalizeString(options.ipv6);\n this.basePods = this.normalizePods(options.pods);\n this.baseCapabilities = this.normalizeStringArray(options.capabilities);\n this.baseReachability = this.normalizeJsonRecord(options.reachability, 'reachability');\n this.baseDirectCandidates = this.normalizeCandidates(options.directCandidates);\n this.baseTunnel = this.normalizeJsonRecord(options.tunnel, 'tunnel');\n this.baseCertificate = this.normalizeJsonRecord(options.certificate, 'certificate');\n this.baseMetrics = this.normalizeJsonRecord(options.metrics, 'metrics');\n this.baseMetadata = this.normalizeJsonRecord(options.metadata, 'metadata');\n\n void this.sendHeartbeat();\n if (this.intervalMs > 0) {\n this.interval = setInterval(() => {\n void this.sendHeartbeat();\n }, this.intervalMs);\n }\n }\n\n public dispose(): void {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n private async sendHeartbeat(): Promise<void> {\n if (!this.endpoint || !this.baseNodeId || !this.baseToken) {\n return;\n }\n\n const payload: Record<string, unknown> = await this.buildPayload();\n\n try {\n const response = await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n });\n if (!response.ok) {\n this.logger.warn(`Edge node heartbeat failed: ${response.status} ${response.statusText}`);\n } else {\n this.logger.debug('Edge node heartbeat sent successfully.');\n await this.handleHeartbeatResponse(response);\n }\n } catch (error: unknown) {\n this.logger.error(`Edge node heartbeat error: ${(error as Error).message}`);\n }\n }\n\n private async buildPayload(): Promise<HeartbeatPayload> {\n const payload: HeartbeatPayload = {\n nodeId: this.baseNodeId!,\n token: this.baseToken!,\n };\n\n if (this.baseUrl) {\n payload.baseUrl = this.baseUrl;\n }\n if (this.publicAddress) {\n payload.publicAddress = this.publicAddress;\n }\n \n // 获取网络地址(支持动态检测)\n let ipv4 = this.baseIpv4;\n let ipv6 = this.baseIpv6;\n if (this.networkSupplier) {\n try {\n const networkInfo = await Promise.resolve(this.networkSupplier());\n ipv4 = networkInfo.ipv4 ?? ipv4;\n ipv6 = networkInfo.ipv6 ?? ipv6;\n } catch (error: unknown) {\n this.logger.debug(`Network detection failed: ${(error as Error).message}`);\n }\n }\n if (ipv4) {\n payload.ipv4 = ipv4;\n }\n if (ipv6) {\n payload.ipv6 = ipv6;\n }\n \n if (this.basePods && this.basePods.length > 0) {\n payload.pods = [ ...this.basePods ];\n }\n if (this.baseCapabilities && this.baseCapabilities.length > 0) {\n payload.capabilities = [ ...this.baseCapabilities ];\n }\n const reachability = this.mergeRecords(this.baseReachability, undefined);\n if (reachability && Object.keys(reachability).length > 0) {\n payload.reachability = reachability;\n }\n const directCandidates = this.baseDirectCandidates;\n if (directCandidates && directCandidates.length > 0) {\n payload.directCandidates = [ ...directCandidates ];\n }\n const tunnel = this.mergeRecords(this.baseTunnel, this.tunnelSupplier?.());\n if (tunnel && Object.keys(tunnel).length > 0) {\n payload.tunnel = tunnel;\n }\n const certificate = this.mergeRecords(this.baseCertificate, undefined);\n if (certificate && Object.keys(certificate).length > 0) {\n payload.certificate = certificate;\n }\n const metrics = this.mergeRecords(this.baseMetrics, this.metricsSupplier?.());\n if (metrics && Object.keys(metrics).length > 0) {\n payload.metrics = metrics;\n }\n const metadata = this.mergeRecords(this.baseMetadata, this.metadataSupplier?.());\n if (metadata && Object.keys(metadata).length > 0) {\n payload.metadata = metadata;\n }\n return payload;\n }\n\n private async handleHeartbeatResponse(response: Response): Promise<void> {\n if (!this.onHeartbeatResponse) {\n return;\n }\n const contentType = response.headers.get('content-type') ?? '';\n if (!contentType.includes('application/json')) {\n return;\n }\n try {\n const data = await response.json();\n this.onHeartbeatResponse(data);\n } catch (error: unknown) {\n this.logger.warn(`解析心跳响应 JSON 失败: ${(error as Error).message}`);\n }\n }\n\n private mergeRecords(base?: Record<string, unknown>, extra?: Record<string, unknown>): Record<string, unknown> | undefined {\n if (!base && !extra) {\n return undefined;\n }\n return { ...(base ?? {}), ...(extra ?? {}) };\n }\n\n private normalizeBoolean(value?: string | boolean): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n return normalized === 'true' || normalized === '1' || normalized === 'yes' || normalized === 'on';\n }\n return false;\n }\n\n private normalizeString(value?: string): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n private normalizeInterval(value?: number | string): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = Number(value);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n return undefined;\n }\n\n private normalizePods(value?: string | string[]): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n const source = Array.isArray(value) ? value : value.split(/[\\n,]+/u);\n const pods = source\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n .map((entry) => {\n try {\n return new URL(entry).toString();\n } catch {\n this.logger.warn(`忽略无效的 Pod 基址: ${entry}`);\n return undefined;\n }\n })\n .filter((entry): entry is string => typeof entry === 'string');\n return pods.length > 0 ? pods : undefined;\n }\n\n private normalizeStringArray(value?: string | string[]): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n const source = Array.isArray(value) ? value : value.split(/[\\n,]+/u);\n const items = source\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n return items.length > 0 ? Array.from(new Set(items)) : undefined;\n }\n\n private normalizeJsonRecord(value: string | undefined, field: string): Record<string, unknown> | undefined {\n if (!value) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(value);\n if (parsed == null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n this.logger.warn(`忽略 ${field}:需要 JSON 对象。`);\n return undefined;\n }\n return parsed as Record<string, unknown>;\n } catch (error: unknown) {\n this.logger.warn(`无法解析 ${field} JSON:${(error as Error).message}`);\n return undefined;\n }\n }\n\n private normalizeCandidates(value?: string | string[]): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n const source = Array.isArray(value) ? value : value.split(/[\\n,]+/u);\n const result: string[] = [];\n for (const entry of source) {\n const trimmed = entry.trim();\n if (trimmed.length === 0) {\n continue;\n }\n try {\n const normalized = new URL(trimmed).toString();\n if (!result.includes(normalized)) {\n result.push(normalized);\n }\n } catch {\n this.logger.warn(`忽略无效的候选地址: ${trimmed}`);\n }\n }\n return result.length > 0 ? result : undefined;\n }\n}\n"]}
@@ -17,8 +17,7 @@ export interface MigrationResult {
17
17
  *
18
18
  * Data does NOT need to be copied upfront:
19
19
  * - Metadata is in shared PostgreSQL (Quadstore), already accessible from all nodes
20
- * - Binary files use cross-region fallback read (TieredMinioDataAccessor)
21
- * - Files are lazily copied on first access if configured
20
+ * - Binary files use presigned URL redirect (302) from object storage
22
21
  *
23
22
  * This provides instant, user-transparent migration.
24
23
  */
@@ -14,8 +14,7 @@ const EdgeNodeRepository_1 = require("../identity/drizzle/EdgeNodeRepository");
14
14
  *
15
15
  * Data does NOT need to be copied upfront:
16
16
  * - Metadata is in shared PostgreSQL (Quadstore), already accessible from all nodes
17
- * - Binary files use cross-region fallback read (TieredMinioDataAccessor)
18
- * - Files are lazily copied on first access if configured
17
+ * - Binary files use presigned URL redirect (302) from object storage
19
18
  *
20
19
  * This provides instant, user-transparent migration.
21
20
  */
@@ -1 +1 @@
1
- {"version":3,"file":"PodMigrationService.js","sourceRoot":"","sources":["../../src/service/PodMigrationService.ts"],"names":[],"mappings":";;;AAAA,iEAAqD;AACrD,+CAA6D;AAC7D,iFAA8E;AAC9E,+EAA4E;AAc5E;;;;;;;;;;;;;GAaG;AACH,MAAa,mBAAmB;IAO9B,YAAmB,MAAiC;QANjC,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAO7C,MAAM,EAAE,GAAG,IAAA,wBAAmB,EAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACrD,IAAI,CAAC,mBAAmB,GAAG,IAAI,yCAAmB,CAAC,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,kBAAkB,GAAG,IAAI,uCAAkB,CAAC,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAC5C,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,YAAoB;QACzD,eAAe;QACf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC;QAC5C,CAAC;QAED,uBAAuB;QACvB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAC7E,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,eAAe,YAAY,YAAY,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC;QAEtD,6BAA6B;QAC7B,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,uBAAuB,YAAY,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,wDAAwD;QACxD,MAAM,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAE9D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,KAAK,YAAY,YAAY,YAAY,YAAY,EAAE,CAAC,CAAC;QAE/F,OAAO;YACL,KAAK;YACL,YAAY;YACZ,YAAY;YACZ,UAAU,EAAE,IAAI,IAAI,EAAE;SACvB,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,UAAU,CAAC,KAAa;QACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC3D,OAAO,GAAG,EAAE,MAAM,IAAI,IAAI,CAAC;IAC7B,CAAC;CACF;AA7DD,kDA6DC","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport { getIdentityDatabase } from '../identity/drizzle/db';\nimport { PodLookupRepository } from '../identity/drizzle/PodLookupRepository';\nimport { EdgeNodeRepository } from '../identity/drizzle/EdgeNodeRepository';\n\nexport interface PodMigrationServiceConfig {\n identityDbUrl: string;\n currentNodeId: string;\n}\n\nexport interface MigrationResult {\n podId: string;\n sourceNodeId: string;\n targetNodeId: string;\n migratedAt: Date;\n}\n\n/**\n * Service for managing Pod migrations between Center nodes.\n * \n * Simplified migration process:\n * 1. Validate pod and target node exist\n * 2. Update nodeId to target node (atomic update)\n * \n * Data does NOT need to be copied upfront:\n * - Metadata is in shared PostgreSQL (Quadstore), already accessible from all nodes\n * - Binary files use cross-region fallback read (TieredMinioDataAccessor)\n * - Files are lazily copied on first access if configured\n * \n * This provides instant, user-transparent migration.\n */\nexport class PodMigrationService {\n protected readonly logger = getLoggerFor(this);\n\n private readonly podLookupRepository: PodLookupRepository;\n private readonly edgeNodeRepository: EdgeNodeRepository;\n private readonly currentNodeId: string;\n\n public constructor(config: PodMigrationServiceConfig) {\n const db = getIdentityDatabase(config.identityDbUrl);\n this.podLookupRepository = new PodLookupRepository(db);\n this.edgeNodeRepository = new EdgeNodeRepository(db);\n this.currentNodeId = config.currentNodeId;\n }\n\n /**\n * Migrate a pod to a different node.\n * \n * This is instant - only updates the nodeId in database.\n * Subsequent requests will be routed to the new node.\n * Binary files are read via cross-region fallback if not present locally.\n */\n public async migratePod(podId: string, targetNodeId: string): Promise<MigrationResult> {\n // Get pod info\n const pod = await this.podLookupRepository.findById(podId);\n if (!pod) {\n throw new Error(`Pod ${podId} not found`);\n }\n\n // Get target node info\n const targetNode = await this.edgeNodeRepository.getCenterNode(targetNodeId);\n if (!targetNode) {\n throw new Error(`Target node ${targetNodeId} not found`);\n }\n\n const sourceNodeId = pod.nodeId ?? this.currentNodeId;\n\n // Check if already on target\n if (sourceNodeId === targetNodeId) {\n throw new Error(`Pod ${podId} is already on node ${targetNodeId}`);\n }\n\n // Update nodeId - this is the only thing we need to do!\n await this.podLookupRepository.setNodeId(podId, targetNodeId);\n\n this.logger.info(`Pod migrated: pod=${podId}, source=${sourceNodeId}, target=${targetNodeId}`);\n\n return {\n podId,\n sourceNodeId,\n targetNodeId,\n migratedAt: new Date(),\n };\n }\n\n /**\n * Get which node a pod is currently on.\n */\n public async getPodNode(podId: string): Promise<string | null> {\n const pod = await this.podLookupRepository.findById(podId);\n return pod?.nodeId ?? null;\n }\n}\n"]}
1
+ {"version":3,"file":"PodMigrationService.js","sourceRoot":"","sources":["../../src/service/PodMigrationService.ts"],"names":[],"mappings":";;;AAAA,iEAAqD;AACrD,+CAA6D;AAC7D,iFAA8E;AAC9E,+EAA4E;AAc5E;;;;;;;;;;;;GAYG;AACH,MAAa,mBAAmB;IAO9B,YAAmB,MAAiC;QANjC,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAO7C,MAAM,EAAE,GAAG,IAAA,wBAAmB,EAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACrD,IAAI,CAAC,mBAAmB,GAAG,IAAI,yCAAmB,CAAC,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,kBAAkB,GAAG,IAAI,uCAAkB,CAAC,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAC5C,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,YAAoB;QACzD,eAAe;QACf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC;QAC5C,CAAC;QAED,uBAAuB;QACvB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAC7E,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,eAAe,YAAY,YAAY,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC;QAEtD,6BAA6B;QAC7B,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,uBAAuB,YAAY,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,wDAAwD;QACxD,MAAM,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAE9D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,KAAK,YAAY,YAAY,YAAY,YAAY,EAAE,CAAC,CAAC;QAE/F,OAAO;YACL,KAAK;YACL,YAAY;YACZ,YAAY;YACZ,UAAU,EAAE,IAAI,IAAI,EAAE;SACvB,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,UAAU,CAAC,KAAa;QACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC3D,OAAO,GAAG,EAAE,MAAM,IAAI,IAAI,CAAC;IAC7B,CAAC;CACF;AA7DD,kDA6DC","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport { getIdentityDatabase } from '../identity/drizzle/db';\nimport { PodLookupRepository } from '../identity/drizzle/PodLookupRepository';\nimport { EdgeNodeRepository } from '../identity/drizzle/EdgeNodeRepository';\n\nexport interface PodMigrationServiceConfig {\n identityDbUrl: string;\n currentNodeId: string;\n}\n\nexport interface MigrationResult {\n podId: string;\n sourceNodeId: string;\n targetNodeId: string;\n migratedAt: Date;\n}\n\n/**\n * Service for managing Pod migrations between Center nodes.\n * \n * Simplified migration process:\n * 1. Validate pod and target node exist\n * 2. Update nodeId to target node (atomic update)\n * \n * Data does NOT need to be copied upfront:\n * - Metadata is in shared PostgreSQL (Quadstore), already accessible from all nodes\n * - Binary files use presigned URL redirect (302) from object storage\n * \n * This provides instant, user-transparent migration.\n */\nexport class PodMigrationService {\n protected readonly logger = getLoggerFor(this);\n\n private readonly podLookupRepository: PodLookupRepository;\n private readonly edgeNodeRepository: EdgeNodeRepository;\n private readonly currentNodeId: string;\n\n public constructor(config: PodMigrationServiceConfig) {\n const db = getIdentityDatabase(config.identityDbUrl);\n this.podLookupRepository = new PodLookupRepository(db);\n this.edgeNodeRepository = new EdgeNodeRepository(db);\n this.currentNodeId = config.currentNodeId;\n }\n\n /**\n * Migrate a pod to a different node.\n * \n * This is instant - only updates the nodeId in database.\n * Subsequent requests will be routed to the new node.\n * Binary files are read via cross-region fallback if not present locally.\n */\n public async migratePod(podId: string, targetNodeId: string): Promise<MigrationResult> {\n // Get pod info\n const pod = await this.podLookupRepository.findById(podId);\n if (!pod) {\n throw new Error(`Pod ${podId} not found`);\n }\n\n // Get target node info\n const targetNode = await this.edgeNodeRepository.getCenterNode(targetNodeId);\n if (!targetNode) {\n throw new Error(`Target node ${targetNodeId} not found`);\n }\n\n const sourceNodeId = pod.nodeId ?? this.currentNodeId;\n\n // Check if already on target\n if (sourceNodeId === targetNodeId) {\n throw new Error(`Pod ${podId} is already on node ${targetNodeId}`);\n }\n\n // Update nodeId - this is the only thing we need to do!\n await this.podLookupRepository.setNodeId(podId, targetNodeId);\n\n this.logger.info(`Pod migrated: pod=${podId}, source=${sourceNodeId}, target=${targetNodeId}`);\n\n return {\n podId,\n sourceNodeId,\n targetNodeId,\n migratedAt: new Date(),\n };\n }\n\n /**\n * Get which node a pod is currently on.\n */\n public async getPodNode(podId: string): Promise<string | null> {\n const pod = await this.podLookupRepository.findById(podId);\n return pod?.nodeId ?? null;\n }\n}\n"]}
@@ -50,7 +50,7 @@ class SparqlUpdateResourceStore extends community_server_1.DataAccessorBasedStor
50
50
  this.logger.debug(`Applying SPARQL PATCH to ${identifier.path}: ${sparqlUpdate}`);
51
51
  await accessor.executeSparqlUpdate(sparqlUpdate, identifier.path);
52
52
  // PATCH does not affect containment; mark the target resource as updated.
53
- const changes = new community_server_1.IdentifierMap();
53
+ const changes = new Map();
54
54
  changes.set(identifier, new community_server_1.RepresentationMetadata(identifier, { [community_server_1.SOLID_AS.activity]: community_server_1.AS.terms.Update }));
55
55
  return changes;
56
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SparqlUpdateResourceStore.js","sourceRoot":"","sources":["../../src/storage/SparqlUpdateResourceStore.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataFactory } from 'n3';\nimport { Generator as SparqlGenerator, Parser as SparqlParser, type GraphQuads, type UpdateOperation, type Update as SparqlUpdate } from 'sparqljs';\nimport {\n DataAccessorBasedStore,\n IdentifierMap,\n type ChangeMap,\n type ResourceIdentifier,\n type Patch,\n NotImplementedHttpError,\n type Conditions,\n NotFoundHttpError,\n RepresentationMetadata,\n AS,\n SOLID_AS,\n BadRequestHttpError,\n type DataAccessor,\n type IdentifierStrategy,\n type AuxiliaryStrategy,\n type Representation,\n} from '@solid/community-server';\nimport type { SparqlUpdatePatch } from '@solid/community-server';\nimport { readableToString } from '@solid/community-server/dist/util/StreamUtil';\nimport { getLoggerFor } from 'global-logger-factory';\n\nexport interface SparqlUpdateResourceStoreOptions {\n accessor: DataAccessor;\n identifierStrategy: IdentifierStrategy;\n auxiliaryStrategy: AuxiliaryStrategy;\n metadataStrategy: AuxiliaryStrategy;\n}\n\n/**\n * ResourceStore that short-circuits PATCH into direct SPARQL UPDATE\n * when the underlying DataAccessor supports it.\n */\nexport class SparqlUpdateResourceStore extends DataAccessorBasedStore {\n private readonly generator = new SparqlGenerator();\n private readonly parser = new SparqlParser();\n protected override readonly logger = getLoggerFor(this);\n\n public constructor(options: SparqlUpdateResourceStoreOptions) {\n super(options.accessor, options.identifierStrategy, options.auxiliaryStrategy, options.metadataStrategy);\n // Check if identifierStrategy has baseUrl property (SingleRootIdentifierStrategy)\n const strategy = options.identifierStrategy as unknown as { baseUrl?: string };\n this.logger.info(`SparqlUpdateResourceStore initialized with identifierStrategy: ${options.identifierStrategy.constructor.name}, baseUrl: ${strategy.baseUrl ?? 'N/A'}`);\n }\n\n // @ts-expect-error Upstream signature returns never; we return ChangeMap for successful PATCH.\n public override async modifyResource(identifier: ResourceIdentifier, patch: Patch, conditions?: Conditions): Promise<ChangeMap> {\n this.logger.debug(`SparqlUpdateResourceStore.modifyResource called for ${identifier.path}`);\n this.logger.debug(`Patch has algebra: ${typeof (patch as SparqlUpdatePatch).algebra === 'object'}, metadata.contentType: ${patch.metadata?.contentType}`);\n\n const accessor = (this as unknown as { accessor: unknown }).accessor as unknown;\n if (!this.isSparqlCapable(accessor)) {\n this.logger.debug('Accessor is not SPARQL capable');\n throw new NotImplementedHttpError('SPARQL UPDATE not supported by this accessor');\n }\n\n // Keep the default condition validation semantics\n if (conditions) {\n let metadata: RepresentationMetadata | undefined;\n try {\n metadata = await accessor.getMetadata(identifier);\n } catch (error: unknown) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n this.validateConditions(conditions, metadata);\n }\n\n const sparqlUpdate = await this.toSparqlUpdate(patch, identifier);\n if (!sparqlUpdate) {\n this.logger.debug(`toSparqlUpdate returned undefined for ${identifier.path}, falling back to CSS handler`);\n throw new NotImplementedHttpError('Unsupported PATCH payload for SPARQL conversion');\n }\n\n this.logger.debug(`Applying SPARQL PATCH to ${identifier.path}: ${sparqlUpdate}`);\n await accessor.executeSparqlUpdate(sparqlUpdate, identifier.path);\n\n // PATCH does not affect containment; mark the target resource as updated.\n const changes: ChangeMap = new IdentifierMap();\n changes.set(identifier, new RepresentationMetadata(identifier, { [SOLID_AS.activity]: AS.terms.Update }));\n return changes;\n }\n\n /**\n * 只处理 SPARQL UPDATE (application/sparql-update)。\n * N3 Patch 和其他类型返回 undefined,让 CSS PatchingStore 回退到 get-patch-set 逻辑。\n */\n private async toSparqlUpdate(patch: Patch, identifier: ResourceIdentifier): Promise<string | undefined> {\n // 只处理 SPARQL UPDATE,其他类型(包括 N3 Patch)回退到 CSS 默认处理\n if (!this.isSparqlUpdatePatch(patch)) {\n return undefined;\n }\n\n const updateText = await readableToString(patch.data);\n return this.normalizeGraphs(updateText, identifier);\n }\n\n /**\n * Ensure SPARQL UPDATE targets the resource graph (CSS stores documents in named graphs).\n */\n private normalizeGraphs(updateText: string, identifier: ResourceIdentifier): string | undefined {\n const graph = DataFactory.namedNode(identifier.path);\n const identifierStrategy = (this as unknown as { identifierStrategy: { supportsIdentifier: (id: ResourceIdentifier) => boolean }}).identifierStrategy;\n\n const assertGraphAllowed = (value: unknown): void => {\n if (!value || typeof value !== 'object') {\n return;\n }\n const term = value as { termType?: string; value?: string };\n if (term.termType === 'NamedNode' && term.value && !identifierStrategy.supportsIdentifier({ path: term.value })) {\n throw new BadRequestHttpError(`GRAPH ${term.value} is outside the configured identifier space.`);\n }\n };\n const wrapDefaultGraph = (text: string): string => {\n const insert = /INSERT\\s+DATA\\s*{\\s*([^}]*)}/is;\n const del = /DELETE\\s+DATA\\s*{\\s*([^}]*)}/is;\n const rewrite = (regex: RegExp, label: string, input: string): string =>\n input.replace(regex, (_match, body) => `${label} { GRAPH <${graph.value}> { ${body} } }`);\n let out = text;\n if (insert.test(out)) {\n out = rewrite(insert, 'INSERT DATA', out);\n }\n if (del.test(out)) {\n out = rewrite(del, 'DELETE DATA', out);\n }\n return out;\n };\n\n const rewriteTriples = (triples?: any[], targetGraph = graph): any[] => {\n if (!triples) return [];\n return triples.map((triple: any): any => ({\n ...triple,\n graph: (!triple.graph || triple.graph.termType === 'DefaultGraph') ? targetGraph : triple.graph,\n }));\n };\n\n const rewritePattern = (pattern: any): any => {\n if (pattern.type === 'bgp') {\n return { ...pattern, triples: rewriteTriples(pattern.triples) };\n }\n if (pattern.type === 'graph') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'group') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'optional') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'union') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'minus') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'filter') {\n return pattern; // FILTER doesn't contain triples, pass through\n }\n if (pattern.type === 'bind') {\n return pattern; // BIND doesn't contain triples, pass through\n }\n if (pattern.type === 'values') {\n return pattern; // VALUES doesn't contain triples, pass through\n }\n if (pattern.type === 'service') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n return pattern;\n };\n\n const toGraphQuads = (items?: any[]): GraphQuads[] | undefined => {\n if (!items) return items;\n return items.map((item: any): GraphQuads => {\n if (item?.type === 'graph') {\n assertGraphAllowed(item.name);\n return {\n ...item,\n name: item.name ?? graph,\n triples: rewriteTriples(item.triples, item.name ?? graph),\n };\n }\n // Treat as plain quad\n return {\n type: 'graph',\n name: graph,\n triples: rewriteTriples([ item ], graph),\n };\n });\n };\n\n try {\n console.log(`[normalizeGraphs] Input SPARQL (first 500 chars): ${updateText.slice(0, 500)}`);\n const parsed = this.parser.parse(updateText) as unknown as SparqlUpdate;\n\n // Explicitly reject SPARQL Queries (SELECT, ASK, CONSTRUCT) in PATCH\n if ((parsed as any).type === 'query') {\n this.logger.warn(`Received SPARQL Query in PATCH request for ${identifier.path}. SPARQL PATCH only supports UPDATE operations.`);\n return undefined;\n }\n\n const collect = (ops: any[], key: 'delete' | 'insert'): any[] =>\n ops.flatMap((op): any[] => {\n const entries = op[key];\n if (!entries) return [];\n if (Array.isArray(entries)) {\n return entries.flatMap((entry: any): any[] =>\n entry.triples ? entry.triples : (entry.quads ?? []));\n }\n return [];\n });\n const deleteTriples = collect(parsed.updates as any[], 'delete');\n const insertTriples = collect(parsed.updates as any[], 'insert');\n const hasVariables = [...deleteTriples, ...insertTriples].some((t: any): boolean =>\n t.subject?.termType === 'Variable' || t.predicate?.termType === 'Variable' || t.object?.termType === 'Variable');\n\n const simpleOps = parsed.updates.every((op: any): boolean =>\n [ 'delete', 'insert', 'insertdelete', 'deleteinsert' ].includes(op.updateType) &&\n (!op.where || op.where.length === 0) &&\n !hasVariables);\n\n this.logger.debug(`[normalizeGraphs] simpleOps=${simpleOps}, hasVariables=${hasVariables}, deleteTriples=${deleteTriples.length}, insertTriples=${insertTriples.length}`);\n this.logger.debug(`[normalizeGraphs] updateTypes: ${parsed.updates.map((op: any) => op.updateType).join(', ')}`);\n\n if (simpleOps && deleteTriples.length + insertTriples.length > 0) {\n const termToString = (term: any): string => {\n if (term.termType === 'NamedNode') {\n return `<${term.value}>`;\n }\n if (term.termType === 'Literal') {\n // Escape special characters in literal values\n const hasQuotes = term.value.includes('\"');\n const hasNewlines = term.value.includes('\\n') || term.value.includes('\\r');\n\n let escaped: string;\n let useTripleQuotes = false;\n\n if (hasQuotes || hasNewlines) {\n // Use triple-quoted strings for values with quotes or newlines\n useTripleQuotes = true;\n escaped = term.value;\n // Escape triple-quote sequences\n escaped = escaped.replace(/\"\"\"/g, '\"\\\\\"\\\\\"\"');\n // Escape trailing quotes to avoid \"\"\"content\"\"\"\" sequences\n if (escaped.endsWith('\"')) {\n const match = escaped.match(/\"*$/);\n const trailingQuotes = match ? match[0].length : 0;\n if (trailingQuotes > 0) {\n escaped = escaped.slice(0, -trailingQuotes) + '\\\\\"'.repeat(trailingQuotes);\n }\n }\n } else {\n // Regular escaping for simple strings\n escaped = term.value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n }\n\n const quote = useTripleQuotes ? '\"\"\"' : '\"';\n\n // Handle language tags and datatypes\n if (term.language) {\n return `${quote}${escaped}${quote}@${term.language}`;\n }\n if (term.datatype && term.datatype.value !== 'http://www.w3.org/2001/XMLSchema#string') {\n return `${quote}${escaped}${quote}^^<${term.datatype.value}>`;\n }\n return `${quote}${escaped}${quote}`;\n }\n if (term.termType === 'BlankNode') {\n return `_:${term.value}`;\n }\n // Fallback for unknown term types\n return `<${term.value}>`;\n };\n const toTripleStr = (triples: any[]): string =>\n triples.map((t): string => `${termToString(t.subject)} ${termToString(t.predicate)} ${termToString(t.object)} .`).join(' ');\n let parts: string[] = [];\n if (deleteTriples.length > 0) {\n parts.push(`DELETE DATA { GRAPH <${graph.value}> { ${toTripleStr(deleteTriples)} } }`);\n }\n if (insertTriples.length > 0) {\n parts.push(`INSERT DATA { GRAPH <${graph.value}> { ${toTripleStr(insertTriples)} } }`);\n }\n const normalizedSimple = parts.join(';\\n');\n this.logger.verbose(`Normalized SPARQL UPDATE for ${identifier.path}: ${normalizedSimple}`);\n return normalizedSimple;\n }\n\n parsed.updates = parsed.updates.map((op: any): UpdateOperation => {\n switch (op.updateType) {\n case 'deleteinsert':\n case 'insertdelete':\n return {\n ...op,\n delete: toGraphQuads(op.delete),\n insert: toGraphQuads(op.insert),\n where: op.where && op.where.length > 0 ? [ { type: 'graph', name: graph, patterns: op.where.map(rewritePattern) } ] : [],\n };\n case 'delete':\n case 'insert': {\n const deleteQuads = toGraphQuads(op.delete) ?? [];\n const insertQuads = toGraphQuads(op.insert) ?? [];\n return {\n updateType: 'insertdelete',\n delete: deleteQuads,\n insert: insertQuads,\n where: op.where && op.where.length > 0 ? [ { type: 'graph', name: graph, patterns: op.where.map(rewritePattern) } ] : [],\n };\n }\n default:\n return op;\n }\n });\n const normalized = this.generator.stringify(parsed);\n this.logger.verbose(`Normalized SPARQL UPDATE for ${identifier.path}: ${normalized}`);\n return normalized;\n } catch (error: unknown) {\n console.log(`[normalizeGraphs] Parse FAILED for ${identifier.path}: ${error}`);\n console.log(`[normalizeGraphs] Input was: ${updateText.slice(0, 300)}`);\n const fallbackResult = wrapDefaultGraph(updateText);\n console.log(`[normalizeGraphs] Fallback result: ${fallbackResult.slice(0, 300)}`);\n return fallbackResult;\n }\n }\n\n private isSparqlUpdatePatch(patch: Patch): patch is SparqlUpdatePatch {\n return typeof (patch as SparqlUpdatePatch).algebra === 'object';\n }\n\n private isSparqlCapable(accessor: unknown): accessor is {\n executeSparqlUpdate: (query: string, baseIri?: string) => Promise<void>;\n getMetadata: (identifier: ResourceIdentifier) => Promise<RepresentationMetadata>;\n } {\n return typeof accessor === 'object' &&\n accessor !== null &&\n typeof (accessor as { executeSparqlUpdate?: unknown }).executeSparqlUpdate === 'function' &&\n typeof (accessor as { getMetadata?: unknown }).getMetadata === 'function';\n }\n\n public override async setRepresentation(identifier: ResourceIdentifier, representation: Representation, conditions?: Conditions): Promise<ChangeMap> {\n return super.setRepresentation(identifier, representation, conditions);\n }\n}\n"]}
1
+ {"version":3,"file":"SparqlUpdateResourceStore.js","sourceRoot":"","sources":["../../src/storage/SparqlUpdateResourceStore.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataFactory } from 'n3';\nimport { Generator as SparqlGenerator, Parser as SparqlParser, type GraphQuads, type UpdateOperation, type Update as SparqlUpdate } from 'sparqljs';\nimport {\n DataAccessorBasedStore,\n type ChangeMap,\n type ResourceIdentifier,\n type Patch,\n NotImplementedHttpError,\n type Conditions,\n NotFoundHttpError,\n RepresentationMetadata,\n AS,\n SOLID_AS,\n BadRequestHttpError,\n type DataAccessor,\n type IdentifierStrategy,\n type AuxiliaryStrategy,\n type Representation,\n} from '@solid/community-server';\nimport type { SparqlUpdatePatch } from '@solid/community-server';\nimport { readableToString } from '@solid/community-server/dist/util/StreamUtil';\nimport { getLoggerFor } from 'global-logger-factory';\n\nexport interface SparqlUpdateResourceStoreOptions {\n accessor: DataAccessor;\n identifierStrategy: IdentifierStrategy;\n auxiliaryStrategy: AuxiliaryStrategy;\n metadataStrategy: AuxiliaryStrategy;\n}\n\n/**\n * ResourceStore that short-circuits PATCH into direct SPARQL UPDATE\n * when the underlying DataAccessor supports it.\n */\nexport class SparqlUpdateResourceStore extends DataAccessorBasedStore {\n private readonly generator = new SparqlGenerator();\n private readonly parser = new SparqlParser();\n protected override readonly logger = getLoggerFor(this);\n\n public constructor(options: SparqlUpdateResourceStoreOptions) {\n super(options.accessor, options.identifierStrategy, options.auxiliaryStrategy, options.metadataStrategy);\n // Check if identifierStrategy has baseUrl property (SingleRootIdentifierStrategy)\n const strategy = options.identifierStrategy as unknown as { baseUrl?: string };\n this.logger.info(`SparqlUpdateResourceStore initialized with identifierStrategy: ${options.identifierStrategy.constructor.name}, baseUrl: ${strategy.baseUrl ?? 'N/A'}`);\n }\n\n // @ts-expect-error Upstream signature returns never; we return ChangeMap for successful PATCH.\n public override async modifyResource(identifier: ResourceIdentifier, patch: Patch, conditions?: Conditions): Promise<ChangeMap> {\n this.logger.debug(`SparqlUpdateResourceStore.modifyResource called for ${identifier.path}`);\n this.logger.debug(`Patch has algebra: ${typeof (patch as SparqlUpdatePatch).algebra === 'object'}, metadata.contentType: ${patch.metadata?.contentType}`);\n\n const accessor = (this as unknown as { accessor: unknown }).accessor as unknown;\n if (!this.isSparqlCapable(accessor)) {\n this.logger.debug('Accessor is not SPARQL capable');\n throw new NotImplementedHttpError('SPARQL UPDATE not supported by this accessor');\n }\n\n // Keep the default condition validation semantics\n if (conditions) {\n let metadata: RepresentationMetadata | undefined;\n try {\n metadata = await accessor.getMetadata(identifier);\n } catch (error: unknown) {\n if (!NotFoundHttpError.isInstance(error)) {\n throw error;\n }\n }\n this.validateConditions(conditions, metadata);\n }\n\n const sparqlUpdate = await this.toSparqlUpdate(patch, identifier);\n if (!sparqlUpdate) {\n this.logger.debug(`toSparqlUpdate returned undefined for ${identifier.path}, falling back to CSS handler`);\n throw new NotImplementedHttpError('Unsupported PATCH payload for SPARQL conversion');\n }\n\n this.logger.debug(`Applying SPARQL PATCH to ${identifier.path}: ${sparqlUpdate}`);\n await accessor.executeSparqlUpdate(sparqlUpdate, identifier.path);\n\n // PATCH does not affect containment; mark the target resource as updated.\n const changes = new Map() as ChangeMap;\n changes.set(identifier, new RepresentationMetadata(identifier, { [SOLID_AS.activity]: AS.terms.Update }));\n return changes;\n }\n\n /**\n * 只处理 SPARQL UPDATE (application/sparql-update)。\n * N3 Patch 和其他类型返回 undefined,让 CSS PatchingStore 回退到 get-patch-set 逻辑。\n */\n private async toSparqlUpdate(patch: Patch, identifier: ResourceIdentifier): Promise<string | undefined> {\n // 只处理 SPARQL UPDATE,其他类型(包括 N3 Patch)回退到 CSS 默认处理\n if (!this.isSparqlUpdatePatch(patch)) {\n return undefined;\n }\n\n const updateText = await readableToString(patch.data);\n return this.normalizeGraphs(updateText, identifier);\n }\n\n /**\n * Ensure SPARQL UPDATE targets the resource graph (CSS stores documents in named graphs).\n */\n private normalizeGraphs(updateText: string, identifier: ResourceIdentifier): string | undefined {\n const graph = DataFactory.namedNode(identifier.path);\n const identifierStrategy = (this as unknown as { identifierStrategy: { supportsIdentifier: (id: ResourceIdentifier) => boolean }}).identifierStrategy;\n\n const assertGraphAllowed = (value: unknown): void => {\n if (!value || typeof value !== 'object') {\n return;\n }\n const term = value as { termType?: string; value?: string };\n if (term.termType === 'NamedNode' && term.value && !identifierStrategy.supportsIdentifier({ path: term.value })) {\n throw new BadRequestHttpError(`GRAPH ${term.value} is outside the configured identifier space.`);\n }\n };\n const wrapDefaultGraph = (text: string): string => {\n const insert = /INSERT\\s+DATA\\s*{\\s*([^}]*)}/is;\n const del = /DELETE\\s+DATA\\s*{\\s*([^}]*)}/is;\n const rewrite = (regex: RegExp, label: string, input: string): string =>\n input.replace(regex, (_match, body) => `${label} { GRAPH <${graph.value}> { ${body} } }`);\n let out = text;\n if (insert.test(out)) {\n out = rewrite(insert, 'INSERT DATA', out);\n }\n if (del.test(out)) {\n out = rewrite(del, 'DELETE DATA', out);\n }\n return out;\n };\n\n const rewriteTriples = (triples?: any[], targetGraph = graph): any[] => {\n if (!triples) return [];\n return triples.map((triple: any): any => ({\n ...triple,\n graph: (!triple.graph || triple.graph.termType === 'DefaultGraph') ? targetGraph : triple.graph,\n }));\n };\n\n const rewritePattern = (pattern: any): any => {\n if (pattern.type === 'bgp') {\n return { ...pattern, triples: rewriteTriples(pattern.triples) };\n }\n if (pattern.type === 'graph') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'group') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'optional') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'union') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'minus') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n if (pattern.type === 'filter') {\n return pattern; // FILTER doesn't contain triples, pass through\n }\n if (pattern.type === 'bind') {\n return pattern; // BIND doesn't contain triples, pass through\n }\n if (pattern.type === 'values') {\n return pattern; // VALUES doesn't contain triples, pass through\n }\n if (pattern.type === 'service') {\n return { ...pattern, patterns: pattern.patterns?.map(rewritePattern) ?? [] };\n }\n return pattern;\n };\n\n const toGraphQuads = (items?: any[]): GraphQuads[] | undefined => {\n if (!items) return items;\n return items.map((item: any): GraphQuads => {\n if (item?.type === 'graph') {\n assertGraphAllowed(item.name);\n return {\n ...item,\n name: item.name ?? graph,\n triples: rewriteTriples(item.triples, item.name ?? graph),\n };\n }\n // Treat as plain quad\n return {\n type: 'graph',\n name: graph,\n triples: rewriteTriples([ item ], graph),\n };\n });\n };\n\n try {\n console.log(`[normalizeGraphs] Input SPARQL (first 500 chars): ${updateText.slice(0, 500)}`);\n const parsed = this.parser.parse(updateText) as unknown as SparqlUpdate;\n\n // Explicitly reject SPARQL Queries (SELECT, ASK, CONSTRUCT) in PATCH\n if ((parsed as any).type === 'query') {\n this.logger.warn(`Received SPARQL Query in PATCH request for ${identifier.path}. SPARQL PATCH only supports UPDATE operations.`);\n return undefined;\n }\n\n const collect = (ops: any[], key: 'delete' | 'insert'): any[] =>\n ops.flatMap((op): any[] => {\n const entries = op[key];\n if (!entries) return [];\n if (Array.isArray(entries)) {\n return entries.flatMap((entry: any): any[] =>\n entry.triples ? entry.triples : (entry.quads ?? []));\n }\n return [];\n });\n const deleteTriples = collect(parsed.updates as any[], 'delete');\n const insertTriples = collect(parsed.updates as any[], 'insert');\n const hasVariables = [...deleteTriples, ...insertTriples].some((t: any): boolean =>\n t.subject?.termType === 'Variable' || t.predicate?.termType === 'Variable' || t.object?.termType === 'Variable');\n\n const simpleOps = parsed.updates.every((op: any): boolean =>\n [ 'delete', 'insert', 'insertdelete', 'deleteinsert' ].includes(op.updateType) &&\n (!op.where || op.where.length === 0) &&\n !hasVariables);\n\n this.logger.debug(`[normalizeGraphs] simpleOps=${simpleOps}, hasVariables=${hasVariables}, deleteTriples=${deleteTriples.length}, insertTriples=${insertTriples.length}`);\n this.logger.debug(`[normalizeGraphs] updateTypes: ${parsed.updates.map((op: any) => op.updateType).join(', ')}`);\n\n if (simpleOps && deleteTriples.length + insertTriples.length > 0) {\n const termToString = (term: any): string => {\n if (term.termType === 'NamedNode') {\n return `<${term.value}>`;\n }\n if (term.termType === 'Literal') {\n // Escape special characters in literal values\n const hasQuotes = term.value.includes('\"');\n const hasNewlines = term.value.includes('\\n') || term.value.includes('\\r');\n\n let escaped: string;\n let useTripleQuotes = false;\n\n if (hasQuotes || hasNewlines) {\n // Use triple-quoted strings for values with quotes or newlines\n useTripleQuotes = true;\n escaped = term.value;\n // Escape triple-quote sequences\n escaped = escaped.replace(/\"\"\"/g, '\"\\\\\"\\\\\"\"');\n // Escape trailing quotes to avoid \"\"\"content\"\"\"\" sequences\n if (escaped.endsWith('\"')) {\n const match = escaped.match(/\"*$/);\n const trailingQuotes = match ? match[0].length : 0;\n if (trailingQuotes > 0) {\n escaped = escaped.slice(0, -trailingQuotes) + '\\\\\"'.repeat(trailingQuotes);\n }\n }\n } else {\n // Regular escaping for simple strings\n escaped = term.value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n }\n\n const quote = useTripleQuotes ? '\"\"\"' : '\"';\n\n // Handle language tags and datatypes\n if (term.language) {\n return `${quote}${escaped}${quote}@${term.language}`;\n }\n if (term.datatype && term.datatype.value !== 'http://www.w3.org/2001/XMLSchema#string') {\n return `${quote}${escaped}${quote}^^<${term.datatype.value}>`;\n }\n return `${quote}${escaped}${quote}`;\n }\n if (term.termType === 'BlankNode') {\n return `_:${term.value}`;\n }\n // Fallback for unknown term types\n return `<${term.value}>`;\n };\n const toTripleStr = (triples: any[]): string =>\n triples.map((t): string => `${termToString(t.subject)} ${termToString(t.predicate)} ${termToString(t.object)} .`).join(' ');\n let parts: string[] = [];\n if (deleteTriples.length > 0) {\n parts.push(`DELETE DATA { GRAPH <${graph.value}> { ${toTripleStr(deleteTriples)} } }`);\n }\n if (insertTriples.length > 0) {\n parts.push(`INSERT DATA { GRAPH <${graph.value}> { ${toTripleStr(insertTriples)} } }`);\n }\n const normalizedSimple = parts.join(';\\n');\n this.logger.verbose(`Normalized SPARQL UPDATE for ${identifier.path}: ${normalizedSimple}`);\n return normalizedSimple;\n }\n\n parsed.updates = parsed.updates.map((op: any): UpdateOperation => {\n switch (op.updateType) {\n case 'deleteinsert':\n case 'insertdelete':\n return {\n ...op,\n delete: toGraphQuads(op.delete),\n insert: toGraphQuads(op.insert),\n where: op.where && op.where.length > 0 ? [ { type: 'graph', name: graph, patterns: op.where.map(rewritePattern) } ] : [],\n };\n case 'delete':\n case 'insert': {\n const deleteQuads = toGraphQuads(op.delete) ?? [];\n const insertQuads = toGraphQuads(op.insert) ?? [];\n return {\n updateType: 'insertdelete',\n delete: deleteQuads,\n insert: insertQuads,\n where: op.where && op.where.length > 0 ? [ { type: 'graph', name: graph, patterns: op.where.map(rewritePattern) } ] : [],\n };\n }\n default:\n return op;\n }\n });\n const normalized = this.generator.stringify(parsed);\n this.logger.verbose(`Normalized SPARQL UPDATE for ${identifier.path}: ${normalized}`);\n return normalized;\n } catch (error: unknown) {\n console.log(`[normalizeGraphs] Parse FAILED for ${identifier.path}: ${error}`);\n console.log(`[normalizeGraphs] Input was: ${updateText.slice(0, 300)}`);\n const fallbackResult = wrapDefaultGraph(updateText);\n console.log(`[normalizeGraphs] Fallback result: ${fallbackResult.slice(0, 300)}`);\n return fallbackResult;\n }\n }\n\n private isSparqlUpdatePatch(patch: Patch): patch is SparqlUpdatePatch {\n return typeof (patch as SparqlUpdatePatch).algebra === 'object';\n }\n\n private isSparqlCapable(accessor: unknown): accessor is {\n executeSparqlUpdate: (query: string, baseIri?: string) => Promise<void>;\n getMetadata: (identifier: ResourceIdentifier) => Promise<RepresentationMetadata>;\n } {\n return typeof accessor === 'object' &&\n accessor !== null &&\n typeof (accessor as { executeSparqlUpdate?: unknown }).executeSparqlUpdate === 'function' &&\n typeof (accessor as { getMetadata?: unknown }).getMetadata === 'function';\n }\n\n public override async setRepresentation(identifier: ResourceIdentifier, representation: Representation, conditions?: Conditions): Promise<ChangeMap> {\n return super.setRepresentation(identifier, representation, conditions);\n }\n}\n"]}
@@ -26,6 +26,12 @@ export declare class MinioDataAccessor implements DataAccessor {
26
26
  * @param identifier - Identifier for which the data is requested.
27
27
  */
28
28
  getData(identifier: ResourceIdentifier): Promise<Guarded<Readable>>;
29
+ /**
30
+ * Generate a presigned GET URL for the given resource.
31
+ * @param identifier - Resource identifier.
32
+ * @param expires - URL expiry in seconds (default 3600).
33
+ */
34
+ getPresignedUrl(identifier: ResourceIdentifier, expires?: number): Promise<string>;
29
35
  /**
30
36
  * Returns the metadata corresponding to the identifier.
31
37
  * If possible, it is suggested to add a `posix:size` triple to the metadata indicating the binary size.
@@ -57,6 +57,16 @@ class MinioDataAccessor {
57
57
  const stream = await this.client.getObject(this.bucketName, url.pathname);
58
58
  return (0, community_server_1.guardStream)(stream);
59
59
  }
60
+ /**
61
+ * Generate a presigned GET URL for the given resource.
62
+ * @param identifier - Resource identifier.
63
+ * @param expires - URL expiry in seconds (default 3600).
64
+ */
65
+ async getPresignedUrl(identifier, expires = 3600) {
66
+ const url = new URL(identifier.path);
67
+ const objectKey = url.pathname.replace(/^\//, '');
68
+ return this.client.presignedGetObject(this.bucketName, objectKey, expires);
69
+ }
60
70
  /**
61
71
  * Returns the metadata corresponding to the identifier.
62
72
  * If possible, it is suggested to add a `posix:size` triple to the metadata indicating the binary size.