@undefineds.co/xpod 0.3.29 → 0.3.32

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 (167) hide show
  1. package/dist/api/auth/AuthContext.d.ts +3 -2
  2. package/dist/api/auth/AuthContext.js +2 -1
  3. package/dist/api/auth/AuthContext.js.map +1 -1
  4. package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +2 -12
  5. package/dist/api/auth/ClientCredentialsAuthenticator.js +4 -4
  6. package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
  7. package/dist/api/auth/ServiceTokenAuthenticator.d.ts +2 -2
  8. package/dist/api/auth/ServiceTokenAuthenticator.js.map +1 -1
  9. package/dist/api/container/business-token.d.ts +1 -1
  10. package/dist/api/container/business-token.js +5 -1
  11. package/dist/api/container/business-token.js.map +1 -1
  12. package/dist/api/container/common.js +14 -10
  13. package/dist/api/container/common.js.map +1 -1
  14. package/dist/api/container/routes.js +16 -3
  15. package/dist/api/container/routes.js.map +1 -1
  16. package/dist/api/container/types.d.ts +2 -4
  17. package/dist/api/container/types.js.map +1 -1
  18. package/dist/api/handlers/ChatHandler.d.ts +1 -1
  19. package/dist/api/handlers/ChatHandler.js +1 -1
  20. package/dist/api/handlers/ChatHandler.js.map +1 -1
  21. package/dist/api/handlers/EdgeNodeSignalHandler.js +3 -1
  22. package/dist/api/handlers/EdgeNodeSignalHandler.js.map +1 -1
  23. package/dist/api/handlers/PodManagementHandler.d.ts +2 -0
  24. package/dist/api/handlers/PodManagementHandler.js +114 -12
  25. package/dist/api/handlers/PodManagementHandler.js.map +1 -1
  26. package/dist/api/handlers/ProvisionHandler.d.ts +27 -0
  27. package/dist/api/handlers/ProvisionHandler.js +339 -32
  28. package/dist/api/handlers/ProvisionHandler.js.map +1 -1
  29. package/dist/api/handlers/QuotaHandler.js +0 -12
  30. package/dist/api/handlers/QuotaHandler.js.map +1 -1
  31. package/dist/api/handlers/index.d.ts +0 -1
  32. package/dist/api/handlers/index.js +0 -1
  33. package/dist/api/handlers/index.js.map +1 -1
  34. package/dist/api/runtime.js +3 -3
  35. package/dist/api/runtime.js.map +1 -1
  36. package/dist/authorization/PodAuthorizationResources.d.ts +1 -0
  37. package/dist/authorization/PodAuthorizationResources.js +36 -4
  38. package/dist/authorization/PodAuthorizationResources.js.map +1 -1
  39. package/dist/components/context.jsonld +12 -0
  40. package/dist/edge/EdgeNodeAgent.d.ts +1 -1
  41. package/dist/edge/EdgeNodeAgent.js +1 -1
  42. package/dist/edge/EdgeNodeAgent.js.map +1 -1
  43. package/dist/edge/EdgeNodeDnsCoordinator.d.ts +1 -0
  44. package/dist/edge/EdgeNodeDnsCoordinator.js +9 -3
  45. package/dist/edge/EdgeNodeDnsCoordinator.js.map +1 -1
  46. package/dist/edge/EdgeNodeDnsCoordinator.jsonld +4 -0
  47. package/dist/edge/EdgeNodeHealthProbeService.d.ts +3 -0
  48. package/dist/edge/EdgeNodeHealthProbeService.js +22 -2
  49. package/dist/edge/EdgeNodeHealthProbeService.js.map +1 -1
  50. package/dist/edge/EdgeNodeHealthProbeService.jsonld +12 -0
  51. package/dist/http/ClusterIngressRouter.js +6 -3
  52. package/dist/http/ClusterIngressRouter.js.map +1 -1
  53. package/dist/http/ClusterWebSocketConfigurator.js +6 -2
  54. package/dist/http/ClusterWebSocketConfigurator.js.map +1 -1
  55. package/dist/http/EdgeNodeDirectDebugHttpHandler.d.ts +2 -0
  56. package/dist/http/EdgeNodeDirectDebugHttpHandler.js +18 -3
  57. package/dist/http/EdgeNodeDirectDebugHttpHandler.js.map +1 -1
  58. package/dist/http/EdgeNodeDirectDebugHttpHandler.jsonld +8 -0
  59. package/dist/http/EdgeNodeProxyHttpHandler.js +6 -2
  60. package/dist/http/EdgeNodeProxyHttpHandler.js.map +1 -1
  61. package/dist/http/cluster/PodMigrationHttpHandler.d.ts +2 -2
  62. package/dist/http/cluster/PodMigrationHttpHandler.js +2 -2
  63. package/dist/http/cluster/PodMigrationHttpHandler.js.map +1 -1
  64. package/dist/http/quota/QuotaAdminHttpHandler.js +27 -21
  65. package/dist/http/quota/QuotaAdminHttpHandler.js.map +1 -1
  66. package/dist/identity/drizzle/AccountRepository.d.ts +4 -22
  67. package/dist/identity/drizzle/AccountRepository.js +9 -113
  68. package/dist/identity/drizzle/AccountRepository.js.map +1 -1
  69. package/dist/identity/drizzle/AccountRoleRepository.d.ts +5 -5
  70. package/dist/identity/drizzle/AccountRoleRepository.js +204 -97
  71. package/dist/identity/drizzle/AccountRoleRepository.js.map +1 -1
  72. package/dist/identity/drizzle/DdnsRepository.d.ts +5 -20
  73. package/dist/identity/drizzle/DdnsRepository.js +13 -49
  74. package/dist/identity/drizzle/DdnsRepository.js.map +1 -1
  75. package/dist/identity/drizzle/EdgeNodeRepository.d.ts +13 -6
  76. package/dist/identity/drizzle/EdgeNodeRepository.js +167 -66
  77. package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -1
  78. package/dist/identity/drizzle/PodLookupRepository.d.ts +7 -36
  79. package/dist/identity/drizzle/PodLookupRepository.js +103 -126
  80. package/dist/identity/drizzle/PodLookupRepository.js.map +1 -1
  81. package/dist/identity/drizzle/ServiceTokenRepository.d.ts +13 -1
  82. package/dist/identity/drizzle/ServiceTokenRepository.js +7 -0
  83. package/dist/identity/drizzle/ServiceTokenRepository.js.map +1 -1
  84. package/dist/identity/drizzle/db.d.ts +2 -1
  85. package/dist/identity/drizzle/db.js +173 -297
  86. package/dist/identity/drizzle/db.js.map +1 -1
  87. package/dist/identity/drizzle/schema.pg.d.ts +3 -11
  88. package/dist/identity/drizzle/schema.pg.js +10 -45
  89. package/dist/identity/drizzle/schema.pg.js.map +1 -1
  90. package/dist/identity/drizzle/schema.sqlite.d.ts +88 -531
  91. package/dist/identity/drizzle/schema.sqlite.js +13 -46
  92. package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
  93. package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +3 -0
  94. package/dist/identity/oidc/ScopedPickWebIdHandler.js +18 -6
  95. package/dist/identity/oidc/ScopedPickWebIdHandler.js.map +1 -1
  96. package/dist/identity/oidc/ScopedPickWebIdHandler.jsonld +22 -0
  97. package/dist/provision/LocalPodProvisioningService.js +2 -0
  98. package/dist/provision/LocalPodProvisioningService.js.map +1 -1
  99. package/dist/provision/ProvisionCodeCodec.js +10 -1
  100. package/dist/provision/ProvisionCodeCodec.js.map +1 -1
  101. package/dist/provision/ProvisionPodCreator.d.ts +8 -2
  102. package/dist/provision/ProvisionPodCreator.js +136 -27
  103. package/dist/provision/ProvisionPodCreator.js.map +1 -1
  104. package/dist/provision/ProvisionPodCreator.jsonld +38 -3
  105. package/dist/quota/DrizzleQuotaService.d.ts +0 -4
  106. package/dist/quota/DrizzleQuotaService.js +1 -21
  107. package/dist/quota/DrizzleQuotaService.js.map +1 -1
  108. package/dist/quota/DrizzleQuotaService.jsonld +0 -16
  109. package/dist/quota/NoopQuotaService.d.ts +0 -4
  110. package/dist/quota/NoopQuotaService.js +0 -8
  111. package/dist/quota/NoopQuotaService.js.map +1 -1
  112. package/dist/quota/NoopQuotaService.jsonld +0 -16
  113. package/dist/quota/QuotaService.d.ts +0 -4
  114. package/dist/quota/QuotaService.js.map +1 -1
  115. package/dist/quota/QuotaService.jsonld +0 -16
  116. package/dist/service/EdgeNodeSignalClient.d.ts +0 -2
  117. package/dist/service/EdgeNodeSignalClient.js +0 -4
  118. package/dist/service/EdgeNodeSignalClient.js.map +1 -1
  119. package/dist/service/PodMigrationService.d.ts +2 -2
  120. package/dist/service/PodMigrationService.js +4 -4
  121. package/dist/service/PodMigrationService.js.map +1 -1
  122. package/dist/setup/LocalSetupServiceTokenRepository.d.ts +22 -0
  123. package/dist/setup/LocalSetupServiceTokenRepository.js +68 -0
  124. package/dist/setup/LocalSetupServiceTokenRepository.js.map +1 -0
  125. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  126. package/dist/storage/quota/PerAccountQuotaStrategy.js +2 -2
  127. package/dist/storage/quota/PerAccountQuotaStrategy.js.map +1 -1
  128. package/dist/storage/quota/UsageRepository.d.ts +10 -32
  129. package/dist/storage/quota/UsageRepository.js +84 -281
  130. package/dist/storage/quota/UsageRepository.js.map +1 -1
  131. package/dist/storage/rdf/PostgresRdfEngine.d.ts +12 -15
  132. package/dist/storage/rdf/PostgresRdfEngine.js +1040 -150
  133. package/dist/storage/rdf/PostgresRdfEngine.js.map +1 -1
  134. package/dist/storage/rdf/PostgresRdfEngine.jsonld +40 -52
  135. package/dist/storage/rdf/{RdfLocalQueryEngine.d.ts → RdfQueryExecutor.d.ts} +3 -3
  136. package/dist/storage/rdf/{RdfLocalQueryEngine.js → RdfQueryExecutor.js} +9 -9
  137. package/dist/storage/rdf/RdfQueryExecutor.js.map +1 -0
  138. package/dist/storage/rdf/RdfSparqlAdapter.d.ts +5 -5
  139. package/dist/storage/rdf/RdfSparqlAdapter.js +27 -27
  140. package/dist/storage/rdf/RdfSparqlAdapter.js.map +1 -1
  141. package/dist/storage/rdf/SolidRdfEngine.d.ts +2 -5
  142. package/dist/storage/rdf/SolidRdfEngine.js +6 -38
  143. package/dist/storage/rdf/SolidRdfEngine.js.map +1 -1
  144. package/dist/storage/rdf/SolidRdfEngine.jsonld +0 -12
  145. package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -1
  146. package/dist/storage/rdf/index.d.ts +3 -3
  147. package/dist/storage/rdf/index.js +6 -6
  148. package/dist/storage/rdf/index.js.map +1 -1
  149. package/dist/storage/rdf/models-benchmark.d.ts +9 -9
  150. package/dist/storage/rdf/models-benchmark.js +23 -23
  151. package/dist/storage/rdf/models-benchmark.js.map +1 -1
  152. package/dist/storage/rdf/types.d.ts +5 -5
  153. package/dist/storage/rdf/types.js.map +1 -1
  154. package/dist/subdomain/SubdomainService.d.ts +1 -1
  155. package/dist/subdomain/SubdomainService.js +1 -1
  156. package/dist/subdomain/SubdomainService.js.map +1 -1
  157. package/dist/subdomain/SubdomainService.jsonld +1 -1
  158. package/package.json +1 -1
  159. package/templates/pod/acp/profile/.acr +21 -0
  160. package/templates/pod/wac/profile/.acl.hbs +18 -0
  161. package/dist/api/handlers/ApiKeyHandler.d.ts +0 -15
  162. package/dist/api/handlers/ApiKeyHandler.js +0 -153
  163. package/dist/api/handlers/ApiKeyHandler.js.map +0 -1
  164. package/dist/api/store/DrizzleClientCredentialsStore.d.ts +0 -51
  165. package/dist/api/store/DrizzleClientCredentialsStore.js +0 -115
  166. package/dist/api/store/DrizzleClientCredentialsStore.js.map +0 -1
  167. package/dist/storage/rdf/RdfLocalQueryEngine.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PodAuthorizationResources.js","sourceRoot":"","sources":["../../src/authorization/PodAuthorizationResources.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataFactory } from 'n3';\nimport type { Quad } from '@rdfjs/types';\nimport type { AuthMode } from './AuthMode';\nimport { normalizeAuthMode } from './AuthMode';\n\nconst RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';\nconst FOAF = 'http://xmlns.com/foaf/0.1/';\nconst ACL = 'http://www.w3.org/ns/auth/acl#';\nconst ACP = 'http://www.w3.org/ns/solid/acp#';\n\nconst { blankNode, namedNode, quad } = DataFactory;\n\nexport type PodAuthorizationResourceKind = 'acp' | 'acl';\n\nexport interface PodAuthorizationResourceInput {\n authMode: AuthMode | string | undefined;\n podUrl: string;\n cardUrl: string;\n webId: string;\n stableId: (input: string) => string;\n iri: (base: string, relative: string) => string;\n}\n\nexport interface PodAuthorizationResourceOutput {\n kind: PodAuthorizationResourceKind;\n rootResourceUrl: string;\n cardResourceUrl: string;\n quads: Quad[];\n}\n\nfunction resourceKindForAuthMode(authMode: AuthMode): PodAuthorizationResourceKind {\n return authMode === 'acl' ? 'acl' : 'acp';\n}\n\nexport function buildPodAuthorizationResources(input: PodAuthorizationResourceInput): PodAuthorizationResourceOutput {\n const authMode = normalizeAuthMode(input.authMode);\n const kind = resourceKindForAuthMode(authMode);\n const rootResourceUrl = input.iri(input.podUrl, kind === 'acl' ? '.acl' : '.acr');\n const cardResourceUrl = input.iri(input.podUrl, kind === 'acl' ? 'profile/card.acl' : 'profile/card.acr');\n const quads = kind === 'acl'\n ? buildWebAclQuads(input, rootResourceUrl, cardResourceUrl)\n : buildAcpQuads(input, rootResourceUrl, cardResourceUrl);\n\n return {\n kind,\n rootResourceUrl,\n cardResourceUrl,\n quads,\n };\n}\n\nfunction buildAcpQuads(input: PodAuthorizationResourceInput, rootAcrUrl: string, cardAcrUrl: string): Quad[] {\n const rootGraph = namedNode(rootAcrUrl);\n const cardGraph = namedNode(cardAcrUrl);\n const root = namedNode(`${rootAcrUrl}#root`);\n const rootPublicRead = namedNode(`${rootAcrUrl}#publicReadAccess`);\n const rootFullOwner = namedNode(`${rootAcrUrl}#fullOwnerAccess`);\n const rootPublicPolicy = blankNode(`public-policy-${input.stableId(rootAcrUrl)}`);\n const rootPublicMatcher = blankNode(`public-matcher-${input.stableId(rootAcrUrl)}`);\n const rootOwnerPolicy = blankNode(`owner-policy-${input.stableId(rootAcrUrl)}`);\n const rootOwnerMatcher = blankNode(`owner-matcher-${input.stableId(rootAcrUrl)}`);\n const card = namedNode(`${cardAcrUrl}#card`);\n const cardPublicRead = namedNode(`${cardAcrUrl}#publicReadAccess`);\n const cardPolicy = blankNode(`card-policy-${input.stableId(cardAcrUrl)}`);\n const cardMatcher = blankNode(`card-matcher-${input.stableId(cardAcrUrl)}`);\n\n return [\n quad(root, namedNode(`${RDF}type`), namedNode(`${ACP}AccessControlResource`), rootGraph),\n quad(root, namedNode(`${ACP}resource`), namedNode(input.podUrl), rootGraph),\n quad(root, namedNode(`${ACP}accessControl`), rootPublicRead, rootGraph),\n quad(root, namedNode(`${ACP}accessControl`), rootFullOwner, rootGraph),\n quad(root, namedNode(`${ACP}memberAccessControl`), rootFullOwner, rootGraph),\n quad(rootPublicRead, namedNode(`${RDF}type`), namedNode(`${ACP}AccessControl`), rootGraph),\n quad(rootPublicRead, namedNode(`${ACP}apply`), rootPublicPolicy, rootGraph),\n quad(rootPublicPolicy, namedNode(`${RDF}type`), namedNode(`${ACP}Policy`), rootGraph),\n quad(rootPublicPolicy, namedNode(`${ACP}allow`), namedNode(`${ACL}Read`), rootGraph),\n quad(rootPublicPolicy, namedNode(`${ACP}anyOf`), rootPublicMatcher, rootGraph),\n quad(rootPublicMatcher, namedNode(`${RDF}type`), namedNode(`${ACP}Matcher`), rootGraph),\n quad(rootPublicMatcher, namedNode(`${ACP}agent`), namedNode(`${ACP}PublicAgent`), rootGraph),\n quad(rootFullOwner, namedNode(`${RDF}type`), namedNode(`${ACP}AccessControl`), rootGraph),\n quad(rootFullOwner, namedNode(`${ACP}apply`), rootOwnerPolicy, rootGraph),\n quad(rootOwnerPolicy, namedNode(`${RDF}type`), namedNode(`${ACP}Policy`), rootGraph),\n quad(rootOwnerPolicy, namedNode(`${ACP}allow`), namedNode(`${ACL}Read`), rootGraph),\n quad(rootOwnerPolicy, namedNode(`${ACP}allow`), namedNode(`${ACL}Write`), rootGraph),\n quad(rootOwnerPolicy, namedNode(`${ACP}allow`), namedNode(`${ACL}Control`), rootGraph),\n quad(rootOwnerPolicy, namedNode(`${ACP}anyOf`), rootOwnerMatcher, rootGraph),\n quad(rootOwnerMatcher, namedNode(`${RDF}type`), namedNode(`${ACP}Matcher`), rootGraph),\n quad(rootOwnerMatcher, namedNode(`${ACP}agent`), namedNode(input.webId), rootGraph),\n\n quad(card, namedNode(`${RDF}type`), namedNode(`${ACP}AccessControlResource`), cardGraph),\n quad(card, namedNode(`${ACP}resource`), namedNode(input.cardUrl), cardGraph),\n quad(card, namedNode(`${ACP}accessControl`), cardPublicRead, cardGraph),\n quad(cardPublicRead, namedNode(`${RDF}type`), namedNode(`${ACP}AccessControl`), cardGraph),\n quad(cardPublicRead, namedNode(`${ACP}apply`), cardPolicy, cardGraph),\n quad(cardPolicy, namedNode(`${RDF}type`), namedNode(`${ACP}Policy`), cardGraph),\n quad(cardPolicy, namedNode(`${ACP}allow`), namedNode(`${ACL}Read`), cardGraph),\n quad(cardPolicy, namedNode(`${ACP}anyOf`), cardMatcher, cardGraph),\n quad(cardMatcher, namedNode(`${RDF}type`), namedNode(`${ACP}Matcher`), cardGraph),\n quad(cardMatcher, namedNode(`${ACP}agent`), namedNode(`${ACP}PublicAgent`), cardGraph),\n ];\n}\n\nfunction buildWebAclQuads(input: PodAuthorizationResourceInput, rootAclUrl: string, cardAclUrl: string): Quad[] {\n const rootGraph = namedNode(rootAclUrl);\n const cardGraph = namedNode(cardAclUrl);\n const rootPublic = namedNode(`${rootAclUrl}#public`);\n const rootOwner = namedNode(`${rootAclUrl}#owner`);\n const cardPublic = namedNode(`${cardAclUrl}#public`);\n const cardOwner = namedNode(`${cardAclUrl}#owner`);\n\n return [\n quad(rootPublic, namedNode(`${RDF}type`), namedNode(`${ACL}Authorization`), rootGraph),\n quad(rootPublic, namedNode(`${ACL}agentClass`), namedNode(`${FOAF}Agent`), rootGraph),\n quad(rootPublic, namedNode(`${ACL}accessTo`), namedNode(input.podUrl), rootGraph),\n quad(rootPublic, namedNode(`${ACL}mode`), namedNode(`${ACL}Read`), rootGraph),\n quad(rootOwner, namedNode(`${RDF}type`), namedNode(`${ACL}Authorization`), rootGraph),\n quad(rootOwner, namedNode(`${ACL}agent`), namedNode(input.webId), rootGraph),\n quad(rootOwner, namedNode(`${ACL}accessTo`), namedNode(input.podUrl), rootGraph),\n quad(rootOwner, namedNode(`${ACL}default`), namedNode(input.podUrl), rootGraph),\n quad(rootOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Read`), rootGraph),\n quad(rootOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Write`), rootGraph),\n quad(rootOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Control`), rootGraph),\n\n quad(cardPublic, namedNode(`${RDF}type`), namedNode(`${ACL}Authorization`), cardGraph),\n quad(cardPublic, namedNode(`${ACL}agentClass`), namedNode(`${FOAF}Agent`), cardGraph),\n quad(cardPublic, namedNode(`${ACL}accessTo`), namedNode(input.cardUrl), cardGraph),\n quad(cardPublic, namedNode(`${ACL}mode`), namedNode(`${ACL}Read`), cardGraph),\n quad(cardOwner, namedNode(`${RDF}type`), namedNode(`${ACL}Authorization`), cardGraph),\n quad(cardOwner, namedNode(`${ACL}agent`), namedNode(input.webId), cardGraph),\n quad(cardOwner, namedNode(`${ACL}accessTo`), namedNode(input.cardUrl), cardGraph),\n quad(cardOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Read`), cardGraph),\n quad(cardOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Write`), cardGraph),\n quad(cardOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Control`), cardGraph),\n ];\n}\n"]}
