@floegence/flowersec-core 3.2.1 → 4.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 (133) 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/integration.d.ts +5 -5
  30. package/dist/proxy/integration.js +2 -2
  31. package/dist/public/streamHandlers.d.ts +0 -3
  32. package/dist/public/streamHandlers.js +2 -4
  33. package/dist/public/streamMetadata.js +2 -2
  34. package/dist/runtime/errors.d.ts +2 -2
  35. package/dist/testSupport/tlsFixture.d.ts +2 -0
  36. package/dist/testSupport/tlsFixture.js +8 -0
  37. package/dist/utils/errors.d.ts +0 -2
  38. package/dist/utils/errors.js +0 -80
  39. package/dist/v3/artifact.js +17 -3
  40. package/dist/v3/carrier.d.ts +2 -2
  41. package/dist/v3/protocol.js +2 -103
  42. package/dist/v3/retryDisposition.d.ts +2 -2
  43. package/dist/v3/retryDisposition.js +0 -7
  44. package/dist/vendor/tr46.d.ts +4 -0
  45. package/dist/vendor/tr46.js +37 -32
  46. package/package.json +19 -17
  47. package/sbom/cyclonedx.json +62 -62
  48. package/sbom/spdx.json +65 -65
  49. package/dist/browser/connectSession.d.ts +0 -13
  50. package/dist/browser/connectSession.js +0 -40
  51. package/dist/browser/runtimeCapability.d.ts +0 -13
  52. package/dist/browser/runtimeCapability.js +0 -27
  53. package/dist/browser/sessionRuntime.d.ts +0 -2
  54. package/dist/browser/sessionRuntime.js +0 -21
  55. package/dist/browser/v2.d.ts +0 -3
  56. package/dist/browser/v2.js +0 -2
  57. package/dist/browser/webTransportClient.d.ts +0 -8
  58. package/dist/browser/webTransportClient.js +0 -55
  59. package/dist/connectionController.d.ts +0 -55
  60. package/dist/connectionController.js +0 -441
  61. package/dist/connector/adapters/rawQuicCandidate.d.ts +0 -5
  62. package/dist/connector/adapters/rawQuicCandidate.js +0 -71
  63. package/dist/connector/adapters/webSocketCandidate.d.ts +0 -7
  64. package/dist/connector/adapters/webSocketCandidate.js +0 -116
  65. package/dist/connector/adapters/webTransportCandidate.d.ts +0 -5
  66. package/dist/connector/adapters/webTransportCandidate.js +0 -73
  67. package/dist/connector/admissionCommit.d.ts +0 -31
  68. package/dist/connector/admissionCommit.js +0 -239
  69. package/dist/connector/sessionAcceptor.d.ts +0 -38
  70. package/dist/connector/sessionAcceptor.js +0 -158
  71. package/dist/connector/sessionConfig.d.ts +0 -3
  72. package/dist/connector/sessionConfig.js +0 -30
  73. package/dist/connector/sessionConnector.d.ts +0 -47
  74. package/dist/connector/sessionConnector.js +0 -606
  75. package/dist/node/connectSession.d.ts +0 -23
  76. package/dist/node/connectSession.js +0 -93
  77. package/dist/node/controlplane.d.ts +0 -137
  78. package/dist/node/controlplane.js +0 -443
  79. package/dist/node/rawQuicAdapter.d.ts +0 -9
  80. package/dist/node/rawQuicServer.d.ts +0 -24
  81. package/dist/node/rawQuicServer.js +0 -37
  82. package/dist/node/runtimeCapability.d.ts +0 -14
  83. package/dist/node/runtimeCapability.js +0 -24
  84. package/dist/node/sessionRuntime.d.ts +0 -2
  85. package/dist/node/sessionRuntime.js +0 -13
  86. package/dist/node/tunnelRuntime.d.ts +0 -42
  87. package/dist/node/tunnelRuntime.js +0 -559
  88. package/dist/node/v2.d.ts +0 -11
  89. package/dist/node/v2.js +0 -6
  90. package/dist/node/webSocketServer.d.ts +0 -24
  91. package/dist/node/webSocketServer.js +0 -135
  92. package/dist/public/artifact.d.ts +0 -11
  93. package/dist/public/artifact.js +0 -44
  94. package/dist/public/artifactLease.d.ts +0 -10
  95. package/dist/public/artifactLease.js +0 -41
  96. package/dist/public/connectError.d.ts +0 -6
  97. package/dist/public/connectError.js +0 -9
  98. package/dist/transport/webSocketAdapter.d.ts +0 -31
  99. package/dist/transport/webSocketAdapter.js +0 -370
  100. package/dist/transport/webTransportAdapter.d.ts +0 -27
  101. package/dist/transport/webTransportAdapter.js +0 -534
  102. package/dist/v2/admissionError.d.ts +0 -4
  103. package/dist/v2/admissionError.js +0 -8
  104. package/dist/v2/artifact.d.ts +0 -128
  105. package/dist/v2/artifact.js +0 -1131
  106. package/dist/v2/artifactLease.d.ts +0 -1
  107. package/dist/v2/artifactLease.js +0 -7
  108. package/dist/v2/capability.d.ts +0 -29
  109. package/dist/v2/capability.js +0 -190
  110. package/dist/v2/carrier.d.ts +0 -84
  111. package/dist/v2/carrier.js +0 -411
  112. package/dist/v2/contract.d.ts +0 -46
  113. package/dist/v2/contract.js +0 -1
  114. package/dist/v2/handshake.d.ts +0 -80
  115. package/dist/v2/handshake.js +0 -470
  116. package/dist/v2/index.d.ts +0 -14
  117. package/dist/v2/index.js +0 -7
  118. package/dist/v2/opaqueArtifact.d.ts +0 -1
  119. package/dist/v2/opaqueArtifact.js +0 -2
  120. package/dist/v2/protocol.d.ts +0 -99
  121. package/dist/v2/protocol.js +0 -737
  122. package/dist/v2/publicSession.d.ts +0 -1
  123. package/dist/v2/publicSession.js +0 -281
  124. package/dist/v2/retryDisposition.d.ts +0 -16
  125. package/dist/v2/retryDisposition.js +0 -30
  126. package/dist/v2/session.d.ts +0 -310
  127. package/dist/v2/session.js +0 -2127
  128. package/dist/v2/streamLifetimeLedger.d.ts +0 -31
  129. package/dist/v2/streamLifetimeLedger.js +0 -131
  130. package/dist/v2/streamMetadata.d.ts +0 -1
  131. package/dist/v2/streamMetadata.js +0 -7
  132. package/dist/v2/unreliableMessage.d.ts +0 -43
  133. package/dist/v2/unreliableMessage.js +0 -254
