@undefineds.co/xpod 0.3.52 → 0.3.54

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 (119) hide show
  1. package/config/cli.json +72 -0
  2. package/config/components-ignore.json +21 -0
  3. package/config/extensions.local.initializer.json +77 -8
  4. package/config/resolver.json +72 -4
  5. package/dist/api/ApiServer.d.ts +12 -0
  6. package/dist/api/ApiServer.js +14 -3
  7. package/dist/api/ApiServer.js.map +1 -1
  8. package/dist/api/auth/NodeTokenAuthenticator.d.ts +0 -8
  9. package/dist/api/auth/NodeTokenAuthenticator.js +3 -46
  10. package/dist/api/auth/NodeTokenAuthenticator.js.map +1 -1
  11. package/dist/api/container/local.js +5 -36
  12. package/dist/api/container/local.js.map +1 -1
  13. package/dist/api/container/routes.js +6 -0
  14. package/dist/api/container/routes.js.map +1 -1
  15. package/dist/api/handlers/EdgeNodeSignalHandler.js +25 -3
  16. package/dist/api/handlers/EdgeNodeSignalHandler.js.map +1 -1
  17. package/dist/api/handlers/ReachabilityHandler.d.ts +13 -0
  18. package/dist/api/handlers/ReachabilityHandler.js +388 -0
  19. package/dist/api/handlers/ReachabilityHandler.js.map +1 -0
  20. package/dist/api/runs/InngestRunExecutionBackend.d.ts +2 -2
  21. package/dist/api/tasks/InngestTaskScheduler.d.ts +4 -4
  22. package/dist/cli/lib/oidc-auth.js +27 -3
  23. package/dist/cli/lib/oidc-auth.js.map +1 -1
  24. package/dist/components/components.jsonld +14 -2
  25. package/dist/components/context.jsonld +439 -3
  26. package/dist/edge/EdgeNodeAgent.d.ts +43 -0
  27. package/dist/edge/EdgeNodeAgent.js +208 -1
  28. package/dist/edge/EdgeNodeAgent.js.map +1 -1
  29. package/dist/edge/EdgeNodeAgent.jsonld +166 -0
  30. package/dist/edge/EdgeNodeAgentInitializer.d.ts +20 -2
  31. package/dist/edge/EdgeNodeAgentInitializer.js +53 -2
  32. package/dist/edge/EdgeNodeAgentInitializer.js.map +1 -1
  33. package/dist/edge/EdgeNodeAgentInitializer.jsonld +409 -0
  34. package/dist/edge/reachability/CanonicalFetch.d.ts +7 -0
  35. package/dist/edge/reachability/CanonicalFetch.js +49 -0
  36. package/dist/edge/reachability/CanonicalFetch.js.map +1 -0
  37. package/dist/edge/reachability/CanonicalFetch.jsonld +25 -0
  38. package/dist/edge/reachability/ManagedClientFetch.d.ts +26 -0
  39. package/dist/edge/reachability/ManagedClientFetch.js +155 -0
  40. package/dist/edge/reachability/ManagedClientFetch.js.map +1 -0
  41. package/dist/edge/reachability/ManagedClientFetch.jsonld +83 -0
  42. package/dist/edge/reachability/ManagedClientP2PSmoke.d.ts +16 -0
  43. package/dist/edge/reachability/ManagedClientP2PSmoke.js +31 -0
  44. package/dist/edge/reachability/ManagedClientP2PSmoke.js.map +1 -0
  45. package/dist/edge/reachability/ManagedClientP2PSmoke.jsonld +65 -0
  46. package/dist/edge/reachability/ManagedRouteSelector.d.ts +7 -0
  47. package/dist/edge/reachability/ManagedRouteSelector.js +43 -0
  48. package/dist/edge/reachability/ManagedRouteSelector.js.map +1 -0
  49. package/dist/edge/reachability/ManagedRouteSelector.jsonld +29 -0
  50. package/dist/edge/reachability/P2PDataPlane.d.ts +37 -0
  51. package/dist/edge/reachability/P2PDataPlane.js +160 -0
  52. package/dist/edge/reachability/P2PDataPlane.js.map +1 -0
  53. package/dist/edge/reachability/P2PDataPlane.jsonld +134 -0
  54. package/dist/edge/reachability/P2PRealnetAcceptance.d.ts +74 -0
  55. package/dist/edge/reachability/P2PRealnetAcceptance.js +240 -0
  56. package/dist/edge/reachability/P2PRealnetAcceptance.js.map +1 -0
  57. package/dist/edge/reachability/P2PRealnetAcceptance.jsonld +283 -0
  58. package/dist/edge/reachability/P2PSignalingClient.d.ts +24 -0
  59. package/dist/edge/reachability/P2PSignalingClient.js +138 -0
  60. package/dist/edge/reachability/P2PSignalingClient.js.map +1 -0
  61. package/dist/edge/reachability/P2PSignalingClient.jsonld +79 -0
  62. package/dist/edge/reachability/ReachabilitySessionService.d.ts +55 -0
  63. package/dist/edge/reachability/ReachabilitySessionService.js +439 -0
  64. package/dist/edge/reachability/ReachabilitySessionService.js.map +1 -0
  65. package/dist/edge/reachability/ReachabilitySessionService.jsonld +196 -0
  66. package/dist/edge/reachability/RouteSetBuilder.d.ts +2 -0
  67. package/dist/edge/reachability/RouteSetBuilder.js +205 -0
  68. package/dist/edge/reachability/RouteSetBuilder.js.map +1 -0
  69. package/dist/edge/reachability/TcpP2PDataPlaneTransport.d.ts +47 -0
  70. package/dist/edge/reachability/TcpP2PDataPlaneTransport.js +281 -0
  71. package/dist/edge/reachability/TcpP2PDataPlaneTransport.js.map +1 -0
  72. package/dist/edge/reachability/TcpP2PDataPlaneTransport.jsonld +183 -0
  73. package/dist/edge/reachability/TcpP2PSignalingSession.d.ts +149 -0
  74. package/dist/edge/reachability/TcpP2PSignalingSession.js +699 -0
  75. package/dist/edge/reachability/TcpP2PSignalingSession.js.map +1 -0
  76. package/dist/edge/reachability/TcpP2PSignalingSession.jsonld +474 -0
  77. package/dist/edge/reachability/index.d.ts +12 -0
  78. package/dist/edge/reachability/index.js +29 -0
  79. package/dist/edge/reachability/index.js.map +1 -0
  80. package/dist/edge/reachability/types.d.ts +114 -0
  81. package/dist/edge/reachability/types.js +3 -0
  82. package/dist/edge/reachability/types.js.map +1 -0
  83. package/dist/edge/reachability/types.jsonld +457 -0
  84. package/dist/http/EdgeNodeProxyHttpHandler.d.ts +2 -0
  85. package/dist/http/EdgeNodeProxyHttpHandler.js +19 -1
  86. package/dist/http/EdgeNodeProxyHttpHandler.js.map +1 -1
  87. package/dist/http/EdgeNodeProxyHttpHandler.jsonld +8 -0
  88. package/dist/identity/drizzle/EdgeNodeRepository.js +1 -1
  89. package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -1
  90. package/dist/index.d.ts +4 -1
  91. package/dist/index.js +5 -2
  92. package/dist/index.js.map +1 -1
  93. package/dist/runtime/bootstrap.js +8 -0
  94. package/dist/runtime/bootstrap.js.map +1 -1
  95. package/dist/service/EdgeNodeSignalClient.js +5 -1
  96. package/dist/service/EdgeNodeSignalClient.js.map +1 -1
  97. package/dist/storage/rdf/PostgresRdfEngine.d.ts +1 -0
  98. package/dist/storage/rdf/PostgresRdfEngine.js +53 -37
  99. package/dist/storage/rdf/PostgresRdfEngine.js.map +1 -1
  100. package/dist/storage/rdf/PostgresRdfEngine.jsonld +4 -0
  101. package/dist/test-utils/index.d.ts +2 -0
  102. package/dist/test-utils/index.js +3 -1
  103. package/dist/test-utils/index.js.map +1 -1
  104. package/dist/test-utils/local-managed-client-p2p-e2e-smoke.d.ts +63 -0
  105. package/dist/test-utils/local-managed-client-p2p-e2e-smoke.js +478 -0
  106. package/dist/test-utils/local-managed-client-p2p-e2e-smoke.js.map +1 -0
  107. package/package.json +11 -4
  108. package/static/app/assets/_commonjsHelpers-B-UnjaXt.js +1 -0
  109. package/static/app/assets/index-AaQ1qxhy.js +171 -0
  110. package/static/app/assets/inrupt-smoke.js +131 -0
  111. package/static/app/assets/main.css +1 -0
  112. package/static/app/assets/main.js +6 -6
  113. package/static/app/index.html +2 -1
  114. package/static/app/inrupt-smoke.html +14 -0
  115. package/static/app/reachability.html +221 -0
  116. package/static/app/reachability.svg +7 -0
  117. package/static/app/reachability.webmanifest +18 -0
  118. package/static/app/signal-pod.html +293 -0
  119. package/static/app/assets/index.css +0 -1
