@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,273 +0,0 @@
1
- import { createServiceWorkerControllerGuard, } from "./controllerGuard.js";
2
- import { createMessagePortBackedStream } from "./portStream.js";
3
- import { PROXY_WINDOW_FETCH_FORWARD_MSG_TYPE, PROXY_WINDOW_FETCH_MSG_TYPE, PROXY_WINDOW_STREAM_RESET_MSG_TYPE, PROXY_WINDOW_WS_ERROR_MSG_TYPE, PROXY_WINDOW_WS_BIDIRECTIONAL_ACK_CAPABILITY, PROXY_WINDOW_WS_OPEN_ACK_MSG_TYPE, PROXY_WINDOW_WS_OPEN_MSG_TYPE, } from "./windowBridgeProtocol.js";
4
- function resolveTargetWindow(raw) {
5
- const target = raw ?? globalThis.window;
6
- if (target == null)
7
- throw new Error("targetWindow is not available");
8
- return target;
9
- }
10
- function resolveControllerWindow(targetWindow, raw) {
11
- if (raw != null)
12
- return raw;
13
- try {
14
- if (targetWindow.top && targetWindow.top !== targetWindow)
15
- return targetWindow.top;
16
- }
17
- catch {
18
- // ignore
19
- }
20
- try {
21
- if (targetWindow.parent && targetWindow.parent !== targetWindow)
22
- return targetWindow.parent;
23
- }
24
- catch {
25
- // ignore
26
- }
27
- throw new Error("controllerWindow is not available");
28
- }
29
- function postFetchError(port, message) {
30
- try {
31
- port.postMessage({ type: "flowersec-proxy:response_error", status: 502, message });
32
- }
33
- catch {
34
- // Best-effort.
35
- }
36
- try {
37
- port.close();
38
- }
39
- catch {
40
- // Best-effort.
41
- }
42
- }
43
- function normalizeCapabilityNonce(value) {
44
- if (value == null)
45
- return "";
46
- const s = String(value);
47
- if (s === "")
48
- return "";
49
- if (s.trim() !== s || /[\s\u0000-\u001f\u007f]/.test(s)) {
50
- throw new Error("capabilityNonce must not contain whitespace or control characters");
51
- }
52
- return s;
53
- }
54
- export function registerProxyAppWindow(opts) {
55
- const controllerOrigin = String(opts.controllerOrigin ?? "").trim();
56
- if (controllerOrigin === "") {
57
- throw new Error("controllerOrigin is required");
58
- }
59
- const targetWindow = resolveTargetWindow(opts.targetWindow);
60
- const controllerWindow = resolveControllerWindow(targetWindow, opts.controllerWindow);
61
- const capabilityNonce = normalizeCapabilityNonce(opts.capabilityNonce);
62
- const activeWebSocketBridges = new Set();
63
- let disposed = false;
64
- const sw = targetWindow.navigator?.serviceWorker;
65
- const onServiceWorkerMessage = (ev) => {
66
- const data = ev.data;
67
- if (data == null || typeof data !== "object")
68
- return;
69
- if (data.type !== PROXY_WINDOW_FETCH_FORWARD_MSG_TYPE)
70
- return;
71
- const port = ev.ports?.[0];
72
- if (!port)
73
- return;
74
- try {
75
- controllerWindow.postMessage({
76
- type: PROXY_WINDOW_FETCH_MSG_TYPE,
77
- req: data.req,
78
- ...(capabilityNonce === "" ? {} : { capabilityNonce }),
79
- }, controllerOrigin, [port]);
80
- }
81
- catch (error) {
82
- const message = error instanceof Error ? error.message : String(error);
83
- postFetchError(port, message);
84
- }
85
- };
86
- sw?.addEventListener("message", onServiceWorkerMessage);
87
- const runtime = {
88
- limits: {
89
- ...(opts.maxWsFrameBytes === undefined ? {} : { maxWsFrameBytes: opts.maxWsFrameBytes }),
90
- ...(opts.maxWsBufferedAmountBytes === undefined
91
- ? {}
92
- : { maxWsBufferedAmountBytes: opts.maxWsBufferedAmountBytes }),
93
- },
94
- openWebSocketStream: async (path, wsOpts = {}) => {
95
- if (disposed)
96
- throw new Error("proxy app Window bridge is disposed");
97
- const channel = new MessageChannel();
98
- const port = channel.port1;
99
- port.start?.();
100
- return await new Promise((resolve, reject) => {
101
- let settled = false;
102
- let terminal = false;
103
- let stream = null;
104
- const cleanup = () => {
105
- activeWebSocketBridges.delete(bridge);
106
- if (wsOpts.signal != null)
107
- wsOpts.signal.removeEventListener("abort", onAbort);
108
- };
109
- const finishTerminal = () => {
110
- if (terminal)
111
- return false;
112
- terminal = true;
113
- cleanup();
114
- return true;
115
- };
116
- const finishReject = (error) => {
117
- if (settled)
118
- return;
119
- settled = true;
120
- finishTerminal();
121
- try {
122
- port.close();
123
- }
124
- catch {
125
- // Best-effort.
126
- }
127
- reject(error instanceof Error ? error : new Error(String(error)));
128
- };
129
- const disposeBridge = (error) => {
130
- if (!finishTerminal())
131
- return;
132
- if (stream != null) {
133
- try {
134
- void Promise.resolve(stream.reset(error)).catch(() => {
135
- // The bridge is already terminal.
136
- });
137
- }
138
- catch {
139
- // The bridge is already terminal.
140
- }
141
- return;
142
- }
143
- try {
144
- port.postMessage({
145
- type: PROXY_WINDOW_STREAM_RESET_MSG_TYPE,
146
- message: error.message,
147
- });
148
- }
149
- catch {
150
- // Best-effort.
151
- }
152
- if (!settled) {
153
- settled = true;
154
- reject(error);
155
- }
156
- try {
157
- port.close();
158
- }
159
- catch {
160
- // Best-effort.
161
- }
162
- };
163
- const bridge = { dispose: disposeBridge };
164
- const onAbort = () => {
165
- const reason = wsOpts.signal?.reason;
166
- disposeBridge(reason instanceof Error ? reason : new Error(String(reason ?? "aborted")));
167
- };
168
- activeWebSocketBridges.add(bridge);
169
- const finishResolve = (ack) => {
170
- if (settled || terminal)
171
- return;
172
- const capabilities = Array.isArray(ack.capabilities)
173
- ? ack.capabilities.filter((value) => typeof value === "string")
174
- : [];
175
- if (!capabilities.includes(PROXY_WINDOW_WS_BIDIRECTIONAL_ACK_CAPABILITY)) {
176
- try {
177
- port.postMessage({
178
- type: PROXY_WINDOW_STREAM_RESET_MSG_TYPE,
179
- message: "proxy Window bridge capability mismatch",
180
- });
181
- }
182
- catch {
183
- // The capability error remains authoritative.
184
- }
185
- finishReject(new Error("proxy Window bridge does not support bidirectional stream acknowledgements"));
186
- return;
187
- }
188
- if (disposed) {
189
- disposeBridge(new Error("proxy app Window bridge is disposed"));
190
- return;
191
- }
192
- settled = true;
193
- stream = createMessagePortBackedStream(port, {
194
- maxBufferedBytes: opts.maxWsBufferedAmountBytes ?? 4 * (1 << 20),
195
- onTerminal: finishTerminal,
196
- });
197
- resolve({
198
- stream,
199
- protocol: String(ack.protocol ?? ""),
200
- });
201
- };
202
- port.onmessage = (ev) => {
203
- const data = ev.data;
204
- if (data == null || typeof data !== "object")
205
- return;
206
- const type = typeof data.type === "string" ? data.type : "";
207
- if (type === PROXY_WINDOW_WS_OPEN_ACK_MSG_TYPE) {
208
- finishResolve(data);
209
- return;
210
- }
211
- if (type === PROXY_WINDOW_WS_ERROR_MSG_TYPE) {
212
- finishReject(new Error(String(data.message ?? "upstream ws open failed")));
213
- }
214
- };
215
- if (wsOpts.signal != null) {
216
- if (wsOpts.signal.aborted) {
217
- onAbort();
218
- return;
219
- }
220
- wsOpts.signal.addEventListener("abort", onAbort, { once: true });
221
- }
222
- try {
223
- controllerWindow.postMessage({
224
- type: PROXY_WINDOW_WS_OPEN_MSG_TYPE,
225
- path,
226
- capabilities: [PROXY_WINDOW_WS_BIDIRECTIONAL_ACK_CAPABILITY],
227
- ...(wsOpts.protocols === undefined ? {} : { protocols: wsOpts.protocols }),
228
- ...(capabilityNonce === "" ? {} : { capabilityNonce }),
229
- }, controllerOrigin, [channel.port2]);
230
- }
231
- catch (error) {
232
- finishReject(error);
233
- }
234
- });
235
- },
236
- };
237
- return {
238
- runtime,
239
- dispose: () => {
240
- if (disposed)
241
- return;
242
- disposed = true;
243
- sw?.removeEventListener("message", onServiceWorkerMessage);
244
- const error = new Error("proxy app Window bridge is disposed");
245
- for (const bridge of [...activeWebSocketBridges])
246
- bridge.dispose(error);
247
- },
248
- };
249
- }
250
- export async function registerProxyAppWindowWithServiceWorkerControl(opts) {
251
- const targetWindow = resolveTargetWindow(opts.targetWindow);
252
- const sw = targetWindow.navigator?.serviceWorker;
253
- if (sw == null || typeof sw.register !== "function") {
254
- throw new Error("serviceWorker is not available");
255
- }
256
- await sw.register(opts.serviceWorker.scriptUrl, {
257
- ...(opts.serviceWorker.scope === undefined ? {} : { scope: opts.serviceWorker.scope }),
258
- });
259
- const guard = createServiceWorkerControllerGuard({
260
- targetWindow,
261
- expectedScriptPathSuffix: opts.serviceWorker.expectedScriptPathSuffix,
262
- ...(opts.serviceWorker.repair === undefined ? {} : { repair: opts.serviceWorker.repair }),
263
- ...(opts.serviceWorker.monitor === undefined ? {} : { monitor: opts.serviceWorker.monitor }),
264
- ...(opts.serviceWorker.conflicts === undefined ? {} : { conflicts: opts.serviceWorker.conflicts }),
265
- });
266
- try {
267
- await guard.ensure();
268
- }
269
- finally {
270
- guard.dispose();
271
- }
272
- return registerProxyAppWindow(opts);
273
- }
@@ -1,35 +0,0 @@
1
- import type { Client } from "../client.js";
2
- import type { ConnectArtifact } from "../connect/artifact.js";
3
- import type { ConnectBrowserOptions } from "../browser/connect.js";
4
- import { type ProxyIntegrationPlugin, type RegisterProxyIntegrationOptions, type ProxyIntegrationServiceWorkerOptions } from "./integration.js";
5
- import { type RegisterProxyControllerWindowOptions } from "./controllerWindow.js";
6
- import type { ProxyPresetInput } from "./preset.js";
7
- import { type ProxyRuntime } from "./runtime.js";
8
- export type ConnectArtifactProxyBrowserHandle = Readonly<{
9
- client: Client;
10
- runtime: ProxyRuntime;
11
- dispose: () => Promise<void>;
12
- }>;
13
- export type ConnectArtifactProxyBrowserOptions = Readonly<{
14
- connect?: ConnectBrowserOptions;
15
- preset?: ProxyPresetInput;
16
- runtimeGlobalKey?: string;
17
- runtime?: RegisterProxyIntegrationOptions["runtime"];
18
- serviceWorker?: ProxyIntegrationServiceWorkerOptions;
19
- plugins?: readonly ProxyIntegrationPlugin[];
20
- }>;
21
- export type ConnectArtifactProxyControllerBrowserHandle = Readonly<{
22
- client: Client;
23
- runtime: ProxyRuntime;
24
- dispose: () => void;
25
- }>;
26
- export type ConnectArtifactProxyControllerBrowserOptions = Readonly<{
27
- connect?: ConnectBrowserOptions;
28
- runtime?: RegisterProxyIntegrationOptions["runtime"];
29
- allowedOrigins?: RegisterProxyControllerWindowOptions["allowedOrigins"];
30
- targetWindow?: RegisterProxyControllerWindowOptions["targetWindow"];
31
- expectedSource?: RegisterProxyControllerWindowOptions["expectedSource"];
32
- capabilityNonce?: RegisterProxyControllerWindowOptions["capabilityNonce"];
33
- }>;
34
- export declare function connectArtifactProxyBrowser(artifact: ConnectArtifact, opts?: ConnectArtifactProxyBrowserOptions): Promise<ConnectArtifactProxyBrowserHandle>;
35
- export declare function connectArtifactProxyControllerBrowser(artifact: ConnectArtifact, opts?: ConnectArtifactProxyControllerBrowserOptions): Promise<ConnectArtifactProxyControllerBrowserHandle>;
@@ -1,119 +0,0 @@
1
- import { connectBrowser } from "../browser/connect.js";
2
- import { registerProxyIntegration, } from "./integration.js";
3
- import { registerProxyControllerWindow } from "./controllerWindow.js";
4
- import { extractProxyRuntimeScopeV1, resolvePresetInputFromScope, resolveRuntimeLimitsFromScope, resolveRuntimePresetLimits, } from "./runtimeScope.js";
5
- import { createProxyRuntime } from "./runtime.js";
6
- function scopeRuntimeToIntegrationOptions(scope, opts) {
7
- const runtimeLimits = resolveRuntimeLimitsFromScope(scope, opts.runtime);
8
- const presetFromScope = resolvePresetInputFromScope(scope, opts.preset);
9
- const presetFromLimits = presetFromScope ?? resolveRuntimePresetLimits(scope);
10
- const serviceWorker = opts.serviceWorker ?? (scope.mode === "service_worker" ? {
11
- scriptUrl: scope.serviceWorker.scriptUrl,
12
- scope: scope.serviceWorker.scope,
13
- } : undefined);
14
- if (!serviceWorker) {
15
- throw new Error("service worker config is required for proxy runtime mode");
16
- }
17
- return {
18
- ...(presetFromLimits === undefined ? {} : { preset: presetFromLimits }),
19
- ...(opts.runtimeGlobalKey === undefined ? {} : { runtimeGlobalKey: opts.runtimeGlobalKey }),
20
- ...(runtimeLimits === undefined ? {} : { runtime: runtimeLimits }),
21
- serviceWorker,
22
- ...(opts.plugins === undefined ? {} : { plugins: opts.plugins }),
23
- };
24
- }
25
- async function connectProxyBrowserClient(client, opts) {
26
- const integrationInput = {
27
- client,
28
- serviceWorker: opts.serviceWorker,
29
- ...(opts.preset === undefined ? {} : { preset: opts.preset }),
30
- ...(opts.runtimeGlobalKey === undefined ? {} : { runtimeGlobalKey: opts.runtimeGlobalKey }),
31
- ...(opts.runtime === undefined ? {} : { runtime: opts.runtime }),
32
- ...(opts.plugins === undefined ? {} : { plugins: opts.plugins }),
33
- };
34
- let registered = false;
35
- let integration = null;
36
- try {
37
- integration = await registerProxyIntegration(integrationInput);
38
- registered = true;
39
- }
40
- finally {
41
- if (!registered) {
42
- client.close();
43
- }
44
- }
45
- return {
46
- client,
47
- runtime: integration.runtime,
48
- dispose: async () => {
49
- let firstError = null;
50
- try {
51
- await integration.dispose();
52
- }
53
- catch (error) {
54
- firstError = error;
55
- }
56
- try {
57
- client.close();
58
- }
59
- catch (error) {
60
- if (firstError == null)
61
- firstError = error;
62
- }
63
- if (firstError != null)
64
- throw firstError;
65
- },
66
- };
67
- }
68
- function connectProxyControllerClient(client, opts) {
69
- let runtime = null;
70
- let controller = null;
71
- try {
72
- runtime = createProxyRuntime({
73
- client,
74
- ...(opts.runtime ?? {}),
75
- });
76
- controller = registerProxyControllerWindow({
77
- runtime,
78
- allowedOrigins: opts.allowedOrigins,
79
- ...(opts.targetWindow === undefined ? {} : { targetWindow: opts.targetWindow }),
80
- ...(opts.expectedSource === undefined ? {} : { expectedSource: opts.expectedSource }),
81
- ...(opts.capabilityNonce === undefined ? {} : { capabilityNonce: opts.capabilityNonce }),
82
- });
83
- }
84
- catch (error) {
85
- try {
86
- client.close();
87
- }
88
- catch {
89
- // Best effort cleanup.
90
- }
91
- throw error;
92
- }
93
- return {
94
- client,
95
- runtime,
96
- dispose: () => {
97
- controller?.dispose();
98
- client.close();
99
- },
100
- };
101
- }
102
- export async function connectArtifactProxyBrowser(artifact, opts = {}) {
103
- const scope = extractProxyRuntimeScopeV1(artifact, "service_worker");
104
- const client = await connectBrowser(artifact, opts.connect ?? {});
105
- const nextOpts = scopeRuntimeToIntegrationOptions(scope, opts);
106
- return await connectProxyBrowserClient(client, nextOpts);
107
- }
108
- export async function connectArtifactProxyControllerBrowser(artifact, opts = {}) {
109
- const scope = extractProxyRuntimeScopeV1(artifact, "controller_bridge");
110
- const client = await connectBrowser(artifact, opts.connect ?? {});
111
- const runtime = resolveRuntimeLimitsFromScope(scope, opts.runtime);
112
- return connectProxyControllerClient(client, {
113
- ...(runtime === undefined ? {} : { runtime }),
114
- allowedOrigins: opts.allowedOrigins ?? scope.controllerBridge.allowedOrigins,
115
- ...(opts.targetWindow === undefined ? {} : { targetWindow: opts.targetWindow }),
116
- ...(opts.expectedSource === undefined ? {} : { expectedSource: opts.expectedSource }),
117
- ...(opts.capabilityNonce === undefined ? {} : { capabilityNonce: opts.capabilityNonce }),
118
- });
119
- }
@@ -1,7 +0,0 @@
1
- export declare const PROXY_PROTOCOL_VERSION: 1;
2
- export declare const PROXY_KIND_HTTP1: "flowersec-proxy/http1";
3
- export declare const PROXY_KIND_WS: "flowersec-proxy/ws";
4
- export declare const DEFAULT_MAX_CHUNK_BYTES: number;
5
- export declare const DEFAULT_MAX_BODY_BYTES: number;
6
- export declare const DEFAULT_MAX_WS_FRAME_BYTES: number;
7
- export declare const DEFAULT_MAX_CONCURRENT_STREAMS: 64;
@@ -1,8 +0,0 @@
1
- import { SDK_DEFAULTS } from "../defaults.js";
2
- export const PROXY_PROTOCOL_VERSION = 1;
3
- export const PROXY_KIND_HTTP1 = "flowersec-proxy/http1";
4
- export const PROXY_KIND_WS = "flowersec-proxy/ws";
5
- export const DEFAULT_MAX_CHUNK_BYTES = SDK_DEFAULTS.proxy.maxChunkBytes;
6
- export const DEFAULT_MAX_BODY_BYTES = SDK_DEFAULTS.proxy.maxBodyBytes;
7
- export const DEFAULT_MAX_WS_FRAME_BYTES = SDK_DEFAULTS.proxy.maxWsFrameBytes;
8
- export const DEFAULT_MAX_CONCURRENT_STREAMS = SDK_DEFAULTS.proxy.maxConcurrentStreams;
@@ -1,12 +0,0 @@
1
- import type { ProxyRuntime } from "./runtime.js";
2
- export type RegisterProxyControllerWindowOptions = Readonly<{
3
- runtime: ProxyRuntime;
4
- allowedOrigins: readonly string[];
5
- targetWindow?: Window;
6
- expectedSource?: Window | null;
7
- capabilityNonce?: string;
8
- }>;
9
- export type ProxyControllerWindowHandle = Readonly<{
10
- dispose: () => void;
11
- }>;
12
- export declare function registerProxyControllerWindow(opts: RegisterProxyControllerWindowOptions): ProxyControllerWindowHandle;