@floegence/flowersec-core 0.27.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/README.md +91 -22
  2. package/THIRD_PARTY_NOTICES.md +141 -0
  3. package/dist/browser/connectSession.d.ts +13 -0
  4. package/dist/browser/connectSession.js +40 -0
  5. package/dist/browser/index.d.ts +3 -10
  6. package/dist/browser/index.js +2 -5
  7. package/dist/browser/runtimeCapability.d.ts +13 -0
  8. package/dist/browser/runtimeCapability.js +27 -0
  9. package/dist/browser/sessionRuntime.d.ts +2 -0
  10. package/dist/browser/sessionRuntime.js +21 -0
  11. package/dist/browser/webTransportClient.d.ts +8 -0
  12. package/dist/browser/webTransportClient.js +55 -0
  13. package/dist/cli.d.ts +2 -0
  14. package/dist/cli.js +126 -0
  15. package/dist/cliSpendMarker.d.ts +1 -0
  16. package/dist/cliSpendMarker.js +22 -0
  17. package/dist/connectionController.d.ts +54 -0
  18. package/dist/connectionController.js +438 -0
  19. package/dist/connector/adapters/webSocketCandidate.d.ts +7 -0
  20. package/dist/connector/adapters/webSocketCandidate.js +116 -0
  21. package/dist/connector/adapters/webTransportCandidate.d.ts +5 -0
  22. package/dist/connector/adapters/webTransportCandidate.js +73 -0
  23. package/dist/connector/admissionCommit.d.ts +31 -0
  24. package/dist/connector/admissionCommit.js +239 -0
  25. package/dist/connector/sessionAcceptor.d.ts +16 -0
  26. package/dist/connector/sessionAcceptor.js +114 -0
  27. package/dist/connector/sessionConfig.d.ts +3 -0
  28. package/dist/connector/sessionConfig.js +30 -0
  29. package/dist/connector/sessionConnector.d.ts +45 -0
  30. package/dist/connector/sessionConnector.js +603 -0
  31. package/dist/defaults.d.ts +7 -7
  32. package/dist/defaults.js +7 -7
  33. package/dist/facade.d.ts +12 -27
  34. package/dist/facade.js +6 -24
  35. package/dist/node/connectSession.d.ts +21 -0
  36. package/dist/node/connectSession.js +62 -0
  37. package/dist/node/index.d.ts +3 -11
  38. package/dist/node/index.js +2 -8
  39. package/dist/node/runtimeCapability.d.ts +7 -0
  40. package/dist/node/runtimeCapability.js +10 -0
  41. package/dist/node/sessionRuntime.d.ts +2 -0
  42. package/dist/node/sessionRuntime.js +13 -0
  43. package/dist/node/webTransportClient.d.ts +9 -0
  44. package/dist/node/webTransportClient.js +56 -0
  45. package/dist/node/webTransportServer.d.ts +22 -0
  46. package/dist/node/webTransportServer.js +100 -0
  47. package/dist/node/wsFactory.d.ts +3 -1
  48. package/dist/node/wsFactory.js +4 -3
  49. package/dist/proxy/controllerGuard.d.ts +4 -4
  50. package/dist/proxy/controllerGuard.js +83 -177
  51. package/dist/proxy/disableUpstreamServiceWorkerRegister.d.ts +3 -1
  52. package/dist/proxy/disableUpstreamServiceWorkerRegister.js +19 -17
  53. package/dist/proxy/index.d.ts +16 -15
  54. package/dist/proxy/index.js +8 -14
  55. package/dist/proxy/integration.d.ts +23 -71
  56. package/dist/proxy/integration.js +37 -340
  57. package/dist/proxy/registerServiceWorker.d.ts +1 -10
  58. package/dist/proxy/registerServiceWorker.js +43 -105
  59. package/dist/proxy/runtime.d.ts +3 -63
  60. package/dist/proxy/runtime.js +349 -462
  61. package/dist/proxy/scope.d.ts +6 -0
  62. package/dist/proxy/scope.js +131 -0
  63. package/dist/proxy/serviceWorker.d.ts +5 -16
  64. package/dist/proxy/serviceWorker.js +230 -617
  65. package/dist/proxy/stream.d.ts +9 -0
  66. package/dist/proxy/stream.js +40 -0
  67. package/dist/proxy/types.d.ts +78 -30
  68. package/dist/proxy/windowBridge.d.ts +61 -0
  69. package/dist/proxy/windowBridge.js +344 -0
  70. package/dist/proxy/wsPatch.d.ts +4 -14
  71. package/dist/proxy/wsPatch.js +173 -268
  72. package/dist/public/artifact.d.ts +11 -0
  73. package/dist/public/artifact.js +44 -0
  74. package/dist/public/artifactLease.d.ts +10 -0
  75. package/dist/public/artifactLease.js +48 -0
  76. package/dist/public/connectError.d.ts +6 -0
  77. package/dist/public/connectError.js +9 -0
  78. package/dist/public/contract.d.ts +83 -0
  79. package/dist/public/contract.js +17 -0
  80. package/dist/public/streamMetadata.d.ts +10 -0
  81. package/dist/public/streamMetadata.js +40 -0
  82. package/dist/rpc/caller.d.ts +1 -1
  83. package/dist/rpc/client.d.ts +1 -4
  84. package/dist/rpc/client.js +0 -21
  85. package/dist/rpc/rpcProxy.d.ts +1 -1
  86. package/dist/rpc/server.d.ts +1 -1
  87. package/dist/rpc/validate.d.ts +1 -1
  88. package/dist/rpc/wire.d.ts +15 -0
  89. package/dist/runtime/errors.d.ts +6 -0
  90. package/dist/runtime/errors.js +10 -0
  91. package/dist/transport/webSocketAdapter.d.ts +24 -0
  92. package/dist/transport/webSocketAdapter.js +234 -0
  93. package/dist/transport/webTransportAdapter.d.ts +27 -0
  94. package/dist/transport/webTransportAdapter.js +519 -0
  95. package/dist/utils/errors.d.ts +2 -20
  96. package/dist/utils/errors.js +73 -20
  97. package/dist/v2/admissionError.d.ts +4 -0
  98. package/dist/v2/admissionError.js +8 -0
  99. package/dist/v2/artifact.d.ts +128 -0
  100. package/dist/v2/artifact.js +1126 -0
  101. package/dist/v2/artifactLease.d.ts +1 -0
  102. package/dist/v2/artifactLease.js +7 -0
  103. package/dist/v2/capability.d.ts +29 -0
  104. package/dist/v2/capability.js +190 -0
  105. package/dist/v2/carrier.d.ts +79 -0
  106. package/dist/v2/carrier.js +405 -0
  107. package/dist/v2/contract.d.ts +37 -0
  108. package/dist/v2/contract.js +1 -0
  109. package/dist/v2/handshake.d.ts +80 -0
  110. package/dist/v2/handshake.js +470 -0
  111. package/dist/v2/opaqueArtifact.d.ts +1 -0
  112. package/dist/v2/opaqueArtifact.js +2 -0
  113. package/dist/v2/protocol.d.ts +99 -0
  114. package/dist/v2/protocol.js +739 -0
  115. package/dist/v2/publicSession.d.ts +1 -0
  116. package/dist/v2/publicSession.js +179 -0
  117. package/dist/v2/retryDisposition.d.ts +16 -0
  118. package/dist/v2/retryDisposition.js +30 -0
  119. package/dist/v2/session.d.ts +277 -0
  120. package/dist/v2/session.js +1879 -0
  121. package/dist/v2/streamLifetimeLedger.d.ts +31 -0
  122. package/dist/v2/streamLifetimeLedger.js +131 -0
  123. package/dist/v2/streamMetadata.d.ts +1 -0
  124. package/dist/v2/streamMetadata.js +7 -0
  125. package/dist/v2/unreliableMessage.d.ts +43 -0
  126. package/dist/v2/unreliableMessage.js +252 -0
  127. package/dist/vendor/tr46.d.ts +10 -0
  128. package/dist/vendor/tr46.js +501 -0
  129. package/dist/ws-client/binaryTransport.d.ts +0 -3
  130. package/dist/ws-client/binaryTransport.js +15 -39
  131. package/dist/yamux/errors.d.ts +0 -4
  132. package/dist/yamux/errors.js +0 -9
  133. package/dist/yamux/session.d.ts +0 -5
  134. package/dist/yamux/session.js +4 -70
  135. package/dist/yamux/stream.d.ts +1 -0
  136. package/dist/yamux/stream.js +4 -0
  137. package/package.json +29 -81
  138. package/sbom/cyclonedx.json +2764 -0
  139. package/sbom/spdx.json +1947 -0
  140. package/YAMUX_ALIGNMENT.md +0 -127
  141. package/dist/_examples/flowersec/demo/v1.facade.gen.d.ts +0 -12
  142. package/dist/_examples/flowersec/demo/v1.facade.gen.js +0 -15
  143. package/dist/_examples/flowersec/demo/v1.gen.d.ts +0 -16
  144. package/dist/_examples/flowersec/demo/v1.gen.js +0 -86
  145. package/dist/_examples/flowersec/demo/v1.rpc.gen.d.ts +0 -11
  146. package/dist/_examples/flowersec/demo/v1.rpc.gen.js +0 -22
  147. package/dist/browser/connect.d.ts +0 -13
  148. package/dist/browser/connect.js +0 -31
  149. package/dist/browser/reconnectConfig.d.ts +0 -15
  150. package/dist/browser/reconnectConfig.js +0 -20
  151. package/dist/client-connect/common.d.ts +0 -26
  152. package/dist/client-connect/common.js +0 -167
  153. package/dist/client-connect/connectCore.d.ts +0 -61
  154. package/dist/client-connect/connectCore.js +0 -572
  155. package/dist/client-connect/contract.d.ts +0 -8
  156. package/dist/client-connect/contract.js +0 -51
  157. package/dist/client-connect/termination.d.ts +0 -6
  158. package/dist/client-connect/termination.js +0 -7
  159. package/dist/client-connect/transportSecurity.d.ts +0 -27
  160. package/dist/client-connect/transportSecurity.js +0 -199
  161. package/dist/client-connect/tunnelAttachCloseReason.d.ts +0 -3
  162. package/dist/client-connect/tunnelAttachCloseReason.js +0 -23
  163. package/dist/client.d.ts +0 -23
  164. package/dist/connect/artifact.d.ts +0 -36
  165. package/dist/connect/artifact.js +0 -213
  166. package/dist/connect/resolveArtifact.d.ts +0 -22
  167. package/dist/connect/resolveArtifact.js +0 -87
  168. package/dist/controlplane/channelInit.d.ts +0 -27
  169. package/dist/controlplane/channelInit.js +0 -116
  170. package/dist/controlplane/http.d.ts +0 -16
  171. package/dist/controlplane/http.js +0 -59
  172. package/dist/controlplane/index.d.ts +0 -6
  173. package/dist/controlplane/index.js +0 -5
  174. package/dist/controlplane/issuer.d.ts +0 -18
  175. package/dist/controlplane/issuer.js +0 -113
  176. package/dist/controlplane/request.d.ts +0 -51
  177. package/dist/controlplane/request.js +0 -273
  178. package/dist/controlplane/token.d.ts +0 -33
  179. package/dist/controlplane/token.js +0 -119
  180. package/dist/direct-client/connect.d.ts +0 -9
  181. package/dist/direct-client/connect.js +0 -90
  182. package/dist/direct-client/index.d.ts +0 -1
  183. package/dist/direct-client/index.js +0 -1
  184. package/dist/e2ee/constants.d.ts +0 -9
  185. package/dist/e2ee/constants.js +0 -18
  186. package/dist/e2ee/errors.d.ts +0 -5
  187. package/dist/e2ee/errors.js +0 -8
  188. package/dist/e2ee/framing.d.ts +0 -12
  189. package/dist/e2ee/framing.js +0 -57
  190. package/dist/e2ee/handshake.d.ts +0 -88
  191. package/dist/e2ee/handshake.js +0 -353
  192. package/dist/e2ee/index.d.ts +0 -7
  193. package/dist/e2ee/index.js +0 -7
  194. package/dist/e2ee/kdf.d.ts +0 -15
  195. package/dist/e2ee/kdf.js +0 -39
  196. package/dist/e2ee/record.d.ts +0 -11
  197. package/dist/e2ee/record.js +0 -80
  198. package/dist/e2ee/secureChannel.d.ts +0 -93
  199. package/dist/e2ee/secureChannel.js +0 -342
  200. package/dist/e2ee/transcript.d.ts +0 -23
  201. package/dist/e2ee/transcript.js +0 -31
  202. package/dist/endpoint/index.d.ts +0 -84
  203. package/dist/endpoint/index.js +0 -557
  204. package/dist/endpoint/node.d.ts +0 -9
  205. package/dist/endpoint/node.js +0 -51
  206. package/dist/gen/flowersec/controlplane/v1.gen.d.ts +0 -36
  207. package/dist/gen/flowersec/controlplane/v1.gen.js +0 -135
  208. package/dist/gen/flowersec/direct/v1.gen.d.ts +0 -21
  209. package/dist/gen/flowersec/direct/v1.gen.js +0 -101
  210. package/dist/gen/flowersec/e2ee/v1.gen.d.ts +0 -68
  211. package/dist/gen/flowersec/e2ee/v1.gen.js +0 -194
  212. package/dist/gen/flowersec/rpc/v1.gen.d.ts +0 -30
  213. package/dist/gen/flowersec/rpc/v1.gen.js +0 -107
  214. package/dist/gen/flowersec/tunnel/v1.gen.d.ts +0 -23
  215. package/dist/gen/flowersec/tunnel/v1.gen.js +0 -104
  216. package/dist/index.d.ts +0 -22
  217. package/dist/index.js +0 -22
  218. package/dist/node/connect.d.ts +0 -10
  219. package/dist/node/connect.js +0 -29
  220. package/dist/node/reconnectConfig.d.ts +0 -16
  221. package/dist/node/reconnectConfig.js +0 -20
  222. package/dist/observability/index.d.ts +0 -1
  223. package/dist/observability/index.js +0 -1
  224. package/dist/observability/observer.d.ts +0 -52
  225. package/dist/observability/observer.js +0 -314
  226. package/dist/proxy/appWindow.d.ts +0 -37
  227. package/dist/proxy/appWindow.js +0 -273
  228. package/dist/proxy/bootstrap.d.ts +0 -35
  229. package/dist/proxy/bootstrap.js +0 -119
  230. package/dist/proxy/constants.d.ts +0 -7
  231. package/dist/proxy/constants.js +0 -8
  232. package/dist/proxy/controllerWindow.d.ts +0 -12
  233. package/dist/proxy/controllerWindow.js +0 -384
  234. package/dist/proxy/cookieJar.d.ts +0 -7
  235. package/dist/proxy/cookieJar.js +0 -136
  236. package/dist/proxy/headerPolicy.d.ts +0 -14
  237. package/dist/proxy/headerPolicy.js +0 -134
  238. package/dist/proxy/portStream.d.ts +0 -5
  239. package/dist/proxy/portStream.js +0 -256
  240. package/dist/proxy/preset.d.ts +0 -29
  241. package/dist/proxy/preset.js +0 -111
  242. package/dist/proxy/runtimeScope.d.ts +0 -57
  243. package/dist/proxy/runtimeScope.js +0 -218
  244. package/dist/proxy/server.d.ts +0 -28
  245. package/dist/proxy/server.js +0 -833
  246. package/dist/proxy/windowBridgeProtocol.d.ts +0 -65
  247. package/dist/proxy/windowBridgeProtocol.js +0 -11
  248. package/dist/reconnect/artifactControlplane.d.ts +0 -16
  249. package/dist/reconnect/artifactControlplane.js +0 -35
  250. package/dist/reconnect/index.d.ts +0 -36
  251. package/dist/reconnect/index.js +0 -388
  252. package/dist/rpc-proxy/index.d.ts +0 -1
  253. package/dist/rpc-proxy/index.js +0 -1
  254. package/dist/rpc-proxy/rpcProxy.d.ts +0 -1
  255. package/dist/rpc-proxy/rpcProxy.js +0 -1
  256. package/dist/streamhello/index.d.ts +0 -1
  257. package/dist/streamhello/index.js +0 -1
  258. package/dist/streamhello/streamHello.d.ts +0 -3
  259. package/dist/streamhello/streamHello.js +0 -13
  260. package/dist/streamio/index.d.ts +0 -32
  261. package/dist/streamio/index.js +0 -87
  262. package/dist/tunnel-client/connect.d.ts +0 -9
  263. package/dist/tunnel-client/connect.js +0 -147
  264. package/dist/tunnel-client/index.d.ts +0 -1
  265. package/dist/tunnel-client/index.js +0 -1
  266. package/dist/ws/index.d.ts +0 -1
  267. package/dist/ws/index.js +0 -1
  268. /package/dist/{client.js → rpc/wire.js} +0 -0
