@floegence/flowersec-core 3.2.1 → 5.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 +57 -200
- package/THIRD_PARTY_NOTICES.md +11 -11
- package/dist/browser/index.d.ts +0 -5
- package/dist/browser/index.js +0 -3
- package/dist/cli.js +93 -64
- package/dist/facade.d.ts +0 -17
- package/dist/facade.js +0 -11
- package/dist/generated/unicode151.d.ts +2 -0
- package/dist/generated/unicode151.js +83 -0
- package/dist/interop/proxyServerPeer.js +34 -20
- package/dist/interop/serverParityPeer.js +11 -252
- package/dist/node/acceptor.d.ts +1 -57
- package/dist/node/acceptor.js +3 -420
- package/dist/node/acceptorV3.js +2 -2
- package/dist/node/connectSessionV3.js +2 -2
- package/dist/node/index.d.ts +2 -17
- package/dist/node/index.js +1 -9
- package/dist/node/nativeTransportAddon.d.ts +7 -36
- package/dist/node/nativeTransportAddon.js +7 -27
- package/dist/node/proxyServer.d.ts +2 -2
- package/dist/node/proxyServer.js +2 -2
- package/dist/node/rawQuicAdapterV3.d.ts +2 -2
- package/dist/node/rawQuicAdapterV3.js +1 -1
- package/dist/node/rawQuicServerV3.d.ts +2 -2
- package/dist/node/rawQuicServerV3.js +1 -1
- package/dist/node/rawQuicTls.d.ts +2 -0
- package/dist/node/{rawQuicAdapter.js → rawQuicTls.js} +30 -45
- package/dist/node/tunnelRuntimeV3.js +2 -2
- package/dist/proxy/index.d.ts +1 -1
- package/dist/proxy/index.js +1 -1
- package/dist/proxy/integration.d.ts +5 -5
- package/dist/proxy/integration.js +2 -2
- package/dist/proxy/runtime.js +11 -26
- package/dist/proxy/serviceWorkerRuntime.d.ts +7 -0
- package/dist/proxy/serviceWorkerRuntime.js +75 -0
- package/dist/proxy/types.d.ts +0 -1
- package/dist/proxy/windowBridge.d.ts +2 -0
- package/dist/proxy/windowBridge.js +53 -6
- package/dist/public/contract.d.ts +1 -3
- package/dist/public/streamHandlers.d.ts +0 -3
- package/dist/public/streamHandlers.js +2 -4
- package/dist/public/streamMetadata.js +2 -2
- package/dist/runtime/errors.d.ts +2 -2
- package/dist/testSupport/tlsFixture.d.ts +2 -0
- package/dist/testSupport/tlsFixture.js +8 -0
- package/dist/utils/errors.d.ts +0 -2
- package/dist/utils/errors.js +0 -80
- package/dist/v3/artifact.js +17 -3
- package/dist/v3/carrier.d.ts +2 -2
- package/dist/v3/controller.js +2 -6
- package/dist/v3/protocol.js +2 -103
- package/dist/v3/retryDisposition.d.ts +2 -2
- package/dist/v3/retryDisposition.js +0 -7
- package/dist/v3/security.d.ts +1 -10
- package/dist/v3/security.js +2 -9
- package/dist/vendor/tr46.d.ts +4 -0
- package/dist/vendor/tr46.js +37 -32
- package/package.json +19 -17
- package/sbom/cyclonedx.json +62 -62
- package/sbom/spdx.json +65 -65
- package/dist/browser/connectSession.d.ts +0 -13
- package/dist/browser/connectSession.js +0 -40
- package/dist/browser/runtimeCapability.d.ts +0 -13
- package/dist/browser/runtimeCapability.js +0 -27
- package/dist/browser/sessionRuntime.d.ts +0 -2
- package/dist/browser/sessionRuntime.js +0 -21
- package/dist/browser/v2.d.ts +0 -3
- package/dist/browser/v2.js +0 -2
- package/dist/browser/webTransportClient.d.ts +0 -8
- package/dist/browser/webTransportClient.js +0 -55
- package/dist/connectionController.d.ts +0 -55
- package/dist/connectionController.js +0 -441
- package/dist/connector/adapters/rawQuicCandidate.d.ts +0 -5
- package/dist/connector/adapters/rawQuicCandidate.js +0 -71
- package/dist/connector/adapters/webSocketCandidate.d.ts +0 -7
- package/dist/connector/adapters/webSocketCandidate.js +0 -116
- package/dist/connector/adapters/webTransportCandidate.d.ts +0 -5
- package/dist/connector/adapters/webTransportCandidate.js +0 -73
- package/dist/connector/admissionCommit.d.ts +0 -31
- package/dist/connector/admissionCommit.js +0 -239
- package/dist/connector/sessionAcceptor.d.ts +0 -38
- package/dist/connector/sessionAcceptor.js +0 -158
- package/dist/connector/sessionConfig.d.ts +0 -3
- package/dist/connector/sessionConfig.js +0 -30
- package/dist/connector/sessionConnector.d.ts +0 -47
- package/dist/connector/sessionConnector.js +0 -606
- package/dist/node/connectSession.d.ts +0 -23
- package/dist/node/connectSession.js +0 -93
- package/dist/node/controlplane.d.ts +0 -137
- package/dist/node/controlplane.js +0 -443
- package/dist/node/rawQuicAdapter.d.ts +0 -9
- package/dist/node/rawQuicServer.d.ts +0 -24
- package/dist/node/rawQuicServer.js +0 -37
- package/dist/node/runtimeCapability.d.ts +0 -14
- package/dist/node/runtimeCapability.js +0 -24
- package/dist/node/sessionRuntime.d.ts +0 -2
- package/dist/node/sessionRuntime.js +0 -13
- package/dist/node/tunnelRuntime.d.ts +0 -42
- package/dist/node/tunnelRuntime.js +0 -559
- package/dist/node/v2.d.ts +0 -11
- package/dist/node/v2.js +0 -6
- package/dist/node/webSocketServer.d.ts +0 -24
- package/dist/node/webSocketServer.js +0 -135
- package/dist/public/artifact.d.ts +0 -11
- package/dist/public/artifact.js +0 -44
- package/dist/public/artifactLease.d.ts +0 -10
- package/dist/public/artifactLease.js +0 -41
- package/dist/public/connectError.d.ts +0 -6
- package/dist/public/connectError.js +0 -9
- package/dist/transport/webSocketAdapter.d.ts +0 -31
- package/dist/transport/webSocketAdapter.js +0 -370
- package/dist/transport/webTransportAdapter.d.ts +0 -27
- package/dist/transport/webTransportAdapter.js +0 -534
- package/dist/v2/admissionError.d.ts +0 -4
- package/dist/v2/admissionError.js +0 -8
- package/dist/v2/artifact.d.ts +0 -128
- package/dist/v2/artifact.js +0 -1131
- package/dist/v2/artifactLease.d.ts +0 -1
- package/dist/v2/artifactLease.js +0 -7
- package/dist/v2/capability.d.ts +0 -29
- package/dist/v2/capability.js +0 -190
- package/dist/v2/carrier.d.ts +0 -84
- package/dist/v2/carrier.js +0 -411
- package/dist/v2/contract.d.ts +0 -46
- package/dist/v2/contract.js +0 -1
- package/dist/v2/handshake.d.ts +0 -80
- package/dist/v2/handshake.js +0 -470
- package/dist/v2/index.d.ts +0 -14
- package/dist/v2/index.js +0 -7
- package/dist/v2/opaqueArtifact.d.ts +0 -1
- package/dist/v2/opaqueArtifact.js +0 -2
- package/dist/v2/protocol.d.ts +0 -99
- package/dist/v2/protocol.js +0 -737
- package/dist/v2/publicSession.d.ts +0 -1
- package/dist/v2/publicSession.js +0 -281
- package/dist/v2/retryDisposition.d.ts +0 -16
- package/dist/v2/retryDisposition.js +0 -30
- package/dist/v2/session.d.ts +0 -310
- package/dist/v2/session.js +0 -2127
- package/dist/v2/streamLifetimeLedger.d.ts +0 -31
- package/dist/v2/streamLifetimeLedger.js +0 -131
- package/dist/v2/streamMetadata.d.ts +0 -1
- package/dist/v2/streamMetadata.js +0 -7
- package/dist/v2/unreliableMessage.d.ts +0 -43
- package/dist/v2/unreliableMessage.js +0 -254
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SessionError, } from "./contract.js";
|
|
2
|
-
import { validApplicationStreamKind } from "../
|
|
2
|
+
import { validApplicationStreamKind } from "../v3/protocol.js";
|
|
3
3
|
const DEFAULT_MAX_CONCURRENT_STREAMS = 64;
|
|
4
4
|
const MAX_CONCURRENT_STREAMS = 128;
|
|
5
5
|
export class HandlerRegistrationError extends Error {
|
|
@@ -11,6 +11,7 @@ export class HandlerRegistrationError extends Error {
|
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
const streamHandlerStates = new WeakMap();
|
|
14
|
+
// The v2 identifier is denied so it cannot be repurposed as an application stream.
|
|
14
15
|
const RESERVED_RPC_KINDS = new Set(["flowersec.rpc.v2", "flowersec.rpc.v3"]);
|
|
15
16
|
/** Carrier-neutral application-stream handlers for any established Session. */
|
|
16
17
|
export class StreamHandlers {
|
|
@@ -38,9 +39,6 @@ export class StreamHandlers {
|
|
|
38
39
|
await serveFrozenStreamHandlers(freezeStreamHandlers(this), session, options, async () => await session.close());
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
|
-
/** Explicit-compatibility application-stream handlers. */
|
|
42
|
-
export class LegacyStreamHandlers extends StreamHandlers {
|
|
43
|
-
}
|
|
44
42
|
function mutableStreamHandlerState(handlers) {
|
|
45
43
|
const state = streamHandlerStates.get(handlers);
|
|
46
44
|
if (state === undefined)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { canonicalStreamMetadataJSONV3Internal } from "../v3/protocol.js";
|
|
2
2
|
export class StreamMetadataError extends Error {
|
|
3
3
|
constructor() {
|
|
4
4
|
super("invalid Flowersec stream metadata");
|
|
@@ -18,7 +18,7 @@ export class StreamMetadata {
|
|
|
18
18
|
}
|
|
19
19
|
export function createStreamMetadata(values) {
|
|
20
20
|
try {
|
|
21
|
-
const canonical =
|
|
21
|
+
const canonical = canonicalStreamMetadataJSONV3Internal(values);
|
|
22
22
|
return StreamMetadata.fromCanonicalValues(deepFreeze(JSON.parse(canonical)));
|
|
23
23
|
}
|
|
24
24
|
catch {
|
package/dist/runtime/errors.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type RuntimeErrorCode = "runtime_unsupported" | "runtime_start_failed" | "runtime_crashed";
|
|
2
2
|
export declare class RuntimeError extends Error {
|
|
3
3
|
readonly code: RuntimeErrorCode;
|
|
4
|
-
readonly cause?: unknown
|
|
5
|
-
constructor(code: RuntimeErrorCode, message: string, cause?: unknown
|
|
4
|
+
readonly cause?: unknown;
|
|
5
|
+
constructor(code: RuntimeErrorCode, message: string, cause?: unknown);
|
|
6
6
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const certificateDER = Buffer.from("MIIBjzCCAUGgAwIBAgIUW8hQEpQsUJN9a6qqF2g6hsNpSm8wBQYDK2VwMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0yNjA3MjAxOTAxMjFaFw0zNjA3MTcxOTAxMjFaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDAqMAUGAytlcAMhAAihki/Jec+1EaC6E6PsSxjMYFAazrgkNiUIlbj/+A/0o4GkMIGhMB0GA1UdDgQWBBQCuKxQmMQkAAy9KkfuD+WOmrrMbTAfBgNVHSMEGDAWgBQCuKxQmMQkAAy9KkfuD+WOmrrMbTAsBgNVHREEJTAjgglsb2NhbGhvc3SHBH8AAAGHEAAAAAAAAAAAAAAAAAAAAAEwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwEwBQYDK2VwA0EArZng3XitiH2E1pW/NTxQvEOBXJYpYE8coQmLV4yTjfI43CWHMG6lIrwk/so67oe6Z2R4iHGjUm3Tuy50Fl8hBw==", "base64");
|
|
2
|
+
const privateKeyDER = Buffer.from("MC4CAQAwBQYDK2VwBCIEICxYUWHqGoh0CBBohsaNg/NThm1n3UeWCzYuq6jS+Qi6", "base64");
|
|
3
|
+
export const testCertificatePEM = pem("CERTIFICATE", certificateDER);
|
|
4
|
+
export const testPrivateKeyPEM = pem("PRIVATE KEY", privateKeyDER);
|
|
5
|
+
function pem(label, der) {
|
|
6
|
+
const lines = Buffer.from(der).toString("base64").match(/.{1,64}/gu) ?? [];
|
|
7
|
+
return `-----BEGIN ${label}-----\n${lines.join("\n")}\n-----END ${label}-----\n`;
|
|
8
|
+
}
|
package/dist/utils/errors.d.ts
CHANGED
|
@@ -4,5 +4,3 @@ export declare class TimeoutError extends Error {
|
|
|
4
4
|
export declare class AbortError extends Error {
|
|
5
5
|
constructor(message?: string);
|
|
6
6
|
}
|
|
7
|
-
export type ConnectErrorPath = "auto" | "tunnel" | "direct";
|
|
8
|
-
export type ConnectErrorStage = "validate" | "connect" | "session" | "rpc" | "close";
|
package/dist/utils/errors.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ConnectError } from "../public/connectError.js";
|
|
2
1
|
export class TimeoutError extends Error {
|
|
3
2
|
constructor(message = "timeout") {
|
|
4
3
|
super(message);
|
|
@@ -11,87 +10,8 @@ export class AbortError extends Error {
|
|
|
11
10
|
this.name = "AbortError";
|
|
12
11
|
}
|
|
13
12
|
}
|
|
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
|
-
});
|
|
33
|
-
}
|
|
34
|
-
/** @internal */
|
|
35
|
-
export function isTimeoutError(e) {
|
|
36
|
-
return e instanceof TimeoutError;
|
|
37
|
-
}
|
|
38
|
-
/** @internal */
|
|
39
|
-
export function isAbortError(e) {
|
|
40
|
-
return e instanceof AbortError;
|
|
41
|
-
}
|
|
42
|
-
/** @internal */
|
|
43
|
-
export function isConnectError(e) {
|
|
44
|
-
return e instanceof ConnectError;
|
|
45
|
-
}
|
|
46
13
|
/** @internal */
|
|
47
14
|
export function throwIfAborted(signal, message) {
|
|
48
15
|
if (signal?.aborted)
|
|
49
16
|
throw new AbortError(message);
|
|
50
17
|
}
|
|
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
|
-
}
|
package/dist/v3/artifact.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { sha256 } from "@noble/hashes/sha2.js";
|
|
2
2
|
import { base64urlDecode, base64urlEncode } from "../utils/base64url.js";
|
|
3
3
|
import { concatBytes, readU32be, u32be } from "../utils/bin.js";
|
|
4
|
-
import {
|
|
4
|
+
import { unicode151Assigned } from "../generated/unicode151.js";
|
|
5
|
+
import { toASCII, toUnicode } from "../vendor/tr46.js";
|
|
5
6
|
import { canonicalizeJCSV3 } from "./jcs.js";
|
|
6
7
|
import { preflightJSONV3 } from "./jsonPreflight.js";
|
|
7
8
|
import { FLOWERSEC_V3_CRYPTO_LABELS, FLOWERSEC_V3_PROFILE, wireProfileForPathV3, } from "./transportConstants.js";
|
|
@@ -671,14 +672,20 @@ function normalizeDNSOrIPv4(host) {
|
|
|
671
672
|
}
|
|
672
673
|
return parts.map((part) => String(Number(part))).join(".");
|
|
673
674
|
}
|
|
674
|
-
const
|
|
675
|
+
const options = {
|
|
675
676
|
checkHyphens: true,
|
|
676
677
|
checkBidi: true,
|
|
677
678
|
checkJoiners: true,
|
|
678
679
|
useSTD3ASCIIRules: true,
|
|
679
680
|
verifyDNSLength: true,
|
|
680
681
|
transitionalProcessing: false,
|
|
681
|
-
}
|
|
682
|
+
};
|
|
683
|
+
if (!hasOnlyUnicode151Scalars(host))
|
|
684
|
+
throw invalidCandidate("DNS label");
|
|
685
|
+
const decoded = toUnicode(host, options);
|
|
686
|
+
if (decoded.error || !hasOnlyUnicode151Scalars(decoded.domain))
|
|
687
|
+
throw invalidCandidate("DNS label");
|
|
688
|
+
const ascii = toASCII(host, options);
|
|
682
689
|
if (ascii === null || ascii.endsWith("."))
|
|
683
690
|
throw invalidCandidate("DNS label");
|
|
684
691
|
const normalized = ascii.toLowerCase();
|
|
@@ -688,6 +695,13 @@ function normalizeDNSOrIPv4(host) {
|
|
|
688
695
|
}
|
|
689
696
|
return normalized;
|
|
690
697
|
}
|
|
698
|
+
function hasOnlyUnicode151Scalars(value) {
|
|
699
|
+
for (const scalar of value) {
|
|
700
|
+
if (!unicode151Assigned(scalar.codePointAt(0)))
|
|
701
|
+
return false;
|
|
702
|
+
}
|
|
703
|
+
return true;
|
|
704
|
+
}
|
|
691
705
|
function requestFromValidatedArtifact(artifact, candidateSet, chosenCandidateID) {
|
|
692
706
|
const common = {
|
|
693
707
|
profile: PROFILE,
|
package/dist/v3/carrier.d.ts
CHANGED
|
@@ -2,8 +2,8 @@ import type { CarrierKind, OperationOptionsV3, PathKind } from "./contract.js";
|
|
|
2
2
|
export type CarrierErrorCode = "aborted" | "closed" | "reset" | "stop_sending" | "stop_sending_unavailable" | "write_closed" | "datagram_unavailable";
|
|
3
3
|
export declare class CarrierError extends Error {
|
|
4
4
|
readonly code: CarrierErrorCode;
|
|
5
|
-
readonly cause?: unknown
|
|
6
|
-
constructor(code: CarrierErrorCode, message: string, cause?: unknown
|
|
5
|
+
readonly cause?: unknown;
|
|
6
|
+
constructor(code: CarrierErrorCode, message: string, cause?: unknown);
|
|
7
7
|
}
|
|
8
8
|
export interface CarrierStreamV3 {
|
|
9
9
|
read(options?: OperationOptionsV3): Promise<Uint8Array | null>;
|
package/dist/v3/controller.js
CHANGED
|
@@ -267,17 +267,13 @@ function validateControllerWaitDisposition(value) {
|
|
|
267
267
|
if (value.kind !== "retry_after") {
|
|
268
268
|
throw new ConnectErrorV3("artifact_invalid", { kind: "terminal" });
|
|
269
269
|
}
|
|
270
|
-
const deadline = value.notBeforeUnixMilliseconds
|
|
271
|
-
if (
|
|
272
|
-
deadline > 253_402_300_799_999 || value.notBeforeUnixMilliseconds !== undefined &&
|
|
273
|
-
value.absoluteUnixMilliseconds !== undefined &&
|
|
274
|
-
value.notBeforeUnixMilliseconds !== value.absoluteUnixMilliseconds) {
|
|
270
|
+
const deadline = value.notBeforeUnixMilliseconds;
|
|
271
|
+
if (!Number.isSafeInteger(deadline) || deadline < 0 || deadline > 253_402_300_799_999) {
|
|
275
272
|
throw new ConnectErrorV3("artifact_invalid", { kind: "terminal" });
|
|
276
273
|
}
|
|
277
274
|
return Object.freeze({
|
|
278
275
|
kind: "retry_after",
|
|
279
276
|
notBeforeUnixMilliseconds: deadline,
|
|
280
|
-
absoluteUnixMilliseconds: deadline,
|
|
281
277
|
});
|
|
282
278
|
}
|
|
283
279
|
function controllerBackoffForWait(consecutiveFailure) {
|
package/dist/v3/protocol.js
CHANGED
|
@@ -3,6 +3,7 @@ import { chacha20poly1305 } from "@noble/ciphers/chacha.js";
|
|
|
3
3
|
import { expand } from "@noble/hashes/hkdf.js";
|
|
4
4
|
import { hmac } from "@noble/hashes/hmac.js";
|
|
5
5
|
import { sha256 } from "@noble/hashes/sha2.js";
|
|
6
|
+
import { unicode151Assigned } from "../generated/unicode151.js";
|
|
6
7
|
import { FLOWERSEC_V3_CRYPTO_LABELS } from "./transportConstants.js";
|
|
7
8
|
const encoder = new TextEncoder();
|
|
8
9
|
const MAX_UINT32 = 0xffffffff;
|
|
@@ -22,81 +23,6 @@ const MAX_OPEN_METADATA_KEYS = 64;
|
|
|
22
23
|
const MAX_OPEN_METADATA_ARRAY = 32;
|
|
23
24
|
const MAX_OPEN_METADATA_KEY_BYTES = 64;
|
|
24
25
|
const MAX_OPEN_METADATA_STRING_BYTES = 512;
|
|
25
|
-
const UNICODE_15_1_ASSIGNED_RANGES_HEX = [
|
|
26
|
-
"00000000037700037A00037F00038400038A00038C00038C00038E0003A10003A300052F00053100055600055900058A00058D00058F0005910005C7",
|
|
27
|
-
"0005D00005EA0005EF0005F400060000070D00070F00074A00074D0007B10007C00007FA0007FD00082D00083000083E00084000085B00085E00085E",
|
|
28
|
-
"00086000086A00087000088E00089000089100089800098300098500098C00098F0009900009930009A80009AA0009B00009B20009B20009B60009B9",
|
|
29
|
-
"0009BC0009C40009C70009C80009CB0009CE0009D70009D70009DC0009DD0009DF0009E30009E60009FE000A01000A03000A05000A0A000A0F000A10",
|
|
30
|
-
"000A13000A28000A2A000A30000A32000A33000A35000A36000A38000A39000A3C000A3C000A3E000A42000A47000A48000A4B000A4D000A51000A51",
|
|
31
|
-
"000A59000A5C000A5E000A5E000A66000A76000A81000A83000A85000A8D000A8F000A91000A93000AA8000AAA000AB0000AB2000AB3000AB5000AB9",
|
|
32
|
-
"000ABC000AC5000AC7000AC9000ACB000ACD000AD0000AD0000AE0000AE3000AE6000AF1000AF9000AFF000B01000B03000B05000B0C000B0F000B10",
|
|
33
|
-
"000B13000B28000B2A000B30000B32000B33000B35000B39000B3C000B44000B47000B48000B4B000B4D000B55000B57000B5C000B5D000B5F000B63",
|
|
34
|
-
"000B66000B77000B82000B83000B85000B8A000B8E000B90000B92000B95000B99000B9A000B9C000B9C000B9E000B9F000BA3000BA4000BA8000BAA",
|
|
35
|
-
"000BAE000BB9000BBE000BC2000BC6000BC8000BCA000BCD000BD0000BD0000BD7000BD7000BE6000BFA000C00000C0C000C0E000C10000C12000C28",
|
|
36
|
-
"000C2A000C39000C3C000C44000C46000C48000C4A000C4D000C55000C56000C58000C5A000C5D000C5D000C60000C63000C66000C6F000C77000C8C",
|
|
37
|
-
"000C8E000C90000C92000CA8000CAA000CB3000CB5000CB9000CBC000CC4000CC6000CC8000CCA000CCD000CD5000CD6000CDD000CDE000CE0000CE3",
|
|
38
|
-
"000CE6000CEF000CF1000CF3000D00000D0C000D0E000D10000D12000D44000D46000D48000D4A000D4F000D54000D63000D66000D7F000D81000D83",
|
|
39
|
-
"000D85000D96000D9A000DB1000DB3000DBB000DBD000DBD000DC0000DC6000DCA000DCA000DCF000DD4000DD6000DD6000DD8000DDF000DE6000DEF",
|
|
40
|
-
"000DF2000DF4000E01000E3A000E3F000E5B000E81000E82000E84000E84000E86000E8A000E8C000EA3000EA5000EA5000EA7000EBD000EC0000EC4",
|
|
41
|
-
"000EC6000EC6000EC8000ECE000ED0000ED9000EDC000EDF000F00000F47000F49000F6C000F71000F97000F99000FBC000FBE000FCC000FCE000FDA",
|
|
42
|
-
"0010000010C50010C70010C70010CD0010CD0010D000124800124A00124D00125000125600125800125800125A00125D00126000128800128A00128D",
|
|
43
|
-
"0012900012B00012B20012B50012B80012BE0012C00012C00012C20012C50012C80012D60012D800131000131200131500131800135A00135D00137C",
|
|
44
|
-
"0013800013990013A00013F50013F80013FD00140000169C0016A00016F800170000171500171F00173600174000175300176000176C00176E001770",
|
|
45
|
-
"0017720017730017800017DD0017E00017E90017F00017F90018000018190018200018780018800018AA0018B00018F500190000191E00192000192B",
|
|
46
|
-
"00193000193B00194000194000194400196D0019700019740019800019AB0019B00019C90019D00019DA0019DE001A1B001A1E001A5E001A60001A7C",
|
|
47
|
-
"001A7F001A89001A90001A99001AA0001AAD001AB0001ACE001B00001B4C001B50001B7E001B80001BF3001BFC001C37001C3B001C49001C4D001C88",
|
|
48
|
-
"001C90001CBA001CBD001CC7001CD0001CFA001D00001F15001F18001F1D001F20001F45001F48001F4D001F50001F57001F59001F59001F5B001F5B",
|
|
49
|
-
"001F5D001F5D001F5F001F7D001F80001FB4001FB6001FC4001FC6001FD3001FD6001FDB001FDD001FEF001FF2001FF4001FF6001FFE002000002064",
|
|
50
|
-
"00206600207100207400208E00209000209C0020A00020C00020D00020F000210000218B00219000242600244000244A002460002B73002B76002B95",
|
|
51
|
-
"002B97002CF3002CF9002D25002D27002D27002D2D002D2D002D30002D67002D6F002D70002D7F002D96002DA0002DA6002DA8002DAE002DB0002DB6",
|
|
52
|
-
"002DB8002DBE002DC0002DC6002DC8002DCE002DD0002DD6002DD8002DDE002DE0002E5D002E80002E99002E9B002EF3002F00002FD5002FF000303F",
|
|
53
|
-
"0030410030960030990030FF00310500312F00313100318E0031900031E30031EF00321E00322000A48C00A49000A4C600A4D000A62B00A64000A6F7",
|
|
54
|
-
"00A70000A7CA00A7D000A7D100A7D300A7D300A7D500A7D900A7F200A82C00A83000A83900A84000A87700A88000A8C500A8CE00A8D900A8E000A953",
|
|
55
|
-
"00A95F00A97C00A98000A9CD00A9CF00A9D900A9DE00A9FE00AA0000AA3600AA4000AA4D00AA5000AA5900AA5C00AAC200AADB00AAF600AB0100AB06",
|
|
56
|
-
"00AB0900AB0E00AB1100AB1600AB2000AB2600AB2800AB2E00AB3000AB6B00AB7000ABED00ABF000ABF900AC0000D7A300D7B000D7C600D7CB00D7FB",
|
|
57
|
-
"00D80000FA6D00FA7000FAD900FB0000FB0600FB1300FB1700FB1D00FB3600FB3800FB3C00FB3E00FB3E00FB4000FB4100FB4300FB4400FB4600FBC2",
|
|
58
|
-
"00FBD300FD8F00FD9200FDC700FDCF00FE1900FE2000FE5200FE5400FE6600FE6800FE6B00FE7000FE7400FE7600FEFC00FEFF00FEFF00FF0100FFBE",
|
|
59
|
-
"00FFC200FFC700FFCA00FFCF00FFD200FFD700FFDA00FFDC00FFE000FFE600FFE800FFEE00FFF901000B01000D01002601002801003A01003C01003D",
|
|
60
|
-
"01003F01004D01005001005D0100800100FA01010001010201010701013301013701018E01019001019C0101A00101A00101D00101FD01028001029C",
|
|
61
|
-
"0102A00102D00102E00102FB01030001032301032D01034A01035001037A01038001039D01039F0103C30103C80103D501040001049D0104A00104A9",
|
|
62
|
-
"0104B00104D30104D80104FB01050001052701053001056301056F01057A01057C01058A01058C0105920105940105950105970105A10105A30105B1",
|
|
63
|
-
"0105B30105B90105BB0105BC0106000107360107400107550107600107670107800107850107870107B00107B20107BA010800010805010808010808",
|
|
64
|
-
"01080A01083501083701083801083C01083C01083F01085501085701089E0108A70108AF0108E00108F20108F40108F50108FB01091B01091F010939",
|
|
65
|
-
"01093F01093F0109800109B70109BC0109CF0109D2010A03010A05010A06010A0C010A13010A15010A17010A19010A35010A38010A3A010A3F010A48",
|
|
66
|
-
"010A50010A58010A60010A9F010AC0010AE6010AEB010AF6010B00010B35010B39010B55010B58010B72010B78010B91010B99010B9C010BA9010BAF",
|
|
67
|
-
"010C00010C48010C80010CB2010CC0010CF2010CFA010D27010D30010D39010E60010E7E010E80010EA9010EAB010EAD010EB0010EB1010EFD010F27",
|
|
68
|
-
"010F30010F59010F70010F89010FB0010FCB010FE0010FF601100001104D01105201107501107F0110C20110CD0110CD0110D00110E80110F00110F9",
|
|
69
|
-
"0111000111340111360111470111500111760111800111DF0111E10111F401120001121101121301124101128001128601128801128801128A01128D",
|
|
70
|
-
"01128F01129D01129F0112A90112B00112EA0112F00112F901130001130301130501130C01130F01131001131301132801132A011330011332011333",
|
|
71
|
-
"01133501133901133B01134401134701134801134B01134D01135001135001135701135701135D01136301136601136C01137001137401140001145B",
|
|
72
|
-
"01145D0114610114800114C70114D00114D90115800115B50115B80115DD01160001164401165001165901166001166C0116800116B90116C00116C9",
|
|
73
|
-
"01170001171A01171D01172B01173001174601180001183B0118A00118F20118FF01190601190901190901190C011913011915011916011918011935",
|
|
74
|
-
"01193701193801193B0119460119500119590119A00119A70119AA0119D70119DA0119E4011A00011A47011A50011AA2011AB0011AF8011B00011B09",
|
|
75
|
-
"011C00011C08011C0A011C36011C38011C45011C50011C6C011C70011C8F011C92011CA7011CA9011CB6011D00011D06011D08011D09011D0B011D36",
|
|
76
|
-
"011D3A011D3A011D3C011D3D011D3F011D47011D50011D59011D60011D65011D67011D68011D6A011D8E011D90011D91011D93011D98011DA0011DA9",
|
|
77
|
-
"011EE0011EF8011F00011F10011F12011F3A011F3E011F59011FB0011FB0011FC0011FF1011FFF01239901240001246E012470012474012480012543",
|
|
78
|
-
"012F90012FF2013000013455014400014646016800016A38016A40016A5E016A60016A69016A6E016ABE016AC0016AC9016AD0016AED016AF0016AF5",
|
|
79
|
-
"016B00016B45016B50016B59016B5B016B61016B63016B77016B7D016B8F016E40016E9A016F00016F4A016F4F016F87016F8F016F9F016FE0016FE4",
|
|
80
|
-
"016FF0016FF10170000187F7018800018CD5018D00018D0801AFF001AFF301AFF501AFFB01AFFD01AFFE01B00001B12201B13201B13201B15001B152",
|
|
81
|
-
"01B15501B15501B16401B16701B17001B2FB01BC0001BC6A01BC7001BC7C01BC8001BC8801BC9001BC9901BC9C01BCA301CF0001CF2D01CF3001CF46",
|
|
82
|
-
"01CF5001CFC301D00001D0F501D10001D12601D12901D1EA01D20001D24501D2C001D2D301D2E001D2F301D30001D35601D36001D37801D40001D454",
|
|
83
|
-
"01D45601D49C01D49E01D49F01D4A201D4A201D4A501D4A601D4A901D4AC01D4AE01D4B901D4BB01D4BB01D4BD01D4C301D4C501D50501D50701D50A",
|
|
84
|
-
"01D50D01D51401D51601D51C01D51E01D53901D53B01D53E01D54001D54401D54601D54601D54A01D55001D55201D6A501D6A801D7CB01D7CE01DA8B",
|
|
85
|
-
"01DA9B01DA9F01DAA101DAAF01DF0001DF1E01DF2501DF2A01E00001E00601E00801E01801E01B01E02101E02301E02401E02601E02A01E03001E06D",
|
|
86
|
-
"01E08F01E08F01E10001E12C01E13001E13D01E14001E14901E14E01E14F01E29001E2AE01E2C001E2F901E2FF01E2FF01E4D001E4F901E7E001E7E6",
|
|
87
|
-
"01E7E801E7EB01E7ED01E7EE01E7F001E7FE01E80001E8C401E8C701E8D601E90001E94B01E95001E95901E95E01E95F01EC7101ECB401ED0101ED3D",
|
|
88
|
-
"01EE0001EE0301EE0501EE1F01EE2101EE2201EE2401EE2401EE2701EE2701EE2901EE3201EE3401EE3701EE3901EE3901EE3B01EE3B01EE4201EE42",
|
|
89
|
-
"01EE4701EE4701EE4901EE4901EE4B01EE4B01EE4D01EE4F01EE5101EE5201EE5401EE5401EE5701EE5701EE5901EE5901EE5B01EE5B01EE5D01EE5D",
|
|
90
|
-
"01EE5F01EE5F01EE6101EE6201EE6401EE6401EE6701EE6A01EE6C01EE7201EE7401EE7701EE7901EE7C01EE7E01EE7E01EE8001EE8901EE8B01EE9B",
|
|
91
|
-
"01EEA101EEA301EEA501EEA901EEAB01EEBB01EEF001EEF101F00001F02B01F03001F09301F0A001F0AE01F0B101F0BF01F0C101F0CF01F0D101F0F5",
|
|
92
|
-
"01F10001F1AD01F1E601F20201F21001F23B01F24001F24801F25001F25101F26001F26501F30001F6D701F6DC01F6EC01F6F001F6FC01F70001F776",
|
|
93
|
-
"01F77B01F7D901F7E001F7EB01F7F001F7F001F80001F80B01F81001F84701F85001F85901F86001F88701F89001F8AD01F8B001F8B101F90001FA53",
|
|
94
|
-
"01FA6001FA6D01FA7001FA7C01FA8001FA8801FA9001FABD01FABF01FAC501FACE01FADB01FAE001FAE801FAF001FAF801FB0001FB9201FB9401FBCA",
|
|
95
|
-
"01FBF001FBF901FFFE02A6DF02A70002B73902B74002B81D02B82002CEA102CEB002EBE002EBF002EE5D02F80002FA1D02FFFE03134A0313500323AF",
|
|
96
|
-
"03FFFE03FFFF04FFFE04FFFF05FFFE05FFFF06FFFE06FFFF07FFFE07FFFF08FFFE08FFFF09FFFE09FFFF0AFFFE0AFFFF0BFFFE0BFFFF0CFFFE0CFFFF",
|
|
97
|
-
"0DFFFE0DFFFF0E00010E00010E00200E007F0E01000E01EF0EFFFE10FFFF",
|
|
98
|
-
].join("");
|
|
99
|
-
const UNICODE_15_1_ASSIGNED_RANGES = decodeUnicodeRanges(UNICODE_15_1_ASSIGNED_RANGES_HEX);
|
|
100
26
|
const strictDecoder = new TextDecoder("utf-8", { fatal: true });
|
|
101
27
|
export class ProtocolV3Error extends Error {
|
|
102
28
|
}
|
|
@@ -724,39 +650,12 @@ function validOpenUnicodeString(value, maxBytes, allowEmpty) {
|
|
|
724
650
|
if ((codePoint >= 0xd800 && codePoint <= 0xdfff) ||
|
|
725
651
|
codePoint <= 0x1f ||
|
|
726
652
|
(codePoint >= 0x7f && codePoint <= 0x9f) ||
|
|
727
|
-
!
|
|
653
|
+
!unicode151Assigned(codePoint)) {
|
|
728
654
|
return false;
|
|
729
655
|
}
|
|
730
656
|
}
|
|
731
657
|
return true;
|
|
732
658
|
}
|
|
733
|
-
function unicode15_1Assigned(codePoint) {
|
|
734
|
-
let low = 0;
|
|
735
|
-
let high = UNICODE_15_1_ASSIGNED_RANGES.length - 1;
|
|
736
|
-
while (low <= high) {
|
|
737
|
-
const middle = (low + high) >>> 1;
|
|
738
|
-
const [start, end] = UNICODE_15_1_ASSIGNED_RANGES[middle];
|
|
739
|
-
if (codePoint < start)
|
|
740
|
-
high = middle - 1;
|
|
741
|
-
else if (codePoint > end)
|
|
742
|
-
low = middle + 1;
|
|
743
|
-
else
|
|
744
|
-
return true;
|
|
745
|
-
}
|
|
746
|
-
return false;
|
|
747
|
-
}
|
|
748
|
-
function decodeUnicodeRanges(value) {
|
|
749
|
-
if (value.length % 12 !== 0)
|
|
750
|
-
throw new Error("invalid committed Unicode range table");
|
|
751
|
-
const ranges = [];
|
|
752
|
-
for (let offset = 0; offset < value.length; offset += 12) {
|
|
753
|
-
ranges.push([
|
|
754
|
-
Number.parseInt(value.slice(offset, offset + 6), 16),
|
|
755
|
-
Number.parseInt(value.slice(offset + 6, offset + 12), 16),
|
|
756
|
-
]);
|
|
757
|
-
}
|
|
758
|
-
return ranges;
|
|
759
|
-
}
|
|
760
659
|
function isUnicodeWhitespace(codePoint) {
|
|
761
660
|
return ((codePoint >= 0x0009 && codePoint <= 0x000d) ||
|
|
762
661
|
codePoint === 0x0020 ||
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SessionErrorCode } from "./contract.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type { PublicConnectErrorCodeV3 } from "./security.js";
|
|
3
3
|
export type RetryDisposition = Readonly<{
|
|
4
4
|
kind: "terminal";
|
|
5
5
|
}> | Readonly<{
|
|
@@ -9,7 +9,7 @@ export type RetryDisposition = Readonly<{
|
|
|
9
9
|
notBeforeUnixMilliseconds: number;
|
|
10
10
|
}>;
|
|
11
11
|
export declare function retryDispositionForConnectError(error: Readonly<{
|
|
12
|
-
code:
|
|
12
|
+
code: PublicConnectErrorCodeV3;
|
|
13
13
|
}>): RetryDisposition;
|
|
14
14
|
export declare function retryDispositionForSessionError(error: Readonly<{
|
|
15
15
|
code: SessionErrorCode;
|
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
export function retryDispositionForConnectError(error) {
|
|
2
2
|
switch (error.code) {
|
|
3
3
|
case "expired_artifact":
|
|
4
|
-
case "resolve_failed":
|
|
5
|
-
case "credential_spend_failed":
|
|
6
4
|
case "connection_failed":
|
|
7
|
-
case "timeout":
|
|
8
|
-
case "handshake_failed":
|
|
9
|
-
case "rpc_failed":
|
|
10
|
-
case "resource_exhausted":
|
|
11
|
-
case "not_connected":
|
|
12
5
|
return Object.freeze({ kind: "retryable" });
|
|
13
6
|
default:
|
|
14
7
|
return Object.freeze({ kind: "terminal" });
|
package/dist/v3/security.d.ts
CHANGED
|
@@ -14,21 +14,12 @@ export type RetryDispositionV3 = Readonly<{
|
|
|
14
14
|
}> | Readonly<{
|
|
15
15
|
kind: "retry_after";
|
|
16
16
|
notBeforeUnixMilliseconds: number;
|
|
17
|
-
/** @deprecated Use notBeforeUnixMilliseconds. */
|
|
18
|
-
absoluteUnixMilliseconds?: number;
|
|
19
|
-
}>;
|
|
20
|
-
type RetryDispositionInputV3 = RetryDispositionV3 | Readonly<{
|
|
21
|
-
kind: "retry_after";
|
|
22
|
-
/** @deprecated Use notBeforeUnixMilliseconds. */
|
|
23
|
-
absoluteUnixMilliseconds: number;
|
|
24
|
-
notBeforeUnixMilliseconds?: number;
|
|
25
17
|
}>;
|
|
18
|
+
type RetryDispositionInputV3 = RetryDispositionV3;
|
|
26
19
|
export declare class ConnectErrorV3 extends Error {
|
|
27
20
|
readonly code: PublicConnectErrorCodeV3;
|
|
28
21
|
readonly retryDisposition: RetryDispositionV3;
|
|
29
22
|
constructor(code: PublicConnectErrorCodeV3, disposition: RetryDispositionInputV3);
|
|
30
|
-
/** @deprecated Use retryDisposition. */
|
|
31
|
-
get disposition(): RetryDispositionV3;
|
|
32
23
|
}
|
|
33
24
|
export type TransportSecuritySnapshotV3 = Readonly<{
|
|
34
25
|
mode: "ca";
|
package/dist/v3/security.js
CHANGED
|
@@ -18,8 +18,6 @@ export class ConnectErrorV3 extends Error {
|
|
|
18
18
|
this.name = "ConnectError";
|
|
19
19
|
this.retryDisposition = validateRetryDispositionValueV3(disposition);
|
|
20
20
|
}
|
|
21
|
-
/** @deprecated Use retryDisposition. */
|
|
22
|
-
get disposition() { return this.retryDisposition; }
|
|
23
21
|
}
|
|
24
22
|
export function snapshotTransportSecurityPolicyV3(policy, attemptNowUnixSeconds, supportedModes) {
|
|
25
23
|
if (!Number.isSafeInteger(attemptNowUnixSeconds) || attemptNowUnixSeconds < 0) {
|
|
@@ -101,19 +99,14 @@ const retryable = () => Object.freeze({ kind: "retryable" });
|
|
|
101
99
|
const retryAfter = (notBeforeUnixMilliseconds) => Object.freeze({
|
|
102
100
|
kind: "retry_after",
|
|
103
101
|
notBeforeUnixMilliseconds,
|
|
104
|
-
absoluteUnixMilliseconds: notBeforeUnixMilliseconds,
|
|
105
102
|
});
|
|
106
103
|
function validateRetryDispositionValueV3(value) {
|
|
107
104
|
if (value.kind === "terminal")
|
|
108
105
|
return terminal();
|
|
109
106
|
if (value.kind === "retryable")
|
|
110
107
|
return retryable();
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
const deadline = canonical ?? legacy;
|
|
114
|
-
if (deadline === undefined ||
|
|
115
|
-
canonical !== undefined && legacy !== undefined && canonical !== legacy ||
|
|
116
|
-
!Number.isSafeInteger(deadline) || deadline < 0 || deadline > 253_402_300_799_999) {
|
|
108
|
+
const deadline = value.notBeforeUnixMilliseconds;
|
|
109
|
+
if (!Number.isSafeInteger(deadline) || deadline < 0 || deadline > 253_402_300_799_999) {
|
|
117
110
|
throw new TypeError("invalid Flowersec retry-after deadline");
|
|
118
111
|
}
|
|
119
112
|
return retryAfter(deadline);
|
package/dist/vendor/tr46.d.ts
CHANGED
|
@@ -8,3 +8,7 @@ export type TR46Options = Readonly<{
|
|
|
8
8
|
ignoreInvalidPunycode?: boolean;
|
|
9
9
|
}>;
|
|
10
10
|
export declare function toASCII(domainName: string, options?: TR46Options): string | null;
|
|
11
|
+
export declare function toUnicode(domainName: string, options?: TR46Options): Readonly<{
|
|
12
|
+
domain: string;
|
|
13
|
+
error: boolean;
|
|
14
|
+
}>;
|