@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
@@ -0,0 +1,405 @@
1
+ export class CarrierError extends Error {
2
+ code;
3
+ cause;
4
+ constructor(code, message, cause) {
5
+ super(message);
6
+ this.code = code;
7
+ this.cause = cause;
8
+ this.name = "CarrierError";
9
+ }
10
+ }
11
+ function deferred() {
12
+ let resolvePromise;
13
+ const promise = new Promise((resolve) => { resolvePromise = resolve; });
14
+ return { promise, resolve: (value) => resolvePromise(value) };
15
+ }
16
+ export function adaptNativeCarrierSessionV2(native) {
17
+ return new NativeCarrierSessionAdapter(native);
18
+ }
19
+ export function createMemoryCarrierPairV2(options) {
20
+ const maxPendingStreams = options.maxPendingStreams ?? 128;
21
+ if (!Number.isInteger(maxPendingStreams) || maxPendingStreams < 1 || maxPendingStreams > 1_024) {
22
+ throw new RangeError("maxPendingStreams must be an integer from 1 to 1024");
23
+ }
24
+ requireInboundBidirectionalStreamCapacity(options.inboundBidirectionalStreamCapacity);
25
+ const link = new MemoryCarrierLink(options.kind, options.path, options.inboundBidirectionalStreamCapacity, maxPendingStreams);
26
+ const left = new MemoryCarrierSession(link, 0);
27
+ const right = new MemoryCarrierSession(link, 1);
28
+ link.attach(left, right);
29
+ return [left, right];
30
+ }
31
+ class MemoryCarrierLink {
32
+ kind;
33
+ path;
34
+ inboundBidirectionalStreamCapacity;
35
+ maxPendingStreams;
36
+ sessions;
37
+ closedError;
38
+ streams = new Set();
39
+ termination = deferred();
40
+ constructor(kind, path, inboundBidirectionalStreamCapacity, maxPendingStreams) {
41
+ this.kind = kind;
42
+ this.path = path;
43
+ this.inboundBidirectionalStreamCapacity = inboundBidirectionalStreamCapacity;
44
+ this.maxPendingStreams = maxPendingStreams;
45
+ }
46
+ attach(left, right) {
47
+ this.sessions = [left, right];
48
+ }
49
+ assertOpen() {
50
+ if (this.closedError !== undefined)
51
+ throw this.closedError;
52
+ }
53
+ open(side) {
54
+ this.assertOpen();
55
+ const sessions = this.sessions;
56
+ if (sessions === undefined)
57
+ throw new Error("memory carrier is not attached");
58
+ const peer = sessions[side === 0 ? 1 : 0];
59
+ if (peer.pendingCount() >= this.maxPendingStreams) {
60
+ throw new CarrierError("closed", "carrier incoming stream queue exhausted");
61
+ }
62
+ const state = new MemoryStreamState(() => {
63
+ this.streams.delete(local);
64
+ this.streams.delete(remote);
65
+ });
66
+ const local = new MemoryCarrierStream(state, side);
67
+ const remote = new MemoryCarrierStream(state, side === 0 ? 1 : 0);
68
+ this.streams.add(local);
69
+ this.streams.add(remote);
70
+ peer.enqueue(remote);
71
+ return local;
72
+ }
73
+ close() {
74
+ if (this.closedError !== undefined)
75
+ return;
76
+ this.closedError = new CarrierError("closed", "carrier session closed");
77
+ for (const stream of [...this.streams])
78
+ stream.failFromSession(this.closedError);
79
+ this.streams.clear();
80
+ for (const session of this.sessions ?? [])
81
+ session.fail(this.closedError);
82
+ this.termination.resolve();
83
+ }
84
+ waitTermination() {
85
+ return this.termination.promise;
86
+ }
87
+ }
88
+ class MemoryCarrierSession {
89
+ link;
90
+ side;
91
+ kind;
92
+ path;
93
+ inboundBidirectionalStreamCapacity;
94
+ unreliableDatagrams = undefined;
95
+ incoming = new AsyncQueue();
96
+ closed = false;
97
+ constructor(link, side) {
98
+ this.link = link;
99
+ this.side = side;
100
+ this.kind = link.kind;
101
+ this.path = link.path;
102
+ this.inboundBidirectionalStreamCapacity = link.inboundBidirectionalStreamCapacity;
103
+ }
104
+ async openStream(options = {}) {
105
+ throwIfAborted(options.signal);
106
+ this.assertOpen();
107
+ return this.link.open(this.side);
108
+ }
109
+ async acceptStream(options = {}) {
110
+ this.assertOpen();
111
+ return await this.incoming.shift(options.signal);
112
+ }
113
+ async close() {
114
+ this.link.close();
115
+ }
116
+ async waitTermination() {
117
+ await this.link.waitTermination();
118
+ }
119
+ abort() {
120
+ this.link.close();
121
+ }
122
+ enqueue(stream) {
123
+ if (this.closed) {
124
+ void stream.reset();
125
+ return;
126
+ }
127
+ this.incoming.push(stream);
128
+ }
129
+ pendingCount() {
130
+ return this.incoming.size;
131
+ }
132
+ fail(error) {
133
+ if (this.closed)
134
+ return;
135
+ this.closed = true;
136
+ this.incoming.fail(error);
137
+ }
138
+ assertOpen() {
139
+ if (this.closed)
140
+ throw new CarrierError("closed", "carrier session closed");
141
+ this.link.assertOpen();
142
+ }
143
+ }
144
+ class MemoryStreamState {
145
+ onClean;
146
+ inbound = [new AsyncQueue(), new AsyncQueue()];
147
+ writeClosed = [false, false];
148
+ readStopped = [false, false];
149
+ terminalError;
150
+ cleaned = false;
151
+ constructor(onClean) {
152
+ this.onClean = onClean;
153
+ }
154
+ finishIfClosed() {
155
+ if (!this.cleaned && this.writeClosed[0] && this.writeClosed[1]) {
156
+ this.cleaned = true;
157
+ this.onClean();
158
+ }
159
+ }
160
+ reset() {
161
+ if (this.terminalError !== undefined)
162
+ return;
163
+ this.terminalError = new CarrierError("reset", "carrier stream reset");
164
+ this.inbound[0].fail(this.terminalError);
165
+ this.inbound[1].fail(this.terminalError);
166
+ if (!this.cleaned) {
167
+ this.cleaned = true;
168
+ this.onClean();
169
+ }
170
+ }
171
+ stopSending(side) {
172
+ if (this.terminalError !== undefined || this.readStopped[side])
173
+ return;
174
+ this.readStopped[side] = true;
175
+ this.inbound[side].fail(new CarrierError("stop_sending", "carrier stream receive side stopped"));
176
+ }
177
+ fail(error) {
178
+ if (this.terminalError !== undefined)
179
+ return;
180
+ this.terminalError = error;
181
+ this.inbound[0].fail(error);
182
+ this.inbound[1].fail(error);
183
+ }
184
+ }
185
+ class MemoryCarrierStream {
186
+ state;
187
+ side;
188
+ constructor(state, side) {
189
+ this.state = state;
190
+ this.side = side;
191
+ }
192
+ async read(options = {}) {
193
+ this.assertNotTerminal();
194
+ return await this.state.inbound[this.side].shift(options.signal);
195
+ }
196
+ async write(data, options = {}) {
197
+ throwIfAborted(options.signal);
198
+ this.assertNotTerminal();
199
+ if (!(data instanceof Uint8Array))
200
+ throw new TypeError("carrier stream write requires Uint8Array");
201
+ if (this.state.writeClosed[this.side]) {
202
+ throw new CarrierError("write_closed", "carrier stream write side is closed");
203
+ }
204
+ const peer = this.side === 0 ? 1 : 0;
205
+ if (this.state.readStopped[peer]) {
206
+ throw new CarrierError("stop_sending", "carrier peer stopped receiving this stream");
207
+ }
208
+ this.state.inbound[peer].push(data.slice());
209
+ return data.length;
210
+ }
211
+ async closeWrite() {
212
+ this.assertNotTerminal();
213
+ if (this.state.writeClosed[this.side])
214
+ return;
215
+ this.state.writeClosed[this.side] = true;
216
+ const peer = this.side === 0 ? 1 : 0;
217
+ this.state.inbound[peer].push(null);
218
+ this.state.finishIfClosed();
219
+ }
220
+ async reset() {
221
+ this.state.reset();
222
+ }
223
+ async stopSending() {
224
+ this.state.stopSending(this.side);
225
+ }
226
+ abort() {
227
+ this.state.reset();
228
+ }
229
+ failFromSession(error) {
230
+ this.state.fail(error);
231
+ }
232
+ assertNotTerminal() {
233
+ if (this.state.terminalError !== undefined)
234
+ throw this.state.terminalError;
235
+ }
236
+ }
237
+ class AsyncQueue {
238
+ values = [];
239
+ head = 0;
240
+ waiters = new Set();
241
+ terminalError;
242
+ get size() {
243
+ return this.values.length - this.head;
244
+ }
245
+ push(value) {
246
+ if (this.terminalError !== undefined)
247
+ return;
248
+ const waiter = this.waiters.values().next().value;
249
+ if (waiter !== undefined) {
250
+ waiter.deliver(value);
251
+ return;
252
+ }
253
+ this.values.push(value);
254
+ }
255
+ shift(signal) {
256
+ throwIfAborted(signal);
257
+ if (this.terminalError !== undefined)
258
+ return Promise.reject(this.terminalError);
259
+ if (this.head < this.values.length) {
260
+ const value = this.values[this.head++];
261
+ this.compact();
262
+ return Promise.resolve(value);
263
+ }
264
+ return new Promise((resolve, reject) => {
265
+ let settled = false;
266
+ const cleanup = () => {
267
+ this.waiters.delete(waiter);
268
+ signal?.removeEventListener("abort", onAbort);
269
+ };
270
+ const waiter = {
271
+ deliver: (value) => {
272
+ if (settled)
273
+ return;
274
+ settled = true;
275
+ cleanup();
276
+ resolve(value);
277
+ },
278
+ fail: (error) => {
279
+ if (settled)
280
+ return;
281
+ settled = true;
282
+ cleanup();
283
+ reject(error);
284
+ },
285
+ };
286
+ const onAbort = () => waiter.fail(abortedError());
287
+ this.waiters.add(waiter);
288
+ signal?.addEventListener("abort", onAbort, { once: true });
289
+ if (signal?.aborted === true)
290
+ onAbort();
291
+ });
292
+ }
293
+ fail(error) {
294
+ if (this.terminalError !== undefined)
295
+ return;
296
+ this.terminalError = error;
297
+ this.values.length = 0;
298
+ this.head = 0;
299
+ for (const waiter of [...this.waiters])
300
+ waiter.fail(error);
301
+ }
302
+ compact() {
303
+ if (this.head > 1_024 && this.head * 2 > this.values.length) {
304
+ this.values.splice(0, this.head);
305
+ this.head = 0;
306
+ }
307
+ }
308
+ }
309
+ function throwIfAborted(signal) {
310
+ if (signal?.aborted === true)
311
+ throw abortedError();
312
+ }
313
+ function abortedError() {
314
+ return new CarrierError("aborted", "carrier operation aborted");
315
+ }
316
+ class NativeCarrierSessionAdapter {
317
+ native;
318
+ kind;
319
+ path;
320
+ inboundBidirectionalStreamCapacity;
321
+ unreliableDatagrams;
322
+ constructor(native) {
323
+ this.native = native;
324
+ this.kind = native.kind;
325
+ this.path = native.path;
326
+ this.inboundBidirectionalStreamCapacity = native.inboundBidirectionalStreamCapacity;
327
+ this.unreliableDatagrams = native.unreliableDatagrams;
328
+ }
329
+ async openStream(options = {}) {
330
+ return new NativeCarrierStreamAdapter(await this.native.openStream(options));
331
+ }
332
+ async acceptStream(options = {}) {
333
+ return new NativeCarrierStreamAdapter(await this.native.acceptStream(options));
334
+ }
335
+ async waitTermination() {
336
+ await this.native.waitTermination();
337
+ }
338
+ async close() {
339
+ await this.native.close();
340
+ }
341
+ abort(error) {
342
+ this.native.abort(error);
343
+ }
344
+ }
345
+ function requireInboundBidirectionalStreamCapacity(value) {
346
+ if (!Number.isInteger(value) || value < 3 || value > 130) {
347
+ throw new RangeError("inboundBidirectionalStreamCapacity must be an integer from 3 to 130");
348
+ }
349
+ }
350
+ class NativeCarrierStreamAdapter {
351
+ native;
352
+ constructor(native) {
353
+ this.native = native;
354
+ }
355
+ async read(options = {}) {
356
+ return await abortable(this.native.read(), options.signal, () => this.native.abort());
357
+ }
358
+ async write(data, options = {}) {
359
+ throwIfAborted(options.signal);
360
+ return await abortable(this.native.write(data), options.signal, () => this.native.abort());
361
+ }
362
+ async closeWrite() {
363
+ await this.native.closeWrite();
364
+ }
365
+ async reset() {
366
+ await this.native.reset();
367
+ }
368
+ async stopSending() {
369
+ await this.native.stopSending();
370
+ }
371
+ abort(error) {
372
+ this.native.abort(error);
373
+ }
374
+ }
375
+ async function abortable(promise, signal, onAbort) {
376
+ if (signal === undefined)
377
+ return await promise;
378
+ throwIfAborted(signal);
379
+ return await new Promise((resolve, reject) => {
380
+ let settled = false;
381
+ const cleanup = () => signal.removeEventListener("abort", abort);
382
+ const abort = () => {
383
+ if (settled)
384
+ return;
385
+ settled = true;
386
+ cleanup();
387
+ onAbort();
388
+ reject(abortedError());
389
+ };
390
+ signal.addEventListener("abort", abort, { once: true });
391
+ void promise.then((value) => {
392
+ if (settled)
393
+ return;
394
+ settled = true;
395
+ cleanup();
396
+ resolve(value);
397
+ }, (error) => {
398
+ if (settled)
399
+ return;
400
+ settled = true;
401
+ cleanup();
402
+ reject(error);
403
+ });
404
+ });
405
+ }
@@ -0,0 +1,37 @@
1
+ import type { RpcClient } from "../rpc/client.js";
2
+ export interface InternalByteStreamV2 {
3
+ readonly id: bigint;
4
+ readonly kind: string;
5
+ readonly terminalError: Error | undefined;
6
+ read(options?: OperationOptionsV2): Promise<Uint8Array | null>;
7
+ write(data: Uint8Array, options?: OperationOptionsV2): Promise<number>;
8
+ closeWrite(): Promise<void>;
9
+ reset(): Promise<void>;
10
+ close(): Promise<void>;
11
+ }
12
+ export interface InternalIncomingStreamV2 {
13
+ readonly id: bigint;
14
+ readonly kind: string;
15
+ readonly metadata: JsonObjectV2;
16
+ readonly stream: InternalByteStreamV2;
17
+ }
18
+ export interface InternalSessionV2 {
19
+ readonly path: PathKind;
20
+ readonly endpointInstanceId: string | undefined;
21
+ readonly rpc: RpcClient;
22
+ readonly termination: Promise<Readonly<{
23
+ error: Error;
24
+ }>>;
25
+ readonly unreliableMessages?: UnreliableMessageChannelV2 | undefined;
26
+ openStream(kind: string, options?: InternalStreamOpenOptionsV2): Promise<InternalByteStreamV2>;
27
+ acceptStream(options?: OperationOptionsV2): Promise<InternalIncomingStreamV2>;
28
+ rekey(options?: OperationOptionsV2): Promise<void>;
29
+ probeLiveness(options?: OperationOptionsV2): Promise<number>;
30
+ waitTermination(): Promise<Readonly<{
31
+ error: Error;
32
+ }>>;
33
+ close(): Promise<void>;
34
+ }
35
+ export type InternalStreamOpenOptionsV2 = OperationOptionsV2 & Readonly<{
36
+ metadata?: JsonObjectV2;
37
+ }>;
@@ -0,0 +1 @@
1
+ /** @internal */ export { SessionError } from "../public/contract.js";
@@ -0,0 +1,80 @@
1
+ import { CipherSuiteV2 } from "./protocol.js";
2
+ export declare enum HandshakeMessageTypeV2 {
3
+ ClientInit = 1,
4
+ ServerFinished = 2,
5
+ ClientFinished = 3
6
+ }
7
+ export type HandshakeFrameV2 = Readonly<{
8
+ type: HandshakeMessageTypeV2;
9
+ payload: Uint8Array;
10
+ raw: Uint8Array;
11
+ }>;
12
+ export type ClientInitV2 = Readonly<{
13
+ profile: "flowersec/2";
14
+ channelID: string;
15
+ sessionContractHash: Uint8Array;
16
+ clientRole: 1;
17
+ suite: CipherSuiteV2;
18
+ clientEphemeralPublic: Uint8Array;
19
+ nonceC: Uint8Array;
20
+ selectedFeatures: number;
21
+ maxInboundStreams: number;
22
+ clientAdmissionBinding: Uint8Array;
23
+ clientEndpointInstanceID: string;
24
+ }>;
25
+ export type ServerFinishedCoreV2 = Readonly<{
26
+ suite: CipherSuiteV2;
27
+ handshakeID: Uint8Array;
28
+ serverEphemeralPublic: Uint8Array;
29
+ nonceS: Uint8Array;
30
+ sessionContractHash: Uint8Array;
31
+ selectedFeatures: number;
32
+ maxInboundStreams: number;
33
+ serverAdmissionBinding: Uint8Array;
34
+ serverEndpointInstanceID: string;
35
+ }>;
36
+ export type ServerFinishedV2 = Readonly<{
37
+ core: ServerFinishedCoreV2;
38
+ serverConfirm: Uint8Array;
39
+ }>;
40
+ export type ClientFinishedV2 = Readonly<{
41
+ handshakeID: Uint8Array;
42
+ clientConfirm: Uint8Array;
43
+ }>;
44
+ export type HandshakeExpectationsV2 = Readonly<{
45
+ path: "direct" | "tunnel";
46
+ channelID: string;
47
+ sessionContractHash: Uint8Array;
48
+ suite: CipherSuiteV2;
49
+ maxInboundStreams: number;
50
+ admissionBinding: Uint8Array;
51
+ expectedEndpointInstanceID: string;
52
+ }>;
53
+ export declare function encodeControlPrefaceV2(): Uint8Array;
54
+ export declare function parseControlPrefaceV2(raw: Uint8Array): void;
55
+ export declare function encodeHandshakeFrameV2(type: HandshakeMessageTypeV2, payload: Uint8Array): Uint8Array;
56
+ export declare function decodeHandshakeFrameV2(raw: Uint8Array): HandshakeFrameV2;
57
+ export declare function encodeClientInitV2(message: ClientInitV2): Uint8Array;
58
+ export declare function decodeClientInitV2(raw: Uint8Array): ClientInitV2;
59
+ export declare function encodeServerFinishedCoreV2(core: ServerFinishedCoreV2, suite: CipherSuiteV2): Uint8Array;
60
+ export declare function encodeServerFinishedV2(message: ServerFinishedV2, suite: CipherSuiteV2): Uint8Array;
61
+ export declare function decodeServerFinishedV2(raw: Uint8Array, suite: CipherSuiteV2): ServerFinishedV2;
62
+ export declare function encodeClientFinishedCoreV2(handshakeID: Uint8Array): Uint8Array;
63
+ export declare function encodeClientFinishedV2(message: ClientFinishedV2): Uint8Array;
64
+ export declare function decodeClientFinishedV2(raw: Uint8Array): ClientFinishedV2;
65
+ export declare function generateEphemeralKeyV2(suite: CipherSuiteV2, entropy: (length: number) => Uint8Array): Readonly<{
66
+ privateKey: Uint8Array;
67
+ publicKey: Uint8Array;
68
+ }>;
69
+ export declare function ephemeralPublicKeyV2(suite: CipherSuiteV2, privateKey: Uint8Array): Uint8Array;
70
+ export declare function computeSharedSecretV2(suite: CipherSuiteV2, privateKey: Uint8Array, peerPublicKey: Uint8Array): Uint8Array;
71
+ export declare function deriveHandshakePRKV2(psk: Uint8Array, sharedSecret: Uint8Array): Uint8Array;
72
+ export declare function computeHandshakeH0V2(fsc2Raw: Uint8Array, clientInitRaw: Uint8Array): Uint8Array;
73
+ export declare function computeHandshakeH1V2(h0: Uint8Array, serverCoreRaw: Uint8Array): Uint8Array;
74
+ export declare function computeServerConfirmV2(handshakePRK: Uint8Array, h1: Uint8Array): Uint8Array;
75
+ export declare function computeHandshakeH2V2(h1: Uint8Array, serverFinishedRaw: Uint8Array, clientCoreRaw: Uint8Array): Uint8Array;
76
+ export declare function computeClientConfirmV2(handshakePRK: Uint8Array, h2: Uint8Array): Uint8Array;
77
+ export declare function computeHandshakeH3V2(h2: Uint8Array, clientFinishedRaw: Uint8Array): Uint8Array;
78
+ export declare function deriveSessionPRKV2(h3: Uint8Array, handshakePRK: Uint8Array): Uint8Array;
79
+ export declare function validateClientInitV2(message: ClientInitV2, expected: HandshakeExpectationsV2): void;
80
+ export declare function validateServerFinishedV2(message: ServerFinishedV2, expected: HandshakeExpectationsV2): void;