@undefineds.co/xpod 0.1.7 → 0.2.0-preview.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/README.md +141 -2
  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/api/auth/AuthContext.d.ts +12 -1
  11. package/dist/api/auth/AuthContext.js +18 -1
  12. package/dist/api/auth/AuthContext.js.map +1 -1
  13. package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
  14. package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
  15. package/dist/api/auth/ServiceTokenAuthenticator.d.ts +18 -0
  16. package/dist/api/auth/ServiceTokenAuthenticator.js +50 -0
  17. package/dist/api/auth/ServiceTokenAuthenticator.js.map +1 -0
  18. package/dist/api/auth/index.d.ts +1 -0
  19. package/dist/api/auth/index.js +1 -0
  20. package/dist/api/auth/index.js.map +1 -1
  21. package/dist/api/chatkit/ai-provider.d.ts +0 -10
  22. package/dist/api/chatkit/ai-provider.js +11 -120
  23. package/dist/api/chatkit/ai-provider.js.map +1 -1
  24. package/dist/api/chatkit/default-agent.js +11 -8
  25. package/dist/api/chatkit/default-agent.js.map +1 -1
  26. package/dist/api/chatkit/pod-store.js +19 -3
  27. package/dist/api/chatkit/pod-store.js.map +1 -1
  28. package/dist/api/chatkit/schema.d.ts +9 -3
  29. package/dist/api/chatkit/schema.js +14 -6
  30. package/dist/api/chatkit/schema.js.map +1 -1
  31. package/dist/api/container/business-token.d.ts +9 -0
  32. package/dist/api/container/business-token.js +32 -0
  33. package/dist/api/container/business-token.js.map +1 -0
  34. package/dist/api/container/cloud.js +36 -12
  35. package/dist/api/container/cloud.js.map +1 -1
  36. package/dist/api/container/common.js +12 -5
  37. package/dist/api/container/common.js.map +1 -1
  38. package/dist/api/container/index.js +94 -14
  39. package/dist/api/container/index.js.map +1 -1
  40. package/dist/api/container/local.js +2 -1
  41. package/dist/api/container/local.js.map +1 -1
  42. package/dist/api/container/routes.js +81 -9
  43. package/dist/api/container/routes.js.map +1 -1
  44. package/dist/api/container/types.d.ts +8 -6
  45. package/dist/api/container/types.js.map +1 -1
  46. package/dist/api/handlers/AdminHandler.js +9 -9
  47. package/dist/api/handlers/AdminHandler.js.map +1 -1
  48. package/dist/api/handlers/ApiKeyHandler.js +0 -6
  49. package/dist/api/handlers/ApiKeyHandler.js.map +1 -1
  50. package/dist/api/handlers/EdgeNodeSignalHandler.d.ts +17 -0
  51. package/dist/api/handlers/EdgeNodeSignalHandler.js +171 -0
  52. package/dist/api/handlers/EdgeNodeSignalHandler.js.map +1 -0
  53. package/dist/api/handlers/PodManagementHandler.d.ts +5 -4
  54. package/dist/api/handlers/PodManagementHandler.js +11 -10
  55. package/dist/api/handlers/PodManagementHandler.js.map +1 -1
  56. package/dist/api/handlers/ProvisionHandler.d.ts +42 -0
  57. package/dist/api/handlers/ProvisionHandler.js +161 -0
  58. package/dist/api/handlers/ProvisionHandler.js.map +1 -0
  59. package/dist/api/handlers/QuotaHandler.d.ts +7 -7
  60. package/dist/api/handlers/QuotaHandler.js +143 -73
  61. package/dist/api/handlers/QuotaHandler.js.map +1 -1
  62. package/dist/api/handlers/SubdomainClientHandler.js +2 -2
  63. package/dist/api/handlers/SubdomainClientHandler.js.map +1 -1
  64. package/dist/api/handlers/SubdomainHandler.js +13 -8
  65. package/dist/api/handlers/SubdomainHandler.js.map +1 -1
  66. package/dist/api/handlers/UsageHandler.d.ts +14 -0
  67. package/dist/api/handlers/UsageHandler.js +123 -0
  68. package/dist/api/handlers/UsageHandler.js.map +1 -0
  69. package/dist/api/handlers/index.d.ts +3 -1
  70. package/dist/api/handlers/index.js +3 -1
  71. package/dist/api/handlers/index.js.map +1 -1
  72. package/dist/api/main.js +18 -0
  73. package/dist/api/main.js.map +1 -1
  74. package/dist/api/middleware/OpenAuthMiddleware.d.ts +12 -0
  75. package/dist/api/middleware/OpenAuthMiddleware.js +27 -0
  76. package/dist/api/middleware/OpenAuthMiddleware.js.map +1 -0
  77. package/dist/api/runtime.d.ts +15 -0
  78. package/dist/api/runtime.js +104 -0
  79. package/dist/api/runtime.js.map +1 -0
  80. package/dist/api/service/VercelChatService.d.ts +16 -7
  81. package/dist/api/service/VercelChatService.js +98 -178
  82. package/dist/api/service/VercelChatService.js.map +1 -1
  83. package/dist/api/store/DrizzleClientCredentialsStore.d.ts +6 -11
  84. package/dist/api/store/DrizzleClientCredentialsStore.js +9 -39
  85. package/dist/api/store/DrizzleClientCredentialsStore.js.map +1 -1
  86. package/dist/authorization/AuthModeSelector.d.ts +10 -0
  87. package/dist/authorization/AuthModeSelector.js +27 -0
  88. package/dist/authorization/AuthModeSelector.js.map +1 -0
  89. package/dist/authorization/AuthModeSelector.jsonld +81 -0
  90. package/dist/cli/commands/account.d.ts +6 -0
  91. package/dist/cli/commands/account.js +119 -0
  92. package/dist/cli/commands/account.js.map +1 -0
  93. package/dist/cli/commands/auth.js +20 -29
  94. package/dist/cli/commands/auth.js.map +1 -1
  95. package/dist/cli/commands/backup.d.ts +15 -0
  96. package/dist/cli/commands/backup.js +286 -0
  97. package/dist/cli/commands/backup.js.map +1 -0
  98. package/dist/cli/commands/config.d.ts +34 -3
  99. package/dist/cli/commands/config.js +195 -258
  100. package/dist/cli/commands/config.js.map +1 -1
  101. package/dist/cli/commands/doctor.d.ts +6 -0
  102. package/dist/cli/commands/doctor.js +94 -0
  103. package/dist/cli/commands/doctor.js.map +1 -0
  104. package/dist/cli/commands/pod.d.ts +6 -0
  105. package/dist/cli/commands/pod.js +124 -0
  106. package/dist/cli/commands/pod.js.map +1 -0
  107. package/dist/cli/commands/start.js +28 -5
  108. package/dist/cli/commands/start.js.map +1 -1
  109. package/dist/cli/index.js +9 -0
  110. package/dist/cli/index.js.map +1 -1
  111. package/dist/cli/lib/credentials-store.d.ts +17 -0
  112. package/dist/cli/lib/credentials-store.js +73 -0
  113. package/dist/cli/lib/credentials-store.js.map +1 -0
  114. package/dist/cli/lib/css-account.d.ts +17 -0
  115. package/dist/cli/lib/css-account.js +56 -0
  116. package/dist/cli/lib/css-account.js.map +1 -1
  117. package/dist/cli/lib/pod-thread-store.d.ts +57 -0
  118. package/dist/cli/lib/pod-thread-store.js +310 -0
  119. package/dist/cli/lib/pod-thread-store.js.map +1 -0
  120. package/dist/cli/lib/solid-auth.d.ts +20 -0
  121. package/dist/cli/lib/solid-auth.js +70 -0
  122. package/dist/cli/lib/solid-auth.js.map +1 -0
  123. package/dist/components/components.jsonld +5 -8
  124. package/dist/components/context.jsonld +114 -244
  125. package/dist/edge/EdgeNodeAgent.js +2 -2
  126. package/dist/edge/EdgeNodeAgent.js.map +1 -1
  127. package/dist/edge/EdgeNodeDnsCoordinator.d.ts +1 -7
  128. package/dist/edge/EdgeNodeDnsCoordinator.js +31 -41
  129. package/dist/edge/EdgeNodeDnsCoordinator.js.map +1 -1
  130. package/dist/edge/EdgeNodeDnsCoordinator.jsonld +1 -27
  131. package/dist/edge/EdgeNodeModeDetector.d.ts +1 -1
  132. package/dist/edge/EdgeNodeModeDetector.js +9 -11
  133. package/dist/edge/EdgeNodeModeDetector.js.map +1 -1
  134. package/dist/http/ClusterIngressRouter.js +3 -3
  135. package/dist/http/ClusterIngressRouter.js.map +1 -1
  136. package/dist/http/ClusterWebSocketConfigurator.js +2 -2
  137. package/dist/http/ClusterWebSocketConfigurator.js.map +1 -1
  138. package/dist/http/PodRoutingHttpHandler.js +2 -2
  139. package/dist/http/PodRoutingHttpHandler.js.map +1 -1
  140. package/dist/http/cluster/PodMigrationHttpHandler.d.ts +1 -1
  141. package/dist/http/cluster/PodMigrationHttpHandler.js +1 -1
  142. package/dist/http/cluster/PodMigrationHttpHandler.js.map +1 -1
  143. package/dist/identity/drizzle/EdgeNodeRepository.d.ts +37 -4
  144. package/dist/identity/drizzle/EdgeNodeRepository.js +120 -128
  145. package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -1
  146. package/dist/identity/drizzle/ServiceTokenRepository.d.ts +52 -0
  147. package/dist/identity/drizzle/ServiceTokenRepository.js +143 -0
  148. package/dist/identity/drizzle/ServiceTokenRepository.js.map +1 -0
  149. package/dist/identity/drizzle/db.d.ts +9 -0
  150. package/dist/identity/drizzle/db.js +208 -1
  151. package/dist/identity/drizzle/db.js.map +1 -1
  152. package/dist/identity/drizzle/schema.pg.d.ts +5 -0
  153. package/dist/identity/drizzle/schema.pg.js +49 -20
  154. package/dist/identity/drizzle/schema.pg.js.map +1 -1
  155. package/dist/identity/drizzle/schema.sqlite.d.ts +332 -57
  156. package/dist/identity/drizzle/schema.sqlite.js +48 -18
  157. package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
  158. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +6 -4
  159. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
  160. package/dist/index.d.ts +6 -9
  161. package/dist/index.js +12 -14
  162. package/dist/index.js.map +1 -1
  163. package/dist/main.js +25 -8
  164. package/dist/main.js.map +1 -1
  165. package/dist/provision/ProvisionCodeCodec.d.ts +39 -0
  166. package/dist/provision/ProvisionCodeCodec.js +65 -0
  167. package/dist/provision/ProvisionCodeCodec.js.map +1 -0
  168. package/dist/provision/ProvisionCodeCodec.jsonld +47 -0
  169. package/dist/provision/ProvisionPodCreator.d.ts +20 -0
  170. package/dist/provision/ProvisionPodCreator.js +84 -0
  171. package/dist/provision/ProvisionPodCreator.js.map +1 -0
  172. package/dist/provision/ProvisionPodCreator.jsonld +118 -0
  173. package/dist/quota/DrizzleQuotaService.d.ts +17 -3
  174. package/dist/quota/DrizzleQuotaService.js +108 -8
  175. package/dist/quota/DrizzleQuotaService.js.map +1 -1
  176. package/dist/quota/DrizzleQuotaService.jsonld +33 -22
  177. package/dist/quota/NoopQuotaService.d.ts +7 -1
  178. package/dist/quota/NoopQuotaService.js +12 -0
  179. package/dist/quota/NoopQuotaService.js.map +1 -1
  180. package/dist/quota/NoopQuotaService.jsonld +24 -0
  181. package/dist/quota/QuotaService.d.ts +17 -0
  182. package/dist/quota/QuotaService.js +5 -0
  183. package/dist/quota/QuotaService.js.map +1 -1
  184. package/dist/quota/QuotaService.jsonld +50 -0
  185. package/dist/runtime/Proxy.d.ts +22 -4
  186. package/dist/runtime/Proxy.js +154 -35
  187. package/dist/runtime/Proxy.js.map +1 -1
  188. package/dist/runtime/XpodRuntime.d.ts +49 -0
  189. package/dist/runtime/XpodRuntime.js +374 -0
  190. package/dist/runtime/XpodRuntime.js.map +1 -0
  191. package/dist/runtime/env-utils.d.ts +2 -0
  192. package/dist/runtime/env-utils.js +55 -0
  193. package/dist/runtime/env-utils.js.map +1 -0
  194. package/dist/runtime/index.d.ts +4 -0
  195. package/dist/runtime/index.js +8 -1
  196. package/dist/runtime/index.js.map +1 -1
  197. package/dist/runtime/socket-fetch.d.ts +1 -0
  198. package/dist/runtime/socket-fetch.js +72 -0
  199. package/dist/runtime/socket-fetch.js.map +1 -0
  200. package/dist/runtime/socket-http.d.ts +1 -0
  201. package/dist/runtime/socket-http.js +142 -0
  202. package/dist/runtime/socket-http.js.map +1 -0
  203. package/dist/runtime/socket-utils.d.ts +2 -0
  204. package/dist/runtime/socket-utils.js +34 -0
  205. package/dist/runtime/socket-utils.js.map +1 -0
  206. package/dist/service/{EdgeNodeHeartbeatService.d.ts → EdgeNodeSignalClient.d.ts} +3 -3
  207. package/dist/service/{EdgeNodeHeartbeatService.js → EdgeNodeSignalClient.js} +4 -4
  208. package/dist/service/EdgeNodeSignalClient.js.map +1 -0
  209. package/dist/service/PodMigrationService.d.ts +1 -2
  210. package/dist/service/PodMigrationService.js +1 -2
  211. package/dist/service/PodMigrationService.js.map +1 -1
  212. package/dist/storage/SparqlUpdateResourceStore.js +1 -1
  213. package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
  214. package/dist/storage/accessors/MinioDataAccessor.d.ts +6 -0
  215. package/dist/storage/accessors/MinioDataAccessor.js +10 -0
  216. package/dist/storage/accessors/MinioDataAccessor.js.map +1 -1
  217. package/dist/storage/accessors/MinioDataAccessor.jsonld +4 -0
  218. package/dist/storage/accessors/MixDataAccessor.d.ts +2 -1
  219. package/dist/storage/accessors/MixDataAccessor.js +12 -1
  220. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  221. package/dist/storage/accessors/MixDataAccessor.jsonld +19 -0
  222. package/dist/storage/locking/UrlAwareRedisLocker.d.ts +18 -0
  223. package/dist/storage/locking/UrlAwareRedisLocker.js +60 -0
  224. package/dist/storage/locking/UrlAwareRedisLocker.js.map +1 -0
  225. package/dist/storage/locking/UrlAwareRedisLocker.jsonld +123 -0
  226. package/dist/storage/quota/UsageRepository.d.ts +41 -8
  227. package/dist/storage/quota/UsageRepository.js +252 -50
  228. package/dist/storage/quota/UsageRepository.js.map +1 -1
  229. package/dist/storage/sparql/ComunicaQuintEngine.d.ts +9 -0
  230. package/dist/storage/sparql/ComunicaQuintEngine.js +50 -9
  231. package/dist/storage/sparql/ComunicaQuintEngine.js.map +1 -1
  232. package/dist/storage/sparql/QueryOptimizer.js +13 -1
  233. package/dist/storage/sparql/QueryOptimizer.js.map +1 -1
  234. package/dist/storage/sparql/QuintQuerySource.d.ts +14 -0
  235. package/dist/storage/sparql/QuintQuerySource.js +152 -1
  236. package/dist/storage/sparql/QuintQuerySource.js.map +1 -1
  237. package/dist/storage/sparql/SubgraphQueryEngine.d.ts +1 -0
  238. package/dist/storage/sparql/SubgraphQueryEngine.js +6 -2
  239. package/dist/storage/sparql/SubgraphQueryEngine.js.map +1 -1
  240. package/dist/storage/sparql/SubgraphQueryEngine.jsonld +4 -0
  241. package/dist/subdomain/SubdomainClient.d.ts +3 -3
  242. package/dist/subdomain/SubdomainClient.js +1 -1
  243. package/dist/subdomain/SubdomainClient.js.map +1 -1
  244. package/dist/subdomain/SubdomainService.d.ts +15 -16
  245. package/dist/subdomain/SubdomainService.js +80 -54
  246. package/dist/subdomain/SubdomainService.js.map +1 -1
  247. package/dist/subdomain/SubdomainService.jsonld +22 -26
  248. package/dist/supervisor/Supervisor.d.ts +7 -2
  249. package/dist/supervisor/Supervisor.js +33 -1
  250. package/dist/supervisor/Supervisor.js.map +1 -1
  251. package/dist/test-utils/index.d.ts +4 -0
  252. package/dist/test-utils/index.js +8 -0
  253. package/dist/test-utils/index.js.map +1 -0
  254. package/dist/test-utils/no-auth-xpod.d.ts +11 -0
  255. package/dist/test-utils/no-auth-xpod.js +25 -0
  256. package/dist/test-utils/no-auth-xpod.js.map +1 -0
  257. package/dist/test-utils/seed-pod.d.ts +5 -0
  258. package/dist/test-utils/seed-pod.js +61 -0
  259. package/dist/test-utils/seed-pod.js.map +1 -0
  260. package/package.json +23 -5
  261. package/templates/identity/account/create-pod.html.ejs +110 -0
  262. package/templates/main.html.ejs +10 -0
  263. package/dist/api/handlers/DevHandler.d.ts +0 -18
  264. package/dist/api/handlers/DevHandler.js +0 -276
  265. package/dist/api/handlers/DevHandler.js.map +0 -1
  266. package/dist/api/handlers/SignalHandler.d.ts +0 -13
  267. package/dist/api/handlers/SignalHandler.js +0 -122
  268. package/dist/api/handlers/SignalHandler.js.map +0 -1
  269. package/dist/gateway/Proxy.d.ts +0 -24
  270. package/dist/gateway/Proxy.js +0 -209
  271. package/dist/gateway/Proxy.js.map +0 -1
  272. package/dist/gateway/Supervisor.d.ts +0 -2
  273. package/dist/gateway/Supervisor.js +0 -7
  274. package/dist/gateway/Supervisor.js.map +0 -1
  275. package/dist/gateway/port-finder.d.ts +0 -4
  276. package/dist/gateway/port-finder.js +0 -15
  277. package/dist/gateway/port-finder.js.map +0 -1
  278. package/dist/gateway/types.d.ts +0 -1
  279. package/dist/gateway/types.js +0 -3
  280. package/dist/gateway/types.js.map +0 -1
  281. package/dist/http/SignalInterceptHttpHandler.d.ts +0 -24
  282. package/dist/http/SignalInterceptHttpHandler.js +0 -47
  283. package/dist/http/SignalInterceptHttpHandler.js.map +0 -1
  284. package/dist/http/SignalInterceptHttpHandler.jsonld +0 -103
  285. package/dist/http/admin/EdgeNodeSignalHttpHandler.d.ts +0 -71
  286. package/dist/http/admin/EdgeNodeSignalHttpHandler.js +0 -674
  287. package/dist/http/admin/EdgeNodeSignalHttpHandler.js.map +0 -1
  288. package/dist/http/admin/EdgeNodeSignalHttpHandler.jsonld +0 -406
  289. package/dist/http/cluster/PodMigrationHttpHandler.jsonld +0 -169
  290. package/dist/quota/DefaultQuotaService.d.ts +0 -16
  291. package/dist/quota/DefaultQuotaService.js +0 -37
  292. package/dist/quota/DefaultQuotaService.js.map +0 -1
  293. package/dist/quota/DefaultQuotaService.jsonld +0 -85
  294. package/dist/service/EdgeNodeHeartbeatService.js.map +0 -1
  295. package/dist/service/PodMigrationService.jsonld +0 -76
  296. package/dist/storage/MigratableDataAccessor.d.ts +0 -63
  297. package/dist/storage/MigratableDataAccessor.js +0 -11
  298. package/dist/storage/MigratableDataAccessor.js.map +0 -1
  299. package/dist/storage/MigratableDataAccessor.jsonld +0 -60
  300. package/dist/storage/accessors/TieredMinioDataAccessor.d.ts +0 -150
  301. package/dist/storage/accessors/TieredMinioDataAccessor.js +0 -582
  302. package/dist/storage/accessors/TieredMinioDataAccessor.js.map +0 -1
  303. package/dist/storage/accessors/TieredMinioDataAccessor.jsonld +0 -333
  304. package/static/app/assets/index.css +0 -1
  305. package/static/app/assets/main.js +0 -11
