@undefineds.co/xpod 0.3.55 → 0.3.57

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 (60) hide show
  1. package/dist/api/container/index.js +3 -0
  2. package/dist/api/container/index.js.map +1 -1
  3. package/dist/api/container/local.js +53 -13
  4. package/dist/api/container/local.js.map +1 -1
  5. package/dist/api/container/types.d.ts +6 -0
  6. package/dist/api/container/types.js.map +1 -1
  7. package/dist/api/handlers/AdminHandler.d.ts +15 -0
  8. package/dist/api/handlers/AdminHandler.js +128 -7
  9. package/dist/api/handlers/AdminHandler.js.map +1 -1
  10. package/dist/cli/commands/obj.d.ts +36 -0
  11. package/dist/cli/commands/obj.js +235 -30
  12. package/dist/cli/commands/obj.js.map +1 -1
  13. package/dist/components/components.jsonld +1 -0
  14. package/dist/components/context.jsonld +36 -0
  15. package/dist/edge/DdnsManager.d.ts +1 -1
  16. package/dist/edge/DdnsManager.js.map +1 -1
  17. package/dist/edge/reachability/P2PRealnetAcceptance.js +4 -3
  18. package/dist/edge/reachability/P2PRealnetAcceptance.js.map +1 -1
  19. package/dist/edge/reachability/TcpP2PSignalingSession.js +26 -17
  20. package/dist/edge/reachability/TcpP2PSignalingSession.js.map +1 -1
  21. package/dist/index.d.ts +2 -1
  22. package/dist/index.js +3 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/tunnel/NgrokTunnelProvider.d.ts +46 -0
  25. package/dist/tunnel/NgrokTunnelProvider.js +344 -0
  26. package/dist/tunnel/NgrokTunnelProvider.js.map +1 -0
  27. package/dist/tunnel/NgrokTunnelProvider.jsonld +215 -0
  28. package/dist/tunnel/TunnelProvider.d.ts +2 -2
  29. package/dist/tunnel/TunnelProvider.js.map +1 -1
  30. package/dist/tunnel/index.d.ts +1 -0
  31. package/dist/tunnel/index.js +3 -1
  32. package/dist/tunnel/index.js.map +1 -1
  33. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts +62 -0
  34. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts.map +1 -1
  35. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js +197 -0
  36. package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js.map +1 -1
  37. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts +62 -0
  38. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts.map +1 -1
  39. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js +197 -0
  40. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js.map +1 -1
  41. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts.map +1 -1
  42. package/node_modules/@undefineds.co/drizzle-solid/dist/pod.d.ts.map +1 -1
  43. package/node_modules/@undefineds.co/drizzle-solid/package.json +1 -1
  44. package/package.json +10 -6
  45. package/static/app/assets/{index-AaQ1qxhy.js → index-C1yksyT4.js} +28 -28
  46. package/static/app/assets/inrupt-smoke.js +2 -2
  47. package/static/app/assets/main.css +1 -1
  48. package/static/app/assets/main.js +10 -50
  49. package/static/app/auth.html +1 -1
  50. package/static/dashboard/assets/dashboard-BssaVKTn.css +1 -0
  51. package/static/dashboard/assets/dashboard-Ckuadl3C.js +54 -0
  52. package/static/dashboard/auth.html +1 -1
  53. package/static/dashboard/dashboard.html +2 -2
  54. package/static/dashboard/reachability.html +221 -0
  55. package/static/dashboard/reachability.svg +7 -0
  56. package/static/dashboard/reachability.webmanifest +18 -0
  57. package/static/dashboard/signal-pod.html +293 -0
  58. package/static/landing/index.html +1 -1
  59. package/static/dashboard/assets/dashboard-CTk9cn1-.js +0 -52
  60. package/static/dashboard/assets/dashboard-VQRsvXx9.css +0 -1
