@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.
Files changed (145) hide show
  1. package/README.md +57 -200
  2. package/THIRD_PARTY_NOTICES.md +11 -11
  3. package/dist/browser/index.d.ts +0 -5
  4. package/dist/browser/index.js +0 -3
  5. package/dist/cli.js +93 -64
  6. package/dist/facade.d.ts +0 -17
  7. package/dist/facade.js +0 -11
  8. package/dist/generated/unicode151.d.ts +2 -0
  9. package/dist/generated/unicode151.js +83 -0
  10. package/dist/interop/proxyServerPeer.js +34 -20
  11. package/dist/interop/serverParityPeer.js +11 -252
  12. package/dist/node/acceptor.d.ts +1 -57
  13. package/dist/node/acceptor.js +3 -420
  14. package/dist/node/acceptorV3.js +2 -2
  15. package/dist/node/connectSessionV3.js +2 -2
  16. package/dist/node/index.d.ts +2 -17
  17. package/dist/node/index.js +1 -9
  18. package/dist/node/nativeTransportAddon.d.ts +7 -36
  19. package/dist/node/nativeTransportAddon.js +7 -27
  20. package/dist/node/proxyServer.d.ts +2 -2
  21. package/dist/node/proxyServer.js +2 -2
  22. package/dist/node/rawQuicAdapterV3.d.ts +2 -2
  23. package/dist/node/rawQuicAdapterV3.js +1 -1
  24. package/dist/node/rawQuicServerV3.d.ts +2 -2
  25. package/dist/node/rawQuicServerV3.js +1 -1
  26. package/dist/node/rawQuicTls.d.ts +2 -0
  27. package/dist/node/{rawQuicAdapter.js → rawQuicTls.js} +30 -45
  28. package/dist/node/tunnelRuntimeV3.js +2 -2
  29. package/dist/proxy/index.d.ts +1 -1
  30. package/dist/proxy/index.js +1 -1
  31. package/dist/proxy/integration.d.ts +5 -5
  32. package/dist/proxy/integration.js +2 -2
  33. package/dist/proxy/runtime.js +11 -26
  34. package/dist/proxy/serviceWorkerRuntime.d.ts +7 -0
  35. package/dist/proxy/serviceWorkerRuntime.js +75 -0
  36. package/dist/proxy/types.d.ts +0 -1
  37. package/dist/proxy/windowBridge.d.ts +2 -0
  38. package/dist/proxy/windowBridge.js +53 -6
  39. package/dist/public/contract.d.ts +1 -3
  40. package/dist/public/streamHandlers.d.ts +0 -3
  41. package/dist/public/streamHandlers.js +2 -4
  42. package/dist/public/streamMetadata.js +2 -2
  43. package/dist/runtime/errors.d.ts +2 -2
  44. package/dist/testSupport/tlsFixture.d.ts +2 -0
  45. package/dist/testSupport/tlsFixture.js +8 -0
  46. package/dist/utils/errors.d.ts +0 -2
  47. package/dist/utils/errors.js +0 -80
  48. package/dist/v3/artifact.js +17 -3
  49. package/dist/v3/carrier.d.ts +2 -2
  50. package/dist/v3/controller.js +2 -6
  51. package/dist/v3/protocol.js +2 -103
  52. package/dist/v3/retryDisposition.d.ts +2 -2
  53. package/dist/v3/retryDisposition.js +0 -7
  54. package/dist/v3/security.d.ts +1 -10
  55. package/dist/v3/security.js +2 -9
  56. package/dist/vendor/tr46.d.ts +4 -0
  57. package/dist/vendor/tr46.js +37 -32
  58. package/package.json +19 -17
  59. package/sbom/cyclonedx.json +62 -62
  60. package/sbom/spdx.json +65 -65
  61. package/dist/browser/connectSession.d.ts +0 -13
  62. package/dist/browser/connectSession.js +0 -40
  63. package/dist/browser/runtimeCapability.d.ts +0 -13
  64. package/dist/browser/runtimeCapability.js +0 -27
  65. package/dist/browser/sessionRuntime.d.ts +0 -2
  66. package/dist/browser/sessionRuntime.js +0 -21
  67. package/dist/browser/v2.d.ts +0 -3
  68. package/dist/browser/v2.js +0 -2
  69. package/dist/browser/webTransportClient.d.ts +0 -8
  70. package/dist/browser/webTransportClient.js +0 -55
  71. package/dist/connectionController.d.ts +0 -55
  72. package/dist/connectionController.js +0 -441
  73. package/dist/connector/adapters/rawQuicCandidate.d.ts +0 -5
  74. package/dist/connector/adapters/rawQuicCandidate.js +0 -71
  75. package/dist/connector/adapters/webSocketCandidate.d.ts +0 -7
  76. package/dist/connector/adapters/webSocketCandidate.js +0 -116
  77. package/dist/connector/adapters/webTransportCandidate.d.ts +0 -5
  78. package/dist/connector/adapters/webTransportCandidate.js +0 -73
  79. package/dist/connector/admissionCommit.d.ts +0 -31
  80. package/dist/connector/admissionCommit.js +0 -239
  81. package/dist/connector/sessionAcceptor.d.ts +0 -38
  82. package/dist/connector/sessionAcceptor.js +0 -158
  83. package/dist/connector/sessionConfig.d.ts +0 -3
  84. package/dist/connector/sessionConfig.js +0 -30
  85. package/dist/connector/sessionConnector.d.ts +0 -47
  86. package/dist/connector/sessionConnector.js +0 -606
  87. package/dist/node/connectSession.d.ts +0 -23
  88. package/dist/node/connectSession.js +0 -93
  89. package/dist/node/controlplane.d.ts +0 -137
  90. package/dist/node/controlplane.js +0 -443
  91. package/dist/node/rawQuicAdapter.d.ts +0 -9
  92. package/dist/node/rawQuicServer.d.ts +0 -24
  93. package/dist/node/rawQuicServer.js +0 -37
  94. package/dist/node/runtimeCapability.d.ts +0 -14
  95. package/dist/node/runtimeCapability.js +0 -24
  96. package/dist/node/sessionRuntime.d.ts +0 -2
  97. package/dist/node/sessionRuntime.js +0 -13
  98. package/dist/node/tunnelRuntime.d.ts +0 -42
  99. package/dist/node/tunnelRuntime.js +0 -559
  100. package/dist/node/v2.d.ts +0 -11
  101. package/dist/node/v2.js +0 -6
  102. package/dist/node/webSocketServer.d.ts +0 -24
  103. package/dist/node/webSocketServer.js +0 -135
  104. package/dist/public/artifact.d.ts +0 -11
  105. package/dist/public/artifact.js +0 -44
  106. package/dist/public/artifactLease.d.ts +0 -10
  107. package/dist/public/artifactLease.js +0 -41
  108. package/dist/public/connectError.d.ts +0 -6
  109. package/dist/public/connectError.js +0 -9
  110. package/dist/transport/webSocketAdapter.d.ts +0 -31
  111. package/dist/transport/webSocketAdapter.js +0 -370
  112. package/dist/transport/webTransportAdapter.d.ts +0 -27
  113. package/dist/transport/webTransportAdapter.js +0 -534
  114. package/dist/v2/admissionError.d.ts +0 -4
  115. package/dist/v2/admissionError.js +0 -8
  116. package/dist/v2/artifact.d.ts +0 -128
  117. package/dist/v2/artifact.js +0 -1131
  118. package/dist/v2/artifactLease.d.ts +0 -1
  119. package/dist/v2/artifactLease.js +0 -7
  120. package/dist/v2/capability.d.ts +0 -29
  121. package/dist/v2/capability.js +0 -190
  122. package/dist/v2/carrier.d.ts +0 -84
  123. package/dist/v2/carrier.js +0 -411
  124. package/dist/v2/contract.d.ts +0 -46
  125. package/dist/v2/contract.js +0 -1
  126. package/dist/v2/handshake.d.ts +0 -80
  127. package/dist/v2/handshake.js +0 -470
  128. package/dist/v2/index.d.ts +0 -14
  129. package/dist/v2/index.js +0 -7
  130. package/dist/v2/opaqueArtifact.d.ts +0 -1
  131. package/dist/v2/opaqueArtifact.js +0 -2
  132. package/dist/v2/protocol.d.ts +0 -99
  133. package/dist/v2/protocol.js +0 -737
  134. package/dist/v2/publicSession.d.ts +0 -1
  135. package/dist/v2/publicSession.js +0 -281
  136. package/dist/v2/retryDisposition.d.ts +0 -16
  137. package/dist/v2/retryDisposition.js +0 -30
  138. package/dist/v2/session.d.ts +0 -310
  139. package/dist/v2/session.js +0 -2127
  140. package/dist/v2/streamLifetimeLedger.d.ts +0 -31
  141. package/dist/v2/streamLifetimeLedger.js +0 -131
  142. package/dist/v2/streamMetadata.d.ts +0 -1
  143. package/dist/v2/streamMetadata.js +0 -7
  144. package/dist/v2/unreliableMessage.d.ts +0 -43
  145. package/dist/v2/unreliableMessage.js +0 -254
