@floegence/flowersec-core 0.26.0 → 2.0.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 (270) 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 -30
  34. package/dist/facade.js +6 -30
  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 -83
  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 -12
  148. package/dist/browser/connect.js +0 -31
  149. package/dist/browser/controlplane.d.ts +0 -15
  150. package/dist/browser/controlplane.js +0 -64
  151. package/dist/browser/reconnectConfig.d.ts +0 -15
  152. package/dist/browser/reconnectConfig.js +0 -20
  153. package/dist/client-connect/common.d.ts +0 -26
  154. package/dist/client-connect/common.js +0 -167
  155. package/dist/client-connect/connectCore.d.ts +0 -61
  156. package/dist/client-connect/connectCore.js +0 -572
  157. package/dist/client-connect/contract.d.ts +0 -8
  158. package/dist/client-connect/contract.js +0 -51
  159. package/dist/client-connect/termination.d.ts +0 -6
  160. package/dist/client-connect/termination.js +0 -7
  161. package/dist/client-connect/transportSecurity.d.ts +0 -27
  162. package/dist/client-connect/transportSecurity.js +0 -199
  163. package/dist/client-connect/tunnelAttachCloseReason.d.ts +0 -3
  164. package/dist/client-connect/tunnelAttachCloseReason.js +0 -23
  165. package/dist/client.d.ts +0 -23
  166. package/dist/connect/artifact.d.ts +0 -37
  167. package/dist/connect/artifact.js +0 -217
  168. package/dist/connect/internalNormalize.d.ts +0 -22
  169. package/dist/connect/internalNormalize.js +0 -173
  170. package/dist/controlplane/channelInit.d.ts +0 -27
  171. package/dist/controlplane/channelInit.js +0 -116
  172. package/dist/controlplane/http.d.ts +0 -16
  173. package/dist/controlplane/http.js +0 -59
  174. package/dist/controlplane/index.d.ts +0 -6
  175. package/dist/controlplane/index.js +0 -5
  176. package/dist/controlplane/issuer.d.ts +0 -18
  177. package/dist/controlplane/issuer.js +0 -113
  178. package/dist/controlplane/request.d.ts +0 -51
  179. package/dist/controlplane/request.js +0 -273
  180. package/dist/controlplane/token.d.ts +0 -33
  181. package/dist/controlplane/token.js +0 -119
  182. package/dist/direct-client/connect.d.ts +0 -9
  183. package/dist/direct-client/connect.js +0 -90
  184. package/dist/direct-client/index.d.ts +0 -1
  185. package/dist/direct-client/index.js +0 -1
  186. package/dist/e2ee/constants.d.ts +0 -9
  187. package/dist/e2ee/constants.js +0 -18
  188. package/dist/e2ee/errors.d.ts +0 -5
  189. package/dist/e2ee/errors.js +0 -8
  190. package/dist/e2ee/framing.d.ts +0 -12
  191. package/dist/e2ee/framing.js +0 -57
  192. package/dist/e2ee/handshake.d.ts +0 -88
  193. package/dist/e2ee/handshake.js +0 -353
  194. package/dist/e2ee/index.d.ts +0 -7
  195. package/dist/e2ee/index.js +0 -7
  196. package/dist/e2ee/kdf.d.ts +0 -15
  197. package/dist/e2ee/kdf.js +0 -39
  198. package/dist/e2ee/record.d.ts +0 -11
  199. package/dist/e2ee/record.js +0 -76
  200. package/dist/e2ee/secureChannel.d.ts +0 -92
  201. package/dist/e2ee/secureChannel.js +0 -328
  202. package/dist/e2ee/transcript.d.ts +0 -23
  203. package/dist/e2ee/transcript.js +0 -31
  204. package/dist/endpoint/index.d.ts +0 -84
  205. package/dist/endpoint/index.js +0 -557
  206. package/dist/endpoint/node.d.ts +0 -9
  207. package/dist/endpoint/node.js +0 -51
  208. package/dist/gen/flowersec/controlplane/v1.gen.d.ts +0 -36
  209. package/dist/gen/flowersec/controlplane/v1.gen.js +0 -135
  210. package/dist/gen/flowersec/direct/v1.gen.d.ts +0 -21
  211. package/dist/gen/flowersec/direct/v1.gen.js +0 -101
  212. package/dist/gen/flowersec/e2ee/v1.gen.d.ts +0 -68
  213. package/dist/gen/flowersec/e2ee/v1.gen.js +0 -194
  214. package/dist/gen/flowersec/rpc/v1.gen.d.ts +0 -30
  215. package/dist/gen/flowersec/rpc/v1.gen.js +0 -107
  216. package/dist/gen/flowersec/tunnel/v1.gen.d.ts +0 -23
  217. package/dist/gen/flowersec/tunnel/v1.gen.js +0 -104
  218. package/dist/index.d.ts +0 -22
  219. package/dist/index.js +0 -22
  220. package/dist/node/connect.d.ts +0 -12
  221. package/dist/node/connect.js +0 -29
  222. package/dist/node/reconnectConfig.d.ts +0 -16
  223. package/dist/node/reconnectConfig.js +0 -20
  224. package/dist/observability/index.d.ts +0 -1
  225. package/dist/observability/index.js +0 -1
  226. package/dist/observability/observer.d.ts +0 -52
  227. package/dist/observability/observer.js +0 -314
  228. package/dist/proxy/appWindow.d.ts +0 -37
  229. package/dist/proxy/appWindow.js +0 -273
  230. package/dist/proxy/bootstrap.d.ts +0 -35
  231. package/dist/proxy/bootstrap.js +0 -119
  232. package/dist/proxy/constants.d.ts +0 -7
  233. package/dist/proxy/constants.js +0 -8
  234. package/dist/proxy/controllerWindow.d.ts +0 -12
  235. package/dist/proxy/controllerWindow.js +0 -384
  236. package/dist/proxy/cookieJar.d.ts +0 -7
  237. package/dist/proxy/cookieJar.js +0 -136
  238. package/dist/proxy/headerPolicy.d.ts +0 -14
  239. package/dist/proxy/headerPolicy.js +0 -134
  240. package/dist/proxy/portStream.d.ts +0 -5
  241. package/dist/proxy/portStream.js +0 -256
  242. package/dist/proxy/preset.d.ts +0 -29
  243. package/dist/proxy/preset.js +0 -111
  244. package/dist/proxy/runtimeScope.d.ts +0 -57
  245. package/dist/proxy/runtimeScope.js +0 -218
  246. package/dist/proxy/server.d.ts +0 -28
  247. package/dist/proxy/server.js +0 -833
  248. package/dist/proxy/windowBridgeProtocol.d.ts +0 -65
  249. package/dist/proxy/windowBridgeProtocol.js +0 -11
  250. package/dist/reconnect/artifactControlplane.d.ts +0 -16
  251. package/dist/reconnect/artifactControlplane.js +0 -35
  252. package/dist/reconnect/index.d.ts +0 -36
  253. package/dist/reconnect/index.js +0 -388
  254. package/dist/rpc-proxy/index.d.ts +0 -1
  255. package/dist/rpc-proxy/index.js +0 -1
  256. package/dist/rpc-proxy/rpcProxy.d.ts +0 -1
  257. package/dist/rpc-proxy/rpcProxy.js +0 -1
  258. package/dist/streamhello/index.d.ts +0 -1
  259. package/dist/streamhello/index.js +0 -1
  260. package/dist/streamhello/streamHello.d.ts +0 -3
  261. package/dist/streamhello/streamHello.js +0 -13
  262. package/dist/streamio/index.d.ts +0 -32
  263. package/dist/streamio/index.js +0 -87
  264. package/dist/tunnel-client/connect.d.ts +0 -9
  265. package/dist/tunnel-client/connect.js +0 -157
  266. package/dist/tunnel-client/index.d.ts +0 -1
  267. package/dist/tunnel-client/index.js +0 -1
  268. package/dist/ws/index.d.ts +0 -1
  269. package/dist/ws/index.js +0 -1
  270. /package/dist/{client.js → rpc/wire.js} +0 -0
