@floegence/flowersec-core 3.0.1 → 3.0.4

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 CHANGED
@@ -15,7 +15,7 @@ npm install @floegence/flowersec-core
15
15
 
16
16
  - `@floegence/flowersec-core` exports the portable artifact, lease, session, stream, RPC, stream-metadata, and connection-controller API, plus profile-owned unreliable messages when negotiated.
17
17
  - `@floegence/flowersec-core/browser` adds `connect(...)`, `createConnectionController(...)`, and their options.
18
- - `@floegence/flowersec-core/node` adds the V3 `connect(...)`, `createConnectionController(...)`, direct-only `createAcceptor(...)`, opaque `createTunnelRuntime(...)`, `AcceptedSession`, `SessionHandlers`, and `RPCHandlers` APIs. Legacy V2 server, control-plane, and `ProxyServer` APIs are available only under the explicit `node.v2` namespace.
18
+ - `@floegence/flowersec-core/node` adds the V3 `connect(...)`, `createConnectionController(...)`, direct-only `createAcceptor(...)`, opaque `createTunnelRuntime(...)`, `AcceptedSession`, `SessionHandlers`, and `RPCHandlers` APIs. Legacy V2 server, control-plane, and `ProxyServer` APIs are available only under the explicit `node.v2` namespace; the Go control-plane remains the only v3 invitation issuer.
19
19
  - `@floegence/flowersec-core/proxy` adds the `Session`-based HTTP/WebSocket runtime, Service Worker and controller/app-window bridges, strict `proxy.runtime@2` validation, and `connectProxyBrowser(...)` composition.
20
20
 
21
21
  The root type exports are:
@@ -151,7 +151,8 @@ Flowersec-owned optional native addon wrapper and one of its supported
151
151
  prebuilt platform packages; it never loads from the browser entrypoint. The
152
152
  wrapper selects the matching optional package for macOS arm64/x64 or Linux
153
153
  arm64/x64 glibc. Windows and musl packages are not published. The V3 Node
154
- entrypoint keeps the control plane and `ProxyServer` behind `node.v2`; the
154
+ entrypoint keeps the legacy control plane and `ProxyServer` behind `node.v2`; it
155
+ does not issue v3 invitations, which are produced by the Go control-plane. The
155
156
  relay never terminates an E2EE Session. WebTransport is an optional adapter
156
157
  profile and the Node.js runtime
157
158
  does not currently expose a production adapter.
@@ -3,6 +3,11 @@
3
3
  This file is generated from the canonical Flowersec source dependency inventory for flowersec-ts.
4
4
  Do not edit it manually. License decisions are reviewed by the repository source license policy.
5
5
 