1
+ {"version":3,"file":"PodAuthorizationResources.js","sourceRoot":"","sources":["../../src/authorization/PodAuthorizationResources.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataFactory } from 'n3';\nimport type { Quad } from '@rdfjs/types';\nimport type { AuthMode } from './AuthMode';\nimport { normalizeAuthMode } from './AuthMode';\n\nconst RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';\nconst FOAF = 'http://xmlns.com/foaf/0.1/';\nconst ACL = 'http://www.w3.org/ns/auth/acl#';\nconst ACP = 'http://www.w3.org/ns/solid/acp#';\n\nconst { blankNode, namedNode, quad } = DataFactory;\n\nexport type PodAuthorizationResourceKind = 'acp' | 'acl';\n\nexport interface PodAuthorizationResourceInput {\n authMode: AuthMode | string | undefined;\n podUrl: string;\n cardUrl: string;\n webId: string;\n stableId: (input: string) => string;\n iri: (base: string, relative: string) => string;\n}\n\nexport interface PodAuthorizationResourceOutput {\n kind: PodAuthorizationResourceKind;\n rootResourceUrl: string;\n profileResourceUrl: string;\n cardResourceUrl: string;\n quads: Quad[];\n}\n\nfunction resourceKindForAuthMode(authMode: AuthMode): PodAuthorizationResourceKind {\n return authMode === 'acl' ? 'acl' : 'acp';\n}\n\nexport function buildPodAuthorizationResources(input: PodAuthorizationResourceInput): PodAuthorizationResourceOutput {\n const authMode = normalizeAuthMode(input.authMode);\n const kind = resourceKindForAuthMode(authMode);\n const rootResourceUrl = input.iri(input.podUrl, kind === 'acl' ? '.acl' : '.acr');\n const profileResourceUrl = input.iri(input.podUrl, kind === 'acl' ? 'profile/.acl' : 'profile/.acr');\n const cardResourceUrl = input.iri(input.podUrl, kind === 'acl' ? 'profile/card.acl' : 'profile/card.acr');\n const quads = kind === 'acl'\n ? buildWebAclQuads(input, rootResourceUrl, profileResourceUrl, cardResourceUrl)\n : buildAcpQuads(input, rootResourceUrl, profileResourceUrl, cardResourceUrl);\n\n return {\n kind,\n rootResourceUrl,\n profileResourceUrl,\n cardResourceUrl,\n quads,\n };\n}\n\nfunction buildAcpQuads(\n input: PodAuthorizationResourceInput,\n rootAcrUrl: string,\n profileAcrUrl: string,\n cardAcrUrl: string,\n): Quad[] {\n const rootGraph = namedNode(rootAcrUrl);\n const profileGraph = namedNode(profileAcrUrl);\n const cardGraph = namedNode(cardAcrUrl);\n const root = namedNode(`${rootAcrUrl}#root`);\n const rootPublicRead = namedNode(`${rootAcrUrl}#publicReadAccess`);\n const rootFullOwner = namedNode(`${rootAcrUrl}#fullOwnerAccess`);\n const rootPublicPolicy = blankNode(`public-policy-${input.stableId(rootAcrUrl)}`);\n const rootPublicMatcher = blankNode(`public-matcher-${input.stableId(rootAcrUrl)}`);\n const rootOwnerPolicy = blankNode(`owner-policy-${input.stableId(rootAcrUrl)}`);\n const rootOwnerMatcher = blankNode(`owner-matcher-${input.stableId(rootAcrUrl)}`);\n const profile = namedNode(`${profileAcrUrl}#profile`);\n const profilePublicRead = namedNode(`${profileAcrUrl}#publicReadAccess`);\n const profilePolicy = blankNode(`profile-policy-${input.stableId(profileAcrUrl)}`);\n const profileMatcher = blankNode(`profile-matcher-${input.stableId(profileAcrUrl)}`);\n const card = namedNode(`${cardAcrUrl}#card`);\n const cardPublicRead = namedNode(`${cardAcrUrl}#publicReadAccess`);\n const cardPolicy = blankNode(`card-policy-${input.stableId(cardAcrUrl)}`);\n const cardMatcher = blankNode(`card-matcher-${input.stableId(cardAcrUrl)}`);\n const profileUrl = input.iri(input.podUrl, 'profile/');\n\n return [\n quad(root, namedNode(`${RDF}type`), namedNode(`${ACP}AccessControlResource`), rootGraph),\n quad(root, namedNode(`${ACP}resource`), namedNode(input.podUrl), rootGraph),\n quad(root, namedNode(`${ACP}accessControl`), rootPublicRead, rootGraph),\n quad(root, namedNode(`${ACP}accessControl`), rootFullOwner, rootGraph),\n quad(root, namedNode(`${ACP}memberAccessControl`), rootFullOwner, rootGraph),\n quad(rootPublicRead, namedNode(`${RDF}type`), namedNode(`${ACP}AccessControl`), rootGraph),\n quad(rootPublicRead, namedNode(`${ACP}apply`), rootPublicPolicy, rootGraph),\n quad(rootPublicPolicy, namedNode(`${RDF}type`), namedNode(`${ACP}Policy`), rootGraph),\n quad(rootPublicPolicy, namedNode(`${ACP}allow`), namedNode(`${ACL}Read`), rootGraph),\n quad(rootPublicPolicy, namedNode(`${ACP}anyOf`), rootPublicMatcher, rootGraph),\n quad(rootPublicMatcher, namedNode(`${RDF}type`), namedNode(`${ACP}Matcher`), rootGraph),\n quad(rootPublicMatcher, namedNode(`${ACP}agent`), namedNode(`${ACP}PublicAgent`), rootGraph),\n quad(rootFullOwner, namedNode(`${RDF}type`), namedNode(`${ACP}AccessControl`), rootGraph),\n quad(rootFullOwner, namedNode(`${ACP}apply`), rootOwnerPolicy, rootGraph),\n quad(rootOwnerPolicy, namedNode(`${RDF}type`), namedNode(`${ACP}Policy`), rootGraph),\n quad(rootOwnerPolicy, namedNode(`${ACP}allow`), namedNode(`${ACL}Read`), rootGraph),\n quad(rootOwnerPolicy, namedNode(`${ACP}allow`), namedNode(`${ACL}Write`), rootGraph),\n quad(rootOwnerPolicy, namedNode(`${ACP}allow`), namedNode(`${ACL}Control`), rootGraph),\n quad(rootOwnerPolicy, namedNode(`${ACP}anyOf`), rootOwnerMatcher, rootGraph),\n quad(rootOwnerMatcher, namedNode(`${RDF}type`), namedNode(`${ACP}Matcher`), rootGraph),\n quad(rootOwnerMatcher, namedNode(`${ACP}agent`), namedNode(input.webId), rootGraph),\n\n quad(profile, namedNode(`${RDF}type`), namedNode(`${ACP}AccessControlResource`), profileGraph),\n quad(profile, namedNode(`${ACP}resource`), namedNode(profileUrl), profileGraph),\n quad(profile, namedNode(`${ACP}accessControl`), profilePublicRead, profileGraph),\n quad(profilePublicRead, namedNode(`${RDF}type`), namedNode(`${ACP}AccessControl`), profileGraph),\n quad(profilePublicRead, namedNode(`${ACP}apply`), profilePolicy, profileGraph),\n quad(profilePolicy, namedNode(`${RDF}type`), namedNode(`${ACP}Policy`), profileGraph),\n quad(profilePolicy, namedNode(`${ACP}allow`), namedNode(`${ACL}Read`), profileGraph),\n quad(profilePolicy, namedNode(`${ACP}anyOf`), profileMatcher, profileGraph),\n quad(profileMatcher, namedNode(`${RDF}type`), namedNode(`${ACP}Matcher`), profileGraph),\n quad(profileMatcher, namedNode(`${ACP}agent`), namedNode(`${ACP}PublicAgent`), profileGraph),\n\n quad(card, namedNode(`${RDF}type`), namedNode(`${ACP}AccessControlResource`), cardGraph),\n quad(card, namedNode(`${ACP}resource`), namedNode(input.cardUrl), cardGraph),\n quad(card, namedNode(`${ACP}accessControl`), cardPublicRead, cardGraph),\n quad(cardPublicRead, namedNode(`${RDF}type`), namedNode(`${ACP}AccessControl`), cardGraph),\n quad(cardPublicRead, namedNode(`${ACP}apply`), cardPolicy, cardGraph),\n quad(cardPolicy, namedNode(`${RDF}type`), namedNode(`${ACP}Policy`), cardGraph),\n quad(cardPolicy, namedNode(`${ACP}allow`), namedNode(`${ACL}Read`), cardGraph),\n quad(cardPolicy, namedNode(`${ACP}anyOf`), cardMatcher, cardGraph),\n quad(cardMatcher, namedNode(`${RDF}type`), namedNode(`${ACP}Matcher`), cardGraph),\n quad(cardMatcher, namedNode(`${ACP}agent`), namedNode(`${ACP}PublicAgent`), cardGraph),\n ];\n}\n\nfunction buildWebAclQuads(\n input: PodAuthorizationResourceInput,\n rootAclUrl: string,\n profileAclUrl: string,\n cardAclUrl: string,\n): Quad[] {\n const rootGraph = namedNode(rootAclUrl);\n const profileGraph = namedNode(profileAclUrl);\n const cardGraph = namedNode(cardAclUrl);\n const rootPublic = namedNode(`${rootAclUrl}#public`);\n const rootOwner = namedNode(`${rootAclUrl}#owner`);\n const profilePublic = namedNode(`${profileAclUrl}#public`);\n const profileOwner = namedNode(`${profileAclUrl}#owner`);\n const cardPublic = namedNode(`${cardAclUrl}#public`);\n const cardOwner = namedNode(`${cardAclUrl}#owner`);\n const profileUrl = input.iri(input.podUrl, 'profile/');\n\n return [\n quad(rootPublic, namedNode(`${RDF}type`), namedNode(`${ACL}Authorization`), rootGraph),\n quad(rootPublic, namedNode(`${ACL}agentClass`), namedNode(`${FOAF}Agent`), rootGraph),\n quad(rootPublic, namedNode(`${ACL}accessTo`), namedNode(input.podUrl), rootGraph),\n quad(rootPublic, namedNode(`${ACL}mode`), namedNode(`${ACL}Read`), rootGraph),\n quad(rootOwner, namedNode(`${RDF}type`), namedNode(`${ACL}Authorization`), rootGraph),\n quad(rootOwner, namedNode(`${ACL}agent`), namedNode(input.webId), rootGraph),\n quad(rootOwner, namedNode(`${ACL}accessTo`), namedNode(input.podUrl), rootGraph),\n quad(rootOwner, namedNode(`${ACL}default`), namedNode(input.podUrl), rootGraph),\n quad(rootOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Read`), rootGraph),\n quad(rootOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Write`), rootGraph),\n quad(rootOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Control`), rootGraph),\n\n quad(profilePublic, namedNode(`${RDF}type`), namedNode(`${ACL}Authorization`), profileGraph),\n quad(profilePublic, namedNode(`${ACL}agentClass`), namedNode(`${FOAF}Agent`), profileGraph),\n quad(profilePublic, namedNode(`${ACL}accessTo`), namedNode(profileUrl), profileGraph),\n quad(profilePublic, namedNode(`${ACL}mode`), namedNode(`${ACL}Read`), profileGraph),\n quad(profileOwner, namedNode(`${RDF}type`), namedNode(`${ACL}Authorization`), profileGraph),\n quad(profileOwner, namedNode(`${ACL}agent`), namedNode(input.webId), profileGraph),\n quad(profileOwner, namedNode(`${ACL}accessTo`), namedNode(profileUrl), profileGraph),\n quad(profileOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Read`), profileGraph),\n quad(profileOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Write`), profileGraph),\n quad(profileOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Control`), profileGraph),\n\n quad(cardPublic, namedNode(`${RDF}type`), namedNode(`${ACL}Authorization`), cardGraph),\n quad(cardPublic, namedNode(`${ACL}agentClass`), namedNode(`${FOAF}Agent`), cardGraph),\n quad(cardPublic, namedNode(`${ACL}accessTo`), namedNode(input.cardUrl), cardGraph),\n quad(cardPublic, namedNode(`${ACL}mode`), namedNode(`${ACL}Read`), cardGraph),\n quad(cardOwner, namedNode(`${RDF}type`), namedNode(`${ACL}Authorization`), cardGraph),\n quad(cardOwner, namedNode(`${ACL}agent`), namedNode(input.webId), cardGraph),\n quad(cardOwner, namedNode(`${ACL}accessTo`), namedNode(input.cardUrl), cardGraph),\n quad(cardOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Read`), cardGraph),\n quad(cardOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Write`), cardGraph),\n quad(cardOwner, namedNode(`${ACL}mode`), namedNode(`${ACL}Control`), cardGraph),\n ];\n}\n"]}
@@ -2270,6 +2270,9 @@
2270
2270
  "options_identityDbUrl": {
2271
2271
  "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_identityDbUrl"
2272
2272
  },