@@ -25,8 +25,7 @@ class EdgeNodeAgentInitializer extends community_server_1.Initializer {
25
25
  // 运行时严格校验参数
26
26
  this.validateOptions(this.options);
27
27
  try {
28
- // 此时已确认 options 符合 EdgeNodeAgentOptions (去除 Partial)
29
- await this.agent.start(this.options);
28
+ await this.agent.start(this.buildAgentOptions(this.options));
30
29
  this.logger.info(`EdgeNodeAgent started (Node: ${this.options.nodeId})`);
31
30
  }
32
31
  catch (error) {
@@ -45,10 +44,38 @@ class EdgeNodeAgentInitializer extends community_server_1.Initializer {
45
44
  missing.push('nodeId');
46
45
  if (!options.nodeToken)
47
46
  missing.push('nodeToken');
47
+ if (this.normalizeBoolean(options.p2pEnabled) && !options.p2pTargetBaseUrl) {
48
+ missing.push('p2pTargetBaseUrl');
49
+ }
48
50
  if (missing.length > 0) {
49
51
  throw new Error(`EdgeNodeAgent enabled but missing required configuration: ${missing.join(', ')}`);
50
52
  }
51
53
  }
54
+ buildAgentOptions(options) {
55
+ const p2pEnabled = this.normalizeBoolean(options.p2pEnabled);
56
+ return {
57
+ signalEndpoint: options.signalEndpoint,
58
+ nodeId: options.nodeId,
59
+ nodeToken: options.nodeToken,
60
+ baseUrl: options.baseUrl,
61
+ directCandidates: options.directCandidates,
62
+ pods: options.pods,
63
+ includeSystemMetrics: options.includeSystemMetrics,
64
+ enableNetworkDetection: options.enableNetworkDetection,
65
+ metadata: options.metadata,
66
+ intervalMs: this.normalizePositiveInteger(options.intervalMs),
67
+ ...(p2pEnabled ? {
68
+ p2p: {
69
+ enabled: true,
70
+ targetBaseUrl: options.p2pTargetBaseUrl,
71
+ label: options.p2pLabel,
72
+ acceptIntervalMs: this.normalizePositiveInteger(options.p2pAcceptIntervalMs),
73
+ connectTimeoutMs: this.normalizePositiveInteger(options.p2pConnectTimeoutMs),
74
+ winnerSelectionWindowMs: this.normalizeNonNegativeInteger(options.p2pWinnerSelectionWindowMs),
75
+ },
76
+ } : {}),
77
+ };
78
+ }
52
79
  normalizeBoolean(value) {
53
80
  if (typeof value === 'boolean') {
54
81
  return value;
@@ -59,6 +86,30 @@ class EdgeNodeAgentInitializer extends community_server_1.Initializer {
59
86
  }
60
87
  return false;
61
88
  }
89
+ normalizePositiveInteger(value) {
90
+ if (typeof value === 'number' && Number.isFinite(value) && value > 0) {
91
+ return value;
92
+ }
93
+ if (typeof value === 'string') {
94
+ const parsed = Number(value);
95
+ if (Number.isFinite(parsed) && parsed > 0) {
96
+ return parsed;
97
+ }
98
+ }
99
+ return undefined;
100
+ }
101
+ normalizeNonNegativeInteger(value) {
102
+ if (typeof value === 'number' && Number.isFinite(value) && value >= 0) {
103
+ return Math.floor(value);
104
+ }
105
+ if (typeof value === 'string') {
106
+ const parsed = Number(value);
107
+ if (Number.isFinite(parsed) && parsed >= 0) {
108
+ return Math.floor(parsed);
109
+ }
110
+ }
111
+ return undefined;
112
+ }
62
113
  }
63
114
  exports.EdgeNodeAgentInitializer = EdgeNodeAgentInitializer;
64
115
  //# sourceMappingURL=EdgeNodeAgentInitializer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EdgeNodeAgentInitializer.js","sourceRoot":"","sources":["../../src/edge/EdgeNodeAgentInitializer.ts"],"names":[],"mappings":";;;AAAA,8DAAsD;AACtD,iEAAqD;AACrD,mDAA2E;AAS3E;;;GAGG;AACH,MAAa,wBAAyB,SAAQ,8BAAW;IAMvD,YAAmB,OAAwC;QACzD,KAAK,EAAE,CAAC;QANS,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAO7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,IAAI,6BAAa,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAEe,KAAK,CAAC,MAAM;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAE9C,YAAY;QACZ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnC,IAAI,CAAC;YACH,qDAAqD;YACrD,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAA+B,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAmC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAChF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,OAAwC;QAC9D,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,CAAC,OAAO,CAAC,cAAc;YAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAElD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,6DAA6D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,KAAmC;QAC1D,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC9C,OAAO,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,IAAI,CAAC;QACpG,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA3DD,4DA2DC","sourcesContent":["import { Initializer } from '@solid/community-server';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { EdgeNodeAgent, type EdgeNodeAgentOptions } from './EdgeNodeAgent';\n\n/**\n * 所有配置项设为可选,以便在 disabled 状态下即使缺少 CLI 变量也能成功实例化。\n */\nexport interface EdgeNodeAgentInitializerOptions extends Partial<EdgeNodeAgentOptions> {\n enabled?: boolean | string;\n}\n\n/**\n * Initializer that starts the EdgeNodeAgent.\n * Designed to be safe to configure even when disabled or missing dependent variables.\n */\nexport class EdgeNodeAgentInitializer extends Initializer {\n protected readonly logger = getLoggerFor(this);\n private readonly agent: EdgeNodeAgent;\n private readonly options: EdgeNodeAgentInitializerOptions;\n private readonly enabled: boolean;\n\n public constructor(options: EdgeNodeAgentInitializerOptions) {\n super();\n this.options = options;\n this.agent = new EdgeNodeAgent();\n this.enabled = this.normalizeBoolean(options.enabled);\n }\n\n public override async handle(): Promise<void> {\n if (!this.enabled) {\n this.logger.debug('EdgeNodeAgent is disabled, skipping startup.');\n return;\n }\n\n this.logger.info('Enabling EdgeNodeAgent...');\n \n // 运行时严格校验参数\n this.validateOptions(this.options);\n\n try {\n // 此时已确认 options 符合 EdgeNodeAgentOptions (去除 Partial)\n await this.agent.start(this.options as EdgeNodeAgentOptions);\n this.logger.info(`EdgeNodeAgent started (Node: ${this.options.nodeId})`);\n } catch (error: unknown) {\n this.logger.error(`Failed to start EdgeNodeAgent: ${(error as Error).message}`);\n throw error;\n }\n }\n\n /**\n * 确保启用时必需参数存在\n */\n private validateOptions(options: EdgeNodeAgentInitializerOptions): asserts options is EdgeNodeAgentOptions {\n const missing: string[] = [];\n \n if (!options.signalEndpoint) missing.push('signalEndpoint');\n if (!options.nodeId) missing.push('nodeId');\n if (!options.nodeToken) missing.push('nodeToken');\n\n if (missing.length > 0) {\n throw new Error(`EdgeNodeAgent enabled but missing required configuration: ${missing.join(', ')}`);\n }\n }\n\n private normalizeBoolean(value: string | boolean | undefined): 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"]}
1
+ {"version":3,"file":"EdgeNodeAgentInitializer.js","sourceRoot":"","sources":["../../src/edge/EdgeNodeAgentInitializer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Initializer } from '@solid/community-server';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { EdgeNodeAgent, type EdgeNodeAgentOptions } from './EdgeNodeAgent';\n\n/**\n * 所有配置项设为可选,以便在 disabled 状态下即使缺少 CLI 变量也能成功实例化。\n */\nexport interface EdgeNodeAgentInitializerOptions {\n enabled?: boolean | string;\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 | string;\n p2pEnabled?: boolean | string;\n p2pTargetBaseUrl?: string;\n p2pLabel?: string;\n p2pAcceptIntervalMs?: number | string;\n p2pConnectTimeoutMs?: number | string;\n p2pWinnerSelectionWindowMs?: number | string;\n}\n\n/**\n * Initializer that starts the EdgeNodeAgent.\n * Designed to be safe to configure even when disabled or missing dependent variables.\n */\nexport class EdgeNodeAgentInitializer extends Initializer {\n protected readonly logger = getLoggerFor(this);\n private readonly agent: EdgeNodeAgent;\n private readonly options: EdgeNodeAgentInitializerOptions;\n private readonly enabled: boolean;\n\n public constructor(options: EdgeNodeAgentInitializerOptions) {\n super();\n this.options = options;\n this.agent = new EdgeNodeAgent();\n this.enabled = this.normalizeBoolean(options.enabled);\n }\n\n public override async handle(): Promise<void> {\n if (!this.enabled) {\n this.logger.debug('EdgeNodeAgent is disabled, skipping startup.');\n return;\n }\n\n this.logger.info('Enabling EdgeNodeAgent...');\n \n // 运行时严格校验参数\n this.validateOptions(this.options);\n\n try {\n await this.agent.start(this.buildAgentOptions(this.options));\n this.logger.info(`EdgeNodeAgent started (Node: ${this.options.nodeId})`);\n } catch (error: unknown) {\n this.logger.error(`Failed to start EdgeNodeAgent: ${(error as Error).message}`);\n throw error;\n }\n }\n\n /**\n * 确保启用时必需参数存在\n */\n private validateOptions(options: EdgeNodeAgentInitializerOptions): void {\n const missing: string[] = [];\n \n if (!options.signalEndpoint) missing.push('signalEndpoint');\n if (!options.nodeId) missing.push('nodeId');\n if (!options.nodeToken) missing.push('nodeToken');\n if (this.normalizeBoolean(options.p2pEnabled) && !options.p2pTargetBaseUrl) {\n missing.push('p2pTargetBaseUrl');\n }\n\n if (missing.length > 0) {\n throw new Error(`EdgeNodeAgent enabled but missing required configuration: ${missing.join(', ')}`);\n }\n }\n\n private buildAgentOptions(options: EdgeNodeAgentInitializerOptions): EdgeNodeAgentOptions {\n const p2pEnabled = this.normalizeBoolean(options.p2pEnabled);\n return {\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 includeSystemMetrics: options.includeSystemMetrics,\n enableNetworkDetection: options.enableNetworkDetection,\n metadata: options.metadata,\n intervalMs: this.normalizePositiveInteger(options.intervalMs),\n ...(p2pEnabled ? {\n p2p: {\n enabled: true,\n targetBaseUrl: options.p2pTargetBaseUrl!,\n label: options.p2pLabel,\n acceptIntervalMs: this.normalizePositiveInteger(options.p2pAcceptIntervalMs),\n connectTimeoutMs: this.normalizePositiveInteger(options.p2pConnectTimeoutMs),\n winnerSelectionWindowMs: this.normalizeNonNegativeInteger(options.p2pWinnerSelectionWindowMs),\n },\n } : {}),\n };\n }\n\n private normalizeBoolean(value: string | boolean | undefined): 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 normalizePositiveInteger(value: number | string | undefined): 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 normalizeNonNegativeInteger(value: number | string | undefined): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value) && value >= 0) {\n return Math.floor(value);\n }\n if (typeof value === 'string') {\n const parsed = Number(value);\n if (Number.isFinite(parsed) && parsed >= 0) {\n return Math.floor(parsed);\n }\n }\n return undefined;\n }\n}\n"]}
@@ -0,0 +1,409 @@
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/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer",
10
+ "@type": "Class",
11
+ "requireElement": "EdgeNodeAgentInitializer",
12
+ "extends": [
13
+ "css:dist/init/Initializer.jsonld#Initializer"
14
+ ],
15
+ "comment": "Initializer that starts the EdgeNodeAgent. Designed to be safe to configure even when disabled or missing dependent variables.",
16
+ "parameters": [
17
+ {
18
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_enabled",
19
+ "range": {
20
+ "@type": "ParameterRangeUnion",
21
+ "parameterRangeElements": [
22
+ "xsd:boolean",
23
+ "xsd:string",
24
+ {
25
+ "@type": "ParameterRangeUndefined"
26
+ }
27
+ ]
28
+ }
29
+ },
30
+ {
31
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_signalEndpoint",
32
+ "range": {
33
+ "@type": "ParameterRangeUnion",
34
+ "parameterRangeElements": [
35
+ "xsd:string",
36
+ {
37
+ "@type": "ParameterRangeUndefined"
38
+ }
39
+ ]
40
+ }
41
+ },
42
+ {
43
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_nodeId",
44
+ "range": {
45
+ "@type": "ParameterRangeUnion",
46
+ "parameterRangeElements": [
47
+ "xsd:string",
48
+ {
49
+ "@type": "ParameterRangeUndefined"
50
+ }
51
+ ]
52
+ }
53
+ },
54
+ {
55
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_nodeToken",
56
+ "range": {
57
+ "@type": "ParameterRangeUnion",
58
+ "parameterRangeElements": [
59
+ "xsd:string",
60
+ {
61
+ "@type": "ParameterRangeUndefined"
62
+ }
63
+ ]
64
+ }
65
+ },
66
+ {
67
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_baseUrl",
68
+ "range": {
69
+ "@type": "ParameterRangeUnion",
70
+ "parameterRangeElements": [
71
+ "xsd:string",
72
+ {
73
+ "@type": "ParameterRangeUndefined"
74
+ }
75
+ ]
76
+ }
77
+ },
78
+ {
79
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_directCandidates",
80
+ "range": {
81
+ "@type": "ParameterRangeUnion",
82
+ "parameterRangeElements": [
83
+ "xsd:string",
84
+ {
85
+ "@type": "ParameterRangeArray",
86
+ "parameterRangeValue": "xsd:string"
87
+ },
88
+ {
89
+ "@type": "ParameterRangeUndefined"
90
+ }
91
+ ]
92
+ }
93
+ },
94
+ {
95
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_pods",
96
+ "range": {
97
+ "@type": "ParameterRangeUnion",
98
+ "parameterRangeElements": [
99
+ {
100
+ "@type": "ParameterRangeArray",
101
+ "parameterRangeValue": "xsd:string"
102
+ },
103
+ {
104
+ "@type": "ParameterRangeUndefined"
105
+ }
106
+ ]
107
+ }
108
+ },
109
+ {
110
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_includeSystemMetrics",
111
+ "range": {
112
+ "@type": "ParameterRangeUnion",
113
+ "parameterRangeElements": [
114
+ "xsd:boolean",
115
+ {
116
+ "@type": "ParameterRangeUndefined"
117
+ }
118
+ ]
119
+ }
120
+ },
121
+ {
122
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_enableNetworkDetection",
123
+ "range": {
124
+ "@type": "ParameterRangeUnion",
125
+ "parameterRangeElements": [
126
+ "xsd:boolean",
127
+ {
128
+ "@type": "ParameterRangeUndefined"
129
+ }
130
+ ]
131
+ }
132
+ },
133
+ {
134
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_metadata",
135
+ "range": {
136
+ "@type": "ParameterRangeCollectEntries",
137
+ "parameterRangeCollectEntriesParameters": [
138
+ {
139
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_metadata_key"
140
+ },
141
+ {
142
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_metadata_value",
143
+ "range": {
144
+ "@type": "ParameterRangeWildcard"
145
+ }
146
+ }
147
+ ]
148
+ }
149
+ },
150
+ {
151
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_intervalMs",
152
+ "range": {
153
+ "@type": "ParameterRangeUnion",
154
+ "parameterRangeElements": [
155
+ "xsd:number",
156
+ "xsd:string",
157
+ {
158
+ "@type": "ParameterRangeUndefined"
159
+ }
160
+ ]
161
+ }
162
+ },
163
+ {
164
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pEnabled",
165
+ "range": {
166
+ "@type": "ParameterRangeUnion",
167
+ "parameterRangeElements": [
168
+ "xsd:boolean",
169
+ "xsd:string",
170
+ {
171
+ "@type": "ParameterRangeUndefined"
172
+ }
173
+ ]
174
+ }
175
+ },
176
+ {
177
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pTargetBaseUrl",
178
+ "range": {
179
+ "@type": "ParameterRangeUnion",
180
+ "parameterRangeElements": [
181
+ "xsd:string",
182
+ {
183
+ "@type": "ParameterRangeUndefined"
184
+ }
185
+ ]
186
+ }
187
+ },
188
+ {
189
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pLabel",
190
+ "range": {
191
+ "@type": "ParameterRangeUnion",
192
+ "parameterRangeElements": [
193
+ "xsd:string",
194
+ {
195
+ "@type": "ParameterRangeUndefined"
196
+ }
197
+ ]
198
+ }
199
+ },
200
+ {
201
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pAcceptIntervalMs",
202
+ "range": {
203
+ "@type": "ParameterRangeUnion",
204
+ "parameterRangeElements": [
205
+ "xsd:number",
206
+ "xsd:string",
207
+ {
208
+ "@type": "ParameterRangeUndefined"
209
+ }
210
+ ]
211
+ }
212
+ },
213
+ {
214
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pConnectTimeoutMs",
215
+ "range": {
216
+ "@type": "ParameterRangeUnion",
217
+ "parameterRangeElements": [
218
+ "xsd:number",
219
+ "xsd:string",
220
+ {
221
+ "@type": "ParameterRangeUndefined"
222
+ }
223
+ ]
224
+ }
225
+ },
226
+ {
227
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pWinnerSelectionWindowMs",
228
+ "range": {
229
+ "@type": "ParameterRangeUnion",
230
+ "parameterRangeElements": [
231
+ "xsd:number",
232
+ "xsd:string",
233
+ {
234
+ "@type": "ParameterRangeUndefined"
235
+ }
236
+ ]
237
+ }
238
+ }
239
+ ],
240
+ "memberFields": [
241
+ {
242
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer__member_logger",
243
+ "memberFieldName": "logger",
244
+ "range": {
245
+ "@type": "ParameterRangeWildcard"
246
+ }
247
+ },
248
+ {
249
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer__member_agent",
250
+ "memberFieldName": "agent"
251
+ },
252
+ {
253
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer__member_options",
254
+ "memberFieldName": "options"
255
+ },
256
+ {
257
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer__member_enabled",
258
+ "memberFieldName": "enabled"
259
+ },
260
+ {
261
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer__member_constructor",
262
+ "memberFieldName": "constructor"
263
+ },
264
+ {
265
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer__member_handle",
266
+ "memberFieldName": "handle"
267
+ },
268
+ {
269
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer__member_validateOptions",
270
+ "memberFieldName": "validateOptions"
271
+ },
272
+ {
273
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer__member_buildAgentOptions",
274
+ "memberFieldName": "buildAgentOptions"
275
+ },
276
+ {
277
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer__member_normalizeBoolean",
278
+ "memberFieldName": "normalizeBoolean"
279
+ },
280
+ {
281
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer__member_normalizePositiveInteger",
282
+ "memberFieldName": "normalizePositiveInteger"
283
+ },
284
+ {
285
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer__member_normalizeNonNegativeInteger",
286
+ "memberFieldName": "normalizeNonNegativeInteger"
287
+ }
288
+ ],
289
+ "constructorArguments": [
290
+ {
291
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options__constructorArgument",
292
+ "fields": [
293
+ {
294
+ "keyRaw": "enabled",
295
+ "value": {
296
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_enabled"
297
+ }
298
+ },
299
+ {
300
+ "keyRaw": "signalEndpoint",
301
+ "value": {
302
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_signalEndpoint"
303
+ }
304
+ },
305
+ {
306
+ "keyRaw": "nodeId",
307
+ "value": {
308
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_nodeId"
309
+ }
310
+ },
311
+ {
312
+ "keyRaw": "nodeToken",
313
+ "value": {
314
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_nodeToken"
315
+ }
316
+ },
317
+ {
318
+ "keyRaw": "baseUrl",
319
+ "value": {
320
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_baseUrl"
321
+ }
322
+ },
323
+ {
324
+ "keyRaw": "directCandidates",
325
+ "value": {
326
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_directCandidates"
327
+ }
328
+ },
329
+ {
330
+ "keyRaw": "pods",
331
+ "value": {
332
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_pods"
333
+ }
334
+ },
335
+ {
336
+ "keyRaw": "includeSystemMetrics",
337
+ "value": {
338
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_includeSystemMetrics"
339
+ }
340
+ },
341
+ {
342
+ "keyRaw": "enableNetworkDetection",
343
+ "value": {
344
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_enableNetworkDetection"
345
+ }
346
+ },
347
+ {
348
+ "keyRaw": "metadata",
349
+ "value": {
350
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_metadata__constructorArgument",
351
+ "fields": [
352
+ {
353
+ "collectEntries": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_metadata",
354
+ "key": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_metadata_key",
355
+ "value": {
356
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_metadata_value"
357
+ }
358
+ }
359
+ ]
360
+ }
361
+ },
362
+ {
363
+ "keyRaw": "intervalMs",
364
+ "value": {
365
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_intervalMs"
366
+ }
367
+ },
368
+ {
369
+ "keyRaw": "p2pEnabled",
370
+ "value": {
371
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pEnabled"
372
+ }
373
+ },
374
+ {
375
+ "keyRaw": "p2pTargetBaseUrl",
376
+ "value": {
377
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pTargetBaseUrl"
378
+ }
379
+ },
380
+ {
381
+ "keyRaw": "p2pLabel",
382
+ "value": {
383
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pLabel"
384
+ }
385
+ },
386
+ {
387
+ "keyRaw": "p2pAcceptIntervalMs",
388
+ "value": {
389
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pAcceptIntervalMs"
390
+ }
391
+ },
392
+ {
393
+ "keyRaw": "p2pConnectTimeoutMs",
394
+ "value": {
395
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pConnectTimeoutMs"
396
+ }
397
+ },
398
+ {
399
+ "keyRaw": "p2pWinnerSelectionWindowMs",
400
+ "value": {
401
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pWinnerSelectionWindowMs"
402
+ }
403
+ }
404
+ ]
405
+ }
406
+ ]
407
+ }
408
+ ]
409
+ }
@@ -0,0 +1,7 @@
1
+ import type { AccessRoute } from './types';
2
+ export interface CanonicalFetchOptions {
3
+ route: AccessRoute;
4
+ fetchImpl?: typeof fetch;
5
+ }
6
+ export type CanonicalFetch = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
7
+ export declare function createCanonicalFetch(options: CanonicalFetchOptions): CanonicalFetch;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCanonicalFetch = createCanonicalFetch;
4
+ function createCanonicalFetch(options) {
5
+ const fetchImpl = options.fetchImpl ?? fetch;
6
+ const route = options.route;
7
+ const canonicalOrigin = new URL(route.canonicalUrl).origin;
8
+ const targetBase = new URL(route.targetUrl);
9
+ return async (input, init) => {
10
+ const request = input instanceof Request ? input : undefined;
11
+ const canonicalUrl = new URL(request?.url ?? input.toString());
12
+ if (canonicalUrl.origin !== canonicalOrigin) {
13
+ throw new Error(`Request ${canonicalUrl.toString()} is outside canonical origin ${canonicalOrigin}`);
14
+ }
15
+ const targetUrl = rewriteTargetUrl(targetBase, canonicalUrl);
16
+ const headers = new Headers(request?.headers ?? undefined);
17
+ const initHeaders = new Headers(init?.headers ?? undefined);
18
+ initHeaders.forEach((value, key) => headers.set(key, value));
19
+ headers.set('x-xpod-canonical-url', canonicalUrl.toString());
20
+ headers.set('x-xpod-canonical-origin', canonicalOrigin);
21
+ headers.set('x-xpod-canonical-host', canonicalUrl.host);
22
+ const nextInit = {
23
+ ...init,
24
+ method: init?.method ?? request?.method ?? 'GET',
25
+ headers,
26
+ body: init?.body ?? requestBody(request),
27
+ signal: init?.signal ?? request?.signal,
28
+ };
29
+ return fetchImpl(targetUrl, nextInit);
30
+ };
31
+ }
32
+ function rewriteTargetUrl(targetBase, canonicalUrl) {
33
+ const basePath = targetBase.pathname.endsWith('/')
34
+ ? targetBase.pathname.slice(0, -1)
35
+ : targetBase.pathname;
36
+ const targetPath = `${basePath}${canonicalUrl.pathname}`.replace(/\/+/gu, '/');
37
+ const target = new URL(targetBase.toString());
38
+ target.pathname = targetPath;
39
+ target.search = canonicalUrl.search;
40
+ target.hash = '';
41
+ return target.toString();
42
+ }
43
+ function requestBody(request) {
44
+ if (!request || request.method === 'GET' || request.method === 'HEAD') {
45
+ return undefined;
46
+ }
47
+ return request.body;
48
+ }
49
+ //# sourceMappingURL=CanonicalFetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CanonicalFetch.js","sourceRoot":"","sources":["../../../src/edge/reachability/CanonicalFetch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccessRoute } from './types';\n\nexport interface CanonicalFetchOptions {\n route: AccessRoute;\n fetchImpl?: typeof fetch;\n}\n\nexport type CanonicalFetch = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\nexport function createCanonicalFetch(options: CanonicalFetchOptions): CanonicalFetch {\n const fetchImpl = options.fetchImpl ?? fetch;\n const route = options.route;\n const canonicalOrigin = new URL(route.canonicalUrl).origin;\n const targetBase = new URL(route.targetUrl);\n\n return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const request = input instanceof Request ? input : undefined;\n const canonicalUrl = new URL(request?.url ?? input.toString());\n if (canonicalUrl.origin !== canonicalOrigin) {\n throw new Error(`Request ${canonicalUrl.toString()} is outside canonical origin ${canonicalOrigin}`);\n }\n\n const targetUrl = rewriteTargetUrl(targetBase, canonicalUrl);\n const headers = new Headers(request?.headers ?? undefined);\n const initHeaders = new Headers(init?.headers ?? undefined);\n initHeaders.forEach((value, key) => headers.set(key, value));\n headers.set('x-xpod-canonical-url', canonicalUrl.toString());\n headers.set('x-xpod-canonical-origin', canonicalOrigin);\n headers.set('x-xpod-canonical-host', canonicalUrl.host);\n\n const nextInit: RequestInit = {\n ...init,\n method: init?.method ?? request?.method ?? 'GET',\n headers,\n body: init?.body ?? requestBody(request),\n signal: init?.signal ?? request?.signal,\n };\n return fetchImpl(targetUrl, nextInit);\n };\n}\n\nfunction rewriteTargetUrl(targetBase: URL, canonicalUrl: URL): string {\n const basePath = targetBase.pathname.endsWith('/')\n ? targetBase.pathname.slice(0, -1)\n : targetBase.pathname;\n const targetPath = `${basePath}${canonicalUrl.pathname}`.replace(/\\/+/gu, '/');\n const target = new URL(targetBase.toString());\n target.pathname = targetPath;\n target.search = canonicalUrl.search;\n target.hash = '';\n return target.toString();\n}\n\nfunction requestBody(request?: Request): BodyInit | null | undefined {\n if (!request || request.method === 'GET' || request.method === 'HEAD') {\n return undefined;\n }\n return request.body as unknown as BodyInit | null | undefined;\n}\n"]}
@@ -0,0 +1,25 @@
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/edge/reachability/CanonicalFetch.jsonld#CanonicalFetchOptions",
9
+ "@type": "AbstractClass",
10
+ "requireElement": "CanonicalFetchOptions",
11
+ "parameters": [],
12
+ "memberFields": [
13
+ {
14
+ "@id": "undefineds:dist/edge/reachability/CanonicalFetch.jsonld#CanonicalFetchOptions__member_route",
15
+ "memberFieldName": "route"
16
+ },
17
+ {
18
+ "@id": "undefineds:dist/edge/reachability/CanonicalFetch.jsonld#CanonicalFetchOptions__member_fetchImpl",
19
+ "memberFieldName": "fetchImpl"
20
+ }
21
+ ],
22
+ "constructorArguments": []
23
+ }
24
+ ]
25
+ }
@@ -0,0 +1,26 @@
1
+ import { type CanonicalFetch } from './CanonicalFetch';
2
+ import { type ConnectSignaledRawTcpP2PTransportOptions } from './TcpP2PSignalingSession';
3
+ import type { AccessRoute, RouteSet } from './types';
4
+ type ManagedClientP2POptions = Omit<ConnectSignaledRawTcpP2PTransportOptions, 'signaling' | 'clientId'> & Pick<ConnectSignaledRawTcpP2PTransportOptions, 'signaling' | 'clientId'>;
5
+ type SignaledManagedClientP2POptions = Omit<ManagedClientP2POptions, 'signaling' | 'clientId'>;
6
+ export interface ManagedClientFetchOptions {
7
+ routeSet: RouteSet;
8
+ fetchImpl?: typeof fetch;
9
+ probe?: (route: AccessRoute, signal: AbortSignal) => Promise<boolean> | boolean;
10
+ probeTimeoutMs?: number;
11
+ p2p?: ManagedClientP2POptions;
12
+ }
13
+ export interface ManagedClientFetch {
14
+ route: AccessRoute;
15
+ fetch: CanonicalFetch;
16
+ close(): void;
17
+ }
18
+ export interface SignaledManagedClientFetchOptions extends Omit<ManagedClientFetchOptions, 'routeSet' | 'p2p'>, SignaledManagedClientP2POptions {
19
+ apiBaseUrl: string;
20
+ nodeId: string;
21
+ token?: string;
22
+ clientId: string;
23
+ }
24
+ export declare function createSignaledManagedClientFetch(options: SignaledManagedClientFetchOptions): Promise<ManagedClientFetch>;
25
+ export declare function createManagedClientFetch(options: ManagedClientFetchOptions): Promise<ManagedClientFetch>;
26
+ export {};