6
+ - @floegence/flowersec-node-native 3.0.4 (Declared: MIT; selected: MIT; source: https://github.com/floegence/flowersec.git)
7
+ - @floegence/flowersec-node-native-darwin-arm64 3.0.4 (Declared: MIT; selected: MIT; source: https://github.com/floegence/flowersec.git)
8
+ - @floegence/flowersec-node-native-darwin-x64 3.0.4 (Declared: MIT; selected: MIT; source: https://github.com/floegence/flowersec.git)
9
+ - @floegence/flowersec-node-native-linux-arm64-gnu 3.0.4 (Declared: MIT; selected: MIT; source: https://github.com/floegence/flowersec.git)
10
+ - @floegence/flowersec-node-native-linux-x64-gnu 3.0.4 (Declared: MIT; selected: MIT; source: https://github.com/floegence/flowersec.git)
6
11
  - @noble/ciphers 2.3.0 (Declared: MIT; selected: MIT; source: https://registry.npmjs.org/@noble/ciphers/-/ciphers-2.3.0.tgz)
7
12
  - @noble/curves 2.3.0 (Declared: MIT; selected: MIT; source: https://registry.npmjs.org/@noble/curves/-/curves-2.3.0.tgz)
8
13
  - @noble/hashes 2.3.0 (Declared: MIT; selected: MIT; source: https://registry.npmjs.org/@noble/hashes/-/hashes-2.3.0.tgz)
@@ -385,6 +385,8 @@ export function decodeStreamKeyUpdateACKV2(raw) {
385
385
  assertLogicalStreamID(value.logicalStreamID);
386
386
  if (value.transition === 0n)
387
387
  throw new ProtocolV2Error("stream rekey transition must be non-zero");
388
+ if (value.epoch === 0)
389
+ throw new ProtocolV2Error("stream rekey epoch must be non-zero");
388
390
  return value;
389
391
  }
390
392
  export function buildRecordAAD(h3, logicalStreamID, direction, rawHeader) {
@@ -135,6 +135,7 @@ export declare class SessionV2 implements SessionV2Contract {
135
135
  private idleWatchdogStarted;
136
136
  private idleTimerCancel;
137
137
  private readonly terminationState;
138
+ private readonly terminationController;
138
139
  private readonly rpcRouter;
139
140
  constructor(carrier: CarrierSessionV2, control: CarrierStreamV2, controlReader: ExactReader, config: SessionConfigV2, material: HandshakeMaterial);
140
141
  openStream(kind: string, options?: InternalStreamOpenOptionsV2): Promise<ByteStreamV2>;
@@ -149,6 +150,7 @@ export declare class SessionV2 implements SessionV2Contract {
149
150
  installReceiveRoots(epoch: number, roots: EpochRootsV2): void;
150
151
  transcriptHash(): Uint8Array;
151
152
  receiveDirectionValue(): DirectionV2;
153
+ terminationSignal(): AbortSignal;
152
154
  sendStreamRecord(stream: EncryptedStreamV2, type: InnerTypeV2, payload: Uint8Array, signal?: AbortSignal): Promise<void>;
153
155
  readStreamRecord(stream: EncryptedStreamV2): Promise<Readonly<{
154
156
  type: InnerTypeV2;
@@ -238,6 +240,7 @@ declare class EncryptedStreamV2 implements ByteStreamV2 {
238
240
  private pendingSendRekey;
239
241
  private lastSendRekeyACK;
240
242
  private receiveRekey;
243
+ private receiveRekeyChanged;
241
244
  constructor(session: SessionV2, carrier: CarrierStreamV2, id: bigint, kind: string, sendEpoch: number, receiveEpoch: number, permitRelease: () => void, reader?: ExactReader);
242
245
  read(options?: OperationOptionsV2): Promise<Uint8Array | null>;
243
246
  write(payload: Uint8Array, options?: OperationOptionsV2): Promise<number>;
@@ -253,6 +256,7 @@ declare class EncryptedStreamV2 implements ByteStreamV2 {
253
256
  }>;
254
257
  waitReceiveRekey(transition: bigint, epoch: number, signal?: AbortSignal): Promise<void>;
255
258
  publishReceiveRekey(transition: bigint, epoch: number): void;
259
+ private notifyReceiveRekeyChanged;
256
260
  startPump(): void;
257
261
  markOpen(): void;
258
262
  markTerminal(error: Error): boolean;
@@ -140,6 +140,7 @@ export class SessionV2 {
140
140
  idleWatchdogStarted = false;
141
141
  idleTimerCancel;
142
142
  terminationState = deferred();
143
+ terminationController = new AbortController();
143
144
  rpcRouter;
144
145
  constructor(carrier, control, controlReader, config, material) {
145
146
  this.carrier = carrier;
@@ -269,6 +270,9 @@ export class SessionV2 {
269
270
  receiveDirectionValue() {
270
271
  return this.receiveDirection;
271
272
  }
273
+ terminationSignal() {
274
+ return this.terminationController.signal;
275
+ }
272
276
  async sendStreamRecord(stream, type, payload, signal) {
273
277
  this.assertOpen();
274
278
  const inner = encodeInnerRecordV2(type, payload);
@@ -1080,6 +1084,7 @@ export class SessionV2 {
1080
1084
  fail(error, abortCarrier = true) {
1081
1085
  if (this.lifecycle === "closed")
1082
1086
  return;
1087
+ this.terminationController.abort(error);
1083
1088
  this.controlTerminalSealed = true;
1084
1089
  this.beginClosing();
1085
1090
  const normalPeerCarrierClose = this.sessionCloseCommitted && error instanceof CarrierError && error.code === "closed";
@@ -1147,6 +1152,7 @@ class EncryptedStreamV2 {
1147
1152
  pendingSendRekey;
1148
1153
  lastSendRekeyACK;
1149
1154
  receiveRekey;
1155
+ receiveRekeyChanged = deferred();
1150
1156
  constructor(session, carrier, id, kind, sendEpoch, receiveEpoch, permitRelease, reader) {
1151
1157
  this.session = session;
1152
1158
  this.carrier = carrier;
@@ -1256,7 +1262,7 @@ class EncryptedStreamV2 {
1256
1262
  await raceAbort(pending.acknowledged.promise, signal);
1257
1263
  return;
1258
1264
  }
1259
- await raceAbort(new Promise((resolve) => setTimeout(resolve, 0)), signal);
1265
+ await raceAbort(this.receiveRekeyChanged.promise, signal);
1260
1266
  if (this.terminalError !== undefined || this.remoteFIN)
1261
1267
  return;
1262
1268
  }
@@ -1266,6 +1272,11 @@ class EncryptedStreamV2 {
1266
1272
  this.receiveRekey = undefined;
1267
1273
  }
1268
1274
  }
1275
+ notifyReceiveRekeyChanged() {
1276
+ const changed = this.receiveRekeyChanged;
1277
+ this.receiveRekeyChanged = deferred();
1278
+ changed.resolve();
1279
+ }
1269
1280
  startPump() {
1270
1281
  if (this.pumpStarted)
1271
1282
  return;
@@ -1283,6 +1294,7 @@ class EncryptedStreamV2 {
1283
1294
  this.pendingSendRekey = undefined;
1284
1295
  pendingSendRekey?.armed.reject(error);
1285
1296
  pendingSendRekey?.done.reject(error);
1297
+ this.notifyReceiveRekeyChanged();
1286
1298
  this.opened.reject(error);
1287
1299
  this.data.fail(error);
1288
1300
  return true;
@@ -1412,11 +1424,12 @@ class EncryptedStreamV2 {
1412
1424
  this.receiveSequence = 0n;
1413
1425
  const pending = { transition, epoch: nextEpoch, acknowledged: deferred() };
1414
1426
  this.receiveRekey = pending;
1427
+ this.notifyReceiveRekeyChanged();
1415
1428
  await this.send(InnerTypeV2.StreamKeyUpdateACK, encodeStreamKeyUpdateACKV2({
1416
1429
  logicalStreamID: this.id,
1417
1430
  transition,
1418
1431
  epoch: nextEpoch,
1419
- }));
1432
+ }), this.session.terminationSignal());
1420
1433
  pending.acknowledged.resolve();
1421
1434
  }
1422
1435
  receiveStreamKeyUpdateACK(payload) {
@@ -38,6 +38,7 @@ export class ConnectionControllerV3 {
38
38
  #disposition;
39
39
  #scheduler;
40
40
  #closeOperation;
41
+ #transitionGeneration = 0;
41
42
  constructor(source, connector, options) {
42
43
  if (source === null || typeof source !== "object" || typeof source.acquire !== "function") {
43
44
  throw new TypeError("Flowersec v3 artifact source must provide acquire()");
@@ -131,8 +132,9 @@ export class ConnectionControllerV3 {
131
132
  this.#closeOperation = closeOperation;
132
133
  const active = this.#session;
133
134
  this.#session = undefined;
135
+ this.#failure = undefined;
134
136
  this.#disposition = undefined;
135
- this.#lifetime.abort(new ConnectionControllerV3Error("closed", this.#failure));
137
+ this.#lifetime.abort(new ConnectionControllerV3Error("closed"));
136
138
  this.#transition("closed");
137
139
  void Promise.allSettled([
138
140
  this.#scheduler ?? Promise.resolve(),
@@ -154,21 +156,29 @@ export class ConnectionControllerV3 {
154
156
  return;
155
157
  pendingDisposition = undefined;
156
158
  }
157
- if (!this.#cycle.beginAcquisition()) {
158
- this.#forceTerminalDisposition();
159
- return;
160
- }
161
159
  this.#disposition = undefined;
162
160
  this.#transition("connecting");
163
161
  if (this.#lifetime.signal.aborted)
164
162
  return;
163
+ if (this.#maximumAttempts !== 0 && this.#cycle.snapshot().attempts >= this.#maximumAttempts) {
164
+ this.#forceTerminalDisposition();
165
+ return;
166
+ }
165
167
  let capability;
166
168
  try {
167
169
  capability = this.#capabilitySnapshot();
168
170
  validateRuntimeCapabilityDescriptorV3(capability);
169
171
  }
170
172
  catch {
171
- this.#recordFailure("artifact", "artifact_invalid", { kind: "terminal" });
173
+ if (this.#lifetime.signal.aborted)
174
+ return;
175
+ this.#recordFailure("connect", "artifact_invalid", { kind: "terminal" });
176
+ return;
177
+ }
178
+ if (this.#lifetime.signal.aborted)
179
+ return;
180
+ if (!this.#cycle.beginAcquisition()) {
181
+ this.#forceTerminalDisposition();
172
182
  return;
173
183
  }
174
184
  const acquisition = await this.#acquire();
@@ -212,7 +222,7 @@ export class ConnectionControllerV3 {
212
222
  await retireArtifactLeaseV3(claim);
213
223
  this.#cycle.recordFailedAcquisitionOrLease();
214
224
  const error = new ConnectErrorV3("artifact_invalid", { kind: "terminal" });
215
- this.#recordFailure("artifact", error.code, error.disposition);
225
+ this.#recordFailure("connect", error.code, error.disposition);
216
226
  return;
217
227
  }
218
228
  try {
@@ -222,7 +232,7 @@ export class ConnectionControllerV3 {
222
232
  await retireArtifactLeaseV3(claim);
223
233
  this.#cycle.recordFailedAcquisitionOrLease();
224
234
  const error = new ConnectErrorV3("expired_artifact", { kind: "retryable" });
225
- this.#recordFailure("artifact", error.code, error.disposition);
235
+ this.#recordFailure("connect", error.code, error.disposition);
226
236
  if (this.#attemptBudgetExhausted())
227
237
  return;
228
238
  next = "primary";
@@ -523,8 +533,13 @@ export class ConnectionControllerV3 {
523
533
  if (this.#state === "closed" && state !== "closed")
524
534
  return;
525
535
  this.#state = state;
536
+ const generation = ++this.#transitionGeneration;
526
537
  const snapshot = this.#snapshot();
527
- for (const listener of this.#listeners) {
538
+ for (const listener of [...this.#listeners]) {
539
+ if (generation !== this.#transitionGeneration)
540
+ return;
541
+ if (!this.#listeners.has(listener))
542
+ continue;
528
543
  try {
529
544
  listener(snapshot);
530
545
  }
@@ -405,6 +405,8 @@ export function decodeStreamKeyUpdateACKV3(raw) {
405
405
  assertLogicalStreamID(value.logicalStreamID);
406
406
  if (value.transition === 0n)
407
407
  throw new ProtocolV3Error("stream rekey transition must be non-zero");
408
+ if (value.epoch === 0)
409
+ throw new ProtocolV3Error("stream rekey epoch must be non-zero");
408
410
  return value;
409
411
  }
410
412
  export function buildRecordAAD(h3, logicalStreamID, direction, rawHeader) {
@@ -136,6 +136,7 @@ export declare class SessionV3 implements SessionV3Contract {
136
136
  private idleDeadlineMs;
137
137
  private idleTimerCancel;
138
138
  private readonly terminationState;
139
+ private readonly terminationController;
139
140
  private readonly rpcRouter;
140
141
  constructor(carrier: CarrierSessionV3, control: CarrierStreamV3, controlReader: ExactReader, config: SessionConfigV3, material: HandshakeMaterial);
141
142
  openStream(kind: string, options?: InternalStreamOpenOptionsV3): Promise<ByteStreamV3>;
@@ -150,6 +151,7 @@ export declare class SessionV3 implements SessionV3Contract {
150
151
  installReceiveRoots(epoch: number, roots: EpochRootsV3): void;
151
152
  transcriptHash(): Uint8Array;
152
153
  receiveDirectionValue(): DirectionV3;
154
+ terminationSignal(): AbortSignal;
153
155
  sendStreamRecord(stream: EncryptedStreamV3, type: InnerTypeV3, payload: Uint8Array, signal?: AbortSignal): Promise<void>;
154
156
  readStreamRecord(stream: EncryptedStreamV3): Promise<Readonly<{
155
157
  type: InnerTypeV3;
@@ -244,6 +246,7 @@ declare class EncryptedStreamV3 implements ByteStreamV3 {
244
246
  private receiveRekey;
245
247
  private readonly sendMaterials;
246
248
  private readonly receiveMaterials;
249
+ private receiveRekeyChanged;
247
250
  constructor(session: SessionV3, carrier: CarrierStreamV3, id: bigint, kind: string, sendEpoch: number, receiveEpoch: number, permitRelease: () => void, reader?: ExactReader);
248
251
  read(options?: OperationOptionsV3): Promise<Uint8Array | null>;
249
252
  write(payload: Uint8Array, options?: OperationOptionsV3): Promise<number>;
@@ -259,6 +262,7 @@ declare class EncryptedStreamV3 implements ByteStreamV3 {
259
262
  }>;
260
263
  waitReceiveRekey(transition: bigint, epoch: number, signal?: AbortSignal): Promise<void>;
261
264
  publishReceiveRekey(transition: bigint, epoch: number): void;
265
+ private notifyReceiveRekeyChanged;
262
266
  startPump(): void;
263
267
  markOpen(): void;
264
268
  markTerminal(error: Error): boolean;
@@ -143,6 +143,7 @@ export class SessionV3 {
143
143
  idleDeadlineMs;
144
144
  idleTimerCancel;
145
145
  terminationState = deferred();
146
+ terminationController = new AbortController();
146
147
  rpcRouter;
147
148
  constructor(carrier, control, controlReader, config, material) {
148
149
  this.carrier = carrier;
@@ -279,6 +280,9 @@ export class SessionV3 {
279
280
  receiveDirectionValue() {
280
281
  return this.receiveDirection;
281
282
  }
283
+ terminationSignal() {
284
+ return this.terminationController.signal;
285
+ }
282
286
  async sendStreamRecord(stream, type, payload, signal) {
283
287
  this.assertOpen();
284
288
  const inner = encodeInnerRecordV3(type, payload);
@@ -1192,6 +1196,7 @@ export class SessionV3 {
1192
1196
  fail(error, abortCarrier = true) {
1193
1197
  if (this.lifecycle === "closed")
1194
1198
  return;
1199
+ this.terminationController.abort(error);
1195
1200
  this.controlTerminalSealed = true;
1196
1201
  this.beginClosing();
1197
1202
  const pendingSessionRekey = this.pendingSessionRekey;
@@ -1265,6 +1270,7 @@ class EncryptedStreamV3 {
1265
1270
  receiveRekey;
1266
1271
  sendMaterials = new Map();
1267
1272
  receiveMaterials = new Map();
1273
+ receiveRekeyChanged = deferred();
1268
1274
  constructor(session, carrier, id, kind, sendEpoch, receiveEpoch, permitRelease, reader) {
1269
1275
  this.session = session;
1270
1276
  this.carrier = carrier;
@@ -1374,7 +1380,7 @@ class EncryptedStreamV3 {
1374
1380
  await raceAbort(pending.acknowledged.promise, signal);
1375
1381
  return;
1376
1382
  }
1377
- await raceAbort(new Promise((resolve) => setTimeout(resolve, 0)), signal);
1383
+ await raceAbort(this.receiveRekeyChanged.promise, signal);
1378
1384
  if (this.terminalError !== undefined || this.remoteFIN)
1379
1385
  return;
1380
1386
  }
@@ -1384,6 +1390,11 @@ class EncryptedStreamV3 {
1384
1390
  this.receiveRekey = undefined;
1385
1391
  }
1386
1392
  }
1393
+ notifyReceiveRekeyChanged() {
1394
+ const changed = this.receiveRekeyChanged;
1395
+ this.receiveRekeyChanged = deferred();
1396
+ changed.resolve();
1397
+ }
1387
1398
  startPump() {
1388
1399
  if (this.pumpStarted)
1389
1400
  return;
@@ -1401,6 +1412,7 @@ class EncryptedStreamV3 {
1401
1412
  this.pendingSendRekey = undefined;
1402
1413
  pendingSendRekey?.armed.reject(error);
1403
1414
  pendingSendRekey?.done.reject(error);
1415
+ this.notifyReceiveRekeyChanged();
1404
1416
  this.opened.reject(error);
1405
1417
  this.data.fail(error);
1406
1418
  return true;
@@ -1558,11 +1570,12 @@ class EncryptedStreamV3 {
1558
1570
  pruneRecordMaterials(this.receiveMaterials, new Set(this.priorACK === undefined ? [nextEpoch] : [header.epoch, nextEpoch]));
1559
1571
  const pending = { transition, epoch: nextEpoch, acknowledged: deferred() };
1560
1572
  this.receiveRekey = pending;
1573
+ this.notifyReceiveRekeyChanged();
1561
1574
  await this.send(InnerTypeV3.StreamKeyUpdateACK, encodeStreamKeyUpdateACKV3({
1562
1575
  logicalStreamID: this.id,
1563
1576
  transition,
1564
1577
  epoch: nextEpoch,
1565
- }));
1578
+ }), this.session.terminationSignal());
1566
1579
  pending.acknowledged.resolve();
1567
1580
  }
1568
1581
  receiveStreamKeyUpdateACK(payload) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floegence/flowersec-core",
3
- "version": "3.0.1",
3
+ "version": "3.0.4",
4
4
  "description": "Flowersec core TypeScript library for carrier-neutral encrypted sessions and multiplexed streams.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -76,9 +76,6 @@
76
76
  "tr46": "5.0.0",
77
77
  "ws": "^8.21.2"
78
78
  },
79
- "optionalDependencies": {
80
- "@floegence/flowersec-node-native": "3.0.1"
81
- },
82
79
  "devDependencies": {
83
80
  "@playwright/test": "1.62.1",
84
81
  "@types/node": "^26.1.2",
@@ -95,5 +92,8 @@
95
92
  "vite": "^8.2.1",
96
93
  "vitest": "4.1.10"
97
94
  },
98
- "flowersecSourceCommit": "88d8064370733ca512b7994479d52fae33d91665"
95
+ "optionalDependencies": {
96
+ "@floegence/flowersec-node-native": "3.0.4"
97
+ },
98
+ "flowersecSourceCommit": "35dbe22a6aa1b10d53587e19a18232e2dfb2bbf4"
99
99
  }
@@ -1,24 +1,164 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.5",
4
- "serialNumber": "urn:uuid:7c0074af-2a58-5394-8572-4c22fd177e8a",
4
+ "serialNumber": "urn:uuid:cff299ba-9035-5c07-8271-4cad66e78e07",
5
5
  "version": 1,
6
6
  "metadata": {
7
7
  "component": {
8
8
  "type": "library",
9
9
  "name": "@floegence/flowersec-core",
10
- "version": "3.0.1",
11
- "purl": "pkg:npm/%40floegence/flowersec-core@3.0.1",
12
- "bom-ref": "pkg:npm/%40floegence/flowersec-core@3.0.1"
10
+ "version": "3.0.4",
11
+ "purl": "pkg:npm/%40floegence/flowersec-core@3.0.4",
12
+ "bom-ref": "pkg:npm/%40floegence/flowersec-core@3.0.4"
13
13
  },
14
14
  "properties": [
15
15
  {
16
16
  "name": "flowersec:source-inventory-sha256",
17
- "value": "428d40c24d97553e640a89f6e0397fed24c3106752eb8397571157fb9ea19172"
17
+ "value": "af5a7b36732531ffcf37270c1412322cd50ddf095686ccd1bf28d2d95703edca"
18
18
  }
19
19
  ]
20
20
  },
21
21
  "components": [
22
+ {
23
+ "type": "library",
24
+ "name": "@floegence/flowersec-node-native",
25
+ "version": "3.0.4",
26
+ "purl": "pkg:npm/%40floegence/flowersec-node-native@3.0.4",
27
+ "bom-ref": "pkg:npm/%40floegence/flowersec-node-native@3.0.4",
28
+ "licenses": [
29
+ {
30
+ "expression": "MIT"
31
+ }
32
+ ],
33
+ "externalReferences": [
34
+ {
35
+ "type": "distribution",
36
+ "url": "https://github.com/floegence/flowersec.git"
37
+ }
38
+ ],
39
+ "properties": [
40
+ {
41
+ "name": "flowersec:declared-license",
42
+ "value": "MIT"
43
+ },
44
+ {
45
+ "name": "flowersec:source-offer-required",
46
+ "value": "false"
47
+ }
48
+ ]
49
+ },
50
+ {
51
+ "type": "library",
52
+ "name": "@floegence/flowersec-node-native-darwin-arm64",
53
+ "version": "3.0.4",
54
+ "purl": "pkg:npm/%40floegence/flowersec-node-native-darwin-arm64@3.0.4",
55
+ "bom-ref": "pkg:npm/%40floegence/flowersec-node-native-darwin-arm64@3.0.4",
56
+ "licenses": [
57
+ {
58
+ "expression": "MIT"
59
+ }
60
+ ],
61
+ "externalReferences": [
62
+ {
63
+ "type": "distribution",
64
+ "url": "https://github.com/floegence/flowersec.git"
65
+ }
66
+ ],
67
+ "properties": [
68
+ {
69
+ "name": "flowersec:declared-license",
70
+ "value": "MIT"
71
+ },
72
+ {
73
+ "name": "flowersec:source-offer-required",
74
+ "value": "false"
75
+ }
76
+ ]
77
+ },
78
+ {
79
+ "type": "library",
80
+ "name": "@floegence/flowersec-node-native-darwin-x64",
81
+ "version": "3.0.4",
82
+ "purl": "pkg:npm/%40floegence/flowersec-node-native-darwin-x64@3.0.4",
83
+ "bom-ref": "pkg:npm/%40floegence/flowersec-node-native-darwin-x64@3.0.4",
84
+ "licenses": [
85
+ {
86
+ "expression": "MIT"
87
+ }
88
+ ],
89
+ "externalReferences": [
90
+ {
91
+ "type": "distribution",
92
+ "url": "https://github.com/floegence/flowersec.git"
93
+ }
94
+ ],
95
+ "properties": [
96
+ {
97
+ "name": "flowersec:declared-license",
98
+ "value": "MIT"
99
+ },
100
+ {
101
+ "name": "flowersec:source-offer-required",
102
+ "value": "false"
103
+ }
104
+ ]
105
+ },
106
+ {
107
+ "type": "library",
108
+ "name": "@floegence/flowersec-node-native-linux-arm64-gnu",
109
+ "version": "3.0.4",
110
+ "purl": "pkg:npm/%40floegence/flowersec-node-native-linux-arm64-gnu@3.0.4",
111
+ "bom-ref": "pkg:npm/%40floegence/flowersec-node-native-linux-arm64-gnu@3.0.4",
112
+ "licenses": [
113
+ {
114
+ "expression": "MIT"
115
+ }
116
+ ],
117
+ "externalReferences": [
118
+ {
119
+ "type": "distribution",
120
+ "url": "https://github.com/floegence/flowersec.git"
121
+ }
122
+ ],
123
+ "properties": [
124
+ {
125
+ "name": "flowersec:declared-license",
126
+ "value": "MIT"
127
+ },
128
+ {
129
+ "name": "flowersec:source-offer-required",
130
+ "value": "false"
131
+ }
132
+ ]
133
+ },
134
+ {
135
+ "type": "library",
136
+ "name": "@floegence/flowersec-node-native-linux-x64-gnu",
137
+ "version": "3.0.4",
138
+ "purl": "pkg:npm/%40floegence/flowersec-node-native-linux-x64-gnu@3.0.4",
139
+ "bom-ref": "pkg:npm/%40floegence/flowersec-node-native-linux-x64-gnu@3.0.4",
140
+ "licenses": [
141
+ {
142
+ "expression": "MIT"
143
+ }
144
+ ],
145
+ "externalReferences": [
146
+ {
147
+ "type": "distribution",
148
+ "url": "https://github.com/floegence/flowersec.git"
149
+ }
150
+ ],
151
+ "properties": [
152
+ {
153
+ "name": "flowersec:declared-license",
154
+ "value": "MIT"
155
+ },
156
+ {
157
+ "name": "flowersec:source-offer-required",
158
+ "value": "false"
159
+ }
160
+ ]
161
+ },
22
162
  {
23
163
  "type": "library",
24
164
  "name": "@noble/ciphers",
@@ -190,8 +330,9 @@
190
330
  ],
191
331
  "dependencies": [
192
332
  {
193
- "ref": "pkg:npm/%40floegence/flowersec-core@3.0.1",
333
+ "ref": "pkg:npm/%40floegence/flowersec-core@3.0.4",
194
334
  "dependsOn": [
335
+ "pkg:npm/%40floegence/flowersec-node-native@3.0.4",
195
336
  "pkg:npm/%40noble/ciphers@2.3.0",
196
337
  "pkg:npm/%40noble/curves@2.3.0",
197
338
  "pkg:npm/%40noble/hashes@2.3.0",
@@ -199,6 +340,31 @@
199
340
  "pkg:npm/ws@8.21.3"
200
341
  ]
201
342
  },
343
+ {
344
+ "ref": "pkg:npm/%40floegence/flowersec-node-native@3.0.4",
345
+ "dependsOn": [
346
+ "pkg:npm/%40floegence/flowersec-node-native-darwin-arm64@3.0.4",
347
+ "pkg:npm/%40floegence/flowersec-node-native-darwin-x64@3.0.4",
348
+ "pkg:npm/%40floegence/flowersec-node-native-linux-arm64-gnu@3.0.4",
349
+ "pkg:npm/%40floegence/flowersec-node-native-linux-x64-gnu@3.0.4"
350
+ ]
351
+ },
352
+ {
353
+ "ref": "pkg:npm/%40floegence/flowersec-node-native-darwin-arm64@3.0.4",
354
+ "dependsOn": []
355
+ },
356
+ {
357
+ "ref": "pkg:npm/%40floegence/flowersec-node-native-darwin-x64@3.0.4",
358
+ "dependsOn": []
359
+ },
360
+ {
361
+ "ref": "pkg:npm/%40floegence/flowersec-node-native-linux-arm64-gnu@3.0.4",
362
+ "dependsOn": []
363
+ },
364
+ {
365
+ "ref": "pkg:npm/%40floegence/flowersec-node-native-linux-x64-gnu@3.0.4",
366
+ "dependsOn": []
367
+ },
202
368
  {
203
369
  "ref": "pkg:npm/%40noble/ciphers@2.3.0",
204
370
  "dependsOn": []
package/sbom/spdx.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "dataLicense": "CC0-1.0",
4
4
  "SPDXID": "SPDXRef-DOCUMENT",
5
5
  "name": "flowersec-ts",
6
- "documentNamespace": "https://github.com/floegence/flowersec/sbom/flowersec-ts/428d40c24d97553e640a89f6e0397fed24c3106752eb8397571157fb9ea19172",
6
+ "documentNamespace": "https://github.com/floegence/flowersec/sbom/flowersec-ts/af5a7b36732531ffcf37270c1412322cd50ddf095686ccd1bf28d2d95703edca",
7
7
  "creationInfo": {
8
8
  "created": "1970-01-01T00:00:00Z",
9
9
  "creators": [
@@ -13,19 +13,104 @@
13
13
  "packages": [
14
14
  {
15
15
  "name": "@floegence/flowersec-core",
16
- "SPDXID": "SPDXRef-Package-ceebb46445ec0583ce86",
17
- "versionInfo": "3.0.1",
16
+ "SPDXID": "SPDXRef-Package-b0bcf794da04b4bb0d33",
17
+ "versionInfo": "3.0.4",
18
18
  "downloadLocation": "NOASSERTION",
19
19
  "filesAnalyzed": false,
20
20
  "licenseConcluded": "NOASSERTION",
21
21
  "licenseDeclared": "NOASSERTION",
22
22
  "copyrightText": "NOASSERTION",
23
- "comment": "Flowersec source inventory SHA-256: 428d40c24d97553e640a89f6e0397fed24c3106752eb8397571157fb9ea19172",
23
+ "comment": "Flowersec source inventory SHA-256: af5a7b36732531ffcf37270c1412322cd50ddf095686ccd1bf28d2d95703edca",
24
24
  "externalRefs": [
25
25
  {
26
26
  "referenceCategory": "PACKAGE-MANAGER",
27
27
  "referenceType": "purl",
28
- "referenceLocator": "pkg:npm/%40floegence/flowersec-core@3.0.1"
28
+ "referenceLocator": "pkg:npm/%40floegence/flowersec-core@3.0.4"
29
+ }
30
+ ]
31
+ },
32
+ {
33
+ "name": "@floegence/flowersec-node-native",
34
+ "SPDXID": "SPDXRef-Package-e02218f14f5d8e6d4c39",
35
+ "versionInfo": "3.0.4",
36
+ "downloadLocation": "https://github.com/floegence/flowersec.git",
37
+ "filesAnalyzed": false,
38
+ "licenseConcluded": "MIT",
39
+ "licenseDeclared": "MIT",
40
+ "copyrightText": "NOASSERTION",
41
+ "externalRefs": [
42
+ {
43
+ "referenceCategory": "PACKAGE-MANAGER",
44
+ "referenceType": "purl",
45
+ "referenceLocator": "pkg:npm/%40floegence/flowersec-node-native@3.0.4"
46
+ }
47
+ ]
48
+ },
49
+ {
50
+ "name": "@floegence/flowersec-node-native-darwin-arm64",
51
+ "SPDXID": "SPDXRef-Package-0172623f618b3a03e11f",
52
+ "versionInfo": "3.0.4",
53
+ "downloadLocation": "https://github.com/floegence/flowersec.git",
54
+ "filesAnalyzed": false,
55
+ "licenseConcluded": "MIT",
56
+ "licenseDeclared": "MIT",
57
+ "copyrightText": "NOASSERTION",
58
+ "externalRefs": [
59
+ {
60
+ "referenceCategory": "PACKAGE-MANAGER",
61
+ "referenceType": "purl",
62
+ "referenceLocator": "pkg:npm/%40floegence/flowersec-node-native-darwin-arm64@3.0.4"
63
+ }
64
+ ]
65
+ },
66
+ {
67
+ "name": "@floegence/flowersec-node-native-darwin-x64",
68
+ "SPDXID": "SPDXRef-Package-413ba6178e801251e1ee",
69
+ "versionInfo": "3.0.4",
70
+ "downloadLocation": "https://github.com/floegence/flowersec.git",
71
+ "filesAnalyzed": false,
72
+ "licenseConcluded": "MIT",
73
+ "licenseDeclared": "MIT",
74
+ "copyrightText": "NOASSERTION",
75
+ "externalRefs": [
76
+ {
77
+ "referenceCategory": "PACKAGE-MANAGER",
78
+ "referenceType": "purl",
79
+ "referenceLocator": "pkg:npm/%40floegence/flowersec-node-native-darwin-x64@3.0.4"
80
+ }
81
+ ]
82
+ },
83
+ {
84
+ "name": "@floegence/flowersec-node-native-linux-arm64-gnu",
85
+ "SPDXID": "SPDXRef-Package-ec8a15951af6659e94c7",
86
+ "versionInfo": "3.0.4",
87
+ "downloadLocation": "https://github.com/floegence/flowersec.git",
88
+ "filesAnalyzed": false,
89
+ "licenseConcluded": "MIT",
90
+ "licenseDeclared": "MIT",
91
+ "copyrightText": "NOASSERTION",
92
+ "externalRefs": [
93
+ {
94
+ "referenceCategory": "PACKAGE-MANAGER",
95
+ "referenceType": "purl",
96
+ "referenceLocator": "pkg:npm/%40floegence/flowersec-node-native-linux-arm64-gnu@3.0.4"
97
+ }
98
+ ]
99
+ },
100
+ {
101
+ "name": "@floegence/flowersec-node-native-linux-x64-gnu",
102
+ "SPDXID": "SPDXRef-Package-9ac371e45870cc2a2296",
103
+ "versionInfo": "3.0.4",
104
+ "downloadLocation": "https://github.com/floegence/flowersec.git",
105
+ "filesAnalyzed": false,
106
+ "licenseConcluded": "MIT",
107
+ "licenseDeclared": "MIT",
108
+ "copyrightText": "NOASSERTION",
109
+ "externalRefs": [
110
+ {
111
+ "referenceCategory": "PACKAGE-MANAGER",
112
+ "referenceType": "purl",
113
+ "referenceLocator": "pkg:npm/%40floegence/flowersec-node-native-linux-x64-gnu@3.0.4"
29
114
  }
30
115
  ]
31
116
  },
@@ -136,33 +221,58 @@
136
221
  {
137
222
  "spdxElementId": "SPDXRef-DOCUMENT",
138
223
  "relationshipType": "DESCRIBES",
139
- "relatedSpdxElement": "SPDXRef-Package-ceebb46445ec0583ce86"
224
+ "relatedSpdxElement": "SPDXRef-Package-b0bcf794da04b4bb0d33"
140
225
  },
141
226
  {
142
- "spdxElementId": "SPDXRef-Package-ceebb46445ec0583ce86",
227
+ "spdxElementId": "SPDXRef-Package-b0bcf794da04b4bb0d33",
228
+ "relationshipType": "DEPENDS_ON",
229
+ "relatedSpdxElement": "SPDXRef-Package-e02218f14f5d8e6d4c39"
230
+ },
231
+ {
232
+ "spdxElementId": "SPDXRef-Package-b0bcf794da04b4bb0d33",
143
233
  "relationshipType": "DEPENDS_ON",
144
234
  "relatedSpdxElement": "SPDXRef-Package-5ce913a03239b02770fb"
145
235
  },
146
236
  {
147
- "spdxElementId": "SPDXRef-Package-ceebb46445ec0583ce86",
237
+ "spdxElementId": "SPDXRef-Package-b0bcf794da04b4bb0d33",
148
238
  "relationshipType": "DEPENDS_ON",
149
239
  "relatedSpdxElement": "SPDXRef-Package-01009adf60db02c13634"
150
240
  },
151
241
  {
152
- "spdxElementId": "SPDXRef-Package-ceebb46445ec0583ce86",
242
+ "spdxElementId": "SPDXRef-Package-b0bcf794da04b4bb0d33",
153
243
  "relationshipType": "DEPENDS_ON",
154
244
  "relatedSpdxElement": "SPDXRef-Package-8815b117c8a1d5f7eeb0"
155
245
  },
156
246
  {
157
- "spdxElementId": "SPDXRef-Package-ceebb46445ec0583ce86",
247
+ "spdxElementId": "SPDXRef-Package-b0bcf794da04b4bb0d33",
158
248
  "relationshipType": "DEPENDS_ON",
159
249
  "relatedSpdxElement": "SPDXRef-Package-f8b45a289df643042b94"
160
250
  },
161
251
  {
162
- "spdxElementId": "SPDXRef-Package-ceebb46445ec0583ce86",
252
+ "spdxElementId": "SPDXRef-Package-b0bcf794da04b4bb0d33",
163
253
  "relationshipType": "DEPENDS_ON",
164
254
  "relatedSpdxElement": "SPDXRef-Package-b779412f685822663496"
165
255
  },
256
+ {
257
+ "spdxElementId": "SPDXRef-Package-e02218f14f5d8e6d4c39",
258
+ "relationshipType": "DEPENDS_ON",
259
+ "relatedSpdxElement": "SPDXRef-Package-0172623f618b3a03e11f"
260
+ },
261
+ {
262
+ "spdxElementId": "SPDXRef-Package-e02218f14f5d8e6d4c39",
263
+ "relationshipType": "DEPENDS_ON",
264
+ "relatedSpdxElement": "SPDXRef-Package-413ba6178e801251e1ee"
265
+ },
266
+ {
267
+ "spdxElementId": "SPDXRef-Package-e02218f14f5d8e6d4c39",
268
+ "relationshipType": "DEPENDS_ON",
269
+ "relatedSpdxElement": "SPDXRef-Package-ec8a15951af6659e94c7"
270
+ },
271
+ {
272
+ "spdxElementId": "SPDXRef-Package-e02218f14f5d8e6d4c39",
273
+ "relationshipType": "DEPENDS_ON",
274
+ "relatedSpdxElement": "SPDXRef-Package-9ac371e45870cc2a2296"
275
+ },
166
276
  {
167
277
  "spdxElementId": "SPDXRef-Package-01009adf60db02c13634",
168
278
  "relationshipType": "DEPENDS_ON",