2273
+ "options_provisionBaseUrl": {
2274
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_provisionBaseUrl"
2275
+ },
2273
2276
  "options_podLookupRepository": {
2274
2277
  "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_podLookupRepository"
2275
2278
  },
@@ -2285,6 +2288,9 @@
2285
2288
  "identityDbUrl": {
2286
2289
  "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_identityDbUrl"
2287
2290
  },
2291
+ "provisionBaseUrl": {
2292
+ "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_provisionBaseUrl"
2293
+ },
2288
2294
  "podLookupRepository": {
2289
2295
  "@id": "undefineds:dist/identity/oidc/ScopedPickWebIdHandler.jsonld#ScopedPickWebIdHandler_options_podLookupRepository"
2290
2296
  },
@@ -2336,6 +2342,9 @@
2336
2342
  "args_provisionBaseUrl": {
2337
2343
  "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_provisionBaseUrl"
2338
2344
  },
2345
+ "args_nodeId": {
2346
+ "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_nodeId"
2347
+ },
2339
2348
  "args_identityDbUrl": {
2340
2349
  "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_identityDbUrl"
2341
2350
  },
@@ -2357,6 +2366,9 @@
2357
2366
  "provisionBaseUrl": {
2358
2367
  "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_provisionBaseUrl"
2359
2368
  },
2369
+ "nodeId": {
2370
+ "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_nodeId"
2371
+ },
2360
2372
  "identityDbUrl": {
2361
2373
  "@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator_args_identityDbUrl"
2362
2374
  },
