@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.
- package/README.md +91 -22
- package/THIRD_PARTY_NOTICES.md +141 -0
- package/dist/browser/connectSession.d.ts +13 -0
- package/dist/browser/connectSession.js +40 -0
- package/dist/browser/index.d.ts +3 -10
- package/dist/browser/index.js +2 -5
- package/dist/browser/runtimeCapability.d.ts +13 -0
- package/dist/browser/runtimeCapability.js +27 -0
- package/dist/browser/sessionRuntime.d.ts +2 -0
- package/dist/browser/sessionRuntime.js +21 -0
- package/dist/browser/webTransportClient.d.ts +8 -0
- package/dist/browser/webTransportClient.js +55 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +126 -0
- package/dist/cliSpendMarker.d.ts +1 -0
- package/dist/cliSpendMarker.js +22 -0
- package/dist/connectionController.d.ts +54 -0
- package/dist/connectionController.js +438 -0
- package/dist/connector/adapters/webSocketCandidate.d.ts +7 -0
- package/dist/connector/adapters/webSocketCandidate.js +116 -0
- package/dist/connector/adapters/webTransportCandidate.d.ts +5 -0
- package/dist/connector/adapters/webTransportCandidate.js +73 -0
- package/dist/connector/admissionCommit.d.ts +31 -0
- package/dist/connector/admissionCommit.js +239 -0
- package/dist/connector/sessionAcceptor.d.ts +16 -0
- package/dist/connector/sessionAcceptor.js +114 -0
- package/dist/connector/sessionConfig.d.ts +3 -0
- package/dist/connector/sessionConfig.js +30 -0
- package/dist/connector/sessionConnector.d.ts +45 -0
- package/dist/connector/sessionConnector.js +603 -0
- package/dist/defaults.d.ts +7 -7
- package/dist/defaults.js +7 -7
- package/dist/facade.d.ts +12 -30
- package/dist/facade.js +6 -30
- package/dist/node/connectSession.d.ts +21 -0
- package/dist/node/connectSession.js +62 -0
- package/dist/node/index.d.ts +3 -11
- package/dist/node/index.js +2 -8
- package/dist/node/runtimeCapability.d.ts +7 -0
- package/dist/node/runtimeCapability.js +10 -0
- package/dist/node/sessionRuntime.d.ts +2 -0
- package/dist/node/sessionRuntime.js +13 -0
- package/dist/node/webTransportClient.d.ts +9 -0
- package/dist/node/webTransportClient.js +56 -0
- package/dist/node/webTransportServer.d.ts +22 -0
- package/dist/node/webTransportServer.js +100 -0
- package/dist/node/wsFactory.d.ts +3 -1
- package/dist/node/wsFactory.js +4 -3
- package/dist/proxy/controllerGuard.d.ts +4 -4
- package/dist/proxy/controllerGuard.js +83 -177
- package/dist/proxy/disableUpstreamServiceWorkerRegister.d.ts +3 -1
- package/dist/proxy/disableUpstreamServiceWorkerRegister.js +19 -17
- package/dist/proxy/index.d.ts +16 -15
- package/dist/proxy/index.js +8 -14
- package/dist/proxy/integration.d.ts +23 -71
- package/dist/proxy/integration.js +37 -340
- package/dist/proxy/registerServiceWorker.d.ts +1 -10
- package/dist/proxy/registerServiceWorker.js +43 -105
- package/dist/proxy/runtime.d.ts +3 -63
- package/dist/proxy/runtime.js +349 -462
- package/dist/proxy/scope.d.ts +6 -0
- package/dist/proxy/scope.js +131 -0
- package/dist/proxy/serviceWorker.d.ts +5 -16
- package/dist/proxy/serviceWorker.js +230 -617
- package/dist/proxy/stream.d.ts +9 -0
- package/dist/proxy/stream.js +40 -0
- package/dist/proxy/types.d.ts +78 -30
- package/dist/proxy/windowBridge.d.ts +61 -0
- package/dist/proxy/windowBridge.js +344 -0
- package/dist/proxy/wsPatch.d.ts +4 -14
- package/dist/proxy/wsPatch.js +173 -268
- package/dist/public/artifact.d.ts +11 -0
- package/dist/public/artifact.js +44 -0
- package/dist/public/artifactLease.d.ts +10 -0
- package/dist/public/artifactLease.js +48 -0
- package/dist/public/connectError.d.ts +6 -0
- package/dist/public/connectError.js +9 -0
- package/dist/public/contract.d.ts +83 -0
- package/dist/public/contract.js +17 -0
- package/dist/public/streamMetadata.d.ts +10 -0
- package/dist/public/streamMetadata.js +40 -0
- package/dist/rpc/caller.d.ts +1 -1
- package/dist/rpc/client.d.ts +1 -4
- package/dist/rpc/client.js +0 -21
- package/dist/rpc/rpcProxy.d.ts +1 -1
- package/dist/rpc/server.d.ts +1 -1
- package/dist/rpc/validate.d.ts +1 -1
- package/dist/rpc/wire.d.ts +15 -0
- package/dist/runtime/errors.d.ts +6 -0
- package/dist/runtime/errors.js +10 -0
- package/dist/transport/webSocketAdapter.d.ts +24 -0
- package/dist/transport/webSocketAdapter.js +234 -0
- package/dist/transport/webTransportAdapter.d.ts +27 -0
- package/dist/transport/webTransportAdapter.js +519 -0
- package/dist/utils/errors.d.ts +2 -20
- package/dist/utils/errors.js +73 -20
- package/dist/v2/admissionError.d.ts +4 -0
- package/dist/v2/admissionError.js +8 -0
- package/dist/v2/artifact.d.ts +128 -0
- package/dist/v2/artifact.js +1126 -0
- package/dist/v2/artifactLease.d.ts +1 -0
- package/dist/v2/artifactLease.js +7 -0
- package/dist/v2/capability.d.ts +29 -0
- package/dist/v2/capability.js +190 -0
- package/dist/v2/carrier.d.ts +79 -0
- package/dist/v2/carrier.js +405 -0
- package/dist/v2/contract.d.ts +37 -0
- package/dist/v2/contract.js +1 -0
- package/dist/v2/handshake.d.ts +80 -0
- package/dist/v2/handshake.js +470 -0
- package/dist/v2/opaqueArtifact.d.ts +1 -0
- package/dist/v2/opaqueArtifact.js +2 -0
- package/dist/v2/protocol.d.ts +99 -0
- package/dist/v2/protocol.js +739 -0
- package/dist/v2/publicSession.d.ts +1 -0
- package/dist/v2/publicSession.js +179 -0
- package/dist/v2/retryDisposition.d.ts +16 -0
- package/dist/v2/retryDisposition.js +30 -0
- package/dist/v2/session.d.ts +277 -0
- package/dist/v2/session.js +1879 -0
- package/dist/v2/streamLifetimeLedger.d.ts +31 -0
- package/dist/v2/streamLifetimeLedger.js +131 -0
- package/dist/v2/streamMetadata.d.ts +1 -0
- package/dist/v2/streamMetadata.js +7 -0
- package/dist/v2/unreliableMessage.d.ts +43 -0
- package/dist/v2/unreliableMessage.js +252 -0
- package/dist/vendor/tr46.d.ts +10 -0
- package/dist/vendor/tr46.js +501 -0
- package/dist/ws-client/binaryTransport.d.ts +0 -3
- package/dist/ws-client/binaryTransport.js +15 -39
- package/dist/yamux/errors.d.ts +0 -4
- package/dist/yamux/errors.js +0 -9
- package/dist/yamux/session.d.ts +0 -5
- package/dist/yamux/session.js +4 -70
- package/dist/yamux/stream.d.ts +1 -0
- package/dist/yamux/stream.js +4 -0
- package/package.json +29 -83
- package/sbom/cyclonedx.json +2764 -0
- package/sbom/spdx.json +1947 -0
- package/YAMUX_ALIGNMENT.md +0 -127
- package/dist/_examples/flowersec/demo/v1.facade.gen.d.ts +0 -12
- package/dist/_examples/flowersec/demo/v1.facade.gen.js +0 -15
- package/dist/_examples/flowersec/demo/v1.gen.d.ts +0 -16
- package/dist/_examples/flowersec/demo/v1.gen.js +0 -86
- package/dist/_examples/flowersec/demo/v1.rpc.gen.d.ts +0 -11
- package/dist/_examples/flowersec/demo/v1.rpc.gen.js +0 -22
- package/dist/browser/connect.d.ts +0 -12
- package/dist/browser/connect.js +0 -31
- package/dist/browser/controlplane.d.ts +0 -15
- package/dist/browser/controlplane.js +0 -64
- package/dist/browser/reconnectConfig.d.ts +0 -15
- package/dist/browser/reconnectConfig.js +0 -20
- package/dist/client-connect/common.d.ts +0 -26
- package/dist/client-connect/common.js +0 -167
- package/dist/client-connect/connectCore.d.ts +0 -61
- package/dist/client-connect/connectCore.js +0 -572
- package/dist/client-connect/contract.d.ts +0 -8
- package/dist/client-connect/contract.js +0 -51
- package/dist/client-connect/termination.d.ts +0 -6
- package/dist/client-connect/termination.js +0 -7
- package/dist/client-connect/transportSecurity.d.ts +0 -27
- package/dist/client-connect/transportSecurity.js +0 -199
- package/dist/client-connect/tunnelAttachCloseReason.d.ts +0 -3
- package/dist/client-connect/tunnelAttachCloseReason.js +0 -23
- package/dist/client.d.ts +0 -23
- package/dist/connect/artifact.d.ts +0 -37
- package/dist/connect/artifact.js +0 -217
- package/dist/connect/internalNormalize.d.ts +0 -22
- package/dist/connect/internalNormalize.js +0 -173
- package/dist/controlplane/channelInit.d.ts +0 -27
- package/dist/controlplane/channelInit.js +0 -116
- package/dist/controlplane/http.d.ts +0 -16
- package/dist/controlplane/http.js +0 -59
- package/dist/controlplane/index.d.ts +0 -6
- package/dist/controlplane/index.js +0 -5
- package/dist/controlplane/issuer.d.ts +0 -18
- package/dist/controlplane/issuer.js +0 -113
- package/dist/controlplane/request.d.ts +0 -51
- package/dist/controlplane/request.js +0 -273
- package/dist/controlplane/token.d.ts +0 -33
- package/dist/controlplane/token.js +0 -119
- package/dist/direct-client/connect.d.ts +0 -9
- package/dist/direct-client/connect.js +0 -90
- package/dist/direct-client/index.d.ts +0 -1
- package/dist/direct-client/index.js +0 -1
- package/dist/e2ee/constants.d.ts +0 -9
- package/dist/e2ee/constants.js +0 -18
- package/dist/e2ee/errors.d.ts +0 -5
- package/dist/e2ee/errors.js +0 -8
- package/dist/e2ee/framing.d.ts +0 -12
- package/dist/e2ee/framing.js +0 -57
- package/dist/e2ee/handshake.d.ts +0 -88
- package/dist/e2ee/handshake.js +0 -353
- package/dist/e2ee/index.d.ts +0 -7
- package/dist/e2ee/index.js +0 -7
- package/dist/e2ee/kdf.d.ts +0 -15
- package/dist/e2ee/kdf.js +0 -39
- package/dist/e2ee/record.d.ts +0 -11
- package/dist/e2ee/record.js +0 -76
- package/dist/e2ee/secureChannel.d.ts +0 -92
- package/dist/e2ee/secureChannel.js +0 -328
- package/dist/e2ee/transcript.d.ts +0 -23
- package/dist/e2ee/transcript.js +0 -31
- package/dist/endpoint/index.d.ts +0 -84
- package/dist/endpoint/index.js +0 -557
- package/dist/endpoint/node.d.ts +0 -9
- package/dist/endpoint/node.js +0 -51
- package/dist/gen/flowersec/controlplane/v1.gen.d.ts +0 -36
- package/dist/gen/flowersec/controlplane/v1.gen.js +0 -135
- package/dist/gen/flowersec/direct/v1.gen.d.ts +0 -21
- package/dist/gen/flowersec/direct/v1.gen.js +0 -101
- package/dist/gen/flowersec/e2ee/v1.gen.d.ts +0 -68
- package/dist/gen/flowersec/e2ee/v1.gen.js +0 -194
- package/dist/gen/flowersec/rpc/v1.gen.d.ts +0 -30
- package/dist/gen/flowersec/rpc/v1.gen.js +0 -107
- package/dist/gen/flowersec/tunnel/v1.gen.d.ts +0 -23
- package/dist/gen/flowersec/tunnel/v1.gen.js +0 -104
- package/dist/index.d.ts +0 -22
- package/dist/index.js +0 -22
- package/dist/node/connect.d.ts +0 -12
- package/dist/node/connect.js +0 -29
- package/dist/node/reconnectConfig.d.ts +0 -16
- package/dist/node/reconnectConfig.js +0 -20
- package/dist/observability/index.d.ts +0 -1
- package/dist/observability/index.js +0 -1
- package/dist/observability/observer.d.ts +0 -52
- package/dist/observability/observer.js +0 -314
- package/dist/proxy/appWindow.d.ts +0 -37
- package/dist/proxy/appWindow.js +0 -273
- package/dist/proxy/bootstrap.d.ts +0 -35
- package/dist/proxy/bootstrap.js +0 -119
- package/dist/proxy/constants.d.ts +0 -7
- package/dist/proxy/constants.js +0 -8
- package/dist/proxy/controllerWindow.d.ts +0 -12
- package/dist/proxy/controllerWindow.js +0 -384
- package/dist/proxy/cookieJar.d.ts +0 -7
- package/dist/proxy/cookieJar.js +0 -136
- package/dist/proxy/headerPolicy.d.ts +0 -14
- package/dist/proxy/headerPolicy.js +0 -134
- package/dist/proxy/portStream.d.ts +0 -5
- package/dist/proxy/portStream.js +0 -256
- package/dist/proxy/preset.d.ts +0 -29
- package/dist/proxy/preset.js +0 -111
- package/dist/proxy/runtimeScope.d.ts +0 -57
- package/dist/proxy/runtimeScope.js +0 -218
- package/dist/proxy/server.d.ts +0 -28
- package/dist/proxy/server.js +0 -833
- package/dist/proxy/windowBridgeProtocol.d.ts +0 -65
- package/dist/proxy/windowBridgeProtocol.js +0 -11
- package/dist/reconnect/artifactControlplane.d.ts +0 -16
- package/dist/reconnect/artifactControlplane.js +0 -35
- package/dist/reconnect/index.d.ts +0 -36
- package/dist/reconnect/index.js +0 -388
- package/dist/rpc-proxy/index.d.ts +0 -1
- package/dist/rpc-proxy/index.js +0 -1
- package/dist/rpc-proxy/rpcProxy.d.ts +0 -1
- package/dist/rpc-proxy/rpcProxy.js +0 -1
- package/dist/streamhello/index.d.ts +0 -1
- package/dist/streamhello/index.js +0 -1
- package/dist/streamhello/streamHello.d.ts +0 -3
- package/dist/streamhello/streamHello.js +0 -13
- package/dist/streamio/index.d.ts +0 -32
- package/dist/streamio/index.js +0 -87
- package/dist/tunnel-client/connect.d.ts +0 -9
- package/dist/tunnel-client/connect.js +0 -157
- package/dist/tunnel-client/index.d.ts +0 -1
- package/dist/tunnel-client/index.js +0 -1
- package/dist/ws/index.d.ts +0 -1
- package/dist/ws/index.js +0 -1
- /package/dist/{client.js → rpc/wire.js} +0 -0
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
import { CarrierError, } from "../v2/carrier.js";
|
|
2
|
+
export function adaptWebTransportCarrierSessionV2(native, options) {
|
|
3
|
+
requireWebTransportSessionSurfaceV2(native);
|
|
4
|
+
return new WebTransportCarrierSessionAdapter(native, options);
|
|
5
|
+
}
|
|
6
|
+
export function hasWebTransportConstructorSurfaceV2(value) {
|
|
7
|
+
if (typeof value !== "function")
|
|
8
|
+
return false;
|
|
9
|
+
const prototype = value.prototype;
|
|
10
|
+
return typeof prototype === "object" && prototype !== null &&
|
|
11
|
+
typeof prototype.createBidirectionalStream === "function" &&
|
|
12
|
+
typeof prototype.close === "function" &&
|
|
13
|
+
"incomingBidirectionalStreams" in prototype &&
|
|
14
|
+
"datagrams" in prototype &&
|
|
15
|
+
"ready" in prototype &&
|
|
16
|
+
"closed" in prototype;
|
|
17
|
+
}
|
|
18
|
+
function requireWebTransportSessionSurfaceV2(value) {
|
|
19
|
+
const missing = [];
|
|
20
|
+
if (typeof value.createBidirectionalStream !== "function")
|
|
21
|
+
missing.push("outgoing bidirectional streams");
|
|
22
|
+
if (typeof value.incomingBidirectionalStreams?.getReader !== "function")
|
|
23
|
+
missing.push("incoming bidirectional streams");
|
|
24
|
+
if (typeof value.datagrams?.readable?.getReader !== "function")
|
|
25
|
+
missing.push("incoming DATAGRAMs");
|
|
26
|
+
if (typeof value.datagrams?.writable?.getWriter !== "function")
|
|
27
|
+
missing.push("outgoing DATAGRAMs");
|
|
28
|
+
if (typeof value.close !== "function")
|
|
29
|
+
missing.push("close");
|
|
30
|
+
if (typeof value.closed?.then !== "function")
|
|
31
|
+
missing.push("termination");
|
|
32
|
+
if (missing.length !== 0) {
|
|
33
|
+
throw new TypeError(`WebTransport runtime lacks required ${missing.join(", ")}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
class WebTransportCarrierSessionAdapter {
|
|
37
|
+
native;
|
|
38
|
+
kind = "webtransport";
|
|
39
|
+
path;
|
|
40
|
+
inboundBidirectionalStreamCapacity;
|
|
41
|
+
unreliableDatagrams;
|
|
42
|
+
incoming;
|
|
43
|
+
incomingQueue = new IncomingWebTransportStreamQueue();
|
|
44
|
+
streams = new Set();
|
|
45
|
+
datagramsAdapter;
|
|
46
|
+
closed = false;
|
|
47
|
+
terminalError;
|
|
48
|
+
closePromise;
|
|
49
|
+
activeIncomingStreams = 0;
|
|
50
|
+
constructor(native, options) {
|
|
51
|
+
this.native = native;
|
|
52
|
+
if (!Number.isInteger(options.inboundBidirectionalStreamCapacity) || options.inboundBidirectionalStreamCapacity < 3) {
|
|
53
|
+
throw new RangeError("WebTransport carrier stream capacity must be at least 3");
|
|
54
|
+
}
|
|
55
|
+
this.path = options.path;
|
|
56
|
+
this.inboundBidirectionalStreamCapacity = options.inboundBidirectionalStreamCapacity;
|
|
57
|
+
this.incoming = native.incomingBidirectionalStreams.getReader();
|
|
58
|
+
this.datagramsAdapter = new WebTransportDatagramAdapter(native.datagrams, options.datagramMaxSize);
|
|
59
|
+
this.unreliableDatagrams = this.datagramsAdapter;
|
|
60
|
+
void this.pumpIncoming();
|
|
61
|
+
void native.closed.then(() => { this.terminate(new CarrierError("closed", "WebTransport carrier is closed")); }, (error) => {
|
|
62
|
+
this.terminate(carrierFailure("WebTransport closed with an error", error));
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async openStream(options = {}) {
|
|
66
|
+
this.assertOpen();
|
|
67
|
+
if (options.signal?.aborted === true)
|
|
68
|
+
throw abortedCarrierError(options.signal.reason);
|
|
69
|
+
const pending = this.native.createBidirectionalStream();
|
|
70
|
+
let stream;
|
|
71
|
+
try {
|
|
72
|
+
stream = await carrierCall(raceAbort(pending, options.signal), "WebTransport failed to open a stream");
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (isAborted(options.signal)) {
|
|
76
|
+
void pending.then((late) => abortNativeStream(late, abortedCarrierError()), () => undefined);
|
|
77
|
+
}
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
this.assertOpen();
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
abortNativeStream(stream, asError(error));
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
return this.track(stream);
|
|
88
|
+
}
|
|
89
|
+
async acceptStream(options = {}) {
|
|
90
|
+
this.assertOpen();
|
|
91
|
+
return await this.incomingQueue.shift(options.signal);
|
|
92
|
+
}
|
|
93
|
+
async waitTermination() {
|
|
94
|
+
try {
|
|
95
|
+
await this.native.closed;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw carrierFailure("WebTransport terminated with an error", error);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
close() {
|
|
102
|
+
this.closePromise ??= this.closeOnce({ closeCode: 0, reason: "" });
|
|
103
|
+
return this.closePromise;
|
|
104
|
+
}
|
|
105
|
+
abort(error = { code: 6, reason: "carrier aborted" }) {
|
|
106
|
+
if (this.closed)
|
|
107
|
+
return;
|
|
108
|
+
this.terminate(new CarrierError("aborted", "WebTransport carrier aborted"));
|
|
109
|
+
try {
|
|
110
|
+
this.native.close({ closeCode: error.code, reason: error.reason });
|
|
111
|
+
}
|
|
112
|
+
catch (cause) {
|
|
113
|
+
this.terminalError = carrierFailure("WebTransport abort failed", cause);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async closeOnce(info) {
|
|
117
|
+
if (this.closed)
|
|
118
|
+
return;
|
|
119
|
+
this.terminate(new CarrierError("closed", "WebTransport carrier is closed"));
|
|
120
|
+
try {
|
|
121
|
+
this.native.close(info);
|
|
122
|
+
await this.native.closed;
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
throw carrierFailure("WebTransport close failed", error);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
assertOpen() {
|
|
129
|
+
if (this.terminalError !== undefined)
|
|
130
|
+
throw this.terminalError;
|
|
131
|
+
if (this.closed)
|
|
132
|
+
throw new CarrierError("closed", "WebTransport carrier is closed");
|
|
133
|
+
}
|
|
134
|
+
track(native, incoming = false) {
|
|
135
|
+
if (incoming)
|
|
136
|
+
this.activeIncomingStreams += 1;
|
|
137
|
+
let stream;
|
|
138
|
+
stream = new WebTransportCarrierStreamAdapter(native, () => {
|
|
139
|
+
this.streams.delete(stream);
|
|
140
|
+
if (incoming)
|
|
141
|
+
this.activeIncomingStreams = Math.max(0, this.activeIncomingStreams - 1);
|
|
142
|
+
});
|
|
143
|
+
this.streams.add(stream);
|
|
144
|
+
return stream;
|
|
145
|
+
}
|
|
146
|
+
async pumpIncoming() {
|
|
147
|
+
try {
|
|
148
|
+
while (!this.closed) {
|
|
149
|
+
const result = await this.incoming.read();
|
|
150
|
+
if (result.done || result.value === undefined) {
|
|
151
|
+
this.terminate(new CarrierError("closed", "WebTransport incoming streams closed"));
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (this.activeIncomingStreams >= this.inboundBidirectionalStreamCapacity) {
|
|
155
|
+
abortNativeStream(result.value, new CarrierError("reset", "WebTransport inbound stream capacity exceeded"));
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
this.incomingQueue.push(this.track(result.value, true));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
if (!this.closed)
|
|
163
|
+
this.terminate(carrierFailure("WebTransport stream accept failed", error));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
terminate(error) {
|
|
167
|
+
if (this.closed)
|
|
168
|
+
return;
|
|
169
|
+
this.closed = true;
|
|
170
|
+
if (error.code !== "closed")
|
|
171
|
+
this.terminalError = error;
|
|
172
|
+
this.incomingQueue.fail(error);
|
|
173
|
+
for (const stream of [...this.streams])
|
|
174
|
+
stream.abort(error);
|
|
175
|
+
this.streams.clear();
|
|
176
|
+
this.datagramsAdapter.abort(error);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
class WebTransportCarrierStreamAdapter {
|
|
180
|
+
onRelease;
|
|
181
|
+
reader;
|
|
182
|
+
writer;
|
|
183
|
+
readClosed = false;
|
|
184
|
+
readStopError;
|
|
185
|
+
writeClosed = false;
|
|
186
|
+
terminalError;
|
|
187
|
+
closeWritePromise;
|
|
188
|
+
stopSendingPromise;
|
|
189
|
+
resetPromise;
|
|
190
|
+
released = false;
|
|
191
|
+
constructor(stream, onRelease) {
|
|
192
|
+
this.onRelease = onRelease;
|
|
193
|
+
this.reader = stream.readable.getReader();
|
|
194
|
+
this.writer = stream.writable.getWriter();
|
|
195
|
+
}
|
|
196
|
+
async read(options = {}) {
|
|
197
|
+
this.assertReadable();
|
|
198
|
+
if (this.readClosed)
|
|
199
|
+
return null;
|
|
200
|
+
const result = await carrierCall(raceAbort(this.reader.read(), options.signal), "WebTransport stream read failed", "reset");
|
|
201
|
+
if (result.done || result.value === undefined) {
|
|
202
|
+
this.readClosed = true;
|
|
203
|
+
this.releaseIfComplete();
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
return result.value.slice();
|
|
207
|
+
}
|
|
208
|
+
async write(data) {
|
|
209
|
+
this.assertNotTerminal();
|
|
210
|
+
if (this.writeClosed)
|
|
211
|
+
throw new CarrierError("write_closed", "WebTransport stream write side is closed");
|
|
212
|
+
await carrierCall(this.writer.write(data.slice()), "WebTransport stream write failed", "reset");
|
|
213
|
+
return data.byteLength;
|
|
214
|
+
}
|
|
215
|
+
closeWrite() {
|
|
216
|
+
if (this.closeWritePromise !== undefined)
|
|
217
|
+
return this.closeWritePromise;
|
|
218
|
+
this.assertNotTerminal();
|
|
219
|
+
this.writeClosed = true;
|
|
220
|
+
this.closeWritePromise = carrierCall(this.writer.close(), "WebTransport stream FIN failed", "reset")
|
|
221
|
+
.then(() => { this.releaseIfComplete(); });
|
|
222
|
+
return this.closeWritePromise;
|
|
223
|
+
}
|
|
224
|
+
stopSending() {
|
|
225
|
+
if (this.stopSendingPromise !== undefined)
|
|
226
|
+
return this.stopSendingPromise;
|
|
227
|
+
this.assertNotTerminal();
|
|
228
|
+
const stopped = new CarrierError("stop_sending", "WebTransport stream receive side stopped");
|
|
229
|
+
this.readClosed = true;
|
|
230
|
+
this.readStopError = stopped;
|
|
231
|
+
this.stopSendingPromise ??= carrierCall(this.reader.cancel(stopped), "WebTransport STOP_SENDING failed", "stop_sending").then(() => { this.releaseIfComplete(); });
|
|
232
|
+
return this.stopSendingPromise;
|
|
233
|
+
}
|
|
234
|
+
reset() {
|
|
235
|
+
this.resetPromise ??= this.resetOnce();
|
|
236
|
+
return this.resetPromise;
|
|
237
|
+
}
|
|
238
|
+
abort(error = new CarrierError("aborted", "WebTransport stream aborted")) {
|
|
239
|
+
if (this.terminalError !== undefined)
|
|
240
|
+
return;
|
|
241
|
+
this.terminalError = error instanceof CarrierError
|
|
242
|
+
? error
|
|
243
|
+
: new CarrierError("aborted", "WebTransport stream aborted", error);
|
|
244
|
+
this.readClosed = true;
|
|
245
|
+
this.writeClosed = true;
|
|
246
|
+
void this.writer.abort(this.terminalError).catch(() => undefined);
|
|
247
|
+
void this.reader.cancel(this.terminalError).catch(() => undefined);
|
|
248
|
+
this.release();
|
|
249
|
+
}
|
|
250
|
+
async resetOnce() {
|
|
251
|
+
if (this.terminalError !== undefined)
|
|
252
|
+
return;
|
|
253
|
+
this.writeClosed = true;
|
|
254
|
+
this.readClosed = true;
|
|
255
|
+
const error = new CarrierError("reset", "WebTransport stream reset");
|
|
256
|
+
this.terminalError = error;
|
|
257
|
+
try {
|
|
258
|
+
await Promise.allSettled([this.writer.abort(error), this.reader.cancel(error)]);
|
|
259
|
+
}
|
|
260
|
+
finally {
|
|
261
|
+
this.release();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
assertReadable() {
|
|
265
|
+
this.assertNotTerminal();
|
|
266
|
+
if (this.readStopError !== undefined)
|
|
267
|
+
throw this.readStopError;
|
|
268
|
+
}
|
|
269
|
+
assertNotTerminal() {
|
|
270
|
+
if (this.terminalError !== undefined)
|
|
271
|
+
throw this.terminalError;
|
|
272
|
+
}
|
|
273
|
+
releaseIfComplete() {
|
|
274
|
+
if (this.readClosed && this.writeClosed)
|
|
275
|
+
this.release();
|
|
276
|
+
}
|
|
277
|
+
release() {
|
|
278
|
+
if (this.released)
|
|
279
|
+
return;
|
|
280
|
+
this.released = true;
|
|
281
|
+
this.onRelease();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
class WebTransportDatagramAdapter {
|
|
285
|
+
maxDatagramSize;
|
|
286
|
+
readable;
|
|
287
|
+
writable;
|
|
288
|
+
incoming = new IncomingDatagramQueue();
|
|
289
|
+
terminalError;
|
|
290
|
+
constructor(native, configuredMaxSize) {
|
|
291
|
+
const maxDatagramSize = configuredMaxSize ?? native.maxDatagramSize;
|
|
292
|
+
if (!Number.isInteger(maxDatagramSize) || maxDatagramSize < 1) {
|
|
293
|
+
throw new TypeError("WebTransport runtime did not provide a valid DATAGRAM size");
|
|
294
|
+
}
|
|
295
|
+
this.maxDatagramSize = maxDatagramSize;
|
|
296
|
+
this.readable = native.readable.getReader();
|
|
297
|
+
this.writable = native.writable.getWriter();
|
|
298
|
+
void this.pumpIncoming();
|
|
299
|
+
}
|
|
300
|
+
async send(data, options = {}) {
|
|
301
|
+
this.assertOpen();
|
|
302
|
+
if (options.signal?.aborted === true)
|
|
303
|
+
throw abortedCarrierError(options.signal.reason);
|
|
304
|
+
if (options.expiresAt !== undefined && options.expiresAt <= Date.now())
|
|
305
|
+
return "dropped_expired";
|
|
306
|
+
if (data.byteLength < 1 || data.byteLength > this.maxDatagramSize)
|
|
307
|
+
return "dropped_carrier";
|
|
308
|
+
try {
|
|
309
|
+
await raceAbort(this.writable.write(data.slice()), options.signal);
|
|
310
|
+
return "accepted";
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
if (isAborted(options.signal))
|
|
314
|
+
throw abortedCarrierError(error);
|
|
315
|
+
if (this.terminalError !== undefined)
|
|
316
|
+
throw this.terminalError;
|
|
317
|
+
return "dropped_carrier";
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
async receive(options = {}) {
|
|
321
|
+
this.assertOpen();
|
|
322
|
+
return await this.incoming.shift(options.signal);
|
|
323
|
+
}
|
|
324
|
+
abort(error) {
|
|
325
|
+
if (this.terminalError !== undefined)
|
|
326
|
+
return;
|
|
327
|
+
this.terminalError = error;
|
|
328
|
+
this.incoming.fail(error);
|
|
329
|
+
void this.writable.abort(error).catch(() => undefined);
|
|
330
|
+
}
|
|
331
|
+
assertOpen() {
|
|
332
|
+
if (this.terminalError !== undefined)
|
|
333
|
+
throw this.terminalError;
|
|
334
|
+
}
|
|
335
|
+
async pumpIncoming() {
|
|
336
|
+
try {
|
|
337
|
+
while (this.terminalError === undefined) {
|
|
338
|
+
const result = await this.readable.read();
|
|
339
|
+
if (result.done || result.value === undefined) {
|
|
340
|
+
this.abort(new CarrierError("closed", "WebTransport datagrams closed"));
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
if (result.value.byteLength < 1 || result.value.byteLength > this.maxDatagramSize)
|
|
344
|
+
continue;
|
|
345
|
+
this.incoming.push(result.value.slice());
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
if (this.terminalError === undefined) {
|
|
350
|
+
this.abort(carrierFailure("WebTransport datagram receive failed", error));
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
class IncomingWebTransportStreamQueue {
|
|
356
|
+
values = [];
|
|
357
|
+
waiters = new Set();
|
|
358
|
+
terminalError;
|
|
359
|
+
push(stream) {
|
|
360
|
+
if (this.terminalError !== undefined) {
|
|
361
|
+
stream.abort(this.terminalError);
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
const waiter = this.waiters.values().next().value;
|
|
365
|
+
if (waiter === undefined)
|
|
366
|
+
this.values.push(stream);
|
|
367
|
+
else
|
|
368
|
+
waiter.deliver(stream);
|
|
369
|
+
}
|
|
370
|
+
shift(signal) {
|
|
371
|
+
if (signal?.aborted === true)
|
|
372
|
+
return Promise.reject(abortedCarrierError(signal.reason));
|
|
373
|
+
if (this.terminalError !== undefined)
|
|
374
|
+
return Promise.reject(this.terminalError);
|
|
375
|
+
const value = this.values.shift();
|
|
376
|
+
if (value !== undefined)
|
|
377
|
+
return Promise.resolve(value);
|
|
378
|
+
return new Promise((resolve, reject) => {
|
|
379
|
+
let settled = false;
|
|
380
|
+
const cleanup = () => {
|
|
381
|
+
this.waiters.delete(waiter);
|
|
382
|
+
signal?.removeEventListener("abort", abort);
|
|
383
|
+
};
|
|
384
|
+
const waiter = {
|
|
385
|
+
deliver: (stream) => {
|
|
386
|
+
if (settled)
|
|
387
|
+
return;
|
|
388
|
+
settled = true;
|
|
389
|
+
cleanup();
|
|
390
|
+
resolve(stream);
|
|
391
|
+
},
|
|
392
|
+
fail: (error) => {
|
|
393
|
+
if (settled)
|
|
394
|
+
return;
|
|
395
|
+
settled = true;
|
|
396
|
+
cleanup();
|
|
397
|
+
reject(error);
|
|
398
|
+
},
|
|
399
|
+
};
|
|
400
|
+
const abort = () => waiter.fail(abortedCarrierError(signal?.reason));
|
|
401
|
+
this.waiters.add(waiter);
|
|
402
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
403
|
+
if (signal?.aborted === true)
|
|
404
|
+
abort();
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
fail(error) {
|
|
408
|
+
if (this.terminalError !== undefined)
|
|
409
|
+
return;
|
|
410
|
+
this.terminalError = error;
|
|
411
|
+
for (const stream of this.values)
|
|
412
|
+
stream.abort(error);
|
|
413
|
+
this.values.length = 0;
|
|
414
|
+
for (const waiter of [...this.waiters])
|
|
415
|
+
waiter.fail(error);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
class IncomingDatagramQueue {
|
|
419
|
+
values = [];
|
|
420
|
+
waiters = new Set();
|
|
421
|
+
terminalError;
|
|
422
|
+
push(value) {
|
|
423
|
+
if (this.terminalError !== undefined)
|
|
424
|
+
return;
|
|
425
|
+
const waiter = this.waiters.values().next().value;
|
|
426
|
+
if (waiter === undefined)
|
|
427
|
+
this.values.push(value);
|
|
428
|
+
else
|
|
429
|
+
waiter.deliver(value);
|
|
430
|
+
}
|
|
431
|
+
shift(signal) {
|
|
432
|
+
if (signal?.aborted === true)
|
|
433
|
+
return Promise.reject(abortedCarrierError(signal.reason));
|
|
434
|
+
if (this.terminalError !== undefined)
|
|
435
|
+
return Promise.reject(this.terminalError);
|
|
436
|
+
const value = this.values.shift();
|
|
437
|
+
if (value !== undefined)
|
|
438
|
+
return Promise.resolve(value);
|
|
439
|
+
return new Promise((resolve, reject) => {
|
|
440
|
+
let settled = false;
|
|
441
|
+
const cleanup = () => {
|
|
442
|
+
this.waiters.delete(waiter);
|
|
443
|
+
signal?.removeEventListener("abort", abort);
|
|
444
|
+
};
|
|
445
|
+
const waiter = {
|
|
446
|
+
deliver: (next) => {
|
|
447
|
+
if (settled)
|
|
448
|
+
return;
|
|
449
|
+
settled = true;
|
|
450
|
+
cleanup();
|
|
451
|
+
resolve(next);
|
|
452
|
+
},
|
|
453
|
+
fail: (error) => {
|
|
454
|
+
if (settled)
|
|
455
|
+
return;
|
|
456
|
+
settled = true;
|
|
457
|
+
cleanup();
|
|
458
|
+
reject(error);
|
|
459
|
+
},
|
|
460
|
+
};
|
|
461
|
+
const abort = () => waiter.fail(abortedCarrierError(signal?.reason));
|
|
462
|
+
this.waiters.add(waiter);
|
|
463
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
464
|
+
if (signal?.aborted === true)
|
|
465
|
+
abort();
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
fail(error) {
|
|
469
|
+
if (this.terminalError !== undefined)
|
|
470
|
+
return;
|
|
471
|
+
this.terminalError = error;
|
|
472
|
+
this.values.length = 0;
|
|
473
|
+
for (const waiter of [...this.waiters])
|
|
474
|
+
waiter.fail(error);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
function abortNativeStream(stream, error) {
|
|
478
|
+
const reader = stream.readable.getReader();
|
|
479
|
+
const writer = stream.writable.getWriter();
|
|
480
|
+
void reader.cancel(error).catch(() => undefined);
|
|
481
|
+
void writer.abort(error).catch(() => undefined);
|
|
482
|
+
}
|
|
483
|
+
function abortedCarrierError(cause) {
|
|
484
|
+
return new CarrierError("aborted", "WebTransport operation aborted", cause);
|
|
485
|
+
}
|
|
486
|
+
function isAborted(signal) {
|
|
487
|
+
return signal?.aborted === true;
|
|
488
|
+
}
|
|
489
|
+
async function raceAbort(promise, signal) {
|
|
490
|
+
if (signal === undefined)
|
|
491
|
+
return await promise;
|
|
492
|
+
if (signal.aborted)
|
|
493
|
+
throw signal.reason;
|
|
494
|
+
return await new Promise((resolve, reject) => {
|
|
495
|
+
const abort = () => reject(signal.reason);
|
|
496
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
497
|
+
void promise.then(resolve, reject).finally(() => signal.removeEventListener("abort", abort));
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
async function carrierCall(promise, message, code = "closed") {
|
|
501
|
+
try {
|
|
502
|
+
return await promise;
|
|
503
|
+
}
|
|
504
|
+
catch (error) {
|
|
505
|
+
if (error instanceof CarrierError)
|
|
506
|
+
throw error;
|
|
507
|
+
if (error instanceof DOMException && error.name === "AbortError" ||
|
|
508
|
+
error instanceof Error && error.name === "AbortError") {
|
|
509
|
+
throw new CarrierError("aborted", message, error);
|
|
510
|
+
}
|
|
511
|
+
throw new CarrierError(code, message, error);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
function carrierFailure(message, cause) {
|
|
515
|
+
return cause instanceof CarrierError ? cause : new CarrierError("closed", message, cause);
|
|
516
|
+
}
|
|
517
|
+
function asError(error) {
|
|
518
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
519
|
+
}
|
package/dist/utils/errors.d.ts
CHANGED
|
@@ -4,23 +4,5 @@ export declare class TimeoutError extends Error {
|
|
|
4
4
|
export declare class AbortError extends Error {
|
|
5
5
|
constructor(message?: string);
|
|
6
6
|
}
|
|
7
|
-
export type
|
|
8
|
-
export type
|
|
9
|
-
export type FlowersecErrorCode = "timeout" | "canceled" | "invalid_version" | "invalid_input" | "invalid_option" | "invalid_endpoint_instance_id" | "invalid_psk" | "invalid_suite" | "missing_grant" | "missing_connect_info" | "missing_conn" | "missing_handler" | "missing_stream_kind" | "role_mismatch" | "missing_tunnel_url" | "missing_ws_url" | "missing_origin" | "missing_channel_id" | "missing_token" | "missing_init_exp" | "timestamp_after_init_exp" | "timestamp_out_of_skew" | "auth_tag_mismatch" | "resolve_failed" | "transport_policy_denied" | "credential_commit_failed" | "random_failed" | "upgrade_failed" | "dial_failed" | "attach_failed" | "too_many_connections" | "expected_attach" | "invalid_attach" | "invalid_token" | "channel_mismatch" | "init_exp_mismatch" | "idle_timeout_mismatch" | "token_replay" | "tenant_mismatch" | "policy_denied" | "policy_error" | "replace_rate_limited" | "handshake_failed" | "ping_failed" | "rekey_failed" | "mux_failed" | "accept_stream_failed" | "open_stream_failed" | "stream_hello_failed" | "rpc_failed" | "resource_exhausted" | "not_connected";
|
|
10
|
-
export declare class FlowersecError extends Error {
|
|
11
|
-
readonly code: FlowersecErrorCode;
|
|
12
|
-
readonly stage: FlowersecStage;
|
|
13
|
-
readonly path: FlowersecPath;
|
|
14
|
-
readonly cause?: unknown;
|
|
15
|
-
constructor(args: Readonly<{
|
|
16
|
-
code: FlowersecErrorCode;
|
|
17
|
-
stage: FlowersecStage;
|
|
18
|
-
path: FlowersecPath;
|
|
19
|
-
message?: string;
|
|
20
|
-
cause?: unknown;
|
|
21
|
-
}>);
|
|
22
|
-
}
|
|
23
|
-
export declare function isTimeoutError(e: unknown): e is TimeoutError;
|
|
24
|
-
export declare function isAbortError(e: unknown): e is AbortError;
|
|
25
|
-
export declare function isFlowersecError(e: unknown): e is FlowersecError;
|
|
26
|
-
export declare function throwIfAborted(signal?: AbortSignal, message?: string): void;
|
|
7
|
+
export type ConnectErrorPath = "auto" | "tunnel" | "direct";
|
|
8
|
+
export type ConnectErrorStage = "validate" | "connect" | "session" | "rpc" | "close";
|
package/dist/utils/errors.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ConnectError } from "../public/connectError.js";
|
|
1
2
|
export class TimeoutError extends Error {
|
|
2
3
|
constructor(message = "timeout") {
|
|
3
4
|
super(message);
|
|
@@ -10,35 +11,87 @@ export class AbortError extends Error {
|
|
|
10
11
|
this.name = "AbortError";
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
14
|
+
const internalDetails = new WeakMap();
|
|
15
|
+
/** @internal */
|
|
16
|
+
export function createConnectErrorInternal(args) {
|
|
17
|
+
const error = new ConnectError(publicCode(args.code));
|
|
18
|
+
internalDetails.set(error, Object.freeze({
|
|
19
|
+
code: args.code,
|
|
20
|
+
stage: args.stage,
|
|
21
|
+
...(args.cause === undefined ? {} : { cause: args.cause }),
|
|
22
|
+
diagnostics: Object.freeze((args.diagnostics ?? []).map((diagnostic) => Object.freeze({ ...diagnostic }))),
|
|
23
|
+
}));
|
|
24
|
+
return error;
|
|
25
|
+
}
|
|
26
|
+
/** @internal */
|
|
27
|
+
export function connectErrorDetailsInternal(error) {
|
|
28
|
+
return internalDetails.get(error) ?? Object.freeze({
|
|
29
|
+
code: internalCode(error.code),
|
|
30
|
+
stage: "connect",
|
|
31
|
+
diagnostics: Object.freeze([]),
|
|
32
|
+
});
|
|
31
33
|
}
|
|
34
|
+
/** @internal */
|
|
32
35
|
export function isTimeoutError(e) {
|
|
33
36
|
return e instanceof TimeoutError;
|
|
34
37
|
}
|
|
38
|
+
/** @internal */
|
|
35
39
|
export function isAbortError(e) {
|
|
36
40
|
return e instanceof AbortError;
|
|
37
41
|
}
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
/** @internal */
|
|
43
|
+
export function isConnectError(e) {
|
|
44
|
+
return e instanceof ConnectError;
|
|
40
45
|
}
|
|
46
|
+
/** @internal */
|
|
41
47
|
export function throwIfAborted(signal, message) {
|
|
42
48
|
if (signal?.aborted)
|
|
43
49
|
throw new AbortError(message);
|
|
44
50
|
}
|
|
51
|
+
function publicCode(code) {
|
|
52
|
+
switch (code) {
|
|
53
|
+
case "timeout": return "timeout";
|
|
54
|
+
case "canceled": return "canceled";
|
|
55
|
+
case "resolve_failed": return "resolve_failed";
|
|
56
|
+
case "credential_commit_failed": return "credential_spend_failed";
|
|
57
|
+
case "handshake_failed": return "handshake_failed";
|
|
58
|
+
case "rpc_failed": return "rpc_failed";
|
|
59
|
+
case "resource_exhausted": return "resource_exhausted";
|
|
60
|
+
case "not_connected": return "not_connected";
|
|
61
|
+
case "invalid_option": return "invalid_options";
|
|
62
|
+
case "timestamp_after_init_exp": return "expired_artifact";
|
|
63
|
+
case "dial_failed":
|
|
64
|
+
case "upgrade_failed":
|
|
65
|
+
case "attach_failed":
|
|
66
|
+
case "unsupported_capability":
|
|
67
|
+
case "too_many_connections":
|
|
68
|
+
case "policy_denied":
|
|
69
|
+
case "policy_error":
|
|
70
|
+
case "replace_rate_limited":
|
|
71
|
+
case "ping_failed":
|
|
72
|
+
case "rekey_failed":
|
|
73
|
+
case "mux_failed":
|
|
74
|
+
case "accept_stream_failed":
|
|
75
|
+
case "open_stream_failed":
|
|
76
|
+
case "stream_hello_failed":
|
|
77
|
+
return "connection_failed";
|
|
78
|
+
default:
|
|
79
|
+
return "invalid_input";
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function internalCode(code) {
|
|
83
|
+
switch (code) {
|
|
84
|
+
case "invalid_input": return "invalid_input";
|
|
85
|
+
case "invalid_options": return "invalid_option";
|
|
86
|
+
case "expired_artifact": return "timestamp_after_init_exp";
|
|
87
|
+
case "resolve_failed": return "resolve_failed";
|
|
88
|
+
case "credential_spend_failed": return "credential_commit_failed";
|
|
89
|
+
case "connection_failed": return "dial_failed";
|
|
90
|
+
case "timeout": return "timeout";
|
|
91
|
+
case "canceled": return "canceled";
|
|
92
|
+
case "handshake_failed": return "handshake_failed";
|
|
93
|
+
case "rpc_failed": return "rpc_failed";
|
|
94
|
+
case "resource_exhausted": return "resource_exhausted";
|
|
95
|
+
case "not_connected": return "not_connected";
|
|
96
|
+
}
|
|
97
|
+
}
|