@@ -1,87 +0,0 @@
1
- import { DEFAULT_MAX_JSON_FRAME_BYTES, readJsonFrame, writeJsonFrame } from "../framing/jsonframe.js";
2
- import { AbortError, throwIfAborted } from "../utils/errors.js";
3
- import { ByteReader } from "../yamux/byteReader.js";
4
- function abortReasonToError(signal) {
5
- const r = signal.reason;
6
- if (r instanceof Error)
7
- return r;
8
- if (typeof r === "string" && r !== "")
9
- return new AbortError(r);
10
- return new AbortError("aborted");
11
- }
12
- function bindAbortToStream(stream, signal) {
13
- const onAbort = () => {
14
- void Promise.resolve(stream.reset(abortReasonToError(signal))).catch(() => {
15
- // The read/write operation reports the authoritative abort to its caller.
16
- });
17
- };
18
- if (signal.aborted) {
19
- onAbort();
20
- return;
21
- }
22
- signal.addEventListener("abort", onAbort, { once: true });
23
- }
24
- // readMaybe reads the next chunk or null on EOF.
25
- export async function readMaybe(stream) {
26
- return await stream.read();
27
- }
28
- // createByteReader adapts a YamuxStream to a ByteReader (EOF is handled by YamuxStream.read()).
29
- export function createByteReader(stream, opts = {}) {
30
- if (opts.signal != null)
31
- bindAbortToStream(stream, opts.signal);
32
- return new ByteReader(() => stream.read());
33
- }
34
- // readExactly reads n bytes (or throws on EOF/error). If signal aborts, the caller is expected to reset/close the stream.
35
- export async function readExactly(reader, n, opts = {}) {
36
- throwIfAborted(opts.signal, "read aborted");
37
- return await reader.readExactly(n);
38
- }
39
- // readNBytes reads exactly n bytes and returns them as a single contiguous buffer.
40
- export async function readNBytes(reader, n, opts = {}) {
41
- const total = Math.max(0, Math.floor(n));
42
- const out = new Uint8Array(total);
43
- if (total === 0)
44
- return out;
45
- const chunkSize = Math.max(1, Math.floor(opts.chunkSize ?? 64 * 1024));
46
- let off = 0;
47
- while (off < total) {
48
- throwIfAborted(opts.signal, "read aborted");
49
- const take = Math.min(chunkSize, total - off);
50
- const chunk = await reader.readExactly(take);
51
- out.set(chunk, off);
52
- off += chunk.length;
53
- opts.onProgress?.(off);
54
- }
55
- return out;
56
- }
57
- function normalizeMaxJsonFrameBytes(maxBytes) {
58
- const value = maxBytes ?? DEFAULT_MAX_JSON_FRAME_BYTES;
59
- if (!Number.isFinite(value) || value < 0) {
60
- throw new Error("maxJsonFrameBytes must be a non-negative finite number");
61
- }
62
- return Math.floor(value);
63
- }
64
- export function createJsonFrameChannel(stream, opts = {}) {
65
- const reader = createByteReader(stream, opts.signal == null ? {} : { signal: opts.signal });
66
- const defaultMaxBytes = normalizeMaxJsonFrameBytes(opts.maxJsonFrameBytes);
67
- return {
68
- stream,
69
- reader,
70
- writeFrame: async (value) => {
71
- await writeJsonFrame(stream, value);
72
- },
73
- readFrame: async (readOpts = {}) => {
74
- const raw = await readJsonFrame(reader, normalizeMaxJsonFrameBytes(readOpts.maxBytes ?? defaultMaxBytes));
75
- if (readOpts.assert != null)
76
- return readOpts.assert(raw);
77
- return raw;
78
- },
79
- close: async () => {
80
- await stream.close();
81
- },
82
- };
83
- }
84
- export async function openJsonFrameChannel(client, kind, opts = {}) {
85
- const stream = await client.openStream(kind, opts.signal == null ? {} : { signal: opts.signal });
86
- return createJsonFrameChannel(stream, opts);
87
- }
@@ -1,9 +0,0 @@
1
- import { type ConnectOptionsBase } from "../client-connect/connectCore.js";
2
- import type { ClientInternal } from "../client.js";
3
- export type TunnelConnectOptions = ConnectOptionsBase & Readonly<{
4
- /** Type-only marker to prevent mixing direct and tunnel option types. */
5
- __mode?: "tunnel";
6
- /** Optional caller-provided endpoint instance ID (base64url). */
7
- endpointInstanceId?: string;
8
- }>;
9
- export declare function connectTunnel(input: unknown, opts: TunnelConnectOptions): Promise<ClientInternal>;
@@ -1,147 +0,0 @@
1
- import { Role as TunnelRole } from "../gen/flowersec/tunnel/v1.gen.js";
2
- import { assertChannelInitGrant, Role as ControlRole } from "../gen/flowersec/controlplane/v1.gen.js";
3
- import { base64urlDecode, base64urlEncode } from "../utils/base64url.js";
4
- import { FlowersecError } from "../utils/errors.js";
5
- import { randomBytes } from "../client-connect/common.js";
6
- import { connectCore } from "../client-connect/connectCore.js";
7
- import { assertTunnelGrantContract, assertValidPSK, prepareChannelId } from "../client-connect/contract.js";
8
- function isRecord(v) {
9
- return typeof v === "object" && v != null && !Array.isArray(v);
10
- }
11
- function hasOwn(o, key) {
12
- return Object.prototype.hasOwnProperty.call(o, key);
13
- }
14
- // connectTunnel attaches to a tunnel and returns an RPC-ready session.
15
- export async function connectTunnel(input, opts) {
16
- if (input == null) {
17
- throw new FlowersecError({ stage: "validate", code: "missing_grant", path: "tunnel", message: "missing grant" });
18
- }
19
- if (isRecord(input)) {
20
- // Align missing/invalid field codes with Go: missing fields map to specific stable codes.
21
- const okTypes = (!hasOwn(input, "role") || (typeof input["role"] === "number" && Number.isSafeInteger(input["role"]))) &&
22
- (!hasOwn(input, "tunnel_url") || typeof input["tunnel_url"] === "string") &&
23
- (!hasOwn(input, "channel_id") || typeof input["channel_id"] === "string") &&
24
- (!hasOwn(input, "token") || typeof input["token"] === "string") &&
25
- (!hasOwn(input, "channel_init_expire_at_unix_s") ||
26
- (typeof input["channel_init_expire_at_unix_s"] === "number" && Number.isSafeInteger(input["channel_init_expire_at_unix_s"]))) &&
27
- (!hasOwn(input, "e2ee_psk_b64u") || typeof input["e2ee_psk_b64u"] === "string") &&
28
- (!hasOwn(input, "default_suite") || (typeof input["default_suite"] === "number" && Number.isSafeInteger(input["default_suite"])));
29
- if (okTypes) {
30
- const role = input["role"];
31
- if (role === undefined || role !== ControlRole.Role_client) {
32
- throw new FlowersecError({ stage: "validate", code: "role_mismatch", path: "tunnel", message: "expected role=client" });
33
- }
34
- if (!hasOwn(input, "tunnel_url")) {
35
- throw new FlowersecError({ stage: "validate", code: "missing_tunnel_url", path: "tunnel", message: "missing tunnel_url" });
36
- }
37
- if (!hasOwn(input, "channel_id")) {
38
- throw new FlowersecError({ stage: "validate", code: "missing_channel_id", path: "tunnel", message: "missing channel_id" });
39
- }
40
- if (!hasOwn(input, "token")) {
41
- throw new FlowersecError({ stage: "validate", code: "missing_token", path: "tunnel", message: "missing token" });
42
- }
43
- if (!hasOwn(input, "channel_init_expire_at_unix_s")) {
44
- throw new FlowersecError({ stage: "validate", code: "missing_init_exp", path: "tunnel", message: "missing channel_init_expire_at_unix_s" });
45
- }
46
- if (!hasOwn(input, "e2ee_psk_b64u")) {
47
- throw new FlowersecError({ stage: "validate", code: "invalid_psk", path: "tunnel", message: "missing e2ee_psk_b64u" });
48
- }
49
- if (!hasOwn(input, "default_suite")) {
50
- throw new FlowersecError({ stage: "validate", code: "invalid_suite", path: "tunnel", message: "missing default_suite" });
51
- }
52
- }
53
- const suite = input["default_suite"];
54
- // Keep "invalid_suite" as the stable error code even when the IDL validator rejects the enum value.
55
- if (typeof suite === "number" && Number.isSafeInteger(suite) && suite !== 1 && suite !== 2) {
56
- throw new FlowersecError({ stage: "validate", code: "invalid_suite", path: "tunnel", message: "invalid suite" });
57
- }
58
- const allowed = input["allowed_suites"];
59
- if (Array.isArray(allowed)) {
60
- for (const v of allowed) {
61
- if (typeof v === "number" && Number.isSafeInteger(v) && v !== 1 && v !== 2) {
62
- throw new FlowersecError({ stage: "validate", code: "invalid_suite", path: "tunnel", message: "invalid suite" });
63
- }
64
- }
65
- }
66
- }
67
- let checkedGrant;
68
- try {
69
- checkedGrant = assertChannelInitGrant(input);
70
- }
71
- catch (e) {
72
- throw new FlowersecError({ stage: "validate", code: "invalid_input", path: "tunnel", message: "invalid ChannelInitGrant", cause: e });
73
- }
74
- const tunnelUrl = checkedGrant.tunnel_url.trim();
75
- if (tunnelUrl === "") {
76
- throw new FlowersecError({ stage: "validate", code: "missing_tunnel_url", path: "tunnel", message: "missing tunnel_url" });
77
- }
78
- const channelId = prepareChannelId(checkedGrant.channel_id, "tunnel");
79
- const token = checkedGrant.token.trim();
80
- if (token === "") {
81
- throw new FlowersecError({ stage: "validate", code: "missing_token", path: "tunnel", message: "missing token" });
82
- }
83
- if (checkedGrant.channel_init_expire_at_unix_s <= 0) {
84
- throw new FlowersecError({
85
- stage: "validate",
86
- code: "missing_init_exp",
87
- path: "tunnel",
88
- message: "missing channel_init_expire_at_unix_s",
89
- });
90
- }
91
- assertTunnelGrantContract(checkedGrant, ControlRole.Role_client);
92
- const e2eePskB64u = assertValidPSK(checkedGrant.e2ee_psk_b64u, "tunnel");
93
- const idleTimeoutSeconds = checkedGrant.idle_timeout_seconds;
94
- const endpointInstanceId = opts.endpointInstanceId ?? base64urlEncode(randomBytes(24));
95
- let eidBytes;
96
- try {
97
- eidBytes = base64urlDecode(endpointInstanceId);
98
- }
99
- catch (e) {
100
- throw new FlowersecError({
101
- stage: "validate",
102
- code: "invalid_endpoint_instance_id",
103
- path: "tunnel",
104
- message: "invalid endpointInstanceId",
105
- cause: e
106
- });
107
- }
108
- if (eidBytes.length < 16 || eidBytes.length > 32) {
109
- throw new FlowersecError({
110
- stage: "validate",
111
- code: "invalid_endpoint_instance_id",
112
- path: "tunnel",
113
- message: "endpointInstanceId must decode to 16..32 bytes"
114
- });
115
- }
116
- const attach = {
117
- v: 1,
118
- channel_id: channelId,
119
- role: TunnelRole.Role_client,
120
- token,
121
- endpoint_instance_id: endpointInstanceId
122
- };
123
- const attachJson = JSON.stringify(attach);
124
- const liveness = opts.liveness ?? defaultLiveness(idleTimeoutSeconds);
125
- return await connectCore({
126
- path: "tunnel",
127
- wsUrl: tunnelUrl,
128
- channelId,
129
- e2eePskB64u,
130
- defaultSuite: checkedGrant.default_suite,
131
- opts: { ...opts, liveness },
132
- attach: { attachJson, endpointInstanceId }
133
- });
134
- }
135
- function defaultLiveness(idleTimeoutSeconds) {
136
- if (!Number.isFinite(idleTimeoutSeconds) || idleTimeoutSeconds <= 0)
137
- return false;
138
- const idleMs = Math.floor(idleTimeoutSeconds * 1000);
139
- if (idleMs <= 0)
140
- return false;
141
- let interval = Math.floor(idleMs / 2);
142
- if (interval < 500)
143
- interval = 500;
144
- if (interval >= idleMs)
145
- interval = Math.floor(idleMs / 2);
146
- return { intervalMs: interval, timeoutMs: Math.min(10_000, interval) };
147
- }
@@ -1 +0,0 @@
1
- export * from "./connect.js";
@@ -1 +0,0 @@
1
- export * from "./connect.js";
@@ -1 +0,0 @@
1
- export * from "../ws-client/binaryTransport.js";
package/dist/ws/index.js DELETED
@@ -1 +0,0 @@
1
- export * from "../ws-client/binaryTransport.js";
File without changes