@@ -1,65 +0,0 @@
1
- import type { Header } from "./types.js";
2
- export declare const PROXY_WINDOW_FETCH_FORWARD_MSG_TYPE = "flowersec-proxy:window_fetch";
3
- export declare const PROXY_WINDOW_FETCH_MSG_TYPE = "flowersec-proxy:fetch";
4
- export declare const PROXY_WINDOW_WS_OPEN_MSG_TYPE = "flowersec-proxy:ws_open";
5
- export declare const PROXY_WINDOW_WS_OPEN_ACK_MSG_TYPE = "flowersec-proxy:ws_open_ack";
6
- export declare const PROXY_WINDOW_WS_BIDIRECTIONAL_ACK_CAPABILITY = "stream_bidirectional_ack_v2";
7
- export declare const PROXY_WINDOW_WS_ERROR_MSG_TYPE = "flowersec-proxy:ws_error";
8
- export declare const PROXY_WINDOW_STREAM_CHUNK_MSG_TYPE = "flowersec-proxy:stream_chunk";
9
- export declare const PROXY_WINDOW_STREAM_WRITE_ACK_MSG_TYPE = "flowersec-proxy:stream_write_ack";
10
- export declare const PROXY_WINDOW_STREAM_END_MSG_TYPE = "flowersec-proxy:stream_end";
11
- export declare const PROXY_WINDOW_STREAM_RESET_MSG_TYPE = "flowersec-proxy:stream_reset";
12
- export declare const PROXY_WINDOW_STREAM_CLOSE_MSG_TYPE = "flowersec-proxy:stream_close";
13
- export type ProxyWindowFetchRequest = Readonly<{
14
- id: string;
15
- method: string;
16
- path: string;
17
- headers: readonly Header[];
18
- external_origin?: string;
19
- response_flow_control?: "chunk_credit_v1";
20
- body?: ArrayBuffer;
21
- }>;
22
- export type ProxyWindowFetchForwardMsg = Readonly<{
23
- type: typeof PROXY_WINDOW_FETCH_FORWARD_MSG_TYPE;
24
- req: ProxyWindowFetchRequest;
25
- }>;
26
- export type ProxyWindowFetchMsg = Readonly<{
27
- type: typeof PROXY_WINDOW_FETCH_MSG_TYPE;
28
- req: ProxyWindowFetchRequest;
29
- capabilityNonce?: string;
30
- }>;
31
- export type ProxyWindowWsOpenMsg = Readonly<{
32
- type: typeof PROXY_WINDOW_WS_OPEN_MSG_TYPE;
33
- path: string;
34
- protocols?: readonly string[];
35
- capabilities: readonly string[];
36
- capabilityNonce?: string;
37
- }>;
38
- export type ProxyWindowWsOpenAckMsg = Readonly<{
39
- type: typeof PROXY_WINDOW_WS_OPEN_ACK_MSG_TYPE;
40
- protocol: string;
41
- capabilities: readonly string[];
42
- }>;
43
- export type ProxyWindowWsErrorMsg = Readonly<{
44
- type: typeof PROXY_WINDOW_WS_ERROR_MSG_TYPE;
45
- message: string;
46
- }>;
47
- export type ProxyWindowStreamChunkMsg = Readonly<{
48
- type: typeof PROXY_WINDOW_STREAM_CHUNK_MSG_TYPE;
49
- data: ArrayBuffer;
50
- writeId: number;
51
- }>;
52
- export type ProxyWindowStreamWriteAckMsg = Readonly<{
53
- type: typeof PROXY_WINDOW_STREAM_WRITE_ACK_MSG_TYPE;
54
- writeId: number;
55
- }>;
56
- export type ProxyWindowStreamEndMsg = Readonly<{
57
- type: typeof PROXY_WINDOW_STREAM_END_MSG_TYPE;
58
- }>;
59
- export type ProxyWindowStreamResetMsg = Readonly<{
60
- type: typeof PROXY_WINDOW_STREAM_RESET_MSG_TYPE;
61
- message: string;
62
- }>;
63
- export type ProxyWindowStreamCloseMsg = Readonly<{
64
- type: typeof PROXY_WINDOW_STREAM_CLOSE_MSG_TYPE;
65
- }>;
@@ -1,11 +0,0 @@
1
- export const PROXY_WINDOW_FETCH_FORWARD_MSG_TYPE = "flowersec-proxy:window_fetch";
2
- export const PROXY_WINDOW_FETCH_MSG_TYPE = "flowersec-proxy:fetch";
3
- export const PROXY_WINDOW_WS_OPEN_MSG_TYPE = "flowersec-proxy:ws_open";
4
- export const PROXY_WINDOW_WS_OPEN_ACK_MSG_TYPE = "flowersec-proxy:ws_open_ack";
5
- export const PROXY_WINDOW_WS_BIDIRECTIONAL_ACK_CAPABILITY = "stream_bidirectional_ack_v2";
6
- export const PROXY_WINDOW_WS_ERROR_MSG_TYPE = "flowersec-proxy:ws_error";
7
- export const PROXY_WINDOW_STREAM_CHUNK_MSG_TYPE = "flowersec-proxy:stream_chunk";
8
- export const PROXY_WINDOW_STREAM_WRITE_ACK_MSG_TYPE = "flowersec-proxy:stream_write_ack";
9
- export const PROXY_WINDOW_STREAM_END_MSG_TYPE = "flowersec-proxy:stream_end";
10
- export const PROXY_WINDOW_STREAM_RESET_MSG_TYPE = "flowersec-proxy:stream_reset";
11
- export const PROXY_WINDOW_STREAM_CLOSE_MSG_TYPE = "flowersec-proxy:stream_close";
@@ -1,16 +0,0 @@
1
- import type { ConnectArtifact } from "../connect/artifact.js";
2
- import { type RequestConnectArtifactInput, type RequestEntryConnectArtifactInput } from "../controlplane/index.js";
3
- export type ArtifactAcquireContext = Readonly<{
4
- traceId?: string;
5
- signal?: AbortSignal;
6
- }>;
7
- export type ArtifactSource = Readonly<{
8
- kind: "once";
9
- artifact: ConnectArtifact;
10
- }> | Readonly<{
11
- kind: "refreshable";
12
- acquire: (context: ArtifactAcquireContext) => Promise<ConnectArtifact>;
13
- }>;
14
- export declare function createControlplaneArtifactSource(input: RequestConnectArtifactInput | RequestEntryConnectArtifactInput): ArtifactSource;
15
- export declare function createArtifactResolver(source: ArtifactSource): (context: ArtifactAcquireContext) => Promise<ConnectArtifact>;
16
- export declare function updateTraceId(current: string | undefined, artifact: ConnectArtifact): string | undefined;
@@ -1,35 +0,0 @@
1
- import { requestConnectArtifact, requestEntryConnectArtifact, } from "../controlplane/index.js";
2
- export function createControlplaneArtifactSource(input) {
3
- return {
4
- kind: "refreshable",
5
- acquire: async ({ traceId, signal }) => {
6
- const correlation = traceId === undefined ? input.correlation : { traceId };
7
- if ("entryTicket" in input) {
8
- return await requestEntryConnectArtifact({
9
- ...input,
10
- ...(correlation === undefined ? {} : { correlation }),
11
- ...(signal === undefined ? {} : { signal }),
12
- });
13
- }
14
- return await requestConnectArtifact({
15
- ...input,
16
- ...(correlation === undefined ? {} : { correlation }),
17
- ...(signal === undefined ? {} : { signal }),
18
- });
19
- },
20
- };
21
- }
22
- export function createArtifactResolver(source) {
23
- let consumed = false;
24
- return async (context) => {
25
- if (source.kind === "refreshable")
26
- return await source.acquire(context);
27
- if (consumed)
28
- throw new Error("one-time artifact source has already been consumed");
29
- consumed = true;
30
- return source.artifact;
31
- };
32
- }
33
- export function updateTraceId(current, artifact) {
34
- return artifact.correlation?.trace_id ?? current;
35
- }
@@ -1,36 +0,0 @@
1
- import type { Client } from "../client.js";
2
- import { type ClientObserverLike } from "../observability/observer.js";
3
- export type { ArtifactAcquireContext, ArtifactSource } from "./artifactControlplane.js";
4
- export { createArtifactResolver, createControlplaneArtifactSource } from "./artifactControlplane.js";
5
- export type ConnectionStatus = "disconnected" | "connecting" | "connected" | "error";
6
- export type AutoReconnectConfig = Readonly<{
7
- enabled?: boolean;
8
- maxAttempts?: number;
9
- initialDelayMs?: number;
10
- maxDelayMs?: number;
11
- factor?: number;
12
- jitterRatio?: number;
13
- }>;
14
- export type ReconnectState = Readonly<{
15
- status: ConnectionStatus;
16
- error: Error | null;
17
- client: Client | null;
18
- }>;
19
- export type ReconnectListener = (state: ReconnectState) => void;
20
- export type ConnectOnce = (args: Readonly<{
21
- signal: AbortSignal;
22
- observer: ClientObserverLike;
23
- }>) => Promise<Client>;
24
- export type ConnectConfig = Readonly<{
25
- connectOnce: ConnectOnce;
26
- observer?: ClientObserverLike;
27
- autoReconnect?: AutoReconnectConfig;
28
- }>;
29
- export type ReconnectManager = Readonly<{
30
- state: () => ReconnectState;
31
- subscribe: (listener: ReconnectListener) => () => void;
32
- connect: (config: ConnectConfig) => Promise<void>;
33
- connectIfNeeded: (config: ConnectConfig) => Promise<void>;
34
- disconnect: () => void;
35
- }>;
36
- export declare function createReconnectManager(): ReconnectManager;
@@ -1,388 +0,0 @@
1
- import { getClientTermination } from "../client-connect/termination.js";
2
- import { emitObserverDiagnostic, withObserverContext } from "../observability/observer.js";
3
- import { SDK_DEFAULTS } from "../defaults.js";
4
- import { AbortError, FlowersecError } from "../utils/errors.js";
5
- export { createArtifactResolver, createControlplaneArtifactSource } from "./artifactControlplane.js";
6
- function normalizeAutoReconnect(cfg) {
7
- const settings = {
8
- enabled: cfg?.enabled === true,
9
- maxAttempts: cfg?.enabled === true ? (cfg.maxAttempts ?? SDK_DEFAULTS.reconnect.maxAttempts) : 1,
10
- initialDelayMs: cfg?.initialDelayMs ?? SDK_DEFAULTS.reconnect.initialDelayMs,
11
- maxDelayMs: cfg?.maxDelayMs ?? SDK_DEFAULTS.reconnect.maxDelayMs,
12
- factor: cfg?.factor ?? SDK_DEFAULTS.reconnect.factor,
13
- jitterRatio: cfg?.jitterRatio ?? SDK_DEFAULTS.reconnect.jitterRatio,
14
- };
15
- if (!Number.isSafeInteger(settings.maxAttempts) || settings.maxAttempts < 1) {
16
- throw new TypeError("autoReconnect.maxAttempts must be a positive integer");
17
- }
18
- if (!Number.isFinite(settings.initialDelayMs) || settings.initialDelayMs < 0) {
19
- throw new TypeError("autoReconnect.initialDelayMs must be a non-negative finite number");
20
- }
21
- if (!Number.isFinite(settings.maxDelayMs) || settings.maxDelayMs < 0) {
22
- throw new TypeError("autoReconnect.maxDelayMs must be a non-negative finite number");
23
- }
24
- if (!Number.isFinite(settings.factor) || settings.factor < 1) {
25
- throw new TypeError("autoReconnect.factor must be a finite number greater than or equal to one");
26
- }
27
- if (!Number.isFinite(settings.jitterRatio) || settings.jitterRatio < 0 || settings.jitterRatio > 1) {
28
- throw new TypeError("autoReconnect.jitterRatio must be a finite number between zero and one");
29
- }
30
- return settings;
31
- }
32
- function backoffDelayMs(attemptIndex, cfg) {
33
- const base = Math.min(cfg.maxDelayMs, cfg.initialDelayMs * Math.pow(cfg.factor, attemptIndex));
34
- const jitter = cfg.jitterRatio <= 0 ? 0 : base * cfg.jitterRatio * (Math.random() * 2 - 1);
35
- return Math.max(0, Math.round(base + jitter));
36
- }
37
- const TERMINAL_RECONNECT_CODES = new Set([
38
- "invalid_input",
39
- "invalid_option",
40
- "role_mismatch",
41
- "transport_policy_denied",
42
- "invalid_psk",
43
- "invalid_suite",
44
- "missing_grant",
45
- "missing_connect_info",
46
- "missing_tunnel_url",
47
- "missing_ws_url",
48
- "missing_channel_id",
49
- "missing_token",
50
- "missing_init_exp",
51
- ]);
52
- function isTerminalConnectError(error) {
53
- if (error instanceof AbortError || error.name === "AbortError")
54
- return true;
55
- return error instanceof FlowersecError && (error.code === "canceled" || TERMINAL_RECONNECT_CODES.has(error.code));
56
- }
57
- function isSameConfig(a, b) {
58
- if (a == null)
59
- return false;
60
- if (a.connectOnce !== b.connectOnce)
61
- return false;
62
- if (a.observer !== b.observer)
63
- return false;
64
- const aa = normalizeAutoReconnect(a.autoReconnect);
65
- const bb = normalizeAutoReconnect(b.autoReconnect);
66
- return (aa.enabled === bb.enabled &&
67
- aa.maxAttempts === bb.maxAttempts &&
68
- aa.initialDelayMs === bb.initialDelayMs &&
69
- aa.maxDelayMs === bb.maxDelayMs &&
70
- aa.factor === bb.factor &&
71
- aa.jitterRatio === bb.jitterRatio);
72
- }
73
- export function createReconnectManager() {
74
- let s = { status: "disconnected", error: null, client: null };
75
- const listeners = new Set();
76
- const setState = (next) => {
77
- s = next;
78
- for (const fn of listeners) {
79
- try {
80
- fn(s);
81
- }
82
- catch {
83
- // ignore listener errors
84
- }
85
- }
86
- };
87
- let token = 0;
88
- let active = null;
89
- let activeConnectPromise = null;
90
- let retryTimer = null;
91
- let retryResolve = null;
92
- let attemptAbort = null;
93
- let attemptSeq = 0;
94
- const cancelRetrySleep = () => {
95
- if (retryTimer) {
96
- clearTimeout(retryTimer);
97
- retryTimer = null;
98
- }
99
- retryResolve?.();
100
- retryResolve = null;
101
- };
102
- const abortActiveAttempt = () => {
103
- attemptAbort?.abort("canceled");
104
- attemptAbort = null;
105
- };
106
- const closeClient = (value) => {
107
- if (value == null)
108
- return null;
109
- try {
110
- value.close();
111
- return null;
112
- }
113
- catch (error) {
114
- return asError(error);
115
- }
116
- };
117
- const sleep = (ms) => new Promise((resolve) => {
118
- retryResolve = resolve;
119
- retryTimer = setTimeout(() => {
120
- retryTimer = null;
121
- retryResolve = null;
122
- resolve();
123
- }, ms);
124
- });
125
- const finishWithError = (cfg, error, currentAttemptSeq) => {
126
- setState({ status: "error", error, client: null });
127
- emitObserverDiagnostic(withObserverContext(cfg.observer, { attemptSeq: currentAttemptSeq }), {
128
- path: "auto",
129
- stage: "reconnect",
130
- code_domain: "event",
131
- code: "reconnect_exhausted",
132
- result: "fail",
133
- });
134
- };
135
- const scheduleRetry = async (t, cfg, error, settings, failedAttemptIndex, currentAttemptSeq) => {
136
- if (t !== token || active !== cfg)
137
- return false;
138
- setState({ status: "connecting", error, client: null });
139
- emitObserverDiagnostic(withObserverContext(cfg.observer, { attemptSeq: currentAttemptSeq }), {
140
- path: "auto",
141
- stage: "reconnect",
142
- code_domain: "event",
143
- code: "reconnect_scheduled",
144
- result: "retry",
145
- });
146
- await sleep(backoffDelayMs(failedAttemptIndex, settings));
147
- return t === token && active === cfg;
148
- };
149
- const disconnectInternal = () => {
150
- cancelRetrySleep();
151
- abortActiveAttempt();
152
- active = null;
153
- activeConnectPromise = null;
154
- token += 1;
155
- attemptSeq = 0;
156
- const closeError = closeClient(s.client);
157
- if (closeError != null) {
158
- setState({ status: "error", error: closeError, client: null });
159
- throw closeError;
160
- }
161
- setState({ status: "disconnected", error: null, client: null });
162
- };
163
- const startReconnect = (t, cfg, error) => {
164
- if (t !== token)
165
- return;
166
- if (active !== cfg)
167
- return;
168
- if (s.status !== "connected")
169
- return;
170
- const ar = normalizeAutoReconnect(cfg.autoReconnect);
171
- if (!ar.enabled) {
172
- const closeError = closeClient(s.client);
173
- const finalError = closeError == null
174
- ? error
175
- : new AggregateError([error, closeError], "reconnect termination and client close failed");
176
- setState({ status: "error", error: finalError, client: null });
177
- return;
178
- }
179
- // Restart the connection loop in the background.
180
- cancelRetrySleep();
181
- abortActiveAttempt();
182
- const closeError = closeClient(s.client);
183
- if (closeError != null) {
184
- setState({
185
- status: "error",
186
- error: new AggregateError([error, closeError], "reconnect termination and client close failed"),
187
- client: null,
188
- });
189
- return;
190
- }
191
- token += 1;
192
- const nextToken = token;
193
- const reconnectPromise = startConnectLoop(nextToken, cfg, error);
194
- void reconnectPromise.catch(() => {
195
- // connectWithRetry updates state; keep errors observable via state().
196
- });
197
- };
198
- const createObserver = (t, cfg, currentAttemptSeq) => {
199
- const user = cfg.observer;
200
- return withObserverContext({
201
- onConnect: (...args) => user?.onConnect?.(...args),
202
- onAttach: (...args) => user?.onAttach?.(...args),
203
- onHandshake: (...args) => user?.onHandshake?.(...args),
204
- onWsClose: (kind, code) => {
205
- user?.onWsClose?.(kind, code);
206
- if (kind === "peer_or_error") {
207
- startReconnect(t, cfg, new Error(`WebSocket closed (${code ?? "unknown"})`));
208
- }
209
- },
210
- onWsError: (reason) => {
211
- user?.onWsError?.(reason);
212
- startReconnect(t, cfg, new Error(`WebSocket error: ${reason}`));
213
- },
214
- onRpcCall: (...args) => user?.onRpcCall?.(...args),
215
- onRpcNotify: (...args) => user?.onRpcNotify?.(...args),
216
- onDiagnosticEvent: (event) => {
217
- user?.onDiagnosticEvent?.(event);
218
- if (event.code === "liveness_timeout") {
219
- startReconnect(t, cfg, new Error("liveness timeout"));
220
- }
221
- },
222
- }, {
223
- attemptSeq: currentAttemptSeq,
224
- });
225
- };
226
- const connectOnce = async (t, cfg, currentAttemptSeq) => {
227
- abortActiveAttempt();
228
- attemptAbort = new AbortController();
229
- return await cfg.connectOnce({ signal: attemptAbort.signal, observer: createObserver(t, cfg, currentAttemptSeq) ?? {} });
230
- };
231
- const connectWithRetry = async (t, cfg, initialFailure) => {
232
- const ar = normalizeAutoReconnect(cfg.autoReconnect);
233
- let attempts = 0;
234
- if (initialFailure != null) {
235
- if (isTerminalConnectError(initialFailure)) {
236
- finishWithError(cfg, initialFailure, attemptSeq);
237
- throw initialFailure;
238
- }
239
- if (!await scheduleRetry(t, cfg, initialFailure, ar, 0, attemptSeq))
240
- return;
241
- }
242
- for (;;) {
243
- if (t !== token)
244
- return;
245
- if (active !== cfg)
246
- return;
247
- attempts += 1;
248
- attemptSeq += 1;
249
- emitObserverDiagnostic(withObserverContext(cfg.observer, { attemptSeq }), {
250
- path: "auto",
251
- stage: "reconnect",
252
- code_domain: "event",
253
- code: attempts === 1 ? "reconnect_attempt" : "reconnect_retry_attempt",
254
- result: "retry",
255
- });
256
- try {
257
- const client = await connectOnce(t, cfg, attemptSeq);
258
- if (t !== token) {
259
- const closeError = closeClient(client);
260
- if (closeError != null)
261
- throw new ReconnectCleanupError(closeError);
262
- return;
263
- }
264
- if (active !== cfg) {
265
- const closeError = closeClient(client);
266
- if (closeError != null)
267
- throw new ReconnectCleanupError(closeError);
268
- return;
269
- }
270
- setState({ status: "connected", client, error: null });
271
- const termination = getClientTermination(client);
272
- if (termination != null) {
273
- void termination.then(({ error }) => {
274
- if (s.client !== client)
275
- return;
276
- startReconnect(t, cfg, error);
277
- }, (error) => {
278
- if (s.client !== client)
279
- return;
280
- startReconnect(t, cfg, asError(error));
281
- });
282
- }
283
- emitObserverDiagnostic(withObserverContext(cfg.observer, { attemptSeq }), {
284
- path: "auto",
285
- stage: "reconnect",
286
- code_domain: "event",
287
- code: "reconnect_connected",
288
- result: "ok",
289
- });
290
- return;
291
- }
292
- catch (err) {
293
- if (err instanceof ReconnectCleanupError)
294
- throw err.cleanupError;
295
- const e = err instanceof Error ? err : new Error(String(err));
296
- if (t !== token)
297
- return;
298
- if (active !== cfg)
299
- return;
300
- const canRetry = ar.enabled && attempts < ar.maxAttempts && !isTerminalConnectError(e);
301
- if (!canRetry) {
302
- finishWithError(cfg, e, attemptSeq);
303
- throw e;
304
- }
305
- if (!await scheduleRetry(t, cfg, e, ar, attempts - 1, attemptSeq))
306
- return;
307
- }
308
- }
309
- };
310
- const startConnectLoop = (t, cfg, initialFailure) => {
311
- let resolveLoop;
312
- let rejectLoop;
313
- const loop = new Promise((resolve, reject) => {
314
- resolveLoop = resolve;
315
- rejectLoop = reject;
316
- });
317
- let promise;
318
- promise = loop.finally(() => {
319
- if (activeConnectPromise === promise)
320
- activeConnectPromise = null;
321
- });
322
- activeConnectPromise = promise;
323
- void connectWithRetry(t, cfg, initialFailure).then(resolveLoop, rejectLoop);
324
- return promise;
325
- };
326
- const connect = async (cfg) => {
327
- normalizeAutoReconnect(cfg.autoReconnect);
328
- cancelRetrySleep();
329
- abortActiveAttempt();
330
- token += 1;
331
- const t = token;
332
- active = cfg;
333
- attemptSeq = 0;
334
- const closeError = closeClient(s.client);
335
- if (closeError != null) {
336
- active = null;
337
- setState({ status: "error", error: closeError, client: null });
338
- throw closeError;
339
- }
340
- const connectPromise = startConnectLoop(t, cfg, null);
341
- setState({ status: "connecting", error: null, client: null });
342
- await connectPromise;
343
- };
344
- const connectIfNeeded = async (cfg) => {
345
- if (isSameConfig(active, cfg)) {
346
- if (activeConnectPromise) {
347
- await activeConnectPromise;
348
- return;
349
- }
350
- if (s.status === "connected" && s.client)
351
- return;
352
- }
353
- await connect(cfg);
354
- };
355
- const disconnect = () => {
356
- disconnectInternal();
357
- };
358
- return {
359
- state: () => s,
360
- subscribe: (listener) => {
361
- listeners.add(listener);
362
- // Push the current state immediately for convenience.
363
- try {
364
- listener(s);
365
- }
366
- catch {
367
- // ignore
368
- }
369
- return () => {
370
- listeners.delete(listener);
371
- };
372
- },
373
- connect,
374
- connectIfNeeded,
375
- disconnect,
376
- };
377
- }
378
- class ReconnectCleanupError extends Error {
379
- cleanupError;
380
- constructor(cleanupError) {
381
- super("reconnect cleanup failed", { cause: cleanupError });
382
- this.cleanupError = cleanupError;
383
- this.name = "ReconnectCleanupError";
384
- }
385
- }
386
- function asError(value) {
387
- return value instanceof Error ? value : new Error(String(value));
388
- }
@@ -1 +0,0 @@
1
- export * from "./rpcProxy.js";
@@ -1 +0,0 @@
1
- export * from "./rpcProxy.js";
@@ -1 +0,0 @@
1
- export { RpcProxy, RpcProxyDetachedError } from "../rpc/rpcProxy.js";
@@ -1 +0,0 @@
1
- export { RpcProxy, RpcProxyDetachedError } from "../rpc/rpcProxy.js";
@@ -1 +0,0 @@
1
- export * from "./streamHello.js";
@@ -1 +0,0 @@
1
- export * from "./streamHello.js";
@@ -1,3 +0,0 @@
1
- import type { StreamHello } from "../gen/flowersec/rpc/v1.gen.js";
2
- export declare function writeStreamHello(write: (b: Uint8Array) => Promise<void>, kind: string): Promise<void>;
3
- export declare function readStreamHello(readExactly: (n: number) => Promise<Uint8Array>): Promise<StreamHello>;
@@ -1,13 +0,0 @@
1
- import { readJsonFrame, writeJsonFrame } from "../framing/jsonframe.js";
2
- // writeStreamHello sends the initial stream greeting.
3
- export async function writeStreamHello(write, kind) {
4
- const h = { kind, v: 1 };
5
- await writeJsonFrame(write, h);
6
- }
7
- // readStreamHello reads and validates the stream greeting.
8
- export async function readStreamHello(readExactly) {
9
- const h = (await readJsonFrame(readExactly, 8 * 1024));
10
- if (h.v !== 1 || typeof h.kind !== "string" || h.kind.length === 0)
11
- throw new Error("bad StreamHello");
12
- return h;
13
- }
@@ -1,32 +0,0 @@
1
- import type { Client } from "../client.js";
2
- import { ByteReader } from "../yamux/byteReader.js";
3
- import type { YamuxStream } from "../yamux/stream.js";
4
- export declare function readMaybe(stream: YamuxStream): Promise<Uint8Array | null>;
5
- export declare function createByteReader(stream: YamuxStream, opts?: Readonly<{
6
- signal?: AbortSignal;
7
- }>): ByteReader;
8
- export declare function readExactly(reader: ByteReader, n: number, opts?: Readonly<{
9
- signal?: AbortSignal;
10
- }>): Promise<Uint8Array>;
11
- export type ReadNBytesOptions = Readonly<{
12
- chunkSize?: number;
13
- signal?: AbortSignal;
14
- onProgress?: (read: number) => void;
15
- }>;
16
- export declare function readNBytes(reader: ByteReader, n: number, opts?: ReadNBytesOptions): Promise<Uint8Array>;
17
- export type JsonFrameChannel = Readonly<{
18
- stream: YamuxStream;
19
- reader: ByteReader;
20
- writeFrame: (value: unknown) => Promise<void>;
21
- readFrame: <T = unknown>(opts?: Readonly<{
22
- maxBytes?: number;
23
- assert?: (value: unknown) => T;
24
- }>) => Promise<T>;
25
- close: () => Promise<void>;
26
- }>;
27
- export type JsonFrameChannelOptions = Readonly<{
28
- signal?: AbortSignal;
29
- maxJsonFrameBytes?: number;
30
- }>;
31
- export declare function createJsonFrameChannel(stream: YamuxStream, opts?: JsonFrameChannelOptions): JsonFrameChannel;
32
- export declare function openJsonFrameChannel(client: Pick<Client, "openStream">, kind: string, opts?: JsonFrameChannelOptions): Promise<JsonFrameChannel>;