@@ -7,9 +7,10 @@ function createP2PRealnetAcceptancePlan(options) {
7
7
  const apiBaseUrl = ensureTrailingSlash(options.apiBaseUrl);
8
8
  const signalEndpoint = new URL('/v1/signal', apiBaseUrl).toString();
9
9
  const nodeCommand = compactCommand([
10
- 'bun',
11
- 'run',
12
- 'smoke:p2p:node-accept',
10
+ 'node',
11
+ '-r',
12
+ 'ts-node/register',
13
+ 'scripts/edge-node-p2p-accept-smoke.ts',
13
14
  '--signal-endpoint',
14
15
  signalEndpoint,
15
16
  '--node-id',
@@ -1 +1 @@
1
- {"version":3,"file":"P2PRealnetAcceptance.js","sourceRoot":"","sources":["../../../src/edge/reachability/P2PRealnetAcceptance.ts"],"names":[],"mappings":"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","sourcesContent":["export interface P2PRealnetAcceptancePlanOptions {\n apiBaseUrl: string;\n nodeId: string;\n nodeToken: string;\n baseUrl: string;\n targetBaseUrl: string;\n nodeHost?: string;\n nodeAddress?: string;\n nodeLocalAddress?: string;\n clientHost?: string;\n clientAddress?: string;\n clientLocalAddress?: string;\n clientId: string;\n token?: string;\n resourceUrl: string;\n runTimeoutMs?: number;\n connectTimeoutMs?: number;\n waitTimeoutMs?: number;\n requestTimeoutMs?: number;\n pollIntervalMs?: number;\n winnerSelectionWindowMs?: number;\n windowSeconds?: number;\n maxClockErrorSeconds?: number;\n minRunWindowSeconds?: number;\n numPorts?: number;\n basePort?: number;\n portRange?: number;\n}\n\nexport interface P2PRealnetAcceptanceCommand {\n role: 'node' | 'client';\n command: string[];\n shell: string;\n description: string;\n}\n\nexport interface P2PRealnetAcceptanceMobilePlan {\n appLabel: 'LinX P2P Smoke';\n packageName: 'com.linxmobile.p2psmoke';\n fields: {\n idpUrl: string;\n storageUrl: string;\n clientId: string;\n resourcePath: string;\n };\n description: string;\n}\n\nexport interface P2PRealnetAcceptancePlan {\n kind: 'raw-tcp-p2p-realnet-acceptance';\n node: P2PRealnetAcceptanceCommand;\n client: P2PRealnetAcceptanceCommand;\n mobile: P2PRealnetAcceptanceMobilePlan;\n successCriteria: string[];\n routeFallbacksPreserved: string[];\n caveats: string[];\n}\n\nexport interface P2PRealnetAcceptanceVerifyOptions {\n clientId: string;\n expectedStatus?: number;\n expectedPutStatus?: number;\n requirePutStatus2xx?: boolean;\n nodeResult: unknown;\n clientResult: unknown;\n}\n\nexport interface P2PRealnetAcceptanceCheck {\n name: string;\n ok: boolean;\n detail: string;\n}\n\nexport interface P2PRealnetAcceptanceVerification {\n smokeOk: boolean;\n checks: P2PRealnetAcceptanceCheck[];\n routeFallbacksPreserved: string[];\n}\n\nconst FALLBACKS = ['Cloudflare Tunnel', 'FRP/SakuraFRP'] as const;\n\nexport function createP2PRealnetAcceptancePlan(\n options: P2PRealnetAcceptancePlanOptions,\n): P2PRealnetAcceptancePlan {\n const apiBaseUrl = ensureTrailingSlash(options.apiBaseUrl);\n const signalEndpoint = new URL('/v1/signal', apiBaseUrl).toString();\n const nodeCommand = compactCommand([\n 'bun',\n 'run',\n 'smoke:p2p:node-accept',\n '--signal-endpoint',\n signalEndpoint,\n '--node-id',\n options.nodeId,\n '--node-token',\n options.nodeToken,\n '--base-url',\n options.baseUrl,\n '--target-base-url',\n options.targetBaseUrl,\n ...optionalPair('--host', options.nodeHost),\n ...optionalPair('--address', options.nodeAddress),\n ...optionalPair('--local-address', options.nodeLocalAddress),\n ...optionalNumberPair('--connect-timeout-ms', options.connectTimeoutMs),\n ...optionalNumberPair('--winner-selection-window-ms', options.winnerSelectionWindowMs),\n ...optionalNumberPair('--run-timeout-ms', options.runTimeoutMs),\n '--require-accept',\n ]);\n const clientCommand = compactCommand([\n 'bun',\n 'run',\n 'smoke:p2p:managed',\n '--api-base-url',\n apiBaseUrl,\n '--node-id',\n options.nodeId,\n '--client-id',\n options.clientId,\n ...optionalPair('--token', options.token),\n ...optionalPair('--host', options.clientHost),\n ...optionalPair('--address', options.clientAddress),\n ...optionalPair('--local-address', options.clientLocalAddress),\n '--resource-url',\n options.resourceUrl,\n ...optionalNumberPair('--connect-timeout-ms', options.connectTimeoutMs),\n ...optionalNumberPair('--winner-selection-window-ms', options.winnerSelectionWindowMs),\n ...optionalNumberPair('--wait-timeout-ms', options.waitTimeoutMs),\n ...optionalNumberPair('--poll-interval-ms', options.pollIntervalMs),\n ...optionalNumberPair('--request-timeout-ms', options.requestTimeoutMs),\n ...optionalNumberPair('--window-seconds', options.windowSeconds),\n ...optionalNumberPair('--max-clock-error-seconds', options.maxClockErrorSeconds),\n ...optionalNumberPair('--min-run-window-seconds', options.minRunWindowSeconds),\n ...optionalNumberPair('--num-ports', options.numPorts),\n ...optionalNumberPair('--base-port', options.basePort),\n ...optionalNumberPair('--port-range', options.portRange),\n '--require-p2p',\n ]);\n\n return {\n kind: 'raw-tcp-p2p-realnet-acceptance',\n node: {\n role: 'node',\n command: nodeCommand,\n shell: shellQuoteCommand(nodeCommand),\n description: 'Run this on the local node/SP machine that can reach the local CSS/SP target base URL.',\n },\n client: {\n role: 'client',\n command: clientCommand,\n shell: shellQuoteCommand(clientCommand),\n description: 'Run this from a second non-browser runtime on another network/device.',\n },\n mobile: createMobilePlan(options),\n successCriteria: [\n `node accepted at least one raw TCP P2P session for client ${options.clientId}`,\n 'client selected route.kind=p2p and route.id=p2p-raw-tcp',\n 'client emitted a raw TCP connector success event',\n 'client evidence reports clientAddress=signal-observed',\n 'node accepted evidence for the same client reports nodeAddress=signal-observed',\n 'canonical Solid HTTP request returned the expected status over xpod-p2p-http/1',\n 'mobile write/read validation may require both putStatus and status to match expected 2xx values',\n 'both peers may omit host/address and rely on signal-observed address enrichment for port-only candidates',\n 'Cloudflare Tunnel and FRP/SakuraFRP remain available as independent user-tunnel fallback routes',\n ],\n routeFallbacksPreserved: [...FALLBACKS],\n caveats: [\n 'This is for non-browser runtimes only; it does not prove browser P2P because browsers cannot open raw TCP sockets.',\n 'A successful loopback/local smoke is not enough; run the node and client commands from separate network contexts for cross-NAT evidence.',\n 'When host/address is omitted, signal injects the observed address for port-only candidates; observed address discovery does not guarantee NAT reachability.',\n 'Mobile smoke evidence must still be verified with the same realnet verifier; phone USB is only for install/log collection, not the data plane.',\n 'Cloudflare Tunnel and FRP/SakuraFRP remain fallback routes and are not replaced by raw TCP P2P.',\n ],\n };\n}\n\nexport function verifyP2PRealnetAcceptance(\n options: P2PRealnetAcceptanceVerifyOptions,\n): P2PRealnetAcceptanceVerification {\n const node = asRecord(options.nodeResult);\n const client = asRecord(options.clientResult);\n const accepted = Array.isArray(node.accepted) ? node.accepted.filter(asRecord) : [];\n const route = asRecord(client.route);\n const connectorEvents = Array.isArray(client.connectorEvents) ? client.connectorEvents.filter(asRecord) : [];\n const routeFallbacksPreserved = fallbackEvidence(node);\n\n const checks: P2PRealnetAcceptanceCheck[] = [\n {\n name: 'node smoke ok',\n ok: node.smokeOk === true,\n detail: node.smokeOk === true ? 'node runner reported smokeOk=true' : 'node runner did not report smokeOk=true',\n },\n {\n name: 'node accepted client',\n ok: accepted.some((event) => event.clientId === options.clientId),\n detail: accepted.length > 0\n ? `accepted clients: ${accepted.map((event) => String(event.clientId ?? '<unknown>')).join(', ')}`\n : 'node runner accepted no sessions',\n },\n {\n name: 'client smoke ok',\n ok: client.smokeOk === true,\n detail: client.smokeOk === true ? 'client runner reported smokeOk=true' : 'client runner did not report smokeOk=true',\n },\n {\n name: 'client selected p2p route',\n ok: route.kind === 'p2p',\n detail: `client route.kind=${String(route.kind ?? '<missing>')}`,\n },\n {\n name: 'raw tcp connector succeeded',\n ok: connectorEvents.some((event) => event.type === 'success'),\n detail: connectorEvents.length > 0\n ? `connector events: ${connectorEvents.map((event) => String(event.type ?? '<unknown>')).join(', ')}`\n : 'client runner emitted no connector events',\n },\n {\n name: 'client address came from signal',\n ok: client.clientAddress === 'signal-observed',\n detail: `clientAddress=${String(client.clientAddress ?? '<missing>')}`,\n },\n {\n name: 'node address came from signal',\n ok: accepted.some((event) => event.clientId === options.clientId && event.nodeAddress === 'signal-observed'),\n detail: accepted.length > 0\n ? `accepted nodeAddress evidence: ${accepted.map((event) => `${String(event.clientId ?? '<unknown>')}=${String(event.nodeAddress ?? '<missing>')}`).join(', ')}`\n : 'node runner accepted no sessions',\n },\n {\n name: 'expected http status',\n ok: options.expectedStatus === undefined || client.status === options.expectedStatus,\n detail: options.expectedStatus === undefined\n ? 'no expected HTTP status was configured'\n : `client status=${String(client.status ?? '<missing>')}, expected=${options.expectedStatus}`,\n },\n {\n name: 'expected write http status',\n ok: options.expectedPutStatus === undefined || client.putStatus === options.expectedPutStatus,\n detail: options.expectedPutStatus === undefined\n ? 'no expected write HTTP status was configured'\n : `client putStatus=${String(client.putStatus ?? '<missing>')}, expected=${options.expectedPutStatus}`,\n },\n {\n name: 'write http status is 2xx',\n ok: options.requirePutStatus2xx !== true || is2xxStatus(client.putStatus),\n detail: options.requirePutStatus2xx !== true\n ? '2xx write HTTP status was not required'\n : `client putStatus=${String(client.putStatus ?? '<missing>')}`,\n },\n {\n name: 'tunnel fallbacks preserved',\n ok: FALLBACKS.every((fallback) => routeFallbacksPreserved.includes(fallback)),\n detail: `fallback evidence: ${routeFallbacksPreserved.join(', ') || '<none>'}`,\n },\n ];\n\n return {\n smokeOk: checks.every((check) => check.ok),\n checks,\n routeFallbacksPreserved,\n };\n}\n\n\nfunction createMobilePlan(options: P2PRealnetAcceptancePlanOptions): P2PRealnetAcceptanceMobilePlan {\n const resource = new URL(options.resourceUrl);\n const storageUrl = `${resource.origin}/`;\n return {\n appLabel: 'LinX P2P Smoke',\n packageName: 'com.linxmobile.p2psmoke',\n fields: {\n idpUrl: deriveIdpBaseUrlFromApiBaseUrl(options.apiBaseUrl),\n storageUrl,\n clientId: options.clientId,\n resourcePath: resource.pathname,\n },\n description: 'Install/run the mobile smoke package over USB/ADB/HDB/Xcode, log in on-device, and use the same clientId as the node acceptance command. The app obtains auth from its own client session; no signal token is a human input.',\n };\n}\n\nfunction deriveIdpBaseUrlFromApiBaseUrl(apiBaseUrl: string): string {\n const api = new URL(ensureTrailingSlash(apiBaseUrl));\n const labels = api.hostname.split('.');\n if (labels[0] === 'api' && labels.length > 1) {\n labels[0] = 'id';\n }\n return `${api.protocol}//${labels.join('.')}/`;\n}\n\nfunction optionalPair(name: string, value: string | undefined): string[] {\n return value === undefined || value.length === 0 ? [] : [name, value];\n}\n\nfunction optionalNumberPair(name: string, value: number | undefined): string[] {\n return value === undefined ? [] : [name, String(value)];\n}\n\nfunction compactCommand(parts: string[]): string[] {\n return parts.filter((part) => part.length > 0);\n}\n\nfunction shellQuoteCommand(command: string[]): string {\n return command.map(shellQuote).join(' ');\n}\n\nfunction shellQuote(value: string): string {\n if (/^[A-Za-z0-9_./:=@+-]+$/u.test(value)) {\n return value;\n }\n return `'${value.replace(/'/gu, `'\\\\''`)}'`;\n}\n\nfunction ensureTrailingSlash(value: string): string {\n return value.endsWith('/') ? value : `${value}/`;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n\nfunction is2xxStatus(value: unknown): boolean {\n return typeof value === 'number' && Number.isInteger(value) && value >= 200 && value <= 299;\n}\n\nfunction fallbackEvidence(node: Record<string, unknown>): string[] {\n const explicit = Array.isArray(node.routeFallbacksPreserved)\n ? node.routeFallbacksPreserved.filter((value): value is string => typeof value === 'string')\n : [];\n const caveats = Array.isArray(node.caveats)\n ? node.caveats.filter((value): value is string => typeof value === 'string').join('\\n')\n : '';\n return [...new Set([\n ...explicit,\n ...FALLBACKS.filter((fallback) => caveats.includes(fallback)),\n ])];\n}\n"]}
1
+ {"version":3,"file":"P2PRealnetAcceptance.js","sourceRoot":"","sources":["../../../src/edge/reachability/P2PRealnetAcceptance.ts"],"names":[],"mappings":"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","sourcesContent":["export interface P2PRealnetAcceptancePlanOptions {\n apiBaseUrl: string;\n nodeId: string;\n nodeToken: string;\n baseUrl: string;\n targetBaseUrl: string;\n nodeHost?: string;\n nodeAddress?: string;\n nodeLocalAddress?: string;\n clientHost?: string;\n clientAddress?: string;\n clientLocalAddress?: string;\n clientId: string;\n token?: string;\n resourceUrl: string;\n runTimeoutMs?: number;\n connectTimeoutMs?: number;\n waitTimeoutMs?: number;\n requestTimeoutMs?: number;\n pollIntervalMs?: number;\n winnerSelectionWindowMs?: number;\n windowSeconds?: number;\n maxClockErrorSeconds?: number;\n minRunWindowSeconds?: number;\n numPorts?: number;\n basePort?: number;\n portRange?: number;\n}\n\nexport interface P2PRealnetAcceptanceCommand {\n role: 'node' | 'client';\n command: string[];\n shell: string;\n description: string;\n}\n\nexport interface P2PRealnetAcceptanceMobilePlan {\n appLabel: 'LinX P2P Smoke';\n packageName: 'com.linxmobile.p2psmoke';\n fields: {\n idpUrl: string;\n storageUrl: string;\n clientId: string;\n resourcePath: string;\n };\n description: string;\n}\n\nexport interface P2PRealnetAcceptancePlan {\n kind: 'raw-tcp-p2p-realnet-acceptance';\n node: P2PRealnetAcceptanceCommand;\n client: P2PRealnetAcceptanceCommand;\n mobile: P2PRealnetAcceptanceMobilePlan;\n successCriteria: string[];\n routeFallbacksPreserved: string[];\n caveats: string[];\n}\n\nexport interface P2PRealnetAcceptanceVerifyOptions {\n clientId: string;\n expectedStatus?: number;\n expectedPutStatus?: number;\n requirePutStatus2xx?: boolean;\n nodeResult: unknown;\n clientResult: unknown;\n}\n\nexport interface P2PRealnetAcceptanceCheck {\n name: string;\n ok: boolean;\n detail: string;\n}\n\nexport interface P2PRealnetAcceptanceVerification {\n smokeOk: boolean;\n checks: P2PRealnetAcceptanceCheck[];\n routeFallbacksPreserved: string[];\n}\n\nconst FALLBACKS = ['Cloudflare Tunnel', 'FRP/SakuraFRP'] as const;\n\nexport function createP2PRealnetAcceptancePlan(\n options: P2PRealnetAcceptancePlanOptions,\n): P2PRealnetAcceptancePlan {\n const apiBaseUrl = ensureTrailingSlash(options.apiBaseUrl);\n const signalEndpoint = new URL('/v1/signal', apiBaseUrl).toString();\n const nodeCommand = compactCommand([\n 'node',\n '-r',\n 'ts-node/register',\n 'scripts/edge-node-p2p-accept-smoke.ts',\n '--signal-endpoint',\n signalEndpoint,\n '--node-id',\n options.nodeId,\n '--node-token',\n options.nodeToken,\n '--base-url',\n options.baseUrl,\n '--target-base-url',\n options.targetBaseUrl,\n ...optionalPair('--host', options.nodeHost),\n ...optionalPair('--address', options.nodeAddress),\n ...optionalPair('--local-address', options.nodeLocalAddress),\n ...optionalNumberPair('--connect-timeout-ms', options.connectTimeoutMs),\n ...optionalNumberPair('--winner-selection-window-ms', options.winnerSelectionWindowMs),\n ...optionalNumberPair('--run-timeout-ms', options.runTimeoutMs),\n '--require-accept',\n ]);\n const clientCommand = compactCommand([\n 'bun',\n 'run',\n 'smoke:p2p:managed',\n '--api-base-url',\n apiBaseUrl,\n '--node-id',\n options.nodeId,\n '--client-id',\n options.clientId,\n ...optionalPair('--token', options.token),\n ...optionalPair('--host', options.clientHost),\n ...optionalPair('--address', options.clientAddress),\n ...optionalPair('--local-address', options.clientLocalAddress),\n '--resource-url',\n options.resourceUrl,\n ...optionalNumberPair('--connect-timeout-ms', options.connectTimeoutMs),\n ...optionalNumberPair('--winner-selection-window-ms', options.winnerSelectionWindowMs),\n ...optionalNumberPair('--wait-timeout-ms', options.waitTimeoutMs),\n ...optionalNumberPair('--poll-interval-ms', options.pollIntervalMs),\n ...optionalNumberPair('--request-timeout-ms', options.requestTimeoutMs),\n ...optionalNumberPair('--window-seconds', options.windowSeconds),\n ...optionalNumberPair('--max-clock-error-seconds', options.maxClockErrorSeconds),\n ...optionalNumberPair('--min-run-window-seconds', options.minRunWindowSeconds),\n ...optionalNumberPair('--num-ports', options.numPorts),\n ...optionalNumberPair('--base-port', options.basePort),\n ...optionalNumberPair('--port-range', options.portRange),\n '--require-p2p',\n ]);\n\n return {\n kind: 'raw-tcp-p2p-realnet-acceptance',\n node: {\n role: 'node',\n command: nodeCommand,\n shell: shellQuoteCommand(nodeCommand),\n description: 'Run this on the local node/SP machine that can reach the local CSS/SP target base URL.',\n },\n client: {\n role: 'client',\n command: clientCommand,\n shell: shellQuoteCommand(clientCommand),\n description: 'Run this from a second non-browser runtime on another network/device.',\n },\n mobile: createMobilePlan(options),\n successCriteria: [\n `node accepted at least one raw TCP P2P session for client ${options.clientId}`,\n 'client selected route.kind=p2p and route.id=p2p-raw-tcp',\n 'client emitted a raw TCP connector success event',\n 'client evidence reports clientAddress=signal-observed',\n 'node accepted evidence for the same client reports nodeAddress=signal-observed',\n 'canonical Solid HTTP request returned the expected status over xpod-p2p-http/1',\n 'mobile write/read validation may require both putStatus and status to match expected 2xx values',\n 'both peers may omit host/address and rely on signal-observed address enrichment for port-only candidates',\n 'Cloudflare Tunnel and FRP/SakuraFRP remain available as independent user-tunnel fallback routes',\n ],\n routeFallbacksPreserved: [...FALLBACKS],\n caveats: [\n 'This is for non-browser runtimes only; it does not prove browser P2P because browsers cannot open raw TCP sockets.',\n 'A successful loopback/local smoke is not enough; run the node and client commands from separate network contexts for cross-NAT evidence.',\n 'When host/address is omitted, signal injects the observed address for port-only candidates; observed address discovery does not guarantee NAT reachability.',\n 'Mobile smoke evidence must still be verified with the same realnet verifier; phone USB is only for install/log collection, not the data plane.',\n 'Cloudflare Tunnel and FRP/SakuraFRP remain fallback routes and are not replaced by raw TCP P2P.',\n ],\n };\n}\n\nexport function verifyP2PRealnetAcceptance(\n options: P2PRealnetAcceptanceVerifyOptions,\n): P2PRealnetAcceptanceVerification {\n const node = asRecord(options.nodeResult);\n const client = asRecord(options.clientResult);\n const accepted = Array.isArray(node.accepted) ? node.accepted.filter(asRecord) : [];\n const route = asRecord(client.route);\n const connectorEvents = Array.isArray(client.connectorEvents) ? client.connectorEvents.filter(asRecord) : [];\n const routeFallbacksPreserved = fallbackEvidence(node);\n\n const checks: P2PRealnetAcceptanceCheck[] = [\n {\n name: 'node smoke ok',\n ok: node.smokeOk === true,\n detail: node.smokeOk === true ? 'node runner reported smokeOk=true' : 'node runner did not report smokeOk=true',\n },\n {\n name: 'node accepted client',\n ok: accepted.some((event) => event.clientId === options.clientId),\n detail: accepted.length > 0\n ? `accepted clients: ${accepted.map((event) => String(event.clientId ?? '<unknown>')).join(', ')}`\n : 'node runner accepted no sessions',\n },\n {\n name: 'client smoke ok',\n ok: client.smokeOk === true,\n detail: client.smokeOk === true ? 'client runner reported smokeOk=true' : 'client runner did not report smokeOk=true',\n },\n {\n name: 'client selected p2p route',\n ok: route.kind === 'p2p',\n detail: `client route.kind=${String(route.kind ?? '<missing>')}`,\n },\n {\n name: 'raw tcp connector succeeded',\n ok: connectorEvents.some((event) => event.type === 'success'),\n detail: connectorEvents.length > 0\n ? `connector events: ${connectorEvents.map((event) => String(event.type ?? '<unknown>')).join(', ')}`\n : 'client runner emitted no connector events',\n },\n {\n name: 'client address came from signal',\n ok: client.clientAddress === 'signal-observed',\n detail: `clientAddress=${String(client.clientAddress ?? '<missing>')}`,\n },\n {\n name: 'node address came from signal',\n ok: accepted.some((event) => event.clientId === options.clientId && event.nodeAddress === 'signal-observed'),\n detail: accepted.length > 0\n ? `accepted nodeAddress evidence: ${accepted.map((event) => `${String(event.clientId ?? '<unknown>')}=${String(event.nodeAddress ?? '<missing>')}`).join(', ')}`\n : 'node runner accepted no sessions',\n },\n {\n name: 'expected http status',\n ok: options.expectedStatus === undefined || client.status === options.expectedStatus,\n detail: options.expectedStatus === undefined\n ? 'no expected HTTP status was configured'\n : `client status=${String(client.status ?? '<missing>')}, expected=${options.expectedStatus}`,\n },\n {\n name: 'expected write http status',\n ok: options.expectedPutStatus === undefined || client.putStatus === options.expectedPutStatus,\n detail: options.expectedPutStatus === undefined\n ? 'no expected write HTTP status was configured'\n : `client putStatus=${String(client.putStatus ?? '<missing>')}, expected=${options.expectedPutStatus}`,\n },\n {\n name: 'write http status is 2xx',\n ok: options.requirePutStatus2xx !== true || is2xxStatus(client.putStatus),\n detail: options.requirePutStatus2xx !== true\n ? '2xx write HTTP status was not required'\n : `client putStatus=${String(client.putStatus ?? '<missing>')}`,\n },\n {\n name: 'tunnel fallbacks preserved',\n ok: FALLBACKS.every((fallback) => routeFallbacksPreserved.includes(fallback)),\n detail: `fallback evidence: ${routeFallbacksPreserved.join(', ') || '<none>'}`,\n },\n ];\n\n return {\n smokeOk: checks.every((check) => check.ok),\n checks,\n routeFallbacksPreserved,\n };\n}\n\n\nfunction createMobilePlan(options: P2PRealnetAcceptancePlanOptions): P2PRealnetAcceptanceMobilePlan {\n const resource = new URL(options.resourceUrl);\n const storageUrl = `${resource.origin}/`;\n return {\n appLabel: 'LinX P2P Smoke',\n packageName: 'com.linxmobile.p2psmoke',\n fields: {\n idpUrl: deriveIdpBaseUrlFromApiBaseUrl(options.apiBaseUrl),\n storageUrl,\n clientId: options.clientId,\n resourcePath: resource.pathname,\n },\n description: 'Install/run the mobile smoke package over USB/ADB/HDB/Xcode, log in on-device, and use the same clientId as the node acceptance command. The app obtains auth from its own client session; no signal token is a human input.',\n };\n}\n\nfunction deriveIdpBaseUrlFromApiBaseUrl(apiBaseUrl: string): string {\n const api = new URL(ensureTrailingSlash(apiBaseUrl));\n const labels = api.hostname.split('.');\n if (labels[0] === 'api' && labels.length > 1) {\n labels[0] = 'id';\n }\n return `${api.protocol}//${labels.join('.')}/`;\n}\n\nfunction optionalPair(name: string, value: string | undefined): string[] {\n return value === undefined || value.length === 0 ? [] : [name, value];\n}\n\nfunction optionalNumberPair(name: string, value: number | undefined): string[] {\n return value === undefined ? [] : [name, String(value)];\n}\n\nfunction compactCommand(parts: string[]): string[] {\n return parts.filter((part) => part.length > 0);\n}\n\nfunction shellQuoteCommand(command: string[]): string {\n return command.map(shellQuote).join(' ');\n}\n\nfunction shellQuote(value: string): string {\n if (/^[A-Za-z0-9_./:=@+-]+$/u.test(value)) {\n return value;\n }\n return `'${value.replace(/'/gu, `'\\\\''`)}'`;\n}\n\nfunction ensureTrailingSlash(value: string): string {\n return value.endsWith('/') ? value : `${value}/`;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n\nfunction is2xxStatus(value: unknown): boolean {\n return typeof value === 'number' && Number.isInteger(value) && value >= 200 && value <= 299;\n}\n\nfunction fallbackEvidence(node: Record<string, unknown>): string[] {\n const explicit = Array.isArray(node.routeFallbacksPreserved)\n ? node.routeFallbacksPreserved.filter((value): value is string => typeof value === 'string')\n : [];\n const caveats = Array.isArray(node.caveats)\n ? node.caveats.filter((value): value is string => typeof value === 'string').join('\\n')\n : '';\n return [...new Set([\n ...explicit,\n ...FALLBACKS.filter((fallback) => caveats.includes(fallback)),\n ])];\n}\n"]}
@@ -112,6 +112,7 @@ async function answerPendingRawTcpP2PSessionsOnce(options) {
112
112
  }
113
113
  async function acceptSignaledRawTcpP2PConnectionOnce(options) {
114
114
  const sessions = await options.signaling.listP2PSessions();
115
+ const errors = [];
115
116
  for (const session of sessions) {
116
117
  if (!selectRawTcpP2PRoute(session.nodeCandidates)) {
117
118
  continue;
@@ -142,23 +143,31 @@ async function acceptSignaledRawTcpP2PConnectionOnce(options) {
142
143
  continue;
143
144
  }
144
145
  const effectiveLocalCandidates = localRawTcpCandidatesFromSessionOrFallback(answeredSession, localCandidates, 'node', options.sourceId, plan.bucket);
145
- const socket = await connectRawTcpP2PSocket({
146
- localCandidates: effectiveLocalCandidates,
147
- remoteCandidates,
148
- connectTimeoutMs: options.connectTimeoutMs,
149
- winnerSelectionWindowMs: options.winnerSelectionWindowMs,
150
- localAddress: options.localAddress,
151
- nowMs: options.nowMs,
152
- sleepMs: options.sleepMs,
153
- connectSocket: options.connectSocket,
154
- });
155
- return {
156
- session: answeredSession,
157
- plan,
158
- localCandidates: effectiveLocalCandidates,
159
- remoteCandidates,
160
- socketHandle: (0, TcpP2PDataPlaneTransport_1.attachTcpP2PDataPlaneSocket)({ socket, handler: options.handler }),
161
- };
146
+ try {
147
+ const socket = await connectRawTcpP2PSocket({
148
+ localCandidates: effectiveLocalCandidates,
149
+ remoteCandidates,
150
+ connectTimeoutMs: options.connectTimeoutMs,
151
+ winnerSelectionWindowMs: options.winnerSelectionWindowMs,
152
+ localAddress: options.localAddress,
153
+ nowMs: options.nowMs,
154
+ sleepMs: options.sleepMs,
155
+ connectSocket: options.connectSocket,
156
+ });
157
+ return {
158
+ session: answeredSession,
159
+ plan,
160
+ localCandidates: effectiveLocalCandidates,
161
+ remoteCandidates,
162
+ socketHandle: (0, TcpP2PDataPlaneTransport_1.attachTcpP2PDataPlaneSocket)({ socket, handler: options.handler }),
163
+ };
164
+ }
165
+ catch (error) {
166
+ errors.push(`${session.sessionId}: ${error instanceof Error ? error.message : String(error)}`);
167
+ }
168
+ }
169
+ if (errors.length > 0) {
170
+ throw new Error(`Failed to accept raw TCP P2P sessions: ${errors.join('; ')}`);
162
171
  }
163
172
  return undefined;
164
173
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TcpP2PSignalingSession.js","sourceRoot":"","sources":["../../../src/edge/reachability/TcpP2PSignalingSession.ts"],"names":[],"mappings":"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","sourcesContent":["import { createConnection, type Socket } from 'node:net';\nimport type { AccessRoute, P2PCandidateRole, P2PSession, P2PTransportCandidate } from './types';\nimport type { CreateP2PSessionInput, P2PSignalingClient } from './P2PSignalingClient';\nimport type { P2PDataPlaneHandler } from './P2PDataPlane';\nimport {\n attachTcpP2PDataPlaneSocket,\n computeTcpHolePunchPlan,\n createTcpP2PDataPlaneTransport,\n type TcpP2PDataPlaneSocketHandle,\n type TcpP2PDataPlaneTransport,\n type TcpHolePunchPlan,\n type TcpHolePunchPlanOptions,\n} from './TcpP2PDataPlaneTransport';\n\nexport const RAW_TCP_HOLE_PUNCH_TRANSPORT = 'raw-tcp-hole-punch' as const;\nexport const RAW_TCP_HOLE_PUNCH_CAPABILITY = 'tcp-punch' as const;\n\nexport interface CreateRawTcpHolePunchCandidatesOptions {\n role: P2PCandidateRole;\n sourceId: string;\n host?: string;\n address?: string;\n createdAt?: Date;\n priority?: number;\n plan?: TcpHolePunchPlan;\n planOptions?: TcpHolePunchPlanOptions;\n candidateIdPrefix?: string;\n}\n\nexport interface SignaledRawTcpP2PSessionOptions {\n signaling: P2PSignalingClient;\n clientId: string;\n host?: string;\n address?: string;\n capabilities?: string[];\n priority?: number;\n createdAt?: Date;\n plan?: TcpHolePunchPlan;\n planOptions?: TcpHolePunchPlanOptions;\n candidateIdPrefix?: string;\n}\n\nexport interface SignaledRawTcpP2PSession {\n session: P2PSession;\n plan: TcpHolePunchPlan;\n localCandidates: P2PTransportCandidate[];\n rawTcpRoute?: AccessRoute;\n}\n\nexport interface AnswerPendingRawTcpP2PSessionsOnceOptions {\n signaling: P2PSignalingClient;\n sourceId: string;\n host?: string;\n address?: string;\n priority?: number;\n createdAt?: Date;\n candidateIdPrefix?: string;\n}\n\nexport interface WaitForRawTcpRemoteCandidatesOptions {\n signaling: P2PSignalingClient;\n sessionIdOrUrl: string;\n localRole: P2PCandidateRole;\n localSourceId: string;\n bucket?: number;\n pollIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface ConnectRawTcpP2PTransportOptions {\n localCandidates: P2PTransportCandidate[];\n remoteCandidates: P2PTransportCandidate[];\n connectTimeoutMs?: number;\n timeoutMs?: number;\n winnerSelectionWindowMs?: number;\n localAddress?: string;\n nowMs?: () => number;\n sleepMs?: RawTcpP2PSleep;\n connectSocket?: RawTcpP2PConnectSocket;\n}\n\nexport interface RawTcpP2PConnectAttempt {\n local: P2PTransportCandidate;\n remote: P2PTransportCandidate;\n remoteHost: string;\n remotePort: number;\n localAddress?: string;\n localPort?: number;\n rendezvousTimeMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nexport type RawTcpP2PConnectSocket = (attempt: RawTcpP2PConnectAttempt) => Promise<Socket>;\n\nexport type RawTcpP2PSleep = (ms: number, signal?: AbortSignal) => Promise<void>;\n\nexport interface NodeRawTcpP2PConnectSocketEventBase {\n attempt: RawTcpP2PConnectAttempt;\n error?: Error;\n remainingMs?: number;\n retryDelayMs?: number;\n socket?: Socket;\n}\n\nexport type NodeRawTcpP2PConnectSocketEvent =\n | (NodeRawTcpP2PConnectSocketEventBase & { type: 'attempt'; remainingMs: number })\n | (NodeRawTcpP2PConnectSocketEventBase & {\n type: 'retry';\n error: Error;\n remainingMs: number;\n retryDelayMs: number;\n })\n | (NodeRawTcpP2PConnectSocketEventBase & { type: 'success'; socket: Socket })\n | (NodeRawTcpP2PConnectSocketEventBase & { type: 'timeout'; error: Error })\n | (NodeRawTcpP2PConnectSocketEventBase & { type: 'aborted'; error?: Error });\n\nexport interface CreateNodeRawTcpP2PConnectSocketOptions {\n retryIntervalMs?: number;\n onEvent?: (event: NodeRawTcpP2PConnectSocketEvent) => void;\n}\n\nexport interface ConnectSignaledRawTcpP2PTransportOptions extends SignaledRawTcpP2PSessionOptions {\n connectTimeoutMs?: number;\n timeoutMs?: number;\n winnerSelectionWindowMs?: number;\n localAddress?: string;\n nowMs?: () => number;\n sleepMs?: RawTcpP2PSleep;\n connectSocket?: RawTcpP2PConnectSocket;\n pollIntervalMs?: number;\n waitTimeoutMs?: number;\n}\n\nexport interface ConnectedSignaledRawTcpP2PTransport extends SignaledRawTcpP2PSession {\n remoteCandidates: P2PTransportCandidate[];\n transport: TcpP2PDataPlaneTransport;\n}\n\nexport interface AcceptSignaledRawTcpP2PConnectionOnceOptions extends AnswerPendingRawTcpP2PSessionsOnceOptions {\n handler: P2PDataPlaneHandler;\n connectTimeoutMs?: number;\n winnerSelectionWindowMs?: number;\n localAddress?: string;\n nowMs?: () => number;\n sleepMs?: RawTcpP2PSleep;\n connectSocket?: RawTcpP2PConnectSocket;\n}\n\nexport interface AcceptedSignaledRawTcpP2PConnection {\n session: P2PSession;\n plan: TcpHolePunchPlan;\n localCandidates: P2PTransportCandidate[];\n remoteCandidates: P2PTransportCandidate[];\n socketHandle: TcpP2PDataPlaneSocketHandle;\n}\n\nconst DEFAULT_POLL_INTERVAL_MS = 1_000;\nconst DEFAULT_WAIT_TIMEOUT_MS = 10_000;\nconst DEFAULT_CONNECT_TIMEOUT_MS = 5_000;\nconst DEFAULT_RAW_TCP_RETRY_INTERVAL_MS = 25;\n\nexport function createNodeRawTcpP2PConnectSocket(\n options: CreateNodeRawTcpP2PConnectSocketOptions = {},\n): RawTcpP2PConnectSocket {\n return (attempt) => connectNodeRawTcpSocket(attempt, options);\n}\n\nconst defaultNodeRawTcpP2PConnectSocket = createNodeRawTcpP2PConnectSocket();\n\nexport function createRawTcpHolePunchCandidates(\n options: CreateRawTcpHolePunchCandidatesOptions,\n): P2PTransportCandidate[] {\n const plan = options.plan ?? computeTcpHolePunchPlan(options.planOptions);\n const createdAt = (options.createdAt ?? new Date()).toISOString();\n const hostOrAddress = options.host ?? options.address;\n const prefix = options.candidateIdPrefix ?? `${options.sourceId}_${plan.bucket}`;\n\n return plan.ports.map((port, index) => ({\n id: `${prefix}_${port}_${index}`,\n role: options.role,\n sourceId: options.sourceId,\n createdAt,\n protocol: 'tcp',\n transport: RAW_TCP_HOLE_PUNCH_TRANSPORT,\n ...(options.host ? { host: options.host } : {}),\n ...(options.address ? { address: options.address } : {}),\n ...(hostOrAddress ? { url: `tcp-punch://${hostOrAddress}:${port}` } : {}),\n port,\n priority: options.priority ?? (100 - index),\n metadata: {\n provider: RAW_TCP_HOLE_PUNCH_TRANSPORT,\n bucket: plan.bucket,\n boundary: plan.boundary,\n rendezvousTimeSeconds: plan.rendezvousTimeSeconds,\n },\n }));\n}\n\nexport async function createSignaledRawTcpP2PSession(\n options: SignaledRawTcpP2PSessionOptions,\n): Promise<SignaledRawTcpP2PSession> {\n const plan = options.plan ?? computeTcpHolePunchPlan(options.planOptions);\n const localCandidates = createRawTcpHolePunchCandidates({\n role: 'client',\n sourceId: options.clientId,\n host: options.host,\n address: options.address,\n createdAt: options.createdAt,\n priority: options.priority,\n plan,\n candidateIdPrefix: options.candidateIdPrefix,\n });\n const request: CreateP2PSessionInput = {\n clientId: options.clientId,\n capabilities: uniqueStrings([\n RAW_TCP_HOLE_PUNCH_CAPABILITY,\n ...(options.capabilities ?? []),\n ]),\n candidates: localCandidates,\n };\n const session = await options.signaling.createP2PSession(request);\n const effectiveLocalCandidates = localRawTcpCandidatesFromSessionOrFallback(\n session,\n localCandidates,\n 'client',\n options.clientId,\n plan.bucket,\n );\n return {\n session,\n plan,\n localCandidates: effectiveLocalCandidates,\n rawTcpRoute: selectRawTcpP2PRoute(session.nodeCandidates),\n };\n}\n\nexport async function answerPendingRawTcpP2PSessionsOnce(\n options: AnswerPendingRawTcpP2PSessionsOnceOptions,\n): Promise<P2PSession[]> {\n const sessions = await options.signaling.listP2PSessions();\n const answered: P2PSession[] = [];\n for (const session of sessions) {\n if (!selectRawTcpP2PRoute(session.nodeCandidates)) {\n continue;\n }\n const plan = planFromRemoteCandidates(session.candidates, 'client');\n if (!plan) {\n continue;\n }\n if (hasRawTcpCandidate(session.candidates, 'node', options.sourceId, plan.bucket)) {\n continue;\n }\n const candidates = createRawTcpHolePunchCandidates({\n role: 'node',\n sourceId: options.sourceId,\n host: options.host,\n address: options.address,\n createdAt: options.createdAt,\n priority: options.priority,\n plan,\n candidateIdPrefix: options.candidateIdPrefix,\n });\n answered.push(await options.signaling.addP2PCandidates(session.signalingUrl || session.sessionId, {\n role: 'node',\n sourceId: options.sourceId,\n candidates,\n }));\n }\n return answered;\n}\n\nexport async function acceptSignaledRawTcpP2PConnectionOnce(\n options: AcceptSignaledRawTcpP2PConnectionOnceOptions,\n): Promise<AcceptedSignaledRawTcpP2PConnection | undefined> {\n const sessions = await options.signaling.listP2PSessions();\n for (const session of sessions) {\n if (!selectRawTcpP2PRoute(session.nodeCandidates)) {\n continue;\n }\n const plan = planFromRemoteCandidates(session.candidates, 'client');\n if (!plan) {\n continue;\n }\n const localCandidates = createRawTcpHolePunchCandidates({\n role: 'node',\n sourceId: options.sourceId,\n host: options.host,\n address: options.address,\n createdAt: options.createdAt,\n priority: options.priority,\n plan,\n candidateIdPrefix: options.candidateIdPrefix,\n });\n const answeredSession = hasRawTcpCandidate(session.candidates, 'node', options.sourceId, plan.bucket)\n ? session\n : await options.signaling.addP2PCandidates(session.signalingUrl || session.sessionId, {\n role: 'node',\n sourceId: options.sourceId,\n candidates: localCandidates,\n });\n const remoteCandidates = filterRawTcpRemoteCandidates(\n answeredSession.candidates,\n 'node',\n options.sourceId,\n plan.bucket,\n );\n if (remoteCandidates.length === 0) {\n continue;\n }\n const effectiveLocalCandidates = localRawTcpCandidatesFromSessionOrFallback(\n answeredSession,\n localCandidates,\n 'node',\n options.sourceId,\n plan.bucket,\n );\n const socket = await connectRawTcpP2PSocket({\n localCandidates: effectiveLocalCandidates,\n remoteCandidates,\n connectTimeoutMs: options.connectTimeoutMs,\n winnerSelectionWindowMs: options.winnerSelectionWindowMs,\n localAddress: options.localAddress,\n nowMs: options.nowMs,\n sleepMs: options.sleepMs,\n connectSocket: options.connectSocket,\n });\n return {\n session: answeredSession,\n plan,\n localCandidates: effectiveLocalCandidates,\n remoteCandidates,\n socketHandle: attachTcpP2PDataPlaneSocket({ socket, handler: options.handler }),\n };\n }\n return undefined;\n}\n\nexport async function waitForRawTcpRemoteCandidates(\n options: WaitForRawTcpRemoteCandidatesOptions,\n): Promise<P2PTransportCandidate[]> {\n const startedAt = Date.now();\n const timeoutMs = positiveInteger(options.timeoutMs, DEFAULT_WAIT_TIMEOUT_MS);\n const pollIntervalMs = positiveInteger(options.pollIntervalMs, DEFAULT_POLL_INTERVAL_MS);\n for (;;) {\n const session = await options.signaling.getP2PSession(options.sessionIdOrUrl);\n const candidates = filterRawTcpRemoteCandidates(\n session.candidates,\n options.localRole,\n options.localSourceId,\n options.bucket,\n );\n if (candidates.length > 0) {\n return candidates;\n }\n if (Date.now() - startedAt >= timeoutMs) {\n throw new Error(`Timed out waiting for raw TCP P2P candidates after ${timeoutMs}ms`);\n }\n await sleep(Math.min(pollIntervalMs, Math.max(1, timeoutMs - (Date.now() - startedAt))));\n }\n}\n\nexport async function connectSignaledRawTcpP2PTransport(\n options: ConnectSignaledRawTcpP2PTransportOptions,\n): Promise<ConnectedSignaledRawTcpP2PTransport> {\n const signaled = await createSignaledRawTcpP2PSession(options);\n const remoteCandidates = await waitForRawTcpRemoteCandidates({\n signaling: options.signaling,\n sessionIdOrUrl: signaled.session.signalingUrl || signaled.session.sessionId,\n localRole: 'client',\n localSourceId: options.clientId,\n bucket: signaled.plan.bucket,\n pollIntervalMs: options.pollIntervalMs,\n timeoutMs: options.waitTimeoutMs,\n });\n const transport = await connectRawTcpP2PTransport({\n localCandidates: signaled.localCandidates,\n remoteCandidates,\n connectTimeoutMs: options.connectTimeoutMs,\n timeoutMs: options.timeoutMs,\n winnerSelectionWindowMs: options.winnerSelectionWindowMs,\n localAddress: options.localAddress,\n nowMs: options.nowMs,\n sleepMs: options.sleepMs,\n connectSocket: options.connectSocket,\n });\n return {\n ...signaled,\n remoteCandidates,\n transport,\n };\n}\n\nexport async function connectRawTcpP2PTransport(\n options: ConnectRawTcpP2PTransportOptions,\n): Promise<TcpP2PDataPlaneTransport> {\n const { attempt, socket } = await connectRawTcpP2PSocketAttempt(options);\n return createTcpP2PDataPlaneTransport({\n remoteHost: attempt.remoteHost,\n remotePort: attempt.remotePort,\n socket,\n timeoutMs: options.timeoutMs,\n });\n}\n\nasync function connectRawTcpP2PSocket(\n options: ConnectRawTcpP2PTransportOptions,\n): Promise<Socket> {\n const { socket } = await connectRawTcpP2PSocketAttempt(options);\n return socket;\n}\n\nasync function connectRawTcpP2PSocketAttempt(\n options: ConnectRawTcpP2PTransportOptions,\n): Promise<{ attempt: RawTcpP2PConnectAttempt; socket: Socket }> {\n const pairs = candidatePairs(options.localCandidates, options.remoteCandidates);\n if (pairs.length === 0) {\n throw new Error('No compatible raw TCP P2P candidate pairs');\n }\n\n const errors: string[] = [];\n const nowMs = options.nowMs ?? Date.now;\n const sleepMs = options.sleepMs ?? sleep;\n const connectSocket = options.connectSocket ?? defaultNodeRawTcpP2PConnectSocket;\n const attempts = pairs.map(({ local, remote }) => createRawTcpConnectAttempt(local, remote, {\n timeoutMs: positiveInteger(options.connectTimeoutMs, DEFAULT_CONNECT_TIMEOUT_MS),\n localAddress: options.localAddress,\n }));\n try {\n const { attempt, socket } = await connectFirstRawTcpAttempt(attempts, {\n nowMs,\n sleepMs,\n connectSocket,\n winnerSelectionWindowMs: nonNegativeInteger(options.winnerSelectionWindowMs, 0),\n });\n return { attempt, socket };\n } catch (error) {\n errors.push(error instanceof Error ? error.message : String(error));\n }\n throw new Error(`Failed to connect raw TCP P2P candidates: ${errors.join('; ')}`);\n}\n\nexport function filterRawTcpRemoteCandidates(\n candidates: P2PTransportCandidate[],\n localRole: P2PCandidateRole,\n localSourceId: string,\n bucket?: number,\n): P2PTransportCandidate[] {\n return candidates.filter((candidate) => {\n if (!isRawTcpHolePunchCandidate(candidate)) {\n return false;\n }\n if (candidate.role === localRole && candidate.sourceId === localSourceId) {\n return false;\n }\n if (bucket !== undefined && getNumericMetadata(candidate, 'bucket') !== bucket) {\n return false;\n }\n return true;\n });\n}\n\nexport function selectRawTcpP2PRoute(routes: AccessRoute[]): AccessRoute | undefined {\n return routes.find((route) => {\n if (route.kind !== 'p2p') {\n return false;\n }\n if (route.targetUrl.startsWith('tcp-punch://')) {\n return true;\n }\n const protocols = isRecord(route.metadata?.protocols) ? route.metadata.protocols : undefined;\n const rawTcp = isRecord(protocols?.[RAW_TCP_HOLE_PUNCH_TRANSPORT])\n ? protocols[RAW_TCP_HOLE_PUNCH_TRANSPORT]\n : undefined;\n return rawTcp?.enabled === true;\n });\n}\n\nexport function isRawTcpHolePunchCandidate(candidate: P2PTransportCandidate): boolean {\n return candidate.protocol === 'tcp'\n && candidate.transport === RAW_TCP_HOLE_PUNCH_TRANSPORT\n && getNumericMetadata(candidate, 'bucket') !== undefined\n && getNumericMetadata(candidate, 'rendezvousTimeSeconds') !== undefined\n && typeof candidate.port === 'number';\n}\n\nfunction localRawTcpCandidatesFromSessionOrFallback(\n session: P2PSession,\n fallback: P2PTransportCandidate[],\n role: P2PCandidateRole,\n sourceId: string,\n bucket: number,\n): P2PTransportCandidate[] {\n const signaledCandidates = session.candidates.filter((candidate) => candidate.role === role\n && candidate.sourceId === sourceId\n && isRawTcpHolePunchCandidate(candidate)\n && getNumericMetadata(candidate, 'bucket') === bucket);\n return signaledCandidates.length > 0 ? signaledCandidates : fallback;\n}\n\nfunction candidatePairs(\n localCandidates: P2PTransportCandidate[],\n remoteCandidates: P2PTransportCandidate[],\n): { local: P2PTransportCandidate; remote: P2PTransportCandidate }[] {\n const local = localCandidates.filter(isRawTcpHolePunchCandidate).sort(compareCandidatePriority);\n const remote = remoteCandidates\n .filter(isRawTcpHolePunchCandidate)\n .filter((candidate) => candidateHost(candidate).length > 0)\n .sort(compareCandidatePriority);\n const result: { local: P2PTransportCandidate; remote: P2PTransportCandidate }[] = [];\n for (const localCandidate of local) {\n const localBucket = getNumericMetadata(localCandidate, 'bucket');\n for (const remoteCandidate of remote) {\n if (localBucket === getNumericMetadata(remoteCandidate, 'bucket')) {\n result.push({ local: localCandidate, remote: remoteCandidate });\n }\n }\n }\n return result;\n}\n\nfunction createRawTcpConnectAttempt(\n local: P2PTransportCandidate,\n remote: P2PTransportCandidate,\n options: { timeoutMs: number; localAddress?: string },\n): RawTcpP2PConnectAttempt {\n const remoteHost = candidateHost(remote);\n const remotePort = remote.port;\n if (!remoteHost || !remotePort) {\n throw new Error(`Remote raw TCP candidate ${remote.id} is missing host or port`);\n }\n const localRendezvousTimeSeconds = getNumericMetadata(local, 'rendezvousTimeSeconds') ?? 0;\n const remoteRendezvousTimeSeconds = getNumericMetadata(remote, 'rendezvousTimeSeconds') ?? 0;\n return {\n local,\n remote,\n remoteHost,\n remotePort,\n localAddress: options.localAddress,\n ...(local.port ? { localPort: local.port } : {}),\n rendezvousTimeMs: Math.max(localRendezvousTimeSeconds, remoteRendezvousTimeSeconds) * 1_000,\n timeoutMs: options.timeoutMs,\n };\n}\n\nasync function connectFirstRawTcpAttempt(\n attempts: RawTcpP2PConnectAttempt[],\n options: {\n nowMs: () => number;\n sleepMs: RawTcpP2PSleep;\n connectSocket: RawTcpP2PConnectSocket;\n winnerSelectionWindowMs: number;\n },\n): Promise<{ attempt: RawTcpP2PConnectAttempt; socket: Socket }> {\n return new Promise((resolve, reject) => {\n const controllers = attempts.map(() => new AbortController());\n const errors: string[] = [];\n const successes: Array<{ attempt: RawTcpP2PConnectAttempt; socket: Socket; index: number }> = [];\n let pending = attempts.length;\n let settled = false;\n let settleTimer: NodeJS.Timeout | undefined;\n\n const clearSettleTimer = (): void => {\n if (settleTimer) {\n clearTimeout(settleTimer);\n settleTimer = undefined;\n }\n };\n const finishReject = (error: Error): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearSettleTimer();\n reject(error);\n };\n const finishWithWinner = (): void => {\n if (settled) {\n return;\n }\n if (successes.length === 0) {\n finishReject(new Error(errors.join('; ')));\n return;\n }\n settled = true;\n clearSettleTimer();\n const winner = selectRawTcpWinner(successes);\n controllers.forEach((controller, index) => {\n if (index !== winner.index) {\n controller.abort();\n }\n });\n for (const success of successes) {\n if (success !== winner) {\n success.socket.destroy();\n }\n }\n resolve({ attempt: winner.attempt, socket: winner.socket });\n };\n const scheduleWinner = (): void => {\n if (options.winnerSelectionWindowMs <= 0 || pending === 0) {\n finishWithWinner();\n return;\n }\n settleTimer ??= setTimeout(finishWithWinner, options.winnerSelectionWindowMs);\n };\n\n attempts.forEach((baseAttempt, index) => {\n const controller = controllers[index];\n const attempt: RawTcpP2PConnectAttempt = {\n ...baseAttempt,\n signal: controller.signal,\n };\n void runRawTcpConnectAttempt(attempt, options)\n .then((socket) => {\n if (settled) {\n socket.destroy();\n return;\n }\n successes.push({ attempt, socket, index });\n pending -= 1;\n scheduleWinner();\n })\n .catch((error) => {\n if (settled) {\n return;\n }\n errors.push(error instanceof Error ? error.message : String(error));\n pending -= 1;\n if (pending === 0) {\n if (successes.length > 0) {\n finishWithWinner();\n } else {\n finishReject(new Error(errors.join('; ')));\n }\n }\n });\n });\n });\n}\n\nfunction selectRawTcpWinner(\n successes: Array<{ attempt: RawTcpP2PConnectAttempt; socket: Socket; index: number }>,\n): { attempt: RawTcpP2PConnectAttempt; socket: Socket; index: number } {\n return successes.slice().sort((left, right) => {\n const keyCompare = rawTcpAttemptPairKey(left.attempt).localeCompare(rawTcpAttemptPairKey(right.attempt));\n return keyCompare === 0 ? left.index - right.index : keyCompare;\n })[0];\n}\n\nfunction rawTcpAttemptPairKey(attempt: RawTcpP2PConnectAttempt): string {\n const endpoints = [\n rawTcpEndpointKey(attempt.local),\n rawTcpEndpointKey(attempt.remote),\n ].sort();\n return endpoints.join('<->');\n}\n\nfunction rawTcpEndpointKey(candidate: P2PTransportCandidate): string {\n return [\n candidate.sourceId,\n candidateHost(candidate),\n String(candidate.port ?? ''),\n candidate.id,\n ].join('|');\n}\n\nasync function runRawTcpConnectAttempt(\n attempt: RawTcpP2PConnectAttempt,\n options: {\n nowMs: () => number;\n sleepMs: RawTcpP2PSleep;\n connectSocket: RawTcpP2PConnectSocket;\n },\n): Promise<Socket> {\n await waitForRendezvous(attempt.rendezvousTimeMs, options.nowMs, options.sleepMs, attempt.signal);\n return connectSocketWithTimeout(attempt, options.connectSocket);\n}\n\nasync function waitForRendezvous(\n rendezvousTimeMs: number,\n nowMs: () => number,\n sleepMs: RawTcpP2PSleep,\n signal?: AbortSignal,\n): Promise<void> {\n const delayMs = rendezvousTimeMs - nowMs();\n if (delayMs > 0) {\n await abortableSleep(delayMs, sleepMs, signal);\n }\n if (signal?.aborted) {\n throw new Error('Raw TCP candidate connect aborted');\n }\n}\n\nasync function connectSocketWithTimeout(\n attempt: RawTcpP2PConnectAttempt,\n connectSocket: RawTcpP2PConnectSocket,\n): Promise<Socket> {\n return new Promise((resolve, reject) => {\n let finished = false;\n const timeout = setTimeout(() => {\n finishReject(new Error(`Raw TCP candidate connect timed out after ${attempt.timeoutMs}ms`));\n }, attempt.timeoutMs);\n const onAbort = (): void => {\n finishReject(new Error('Raw TCP candidate connect aborted'));\n };\n const cleanup = (): void => {\n clearTimeout(timeout);\n attempt.signal?.removeEventListener('abort', onAbort);\n };\n const finishReject = (error: Error): void => {\n if (finished) {\n return;\n }\n finished = true;\n cleanup();\n reject(error);\n };\n attempt.signal?.addEventListener('abort', onAbort, { once: true });\n if (attempt.signal?.aborted) {\n finishReject(new Error('Raw TCP candidate connect aborted'));\n return;\n }\n void connectSocket(attempt)\n .then((socket) => {\n if (finished) {\n socket.destroy();\n return;\n }\n finished = true;\n cleanup();\n resolve(socket);\n })\n .catch((error) => {\n finishReject(error instanceof Error ? error : new Error(String(error)));\n });\n });\n}\n\nasync function connectNodeRawTcpSocket(\n attempt: RawTcpP2PConnectAttempt,\n options: CreateNodeRawTcpP2PConnectSocketOptions,\n): Promise<Socket> {\n const startedAt = Date.now();\n const retryIntervalMs = positiveInteger(options.retryIntervalMs, DEFAULT_RAW_TCP_RETRY_INTERVAL_MS);\n let lastError: Error | undefined;\n for (;;) {\n if (attempt.signal?.aborted) {\n options.onEvent?.({ type: 'aborted', attempt });\n throw new Error('Raw TCP candidate connect aborted');\n }\n const remainingMs = attempt.timeoutMs - (Date.now() - startedAt);\n if (remainingMs <= 0) {\n const error = new Error(`Raw TCP candidate connect timed out after ${attempt.timeoutMs}ms${lastError ? `: ${lastError.message}` : ''}`);\n options.onEvent?.({ type: 'timeout', attempt, error });\n throw error;\n }\n options.onEvent?.({ type: 'attempt', attempt, remainingMs });\n try {\n const socket = await connectRawTcpSocketOnce(attempt, remainingMs);\n options.onEvent?.({ type: 'success', attempt, socket });\n return socket;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n if (attempt.signal?.aborted) {\n options.onEvent?.({ type: 'aborted', attempt, error: lastError });\n throw new Error('Raw TCP candidate connect aborted');\n }\n const remainingAfterFailureMs = attempt.timeoutMs - (Date.now() - startedAt);\n const retryDelayMs = Math.min(\n retryIntervalMs,\n Math.max(0, remainingAfterFailureMs),\n );\n if (retryDelayMs <= 0) {\n const timeoutError = new Error(`Raw TCP candidate connect timed out after ${attempt.timeoutMs}ms: ${lastError.message}`);\n options.onEvent?.({ type: 'timeout', attempt, error: timeoutError });\n throw timeoutError;\n }\n options.onEvent?.({\n type: 'retry',\n attempt,\n error: lastError,\n remainingMs: remainingAfterFailureMs,\n retryDelayMs,\n });\n try {\n await sleep(retryDelayMs, attempt.signal);\n } catch (sleepError) {\n if (attempt.signal?.aborted) {\n options.onEvent?.({\n type: 'aborted',\n attempt,\n error: sleepError instanceof Error ? sleepError : new Error(String(sleepError)),\n });\n }\n throw sleepError;\n }\n }\n }\n}\n\nasync function connectRawTcpSocketOnce(attempt: RawTcpP2PConnectAttempt, timeoutMs: number): Promise<Socket> {\n return new Promise((resolve, reject) => {\n const connectOptions = {\n host: attempt.remoteHost,\n port: attempt.remotePort,\n localAddress: attempt.localAddress,\n ...(attempt.localPort ? { localPort: attempt.localPort } : {}),\n };\n const socket = createConnection(connectOptions);\n const timeout = setTimeout(() => {\n cleanup();\n socket.destroy();\n reject(new Error(`Raw TCP candidate connect attempt timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n const cleanup = (): void => {\n clearTimeout(timeout);\n socket.off('connect', onConnect);\n socket.off('error', onError);\n attempt.signal?.removeEventListener('abort', onAbort);\n };\n const onConnect = (): void => {\n cleanup();\n resolve(socket);\n };\n const onError = (error: Error): void => {\n cleanup();\n socket.destroy();\n reject(error);\n };\n const onAbort = (): void => {\n cleanup();\n socket.destroy();\n reject(new Error('Raw TCP candidate connect aborted'));\n };\n attempt.signal?.addEventListener('abort', onAbort, { once: true });\n if (attempt.signal?.aborted) {\n onAbort();\n return;\n }\n socket.once('connect', onConnect);\n socket.once('error', onError);\n });\n}\n\nfunction candidateHost(candidate: P2PTransportCandidate): string {\n return candidate.host ?? candidate.address ?? hostFromCandidateUrl(candidate.url) ?? '';\n}\n\nfunction hostFromCandidateUrl(value?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n try {\n return new URL(value).hostname;\n } catch {\n return undefined;\n }\n}\n\nfunction compareCandidatePriority(left: P2PTransportCandidate, right: P2PTransportCandidate): number {\n return (right.priority ?? 0) - (left.priority ?? 0);\n}\n\nfunction planFromRemoteCandidates(\n candidates: P2PTransportCandidate[],\n role: P2PCandidateRole,\n): TcpHolePunchPlan | undefined {\n const rawCandidates = candidates\n .filter((candidate) => candidate.role === role)\n .filter(isRawTcpHolePunchCandidate);\n const first = rawCandidates[0];\n if (!first) {\n return undefined;\n }\n const bucket = getNumericMetadata(first, 'bucket');\n const boundary = getNumericMetadata(first, 'boundary');\n const rendezvousTimeSeconds = getNumericMetadata(first, 'rendezvousTimeSeconds');\n if (bucket === undefined || boundary === undefined || rendezvousTimeSeconds === undefined) {\n return undefined;\n }\n const ports = rawCandidates\n .filter((candidate) => getNumericMetadata(candidate, 'bucket') === bucket)\n .map((candidate) => candidate.port)\n .filter((port): port is number => typeof port === 'number' && Number.isInteger(port) && port > 0);\n if (ports.length === 0) {\n return undefined;\n }\n return {\n bucket,\n boundary,\n rendezvousTimeSeconds,\n ports: [...new Set(ports)].sort((a, b) => b - a),\n };\n}\n\nfunction hasRawTcpCandidate(\n candidates: P2PTransportCandidate[],\n role: P2PCandidateRole,\n sourceId: string,\n bucket: number,\n): boolean {\n return candidates.some((candidate) => candidate.role === role\n && candidate.sourceId === sourceId\n && isRawTcpHolePunchCandidate(candidate)\n && getNumericMetadata(candidate, 'bucket') === bucket);\n}\n\nfunction getNumericMetadata(candidate: P2PTransportCandidate, key: string): number | undefined {\n const value = candidate.metadata?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return [...new Set(values.filter((value) => value.trim().length > 0))];\n}\n\nfunction positiveInteger(value: number | undefined, fallback: number): number {\n return Number.isInteger(value) && value !== undefined && value > 0 ? value : fallback;\n}\n\nfunction nonNegativeInteger(value: number | undefined, fallback: number): number {\n return Number.isInteger(value) && value !== undefined && value >= 0 ? value : fallback;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n const onAbort = (): void => {\n cleanup();\n reject(new Error('Raw TCP candidate connect aborted'));\n };\n const cleanup = (): void => {\n clearTimeout(timeout);\n signal?.removeEventListener('abort', onAbort);\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n if (signal?.aborted) {\n onAbort();\n }\n });\n}\n\nasync function abortableSleep(\n ms: number,\n sleepMs: RawTcpP2PSleep,\n signal?: AbortSignal,\n): Promise<void> {\n if (!signal) {\n await sleepMs(ms);\n return;\n }\n if (signal.aborted) {\n throw new Error('Raw TCP candidate connect aborted');\n }\n let removeAbortListener: (() => void) | undefined;\n try {\n await Promise.race([\n sleepMs(ms, signal),\n new Promise<never>((_resolve, reject) => {\n const onAbort = (): void => reject(new Error('Raw TCP candidate connect aborted'));\n signal.addEventListener('abort', onAbort, { once: true });\n removeAbortListener = () => signal.removeEventListener('abort', onAbort);\n }),\n ]);\n } finally {\n removeAbortListener?.();\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n"]}
1
+ {"version":3,"file":"TcpP2PSignalingSession.js","sourceRoot":"","sources":["../../../src/edge/reachability/TcpP2PSignalingSession.ts"],"names":[],"mappings":"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","sourcesContent":["import { createConnection, type Socket } from 'node:net';\nimport type { AccessRoute, P2PCandidateRole, P2PSession, P2PTransportCandidate } from './types';\nimport type { CreateP2PSessionInput, P2PSignalingClient } from './P2PSignalingClient';\nimport type { P2PDataPlaneHandler } from './P2PDataPlane';\nimport {\n attachTcpP2PDataPlaneSocket,\n computeTcpHolePunchPlan,\n createTcpP2PDataPlaneTransport,\n type TcpP2PDataPlaneSocketHandle,\n type TcpP2PDataPlaneTransport,\n type TcpHolePunchPlan,\n type TcpHolePunchPlanOptions,\n} from './TcpP2PDataPlaneTransport';\n\nexport const RAW_TCP_HOLE_PUNCH_TRANSPORT = 'raw-tcp-hole-punch' as const;\nexport const RAW_TCP_HOLE_PUNCH_CAPABILITY = 'tcp-punch' as const;\n\nexport interface CreateRawTcpHolePunchCandidatesOptions {\n role: P2PCandidateRole;\n sourceId: string;\n host?: string;\n address?: string;\n createdAt?: Date;\n priority?: number;\n plan?: TcpHolePunchPlan;\n planOptions?: TcpHolePunchPlanOptions;\n candidateIdPrefix?: string;\n}\n\nexport interface SignaledRawTcpP2PSessionOptions {\n signaling: P2PSignalingClient;\n clientId: string;\n host?: string;\n address?: string;\n capabilities?: string[];\n priority?: number;\n createdAt?: Date;\n plan?: TcpHolePunchPlan;\n planOptions?: TcpHolePunchPlanOptions;\n candidateIdPrefix?: string;\n}\n\nexport interface SignaledRawTcpP2PSession {\n session: P2PSession;\n plan: TcpHolePunchPlan;\n localCandidates: P2PTransportCandidate[];\n rawTcpRoute?: AccessRoute;\n}\n\nexport interface AnswerPendingRawTcpP2PSessionsOnceOptions {\n signaling: P2PSignalingClient;\n sourceId: string;\n host?: string;\n address?: string;\n priority?: number;\n createdAt?: Date;\n candidateIdPrefix?: string;\n}\n\nexport interface WaitForRawTcpRemoteCandidatesOptions {\n signaling: P2PSignalingClient;\n sessionIdOrUrl: string;\n localRole: P2PCandidateRole;\n localSourceId: string;\n bucket?: number;\n pollIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface ConnectRawTcpP2PTransportOptions {\n localCandidates: P2PTransportCandidate[];\n remoteCandidates: P2PTransportCandidate[];\n connectTimeoutMs?: number;\n timeoutMs?: number;\n winnerSelectionWindowMs?: number;\n localAddress?: string;\n nowMs?: () => number;\n sleepMs?: RawTcpP2PSleep;\n connectSocket?: RawTcpP2PConnectSocket;\n}\n\nexport interface RawTcpP2PConnectAttempt {\n local: P2PTransportCandidate;\n remote: P2PTransportCandidate;\n remoteHost: string;\n remotePort: number;\n localAddress?: string;\n localPort?: number;\n rendezvousTimeMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nexport type RawTcpP2PConnectSocket = (attempt: RawTcpP2PConnectAttempt) => Promise<Socket>;\n\nexport type RawTcpP2PSleep = (ms: number, signal?: AbortSignal) => Promise<void>;\n\nexport interface NodeRawTcpP2PConnectSocketEventBase {\n attempt: RawTcpP2PConnectAttempt;\n error?: Error;\n remainingMs?: number;\n retryDelayMs?: number;\n socket?: Socket;\n}\n\nexport type NodeRawTcpP2PConnectSocketEvent =\n | (NodeRawTcpP2PConnectSocketEventBase & { type: 'attempt'; remainingMs: number })\n | (NodeRawTcpP2PConnectSocketEventBase & {\n type: 'retry';\n error: Error;\n remainingMs: number;\n retryDelayMs: number;\n })\n | (NodeRawTcpP2PConnectSocketEventBase & { type: 'success'; socket: Socket })\n | (NodeRawTcpP2PConnectSocketEventBase & { type: 'timeout'; error: Error })\n | (NodeRawTcpP2PConnectSocketEventBase & { type: 'aborted'; error?: Error });\n\nexport interface CreateNodeRawTcpP2PConnectSocketOptions {\n retryIntervalMs?: number;\n onEvent?: (event: NodeRawTcpP2PConnectSocketEvent) => void;\n}\n\nexport interface ConnectSignaledRawTcpP2PTransportOptions extends SignaledRawTcpP2PSessionOptions {\n connectTimeoutMs?: number;\n timeoutMs?: number;\n winnerSelectionWindowMs?: number;\n localAddress?: string;\n nowMs?: () => number;\n sleepMs?: RawTcpP2PSleep;\n connectSocket?: RawTcpP2PConnectSocket;\n pollIntervalMs?: number;\n waitTimeoutMs?: number;\n}\n\nexport interface ConnectedSignaledRawTcpP2PTransport extends SignaledRawTcpP2PSession {\n remoteCandidates: P2PTransportCandidate[];\n transport: TcpP2PDataPlaneTransport;\n}\n\nexport interface AcceptSignaledRawTcpP2PConnectionOnceOptions extends AnswerPendingRawTcpP2PSessionsOnceOptions {\n handler: P2PDataPlaneHandler;\n connectTimeoutMs?: number;\n winnerSelectionWindowMs?: number;\n localAddress?: string;\n nowMs?: () => number;\n sleepMs?: RawTcpP2PSleep;\n connectSocket?: RawTcpP2PConnectSocket;\n}\n\nexport interface AcceptedSignaledRawTcpP2PConnection {\n session: P2PSession;\n plan: TcpHolePunchPlan;\n localCandidates: P2PTransportCandidate[];\n remoteCandidates: P2PTransportCandidate[];\n socketHandle: TcpP2PDataPlaneSocketHandle;\n}\n\nconst DEFAULT_POLL_INTERVAL_MS = 1_000;\nconst DEFAULT_WAIT_TIMEOUT_MS = 10_000;\nconst DEFAULT_CONNECT_TIMEOUT_MS = 5_000;\nconst DEFAULT_RAW_TCP_RETRY_INTERVAL_MS = 25;\n\nexport function createNodeRawTcpP2PConnectSocket(\n options: CreateNodeRawTcpP2PConnectSocketOptions = {},\n): RawTcpP2PConnectSocket {\n return (attempt) => connectNodeRawTcpSocket(attempt, options);\n}\n\nconst defaultNodeRawTcpP2PConnectSocket = createNodeRawTcpP2PConnectSocket();\n\nexport function createRawTcpHolePunchCandidates(\n options: CreateRawTcpHolePunchCandidatesOptions,\n): P2PTransportCandidate[] {\n const plan = options.plan ?? computeTcpHolePunchPlan(options.planOptions);\n const createdAt = (options.createdAt ?? new Date()).toISOString();\n const hostOrAddress = options.host ?? options.address;\n const prefix = options.candidateIdPrefix ?? `${options.sourceId}_${plan.bucket}`;\n\n return plan.ports.map((port, index) => ({\n id: `${prefix}_${port}_${index}`,\n role: options.role,\n sourceId: options.sourceId,\n createdAt,\n protocol: 'tcp',\n transport: RAW_TCP_HOLE_PUNCH_TRANSPORT,\n ...(options.host ? { host: options.host } : {}),\n ...(options.address ? { address: options.address } : {}),\n ...(hostOrAddress ? { url: `tcp-punch://${hostOrAddress}:${port}` } : {}),\n port,\n priority: options.priority ?? (100 - index),\n metadata: {\n provider: RAW_TCP_HOLE_PUNCH_TRANSPORT,\n bucket: plan.bucket,\n boundary: plan.boundary,\n rendezvousTimeSeconds: plan.rendezvousTimeSeconds,\n },\n }));\n}\n\nexport async function createSignaledRawTcpP2PSession(\n options: SignaledRawTcpP2PSessionOptions,\n): Promise<SignaledRawTcpP2PSession> {\n const plan = options.plan ?? computeTcpHolePunchPlan(options.planOptions);\n const localCandidates = createRawTcpHolePunchCandidates({\n role: 'client',\n sourceId: options.clientId,\n host: options.host,\n address: options.address,\n createdAt: options.createdAt,\n priority: options.priority,\n plan,\n candidateIdPrefix: options.candidateIdPrefix,\n });\n const request: CreateP2PSessionInput = {\n clientId: options.clientId,\n capabilities: uniqueStrings([\n RAW_TCP_HOLE_PUNCH_CAPABILITY,\n ...(options.capabilities ?? []),\n ]),\n candidates: localCandidates,\n };\n const session = await options.signaling.createP2PSession(request);\n const effectiveLocalCandidates = localRawTcpCandidatesFromSessionOrFallback(\n session,\n localCandidates,\n 'client',\n options.clientId,\n plan.bucket,\n );\n return {\n session,\n plan,\n localCandidates: effectiveLocalCandidates,\n rawTcpRoute: selectRawTcpP2PRoute(session.nodeCandidates),\n };\n}\n\nexport async function answerPendingRawTcpP2PSessionsOnce(\n options: AnswerPendingRawTcpP2PSessionsOnceOptions,\n): Promise<P2PSession[]> {\n const sessions = await options.signaling.listP2PSessions();\n const answered: P2PSession[] = [];\n for (const session of sessions) {\n if (!selectRawTcpP2PRoute(session.nodeCandidates)) {\n continue;\n }\n const plan = planFromRemoteCandidates(session.candidates, 'client');\n if (!plan) {\n continue;\n }\n if (hasRawTcpCandidate(session.candidates, 'node', options.sourceId, plan.bucket)) {\n continue;\n }\n const candidates = createRawTcpHolePunchCandidates({\n role: 'node',\n sourceId: options.sourceId,\n host: options.host,\n address: options.address,\n createdAt: options.createdAt,\n priority: options.priority,\n plan,\n candidateIdPrefix: options.candidateIdPrefix,\n });\n answered.push(await options.signaling.addP2PCandidates(session.signalingUrl || session.sessionId, {\n role: 'node',\n sourceId: options.sourceId,\n candidates,\n }));\n }\n return answered;\n}\n\nexport async function acceptSignaledRawTcpP2PConnectionOnce(\n options: AcceptSignaledRawTcpP2PConnectionOnceOptions,\n): Promise<AcceptedSignaledRawTcpP2PConnection | undefined> {\n const sessions = await options.signaling.listP2PSessions();\n const errors: string[] = [];\n for (const session of sessions) {\n if (!selectRawTcpP2PRoute(session.nodeCandidates)) {\n continue;\n }\n const plan = planFromRemoteCandidates(session.candidates, 'client');\n if (!plan) {\n continue;\n }\n const localCandidates = createRawTcpHolePunchCandidates({\n role: 'node',\n sourceId: options.sourceId,\n host: options.host,\n address: options.address,\n createdAt: options.createdAt,\n priority: options.priority,\n plan,\n candidateIdPrefix: options.candidateIdPrefix,\n });\n const answeredSession = hasRawTcpCandidate(session.candidates, 'node', options.sourceId, plan.bucket)\n ? session\n : await options.signaling.addP2PCandidates(session.signalingUrl || session.sessionId, {\n role: 'node',\n sourceId: options.sourceId,\n candidates: localCandidates,\n });\n const remoteCandidates = filterRawTcpRemoteCandidates(\n answeredSession.candidates,\n 'node',\n options.sourceId,\n plan.bucket,\n );\n if (remoteCandidates.length === 0) {\n continue;\n }\n const effectiveLocalCandidates = localRawTcpCandidatesFromSessionOrFallback(\n answeredSession,\n localCandidates,\n 'node',\n options.sourceId,\n plan.bucket,\n );\n try {\n const socket = await connectRawTcpP2PSocket({\n localCandidates: effectiveLocalCandidates,\n remoteCandidates,\n connectTimeoutMs: options.connectTimeoutMs,\n winnerSelectionWindowMs: options.winnerSelectionWindowMs,\n localAddress: options.localAddress,\n nowMs: options.nowMs,\n sleepMs: options.sleepMs,\n connectSocket: options.connectSocket,\n });\n return {\n session: answeredSession,\n plan,\n localCandidates: effectiveLocalCandidates,\n remoteCandidates,\n socketHandle: attachTcpP2PDataPlaneSocket({ socket, handler: options.handler }),\n };\n } catch (error) {\n errors.push(`${session.sessionId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n if (errors.length > 0) {\n throw new Error(`Failed to accept raw TCP P2P sessions: ${errors.join('; ')}`);\n }\n return undefined;\n}\n\nexport async function waitForRawTcpRemoteCandidates(\n options: WaitForRawTcpRemoteCandidatesOptions,\n): Promise<P2PTransportCandidate[]> {\n const startedAt = Date.now();\n const timeoutMs = positiveInteger(options.timeoutMs, DEFAULT_WAIT_TIMEOUT_MS);\n const pollIntervalMs = positiveInteger(options.pollIntervalMs, DEFAULT_POLL_INTERVAL_MS);\n for (;;) {\n const session = await options.signaling.getP2PSession(options.sessionIdOrUrl);\n const candidates = filterRawTcpRemoteCandidates(\n session.candidates,\n options.localRole,\n options.localSourceId,\n options.bucket,\n );\n if (candidates.length > 0) {\n return candidates;\n }\n if (Date.now() - startedAt >= timeoutMs) {\n throw new Error(`Timed out waiting for raw TCP P2P candidates after ${timeoutMs}ms`);\n }\n await sleep(Math.min(pollIntervalMs, Math.max(1, timeoutMs - (Date.now() - startedAt))));\n }\n}\n\nexport async function connectSignaledRawTcpP2PTransport(\n options: ConnectSignaledRawTcpP2PTransportOptions,\n): Promise<ConnectedSignaledRawTcpP2PTransport> {\n const signaled = await createSignaledRawTcpP2PSession(options);\n const remoteCandidates = await waitForRawTcpRemoteCandidates({\n signaling: options.signaling,\n sessionIdOrUrl: signaled.session.signalingUrl || signaled.session.sessionId,\n localRole: 'client',\n localSourceId: options.clientId,\n bucket: signaled.plan.bucket,\n pollIntervalMs: options.pollIntervalMs,\n timeoutMs: options.waitTimeoutMs,\n });\n const transport = await connectRawTcpP2PTransport({\n localCandidates: signaled.localCandidates,\n remoteCandidates,\n connectTimeoutMs: options.connectTimeoutMs,\n timeoutMs: options.timeoutMs,\n winnerSelectionWindowMs: options.winnerSelectionWindowMs,\n localAddress: options.localAddress,\n nowMs: options.nowMs,\n sleepMs: options.sleepMs,\n connectSocket: options.connectSocket,\n });\n return {\n ...signaled,\n remoteCandidates,\n transport,\n };\n}\n\nexport async function connectRawTcpP2PTransport(\n options: ConnectRawTcpP2PTransportOptions,\n): Promise<TcpP2PDataPlaneTransport> {\n const { attempt, socket } = await connectRawTcpP2PSocketAttempt(options);\n return createTcpP2PDataPlaneTransport({\n remoteHost: attempt.remoteHost,\n remotePort: attempt.remotePort,\n socket,\n timeoutMs: options.timeoutMs,\n });\n}\n\nasync function connectRawTcpP2PSocket(\n options: ConnectRawTcpP2PTransportOptions,\n): Promise<Socket> {\n const { socket } = await connectRawTcpP2PSocketAttempt(options);\n return socket;\n}\n\nasync function connectRawTcpP2PSocketAttempt(\n options: ConnectRawTcpP2PTransportOptions,\n): Promise<{ attempt: RawTcpP2PConnectAttempt; socket: Socket }> {\n const pairs = candidatePairs(options.localCandidates, options.remoteCandidates);\n if (pairs.length === 0) {\n throw new Error('No compatible raw TCP P2P candidate pairs');\n }\n\n const errors: string[] = [];\n const nowMs = options.nowMs ?? Date.now;\n const sleepMs = options.sleepMs ?? sleep;\n const connectSocket = options.connectSocket ?? defaultNodeRawTcpP2PConnectSocket;\n const attempts = pairs.map(({ local, remote }) => createRawTcpConnectAttempt(local, remote, {\n timeoutMs: positiveInteger(options.connectTimeoutMs, DEFAULT_CONNECT_TIMEOUT_MS),\n localAddress: options.localAddress,\n }));\n try {\n const { attempt, socket } = await connectFirstRawTcpAttempt(attempts, {\n nowMs,\n sleepMs,\n connectSocket,\n winnerSelectionWindowMs: nonNegativeInteger(options.winnerSelectionWindowMs, 0),\n });\n return { attempt, socket };\n } catch (error) {\n errors.push(error instanceof Error ? error.message : String(error));\n }\n throw new Error(`Failed to connect raw TCP P2P candidates: ${errors.join('; ')}`);\n}\n\nexport function filterRawTcpRemoteCandidates(\n candidates: P2PTransportCandidate[],\n localRole: P2PCandidateRole,\n localSourceId: string,\n bucket?: number,\n): P2PTransportCandidate[] {\n return candidates.filter((candidate) => {\n if (!isRawTcpHolePunchCandidate(candidate)) {\n return false;\n }\n if (candidate.role === localRole && candidate.sourceId === localSourceId) {\n return false;\n }\n if (bucket !== undefined && getNumericMetadata(candidate, 'bucket') !== bucket) {\n return false;\n }\n return true;\n });\n}\n\nexport function selectRawTcpP2PRoute(routes: AccessRoute[]): AccessRoute | undefined {\n return routes.find((route) => {\n if (route.kind !== 'p2p') {\n return false;\n }\n if (route.targetUrl.startsWith('tcp-punch://')) {\n return true;\n }\n const protocols = isRecord(route.metadata?.protocols) ? route.metadata.protocols : undefined;\n const rawTcp = isRecord(protocols?.[RAW_TCP_HOLE_PUNCH_TRANSPORT])\n ? protocols[RAW_TCP_HOLE_PUNCH_TRANSPORT]\n : undefined;\n return rawTcp?.enabled === true;\n });\n}\n\nexport function isRawTcpHolePunchCandidate(candidate: P2PTransportCandidate): boolean {\n return candidate.protocol === 'tcp'\n && candidate.transport === RAW_TCP_HOLE_PUNCH_TRANSPORT\n && getNumericMetadata(candidate, 'bucket') !== undefined\n && getNumericMetadata(candidate, 'rendezvousTimeSeconds') !== undefined\n && typeof candidate.port === 'number';\n}\n\nfunction localRawTcpCandidatesFromSessionOrFallback(\n session: P2PSession,\n fallback: P2PTransportCandidate[],\n role: P2PCandidateRole,\n sourceId: string,\n bucket: number,\n): P2PTransportCandidate[] {\n const signaledCandidates = session.candidates.filter((candidate) => candidate.role === role\n && candidate.sourceId === sourceId\n && isRawTcpHolePunchCandidate(candidate)\n && getNumericMetadata(candidate, 'bucket') === bucket);\n return signaledCandidates.length > 0 ? signaledCandidates : fallback;\n}\n\nfunction candidatePairs(\n localCandidates: P2PTransportCandidate[],\n remoteCandidates: P2PTransportCandidate[],\n): { local: P2PTransportCandidate; remote: P2PTransportCandidate }[] {\n const local = localCandidates.filter(isRawTcpHolePunchCandidate).sort(compareCandidatePriority);\n const remote = remoteCandidates\n .filter(isRawTcpHolePunchCandidate)\n .filter((candidate) => candidateHost(candidate).length > 0)\n .sort(compareCandidatePriority);\n const result: { local: P2PTransportCandidate; remote: P2PTransportCandidate }[] = [];\n for (const localCandidate of local) {\n const localBucket = getNumericMetadata(localCandidate, 'bucket');\n for (const remoteCandidate of remote) {\n if (localBucket === getNumericMetadata(remoteCandidate, 'bucket')) {\n result.push({ local: localCandidate, remote: remoteCandidate });\n }\n }\n }\n return result;\n}\n\nfunction createRawTcpConnectAttempt(\n local: P2PTransportCandidate,\n remote: P2PTransportCandidate,\n options: { timeoutMs: number; localAddress?: string },\n): RawTcpP2PConnectAttempt {\n const remoteHost = candidateHost(remote);\n const remotePort = remote.port;\n if (!remoteHost || !remotePort) {\n throw new Error(`Remote raw TCP candidate ${remote.id} is missing host or port`);\n }\n const localRendezvousTimeSeconds = getNumericMetadata(local, 'rendezvousTimeSeconds') ?? 0;\n const remoteRendezvousTimeSeconds = getNumericMetadata(remote, 'rendezvousTimeSeconds') ?? 0;\n return {\n local,\n remote,\n remoteHost,\n remotePort,\n localAddress: options.localAddress,\n ...(local.port ? { localPort: local.port } : {}),\n rendezvousTimeMs: Math.max(localRendezvousTimeSeconds, remoteRendezvousTimeSeconds) * 1_000,\n timeoutMs: options.timeoutMs,\n };\n}\n\nasync function connectFirstRawTcpAttempt(\n attempts: RawTcpP2PConnectAttempt[],\n options: {\n nowMs: () => number;\n sleepMs: RawTcpP2PSleep;\n connectSocket: RawTcpP2PConnectSocket;\n winnerSelectionWindowMs: number;\n },\n): Promise<{ attempt: RawTcpP2PConnectAttempt; socket: Socket }> {\n return new Promise((resolve, reject) => {\n const controllers = attempts.map(() => new AbortController());\n const errors: string[] = [];\n const successes: Array<{ attempt: RawTcpP2PConnectAttempt; socket: Socket; index: number }> = [];\n let pending = attempts.length;\n let settled = false;\n let settleTimer: NodeJS.Timeout | undefined;\n\n const clearSettleTimer = (): void => {\n if (settleTimer) {\n clearTimeout(settleTimer);\n settleTimer = undefined;\n }\n };\n const finishReject = (error: Error): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearSettleTimer();\n reject(error);\n };\n const finishWithWinner = (): void => {\n if (settled) {\n return;\n }\n if (successes.length === 0) {\n finishReject(new Error(errors.join('; ')));\n return;\n }\n settled = true;\n clearSettleTimer();\n const winner = selectRawTcpWinner(successes);\n controllers.forEach((controller, index) => {\n if (index !== winner.index) {\n controller.abort();\n }\n });\n for (const success of successes) {\n if (success !== winner) {\n success.socket.destroy();\n }\n }\n resolve({ attempt: winner.attempt, socket: winner.socket });\n };\n const scheduleWinner = (): void => {\n if (options.winnerSelectionWindowMs <= 0 || pending === 0) {\n finishWithWinner();\n return;\n }\n settleTimer ??= setTimeout(finishWithWinner, options.winnerSelectionWindowMs);\n };\n\n attempts.forEach((baseAttempt, index) => {\n const controller = controllers[index];\n const attempt: RawTcpP2PConnectAttempt = {\n ...baseAttempt,\n signal: controller.signal,\n };\n void runRawTcpConnectAttempt(attempt, options)\n .then((socket) => {\n if (settled) {\n socket.destroy();\n return;\n }\n successes.push({ attempt, socket, index });\n pending -= 1;\n scheduleWinner();\n })\n .catch((error) => {\n if (settled) {\n return;\n }\n errors.push(error instanceof Error ? error.message : String(error));\n pending -= 1;\n if (pending === 0) {\n if (successes.length > 0) {\n finishWithWinner();\n } else {\n finishReject(new Error(errors.join('; ')));\n }\n }\n });\n });\n });\n}\n\nfunction selectRawTcpWinner(\n successes: Array<{ attempt: RawTcpP2PConnectAttempt; socket: Socket; index: number }>,\n): { attempt: RawTcpP2PConnectAttempt; socket: Socket; index: number } {\n return successes.slice().sort((left, right) => {\n const keyCompare = rawTcpAttemptPairKey(left.attempt).localeCompare(rawTcpAttemptPairKey(right.attempt));\n return keyCompare === 0 ? left.index - right.index : keyCompare;\n })[0];\n}\n\nfunction rawTcpAttemptPairKey(attempt: RawTcpP2PConnectAttempt): string {\n const endpoints = [\n rawTcpEndpointKey(attempt.local),\n rawTcpEndpointKey(attempt.remote),\n ].sort();\n return endpoints.join('<->');\n}\n\nfunction rawTcpEndpointKey(candidate: P2PTransportCandidate): string {\n return [\n candidate.sourceId,\n candidateHost(candidate),\n String(candidate.port ?? ''),\n candidate.id,\n ].join('|');\n}\n\nasync function runRawTcpConnectAttempt(\n attempt: RawTcpP2PConnectAttempt,\n options: {\n nowMs: () => number;\n sleepMs: RawTcpP2PSleep;\n connectSocket: RawTcpP2PConnectSocket;\n },\n): Promise<Socket> {\n await waitForRendezvous(attempt.rendezvousTimeMs, options.nowMs, options.sleepMs, attempt.signal);\n return connectSocketWithTimeout(attempt, options.connectSocket);\n}\n\nasync function waitForRendezvous(\n rendezvousTimeMs: number,\n nowMs: () => number,\n sleepMs: RawTcpP2PSleep,\n signal?: AbortSignal,\n): Promise<void> {\n const delayMs = rendezvousTimeMs - nowMs();\n if (delayMs > 0) {\n await abortableSleep(delayMs, sleepMs, signal);\n }\n if (signal?.aborted) {\n throw new Error('Raw TCP candidate connect aborted');\n }\n}\n\nasync function connectSocketWithTimeout(\n attempt: RawTcpP2PConnectAttempt,\n connectSocket: RawTcpP2PConnectSocket,\n): Promise<Socket> {\n return new Promise((resolve, reject) => {\n let finished = false;\n const timeout = setTimeout(() => {\n finishReject(new Error(`Raw TCP candidate connect timed out after ${attempt.timeoutMs}ms`));\n }, attempt.timeoutMs);\n const onAbort = (): void => {\n finishReject(new Error('Raw TCP candidate connect aborted'));\n };\n const cleanup = (): void => {\n clearTimeout(timeout);\n attempt.signal?.removeEventListener('abort', onAbort);\n };\n const finishReject = (error: Error): void => {\n if (finished) {\n return;\n }\n finished = true;\n cleanup();\n reject(error);\n };\n attempt.signal?.addEventListener('abort', onAbort, { once: true });\n if (attempt.signal?.aborted) {\n finishReject(new Error('Raw TCP candidate connect aborted'));\n return;\n }\n void connectSocket(attempt)\n .then((socket) => {\n if (finished) {\n socket.destroy();\n return;\n }\n finished = true;\n cleanup();\n resolve(socket);\n })\n .catch((error) => {\n finishReject(error instanceof Error ? error : new Error(String(error)));\n });\n });\n}\n\nasync function connectNodeRawTcpSocket(\n attempt: RawTcpP2PConnectAttempt,\n options: CreateNodeRawTcpP2PConnectSocketOptions,\n): Promise<Socket> {\n const startedAt = Date.now();\n const retryIntervalMs = positiveInteger(options.retryIntervalMs, DEFAULT_RAW_TCP_RETRY_INTERVAL_MS);\n let lastError: Error | undefined;\n for (;;) {\n if (attempt.signal?.aborted) {\n options.onEvent?.({ type: 'aborted', attempt });\n throw new Error('Raw TCP candidate connect aborted');\n }\n const remainingMs = attempt.timeoutMs - (Date.now() - startedAt);\n if (remainingMs <= 0) {\n const error = new Error(`Raw TCP candidate connect timed out after ${attempt.timeoutMs}ms${lastError ? `: ${lastError.message}` : ''}`);\n options.onEvent?.({ type: 'timeout', attempt, error });\n throw error;\n }\n options.onEvent?.({ type: 'attempt', attempt, remainingMs });\n try {\n const socket = await connectRawTcpSocketOnce(attempt, remainingMs);\n options.onEvent?.({ type: 'success', attempt, socket });\n return socket;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n if (attempt.signal?.aborted) {\n options.onEvent?.({ type: 'aborted', attempt, error: lastError });\n throw new Error('Raw TCP candidate connect aborted');\n }\n const remainingAfterFailureMs = attempt.timeoutMs - (Date.now() - startedAt);\n const retryDelayMs = Math.min(\n retryIntervalMs,\n Math.max(0, remainingAfterFailureMs),\n );\n if (retryDelayMs <= 0) {\n const timeoutError = new Error(`Raw TCP candidate connect timed out after ${attempt.timeoutMs}ms: ${lastError.message}`);\n options.onEvent?.({ type: 'timeout', attempt, error: timeoutError });\n throw timeoutError;\n }\n options.onEvent?.({\n type: 'retry',\n attempt,\n error: lastError,\n remainingMs: remainingAfterFailureMs,\n retryDelayMs,\n });\n try {\n await sleep(retryDelayMs, attempt.signal);\n } catch (sleepError) {\n if (attempt.signal?.aborted) {\n options.onEvent?.({\n type: 'aborted',\n attempt,\n error: sleepError instanceof Error ? sleepError : new Error(String(sleepError)),\n });\n }\n throw sleepError;\n }\n }\n }\n}\n\nasync function connectRawTcpSocketOnce(attempt: RawTcpP2PConnectAttempt, timeoutMs: number): Promise<Socket> {\n return new Promise((resolve, reject) => {\n const connectOptions = {\n host: attempt.remoteHost,\n port: attempt.remotePort,\n localAddress: attempt.localAddress,\n ...(attempt.localPort ? { localPort: attempt.localPort } : {}),\n };\n const socket = createConnection(connectOptions);\n const timeout = setTimeout(() => {\n cleanup();\n socket.destroy();\n reject(new Error(`Raw TCP candidate connect attempt timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n const cleanup = (): void => {\n clearTimeout(timeout);\n socket.off('connect', onConnect);\n socket.off('error', onError);\n attempt.signal?.removeEventListener('abort', onAbort);\n };\n const onConnect = (): void => {\n cleanup();\n resolve(socket);\n };\n const onError = (error: Error): void => {\n cleanup();\n socket.destroy();\n reject(error);\n };\n const onAbort = (): void => {\n cleanup();\n socket.destroy();\n reject(new Error('Raw TCP candidate connect aborted'));\n };\n attempt.signal?.addEventListener('abort', onAbort, { once: true });\n if (attempt.signal?.aborted) {\n onAbort();\n return;\n }\n socket.once('connect', onConnect);\n socket.once('error', onError);\n });\n}\n\nfunction candidateHost(candidate: P2PTransportCandidate): string {\n return candidate.host ?? candidate.address ?? hostFromCandidateUrl(candidate.url) ?? '';\n}\n\nfunction hostFromCandidateUrl(value?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n try {\n return new URL(value).hostname;\n } catch {\n return undefined;\n }\n}\n\nfunction compareCandidatePriority(left: P2PTransportCandidate, right: P2PTransportCandidate): number {\n return (right.priority ?? 0) - (left.priority ?? 0);\n}\n\nfunction planFromRemoteCandidates(\n candidates: P2PTransportCandidate[],\n role: P2PCandidateRole,\n): TcpHolePunchPlan | undefined {\n const rawCandidates = candidates\n .filter((candidate) => candidate.role === role)\n .filter(isRawTcpHolePunchCandidate);\n const first = rawCandidates[0];\n if (!first) {\n return undefined;\n }\n const bucket = getNumericMetadata(first, 'bucket');\n const boundary = getNumericMetadata(first, 'boundary');\n const rendezvousTimeSeconds = getNumericMetadata(first, 'rendezvousTimeSeconds');\n if (bucket === undefined || boundary === undefined || rendezvousTimeSeconds === undefined) {\n return undefined;\n }\n const ports = rawCandidates\n .filter((candidate) => getNumericMetadata(candidate, 'bucket') === bucket)\n .map((candidate) => candidate.port)\n .filter((port): port is number => typeof port === 'number' && Number.isInteger(port) && port > 0);\n if (ports.length === 0) {\n return undefined;\n }\n return {\n bucket,\n boundary,\n rendezvousTimeSeconds,\n ports: [...new Set(ports)].sort((a, b) => b - a),\n };\n}\n\nfunction hasRawTcpCandidate(\n candidates: P2PTransportCandidate[],\n role: P2PCandidateRole,\n sourceId: string,\n bucket: number,\n): boolean {\n return candidates.some((candidate) => candidate.role === role\n && candidate.sourceId === sourceId\n && isRawTcpHolePunchCandidate(candidate)\n && getNumericMetadata(candidate, 'bucket') === bucket);\n}\n\nfunction getNumericMetadata(candidate: P2PTransportCandidate, key: string): number | undefined {\n const value = candidate.metadata?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return [...new Set(values.filter((value) => value.trim().length > 0))];\n}\n\nfunction positiveInteger(value: number | undefined, fallback: number): number {\n return Number.isInteger(value) && value !== undefined && value > 0 ? value : fallback;\n}\n\nfunction nonNegativeInteger(value: number | undefined, fallback: number): number {\n return Number.isInteger(value) && value !== undefined && value >= 0 ? value : fallback;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n const onAbort = (): void => {\n cleanup();\n reject(new Error('Raw TCP candidate connect aborted'));\n };\n const cleanup = (): void => {\n clearTimeout(timeout);\n signal?.removeEventListener('abort', onAbort);\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n if (signal?.aborted) {\n onAbort();\n }\n });\n}\n\nasync function abortableSleep(\n ms: number,\n sleepMs: RawTcpP2PSleep,\n signal?: AbortSignal,\n): Promise<void> {\n if (!signal) {\n await sleepMs(ms);\n return;\n }\n if (signal.aborted) {\n throw new Error('Raw TCP candidate connect aborted');\n }\n let removeAbortListener: (() => void) | undefined;\n try {\n await Promise.race([\n sleepMs(ms, signal),\n new Promise<never>((_resolve, reject) => {\n const onAbort = (): void => reject(new Error('Raw TCP candidate connect aborted'));\n signal.addEventListener('abort', onAbort, { once: true });\n removeAbortListener = () => signal.removeEventListener('abort', onAbort);\n }),\n ]);\n } finally {\n removeAbortListener?.();\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -75,6 +75,7 @@ import { CredentialReaderImpl } from './ai/service/CredentialReaderImpl';
75
75
  import { VectorStore } from './storage/vector/VectorStore';
76
76
  import { CloudflareTunnelProvider } from './tunnel/CloudflareTunnelProvider';
77
77
  import { LocalTunnelProvider } from './tunnel/LocalTunnelProvider';
78
+ import { NgrokTunnelProvider } from './tunnel/NgrokTunnelProvider';
78
79
  import { SubdomainService } from './subdomain/SubdomainService';
79
80
  import { UrlAwareRedisLocker } from './storage/locking/UrlAwareRedisLocker';
80
81
  import { MultiDomainIdentifierStrategy } from './util/identifiers/MultiDomainIdentifierStrategy';
@@ -99,4 +100,4 @@ export type { EntitlementProvider, AccountEntitlement } from './quota/Entitlemen
99
100
  export type { TunnelProvider, TunnelConfig, TunnelSetupOptions, TunnelStatus, } from './tunnel/TunnelProvider';
100
101
  export type { SubdomainRegistration, ConnectivityResult, SubdomainServiceOptions, } from './subdomain/SubdomainService';
101
102
  export { AppStaticAssetHandler } from './http/AppStaticAssetHandler';
102
- export { RepresentationPartialConvertingStore, MinioDataAccessor, QuadstoreSparqlDataAccessor, QuintStoreSparqlDataAccessor, SolidRdfDataAccessor, MixDataAccessor, ConfigurableLoggerFactory, SparqlUpdateResourceStore, SubgraphQueryEngine, QuadstoreSparqlEngine, QuintstoreSparqlEngine, SubgraphSparqlHttpHandler, QuotaAdminHttpHandler, ClusterIngressRouter, ClusterWebSocketConfigurator, EdgeNodeDirectDebugHttpHandler, EdgeNodeProxyHttpHandler, RouterHttpHandler, RouterHttpRoute, TracingHandler, EdgeNodeCertificateHttpHandler, TerminalHttpHandler, ReservedSuffixIdentifierGenerator, DrizzleIndexedStorage, ValidatingIdentityProviderHttpHandler, PostgresKeyValueStorage, RedisKeyValueStorage, SqliteKeyValueStorage, BaseKeyValueStorage, DrizzleQuotaService, NoopQuotaService, HttpEntitlementProvider, NoopEntitlementProvider, PerAccountQuotaStrategy, TencentDnsProvider, EdgeNodeDnsCoordinator, Dns01CertificateProvisioner, SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager, FrpTunnelManager, EdgeNodeHealthProbeService, EdgeNodeAgent, EdgeNodeAgentInitializer, EdgeNodeCertificateService, AcmeCertificateManager, EdgeNodeModeDetector, ClusterIdentifierStrategy, UsageTrackingStore, CenterNodeRegistrationService, PodRoutingHttpHandler, ReactAppViewHandler, QuintStore, SqliteQuintStore, PgQuintStore, RdfTermDictionary, RdfQuadIndex, Rdf3xIndex, RdfSparqlAdapter, ShadowRdfQuintStore, SolidRdfEngine, PostgresRdfEngine, SolidRdfSparqlEngine, VectorStore, SqliteVectorStore, PostgresVectorStore, VectorHttpHandler, ProviderRegistry, ProviderRegistryImpl, EmbeddingService, EmbeddingServiceImpl, CredentialReader, CredentialReaderImpl, CloudflareTunnelProvider, LocalTunnelProvider, SubdomainService, MultiDomainIdentifierStrategy, SubdomainPodIdentifierStrategy, DisabledOidcHandler, DisabledIdentityProviderHandler, AutoDetectOidcHandler, AutoDetectIdentityProviderHandler, LoopbackClientIdAdapterFactory, ScopedPickWebIdHandler, UrlAwareRedisLocker, ProvisionPodCreator, ProvisionCodeCodec, LocalPodProvisioningService, };
103
+ export { RepresentationPartialConvertingStore, MinioDataAccessor, QuadstoreSparqlDataAccessor, QuintStoreSparqlDataAccessor, SolidRdfDataAccessor, MixDataAccessor, ConfigurableLoggerFactory, SparqlUpdateResourceStore, SubgraphQueryEngine, QuadstoreSparqlEngine, QuintstoreSparqlEngine, SubgraphSparqlHttpHandler, QuotaAdminHttpHandler, ClusterIngressRouter, ClusterWebSocketConfigurator, EdgeNodeDirectDebugHttpHandler, EdgeNodeProxyHttpHandler, RouterHttpHandler, RouterHttpRoute, TracingHandler, EdgeNodeCertificateHttpHandler, TerminalHttpHandler, ReservedSuffixIdentifierGenerator, DrizzleIndexedStorage, ValidatingIdentityProviderHttpHandler, PostgresKeyValueStorage, RedisKeyValueStorage, SqliteKeyValueStorage, BaseKeyValueStorage, DrizzleQuotaService, NoopQuotaService, HttpEntitlementProvider, NoopEntitlementProvider, PerAccountQuotaStrategy, TencentDnsProvider, EdgeNodeDnsCoordinator, Dns01CertificateProvisioner, SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager, FrpTunnelManager, EdgeNodeHealthProbeService, EdgeNodeAgent, EdgeNodeAgentInitializer, EdgeNodeCertificateService, AcmeCertificateManager, EdgeNodeModeDetector, ClusterIdentifierStrategy, UsageTrackingStore, CenterNodeRegistrationService, PodRoutingHttpHandler, ReactAppViewHandler, QuintStore, SqliteQuintStore, PgQuintStore, RdfTermDictionary, RdfQuadIndex, Rdf3xIndex, RdfSparqlAdapter, ShadowRdfQuintStore, SolidRdfEngine, PostgresRdfEngine, SolidRdfSparqlEngine, VectorStore, SqliteVectorStore, PostgresVectorStore, VectorHttpHandler, ProviderRegistry, ProviderRegistryImpl, EmbeddingService, EmbeddingServiceImpl, CredentialReader, CredentialReaderImpl, CloudflareTunnelProvider, LocalTunnelProvider, NgrokTunnelProvider, SubdomainService, MultiDomainIdentifierStrategy, SubdomainPodIdentifierStrategy, DisabledOidcHandler, DisabledIdentityProviderHandler, AutoDetectOidcHandler, AutoDetectIdentityProviderHandler, LoopbackClientIdAdapterFactory, ScopedPickWebIdHandler, UrlAwareRedisLocker, ProvisionPodCreator, ProvisionCodeCodec, LocalPodProvisioningService, };
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.CenterNodeRegistrationService = exports.UsageTrackingStore = exports.ClusterIdentifierStrategy = exports.EdgeNodeModeDetector = exports.AcmeCertificateManager = exports.EdgeNodeCertificateService = exports.EdgeNodeAgentInitializer = exports.EdgeNodeAgent = exports.EdgeNodeHealthProbeService = exports.FrpTunnelManager = exports.NoopEdgeNodeTunnelManager = exports.SimpleEdgeNodeTunnelManager = exports.Dns01CertificateProvisioner = exports.EdgeNodeDnsCoordinator = exports.TencentDnsProvider = exports.PerAccountQuotaStrategy = exports.NoopEntitlementProvider = exports.HttpEntitlementProvider = exports.NoopQuotaService = exports.DrizzleQuotaService = exports.BaseKeyValueStorage = exports.SqliteKeyValueStorage = exports.RedisKeyValueStorage = exports.PostgresKeyValueStorage = exports.ValidatingIdentityProviderHttpHandler = exports.DrizzleIndexedStorage = exports.ReservedSuffixIdentifierGenerator = exports.TerminalHttpHandler = exports.EdgeNodeCertificateHttpHandler = exports.TracingHandler = exports.RouterHttpRoute = exports.RouterHttpHandler = exports.EdgeNodeProxyHttpHandler = exports.EdgeNodeDirectDebugHttpHandler = exports.ClusterWebSocketConfigurator = exports.ClusterIngressRouter = exports.QuotaAdminHttpHandler = exports.SubgraphSparqlHttpHandler = exports.QuintstoreSparqlEngine = exports.QuadstoreSparqlEngine = exports.SubgraphQueryEngine = exports.SparqlUpdateResourceStore = exports.ConfigurableLoggerFactory = exports.MixDataAccessor = exports.SolidRdfDataAccessor = exports.QuintStoreSparqlDataAccessor = exports.QuadstoreSparqlDataAccessor = exports.MinioDataAccessor = exports.RepresentationPartialConvertingStore = exports.AppStaticAssetHandler = void 0;
18
- exports.LocalPodProvisioningService = exports.ProvisionCodeCodec = exports.ProvisionPodCreator = exports.UrlAwareRedisLocker = exports.ScopedPickWebIdHandler = exports.LoopbackClientIdAdapterFactory = exports.AutoDetectIdentityProviderHandler = exports.AutoDetectOidcHandler = exports.DisabledIdentityProviderHandler = exports.DisabledOidcHandler = exports.SubdomainPodIdentifierStrategy = exports.MultiDomainIdentifierStrategy = exports.SubdomainService = exports.LocalTunnelProvider = exports.CloudflareTunnelProvider = exports.CredentialReaderImpl = exports.CredentialReader = exports.EmbeddingServiceImpl = exports.EmbeddingService = exports.ProviderRegistryImpl = exports.ProviderRegistry = exports.VectorHttpHandler = exports.PostgresVectorStore = exports.SqliteVectorStore = exports.VectorStore = exports.SolidRdfSparqlEngine = exports.PostgresRdfEngine = exports.SolidRdfEngine = exports.ShadowRdfQuintStore = exports.RdfSparqlAdapter = exports.Rdf3xIndex = exports.RdfQuadIndex = exports.RdfTermDictionary = exports.PgQuintStore = exports.SqliteQuintStore = exports.QuintStore = exports.ReactAppViewHandler = exports.PodRoutingHttpHandler = void 0;
18
+ exports.LocalPodProvisioningService = exports.ProvisionCodeCodec = exports.ProvisionPodCreator = exports.UrlAwareRedisLocker = exports.ScopedPickWebIdHandler = exports.LoopbackClientIdAdapterFactory = exports.AutoDetectIdentityProviderHandler = exports.AutoDetectOidcHandler = exports.DisabledIdentityProviderHandler = exports.DisabledOidcHandler = exports.SubdomainPodIdentifierStrategy = exports.MultiDomainIdentifierStrategy = exports.SubdomainService = exports.NgrokTunnelProvider = exports.LocalTunnelProvider = exports.CloudflareTunnelProvider = exports.CredentialReaderImpl = exports.CredentialReader = exports.EmbeddingServiceImpl = exports.EmbeddingService = exports.ProviderRegistryImpl = exports.ProviderRegistry = exports.VectorHttpHandler = exports.PostgresVectorStore = exports.SqliteVectorStore = exports.VectorStore = exports.SolidRdfSparqlEngine = exports.PostgresRdfEngine = exports.SolidRdfEngine = exports.ShadowRdfQuintStore = exports.RdfSparqlAdapter = exports.Rdf3xIndex = exports.RdfQuadIndex = exports.RdfTermDictionary = exports.PgQuintStore = exports.SqliteQuintStore = exports.QuintStore = exports.ReactAppViewHandler = exports.PodRoutingHttpHandler = void 0;
19
19
  require("./runtime/configure-drizzle-solid");
20
20
  const RepresentationPartialConvertingStore_1 = require("./storage/RepresentationPartialConvertingStore");
21
21
  Object.defineProperty(exports, "RepresentationPartialConvertingStore", { enumerable: true, get: function () { return RepresentationPartialConvertingStore_1.RepresentationPartialConvertingStore; } });
@@ -163,6 +163,8 @@ const CloudflareTunnelProvider_1 = require("./tunnel/CloudflareTunnelProvider");
163
163
  Object.defineProperty(exports, "CloudflareTunnelProvider", { enumerable: true, get: function () { return CloudflareTunnelProvider_1.CloudflareTunnelProvider; } });
164
164
  const LocalTunnelProvider_1 = require("./tunnel/LocalTunnelProvider");
165
165
  Object.defineProperty(exports, "LocalTunnelProvider", { enumerable: true, get: function () { return LocalTunnelProvider_1.LocalTunnelProvider; } });
166
+ const NgrokTunnelProvider_1 = require("./tunnel/NgrokTunnelProvider");
167
+ Object.defineProperty(exports, "NgrokTunnelProvider", { enumerable: true, get: function () { return NgrokTunnelProvider_1.NgrokTunnelProvider; } });
166
168
  const SubdomainService_1 = require("./subdomain/SubdomainService");
167
169
  Object.defineProperty(exports, "SubdomainService", { enumerable: true, get: function () { return SubdomainService_1.SubdomainService; } });
168
170
  const UrlAwareRedisLocker_1 = require("./storage/locking/UrlAwareRedisLocker");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import './runtime/configure-drizzle-solid';\nimport { RepresentationPartialConvertingStore } from './storage/RepresentationPartialConvertingStore';\nimport { MinioDataAccessor } from './storage/accessors/MinioDataAccessor';\nimport { QuadstoreSparqlDataAccessor } from './storage/accessors/QuadstoreSparqlDataAccessor';\nimport { QuintStoreSparqlDataAccessor } from './storage/accessors/QuintStoreSparqlDataAccessor';\nimport { SolidRdfDataAccessor } from './storage/accessors/SolidRdfDataAccessor';\nimport { MixDataAccessor } from './storage/accessors/MixDataAccessor';\nimport { ConfigurableLoggerFactory } from './logging/ConfigurableLoggerFactory';\nimport { SubgraphQueryEngine } from './storage/sparql/SubgraphQueryEngine';\nimport { QuadstoreSparqlEngine, QuintstoreSparqlEngine } from './storage/sparql/CompatibilitySparqlEngine';\nexport type { SparqlEngine } from './storage/sparql/SubgraphQueryEngine';\nexport type {\n RdfEngineLike,\n RdfEngineStorageStats,\n RdfDerivedIndexRefreshResult,\n RdfIndexStats,\n RdfIndexSpaceObject,\n RdfIndexMetrics,\n RdfIndexPutOptions,\n RdfPatternQuery,\n RdfQuadIndexOptions,\n RdfQuadIndexScanResult,\n RdfShadowBackfillOptions,\n RdfShadowBackfillResult,\n RdfShadowDiff,\n RdfShadowScanResult,\n RdfSourceInput,\n} from './storage/rdf/types';\nexport type { RdfSparqlCompileResult } from './storage/rdf/RdfSparqlAdapter';\nexport type { ShadowRdfQuintStoreOptions } from './storage/rdf/ShadowRdfQuintStore';\nexport type {\n SolidRdfSparqlEngineOptions,\n SolidRdfSparqlFallback,\n} from './storage/rdf/SolidRdfSparqlEngine';\nexport type { PostgresRdfEngineOptions } from './storage/rdf/PostgresRdfEngine';\nimport { SubgraphSparqlHttpHandler } from './http/SubgraphSparqlHttpHandler';\nimport { QuotaAdminHttpHandler } from './http/quota/QuotaAdminHttpHandler';\nimport { SparqlUpdateResourceStore } from './storage/SparqlUpdateResourceStore';\nimport { ClusterIngressRouter } from './http/ClusterIngressRouter';\nimport { ClusterWebSocketConfigurator } from './http/ClusterWebSocketConfigurator';\nimport { EdgeNodeDirectDebugHttpHandler } from './http/EdgeNodeDirectDebugHttpHandler';\nimport { EdgeNodeProxyHttpHandler } from './http/EdgeNodeProxyHttpHandler';\nimport { RouterHttpHandler } from './http/RouterHttpHandler';\nimport { RouterHttpRoute } from './http/RouterHttpRoute';\nimport { TracingHandler } from './http/TracingHandler';\nimport { TerminalHttpHandler } from './http/terminal/TerminalHttpHandler';\nimport { EdgeNodeCertificateHttpHandler } from './http/admin/EdgeNodeCertificateHttpHandler';\nimport { ReservedSuffixIdentifierGenerator } from './pods/ReservedSuffixIdentifierGenerator';\nimport { DrizzleIndexedStorage } from './identity/drizzle/DrizzleIndexedStorage';\nimport { ValidatingIdentityProviderHttpHandler } from './identity/ValidatingIdentityProviderHttpHandler';\nimport { PostgresKeyValueStorage } from './storage/keyvalue/PostgresKeyValueStorage';\nimport { RedisKeyValueStorage } from './storage/keyvalue/RedisKeyValueStorage';\nimport { SqliteKeyValueStorage } from './storage/keyvalue/SqliteKeyValueStorage';\nimport { BaseKeyValueStorage } from './storage/keyvalue/BaseKeyValueStorage';\nimport { DrizzleQuotaService } from './quota/DrizzleQuotaService';\nimport { NoopQuotaService } from './quota/NoopQuotaService';\nimport { HttpEntitlementProvider, NoopEntitlementProvider } from './quota/EntitlementProvider';\nimport { PerAccountQuotaStrategy } from './storage/quota/PerAccountQuotaStrategy';\nimport { TencentDnsProvider } from './dns/tencent/TencentDnsProvider';\nimport { EdgeNodeDnsCoordinator } from './edge/EdgeNodeDnsCoordinator';\nimport { Dns01CertificateProvisioner } from './edge/Dns01CertificateProvisioner';\nimport { SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager } from './edge/EdgeNodeTunnelManager';\nimport { FrpTunnelManager } from './edge/FrpTunnelManager';\nimport { AcmeCertificateManager } from './edge/acme/AcmeCertificateManager';\nimport { EdgeNodeHealthProbeService } from './edge/EdgeNodeHealthProbeService';\nimport { EdgeNodeAgent } from './edge/EdgeNodeAgent';\nimport { EdgeNodeAgentInitializer } from './edge/EdgeNodeAgentInitializer';\nimport { EdgeNodeCertificateService } from './service/EdgeNodeCertificateService';\nimport { createBandwidthThrottleTransform } from './util/stream/BandwidthThrottleTransform';\nimport { UsageTrackingStore } from './storage/quota/UsageTrackingStore';\nimport { EdgeNodeModeDetector } from './edge/EdgeNodeModeDetector';\nimport { ClusterIdentifierStrategy } from './util/identifiers/ClusterIdentifierStrategy';\nimport { CenterNodeRegistrationService } from './identity/CenterNodeRegistrationService';\nimport { PodRoutingHttpHandler } from './http/PodRoutingHttpHandler';\nimport { ReactAppViewHandler } from './identity/ReactAppViewHandler';\nimport { SqliteQuintStore } from './storage/quint/SqliteQuintStore';\nimport { PgQuintStore } from './storage/quint/PgQuintStore';\nimport { QuintStore } from './storage/quint/types';\nimport { RdfQuadIndex } from './storage/rdf/RdfQuadIndex';\nimport { Rdf3xIndex } from './storage/rdf/Rdf3xIndex';\nimport { RdfSparqlAdapter } from './storage/rdf/RdfSparqlAdapter';\nimport { RdfTermDictionary } from './storage/rdf/RdfTermDictionary';\nimport { ShadowRdfQuintStore } from './storage/rdf/ShadowRdfQuintStore';\nimport { SolidRdfEngine } from './storage/rdf/SolidRdfEngine';\nimport { PostgresRdfEngine } from './storage/rdf/PostgresRdfEngine';\nimport { SolidRdfSparqlEngine } from './storage/rdf/SolidRdfSparqlEngine';\nimport type { EdgeNodeCertificateProvisioner } from './edge/EdgeNodeCertificateProvisioner';\n// Vector components\nimport { SqliteVectorStore, PostgresVectorStore } from './storage/vector/index';\nimport { VectorHttpHandler } from './http/vector/VectorHttpHandler';\nimport { ProviderRegistry } from './ai/service/ProviderRegistry';\nimport { ProviderRegistryImpl } from './ai/service/ProviderRegistryImpl';\nimport { EmbeddingService } from './ai/service/EmbeddingService';\nimport { EmbeddingServiceImpl } from './ai/service/EmbeddingServiceImpl';\nimport { CredentialReader } from './ai/service/CredentialReader';\nimport { CredentialReaderImpl } from './ai/service/CredentialReaderImpl';\nimport { VectorStore } from './storage/vector/VectorStore';\n// Tunnel and Subdomain components\nimport { CloudflareTunnelProvider } from './tunnel/CloudflareTunnelProvider';\nimport { LocalTunnelProvider } from './tunnel/LocalTunnelProvider';\nimport { SubdomainService } from './subdomain/SubdomainService';\nimport { UrlAwareRedisLocker } from './storage/locking/UrlAwareRedisLocker';\n// IdP/SP separation components\nimport { MultiDomainIdentifierStrategy } from './util/identifiers/MultiDomainIdentifierStrategy';\nimport { SubdomainPodIdentifierStrategy } from './util/identifiers/SubdomainPodIdentifierStrategy';\nimport { DisabledOidcHandler } from './identity/oidc/DisabledOidcHandler';\nimport { DisabledIdentityProviderHandler } from './identity/oidc/DisabledIdentityProviderHandler';\nimport { AutoDetectOidcHandler } from './identity/oidc/AutoDetectOidcHandler';\nimport { AutoDetectIdentityProviderHandler } from './identity/oidc/AutoDetectIdentityProviderHandler';\nimport { LoopbackClientIdAdapterFactory } from './identity/oidc/LoopbackClientIdAdapterFactory';\nimport { ScopedPickWebIdHandler } from './identity/oidc/ScopedPickWebIdHandler';\n// Provision components\nimport { ProvisionPodCreator } from './provision/ProvisionPodCreator';\nimport { ProvisionCodeCodec } from './provision/ProvisionCodeCodec';\nimport { LocalPodProvisioningService } from './provision/LocalPodProvisioningService';\n\nexport * from './api/reconciler';\nexport * from './edge/reachability';\n\nexport type {\n DnsProvider,\n ListDnsRecordsInput,\n ListableDnsProvider,\n DeleteDnsRecordInput,\n DnsRecordSummary,\n UpsertDnsRecordInput,\n} from './dns/DnsProvider';\nexport type { EdgeNodeCertificateProvisioner } from './edge/EdgeNodeCertificateProvisioner';\nexport type { EdgeNodeAgentOptions, EdgeNodeP2PAcceptEvent } from './edge/EdgeNodeAgent';\nexport type { EdgeNodeTunnelManager } from './edge/interfaces/EdgeNodeTunnelManager';\nexport type { QuotaService, AccountQuota } from './quota/QuotaService';\nexport type { EntitlementProvider, AccountEntitlement } from './quota/EntitlementProvider';\n// Tunnel and Subdomain types\nexport type {\n TunnelProvider,\n TunnelConfig,\n TunnelSetupOptions,\n TunnelStatus,\n} from './tunnel/TunnelProvider';\nexport type {\n SubdomainRegistration,\n ConnectivityResult,\n SubdomainServiceOptions,\n} from './subdomain/SubdomainService';\n// Export the new AppStaticAssetHandler\nexport { AppStaticAssetHandler } from './http/AppStaticAssetHandler';\n\nexport {\n RepresentationPartialConvertingStore,\n MinioDataAccessor,\n QuadstoreSparqlDataAccessor,\n QuintStoreSparqlDataAccessor,\n SolidRdfDataAccessor,\n MixDataAccessor,\n ConfigurableLoggerFactory,\n SparqlUpdateResourceStore,\n SubgraphQueryEngine,\n QuadstoreSparqlEngine,\n QuintstoreSparqlEngine,\n SubgraphSparqlHttpHandler,\n QuotaAdminHttpHandler,\n ClusterIngressRouter,\n ClusterWebSocketConfigurator,\n EdgeNodeDirectDebugHttpHandler,\n EdgeNodeProxyHttpHandler,\n RouterHttpHandler,\n RouterHttpRoute,\n TracingHandler,\n EdgeNodeCertificateHttpHandler,\n TerminalHttpHandler,\n ReservedSuffixIdentifierGenerator,\n DrizzleIndexedStorage,\n ValidatingIdentityProviderHttpHandler,\n PostgresKeyValueStorage,\n RedisKeyValueStorage,\n SqliteKeyValueStorage,\n BaseKeyValueStorage,\n DrizzleQuotaService,\n NoopQuotaService,\n HttpEntitlementProvider,\n NoopEntitlementProvider,\n PerAccountQuotaStrategy,\n TencentDnsProvider,\n EdgeNodeDnsCoordinator,\n Dns01CertificateProvisioner,\n SimpleEdgeNodeTunnelManager,\n NoopEdgeNodeTunnelManager,\n FrpTunnelManager,\n EdgeNodeHealthProbeService,\n EdgeNodeAgent,\n EdgeNodeAgentInitializer,\n EdgeNodeCertificateService,\n AcmeCertificateManager,\n EdgeNodeModeDetector,\n ClusterIdentifierStrategy,\n UsageTrackingStore,\n CenterNodeRegistrationService,\n PodRoutingHttpHandler,\n ReactAppViewHandler,\n // Quint exports\n QuintStore,\n SqliteQuintStore,\n PgQuintStore,\n // RDF engine exports\n RdfTermDictionary,\n RdfQuadIndex,\n Rdf3xIndex,\n RdfSparqlAdapter,\n ShadowRdfQuintStore,\n SolidRdfEngine,\n PostgresRdfEngine,\n SolidRdfSparqlEngine,\n // Vector exports\n VectorStore,\n SqliteVectorStore,\n PostgresVectorStore,\n VectorHttpHandler,\n // Embedding exports\n ProviderRegistry,\n ProviderRegistryImpl,\n EmbeddingService,\n EmbeddingServiceImpl,\n CredentialReader,\n CredentialReaderImpl,\n // Tunnel and Subdomain exports\n CloudflareTunnelProvider,\n LocalTunnelProvider,\n SubdomainService,\n // IdP/SP separation exports\n MultiDomainIdentifierStrategy,\n SubdomainPodIdentifierStrategy,\n DisabledOidcHandler,\n DisabledIdentityProviderHandler,\n AutoDetectOidcHandler,\n AutoDetectIdentityProviderHandler,\n LoopbackClientIdAdapterFactory,\n ScopedPickWebIdHandler,\n UrlAwareRedisLocker,\n // Provision exports\n ProvisionPodCreator,\n ProvisionCodeCodec,\n LocalPodProvisioningService,\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import './runtime/configure-drizzle-solid';\nimport { RepresentationPartialConvertingStore } from './storage/RepresentationPartialConvertingStore';\nimport { MinioDataAccessor } from './storage/accessors/MinioDataAccessor';\nimport { QuadstoreSparqlDataAccessor } from './storage/accessors/QuadstoreSparqlDataAccessor';\nimport { QuintStoreSparqlDataAccessor } from './storage/accessors/QuintStoreSparqlDataAccessor';\nimport { SolidRdfDataAccessor } from './storage/accessors/SolidRdfDataAccessor';\nimport { MixDataAccessor } from './storage/accessors/MixDataAccessor';\nimport { ConfigurableLoggerFactory } from './logging/ConfigurableLoggerFactory';\nimport { SubgraphQueryEngine } from './storage/sparql/SubgraphQueryEngine';\nimport { QuadstoreSparqlEngine, QuintstoreSparqlEngine } from './storage/sparql/CompatibilitySparqlEngine';\nexport type { SparqlEngine } from './storage/sparql/SubgraphQueryEngine';\nexport type {\n RdfEngineLike,\n RdfEngineStorageStats,\n RdfDerivedIndexRefreshResult,\n RdfIndexStats,\n RdfIndexSpaceObject,\n RdfIndexMetrics,\n RdfIndexPutOptions,\n RdfPatternQuery,\n RdfQuadIndexOptions,\n RdfQuadIndexScanResult,\n RdfShadowBackfillOptions,\n RdfShadowBackfillResult,\n RdfShadowDiff,\n RdfShadowScanResult,\n RdfSourceInput,\n} from './storage/rdf/types';\nexport type { RdfSparqlCompileResult } from './storage/rdf/RdfSparqlAdapter';\nexport type { ShadowRdfQuintStoreOptions } from './storage/rdf/ShadowRdfQuintStore';\nexport type {\n SolidRdfSparqlEngineOptions,\n SolidRdfSparqlFallback,\n} from './storage/rdf/SolidRdfSparqlEngine';\nexport type { PostgresRdfEngineOptions } from './storage/rdf/PostgresRdfEngine';\nimport { SubgraphSparqlHttpHandler } from './http/SubgraphSparqlHttpHandler';\nimport { QuotaAdminHttpHandler } from './http/quota/QuotaAdminHttpHandler';\nimport { SparqlUpdateResourceStore } from './storage/SparqlUpdateResourceStore';\nimport { ClusterIngressRouter } from './http/ClusterIngressRouter';\nimport { ClusterWebSocketConfigurator } from './http/ClusterWebSocketConfigurator';\nimport { EdgeNodeDirectDebugHttpHandler } from './http/EdgeNodeDirectDebugHttpHandler';\nimport { EdgeNodeProxyHttpHandler } from './http/EdgeNodeProxyHttpHandler';\nimport { RouterHttpHandler } from './http/RouterHttpHandler';\nimport { RouterHttpRoute } from './http/RouterHttpRoute';\nimport { TracingHandler } from './http/TracingHandler';\nimport { TerminalHttpHandler } from './http/terminal/TerminalHttpHandler';\nimport { EdgeNodeCertificateHttpHandler } from './http/admin/EdgeNodeCertificateHttpHandler';\nimport { ReservedSuffixIdentifierGenerator } from './pods/ReservedSuffixIdentifierGenerator';\nimport { DrizzleIndexedStorage } from './identity/drizzle/DrizzleIndexedStorage';\nimport { ValidatingIdentityProviderHttpHandler } from './identity/ValidatingIdentityProviderHttpHandler';\nimport { PostgresKeyValueStorage } from './storage/keyvalue/PostgresKeyValueStorage';\nimport { RedisKeyValueStorage } from './storage/keyvalue/RedisKeyValueStorage';\nimport { SqliteKeyValueStorage } from './storage/keyvalue/SqliteKeyValueStorage';\nimport { BaseKeyValueStorage } from './storage/keyvalue/BaseKeyValueStorage';\nimport { DrizzleQuotaService } from './quota/DrizzleQuotaService';\nimport { NoopQuotaService } from './quota/NoopQuotaService';\nimport { HttpEntitlementProvider, NoopEntitlementProvider } from './quota/EntitlementProvider';\nimport { PerAccountQuotaStrategy } from './storage/quota/PerAccountQuotaStrategy';\nimport { TencentDnsProvider } from './dns/tencent/TencentDnsProvider';\nimport { EdgeNodeDnsCoordinator } from './edge/EdgeNodeDnsCoordinator';\nimport { Dns01CertificateProvisioner } from './edge/Dns01CertificateProvisioner';\nimport { SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager } from './edge/EdgeNodeTunnelManager';\nimport { FrpTunnelManager } from './edge/FrpTunnelManager';\nimport { AcmeCertificateManager } from './edge/acme/AcmeCertificateManager';\nimport { EdgeNodeHealthProbeService } from './edge/EdgeNodeHealthProbeService';\nimport { EdgeNodeAgent } from './edge/EdgeNodeAgent';\nimport { EdgeNodeAgentInitializer } from './edge/EdgeNodeAgentInitializer';\nimport { EdgeNodeCertificateService } from './service/EdgeNodeCertificateService';\nimport { createBandwidthThrottleTransform } from './util/stream/BandwidthThrottleTransform';\nimport { UsageTrackingStore } from './storage/quota/UsageTrackingStore';\nimport { EdgeNodeModeDetector } from './edge/EdgeNodeModeDetector';\nimport { ClusterIdentifierStrategy } from './util/identifiers/ClusterIdentifierStrategy';\nimport { CenterNodeRegistrationService } from './identity/CenterNodeRegistrationService';\nimport { PodRoutingHttpHandler } from './http/PodRoutingHttpHandler';\nimport { ReactAppViewHandler } from './identity/ReactAppViewHandler';\nimport { SqliteQuintStore } from './storage/quint/SqliteQuintStore';\nimport { PgQuintStore } from './storage/quint/PgQuintStore';\nimport { QuintStore } from './storage/quint/types';\nimport { RdfQuadIndex } from './storage/rdf/RdfQuadIndex';\nimport { Rdf3xIndex } from './storage/rdf/Rdf3xIndex';\nimport { RdfSparqlAdapter } from './storage/rdf/RdfSparqlAdapter';\nimport { RdfTermDictionary } from './storage/rdf/RdfTermDictionary';\nimport { ShadowRdfQuintStore } from './storage/rdf/ShadowRdfQuintStore';\nimport { SolidRdfEngine } from './storage/rdf/SolidRdfEngine';\nimport { PostgresRdfEngine } from './storage/rdf/PostgresRdfEngine';\nimport { SolidRdfSparqlEngine } from './storage/rdf/SolidRdfSparqlEngine';\nimport type { EdgeNodeCertificateProvisioner } from './edge/EdgeNodeCertificateProvisioner';\n// Vector components\nimport { SqliteVectorStore, PostgresVectorStore } from './storage/vector/index';\nimport { VectorHttpHandler } from './http/vector/VectorHttpHandler';\nimport { ProviderRegistry } from './ai/service/ProviderRegistry';\nimport { ProviderRegistryImpl } from './ai/service/ProviderRegistryImpl';\nimport { EmbeddingService } from './ai/service/EmbeddingService';\nimport { EmbeddingServiceImpl } from './ai/service/EmbeddingServiceImpl';\nimport { CredentialReader } from './ai/service/CredentialReader';\nimport { CredentialReaderImpl } from './ai/service/CredentialReaderImpl';\nimport { VectorStore } from './storage/vector/VectorStore';\n// Tunnel and Subdomain components\nimport { CloudflareTunnelProvider } from './tunnel/CloudflareTunnelProvider';\nimport { LocalTunnelProvider } from './tunnel/LocalTunnelProvider';\nimport { NgrokTunnelProvider } from './tunnel/NgrokTunnelProvider';\nimport { SubdomainService } from './subdomain/SubdomainService';\nimport { UrlAwareRedisLocker } from './storage/locking/UrlAwareRedisLocker';\n// IdP/SP separation components\nimport { MultiDomainIdentifierStrategy } from './util/identifiers/MultiDomainIdentifierStrategy';\nimport { SubdomainPodIdentifierStrategy } from './util/identifiers/SubdomainPodIdentifierStrategy';\nimport { DisabledOidcHandler } from './identity/oidc/DisabledOidcHandler';\nimport { DisabledIdentityProviderHandler } from './identity/oidc/DisabledIdentityProviderHandler';\nimport { AutoDetectOidcHandler } from './identity/oidc/AutoDetectOidcHandler';\nimport { AutoDetectIdentityProviderHandler } from './identity/oidc/AutoDetectIdentityProviderHandler';\nimport { LoopbackClientIdAdapterFactory } from './identity/oidc/LoopbackClientIdAdapterFactory';\nimport { ScopedPickWebIdHandler } from './identity/oidc/ScopedPickWebIdHandler';\n// Provision components\nimport { ProvisionPodCreator } from './provision/ProvisionPodCreator';\nimport { ProvisionCodeCodec } from './provision/ProvisionCodeCodec';\nimport { LocalPodProvisioningService } from './provision/LocalPodProvisioningService';\n\nexport * from './api/reconciler';\nexport * from './edge/reachability';\n\nexport type {\n DnsProvider,\n ListDnsRecordsInput,\n ListableDnsProvider,\n DeleteDnsRecordInput,\n DnsRecordSummary,\n UpsertDnsRecordInput,\n} from './dns/DnsProvider';\nexport type { EdgeNodeCertificateProvisioner } from './edge/EdgeNodeCertificateProvisioner';\nexport type { EdgeNodeAgentOptions, EdgeNodeP2PAcceptEvent } from './edge/EdgeNodeAgent';\nexport type { EdgeNodeTunnelManager } from './edge/interfaces/EdgeNodeTunnelManager';\nexport type { QuotaService, AccountQuota } from './quota/QuotaService';\nexport type { EntitlementProvider, AccountEntitlement } from './quota/EntitlementProvider';\n// Tunnel and Subdomain types\nexport type {\n TunnelProvider,\n TunnelConfig,\n TunnelSetupOptions,\n TunnelStatus,\n} from './tunnel/TunnelProvider';\nexport type {\n SubdomainRegistration,\n ConnectivityResult,\n SubdomainServiceOptions,\n} from './subdomain/SubdomainService';\n// Export the new AppStaticAssetHandler\nexport { AppStaticAssetHandler } from './http/AppStaticAssetHandler';\n\nexport {\n RepresentationPartialConvertingStore,\n MinioDataAccessor,\n QuadstoreSparqlDataAccessor,\n QuintStoreSparqlDataAccessor,\n SolidRdfDataAccessor,\n MixDataAccessor,\n ConfigurableLoggerFactory,\n SparqlUpdateResourceStore,\n SubgraphQueryEngine,\n QuadstoreSparqlEngine,\n QuintstoreSparqlEngine,\n SubgraphSparqlHttpHandler,\n QuotaAdminHttpHandler,\n ClusterIngressRouter,\n ClusterWebSocketConfigurator,\n EdgeNodeDirectDebugHttpHandler,\n EdgeNodeProxyHttpHandler,\n RouterHttpHandler,\n RouterHttpRoute,\n TracingHandler,\n EdgeNodeCertificateHttpHandler,\n TerminalHttpHandler,\n ReservedSuffixIdentifierGenerator,\n DrizzleIndexedStorage,\n ValidatingIdentityProviderHttpHandler,\n PostgresKeyValueStorage,\n RedisKeyValueStorage,\n SqliteKeyValueStorage,\n BaseKeyValueStorage,\n DrizzleQuotaService,\n NoopQuotaService,\n HttpEntitlementProvider,\n NoopEntitlementProvider,\n PerAccountQuotaStrategy,\n TencentDnsProvider,\n EdgeNodeDnsCoordinator,\n Dns01CertificateProvisioner,\n SimpleEdgeNodeTunnelManager,\n NoopEdgeNodeTunnelManager,\n FrpTunnelManager,\n EdgeNodeHealthProbeService,\n EdgeNodeAgent,\n EdgeNodeAgentInitializer,\n EdgeNodeCertificateService,\n AcmeCertificateManager,\n EdgeNodeModeDetector,\n ClusterIdentifierStrategy,\n UsageTrackingStore,\n CenterNodeRegistrationService,\n PodRoutingHttpHandler,\n ReactAppViewHandler,\n // Quint exports\n QuintStore,\n SqliteQuintStore,\n PgQuintStore,\n // RDF engine exports\n RdfTermDictionary,\n RdfQuadIndex,\n Rdf3xIndex,\n RdfSparqlAdapter,\n ShadowRdfQuintStore,\n SolidRdfEngine,\n PostgresRdfEngine,\n SolidRdfSparqlEngine,\n // Vector exports\n VectorStore,\n SqliteVectorStore,\n PostgresVectorStore,\n VectorHttpHandler,\n // Embedding exports\n ProviderRegistry,\n ProviderRegistryImpl,\n EmbeddingService,\n EmbeddingServiceImpl,\n CredentialReader,\n CredentialReaderImpl,\n // Tunnel and Subdomain exports\n CloudflareTunnelProvider,\n LocalTunnelProvider,\n NgrokTunnelProvider,\n SubdomainService,\n // IdP/SP separation exports\n MultiDomainIdentifierStrategy,\n SubdomainPodIdentifierStrategy,\n DisabledOidcHandler,\n DisabledIdentityProviderHandler,\n AutoDetectOidcHandler,\n AutoDetectIdentityProviderHandler,\n LoopbackClientIdAdapterFactory,\n ScopedPickWebIdHandler,\n UrlAwareRedisLocker,\n // Provision exports\n ProvisionPodCreator,\n ProvisionCodeCodec,\n LocalPodProvisioningService,\n};\n"]}