@@ -1 +0,0 @@
1
- export {};
@@ -1,7 +0,0 @@
1
- import { commitArtifactLeaseSpend, createArtifactLease } from "../public/artifactLease.js";
2
- /** @internal */
3
- export { ArtifactLease, ArtifactLeaseError, createArtifactLease } from "../public/artifactLease.js";
4
- /** @internal */
5
- export const createArtifactLeaseV2 = createArtifactLease;
6
- /** @internal */
7
- export const commitArtifactLeaseSpendV2 = commitArtifactLeaseSpend;
@@ -1,29 +0,0 @@
1
- import type { CarrierKind, PathKind } from "./contract.js";
2
- export type NetworkModeV2 = "dial" | "listen";
3
- export type SessionRoleV2 = "client" | "server";
4
- export type RuntimeCapabilityTupleV2 = Readonly<{
5
- carrier: CarrierKind;
6
- networkMode: NetworkModeV2;
7
- path: PathKind;
8
- sessionRole: SessionRoleV2;
9
- reliableStreams: boolean;
10
- datagrams: boolean;
11
- migration: boolean;
12
- }>;
13
- export type UnsupportedRuntimeCarrierV2 = Readonly<{
14
- carrier: CarrierKind;
15
- reason: string;
16
- }>;
17
- export type RuntimeCapabilityDescriptorV2 = Readonly<{
18
- language: string;
19
- runtime: string;
20
- schemaVersion: 2;
21
- tuples: readonly RuntimeCapabilityTupleV2[];
22
- unsupported: readonly UnsupportedRuntimeCarrierV2[];
23
- }>;
24
- export declare function defineRuntimeCapabilityDescriptorV2(runtime: string, tuples: readonly RuntimeCapabilityTupleV2[], unsupportedCarriers: readonly UnsupportedRuntimeCarrierV2[]): RuntimeCapabilityDescriptorV2;
25
- export declare function encodeRuntimeCapabilityDescriptorV2(descriptor: RuntimeCapabilityDescriptorV2): string;
26
- export declare function decodeRuntimeCapabilityDescriptorV2(raw: string): RuntimeCapabilityDescriptorV2;
27
- export declare function runtimeCapabilityDigestV2(descriptor: RuntimeCapabilityDescriptorV2): Uint8Array;
28
- export declare function runtimeCapabilityDigestHexV2(descriptor: RuntimeCapabilityDescriptorV2): string;
29
- export declare function validateRuntimeCapabilityDescriptorV2(descriptor: RuntimeCapabilityDescriptorV2): void;
@@ -1,190 +0,0 @@
1
- import { sha256 } from "@noble/hashes/sha2.js";
2
- const encoder = new TextEncoder();
3
- const carriers = Object.freeze(["raw_quic", "websocket", "webtransport"]);
4
- const registryToken = /^[a-z][a-z0-9_]{0,127}$/;
5
- const digestLabel = encoder.encode("flowersec-v2-runtime-capability\0");
6
- export function defineRuntimeCapabilityDescriptorV2(runtime, tuples, unsupportedCarriers) {
7
- const value = {
8
- language: "typescript",
9
- runtime,
10
- schemaVersion: 2,
11
- tuples: Object.freeze(tuples.map((entry) => Object.freeze({ ...entry }))),
12
- unsupported: Object.freeze(unsupportedCarriers.map((entry) => Object.freeze({ ...entry }))),
13
- };
14
- validateRuntimeCapabilityDescriptorV2(value);
15
- return Object.freeze(value);
16
- }
17
- export function encodeRuntimeCapabilityDescriptorV2(descriptor) {
18
- validateRuntimeCapabilityDescriptorV2(descriptor);
19
- return JSON.stringify({
20
- language: descriptor.language,
21
- runtime: descriptor.runtime,
22
- schemaVersion: descriptor.schemaVersion,
23
- tuples: descriptor.tuples.map(({ carrier, networkMode, path, sessionRole, reliableStreams, datagrams, migration, }) => ({
24
- carrier, datagrams, migration, networkMode, path, reliableStreams, sessionRole,
25
- })),
26
- unsupported: descriptor.unsupported.map(({ carrier, reason }) => ({ carrier, reason })),
27
- });
28
- }
29
- export function decodeRuntimeCapabilityDescriptorV2(raw) {
30
- const parsed = JSON.parse(raw);
31
- const value = decodeDescriptor(parsed);
32
- const canonical = encodeRuntimeCapabilityDescriptorV2(value);
33
- if (canonical !== raw)
34
- throw new TypeError("runtime capability descriptor is not canonical JSON");
35
- return value;
36
- }
37
- export function runtimeCapabilityDigestV2(descriptor) {
38
- const canonical = encoder.encode(encodeRuntimeCapabilityDescriptorV2(descriptor));
39
- const length = new Uint8Array(4);
40
- new DataView(length.buffer).setUint32(0, canonical.length);
41
- const preimage = new Uint8Array(digestLabel.length + length.length + canonical.length);
42
- preimage.set(digestLabel, 0);
43
- preimage.set(length, digestLabel.length);
44
- preimage.set(canonical, digestLabel.length + length.length);
45
- return sha256(preimage);
46
- }
47
- export function runtimeCapabilityDigestHexV2(descriptor) {
48
- return Array.from(runtimeCapabilityDigestV2(descriptor), (value) => value.toString(16).padStart(2, "0")).join("");
49
- }
50
- export function validateRuntimeCapabilityDescriptorV2(descriptor) {
51
- if (descriptor.schemaVersion !== 2 || !registryToken.test(descriptor.language) ||
52
- !registryToken.test(descriptor.runtime) || descriptor.tuples.length + descriptor.unsupported.length === 0) {
53
- throw new TypeError("invalid runtime capability descriptor header");
54
- }
55
- const supported = new Set();
56
- let previousTuple;
57
- for (const current of descriptor.tuples) {
58
- validateTuple(current);
59
- if (previousTuple !== undefined && compareTuple(previousTuple, current) >= 0) {
60
- throw new TypeError("runtime capability tuples must be unique and canonically sorted");
61
- }
62
- supported.add(current.carrier);
63
- previousTuple = current;
64
- }
65
- const unavailable = new Set();
66
- let previousUnsupported;
67
- for (const current of descriptor.unsupported) {
68
- if (!carriers.includes(current.carrier) || !registryToken.test(current.reason) || supported.has(current.carrier)) {
69
- throw new TypeError("invalid unsupported runtime carrier");
70
- }
71
- if (previousUnsupported !== undefined && compareUnsupported(previousUnsupported, current) >= 0) {
72
- throw new TypeError("unsupported runtime carriers must be unique and canonically sorted");
73
- }
74
- unavailable.add(current.carrier);
75
- previousUnsupported = current;
76
- }
77
- for (const carrier of carriers) {
78
- if (supported.has(carrier) === unavailable.has(carrier)) {
79
- throw new TypeError(`runtime capability must support or explicitly reject ${carrier}`);
80
- }
81
- }
82
- }
83
- function decodeDescriptor(input) {
84
- const object = exactObject(input, ["language", "runtime", "schemaVersion", "tuples", "unsupported"]);
85
- if (!Array.isArray(object.tuples) || !Array.isArray(object.unsupported)) {
86
- throw new TypeError("runtime capability collections must be arrays");
87
- }
88
- const tuples = object.tuples.map((input) => {
89
- const value = exactObject(input, [
90
- "carrier", "networkMode", "path", "sessionRole", "reliableStreams", "datagrams", "migration",
91
- ]);
92
- if (typeof value.reliableStreams !== "boolean" || typeof value.datagrams !== "boolean" ||
93
- typeof value.migration !== "boolean") {
94
- throw new TypeError("invalid runtime capability features");
95
- }
96
- const decoded = Object.freeze({
97
- carrier: requireCarrier(value.carrier),
98
- networkMode: requireNetworkMode(value.networkMode),
99
- path: requirePath(value.path),
100
- sessionRole: requireSessionRole(value.sessionRole),
101
- reliableStreams: true,
102
- datagrams: value.datagrams,
103
- migration: value.migration,
104
- });
105
- if (decoded.reliableStreams !== value.reliableStreams) {
106
- throw new TypeError("runtime capability requires reliable streams");
107
- }
108
- return decoded;
109
- });
110
- const unsupportedCarriers = object.unsupported.map((input) => {
111
- const value = exactObject(input, ["carrier", "reason"]);
112
- if (typeof value.reason !== "string")
113
- throw new TypeError("unsupported reason must be a string");
114
- return Object.freeze({ carrier: requireCarrier(value.carrier), reason: value.reason });
115
- });
116
- if (typeof object.language !== "string" || typeof object.runtime !== "string" || object.schemaVersion !== 2) {
117
- throw new TypeError("invalid runtime capability descriptor header");
118
- }
119
- const result = Object.freeze({
120
- language: object.language,
121
- runtime: object.runtime,
122
- schemaVersion: 2,
123
- tuples: Object.freeze(tuples),
124
- unsupported: Object.freeze(unsupportedCarriers),
125
- });
126
- validateRuntimeCapabilityDescriptorV2(result);
127
- return result;
128
- }
129
- function validateTuple(value) {
130
- if (!carriers.includes(value.carrier) || !["dial", "listen"].includes(value.networkMode) ||
131
- !["direct", "tunnel"].includes(value.path) || !["client", "server"].includes(value.sessionRole) ||
132
- value.reliableStreams !== true || typeof value.datagrams !== "boolean" || typeof value.migration !== "boolean") {
133
- throw new TypeError("invalid runtime capability tuple");
134
- }
135
- if (value.carrier === "websocket" && (value.datagrams || value.migration)) {
136
- throw new TypeError("WebSocket runtime capability cannot advertise datagrams or migration");
137
- }
138
- const valid = value.path === "direct"
139
- ? (value.networkMode === "dial" && value.sessionRole === "client") ||
140
- (value.networkMode === "listen" && value.sessionRole === "server")
141
- : value.networkMode === "dial";
142
- if (!valid)
143
- throw new TypeError("invalid runtime capability deployment role");
144
- }
145
- function compareTuple(left, right) {
146
- return compareStrings([left.carrier, left.networkMode, left.sessionRole, left.path], [right.carrier, right.networkMode, right.sessionRole, right.path]);
147
- }
148
- function compareUnsupported(left, right) {
149
- return left.carrier < right.carrier ? -1 : left.carrier > right.carrier ? 1 : 0;
150
- }
151
- function compareStrings(left, right) {
152
- for (let index = 0; index < left.length; index++) {
153
- if (left[index] < right[index])
154
- return -1;
155
- if (left[index] > right[index])
156
- return 1;
157
- }
158
- return 0;
159
- }
160
- function exactObject(input, keys) {
161
- if (typeof input !== "object" || input === null || Array.isArray(input))
162
- throw new TypeError("expected object");
163
- const object = input;
164
- const actual = Object.keys(object).sort();
165
- const expected = [...keys].sort();
166
- if (actual.length !== expected.length || actual.some((key, index) => key !== expected[index])) {
167
- throw new TypeError("runtime capability object has unknown or missing fields");
168
- }
169
- return object;
170
- }
171
- function requireCarrier(value) {
172
- if (typeof value !== "string" || !carriers.includes(value))
173
- throw new TypeError("invalid carrier");
174
- return value;
175
- }
176
- function requireNetworkMode(value) {
177
- if (value !== "dial" && value !== "listen")
178
- throw new TypeError("invalid network mode");
179
- return value;
180
- }
181
- function requireSessionRole(value) {
182
- if (value !== "client" && value !== "server")
183
- throw new TypeError("invalid session role");
184
- return value;
185
- }
186
- function requirePath(value) {
187
- if (value !== "direct" && value !== "tunnel")
188
- throw new TypeError("invalid path");
189
- return value;
190
- }
@@ -1,84 +0,0 @@
1
- import type { CarrierKind, OperationOptionsV2, PathKind } from "./contract.js";
2
- export type CarrierErrorCode = "aborted" | "closed" | "reset" | "stop_sending" | "stop_sending_unavailable" | "write_closed" | "datagram_unavailable";
3
- export declare class CarrierError extends Error {
4
- readonly code: CarrierErrorCode;
5
- readonly cause?: unknown | undefined;
6
- constructor(code: CarrierErrorCode, message: string, cause?: unknown | undefined);
7
- }
8
- export interface CarrierStreamV2 {
9
- read(options?: OperationOptionsV2): Promise<Uint8Array | null>;
10
- write(data: Uint8Array, options?: OperationOptionsV2): Promise<number>;
11
- closeWrite(): Promise<void>;
12
- stopSending(): Promise<void>;
13
- reset(): Promise<void>;
14
- /**
15
- * Synchronously initiates idempotent forced teardown. Pending and future
16
- * stream primitives must settle, but this call does not await cleanup.
17
- */
18
- abort(error?: Error): void;
19
- }
20
- export interface CarrierUnreliableDatagramsV2 {
21
- readonly maxDatagramSize: number;
22
- send(data: Uint8Array, options?: Readonly<{
23
- signal?: AbortSignal;
24
- expiresAt?: number;
25
- }>): Promise<"accepted" | "dropped_budget" | "dropped_expired" | "dropped_carrier">;
26
- receive(options?: OperationOptionsV2): Promise<Uint8Array>;
27
- }
28
- export interface CarrierSessionV2 {
29
- readonly kind: CarrierKind;
30
- readonly path: PathKind;
31
- readonly inboundBidirectionalStreamCapacity: number;
32
- readonly unreliableDatagrams?: CarrierUnreliableDatagramsV2 | undefined;
33
- openStream(options?: OperationOptionsV2): Promise<CarrierStreamV2>;
34
- acceptStream(options?: OperationOptionsV2): Promise<CarrierStreamV2>;
35
- waitTermination(): Promise<void>;
36
- close(error?: Readonly<{
37
- code: number;
38
- reason: string;
39
- }>): Promise<void>;
40
- /**
41
- * Synchronously initiates idempotent forced teardown. Pending and future
42
- * session and stream primitives must settle, but this call does not await cleanup.
43
- */
44
- abort(error?: Readonly<{
45
- code: number;
46
- reason: string;
47
- }>): void;
48
- }
49
- export type NativeCarrierStreamV2 = Readonly<{
50
- read(): Promise<Uint8Array | null>;
51
- write(data: Uint8Array): Promise<number>;
52
- closeWrite(): Promise<void>;
53
- stopSending(): Promise<void>;
54
- reset(): Promise<void>;
55
- /** Cancels pending local primitives without initiating peer-visible teardown. */
56
- cancelPending?(): void;
57
- /** See {@link CarrierStreamV2.abort}. */
58
- abort(error?: Error): void;
59
- }>;
60
- export type NativeCarrierSessionV2 = Readonly<{
61
- kind: "webtransport" | "raw_quic";
62
- path: PathKind;
63
- inboundBidirectionalStreamCapacity: number;
64
- unreliableDatagrams?: CarrierUnreliableDatagramsV2 | undefined;
65
- openStream(options?: OperationOptionsV2): Promise<NativeCarrierStreamV2>;
66
- acceptStream(options?: OperationOptionsV2): Promise<NativeCarrierStreamV2>;
67
- waitTermination(): Promise<void>;
68
- close(error?: Readonly<{
69
- code: number;
70
- reason: string;
71
- }>): Promise<void>;
72
- /** See {@link CarrierSessionV2.abort}. */
73
- abort(error?: Readonly<{
74
- code: number;
75
- reason: string;
76
- }>): void;
77
- }>;
78
- export declare function adaptNativeCarrierSessionV2(native: NativeCarrierSessionV2): CarrierSessionV2;
79
- export declare function createMemoryCarrierPairV2(options: Readonly<{
80
- kind: CarrierKind;
81
- path: PathKind;
82
- inboundBidirectionalStreamCapacity: number;
83
- maxPendingStreams?: number;
84
- }>): readonly [CarrierSessionV2, CarrierSessionV2];