@@ -1,5 +1,5 @@
1
1
  import { SessionError, } from "./contract.js";
2
- import { validApplicationStreamKind } from "../v2/protocol.js";
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 { canonicalStreamMetadataJSONV2Internal } from "../v2/protocol.js";
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 = canonicalStreamMetadataJSONV2Internal(values);
21
+ const canonical = canonicalStreamMetadataJSONV3Internal(values);
22
22
  return StreamMetadata.fromCanonicalValues(deepFreeze(JSON.parse(canonical)));
23
23
  }
24
24
  catch {
@@ -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 | undefined;
5
- constructor(code: RuntimeErrorCode, message: string, cause?: unknown | undefined);
4
+ readonly cause?: unknown;
5
+ constructor(code: RuntimeErrorCode, message: string, cause?: unknown);
6
6
  }
@@ -0,0 +1,2 @@
1
+ export declare const testCertificatePEM: string;
2
+ export declare const testPrivateKeyPEM: string;
@@ -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
+ }
@@ -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";
@@ -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
- }
@@ -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 { toASCII } from "../vendor/tr46.js";
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 ascii = toASCII(host, {
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,
@@ -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 | undefined;
6
- constructor(code: CarrierErrorCode, message: string, cause?: unknown | undefined);
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>;
@@ -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 ?? value.absoluteUnixMilliseconds;
271
- if (deadline === undefined || !Number.isSafeInteger(deadline) || deadline < 0 ||
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) {
@@ -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
- !unicode15_1Assigned(codePoint)) {
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 { ConnectErrorCode } from "../public/connectError.js";
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: ConnectErrorCode;
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" });
@@ -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";
@@ -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 legacy = value.absoluteUnixMilliseconds;
112
- const canonical = value.notBeforeUnixMilliseconds;
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);
@@ -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
+ }>;