@floegence/flowersec-core 0.27.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 (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,256 +0,0 @@
1
- import { PROXY_WINDOW_STREAM_CHUNK_MSG_TYPE, PROXY_WINDOW_STREAM_CLOSE_MSG_TYPE, PROXY_WINDOW_STREAM_END_MSG_TYPE, PROXY_WINDOW_STREAM_RESET_MSG_TYPE, PROXY_WINDOW_STREAM_WRITE_ACK_MSG_TYPE, } from "./windowBridgeProtocol.js";
2
- function cloneChunk(chunk) {
3
- const out = new Uint8Array(chunk.byteLength);
4
- out.set(chunk);
5
- return out.buffer;
6
- }
7
- function validWriteId(value) {
8
- return Number.isSafeInteger(value) && Number(value) > 0;
9
- }
10
- export function createMessagePortBackedStream(port, opts = {}) {
11
- let closed = false;
12
- let acceptingWrites = true;
13
- let error = null;
14
- const queue = [];
15
- const waiters = [];
16
- let pendingInboundWriteId = null;
17
- let pendingOutboundAcknowledgement = null;
18
- let nextWriteId = 1;
19
- let writeTail = Promise.resolve();
20
- let queuedWriteBytes = 0;
21
- const maxBufferedBytes = opts.maxBufferedBytes ?? 4 * (1 << 20);
22
- let terminalNotified = false;
23
- const notifyTerminal = () => {
24
- if (terminalNotified)
25
- return;
26
- terminalNotified = true;
27
- opts.onTerminal?.();
28
- };
29
- const closePort = () => {
30
- try {
31
- port.close();
32
- }
33
- catch {
34
- // Best-effort.
35
- }
36
- };
37
- const drainWaiters = (value) => {
38
- for (const waiter of waiters.splice(0))
39
- waiter(value);
40
- };
41
- const terminateWithError = (err, notifyPeer) => {
42
- if (error != null)
43
- return;
44
- error = err;
45
- closed = true;
46
- acceptingWrites = false;
47
- queue.length = 0;
48
- pendingInboundWriteId = null;
49
- drainWaiters(err);
50
- pendingOutboundAcknowledgement?.reject(err);
51
- pendingOutboundAcknowledgement = null;
52
- if (notifyPeer) {
53
- try {
54
- port.postMessage({
55
- type: PROXY_WINDOW_STREAM_RESET_MSG_TYPE,
56
- message: err.message,
57
- });
58
- }
59
- catch {
60
- // The local error remains authoritative.
61
- }
62
- }
63
- closePort();
64
- notifyTerminal();
65
- };
66
- const failProtocol = (message) => {
67
- terminateWithError(new Error(`proxy Window stream protocol error: ${message}`), true);
68
- };
69
- const finishClosed = () => {
70
- if (closed)
71
- return;
72
- if (pendingInboundWriteId != null) {
73
- failProtocol("stream ended before the pending chunk was acknowledged");
74
- return;
75
- }
76
- closed = true;
77
- acceptingWrites = false;
78
- const closeError = new Error("stream is closed");
79
- pendingOutboundAcknowledgement?.reject(closeError);
80
- pendingOutboundAcknowledgement = null;
81
- drainWaiters(null);
82
- closePort();
83
- notifyTerminal();
84
- };
85
- const acknowledgeRead = (item) => {
86
- if (closed)
87
- return;
88
- if (pendingInboundWriteId !== item.writeId) {
89
- failProtocol("read acknowledgement does not match the pending chunk");
90
- throw error;
91
- }
92
- pendingInboundWriteId = null;
93
- try {
94
- port.postMessage({
95
- type: PROXY_WINDOW_STREAM_WRITE_ACK_MSG_TYPE,
96
- writeId: item.writeId,
97
- });
98
- }
99
- catch (cause) {
100
- const err = cause instanceof Error ? cause : new Error(String(cause));
101
- terminateWithError(err, false);
102
- throw err;
103
- }
104
- };
105
- port.onmessage = (ev) => {
106
- if (closed)
107
- return;
108
- const data = ev.data;
109
- if (data == null || typeof data !== "object")
110
- return;
111
- const type = typeof data.type === "string" ? data.type : "";
112
- switch (type) {
113
- case PROXY_WINDOW_STREAM_CHUNK_MSG_TYPE: {
114
- const msg = data;
115
- if (!(msg.data instanceof ArrayBuffer) || !validWriteId(msg.writeId)) {
116
- failProtocol("invalid stream chunk");
117
- return;
118
- }
119
- if (pendingInboundWriteId != null || queue.length > 0) {
120
- failProtocol("received more than one unacknowledged chunk");
121
- return;
122
- }
123
- pendingInboundWriteId = msg.writeId;
124
- const item = { chunk: new Uint8Array(msg.data), writeId: msg.writeId };
125
- const waiter = waiters.shift();
126
- if (waiter == null) {
127
- queue.push(item);
128
- }
129
- else {
130
- waiter(item);
131
- }
132
- return;
133
- }
134
- case PROXY_WINDOW_STREAM_END_MSG_TYPE:
135
- case PROXY_WINDOW_STREAM_CLOSE_MSG_TYPE:
136
- finishClosed();
137
- return;
138
- case PROXY_WINDOW_STREAM_WRITE_ACK_MSG_TYPE: {
139
- const writeId = data.writeId;
140
- const pending = pendingOutboundAcknowledgement;
141
- if (!validWriteId(writeId) || pending == null || pending.writeId !== writeId) {
142
- failProtocol("unexpected stream write acknowledgement");
143
- return;
144
- }
145
- pendingOutboundAcknowledgement = null;
146
- pending.resolve();
147
- return;
148
- }
149
- case PROXY_WINDOW_STREAM_RESET_MSG_TYPE: {
150
- const message = String(data.message ?? "stream reset");
151
- terminateWithError(new Error(message), false);
152
- return;
153
- }
154
- default:
155
- return;
156
- }
157
- };
158
- port.start?.();
159
- return {
160
- async read() {
161
- if (error != null)
162
- throw error;
163
- const queued = queue.shift();
164
- if (queued != null) {
165
- acknowledgeRead(queued);
166
- return queued.chunk;
167
- }
168
- if (closed)
169
- return null;
170
- const value = await new Promise((resolve) => {
171
- waiters.push(resolve);
172
- });
173
- if (value instanceof Error)
174
- throw value;
175
- if (value == null)
176
- return null;
177
- acknowledgeRead(value);
178
- return value.chunk;
179
- },
180
- async write(chunk) {
181
- if (error != null)
182
- throw error;
183
- if (!acceptingWrites || closed)
184
- throw new Error("stream is closed");
185
- const nextQueuedWriteBytes = queuedWriteBytes + chunk.byteLength;
186
- if (!Number.isSafeInteger(nextQueuedWriteBytes) || nextQueuedWriteBytes > maxBufferedBytes) {
187
- throw new Error("proxy WebSocket outbound buffer exceeded");
188
- }
189
- queuedWriteBytes = nextQueuedWriteBytes;
190
- const ab = cloneChunk(chunk);
191
- const operation = writeTail.then(async () => {
192
- if (error != null)
193
- throw error;
194
- if (closed)
195
- throw new Error("stream is closed");
196
- if (!Number.isSafeInteger(nextWriteId)) {
197
- failProtocol("stream write identifier space exhausted");
198
- throw error;
199
- }
200
- if (pendingOutboundAcknowledgement != null) {
201
- failProtocol("multiple outbound chunks are awaiting acknowledgement");
202
- throw error;
203
- }
204
- const writeId = nextWriteId++;
205
- await new Promise((resolve, reject) => {
206
- pendingOutboundAcknowledgement = { writeId, resolve, reject };
207
- try {
208
- port.postMessage({
209
- type: PROXY_WINDOW_STREAM_CHUNK_MSG_TYPE,
210
- data: ab,
211
- writeId,
212
- }, [ab]);
213
- }
214
- catch (cause) {
215
- pendingOutboundAcknowledgement = null;
216
- const postError = cause instanceof Error ? cause : new Error(String(cause));
217
- terminateWithError(postError, false);
218
- reject(postError);
219
- }
220
- });
221
- });
222
- writeTail = operation.catch(() => { });
223
- try {
224
- await operation;
225
- }
226
- finally {
227
- queuedWriteBytes = Math.max(0, queuedWriteBytes - chunk.byteLength);
228
- }
229
- },
230
- async close() {
231
- if (closed)
232
- return;
233
- acceptingWrites = false;
234
- await writeTail;
235
- if (error != null)
236
- throw error;
237
- if (closed)
238
- return;
239
- closed = true;
240
- queue.length = 0;
241
- pendingInboundWriteId = null;
242
- drainWaiters(null);
243
- try {
244
- port.postMessage({ type: PROXY_WINDOW_STREAM_CLOSE_MSG_TYPE });
245
- }
246
- finally {
247
- closePort();
248
- notifyTerminal();
249
- }
250
- },
251
- reset(err) {
252
- const resetError = err instanceof Error ? err : new Error(String(err));
253
- terminateWithError(resetError, true);
254
- },
255
- };
256
- }
@@ -1,29 +0,0 @@
1
- export type ProxyPresetLimits = Readonly<{
2
- max_json_frame_bytes?: number;
3
- max_chunk_bytes?: number;
4
- max_body_bytes?: number;
5
- max_ws_frame_bytes?: number;
6
- timeout_ms?: number;
7
- }>;
8
- export type ProxyPresetManifest = Readonly<{
9
- v: 1;
10
- preset_id: string;
11
- deprecated?: boolean;
12
- limits: ProxyPresetLimits;
13
- }>;
14
- export type ResolvedProxyPreset = Readonly<{
15
- v: 1;
16
- preset_id: string;
17
- deprecated: boolean;
18
- limits: Readonly<{
19
- max_json_frame_bytes: number;
20
- max_chunk_bytes: number;
21
- max_body_bytes: number;
22
- max_ws_frame_bytes: number;
23
- timeout_ms?: number;
24
- }>;
25
- }>;
26
- export declare const DEFAULT_PROXY_PRESET_MANIFEST: ProxyPresetManifest;
27
- export type ProxyPresetInput = ProxyPresetManifest | Partial<ProxyPresetLimits>;
28
- export declare function assertProxyPresetManifest(value: unknown): ProxyPresetManifest;
29
- export declare function resolveProxyPreset(input?: ProxyPresetInput): ResolvedProxyPreset;
@@ -1,111 +0,0 @@
1
- import { DEFAULT_MAX_JSON_FRAME_BYTES } from "../framing/jsonframe.js";
2
- import { DEFAULT_MAX_BODY_BYTES, DEFAULT_MAX_CHUNK_BYTES, DEFAULT_MAX_WS_FRAME_BYTES } from "./constants.js";
3
- const PRESET_ID_RE = /^[a-z][a-z0-9._-]{0,63}$/;
4
- const DEFAULT_LIMITS = Object.freeze({
5
- max_json_frame_bytes: DEFAULT_MAX_JSON_FRAME_BYTES,
6
- max_chunk_bytes: DEFAULT_MAX_CHUNK_BYTES,
7
- max_body_bytes: DEFAULT_MAX_BODY_BYTES,
8
- max_ws_frame_bytes: DEFAULT_MAX_WS_FRAME_BYTES,
9
- });
10
- export const DEFAULT_PROXY_PRESET_MANIFEST = Object.freeze({
11
- v: 1,
12
- preset_id: "default",
13
- limits: {
14
- max_json_frame_bytes: DEFAULT_MAX_JSON_FRAME_BYTES,
15
- max_chunk_bytes: DEFAULT_MAX_CHUNK_BYTES,
16
- max_body_bytes: DEFAULT_MAX_BODY_BYTES,
17
- max_ws_frame_bytes: DEFAULT_MAX_WS_FRAME_BYTES,
18
- },
19
- });
20
- function isRecord(v) {
21
- return typeof v === "object" && v != null && !Array.isArray(v);
22
- }
23
- function assertNoUnknownFields(kind, value, allowed) {
24
- const allowedSet = new Set(allowed);
25
- for (const key of Object.keys(value)) {
26
- if (!allowedSet.has(key))
27
- throw new Error(`bad ${kind}.${key}`);
28
- }
29
- }
30
- function assertPositiveInt(name, value) {
31
- if (typeof value !== "number" || !Number.isSafeInteger(value) || value <= 0) {
32
- throw new Error(`${name} must be a positive safe integer`);
33
- }
34
- return value;
35
- }
36
- function assertLimits(value) {
37
- if (!isRecord(value))
38
- throw new Error("bad ProxyPresetManifest.limits");
39
- assertNoUnknownFields("ProxyPresetManifest.limits", value, [
40
- "max_json_frame_bytes",
41
- "max_chunk_bytes",
42
- "max_body_bytes",
43
- "max_ws_frame_bytes",
44
- "timeout_ms",
45
- ]);
46
- const out = {};
47
- if (value.max_json_frame_bytes !== undefined)
48
- out.max_json_frame_bytes = assertPositiveInt("max_json_frame_bytes", value.max_json_frame_bytes);
49
- if (value.max_chunk_bytes !== undefined)
50
- out.max_chunk_bytes = assertPositiveInt("max_chunk_bytes", value.max_chunk_bytes);
51
- if (value.max_body_bytes !== undefined)
52
- out.max_body_bytes = assertPositiveInt("max_body_bytes", value.max_body_bytes);
53
- if (value.max_ws_frame_bytes !== undefined)
54
- out.max_ws_frame_bytes = assertPositiveInt("max_ws_frame_bytes", value.max_ws_frame_bytes);
55
- if (value.timeout_ms !== undefined)
56
- out.timeout_ms = assertPositiveInt("timeout_ms", value.timeout_ms);
57
- return Object.freeze(out);
58
- }
59
- export function assertProxyPresetManifest(value) {
60
- if (!isRecord(value))
61
- throw new Error("bad ProxyPresetManifest");
62
- assertNoUnknownFields("ProxyPresetManifest", value, ["v", "preset_id", "deprecated", "limits"]);
63
- if (value.v !== 1)
64
- throw new Error("bad ProxyPresetManifest.v");
65
- if (typeof value.preset_id !== "string" || !PRESET_ID_RE.test(value.preset_id)) {
66
- throw new Error("bad ProxyPresetManifest.preset_id");
67
- }
68
- if (value.deprecated !== undefined && typeof value.deprecated !== "boolean") {
69
- throw new Error("bad ProxyPresetManifest.deprecated");
70
- }
71
- return Object.freeze({
72
- v: 1,
73
- preset_id: value.preset_id,
74
- ...(value.deprecated === undefined ? {} : { deprecated: value.deprecated }),
75
- limits: assertLimits(value.limits),
76
- });
77
- }
78
- function toResolved(manifest) {
79
- return Object.freeze({
80
- v: 1,
81
- preset_id: manifest.preset_id,
82
- deprecated: manifest.deprecated === true,
83
- limits: Object.freeze({
84
- max_json_frame_bytes: manifest.limits.max_json_frame_bytes ?? DEFAULT_LIMITS.max_json_frame_bytes,
85
- max_chunk_bytes: manifest.limits.max_chunk_bytes ?? DEFAULT_LIMITS.max_chunk_bytes,
86
- max_body_bytes: manifest.limits.max_body_bytes ?? DEFAULT_LIMITS.max_body_bytes,
87
- max_ws_frame_bytes: manifest.limits.max_ws_frame_bytes ?? DEFAULT_LIMITS.max_ws_frame_bytes,
88
- ...(manifest.limits.timeout_ms === undefined ? {} : { timeout_ms: manifest.limits.timeout_ms }),
89
- }),
90
- });
91
- }
92
- export function resolveProxyPreset(input) {
93
- if (input == null)
94
- return toResolved(DEFAULT_PROXY_PRESET_MANIFEST);
95
- if (isRecord(input) && ("v" in input || "presetId" in input || "limits" in input)) {
96
- return toResolved(assertProxyPresetManifest(input));
97
- }
98
- const limits = assertLimits(input);
99
- return Object.freeze({
100
- v: 1,
101
- preset_id: "custom",
102
- deprecated: false,
103
- limits: Object.freeze({
104
- max_json_frame_bytes: limits.max_json_frame_bytes ?? DEFAULT_LIMITS.max_json_frame_bytes,
105
- max_chunk_bytes: limits.max_chunk_bytes ?? DEFAULT_LIMITS.max_chunk_bytes,
106
- max_body_bytes: limits.max_body_bytes ?? DEFAULT_LIMITS.max_body_bytes,
107
- max_ws_frame_bytes: limits.max_ws_frame_bytes ?? DEFAULT_LIMITS.max_ws_frame_bytes,
108
- ...(limits.timeout_ms === undefined ? {} : { timeout_ms: limits.timeout_ms }),
109
- }),
110
- });
111
- }
@@ -1,57 +0,0 @@
1
- import type { ConnectArtifact, ScopePayload } from "../connect/artifact.js";
2
- import { assertProxyPresetManifest, type ProxyPresetInput, type ProxyPresetLimits } from "./preset.js";
3
- export type ProxyPresetSnapshotV1 = ReturnType<typeof assertProxyPresetManifest>;
4
- type ProxyRuntimeScopeBaseV1 = Readonly<{
5
- appBasePath?: string;
6
- preset: Readonly<{
7
- presetId: string;
8
- snapshot?: ProxyPresetSnapshotV1;
9
- }>;
10
- limits?: Readonly<{
11
- timeoutMs?: number;
12
- maxJsonFrameBytes?: number;
13
- maxChunkBytes?: number;
14
- maxBodyBytes?: number;
15
- maxWsFrameBytes?: number;
16
- }>;
17
- }>;
18
- export type ProxyRuntimeServiceWorkerScopeV1 = ProxyRuntimeScopeBaseV1 & Readonly<{
19
- mode: "service_worker";
20
- serviceWorker: Readonly<{
21
- scriptUrl: string;
22
- scope: string;
23
- }>;
24
- }>;
25
- export type ProxyRuntimeControllerBridgeScopeV1 = ProxyRuntimeScopeBaseV1 & Readonly<{
26
- mode: "controller_bridge";
27
- controllerBridge: Readonly<{
28
- allowedOrigins: readonly string[];
29
- }>;
30
- }>;
31
- export type ProxyRuntimeScopeV1 = ProxyRuntimeServiceWorkerScopeV1 | ProxyRuntimeControllerBridgeScopeV1;
32
- export declare function assertProxyRuntimeScopeV1(payload: ScopePayload): ProxyRuntimeScopeV1;
33
- export declare function extractProxyRuntimeScopeV1(artifact: ConnectArtifact, mode: ProxyRuntimeScopeV1["mode"]): ProxyRuntimeScopeV1;
34
- export declare function resolveRuntimeLimitsFromScope(scope: ProxyRuntimeScopeV1, overrides: Readonly<{
35
- maxJsonFrameBytes?: number;
36
- maxChunkBytes?: number;
37
- maxBodyBytes?: number;
38
- maxWsFrameBytes?: number;
39
- maxWsBufferedAmountBytes?: number;
40
- maxConcurrentHttpStreams?: number;
41
- maxQueuedHttpRequests?: number;
42
- maxQueuedHttpBodyBytes?: number;
43
- timeoutMs?: number;
44
- }> | undefined): Readonly<{
45
- maxJsonFrameBytes?: number;
46
- maxChunkBytes?: number;
47
- maxBodyBytes?: number;
48
- maxWsFrameBytes?: number;
49
- maxWsBufferedAmountBytes?: number;
50
- maxConcurrentHttpStreams?: number;
51
- maxQueuedHttpRequests?: number;
52
- maxQueuedHttpBodyBytes?: number;
53
- timeoutMs?: number;
54
- }> | undefined;
55
- export declare function resolvePresetInputFromScope(scope: ProxyRuntimeScopeV1, presetOverride: ProxyPresetInput | undefined): ProxyPresetInput | undefined;
56
- export declare function resolveRuntimePresetLimits(scope: ProxyRuntimeScopeV1): ProxyPresetLimits | undefined;
57
- export {};
@@ -1,218 +0,0 @@
1
- import { assertProxyPresetManifest, } from "./preset.js";
2
- const RUNTIME_SCOPE_NAME = "proxy.runtime";
3
- const PRESET_ID_RE = /^[a-z][a-z0-9._-]{0,63}$/;
4
- const MAX_RUNTIME_PAYLOAD_BYTES = 8 * 1024;
5
- const MAX_RUNTIME_DEPTH = 8;
6
- const MAX_RUNTIME_FIELDS = 64;
7
- const MAX_RUNTIME_SNAPSHOT_BYTES = 4 * 1024;
8
- function isRecord(value) {
9
- return typeof value === "object" && value != null && !Array.isArray(value);
10
- }
11
- function assertNoUnknownFields(kind, value, allowed) {
12
- const allowedSet = new Set(allowed);
13
- for (const key of Object.keys(value)) {
14
- if (!allowedSet.has(key))
15
- throw new Error(`bad ${kind}.${key}`);
16
- }
17
- }
18
- function assertPositiveInt(name, value) {
19
- if (typeof value !== "number" || !Number.isSafeInteger(value) || value <= 0) {
20
- throw new Error(`bad ${name}`);
21
- }
22
- return value;
23
- }
24
- function utf8Len(value) {
25
- return new TextEncoder().encode(value).length;
26
- }
27
- function maxContainerDepth(value) {
28
- if (Array.isArray(value)) {
29
- let best = 1;
30
- for (const entry of value)
31
- best = Math.max(best, 1 + maxContainerDepth(entry));
32
- return best;
33
- }
34
- if (isRecord(value)) {
35
- let best = 1;
36
- for (const entry of Object.values(value))
37
- best = Math.max(best, 1 + maxContainerDepth(entry));
38
- return best;
39
- }
40
- return 0;
41
- }
42
- function countFields(value) {
43
- if (Array.isArray(value))
44
- return value.reduce((total, entry) => total + countFields(entry), 0);
45
- if (isRecord(value)) {
46
- return Object.entries(value).reduce((total, [, entry]) => total + 1 + countFields(entry), 0);
47
- }
48
- return 0;
49
- }
50
- function assertRuntimePayloadEnvelope(payload) {
51
- if (!isRecord(payload))
52
- throw new Error("bad proxy.runtime.payload");
53
- if (utf8Len(JSON.stringify(payload)) > MAX_RUNTIME_PAYLOAD_BYTES)
54
- throw new Error("bad proxy.runtime.payload");
55
- if (maxContainerDepth(payload) > MAX_RUNTIME_DEPTH)
56
- throw new Error("bad proxy.runtime.payload");
57
- if (countFields(payload) > MAX_RUNTIME_FIELDS)
58
- throw new Error("bad proxy.runtime.payload");
59
- return payload;
60
- }
61
- function assertServiceWorkerConfig(value) {
62
- if (!isRecord(value))
63
- throw new Error("bad proxy.runtime.serviceWorker");
64
- assertNoUnknownFields("proxy.runtime.serviceWorker", value, ["scriptUrl", "scope"]);
65
- const scriptUrl = String(value.scriptUrl ?? "").trim();
66
- const scope = String(value.scope ?? "").trim();
67
- if (scriptUrl === "")
68
- throw new Error("bad proxy.runtime.serviceWorker.scriptUrl");
69
- if (scope === "")
70
- throw new Error("bad proxy.runtime.serviceWorker.scope");
71
- return Object.freeze({ scriptUrl, scope });
72
- }
73
- function assertAllowedOrigins(value) {
74
- if (!Array.isArray(value))
75
- throw new Error("bad proxy.runtime.controllerBridge.allowedOrigins");
76
- const out = [];
77
- const seen = new Set();
78
- for (const entry of value) {
79
- const normalized = String(entry ?? "").trim();
80
- if (normalized === "" || seen.has(normalized))
81
- continue;
82
- seen.add(normalized);
83
- out.push(normalized);
84
- }
85
- if (out.length === 0)
86
- throw new Error("bad proxy.runtime.controllerBridge.allowedOrigins");
87
- return Object.freeze(out);
88
- }
89
- function assertControllerBridgeConfig(value) {
90
- if (!isRecord(value))
91
- throw new Error("bad proxy.runtime.controllerBridge");
92
- assertNoUnknownFields("proxy.runtime.controllerBridge", value, ["allowedOrigins"]);
93
- return Object.freeze({
94
- allowedOrigins: assertAllowedOrigins(value.allowedOrigins),
95
- });
96
- }
97
- function assertLimits(value) {
98
- if (!isRecord(value))
99
- throw new Error("bad proxy.runtime.limits");
100
- assertNoUnknownFields("proxy.runtime.limits", value, [
101
- "timeoutMs",
102
- "maxJsonFrameBytes",
103
- "maxChunkBytes",
104
- "maxBodyBytes",
105
- "maxWsFrameBytes",
106
- ]);
107
- const out = {};
108
- if (value.timeoutMs !== undefined)
109
- out.timeoutMs = assertPositiveInt("proxy.runtime.limits.timeoutMs", value.timeoutMs);
110
- if (value.maxJsonFrameBytes !== undefined) {
111
- out.maxJsonFrameBytes = assertPositiveInt("proxy.runtime.limits.maxJsonFrameBytes", value.maxJsonFrameBytes);
112
- }
113
- if (value.maxChunkBytes !== undefined)
114
- out.maxChunkBytes = assertPositiveInt("proxy.runtime.limits.maxChunkBytes", value.maxChunkBytes);
115
- if (value.maxBodyBytes !== undefined)
116
- out.maxBodyBytes = assertPositiveInt("proxy.runtime.limits.maxBodyBytes", value.maxBodyBytes);
117
- if (value.maxWsFrameBytes !== undefined)
118
- out.maxWsFrameBytes = assertPositiveInt("proxy.runtime.limits.maxWsFrameBytes", value.maxWsFrameBytes);
119
- return Object.freeze(out);
120
- }
121
- function assertPreset(value) {
122
- if (!isRecord(value))
123
- throw new Error("bad proxy.runtime.preset");
124
- assertNoUnknownFields("proxy.runtime.preset", value, ["presetId", "snapshot"]);
125
- const presetId = String(value.presetId ?? "").trim();
126
- if (!PRESET_ID_RE.test(presetId))
127
- throw new Error("bad proxy.runtime.preset.presetId");
128
- if (value.snapshot === undefined) {
129
- return Object.freeze({ presetId });
130
- }
131
- const snapshot = assertProxyPresetManifest(value.snapshot);
132
- if (utf8Len(JSON.stringify(snapshot)) > MAX_RUNTIME_SNAPSHOT_BYTES)
133
- throw new Error("bad proxy.runtime.preset.snapshot");
134
- return Object.freeze({ presetId, snapshot });
135
- }
136
- export function assertProxyRuntimeScopeV1(payload) {
137
- const value = assertRuntimePayloadEnvelope(payload);
138
- assertNoUnknownFields("proxy.runtime", value, [
139
- "mode",
140
- "appBasePath",
141
- "serviceWorker",
142
- "controllerBridge",
143
- "preset",
144
- "limits",
145
- ]);
146
- const mode = value.mode;
147
- if (mode !== "service_worker" && mode !== "controller_bridge") {
148
- throw new Error("bad proxy.runtime.mode");
149
- }
150
- const appBasePath = value.appBasePath === undefined ? undefined : String(value.appBasePath ?? "").trim();
151
- if (value.appBasePath !== undefined && appBasePath === "") {
152
- throw new Error("bad proxy.runtime.appBasePath");
153
- }
154
- const preset = assertPreset(value.preset);
155
- const limits = value.limits === undefined ? undefined : assertLimits(value.limits);
156
- if (mode === "service_worker") {
157
- if (value.controllerBridge !== undefined)
158
- throw new Error("bad proxy.runtime.controllerBridge");
159
- const serviceWorker = assertServiceWorkerConfig(value.serviceWorker);
160
- return Object.freeze({
161
- mode,
162
- ...(appBasePath === undefined ? {} : { appBasePath }),
163
- serviceWorker,
164
- preset,
165
- ...(limits === undefined ? {} : { limits }),
166
- });
167
- }
168
- if (value.serviceWorker !== undefined)
169
- throw new Error("bad proxy.runtime.serviceWorker");
170
- const controllerBridge = assertControllerBridgeConfig(value.controllerBridge);
171
- return Object.freeze({
172
- mode,
173
- ...(appBasePath === undefined ? {} : { appBasePath }),
174
- controllerBridge,
175
- preset,
176
- ...(limits === undefined ? {} : { limits }),
177
- });
178
- }
179
- export function extractProxyRuntimeScopeV1(artifact, mode) {
180
- const scoped = artifact.scoped ?? [];
181
- const entry = scoped.find((item) => item.scope === RUNTIME_SCOPE_NAME);
182
- if (!entry) {
183
- throw new Error("missing proxy.runtime@1 scope");
184
- }
185
- if (entry.scope_version !== 1) {
186
- throw new Error(`unsupported proxy.runtime scope_version: ${entry.scope_version}`);
187
- }
188
- const scope = assertProxyRuntimeScopeV1(entry.payload);
189
- if (scope.mode !== mode) {
190
- throw new Error(`proxy.runtime mode mismatch: expected ${mode}`);
191
- }
192
- return scope;
193
- }
194
- export function resolveRuntimeLimitsFromScope(scope, overrides) {
195
- const merged = {
196
- ...(scope.limits ?? {}),
197
- ...(overrides ?? {}),
198
- };
199
- return Object.keys(merged).length === 0 ? undefined : merged;
200
- }
201
- export function resolvePresetInputFromScope(scope, presetOverride) {
202
- if (presetOverride !== undefined)
203
- return presetOverride;
204
- if (scope.preset.snapshot)
205
- return scope.preset.snapshot;
206
- throw new Error("proxy.runtime preset snapshot is required");
207
- }
208
- export function resolveRuntimePresetLimits(scope) {
209
- if (scope.limits === undefined)
210
- return undefined;
211
- return Object.freeze({
212
- ...(scope.limits.maxJsonFrameBytes === undefined ? {} : { max_json_frame_bytes: scope.limits.maxJsonFrameBytes }),
213
- ...(scope.limits.maxChunkBytes === undefined ? {} : { max_chunk_bytes: scope.limits.maxChunkBytes }),
214
- ...(scope.limits.maxBodyBytes === undefined ? {} : { max_body_bytes: scope.limits.maxBodyBytes }),
215
- ...(scope.limits.maxWsFrameBytes === undefined ? {} : { max_ws_frame_bytes: scope.limits.maxWsFrameBytes }),
216
- ...(scope.limits.timeoutMs === undefined ? {} : { timeout_ms: scope.limits.timeoutMs }),
217
- });
218
- }