@@ -3,7 +3,7 @@ export interface EdgeNodeAgentOptions {
3
3
  nodeId: string;
4
4
  nodeToken: string;
5
5
  baseUrl?: string;
6
- publicAddress?: string;
6
+ directCandidates?: string | string[];
7
7
  pods?: string[];
8
8
  includeSystemMetrics?: boolean;
9
9
  enableNetworkDetection?: boolean;
@@ -61,7 +61,7 @@ class EdgeNodeAgent {
61
61
  nodeId: options.nodeId,
62
62
  nodeToken: options.nodeToken,
63
63
  baseUrl: options.baseUrl,
64
- publicAddress: options.publicAddress,
64
+ directCandidates: options.directCandidates,
65
65
  pods: options.pods,
66
66
  intervalMs: options.intervalMs,
67
67
  metadata: this.stringifyIfContent(metadataPayload),
@@ -1 +1 @@
1
- {"version":3,"file":"EdgeNodeAgent.js","sourceRoot":"","sources":["../../src/edge/EdgeNodeAgent.ts"],"names":[],"mappings":";;;;;;AAAA,sDAAyB;AACzB,2DAA2C;AAC3C,iEAAqD;AAErD,0EAAuE;AACvE,iEAAsF;AACtF,0EAAuE;AACvE,gFAA6E;AAC7E,6EAAmG;AAoCnG,MAAa,aAAa;IAA1B;QACmB,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAMrC,yBAAoB,GAAG,CAAC,CAAC;QAChB,+BAA0B,GAAG,MAAM,CAAC,CAAC,YAAY;IA4NpE,CAAC;IA1NQ,KAAK,CAAC,KAAK,CAAC,OAA6B;QAC9C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC;YAC1C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,uCAAkB,CAAC;gBACvC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;gBAClC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;gBAClC,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;gBAC9C,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;gBAChC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;aACrC,CAAC,CAAC;QACL,CAAC;QAED,WAAW;QACX,IAAI,OAAO,CAAC,sBAAsB,KAAK,KAAK,EAAE,CAAC;YAC7C,IAAI,CAAC,eAAe,GAAG,IAAI,uDAA0B,CAAC;gBACpD,gBAAgB,EAAE;oBAChB,sBAAsB,EAAE,IAAI;iBAC7B;aACF,CAAC,CAAC;YACH,WAAW;YACX,IAAI,CAAC,iBAAiB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,sBAAsB,EAAE,CAAC;YAC7E,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,iBAAiB,CAAC,UAAU,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,UAAU,IAAI,CAAC,iBAAiB,CAAC,UAAU,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,mBAAmB,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC;QACnP,CAAC;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7F,MAAM,eAAe,GAAG;YACtB,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;YAC3B,MAAM,EAAE,aAAa;SACK,CAAC;QAE7B,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,CAAC;QAC1E,MAAM,gBAAgB,GAAgC;YACpD,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC;YAClD,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;YAClE,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;YAChF,mBAAmB,EAAE,CAAC,IAAa,EAAQ,EAAE;gBAC3C,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;gBACnC,OAAO,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;YACD,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS;SAChF,CAAC;QACF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,gBAAgB,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,2CAAoB,CAAC,gBAAgB,CAAC,CAAC;IAC9D,CAAC;IAEM,IAAI;QACT,IAAI,IAAI,CAAC,SAAS,IAAI,OAAQ,IAAI,CAAC,SAAiB,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAC3E,IAAI,CAAC,SAAiB,CAAC,OAAO,EAAE,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,KAAK,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC;IAEO,kBAAkB,CAAC,IAA6B;QACtD,MAAM,SAAS,GAA4B,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAE,GAAG,EAAE,KAAK,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACzB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,CAAC;IAEO,oBAAoB;QAC1B,MAAM,IAAI,GAAG,iBAAE,CAAC,OAAO,EAAE,CAAC;QAC1B,OAAO;YACL,QAAQ,EAAE,iBAAE,CAAC,QAAQ,EAAE;YACvB,QAAQ,EAAE,iBAAE,CAAC,QAAQ,EAAE;YACvB,IAAI,EAAE,iBAAE,CAAC,IAAI,EAAE;YACf,MAAM,EAAE,iBAAE,CAAC,MAAM,EAAE;YACnB,QAAQ,EAAE,iBAAE,CAAC,IAAI,EAAE,CAAC,MAAM;YAC1B,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;YACd,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YACf,QAAQ,EAAE,iBAAE,CAAC,QAAQ,EAAE;YACvB,OAAO,EAAE,iBAAE,CAAC,OAAO,EAAE;SACtB,CAAC;IACJ,CAAC;IAEO,uBAAuB,CAAC,IAAa;QAC3C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,IAA2B,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAA2C,CAAC;QAClE,IAAI,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAyC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,EAAE,MAAyC,CAAC;QACjE,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACnH,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,MAAM,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC7E,OAAO,MAAM,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,KAAK,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,MAAa,EAAE,MAAM,EAAE,MAA4B,EAAE,UAAU,CAAC,CAAC;IACrG,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,OAA6B;QACjE,MAAM,WAAW,GAAG,OAAO,CAAC,IAAK,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnF,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,+CAAsB,CAAC;YACzC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,KAAK,EAAE,WAAW,CAAC,KAAM;YACzB,OAAO,EAAE,WAAW,CAAC,OAAQ;YAC7B,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,cAAc,EAAE,WAAW,CAAC,cAAe;YAC3C,kBAAkB,EAAE,WAAW,CAAC,kBAAkB;YAClD,eAAe,EAAE,WAAW,CAAC,eAAe;YAC5C,aAAa,EAAE,WAAW,CAAC,aAAa;YACxC,eAAe,EAAE,WAAW,CAAC,eAAe;YAC5C,kBAAkB,EAAE,WAAW,CAAC,kBAAkB;SACnD,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACjD,IAAI,MAAM,IAAI,WAAW,CAAC,iBAAiB,IAAI,WAAW,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxF,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAa,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,wBAAwB,CAAC,OAA6B;QAClE,MAAM,WAAW,GAAG,OAAO,CAAC,IAAK,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,kBAAkB,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,qDAAyB,CAAC;YAC5C,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,kBAAkB,EAAE,WAAW,CAAC,kBAAkB;YAClD,eAAe,EAAE,WAAW,CAAC,eAAe;YAC5C,aAAa,EAAE,WAAW,CAAC,aAAa;YACxC,eAAe,EAAE,WAAW,CAAC,eAAe;YAC5C,sBAAsB,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,iBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;SAC7H,CAAC,CAAC;QACH,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;QAClC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,OAAiB;QAC3C,MAAM,CAAE,UAAU,EAAE,GAAG,IAAI,CAAE,GAAG,OAAO,CAAC;QACxC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAG,IAAA,0BAAK,EAAC,UAAU,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,UAAU,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,2BAA2B;QACjC,MAAM,MAAM,GAAkC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;QAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,cAAc;QACd,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;YACnG,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,IAAI,CAAC,iBAAiB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,sBAAsB,EAAE,CAAC;oBAC7E,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC;gBAClC,CAAC;gBAAC,OAAO,KAAc,EAAE,CAAC;oBACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA8B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;QACH,CAAC;QAED,WAAW;QACX,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,IAAI,IAAI,CAAC,iBAAiB,EAAE,IAAI;YACxE,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,IAAI,IAAI,CAAC,iBAAiB,EAAE,IAAI;SACzE,CAAC;IACJ,CAAC;CACF;AApOD,sCAoOC","sourcesContent":["import os from 'node:os';\nimport { spawn } from 'node:child_process';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { EdgeNodeSignalClientOptions } from '../service/EdgeNodeSignalClient';\nimport { EdgeNodeSignalClient } from '../service/EdgeNodeSignalClient';\nimport { FrpcProcessManager, type FrpcRuntimeStatus } from './frp/FrpcProcessManager';\nimport { AcmeCertificateManager } from './acme/AcmeCertificateManager';\nimport { ClusterCertificateManager } from './acme/ClusterCertificateManager';\nimport { EdgeNodeCapabilityDetector, type NetworkAddressInfo } from './EdgeNodeCapabilityDetector';\n\nexport interface EdgeNodeAgentOptions {\n signalEndpoint: string;\n nodeId: string;\n nodeToken: string;\n baseUrl?: string;\n publicAddress?: string;\n pods?: string[];\n includeSystemMetrics?: boolean;\n enableNetworkDetection?: boolean;\n metadata?: Record<string, unknown>;\n intervalMs?: number;\n onHeartbeatResponse?: (data: unknown) => void;\n acme?: {\n mode?: 'local' | 'cluster';\n email?: string;\n domains?: string[];\n directoryUrl?: string;\n accountKeyPath?: string;\n certificateKeyPath: string;\n certificatePath: string;\n fullChainPath?: string;\n renewBeforeDays?: number;\n propagationDelayMs?: number;\n postDeployCommand?: string[];\n };\n frp?: {\n binaryPath: string;\n configPath: string;\n workingDirectory?: string;\n logPrefix?: string;\n autoRestart?: boolean;\n };\n}\n\nexport class EdgeNodeAgent {\n private readonly logger = getLoggerFor(this);\n private heartbeat?: EdgeNodeSignalClient;\n private frpManager?: FrpcProcessManager;\n private clusterCertificate?: ClusterCertificateManager;\n private networkDetector?: EdgeNodeCapabilityDetector;\n private cachedNetworkInfo?: NetworkAddressInfo;\n private lastNetworkDetection = 0;\n private readonly networkDetectionIntervalMs = 60_000; // 每分钟重新检测一次\n\n public async start(options: EdgeNodeAgentOptions): Promise<void> {\n if (options.acme) {\n const mode = options.acme.mode ?? 'local';\n if (mode === 'cluster') {\n await this.ensureClusterCertificate(options);\n } else {\n await this.issueCertificateLocally(options);\n }\n }\n if (options.frp) {\n this.frpManager = new FrpcProcessManager({\n binaryPath: options.frp.binaryPath,\n configPath: options.frp.configPath,\n workingDirectory: options.frp.workingDirectory,\n logPrefix: options.frp.logPrefix,\n autoRestart: options.frp.autoRestart,\n });\n }\n \n // 初始化网络检测器\n if (options.enableNetworkDetection !== false) {\n this.networkDetector = new EdgeNodeCapabilityDetector({\n dynamicDetection: {\n enableNetworkDetection: true,\n },\n });\n // 执行初始网络检测\n this.cachedNetworkInfo = await this.networkDetector.detectNetworkAddresses();\n this.lastNetworkDetection = Date.now();\n this.logger.info(`Network detection: IPv4=${this.cachedNetworkInfo.ipv4Public ?? this.cachedNetworkInfo.ipv4}, IPv6=${this.cachedNetworkInfo.ipv6Public ?? this.cachedNetworkInfo.ipv6}, hasPublicIPv6=${this.cachedNetworkInfo.hasPublicIPv6}`);\n }\n \n const systemMetrics = options.includeSystemMetrics ? this.collectSystemMetrics() : undefined;\n const metadataPayload = {\n ...(options.metadata ?? {}),\n system: systemMetrics,\n } as Record<string, unknown>;\n\n const certificatePayload = this.clusterCertificate?.getHeartbeatPayload();\n const heartbeatOptions: EdgeNodeSignalClientOptions = {\n edgeNodesEnabled: true,\n signalEndpoint: options.signalEndpoint,\n nodeId: options.nodeId,\n nodeToken: options.nodeToken,\n baseUrl: options.baseUrl,\n publicAddress: options.publicAddress,\n pods: options.pods,\n intervalMs: options.intervalMs,\n metadata: this.stringifyIfContent(metadataPayload),\n metrics: systemMetrics ? JSON.stringify(systemMetrics) : undefined,\n certificate: certificatePayload ? JSON.stringify(certificatePayload) : undefined,\n onHeartbeatResponse: (data: unknown): void => {\n this.handleHeartbeatResponse(data);\n options.onHeartbeatResponse?.(data);\n },\n networkSupplier: this.networkDetector ? () => this.getNetworkInfo() : undefined,\n };\n if (this.frpManager) {\n heartbeatOptions.tunnelSupplier = () => this.buildTunnelHeartbeatPayload();\n }\n\n this.heartbeat = new EdgeNodeSignalClient(heartbeatOptions);\n }\n\n public stop(): void {\n if (this.heartbeat && typeof (this.heartbeat as any).dispose === 'function') {\n (this.heartbeat as any).dispose();\n }\n this.heartbeat = undefined;\n void this.frpManager?.stop();\n this.clusterCertificate?.stop();\n }\n\n private stringifyIfContent(data: Record<string, unknown>): string | undefined {\n const sanitized: Record<string, unknown> = {};\n for (const [ key, value ] of Object.entries(data)) {\n if (value !== undefined) {\n sanitized[key] = value;\n }\n }\n return Object.keys(sanitized).length > 0 ? JSON.stringify(sanitized) : undefined;\n }\n\n private collectSystemMetrics(): Record<string, unknown> {\n const load = os.loadavg();\n return {\n hostname: os.hostname(),\n platform: os.platform(),\n arch: os.arch(),\n uptime: os.uptime(),\n cpuCount: os.cpus().length,\n load1: load[0],\n load5: load[1],\n load15: load[2],\n totalMem: os.totalmem(),\n freeMem: os.freemem(),\n };\n }\n\n private handleHeartbeatResponse(data: unknown): void {\n if (!data || typeof data !== 'object') {\n return;\n }\n const body = data as Record<string, any>;\n const metadata = body.metadata as Record<string, any> | undefined;\n this.clusterCertificate?.handleHeartbeatMetadata(metadata);\n const tunnel = metadata?.tunnel as Record<string, any> | undefined;\n const config = tunnel?.config as Record<string, any> | undefined;\n if (config) {\n this.logger.debug(`接收到隧道配置: ${JSON.stringify({ entrypoint: tunnel?.entrypoint, proxyName: config.proxyName })}`);\n }\n const entrypoint = typeof tunnel?.entrypoint === 'string' ? tunnel.entrypoint :\n typeof config?.publicUrl === 'string' ? config.publicUrl : undefined;\n void this.frpManager?.applyConfig(config as any, tunnel?.status as string | undefined, entrypoint);\n }\n\n private async issueCertificateLocally(options: EdgeNodeAgentOptions): Promise<void> {\n const acmeOptions = options.acme!;\n if (!acmeOptions.email || !acmeOptions.domains || acmeOptions.domains.length === 0) {\n throw new Error('本地 ACME 模式需要提供 email 与 domains。');\n }\n if (!acmeOptions.accountKeyPath) {\n throw new Error('本地 ACME 模式需要提供 accountKeyPath。');\n }\n const manager = new AcmeCertificateManager({\n signalEndpoint: options.signalEndpoint,\n nodeId: options.nodeId,\n nodeToken: options.nodeToken,\n email: acmeOptions.email!,\n domains: acmeOptions.domains!,\n directoryUrl: acmeOptions.directoryUrl,\n accountKeyPath: acmeOptions.accountKeyPath!,\n certificateKeyPath: acmeOptions.certificateKeyPath,\n certificatePath: acmeOptions.certificatePath,\n fullChainPath: acmeOptions.fullChainPath,\n renewBeforeDays: acmeOptions.renewBeforeDays,\n propagationDelayMs: acmeOptions.propagationDelayMs,\n });\n try {\n const issued = await manager.ensureCertificate();\n if (issued && acmeOptions.postDeployCommand && acmeOptions.postDeployCommand.length > 0) {\n await this.runPostDeploy(acmeOptions.postDeployCommand);\n }\n } catch (error: unknown) {\n this.logger.error(`自动签发证书失败:${(error as Error).message}`);\n throw error;\n }\n }\n\n private async ensureClusterCertificate(options: EdgeNodeAgentOptions): Promise<void> {\n const acmeOptions = options.acme!;\n if (!acmeOptions.certificateKeyPath || !acmeOptions.certificatePath) {\n throw new Error('Cluster 模式需要提供 certificateKeyPath 与 certificatePath。');\n }\n const manager = new ClusterCertificateManager({\n signalEndpoint: options.signalEndpoint,\n nodeId: options.nodeId,\n nodeToken: options.nodeToken,\n certificateKeyPath: acmeOptions.certificateKeyPath,\n certificatePath: acmeOptions.certificatePath,\n fullChainPath: acmeOptions.fullChainPath,\n renewBeforeDays: acmeOptions.renewBeforeDays,\n onCertificateInstalled: acmeOptions.postDeployCommand ? () => this.runPostDeploy(acmeOptions.postDeployCommand!) : undefined,\n });\n this.clusterCertificate = manager;\n await manager.start();\n }\n\n private async runPostDeploy(command: string[]): Promise<void> {\n const [ executable, ...args ] = command;\n if (!executable) {\n return;\n }\n await new Promise<void>((resolve, reject) => {\n const child = spawn(executable, args, { stdio: 'inherit' });\n child.on('error', reject);\n child.on('exit', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`命令 ${executable} 退出码 ${code}`));\n }\n });\n });\n }\n\n private buildTunnelHeartbeatPayload(): Record<string, unknown> | undefined {\n const status: FrpcRuntimeStatus | undefined = this.frpManager?.getStatus();\n if (!status) {\n return undefined;\n }\n return { client: status };\n }\n\n /**\n * 获取网络信息(带缓存,每分钟刷新一次)\n */\n private async getNetworkInfo(): Promise<{ ipv4?: string; ipv6?: string }> {\n const now = Date.now();\n \n // 如果缓存过期,重新检测\n if (!this.cachedNetworkInfo || (now - this.lastNetworkDetection) > this.networkDetectionIntervalMs) {\n if (this.networkDetector) {\n try {\n this.cachedNetworkInfo = await this.networkDetector.detectNetworkAddresses();\n this.lastNetworkDetection = now;\n } catch (error: unknown) {\n this.logger.debug(`Network detection failed: ${(error as Error).message}`);\n }\n }\n }\n \n // 优先返回公网地址\n return {\n ipv4: this.cachedNetworkInfo?.ipv4Public ?? this.cachedNetworkInfo?.ipv4,\n ipv6: this.cachedNetworkInfo?.ipv6Public ?? this.cachedNetworkInfo?.ipv6,\n };\n }\n}\n"]}
1
+ {"version":3,"file":"EdgeNodeAgent.js","sourceRoot":"","sources":["../../src/edge/EdgeNodeAgent.ts"],"names":[],"mappings":"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","sourcesContent":["import os from 'node:os';\nimport { spawn } from 'node:child_process';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { EdgeNodeSignalClientOptions } from '../service/EdgeNodeSignalClient';\nimport { EdgeNodeSignalClient } from '../service/EdgeNodeSignalClient';\nimport { FrpcProcessManager, type FrpcRuntimeStatus } from './frp/FrpcProcessManager';\nimport { AcmeCertificateManager } from './acme/AcmeCertificateManager';\nimport { ClusterCertificateManager } from './acme/ClusterCertificateManager';\nimport { EdgeNodeCapabilityDetector, type NetworkAddressInfo } from './EdgeNodeCapabilityDetector';\n\nexport interface EdgeNodeAgentOptions {\n signalEndpoint: string;\n nodeId: string;\n nodeToken: string;\n baseUrl?: string;\n directCandidates?: string | string[];\n pods?: string[];\n includeSystemMetrics?: boolean;\n enableNetworkDetection?: boolean;\n metadata?: Record<string, unknown>;\n intervalMs?: number;\n onHeartbeatResponse?: (data: unknown) => void;\n acme?: {\n mode?: 'local' | 'cluster';\n email?: string;\n domains?: string[];\n directoryUrl?: string;\n accountKeyPath?: string;\n certificateKeyPath: string;\n certificatePath: string;\n fullChainPath?: string;\n renewBeforeDays?: number;\n propagationDelayMs?: number;\n postDeployCommand?: string[];\n };\n frp?: {\n binaryPath: string;\n configPath: string;\n workingDirectory?: string;\n logPrefix?: string;\n autoRestart?: boolean;\n };\n}\n\nexport class EdgeNodeAgent {\n private readonly logger = getLoggerFor(this);\n private heartbeat?: EdgeNodeSignalClient;\n private frpManager?: FrpcProcessManager;\n private clusterCertificate?: ClusterCertificateManager;\n private networkDetector?: EdgeNodeCapabilityDetector;\n private cachedNetworkInfo?: NetworkAddressInfo;\n private lastNetworkDetection = 0;\n private readonly networkDetectionIntervalMs = 60_000; // 每分钟重新检测一次\n\n public async start(options: EdgeNodeAgentOptions): Promise<void> {\n if (options.acme) {\n const mode = options.acme.mode ?? 'local';\n if (mode === 'cluster') {\n await this.ensureClusterCertificate(options);\n } else {\n await this.issueCertificateLocally(options);\n }\n }\n if (options.frp) {\n this.frpManager = new FrpcProcessManager({\n binaryPath: options.frp.binaryPath,\n configPath: options.frp.configPath,\n workingDirectory: options.frp.workingDirectory,\n logPrefix: options.frp.logPrefix,\n autoRestart: options.frp.autoRestart,\n });\n }\n \n // 初始化网络检测器\n if (options.enableNetworkDetection !== false) {\n this.networkDetector = new EdgeNodeCapabilityDetector({\n dynamicDetection: {\n enableNetworkDetection: true,\n },\n });\n // 执行初始网络检测\n this.cachedNetworkInfo = await this.networkDetector.detectNetworkAddresses();\n this.lastNetworkDetection = Date.now();\n this.logger.info(`Network detection: IPv4=${this.cachedNetworkInfo.ipv4Public ?? this.cachedNetworkInfo.ipv4}, IPv6=${this.cachedNetworkInfo.ipv6Public ?? this.cachedNetworkInfo.ipv6}, hasPublicIPv6=${this.cachedNetworkInfo.hasPublicIPv6}`);\n }\n \n const systemMetrics = options.includeSystemMetrics ? this.collectSystemMetrics() : undefined;\n const metadataPayload = {\n ...(options.metadata ?? {}),\n system: systemMetrics,\n } as Record<string, unknown>;\n\n const certificatePayload = this.clusterCertificate?.getHeartbeatPayload();\n const heartbeatOptions: EdgeNodeSignalClientOptions = {\n edgeNodesEnabled: true,\n signalEndpoint: options.signalEndpoint,\n nodeId: options.nodeId,\n nodeToken: options.nodeToken,\n baseUrl: options.baseUrl,\n directCandidates: options.directCandidates,\n pods: options.pods,\n intervalMs: options.intervalMs,\n metadata: this.stringifyIfContent(metadataPayload),\n metrics: systemMetrics ? JSON.stringify(systemMetrics) : undefined,\n certificate: certificatePayload ? JSON.stringify(certificatePayload) : undefined,\n onHeartbeatResponse: (data: unknown): void => {\n this.handleHeartbeatResponse(data);\n options.onHeartbeatResponse?.(data);\n },\n networkSupplier: this.networkDetector ? () => this.getNetworkInfo() : undefined,\n };\n if (this.frpManager) {\n heartbeatOptions.tunnelSupplier = () => this.buildTunnelHeartbeatPayload();\n }\n\n this.heartbeat = new EdgeNodeSignalClient(heartbeatOptions);\n }\n\n public stop(): void {\n if (this.heartbeat && typeof (this.heartbeat as any).dispose === 'function') {\n (this.heartbeat as any).dispose();\n }\n this.heartbeat = undefined;\n void this.frpManager?.stop();\n this.clusterCertificate?.stop();\n }\n\n private stringifyIfContent(data: Record<string, unknown>): string | undefined {\n const sanitized: Record<string, unknown> = {};\n for (const [ key, value ] of Object.entries(data)) {\n if (value !== undefined) {\n sanitized[key] = value;\n }\n }\n return Object.keys(sanitized).length > 0 ? JSON.stringify(sanitized) : undefined;\n }\n\n private collectSystemMetrics(): Record<string, unknown> {\n const load = os.loadavg();\n return {\n hostname: os.hostname(),\n platform: os.platform(),\n arch: os.arch(),\n uptime: os.uptime(),\n cpuCount: os.cpus().length,\n load1: load[0],\n load5: load[1],\n load15: load[2],\n totalMem: os.totalmem(),\n freeMem: os.freemem(),\n };\n }\n\n private handleHeartbeatResponse(data: unknown): void {\n if (!data || typeof data !== 'object') {\n return;\n }\n const body = data as Record<string, any>;\n const metadata = body.metadata as Record<string, any> | undefined;\n this.clusterCertificate?.handleHeartbeatMetadata(metadata);\n const tunnel = metadata?.tunnel as Record<string, any> | undefined;\n const config = tunnel?.config as Record<string, any> | undefined;\n if (config) {\n this.logger.debug(`接收到隧道配置: ${JSON.stringify({ entrypoint: tunnel?.entrypoint, proxyName: config.proxyName })}`);\n }\n const entrypoint = typeof tunnel?.entrypoint === 'string' ? tunnel.entrypoint :\n typeof config?.publicUrl === 'string' ? config.publicUrl : undefined;\n void this.frpManager?.applyConfig(config as any, tunnel?.status as string | undefined, entrypoint);\n }\n\n private async issueCertificateLocally(options: EdgeNodeAgentOptions): Promise<void> {\n const acmeOptions = options.acme!;\n if (!acmeOptions.email || !acmeOptions.domains || acmeOptions.domains.length === 0) {\n throw new Error('本地 ACME 模式需要提供 email 与 domains。');\n }\n if (!acmeOptions.accountKeyPath) {\n throw new Error('本地 ACME 模式需要提供 accountKeyPath。');\n }\n const manager = new AcmeCertificateManager({\n signalEndpoint: options.signalEndpoint,\n nodeId: options.nodeId,\n nodeToken: options.nodeToken,\n email: acmeOptions.email!,\n domains: acmeOptions.domains!,\n directoryUrl: acmeOptions.directoryUrl,\n accountKeyPath: acmeOptions.accountKeyPath!,\n certificateKeyPath: acmeOptions.certificateKeyPath,\n certificatePath: acmeOptions.certificatePath,\n fullChainPath: acmeOptions.fullChainPath,\n renewBeforeDays: acmeOptions.renewBeforeDays,\n propagationDelayMs: acmeOptions.propagationDelayMs,\n });\n try {\n const issued = await manager.ensureCertificate();\n if (issued && acmeOptions.postDeployCommand && acmeOptions.postDeployCommand.length > 0) {\n await this.runPostDeploy(acmeOptions.postDeployCommand);\n }\n } catch (error: unknown) {\n this.logger.error(`自动签发证书失败:${(error as Error).message}`);\n throw error;\n }\n }\n\n private async ensureClusterCertificate(options: EdgeNodeAgentOptions): Promise<void> {\n const acmeOptions = options.acme!;\n if (!acmeOptions.certificateKeyPath || !acmeOptions.certificatePath) {\n throw new Error('Cluster 模式需要提供 certificateKeyPath 与 certificatePath。');\n }\n const manager = new ClusterCertificateManager({\n signalEndpoint: options.signalEndpoint,\n nodeId: options.nodeId,\n nodeToken: options.nodeToken,\n certificateKeyPath: acmeOptions.certificateKeyPath,\n certificatePath: acmeOptions.certificatePath,\n fullChainPath: acmeOptions.fullChainPath,\n renewBeforeDays: acmeOptions.renewBeforeDays,\n onCertificateInstalled: acmeOptions.postDeployCommand ? () => this.runPostDeploy(acmeOptions.postDeployCommand!) : undefined,\n });\n this.clusterCertificate = manager;\n await manager.start();\n }\n\n private async runPostDeploy(command: string[]): Promise<void> {\n const [ executable, ...args ] = command;\n if (!executable) {\n return;\n }\n await new Promise<void>((resolve, reject) => {\n const child = spawn(executable, args, { stdio: 'inherit' });\n child.on('error', reject);\n child.on('exit', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`命令 ${executable} 退出码 ${code}`));\n }\n });\n });\n }\n\n private buildTunnelHeartbeatPayload(): Record<string, unknown> | undefined {\n const status: FrpcRuntimeStatus | undefined = this.frpManager?.getStatus();\n if (!status) {\n return undefined;\n }\n return { client: status };\n }\n\n /**\n * 获取网络信息(带缓存,每分钟刷新一次)\n */\n private async getNetworkInfo(): Promise<{ ipv4?: string; ipv6?: string }> {\n const now = Date.now();\n \n // 如果缓存过期,重新检测\n if (!this.cachedNetworkInfo || (now - this.lastNetworkDetection) > this.networkDetectionIntervalMs) {\n if (this.networkDetector) {\n try {\n this.cachedNetworkInfo = await this.networkDetector.detectNetworkAddresses();\n this.lastNetworkDetection = now;\n } catch (error: unknown) {\n this.logger.debug(`Network detection failed: ${(error as Error).message}`);\n }\n }\n }\n \n // 优先返回公网地址\n return {\n ipv4: this.cachedNetworkInfo?.ipv4Public ?? this.cachedNetworkInfo?.ipv4,\n ipv6: this.cachedNetworkInfo?.ipv6Public ?? this.cachedNetworkInfo?.ipv6,\n };\n }\n}\n"]}
@@ -21,6 +21,7 @@ export declare class EdgeNodeDnsCoordinator {
21
21
  constructor(options: EdgeNodeDnsCoordinatorOptions);
22
22
  synchronize(nodeId: string, metadata: Record<string, unknown>): Promise<void>;
23
23
  private extractDnsHints;
24
+ private extractTunnelEntrypoint;
24
25
  private extractString;
25
26
  private detectRecordType;
26
27
  private normalizeRecordValue;
@@ -26,7 +26,7 @@ class EdgeNodeDnsCoordinator {
26
26
  let recordType;
27
27
  const ipv6 = this.extractString(metadata.ipv6);
28
28
  const ipv4 = this.extractString(metadata.ipv4);
29
- const publicAddress = this.extractString(metadata.publicAddress);
29
+ const tunnelEntrypoint = this.extractTunnelEntrypoint(metadata.tunnel);
30
30
  // IPv6 优先
31
31
  if (ipv6 && this.isIpv6(ipv6)) {
32
32
  target = ipv6;
@@ -34,7 +34,7 @@ class EdgeNodeDnsCoordinator {
34
34
  this.logger.debug(`Node ${nodeId} 使用 IPv6 地址: ${ipv6}`);
35
35
  }
36
36
  else {
37
- target = ipv4 ?? publicAddress;
37
+ target = ipv4 ?? tunnelEntrypoint;
38
38
  }
39
39
  if (!target && hints?.target) {
40
40
  target = hints.target;
@@ -90,13 +90,19 @@ class EdgeNodeDnsCoordinator {
90
90
  return undefined;
91
91
  }
92
92
  const target = this.extractString(dns.target)
93
- ?? this.extractString(metadata.publicAddress)
93
+ ?? this.extractTunnelEntrypoint(metadata.tunnel)
94
94
  ?? this.extractString(metadata.baseUrl);
95
95
  if (!target) {
96
96
  return undefined;
97
97
  }
98
98
  return { subdomain, target };
99
99
  }
100
+ extractTunnelEntrypoint(value) {
101
+ if (!value || typeof value !== 'object') {
102
+ return undefined;
103
+ }
104
+ return this.extractString(value.entrypoint);
105
+ }
100
106
  extractString(value) {
101
107
  if (typeof value !== 'string') {
102
108
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"EdgeNodeDnsCoordinator.js","sourceRoot":"","sources":["../../src/edge/EdgeNodeDnsCoordinator.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport type { DnsProvider, DnsRecordTypeValue } from '../dns/DnsProvider';\n\nexport interface EdgeNodeDnsCoordinatorOptions {\n provider: DnsProvider;\n /** 顶级域名,例如 `undefineds.site`。 */\n rootDomain?: string | null;\n /**\n * 默认记录类型,当目标地址无法识别时回退使用。\n * 一般为 `A`(IPv4)或 `AAAA`(IPv6)。\n */\n defaultRecordType?: DnsRecordTypeValue;\n /** TTL 秒数,缺省按供应商默认。 */\n ttl?: number | string | null;\n}\n\nexport class EdgeNodeDnsCoordinator {\n private readonly logger = getLoggerFor(this);\n private readonly provider: DnsProvider;\n private readonly rootDomain?: string;\n private readonly defaultRecordType: DnsRecordTypeValue;\n private readonly ttl?: number;\n private readonly enabled: boolean;\n\n public constructor(options: EdgeNodeDnsCoordinatorOptions) {\n this.provider = options.provider;\n this.rootDomain = this.normalizeRootDomain(options.rootDomain);\n this.defaultRecordType = options.defaultRecordType ?? 'A';\n this.ttl = this.normalizeTtl(options.ttl);\n this.enabled = Boolean(this.rootDomain);\n }\n\n public async synchronize(nodeId: string, metadata: Record<string, unknown>): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n const hints = this.extractDnsHints(metadata);\n\n const subdomain = this.extractString(metadata.subdomain) ?? hints?.subdomain;\n if (!subdomain) {\n this.logger.debug(`Node ${nodeId} 未提供 subdomain,跳过 DNS 同步。`);\n return;\n }\n\n // 用节点上报的地址(公网 IP 或隧道入口,由节点自行决定)\n let target: string | undefined;\n let recordType: DnsRecordTypeValue | undefined;\n\n const ipv6 = this.extractString(metadata.ipv6);\n const ipv4 = this.extractString(metadata.ipv4);\n const publicAddress = this.extractString(metadata.publicAddress);\n\n // IPv6 优先\n if (ipv6 && this.isIpv6(ipv6)) {\n target = ipv6;\n recordType = 'AAAA';\n this.logger.debug(`Node ${nodeId} 使用 IPv6 地址: ${ipv6}`);\n } else {\n target = ipv4 ?? publicAddress;\n }\n\n if (!target && hints?.target) {\n target = hints.target;\n }\n\n if (!target) {\n this.logger.debug(`Node ${nodeId} 未提供可用地址,跳过 DNS 同步。`);\n return;\n }\n\n // 健康检查未通过时删除 DNS 记录\n const connectivityStatus = this.extractString(metadata.connectivityStatus);\n if (connectivityStatus === 'unreachable') {\n this.logger.info(`节点 ${nodeId} 不可达,删除 DNS 记录 ${subdomain}.${this.rootDomain}`);\n try {\n await this.provider.deleteRecord({\n domain: this.rootDomain!,\n subdomain,\n type: recordType ?? this.defaultRecordType,\n });\n } catch (error: unknown) {\n this.logger.error(`删除节点 ${nodeId} DNS 记录失败: ${(error as Error).message}`);\n }\n return;\n }\n\n const type = recordType ?? this.detectRecordType(target) ?? this.defaultRecordType;\n const value = this.normalizeRecordValue(target, type);\n\n if (!value) {\n this.logger.warn(`Edge node ${nodeId} DNS 目标解析失败,跳过同步。`);\n return;\n }\n\n try {\n await this.provider.upsertRecord({\n domain: this.rootDomain!,\n subdomain,\n type,\n value,\n ttl: this.ttl,\n });\n this.logger.info(`已同步节点 ${nodeId} 的 DNS: ${subdomain}.${this.rootDomain} -> ${value}`);\n } catch (error: unknown) {\n this.logger.error(`同步节点 ${nodeId} DNS 记录失败: ${(error as Error).message}`);\n throw error;\n }\n }\n\n private extractDnsHints(metadata: Record<string, unknown>): { subdomain: string; target: string } | undefined {\n const dns = metadata?.dns;\n if (!dns || typeof dns !== 'object') {\n return undefined;\n }\n const subdomain = this.extractString((dns as Record<string, unknown>).subdomain);\n if (!subdomain) {\n return undefined;\n }\n\n const target = this.extractString((dns as Record<string, unknown>).target)\n ?? this.extractString(metadata.publicAddress)\n ?? this.extractString(metadata.baseUrl);\n\n if (!target) {\n return undefined;\n }\n return { subdomain, target };\n }\n\n private extractString(value: unknown): 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 detectRecordType(target: string): DnsRecordTypeValue | undefined {\n const host = this.extractHost(target) ?? target;\n if (this.isIpv4(host)) {\n return 'A';\n }\n if (this.isIpv6(host)) {\n return 'AAAA';\n }\n if (host.includes('.')) {\n return 'CNAME';\n }\n return undefined;\n }\n\n private normalizeRecordValue(target: string, type: DnsRecordTypeValue): string | undefined {\n const host = this.extractHost(target) ?? target;\n if (type === 'A' && this.isIpv4(host)) {\n return host;\n }\n if (type === 'AAAA' && this.isIpv6(host)) {\n return host;\n }\n if (type === 'CNAME') {\n return host.endsWith('.') ? host : `${host}.`;\n }\n if (type === 'TXT') {\n return host;\n }\n return undefined;\n }\n\n private extractHost(input: string): string | undefined {\n try {\n const url = new URL(input);\n return url.hostname;\n } catch {\n return input;\n }\n }\n\n private isIpv4(value: string): boolean {\n const parts = value.split('.');\n if (parts.length !== 4) {\n return false;\n }\n return parts.every((part) => {\n if (!/^[0-9]{1,3}$/.test(part)) {\n return false;\n }\n const num = Number(part);\n return num >= 0 && num <= 255;\n });\n }\n\n private isIpv6(value: string): boolean {\n return /^[0-9a-fA-F:]+$/.test(value) && value.includes(':');\n }\n\n private normalizeRootDomain(value?: string | null): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n let trimmed = value.trim();\n if (trimmed.includes('://')) {\n try {\n trimmed = new URL(trimmed).hostname;\n } catch {\n // ignore\n }\n }\n trimmed = trimmed.replace(/\\.$/, '');\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n private normalizeTtl(value?: number | string | null): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) {\n return Math.trunc(value);\n }\n if (typeof value === 'string') {\n const parsed = Number(value.trim());\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.trunc(parsed);\n }\n }\n return undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"EdgeNodeDnsCoordinator.js","sourceRoot":"","sources":["../../src/edge/EdgeNodeDnsCoordinator.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport type { DnsProvider, DnsRecordTypeValue } from '../dns/DnsProvider';\n\nexport interface EdgeNodeDnsCoordinatorOptions {\n provider: DnsProvider;\n /** 顶级域名,例如 `undefineds.site`。 */\n rootDomain?: string | null;\n /**\n * 默认记录类型,当目标地址无法识别时回退使用。\n * 一般为 `A`(IPv4)或 `AAAA`(IPv6)。\n */\n defaultRecordType?: DnsRecordTypeValue;\n /** TTL 秒数,缺省按供应商默认。 */\n ttl?: number | string | null;\n}\n\nexport class EdgeNodeDnsCoordinator {\n private readonly logger = getLoggerFor(this);\n private readonly provider: DnsProvider;\n private readonly rootDomain?: string;\n private readonly defaultRecordType: DnsRecordTypeValue;\n private readonly ttl?: number;\n private readonly enabled: boolean;\n\n public constructor(options: EdgeNodeDnsCoordinatorOptions) {\n this.provider = options.provider;\n this.rootDomain = this.normalizeRootDomain(options.rootDomain);\n this.defaultRecordType = options.defaultRecordType ?? 'A';\n this.ttl = this.normalizeTtl(options.ttl);\n this.enabled = Boolean(this.rootDomain);\n }\n\n public async synchronize(nodeId: string, metadata: Record<string, unknown>): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n const hints = this.extractDnsHints(metadata);\n\n const subdomain = this.extractString(metadata.subdomain) ?? hints?.subdomain;\n if (!subdomain) {\n this.logger.debug(`Node ${nodeId} 未提供 subdomain,跳过 DNS 同步。`);\n return;\n }\n\n // 用节点上报的地址(公网 IP 或隧道入口,由节点自行决定)\n let target: string | undefined;\n let recordType: DnsRecordTypeValue | undefined;\n\n const ipv6 = this.extractString(metadata.ipv6);\n const ipv4 = this.extractString(metadata.ipv4);\n const tunnelEntrypoint = this.extractTunnelEntrypoint(metadata.tunnel);\n\n // IPv6 优先\n if (ipv6 && this.isIpv6(ipv6)) {\n target = ipv6;\n recordType = 'AAAA';\n this.logger.debug(`Node ${nodeId} 使用 IPv6 地址: ${ipv6}`);\n } else {\n target = ipv4 ?? tunnelEntrypoint;\n }\n\n if (!target && hints?.target) {\n target = hints.target;\n }\n\n if (!target) {\n this.logger.debug(`Node ${nodeId} 未提供可用地址,跳过 DNS 同步。`);\n return;\n }\n\n // 健康检查未通过时删除 DNS 记录\n const connectivityStatus = this.extractString(metadata.connectivityStatus);\n if (connectivityStatus === 'unreachable') {\n this.logger.info(`节点 ${nodeId} 不可达,删除 DNS 记录 ${subdomain}.${this.rootDomain}`);\n try {\n await this.provider.deleteRecord({\n domain: this.rootDomain!,\n subdomain,\n type: recordType ?? this.defaultRecordType,\n });\n } catch (error: unknown) {\n this.logger.error(`删除节点 ${nodeId} DNS 记录失败: ${(error as Error).message}`);\n }\n return;\n }\n\n const type = recordType ?? this.detectRecordType(target) ?? this.defaultRecordType;\n const value = this.normalizeRecordValue(target, type);\n\n if (!value) {\n this.logger.warn(`Edge node ${nodeId} DNS 目标解析失败,跳过同步。`);\n return;\n }\n\n try {\n await this.provider.upsertRecord({\n domain: this.rootDomain!,\n subdomain,\n type,\n value,\n ttl: this.ttl,\n });\n this.logger.info(`已同步节点 ${nodeId} 的 DNS: ${subdomain}.${this.rootDomain} -> ${value}`);\n } catch (error: unknown) {\n this.logger.error(`同步节点 ${nodeId} DNS 记录失败: ${(error as Error).message}`);\n throw error;\n }\n }\n\n private extractDnsHints(metadata: Record<string, unknown>): { subdomain: string; target: string } | undefined {\n const dns = metadata?.dns;\n if (!dns || typeof dns !== 'object') {\n return undefined;\n }\n const subdomain = this.extractString((dns as Record<string, unknown>).subdomain);\n if (!subdomain) {\n return undefined;\n }\n\n const target = this.extractString((dns as Record<string, unknown>).target)\n ?? this.extractTunnelEntrypoint(metadata.tunnel)\n ?? this.extractString(metadata.baseUrl);\n\n if (!target) {\n return undefined;\n }\n return { subdomain, target };\n }\n\n private extractTunnelEntrypoint(value: unknown): string | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n return this.extractString((value as Record<string, unknown>).entrypoint);\n }\n\n private extractString(value: unknown): 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 detectRecordType(target: string): DnsRecordTypeValue | undefined {\n const host = this.extractHost(target) ?? target;\n if (this.isIpv4(host)) {\n return 'A';\n }\n if (this.isIpv6(host)) {\n return 'AAAA';\n }\n if (host.includes('.')) {\n return 'CNAME';\n }\n return undefined;\n }\n\n private normalizeRecordValue(target: string, type: DnsRecordTypeValue): string | undefined {\n const host = this.extractHost(target) ?? target;\n if (type === 'A' && this.isIpv4(host)) {\n return host;\n }\n if (type === 'AAAA' && this.isIpv6(host)) {\n return host;\n }\n if (type === 'CNAME') {\n return host.endsWith('.') ? host : `${host}.`;\n }\n if (type === 'TXT') {\n return host;\n }\n return undefined;\n }\n\n private extractHost(input: string): string | undefined {\n try {\n const url = new URL(input);\n return url.hostname;\n } catch {\n return input;\n }\n }\n\n private isIpv4(value: string): boolean {\n const parts = value.split('.');\n if (parts.length !== 4) {\n return false;\n }\n return parts.every((part) => {\n if (!/^[0-9]{1,3}$/.test(part)) {\n return false;\n }\n const num = Number(part);\n return num >= 0 && num <= 255;\n });\n }\n\n private isIpv6(value: string): boolean {\n return /^[0-9a-fA-F:]+$/.test(value) && value.includes(':');\n }\n\n private normalizeRootDomain(value?: string | null): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n let trimmed = value.trim();\n if (trimmed.includes('://')) {\n try {\n trimmed = new URL(trimmed).hostname;\n } catch {\n // ignore\n }\n }\n trimmed = trimmed.replace(/\\.$/, '');\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n private normalizeTtl(value?: number | string | null): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) {\n return Math.trunc(value);\n }\n if (typeof value === 'string') {\n const parsed = Number(value.trim());\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.trunc(parsed);\n }\n }\n return undefined;\n }\n}\n"]}
@@ -117,6 +117,10 @@
117
117
  "@id": "undefineds:dist/edge/EdgeNodeDnsCoordinator.jsonld#EdgeNodeDnsCoordinator__member_extractDnsHints",
118
118
  "memberFieldName": "extractDnsHints"
119
119
  },
120
+ {
121
+ "@id": "undefineds:dist/edge/EdgeNodeDnsCoordinator.jsonld#EdgeNodeDnsCoordinator__member_extractTunnelEntrypoint",
122
+ "memberFieldName": "extractTunnelEntrypoint"
123
+ },
120
124
  {
121
125
  "@id": "undefineds:dist/edge/EdgeNodeDnsCoordinator.jsonld#EdgeNodeDnsCoordinator__member_extractString",
122
126
  "memberFieldName": "extractString"
@@ -15,6 +15,9 @@ export declare class EdgeNodeHealthProbeService {
15
15
  constructor(options: EdgeNodeHealthProbeServiceOptions);
16
16
  probeNode(nodeId: string): Promise<void>;
17
17
  private collectCandidates;
18
+ private extractTunnelEntrypoint;
19
+ private extractManagedTunnelEndpoint;
20
+ private extractNonEmptyString;
18
21
  private ping;
19
22
  private toUrl;
20
23
  private createRepository;
@@ -54,14 +54,34 @@ class EdgeNodeHealthProbeService {
54
54
  candidates.add(candidate.trim());
55
55
  }
56
56
  }
57
- if (typeof metadata.publicAddress === 'string') {
58
- candidates.add(metadata.publicAddress.trim());
57
+ const tunnelEntrypoint = this.extractTunnelEntrypoint(metadata.tunnel) ?? this.extractManagedTunnelEndpoint(metadata.managedTunnel);
58
+ if (tunnelEntrypoint) {
59
+ candidates.add(tunnelEntrypoint);
59
60
  }
60
61
  if (typeof metadata.baseUrl === 'string') {
61
62
  candidates.add(metadata.baseUrl.trim());
62
63
  }
63
64
  return Array.from(candidates);
64
65
  }
66
+ extractTunnelEntrypoint(value) {
67
+ if (!value || typeof value !== 'object') {
68
+ return undefined;
69
+ }
70
+ return this.extractNonEmptyString(value.entrypoint);
71
+ }
72
+ extractManagedTunnelEndpoint(value) {
73
+ if (!value || typeof value !== 'object') {
74
+ return undefined;
75
+ }
76
+ return this.extractNonEmptyString(value.endpoint);
77
+ }
78
+ extractNonEmptyString(value) {
79
+ if (typeof value !== 'string') {
80
+ return undefined;
81
+ }
82
+ const trimmed = value.trim();
83
+ return trimmed.length > 0 ? trimmed : undefined;
84
+ }
65
85
  async ping(candidate, location) {
66
86
  const url = this.toUrl(candidate);
67
87
  if (!url) {
@@ -1 +1 @@
1
- {"version":3,"file":"EdgeNodeHealthProbeService.js","sourceRoot":"","sources":["../../src/edge/EdgeNodeHealthProbeService.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport { getIdentityDatabase } from '../identity/drizzle/db';\nimport { EdgeNodeRepository } from '../identity/drizzle/EdgeNodeRepository';\n\ninterface EdgeNodeHealthProbeServiceOptions {\n repository?: EdgeNodeRepository;\n identityDbUrl?: string;\n enabled?: boolean | string;\n timeoutMs?: number | string;\n locations?: string | string[];\n}\n\ninterface ProbeResult {\n location: string;\n candidate: string;\n success: boolean;\n latencyMs?: number;\n error?: string;\n checkedAt: string;\n}\n\ninterface ProbeLocation {\n name: string;\n endpoint?: string;\n}\n\nexport class EdgeNodeHealthProbeService {\n private readonly logger = getLoggerFor(this);\n private readonly repository?: EdgeNodeRepository;\n private readonly enabled: boolean;\n private readonly timeoutMs: number;\n private readonly locations: ProbeLocation[];\n\n public constructor(options: EdgeNodeHealthProbeServiceOptions) {\n this.repository = options.repository ?? this.createRepository(options.identityDbUrl);\n this.enabled = this.normalizeBoolean(options.enabled) && Boolean(this.repository);\n this.timeoutMs = this.normalizeTimeout(options.timeoutMs) ?? 3_000;\n this.locations = this.normalizeLocations(options.locations);\n }\n\n public async probeNode(nodeId: string): Promise<void> {\n if (!this.enabled) {\n return;\n }\n const node = await this.repository!.getNodeMetadata(nodeId);\n if (!node?.metadata) {\n this.logger.debug(`节点 ${nodeId} 无 metadata,跳过探测。`);\n return;\n }\n const metadata = node.metadata as Record<string, unknown>;\n const candidates = this.collectCandidates(metadata);\n if (candidates.length === 0) {\n this.logger.debug(`节点 ${nodeId} 没有可探测的候选地址。`);\n return;\n }\n\n const results: ProbeResult[] = [];\n for (const candidate of candidates) {\n for (const location of this.locations) {\n const result = await this.ping(candidate, location);\n results.push(result);\n }\n }\n\n const successful = results.find((item) => item.success);\n const clusterSuccess = results.some((item) => item.location === 'cluster' && item.success);\n const status = clusterSuccess ? 'direct' : successful ? 'degraded' : 'unreachable';\n const now = new Date();\n const reachability = {\n status,\n lastProbeAt: now.toISOString(),\n lastSuccessAt: successful ? successful.checkedAt : undefined,\n samples: results,\n };\n\n await this.repository!.mergeNodeMetadata(nodeId, { reachability });\n }\n\n private collectCandidates(metadata: Record<string, unknown>): string[] {\n const candidates = new Set<string>();\n const direct = (metadata.directCandidates as string[] | undefined) ?? [];\n for (const candidate of direct) {\n if (typeof candidate === 'string' && candidate.trim().length > 0) {\n candidates.add(candidate.trim());\n }\n }\n if (typeof metadata.publicAddress === 'string') {\n candidates.add(metadata.publicAddress.trim());\n }\n if (typeof metadata.baseUrl === 'string') {\n candidates.add(metadata.baseUrl.trim());\n }\n return Array.from(candidates);\n }\n\n private async ping(candidate: string, location: ProbeLocation): Promise<ProbeResult> {\n const url = this.toUrl(candidate);\n if (!url) {\n return { candidate, success: false, error: 'invalid-url', location: location.name, checkedAt: new Date().toISOString() };\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n const started = Date.now();\n try {\n if (location.endpoint) {\n const probeUrl = new URL(location.endpoint);\n probeUrl.searchParams.set('target', url.toString());\n const response = await fetch(probeUrl.toString(), {\n method: 'GET',\n signal: controller.signal,\n headers: { 'accept': 'application/json' },\n });\n clearTimeout(timer);\n const latencyMs = Date.now() - started;\n if (!response.ok) {\n return {\n candidate,\n location: location.name,\n success: false,\n latencyMs,\n error: `status:${response.status}`,\n checkedAt: new Date().toISOString(),\n };\n }\n try {\n const data = await response.json() as Partial<ProbeResult>;\n return {\n candidate,\n location: location.name,\n success: Boolean(data.success),\n latencyMs: typeof data.latencyMs === 'number' ? data.latencyMs : latencyMs,\n error: data.error,\n checkedAt: data.checkedAt ?? new Date().toISOString(),\n };\n } catch (error: unknown) {\n return {\n candidate,\n location: location.name,\n success: false,\n latencyMs,\n error: `invalid-json:${(error as Error).message}`,\n checkedAt: new Date().toISOString(),\n };\n }\n }\n const response = await fetch(url.toString(), {\n method: 'HEAD',\n signal: controller.signal,\n });\n clearTimeout(timer);\n const latencyMs = Date.now() - started;\n return {\n candidate,\n location: location.name,\n success: response.ok,\n latencyMs,\n error: response.ok ? undefined : `status:${response.status}`,\n checkedAt: new Date().toISOString(),\n };\n } catch (error: unknown) {\n clearTimeout(timer);\n return {\n candidate,\n location: location.name,\n success: false,\n error: (error as Error).message,\n checkedAt: new Date().toISOString(),\n };\n }\n }\n\n private toUrl(value: string): URL | undefined {\n try {\n return new URL(value);\n } catch {\n try {\n return new URL(`https://${value}`);\n } catch {\n return undefined;\n }\n }\n }\n\n private createRepository(identityDbUrl?: string): EdgeNodeRepository | undefined {\n if (!identityDbUrl) {\n return undefined;\n }\n const db = getIdentityDatabase(identityDbUrl);\n return new EdgeNodeRepository(db);\n }\n\n private normalizeBoolean(value?: boolean | string): 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 normalizeTimeout(value?: number | string): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) {\n return Math.trunc(value);\n }\n if (typeof value === 'string') {\n const parsed = Number(value.trim());\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.trunc(parsed);\n }\n }\n return undefined;\n }\n\n private normalizeLocations(value?: string | string[]): ProbeLocation[] {\n const defaultLocation: ProbeLocation = { name: 'cluster' };\n if (value === undefined) {\n return [ defaultLocation ];\n }\n const input = Array.isArray(value) ? value : value.split(/[,;\\n]+/u);\n const result: ProbeLocation[] = [];\n for (const entry of input) {\n const trimmed = entry.trim();\n if (trimmed.length === 0) {\n continue;\n }\n const [ namePart, endpointPart ] = trimmed.split('@', 2);\n const name = namePart.trim() || 'cluster';\n const endpoint = endpointPart?.trim();\n result.push({\n name,\n endpoint: endpoint?.length ? endpoint : undefined,\n });\n }\n return result.length > 0 ? result : [ defaultLocation ];\n }\n}\n"]}
1
+ {"version":3,"file":"EdgeNodeHealthProbeService.js","sourceRoot":"","sources":["../../src/edge/EdgeNodeHealthProbeService.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport { getIdentityDatabase } from '../identity/drizzle/db';\nimport { EdgeNodeRepository } from '../identity/drizzle/EdgeNodeRepository';\n\ninterface EdgeNodeHealthProbeServiceOptions {\n repository?: EdgeNodeRepository;\n identityDbUrl?: string;\n enabled?: boolean | string;\n timeoutMs?: number | string;\n locations?: string | string[];\n}\n\ninterface ProbeResult {\n location: string;\n candidate: string;\n success: boolean;\n latencyMs?: number;\n error?: string;\n checkedAt: string;\n}\n\ninterface ProbeLocation {\n name: string;\n endpoint?: string;\n}\n\nexport class EdgeNodeHealthProbeService {\n private readonly logger = getLoggerFor(this);\n private readonly repository?: EdgeNodeRepository;\n private readonly enabled: boolean;\n private readonly timeoutMs: number;\n private readonly locations: ProbeLocation[];\n\n public constructor(options: EdgeNodeHealthProbeServiceOptions) {\n this.repository = options.repository ?? this.createRepository(options.identityDbUrl);\n this.enabled = this.normalizeBoolean(options.enabled) && Boolean(this.repository);\n this.timeoutMs = this.normalizeTimeout(options.timeoutMs) ?? 3_000;\n this.locations = this.normalizeLocations(options.locations);\n }\n\n public async probeNode(nodeId: string): Promise<void> {\n if (!this.enabled) {\n return;\n }\n const node = await this.repository!.getNodeMetadata(nodeId);\n if (!node?.metadata) {\n this.logger.debug(`节点 ${nodeId} 无 metadata,跳过探测。`);\n return;\n }\n const metadata = node.metadata as Record<string, unknown>;\n const candidates = this.collectCandidates(metadata);\n if (candidates.length === 0) {\n this.logger.debug(`节点 ${nodeId} 没有可探测的候选地址。`);\n return;\n }\n\n const results: ProbeResult[] = [];\n for (const candidate of candidates) {\n for (const location of this.locations) {\n const result = await this.ping(candidate, location);\n results.push(result);\n }\n }\n\n const successful = results.find((item) => item.success);\n const clusterSuccess = results.some((item) => item.location === 'cluster' && item.success);\n const status = clusterSuccess ? 'direct' : successful ? 'degraded' : 'unreachable';\n const now = new Date();\n const reachability = {\n status,\n lastProbeAt: now.toISOString(),\n lastSuccessAt: successful ? successful.checkedAt : undefined,\n samples: results,\n };\n\n await this.repository!.mergeNodeMetadata(nodeId, { reachability });\n }\n\n private collectCandidates(metadata: Record<string, unknown>): string[] {\n const candidates = new Set<string>();\n const direct = (metadata.directCandidates as string[] | undefined) ?? [];\n for (const candidate of direct) {\n if (typeof candidate === 'string' && candidate.trim().length > 0) {\n candidates.add(candidate.trim());\n }\n }\n const tunnelEntrypoint = this.extractTunnelEntrypoint(metadata.tunnel) ?? this.extractManagedTunnelEndpoint(metadata.managedTunnel);\n if (tunnelEntrypoint) {\n candidates.add(tunnelEntrypoint);\n }\n if (typeof metadata.baseUrl === 'string') {\n candidates.add(metadata.baseUrl.trim());\n }\n return Array.from(candidates);\n }\n\n private extractTunnelEntrypoint(value: unknown): string | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n return this.extractNonEmptyString((value as Record<string, unknown>).entrypoint);\n }\n\n private extractManagedTunnelEndpoint(value: unknown): string | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n return this.extractNonEmptyString((value as Record<string, unknown>).endpoint);\n }\n\n private extractNonEmptyString(value: unknown): 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 async ping(candidate: string, location: ProbeLocation): Promise<ProbeResult> {\n const url = this.toUrl(candidate);\n if (!url) {\n return { candidate, success: false, error: 'invalid-url', location: location.name, checkedAt: new Date().toISOString() };\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n const started = Date.now();\n try {\n if (location.endpoint) {\n const probeUrl = new URL(location.endpoint);\n probeUrl.searchParams.set('target', url.toString());\n const response = await fetch(probeUrl.toString(), {\n method: 'GET',\n signal: controller.signal,\n headers: { 'accept': 'application/json' },\n });\n clearTimeout(timer);\n const latencyMs = Date.now() - started;\n if (!response.ok) {\n return {\n candidate,\n location: location.name,\n success: false,\n latencyMs,\n error: `status:${response.status}`,\n checkedAt: new Date().toISOString(),\n };\n }\n try {\n const data = await response.json() as Partial<ProbeResult>;\n return {\n candidate,\n location: location.name,\n success: Boolean(data.success),\n latencyMs: typeof data.latencyMs === 'number' ? data.latencyMs : latencyMs,\n error: data.error,\n checkedAt: data.checkedAt ?? new Date().toISOString(),\n };\n } catch (error: unknown) {\n return {\n candidate,\n location: location.name,\n success: false,\n latencyMs,\n error: `invalid-json:${(error as Error).message}`,\n checkedAt: new Date().toISOString(),\n };\n }\n }\n const response = await fetch(url.toString(), {\n method: 'HEAD',\n signal: controller.signal,\n });\n clearTimeout(timer);\n const latencyMs = Date.now() - started;\n return {\n candidate,\n location: location.name,\n success: response.ok,\n latencyMs,\n error: response.ok ? undefined : `status:${response.status}`,\n checkedAt: new Date().toISOString(),\n };\n } catch (error: unknown) {\n clearTimeout(timer);\n return {\n candidate,\n location: location.name,\n success: false,\n error: (error as Error).message,\n checkedAt: new Date().toISOString(),\n };\n }\n }\n\n private toUrl(value: string): URL | undefined {\n try {\n return new URL(value);\n } catch {\n try {\n return new URL(`https://${value}`);\n } catch {\n return undefined;\n }\n }\n }\n\n private createRepository(identityDbUrl?: string): EdgeNodeRepository | undefined {\n if (!identityDbUrl) {\n return undefined;\n }\n const db = getIdentityDatabase(identityDbUrl);\n return new EdgeNodeRepository(db);\n }\n\n private normalizeBoolean(value?: boolean | string): 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 normalizeTimeout(value?: number | string): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) {\n return Math.trunc(value);\n }\n if (typeof value === 'string') {\n const parsed = Number(value.trim());\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.trunc(parsed);\n }\n }\n return undefined;\n }\n\n private normalizeLocations(value?: string | string[]): ProbeLocation[] {\n const defaultLocation: ProbeLocation = { name: 'cluster' };\n if (value === undefined) {\n return [ defaultLocation ];\n }\n const input = Array.isArray(value) ? value : value.split(/[,;\\n]+/u);\n const result: ProbeLocation[] = [];\n for (const entry of input) {\n const trimmed = entry.trim();\n if (trimmed.length === 0) {\n continue;\n }\n const [ namePart, endpointPart ] = trimmed.split('@', 2);\n const name = namePart.trim() || 'cluster';\n const endpoint = endpointPart?.trim();\n result.push({\n name,\n endpoint: endpoint?.length ? endpoint : undefined,\n });\n }\n return result.length > 0 ? result : [ defaultLocation ];\n }\n}\n"]}
@@ -109,6 +109,18 @@
109
109
  "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_collectCandidates",
110
110
  "memberFieldName": "collectCandidates"
111
111
  },
112
+ {
113
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_extractTunnelEntrypoint",
114
+ "memberFieldName": "extractTunnelEntrypoint"
115
+ },
116
+ {
117
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_extractManagedTunnelEndpoint",
118
+ "memberFieldName": "extractManagedTunnelEndpoint"
119
+ },
120
+ {
121
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_extractNonEmptyString",
122
+ "memberFieldName": "extractNonEmptyString"
123
+ },
112
124
  {
113
125
  "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_ping",
114
126
  "memberFieldName": "ping"
@@ -194,9 +194,12 @@ class ClusterIngressRouter extends community_server_1.HttpHandler {
194
194
  return entrypoint;
195
195
  }
196
196
  }
197
- // Fallback to publicAddress if available
198
- if (typeof metadata?.publicAddress === 'string') {
199
- return metadata.publicAddress;
197
+ const managedTunnel = metadata?.managedTunnel;
198
+ if (managedTunnel && typeof managedTunnel === 'object') {
199
+ const endpoint = managedTunnel.endpoint;
200
+ if (typeof endpoint === 'string' && endpoint.trim().length > 0) {
201
+ return endpoint;
202
+ }
200
203
  }
201
204
  return undefined;
202
205
  }