@@ -1,169 +0,0 @@
1
- {
2
- "@context": [
3
- "https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld",
4
- "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld"
5
- ],
6
- "@id": "npmd:@undefineds.co/xpod",
7
- "components": [
8
- {
9
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler",
10
- "@type": "Class",
11
- "requireElement": "PodMigrationHttpHandler",
12
- "extends": [
13
- "css:dist/server/HttpHandler.jsonld#HttpHandler"
14
- ],
15
- "comment": "HTTP Handler for Pod migration operations. Migration is now instant - it only updates the nodeId in the database. Binary files are read via cross-region fallback (TieredMinioDataAccessor). Endpoints: - POST /.cluster/pods/{podId}/migrate - Migrate pod to target node (instant) - GET /.cluster/pods/{podId} - Get pod info - GET /.cluster/pods - List all pods with node info",
16
- "parameters": [
17
- {
18
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler_options_identityDbUrl",
19
- "range": "xsd:string"
20
- },
21
- {
22
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler_options_currentNodeId",
23
- "range": "xsd:string"
24
- },
25
- {
26
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler_options_basePath",
27
- "range": {
28
- "@type": "ParameterRangeUnion",
29
- "parameterRangeElements": [
30
- "xsd:string",
31
- {
32
- "@type": "ParameterRangeUndefined"
33
- }
34
- ]
35
- }
36
- },
37
- {
38
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler_options_enabled",
39
- "range": {
40
- "@type": "ParameterRangeUnion",
41
- "parameterRangeElements": [
42
- "xsd:boolean",
43
- "xsd:string",
44
- {
45
- "@type": "ParameterRangeUndefined"
46
- }
47
- ]
48
- }
49
- }
50
- ],
51
- "memberFields": [
52
- {
53
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_logger",
54
- "memberFieldName": "logger",
55
- "range": {
56
- "@type": "ParameterRangeWildcard"
57
- }
58
- },
59
- {
60
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_podLookupRepository",
61
- "memberFieldName": "podLookupRepository"
62
- },
63
- {
64
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_edgeNodeRepository",
65
- "memberFieldName": "edgeNodeRepository"
66
- },
67
- {
68
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_migrationService",
69
- "memberFieldName": "migrationService"
70
- },
71
- {
72
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_basePath",
73
- "memberFieldName": "basePath"
74
- },
75
- {
76
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_basePathWithSlash",
77
- "memberFieldName": "basePathWithSlash"
78
- },
79
- {
80
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_enabled",
81
- "memberFieldName": "enabled"
82
- },
83
- {
84
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_constructor",
85
- "memberFieldName": "constructor"
86
- },
87
- {
88
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_canHandle",
89
- "memberFieldName": "canHandle"
90
- },
91
- {
92
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_handle",
93
- "memberFieldName": "handle"
94
- },
95
- {
96
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_handleListPods",
97
- "memberFieldName": "handleListPods"
98
- },
99
- {
100
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_handleGetPod",
101
- "memberFieldName": "handleGetPod"
102
- },
103
- {
104
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_handleMigrate",
105
- "memberFieldName": "handleMigrate"
106
- },
107
- {
108
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_matchesPath",
109
- "memberFieldName": "matchesPath"
110
- },
111
- {
112
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_getRelativePath",
113
- "memberFieldName": "getRelativePath"
114
- },
115
- {
116
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_normalizeBasePath",
117
- "memberFieldName": "normalizeBasePath"
118
- },
119
- {
120
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_parseUrl",
121
- "memberFieldName": "parseUrl"
122
- },
123
- {
124
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_parseJsonBody",
125
- "memberFieldName": "parseJsonBody"
126
- },
127
- {
128
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_sendJson",
129
- "memberFieldName": "sendJson"
130
- },
131
- {
132
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler__member_normalizeBoolean",
133
- "memberFieldName": "normalizeBoolean"
134
- }
135
- ],
136
- "constructorArguments": [
137
- {
138
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler_options__constructorArgument",
139
- "fields": [
140
- {
141
- "keyRaw": "identityDbUrl",
142
- "value": {
143
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler_options_identityDbUrl"
144
- }
145
- },
146
- {
147
- "keyRaw": "currentNodeId",
148
- "value": {
149
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler_options_currentNodeId"
150
- }
151
- },
152
- {
153
- "keyRaw": "basePath",
154
- "value": {
155
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler_options_basePath"
156
- }
157
- },
158
- {
159
- "keyRaw": "enabled",
160
- "value": {
161
- "@id": "undefineds:dist/http/cluster/PodMigrationHttpHandler.jsonld#PodMigrationHttpHandler_options_enabled"
162
- }
163
- }
164
- ]
165
- }
166
- ]
167
- }
168
- ]
169
- }
@@ -1,16 +0,0 @@
1
- import type { QuotaService } from './QuotaService';
2
- interface DefaultQuotaServiceOptions {
3
- defaultAccountQuotaBytes?: number | null;
4
- }
5
- export declare class DefaultQuotaService implements QuotaService {
6
- static readonly DEFAULT_ACCOUNT_QUOTA_BYTES: number;
7
- private readonly defaultQuota;
8
- private readonly accountLimits;
9
- private readonly podLimits;
10
- constructor(options?: DefaultQuotaServiceOptions);
11
- getAccountLimit(accountId: string): Promise<number | null | undefined>;
12
- getPodLimit(podId: string): Promise<number | null | undefined>;
13
- setAccountLimit(accountId: string, limit: number | null): Promise<void>;
14
- setPodLimit(podId: string, limit: number | null): Promise<void>;
15
- }
16
- export {};
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DefaultQuotaService = void 0;
4
- class DefaultQuotaService {
5
- constructor(options = {}) {
6
- this.accountLimits = new Map();
7
- this.podLimits = new Map();
8
- const fallback = options.defaultAccountQuotaBytes ?? DefaultQuotaService.DEFAULT_ACCOUNT_QUOTA_BYTES;
9
- this.defaultQuota = fallback == null ? null : Math.max(0, Math.trunc(fallback));
10
- }
11
- async getAccountLimit(accountId) {
12
- if (this.accountLimits.has(accountId)) {
13
- return this.accountLimits.get(accountId);
14
- }
15
- return this.defaultQuota;
16
- }
17
- async getPodLimit(podId) {
18
- return this.podLimits.get(podId) ?? null;
19
- }
20
- async setAccountLimit(accountId, limit) {
21
- if (limit == null) {
22
- this.accountLimits.delete(accountId);
23
- return;
24
- }
25
- this.accountLimits.set(accountId, Math.max(0, Math.trunc(limit)));
26
- }
27
- async setPodLimit(podId, limit) {
28
- if (limit == null) {
29
- this.podLimits.delete(podId);
30
- return;
31
- }
32
- this.podLimits.set(podId, Math.max(0, Math.trunc(limit)));
33
- }
34
- }
35
- exports.DefaultQuotaService = DefaultQuotaService;
36
- DefaultQuotaService.DEFAULT_ACCOUNT_QUOTA_BYTES = 10 * 1024 * 1024 * 1024;
37
- //# sourceMappingURL=DefaultQuotaService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DefaultQuotaService.js","sourceRoot":"","sources":["../../src/quota/DefaultQuotaService.ts"],"names":[],"mappings":";;;AAMA,MAAa,mBAAmB;IAO9B,YAAmB,UAAsC,EAAE;QAH1C,kBAAa,GAAG,IAAI,GAAG,EAAyB,CAAC;QACjD,cAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;QAG5D,MAAM,QAAQ,GAAG,OAAO,CAAC,wBAAwB,IAAI,mBAAmB,CAAC,2BAA2B,CAAC;QACrG,IAAI,CAAC,YAAY,GAAG,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClF,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,SAAiB;QAC5C,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAa;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC3C,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,KAAoB;QAClE,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,KAAoB;QAC1D,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;;AArCH,kDAsCC;AArCwB,+CAA2B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,AAA1B,CAA2B","sourcesContent":["import type { QuotaService } from './QuotaService';\n\ninterface DefaultQuotaServiceOptions {\n defaultAccountQuotaBytes?: number | null;\n}\n\nexport class DefaultQuotaService implements QuotaService {\n public static readonly DEFAULT_ACCOUNT_QUOTA_BYTES = 10 * 1024 * 1024 * 1024;\n\n private readonly defaultQuota: number | null;\n private readonly accountLimits = new Map<string, number | null>();\n private readonly podLimits = new Map<string, number | null>();\n\n public constructor(options: DefaultQuotaServiceOptions = {}) {\n const fallback = options.defaultAccountQuotaBytes ?? DefaultQuotaService.DEFAULT_ACCOUNT_QUOTA_BYTES;\n this.defaultQuota = fallback == null ? null : Math.max(0, Math.trunc(fallback));\n }\n\n public async getAccountLimit(accountId: string): Promise<number | null | undefined> {\n if (this.accountLimits.has(accountId)) {\n return this.accountLimits.get(accountId)!;\n }\n return this.defaultQuota;\n }\n\n public async getPodLimit(podId: string): Promise<number | null | undefined> {\n return this.podLimits.get(podId) ?? null;\n }\n\n public async setAccountLimit(accountId: string, limit: number | null): Promise<void> {\n if (limit == null) {\n this.accountLimits.delete(accountId);\n return;\n }\n this.accountLimits.set(accountId, Math.max(0, Math.trunc(limit)));\n }\n\n public async setPodLimit(podId: string, limit: number | null): Promise<void> {\n if (limit == null) {\n this.podLimits.delete(podId);\n return;\n }\n this.podLimits.set(podId, Math.max(0, Math.trunc(limit)));\n }\n}\n"]}
@@ -1,85 +0,0 @@
1
- {
2
- "@context": [
3
- "https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld"
4
- ],
5
- "@id": "npmd:@undefineds.co/xpod",
6
- "components": [
7
- {
8
- "@id": "undefineds:dist/quota/DefaultQuotaService.jsonld#DefaultQuotaService",
9
- "@type": "Class",
10
- "requireElement": "DefaultQuotaService",
11
- "extends": [
12
- "undefineds:dist/quota/QuotaService.jsonld#QuotaService"
13
- ],
14
- "parameters": [
15
- {
16
- "@id": "undefineds:dist/quota/DefaultQuotaService.jsonld#DefaultQuotaService_options_defaultAccountQuotaBytes",
17
- "range": {
18
- "@type": "ParameterRangeUnion",
19
- "parameterRangeElements": [
20
- "xsd:number",
21
- {
22
- "@type": "ParameterRangeWildcard"
23
- },
24
- {
25
- "@type": "ParameterRangeUndefined"
26
- }
27
- ]
28
- }
29
- }
30
- ],
31
- "memberFields": [
32
- {
33
- "@id": "undefineds:dist/quota/DefaultQuotaService.jsonld#DefaultQuotaService__member_DEFAULT_ACCOUNT_QUOTA_BYTES",
34
- "memberFieldName": "DEFAULT_ACCOUNT_QUOTA_BYTES",
35
- "range": "xsd:number"
36
- },
37
- {
38
- "@id": "undefineds:dist/quota/DefaultQuotaService.jsonld#DefaultQuotaService__member_defaultQuota",
39
- "memberFieldName": "defaultQuota"
40
- },
41
- {
42
- "@id": "undefineds:dist/quota/DefaultQuotaService.jsonld#DefaultQuotaService__member_accountLimits",
43
- "memberFieldName": "accountLimits"
44
- },
45
- {
46
- "@id": "undefineds:dist/quota/DefaultQuotaService.jsonld#DefaultQuotaService__member_podLimits",
47
- "memberFieldName": "podLimits"
48
- },
49
- {
50
- "@id": "undefineds:dist/quota/DefaultQuotaService.jsonld#DefaultQuotaService__member_constructor",
51
- "memberFieldName": "constructor"
52
- },
53
- {
54
- "@id": "undefineds:dist/quota/DefaultQuotaService.jsonld#DefaultQuotaService__member_getAccountLimit",
55
- "memberFieldName": "getAccountLimit"
56
- },
57
- {
58
- "@id": "undefineds:dist/quota/DefaultQuotaService.jsonld#DefaultQuotaService__member_getPodLimit",
59
- "memberFieldName": "getPodLimit"
60
- },
61
- {
62
- "@id": "undefineds:dist/quota/DefaultQuotaService.jsonld#DefaultQuotaService__member_setAccountLimit",
63
- "memberFieldName": "setAccountLimit"
64
- },
65
- {
66
- "@id": "undefineds:dist/quota/DefaultQuotaService.jsonld#DefaultQuotaService__member_setPodLimit",
67
- "memberFieldName": "setPodLimit"
68
- }
69
- ],
70
- "constructorArguments": [
71
- {
72
- "@id": "undefineds:dist/quota/DefaultQuotaService.jsonld#DefaultQuotaService_options__constructorArgument",
73
- "fields": [
74
- {
75
- "keyRaw": "defaultAccountQuotaBytes",
76
- "value": {
77
- "@id": "undefineds:dist/quota/DefaultQuotaService.jsonld#DefaultQuotaService_options_defaultAccountQuotaBytes"
78
- }
79
- }
80
- ]
81
- }
82
- ]
83
- }
84
- ]
85
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"EdgeNodeHeartbeatService.js","sourceRoot":"","sources":["../../src/service/EdgeNodeHeartbeatService.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\n\nexport interface EdgeNodeHeartbeatServiceOptions {\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 EdgeNodeHeartbeatService {\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: EdgeNodeHeartbeatServiceOptions) {\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"]}
@@ -1,76 +0,0 @@
1
- {
2
- "@context": [
3
- "https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld"
4
- ],
5
- "@id": "npmd:@undefineds.co/xpod",
6
- "components": [
7
- {
8
- "@id": "undefineds:dist/service/PodMigrationService.jsonld#PodMigrationService",
9
- "@type": "Class",
10
- "requireElement": "PodMigrationService",
11
- "comment": "Service for managing Pod migrations between Center nodes. Simplified migration process: 1. Validate pod and target node exist 2. Update nodeId to target node (atomic update) Data does NOT need to be copied upfront: - Metadata is in shared PostgreSQL (Quadstore), already accessible from all nodes - Binary files use cross-region fallback read (TieredMinioDataAccessor) - Files are lazily copied on first access if configured This provides instant, user-transparent migration.",
12
- "parameters": [
13
- {
14
- "@id": "undefineds:dist/service/PodMigrationService.jsonld#PodMigrationService_config_identityDbUrl",
15
- "range": "xsd:string"
16
- },
17
- {
18
- "@id": "undefineds:dist/service/PodMigrationService.jsonld#PodMigrationService_config_currentNodeId",
19
- "range": "xsd:string"
20
- }
21
- ],
22
- "memberFields": [
23
- {
24
- "@id": "undefineds:dist/service/PodMigrationService.jsonld#PodMigrationService__member_logger",
25
- "memberFieldName": "logger",
26
- "range": {
27
- "@type": "ParameterRangeWildcard"
28
- }
29
- },
30
- {
31
- "@id": "undefineds:dist/service/PodMigrationService.jsonld#PodMigrationService__member_podLookupRepository",
32
- "memberFieldName": "podLookupRepository"
33
- },
34
- {
35
- "@id": "undefineds:dist/service/PodMigrationService.jsonld#PodMigrationService__member_edgeNodeRepository",
36
- "memberFieldName": "edgeNodeRepository"
37
- },
38
- {
39
- "@id": "undefineds:dist/service/PodMigrationService.jsonld#PodMigrationService__member_currentNodeId",
40
- "memberFieldName": "currentNodeId"
41
- },
42
- {
43
- "@id": "undefineds:dist/service/PodMigrationService.jsonld#PodMigrationService__member_constructor",
44
- "memberFieldName": "constructor"
45
- },
46
- {
47
- "@id": "undefineds:dist/service/PodMigrationService.jsonld#PodMigrationService__member_migratePod",
48
- "memberFieldName": "migratePod"
49
- },
50
- {
51
- "@id": "undefineds:dist/service/PodMigrationService.jsonld#PodMigrationService__member_getPodNode",
52
- "memberFieldName": "getPodNode"
53
- }
54
- ],
55
- "constructorArguments": [
56
- {
57
- "@id": "undefineds:dist/service/PodMigrationService.jsonld#PodMigrationService_config__constructorArgument",
58
- "fields": [
59
- {
60
- "keyRaw": "identityDbUrl",
61
- "value": {
62
- "@id": "undefineds:dist/service/PodMigrationService.jsonld#PodMigrationService_config_identityDbUrl"
63
- }
64
- },
65
- {
66
- "keyRaw": "currentNodeId",
67
- "value": {
68
- "@id": "undefineds:dist/service/PodMigrationService.jsonld#PodMigrationService_config_currentNodeId"
69
- }
70
- }
71
- ]
72
- }
73
- ]
74
- }
75
- ]
76
- }
@@ -1,63 +0,0 @@
1
- import type { DataAccessor } from '@solid/community-server';
2
- /**
3
- * Progress information for data migration.
4
- */
5
- export interface MigrationProgress {
6
- /** Number of objects copied */
7
- copied: number;
8
- /** Total number of objects to copy */
9
- total: number;
10
- /** Bytes transferred so far */
11
- bytesTransferred: number;
12
- }
13
- /**
14
- * Extended DataAccessor interface for storage backends that support
15
- * cross-region operations.
16
- *
17
- * Primary use: Cross-region fallback reads for instant pod migration.
18
- * - Reads check local bucket first, then fallback to other region buckets
19
- * - Lazy copy: files are copied to local bucket on first access
20
- *
21
- * Optional: Bulk migration for cleanup/cost optimization.
22
- * - Not required for migration to work (fallback handles it)
23
- * - Can be used to proactively move cold data and reduce cross-region costs
24
- */
25
- export interface MigratableDataAccessor extends DataAccessor {
26
- /**
27
- * Check if this accessor supports cross-region operations.
28
- */
29
- supportsMigration(): boolean;
30
- /**
31
- * Bulk migrate all resources under the given prefix to a target region.
32
- *
33
- * This is OPTIONAL - migration works without it via fallback reads.
34
- * Use this for:
35
- * - Cleaning up source region to save storage costs
36
- * - Proactively copying cold data to reduce latency
37
- *
38
- * @param prefix - Resource path prefix (e.g., "/alice/")
39
- * @param targetRegion - Target region identifier
40
- * @param onProgress - Optional progress callback
41
- * @throws Error if migration is not supported
42
- */
43
- migrateToRegion(prefix: string, targetRegion: string, onProgress?: (progress: MigrationProgress) => void): Promise<void>;
44
- /**
45
- * Set up real-time synchronization during active migration.
46
- * New writes to the source region will be replicated to the target.
47
- *
48
- * @param prefix - Resource path prefix
49
- * @param targetRegion - Target region identifier
50
- */
51
- setupRealtimeSync(prefix: string, targetRegion: string): Promise<void>;
52
- /**
53
- * Stop real-time synchronization after migration completes.
54
- *
55
- * @param prefix - Resource path prefix
56
- * @param targetRegion - Target region identifier
57
- */
58
- stopRealtimeSync(prefix: string, targetRegion: string): Promise<void>;
59
- }
60
- /**
61
- * Type guard to check if a DataAccessor supports cross-region operations.
62
- */
63
- export declare function isMigratableAccessor(accessor: DataAccessor): accessor is MigratableDataAccessor;
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isMigratableAccessor = isMigratableAccessor;
4
- /**
5
- * Type guard to check if a DataAccessor supports cross-region operations.
6
- */
7
- function isMigratableAccessor(accessor) {
8
- return (typeof accessor.supportsMigration === 'function' &&
9
- accessor.supportsMigration());
10
- }
11
- //# sourceMappingURL=MigratableDataAccessor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MigratableDataAccessor.js","sourceRoot":"","sources":["../../src/storage/MigratableDataAccessor.ts"],"names":[],"mappings":";;AAwEA,oDAKC;AARD;;GAEG;AACH,SAAgB,oBAAoB,CAAC,QAAsB;IACzD,OAAO,CACL,OAAQ,QAAmC,CAAC,iBAAiB,KAAK,UAAU;QAC3E,QAAmC,CAAC,iBAAiB,EAAE,CACzD,CAAC;AACJ,CAAC","sourcesContent":["import type { DataAccessor } from '@solid/community-server';\n\n/**\n * Progress information for data migration.\n */\nexport interface MigrationProgress {\n /** Number of objects copied */\n copied: number;\n /** Total number of objects to copy */\n total: number;\n /** Bytes transferred so far */\n bytesTransferred: number;\n}\n\n/**\n * Extended DataAccessor interface for storage backends that support\n * cross-region operations.\n * \n * Primary use: Cross-region fallback reads for instant pod migration.\n * - Reads check local bucket first, then fallback to other region buckets\n * - Lazy copy: files are copied to local bucket on first access\n * \n * Optional: Bulk migration for cleanup/cost optimization.\n * - Not required for migration to work (fallback handles it)\n * - Can be used to proactively move cold data and reduce cross-region costs\n */\nexport interface MigratableDataAccessor extends DataAccessor {\n /**\n * Check if this accessor supports cross-region operations.\n */\n supportsMigration(): boolean;\n\n /**\n * Bulk migrate all resources under the given prefix to a target region.\n * \n * This is OPTIONAL - migration works without it via fallback reads.\n * Use this for:\n * - Cleaning up source region to save storage costs\n * - Proactively copying cold data to reduce latency\n * \n * @param prefix - Resource path prefix (e.g., \"/alice/\")\n * @param targetRegion - Target region identifier\n * @param onProgress - Optional progress callback\n * @throws Error if migration is not supported\n */\n migrateToRegion(\n prefix: string,\n targetRegion: string,\n onProgress?: (progress: MigrationProgress) => void,\n ): Promise<void>;\n\n /**\n * Set up real-time synchronization during active migration.\n * New writes to the source region will be replicated to the target.\n * \n * @param prefix - Resource path prefix\n * @param targetRegion - Target region identifier\n */\n setupRealtimeSync(prefix: string, targetRegion: string): Promise<void>;\n\n /**\n * Stop real-time synchronization after migration completes.\n * \n * @param prefix - Resource path prefix\n * @param targetRegion - Target region identifier\n */\n stopRealtimeSync(prefix: string, targetRegion: string): Promise<void>;\n}\n\n/**\n * Type guard to check if a DataAccessor supports cross-region operations.\n */\nexport function isMigratableAccessor(accessor: DataAccessor): accessor is MigratableDataAccessor {\n return (\n typeof (accessor as MigratableDataAccessor).supportsMigration === 'function' &&\n (accessor as MigratableDataAccessor).supportsMigration()\n );\n}\n"]}
@@ -1,60 +0,0 @@
1
- {
2
- "@context": [
3
- "https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld",
4
- "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld"
5
- ],
6
- "@id": "npmd:@undefineds.co/xpod",
7
- "components": [
8
- {
9
- "@id": "undefineds:dist/storage/MigratableDataAccessor.jsonld#MigratableDataAccessor",
10
- "@type": "AbstractClass",
11
- "requireElement": "MigratableDataAccessor",
12
- "extends": [
13
- "css:dist/storage/accessors/DataAccessor.jsonld#DataAccessor"
14
- ],
15
- "comment": "Extended DataAccessor interface for storage backends that support cross-region operations. Primary use: Cross-region fallback reads for instant pod migration. - Reads check local bucket first, then fallback to other region buckets - Lazy copy: files are copied to local bucket on first access Optional: Bulk migration for cleanup/cost optimization. - Not required for migration to work (fallback handles it) - Can be used to proactively move cold data and reduce cross-region costs",
16
- "parameters": [],
17
- "memberFields": [
18
- {
19
- "@id": "undefineds:dist/storage/MigratableDataAccessor.jsonld#MigratableDataAccessor__member_supportsMigration",
20
- "memberFieldName": "supportsMigration"
21
- },
22
- {
23
- "@id": "undefineds:dist/storage/MigratableDataAccessor.jsonld#MigratableDataAccessor__member_migrateToRegion",
24
- "memberFieldName": "migrateToRegion"
25
- },
26
- {
27
- "@id": "undefineds:dist/storage/MigratableDataAccessor.jsonld#MigratableDataAccessor__member_setupRealtimeSync",
28
- "memberFieldName": "setupRealtimeSync"
29
- },
30
- {
31
- "@id": "undefineds:dist/storage/MigratableDataAccessor.jsonld#MigratableDataAccessor__member_stopRealtimeSync",
32
- "memberFieldName": "stopRealtimeSync"
33
- }
34
- ],
35
- "constructorArguments": []
36
- },
37
- {
38
- "@id": "undefineds:dist/storage/MigratableDataAccessor.jsonld#MigrationProgress",
39
- "@type": "AbstractClass",
40
- "requireElement": "MigrationProgress",
41
- "comment": "Progress information for data migration.",
42
- "parameters": [],
43
- "memberFields": [
44
- {
45
- "@id": "undefineds:dist/storage/MigratableDataAccessor.jsonld#MigrationProgress__member_copied",
46
- "memberFieldName": "copied"
47
- },
48
- {
49
- "@id": "undefineds:dist/storage/MigratableDataAccessor.jsonld#MigrationProgress__member_total",
50
- "memberFieldName": "total"
51
- },
52
- {
53
- "@id": "undefineds:dist/storage/MigratableDataAccessor.jsonld#MigrationProgress__member_bytesTransferred",
54
- "memberFieldName": "bytesTransferred"
55
- }
56
- ],
57
- "constructorArguments": []
58
- }
59
- ]
60
- }