@floegence/flowersec-core 3.2.0 → 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 +21 -19
  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,17 +1,7 @@
1
1
  import { RpcRouter } from "../rpc/server.js";
2
2
  import { assertRpcError, assertRpcTypeId } from "../rpc/validate.js";
3
- import { acceptReceivedSessionV2, receiveSessionAdmissionV2, rejectSessionAdmissionV2, } from "../connector/sessionAcceptor.js";
4
- import { nodeSessionRuntimeV2 } from "./sessionRuntime.js";
5
- import { startNodeWebSocketServer, } from "./webSocketServer.js";
6
- import { createNativeRawQuicDriver } from "./nativeTransportAddon.js";
7
- import { startNodeRawQuicServer, } from "./rawQuicServer.js";
8
- import { unwrapArtifact } from "../public/artifact.js";
9
- import { SessionError, } from "../public/contract.js";
10
- import { projectSessionV2 } from "../v2/publicSession.js";
11
- import { runtimeAuthorizationRequestFromDecoded, } from "./controlplane.js";
12
- import { HandlerRegistrationError, StreamHandlers, LegacyStreamHandlers, freezeStreamHandlers, registerStreamHandlersAtomically, serveFrozenStreamHandlers, } from "../public/streamHandlers.js";
3
+ import { HandlerRegistrationError, StreamHandlers, freezeStreamHandlers, registerStreamHandlersAtomically, } from "../public/streamHandlers.js";
13
4
  export { HandlerRegistrationError } from "../public/streamHandlers.js";
14
- const DEFAULT_CLEANUP_TIMEOUT_MS = 2_000;
15
5
  export class RPCHandlers {
16
6
  constructor() {
17
7
  rpcHandlerStates.set(this, createRPCHandlerState());
@@ -23,28 +13,6 @@ export class RPCHandlers {
23
13
  registerNotification(mutableRPCHandlerState(this), typeId, handler);
24
14
  }
25
15
  }
26
- export class SessionHandlers {
27
- constructor(options = {}) {
28
- sessionHandlerStates.set(this, {
29
- rpc: createRPCHandlerState(),
30
- streams: new LegacyStreamHandlers(options),
31
- frozen: false,
32
- });
33
- }
34
- handleRPC(typeId, handler) {
35
- const state = mutableSessionHandlerState(this);
36
- registerRPC(state.rpc, typeId, handler);
37
- }
38
- handleNotification(typeId, handler) {
39
- const state = mutableSessionHandlerState(this);
40
- registerNotification(state.rpc, typeId, handler);
41
- }
42
- handleStream(kind, handler) {
43
- const state = mutableSessionHandlerState(this);
44
- state.streams.handleStream(kind, handler);
45
- }
46
- }
47
- /** Strict-v3 accepted-session handlers. */
48
16
  export class SessionHandlersV3 {
49
17
  constructor(options = {}) {
50
18
  sessionHandlerStates.set(this, {
@@ -147,8 +115,9 @@ export function createRPCRouter(snapshot) {
147
115
  for (const [typeId, handler] of snapshot.requests) {
148
116
  router.register(typeId, async (payload) => {
149
117
  const result = await handler(payload, Object.freeze({ typeId }));
150
- if ("error" in result)
118
+ if ("error" in result) {
151
119
  return { payload: null, error: validRPCError(result.error) };
120
+ }
152
121
  return { payload: result.payload };
153
122
  });
154
123
  }
@@ -160,23 +129,6 @@ export function createRPCRouter(snapshot) {
160
129
  return router;
161
130
  }
162
131
  /** @internal */
163
- export function freezeSessionHandlers(handlers) {
164
- if (!(handlers instanceof SessionHandlers)) {
165
- throw new HandlerRegistrationError("invalid_handler");
166
- }
167
- const state = sessionHandlerStates.get(handlers);
168
- if (state === undefined)
169
- throw new HandlerRegistrationError("invalid_handler");
170
- if (state.snapshot !== undefined)
171
- return state.snapshot;
172
- state.frozen = true;
173
- state.snapshot = Object.freeze({
174
- rpc: freezeRPCHandlerState(state.rpc),
175
- streams: freezeStreamHandlers(state.streams),
176
- });
177
- return state.snapshot;
178
- }
179
- /** @internal */
180
132
  export function freezeSessionHandlersV3(handlers) {
181
133
  if (!(handlers instanceof SessionHandlersV3)) {
182
134
  throw new HandlerRegistrationError("invalid_handler");
@@ -193,375 +145,6 @@ export function freezeSessionHandlersV3(handlers) {
193
145
  });
194
146
  return state.snapshot;
195
147
  }
196
- export class AcceptedSession {
197
- constructor() { }
198
- get session() {
199
- return acceptedSessionState(this).session;
200
- }
201
- async serve(options = {}) {
202
- const state = acceptedSessionState(this);
203
- await serveFrozenStreamHandlers(state.handlers.streams, this.session, options, async () => await this.close());
204
- }
205
- async close() {
206
- const state = acceptedSessionState(this);
207
- if (state.closePromise === undefined) {
208
- state.closePromise = (async () => {
209
- try {
210
- await state.session.close();
211
- }
212
- finally {
213
- if (state.release !== undefined && state.releasePromise === undefined) {
214
- state.releasePromise = Promise.resolve().then(() => state.release());
215
- }
216
- await state.releasePromise;
217
- }
218
- })();
219
- }
220
- await state.closePromise;
221
- }
222
- }
223
- const acceptedSessionStates = new WeakMap();
224
- function acceptedSessionState(accepted) {
225
- const state = acceptedSessionStates.get(accepted);
226
- if (state === undefined)
227
- throw new SessionError("operation_failed");
228
- return state;
229
- }
230
- function createAcceptedSession(session, handlers, release) {
231
- const accepted = new AcceptedSession();
232
- const state = { session, handlers };
233
- if (release !== undefined)
234
- state.release = release;
235
- acceptedSessionStates.set(accepted, state);
236
- return Object.freeze(accepted);
237
- }
238
- export class Acceptor {
239
- constructor() { }
240
- addresses() {
241
- return acceptorState(this).listeners.map((listener) => listener.address());
242
- }
243
- async accept(operation = {}) {
244
- const state = acceptorState(this);
245
- state.start();
246
- return await state.accepted.shift(operation.signal);
247
- }
248
- async close() {
249
- const state = acceptorState(this);
250
- if (state.lifecycle.completion === undefined) {
251
- state.lifecycle.completion = closeAcceptor(state);
252
- }
253
- await withCleanupTimeout(state.lifecycle.completion, state.cleanupTimeoutMs);
254
- }
255
- }
256
- const MAX_CONCURRENT_ADMISSIONS = 64;
257
- const MAX_PENDING_ACCEPTED_SESSIONS = 64;
258
- async function closeAcceptor(state) {
259
- state.abort.abort();
260
- const queued = state.accepted.close();
261
- const cleanup = await Promise.allSettled([
262
- ...state.listeners.map(async (listener) => await listener.close()),
263
- ...queued.map(async (accepted) => await accepted.close()),
264
- ]);
265
- while (state.tasks.size > 0) {
266
- await Promise.allSettled([...state.tasks]);
267
- }
268
- if (cleanup.some((result) => result.status === "rejected") ||
269
- state.lifecycle.cleanupFailed) {
270
- throw new SessionError("operation_failed");
271
- }
272
- }
273
- async function releaseLease(state, leaseId) {
274
- if (leaseId === undefined || state.options.release === undefined)
275
- return;
276
- await state.options.release(leaseId);
277
- }
278
- async function authorizeCarrier(state, carrier) {
279
- const received = await receiveSessionAdmissionV2(carrier, state.abort.signal);
280
- const decoded = received.decoded;
281
- const request = runtimeAuthorizationRequestFromDecoded(decoded);
282
- const decision = await state.options.authorize(request, { signal: state.abort.signal });
283
- if (decision.decision !== "allow") {
284
- return await rejectSessionAdmissionV2(received, {
285
- accepted: false,
286
- status: decision.decision === "retry" ? 2 : 1,
287
- reason: decision.reason,
288
- }, state.abort.signal);
289
- }
290
- const leaseId = "leaseId" in decision && typeof decision.leaseId === "string"
291
- ? decision.leaseId
292
- : undefined;
293
- try {
294
- const registry = state.options.resolveHandlers === undefined
295
- ? new SessionHandlers()
296
- : await state.options.resolveHandlers(request, { signal: state.abort.signal });
297
- const handlers = freezeSessionHandlers(registry);
298
- const leg = {
299
- received,
300
- artifact: unwrapArtifact(decision.artifact),
301
- handlers,
302
- router: createRPCRouter(handlers.rpc),
303
- };
304
- if (leaseId !== undefined)
305
- leg.leaseId = leaseId;
306
- return leg;
307
- }
308
- catch (error) {
309
- await releaseLease(state, leaseId).catch(() => undefined);
310
- throw error;
311
- }
312
- }
313
- async function establishDirect(leg, signal, release) {
314
- const internal = await acceptReceivedSessionV2(leg.received, leg.artifact, {
315
- runtime: nodeSessionRuntimeV2,
316
- rpcRouter: leg.router,
317
- role: "server",
318
- signal,
319
- });
320
- return createAcceptedSession(projectSessionV2(internal), leg.handlers, release);
321
- }
322
- async function processCarrier(state, carrier) {
323
- const leg = await authorizeCarrier(state, carrier);
324
- if (leg === undefined)
325
- return;
326
- let releaseOwnedByAcceptedSession = false;
327
- try {
328
- if (leg.received.decoded.request.pathKind !== "direct" ||
329
- leg.artifact.path.kind !== "direct") {
330
- await leg.received.carrier.close().catch(() => undefined);
331
- throw new SessionError("operation_failed");
332
- }
333
- const accepted = await establishDirect(leg, state.abort.signal, leg.leaseId === undefined ? undefined : () => releaseLease(state, leg.leaseId));
334
- releaseOwnedByAcceptedSession = true;
335
- if (state.accepted.push(accepted) === "rejected") {
336
- try {
337
- await accepted.close();
338
- }
339
- catch {
340
- state.lifecycle.cleanupFailed = true;
341
- throw new SessionError("operation_failed");
342
- }
343
- }
344
- }
345
- catch (error) {
346
- if (!releaseOwnedByAcceptedSession) {
347
- await releaseLease(state, leg.leaseId).catch(() => undefined);
348
- }
349
- throw error;
350
- }
351
- }
352
- async function runAcceptLoop(state) {
353
- while (!state.abort.signal.aborted) {
354
- try {
355
- while (state.admissions.size >= MAX_CONCURRENT_ADMISSIONS) {
356
- await Promise.race(state.admissions);
357
- if (state.abort.signal.aborted)
358
- return;
359
- }
360
- const carrier = await state.accept({ signal: state.abort.signal });
361
- const task = processCarrier(state, carrier)
362
- .catch(async () => {
363
- await carrier.close().catch(() => undefined);
364
- })
365
- .finally(() => {
366
- state.admissions.delete(task);
367
- state.tasks.delete(task);
368
- });
369
- state.admissions.add(task);
370
- state.tasks.add(task);
371
- }
372
- catch (error) {
373
- if (!state.abort.signal.aborted)
374
- state.accepted.fail(error instanceof Error ? error : new Error(String(error)));
375
- return;
376
- }
377
- }
378
- }
379
- class AcceptedQueue {
380
- values = [];
381
- waiters = new Set();
382
- failure;
383
- push(value) {
384
- if (this.failure !== undefined)
385
- return "rejected";
386
- const waiter = this.waiters.values().next().value;
387
- if (waiter === undefined) {
388
- if (this.values.length >= MAX_PENDING_ACCEPTED_SESSIONS)
389
- return "rejected";
390
- this.values.push(value);
391
- return "queued";
392
- }
393
- else {
394
- this.waiters.delete(waiter);
395
- waiter.resolve(value);
396
- return "delivered";
397
- }
398
- }
399
- async shift(signal) {
400
- if (signal?.aborted === true)
401
- throw new SessionError("canceled");
402
- const value = this.values.shift();
403
- if (value !== undefined)
404
- return value;
405
- if (this.failure !== undefined)
406
- throw this.failure;
407
- return await new Promise((resolve, reject) => {
408
- const waiter = {
409
- resolve: (session) => {
410
- cleanup();
411
- resolve(session);
412
- },
413
- reject: (error) => {
414
- cleanup();
415
- reject(error);
416
- },
417
- };
418
- const abort = () => {
419
- this.waiters.delete(waiter);
420
- reject(new SessionError("canceled"));
421
- };
422
- const cleanup = () => signal?.removeEventListener("abort", abort);
423
- this.waiters.add(waiter);
424
- signal?.addEventListener("abort", abort, { once: true });
425
- });
426
- }
427
- fail(error) {
428
- if (this.failure !== undefined)
429
- return;
430
- this.failure = error;
431
- for (const waiter of this.waiters)
432
- waiter.reject(error);
433
- this.waiters.clear();
434
- }
435
- close() {
436
- this.fail(new SessionError("closed"));
437
- return this.values.splice(0);
438
- }
439
- }
440
- const acceptorStates = new WeakMap();
441
- function acceptorState(acceptor) {
442
- const state = acceptorStates.get(acceptor);
443
- if (state === undefined)
444
- throw new SessionError("operation_failed");
445
- return state;
446
- }
447
- export async function createAcceptor(options) {
448
- if (!Number.isSafeInteger(options.maxInboundStreams) ||
449
- options.maxInboundStreams < 1 ||
450
- options.maxInboundStreams > 128 ||
451
- options.listeners.length === 0) {
452
- throw new TypeError("invalid Flowersec Acceptor options");
453
- }
454
- const cleanupTimeoutMs = options.cleanupTimeoutMs ?? DEFAULT_CLEANUP_TIMEOUT_MS;
455
- if (!Number.isSafeInteger(cleanupTimeoutMs) || cleanupTimeoutMs < 1 || cleanupTimeoutMs > 60_000) {
456
- throw new TypeError("invalid Flowersec Acceptor cleanup timeout");
457
- }
458
- if (options.listeners.some((listener) => listener.path !== "direct")) {
459
- throw new TypeError("Flowersec Acceptor listeners must use the direct path");
460
- }
461
- const listeners = [];
462
- let rawQuicDriver;
463
- try {
464
- for (const listener of options.listeners) {
465
- if (listener.carrier === "websocket") {
466
- listeners.push(await startNodeWebSocketServer({
467
- ...listener,
468
- inboundBidirectionalStreamCapacity: options.maxInboundStreams + 2,
469
- }));
470
- }
471
- else {
472
- rawQuicDriver ??= createNativeRawQuicDriver();
473
- listeners.push(await startNodeRawQuicServer(rawQuicDriver, {
474
- ...listener,
475
- inboundBidirectionalStreamCapacity: options.maxInboundStreams + 2,
476
- }));
477
- }
478
- }
479
- }
480
- catch (error) {
481
- await Promise.allSettled(listeners.map(async (listener) => await listener.close()));
482
- throw error;
483
- }
484
- let cursor = 0;
485
- const accept = async (operation) => {
486
- if (listeners.length === 1)
487
- return await listeners[0].accept(operation);
488
- const controller = new AbortController();
489
- const abort = () => controller.abort(operation.signal?.reason);
490
- operation.signal?.addEventListener("abort", abort, { once: true });
491
- try {
492
- return await new Promise((resolve, reject) => {
493
- let settled = false;
494
- let remaining = listeners.length;
495
- const errors = [];
496
- listeners.forEach((listener, index) => {
497
- const selected = listeners[(index + cursor) % listeners.length];
498
- void selected.accept({ signal: controller.signal }).then((carrier) => {
499
- if (!settled) {
500
- settled = true;
501
- cursor = (cursor + 1) % listeners.length;
502
- controller.abort();
503
- resolve(carrier);
504
- }
505
- else {
506
- carrier.abort({ code: 1000, reason: "accept race lost" });
507
- }
508
- }, (error) => {
509
- errors.push(error);
510
- remaining -= 1;
511
- if (!settled && remaining === 0) {
512
- settled = true;
513
- reject(new AggregateError(errors, "all listeners failed to accept"));
514
- }
515
- });
516
- });
517
- });
518
- }
519
- finally {
520
- operation.signal?.removeEventListener("abort", abort);
521
- }
522
- };
523
- const acceptor = new Acceptor();
524
- const accepted = new AcceptedQueue();
525
- const abort = new AbortController();
526
- const tasks = new Set();
527
- const admissions = new Set();
528
- let started = false;
529
- const state = {
530
- listeners,
531
- options,
532
- accept,
533
- accepted,
534
- abort,
535
- tasks,
536
- admissions,
537
- cleanupTimeoutMs,
538
- lifecycle: { cleanupFailed: false },
539
- start() {
540
- if (started)
541
- return;
542
- started = true;
543
- const task = runAcceptLoop(state).finally(() => tasks.delete(task));
544
- tasks.add(task);
545
- },
546
- };
547
- acceptorStates.set(acceptor, state);
548
- return Object.freeze(acceptor);
549
- }
550
- async function withCleanupTimeout(completion, timeoutMs) {
551
- let timer;
552
- try {
553
- await Promise.race([
554
- completion,
555
- new Promise((_, reject) => {
556
- timer = setTimeout(() => reject(new SessionError("timeout")), timeoutMs);
557
- }),
558
- ]);
559
- }
560
- finally {
561
- if (timer !== undefined)
562
- clearTimeout(timer);
563
- }
564
- }
565
148
  function validRPCError(error) {
566
149
  try {
567
150
  return assertRpcError(error);
@@ -5,7 +5,7 @@ import { AdmissionStatusV3 } from "../v3/artifact.js";
5
5
  import { unwrapArtifactHandleV3, } from "../v3/publicApi.js";
6
6
  import { SessionHandlersV3, createRPCRouter, freezeSessionHandlersV3, } from "./acceptor.js";
7
7
  import { serveFrozenStreamHandlers } from "../public/streamHandlers.js";
8
- import { createNativeRawQuicDriverV3, loadNativeTransportAddon, } from "./nativeTransportAddon.js";
8
+ import { createNativeRawQuicDriver, loadNativeTransportAddon, } from "./nativeTransportAddon.js";
9
9
  import { startNodeRawQuicListenerV3, } from "./rawQuicServerV3.js";
10
10
  import { startNodeWebSocketListenerV3, } from "./webSocketServerV3.js";
11
11
  import { runtimeAuthorizationRequestV3FromDecoded, } from "./runtimeAuthorizationV3.js";
@@ -126,7 +126,7 @@ export async function createAcceptorV3(options) {
126
126
  ...listener,
127
127
  inboundBidirectionalStreamCapacity: options.maxInboundStreams + 2,
128
128
  })
129
- : await startNodeRawQuicListenerV3(rawDriver ??= createNativeRawQuicDriverV3(loadNativeTransportAddon()), {
129
+ : await startNodeRawQuicListenerV3(rawDriver ??= createNativeRawQuicDriver(loadNativeTransportAddon()), {
130
130
  ...listener,
131
131
  inboundBidirectionalStreamCapacity: options.maxInboundStreams + 2,
132
132
  });
@@ -5,7 +5,7 @@ import { attemptClaimedArtifactLeaseV3, connectArtifactLeaseV3 } from "../v3/ses
5
5
  import { readyNativeAdmissionV3, readyWebSocketAdmissionV3 } from "../v3/runtimeAdapters.js";
6
6
  import { ConnectErrorV3, TransportFailureV3 } from "../v3/security.js";
7
7
  import { nodeSessionRuntimeV3 } from "../v3/nodeSessionRuntime.js";
8
- import { createNativeRawQuicDriverV3, tryLoadNativeTransportAddon, } from "./nativeTransportAddon.js";
8
+ import { createNativeRawQuicDriver, tryLoadNativeTransportAddon, } from "./nativeTransportAddon.js";
9
9
  import { createNodeRawQuicClientV3 } from "./rawQuicAdapterV3.js";
10
10
  import { createRPCRouter, freezeRPCHandlers, } from "./acceptor.js";
11
11
  export async function connectV3(lease, options) {
@@ -26,7 +26,7 @@ function nodeRuntime(options) {
26
26
  throw new ConnectErrorV3("artifact_invalid", { kind: "terminal" });
27
27
  }
28
28
  const addon = tryLoadNativeTransportAddon();
29
- const rawQuic = addon === undefined ? undefined : createNativeRawQuicDriverV3(addon);
29
+ const rawQuic = addon === undefined ? undefined : createNativeRawQuicDriver(addon);
30
30
  const capability = detectNodeRuntimeCapabilityV3(rawQuic !== undefined, options.origin !== undefined);
31
31
  let rpcSnapshot;
32
32
  try {
@@ -1,32 +1,17 @@
1
1
  export { AcceptedSessionV3 as AcceptedSession, AcceptorV3 as Acceptor, createAcceptorV3 as createAcceptor, } from "./acceptorV3.js";
2
2
  export type { AcceptorListenerV3 as AcceptorListener, AcceptorAuthorizationDecisionV3 as AcceptorAuthorizationDecision, AcceptorAuthorizerV3 as AcceptorAuthorizer, AcceptorOptionsV3 as AcceptorOptions, } from "./acceptorV3.js";
3
- /** @deprecated Use the corresponding unversioned acceptor exports. */
4
- export { AcceptedSessionV3, AcceptorV3, createAcceptorV3 } from "./acceptorV3.js";
5
- /** @deprecated Use the corresponding unversioned acceptor types. */
6
- export type { AcceptorListenerV3, AcceptorAuthorizationDecisionV3, AcceptorAuthorizerV3, AcceptorOptionsV3, } from "./acceptorV3.js";
7
3
  export { TunnelRuntimeV3 as TunnelRuntime, createTunnelRuntimeV3 as createTunnelRuntime, } from "./tunnelRuntimeV3.js";
8
4
  export type { TunnelAuthorizationDecisionV3 as TunnelAuthorizationDecision, TunnelRuntimeListenerV3 as TunnelRuntimeListener, TunnelRuntimeOptionsV3 as TunnelRuntimeOptions, } from "./tunnelRuntimeV3.js";
9
- /** @deprecated Use TunnelRuntime and createTunnelRuntime. */
10
- export { TunnelRuntimeV3, createTunnelRuntimeV3 } from "./tunnelRuntimeV3.js";
11
- /** @deprecated Use the corresponding unversioned tunnel runtime types. */
12
- export type { TunnelAuthorizationDecisionV3, TunnelRuntimeListenerV3, TunnelRuntimeOptionsV3, } from "./tunnelRuntimeV3.js";
13
5
  export { RuntimeAuthorizationRequestV3 as RuntimeAuthorizationRequest, TunnelAuthorizationGrantV3 as TunnelAuthorizationGrant, verifyTunnelAuthorizationGrantV3 as verifyTunnelAuthorizationGrant, } from "./runtimeAuthorizationV3.js";
14
6
  export type { TunnelAuthorizationGrantOptionsV3 as TunnelAuthorizationGrantOptions, } from "./runtimeAuthorizationV3.js";
15
- /** @deprecated Use the corresponding unversioned runtime-authorization exports. */
16
- export { RuntimeAuthorizationRequestV3, TunnelAuthorizationGrantV3, verifyTunnelAuthorizationGrantV3, } from "./runtimeAuthorizationV3.js";
17
- /** @deprecated Use TunnelAuthorizationGrantOptions. */
18
- export type { TunnelAuthorizationGrantOptionsV3 } from "./runtimeAuthorizationV3.js";
19
7
  export * from "../facade.js";
20
- export * as v2 from "./v2.js";
21
8
  import type { NodeTLSRootsV3 as NodeTLSRoots } from "./connectSessionV3.js";
22
9
  export { connectV3 as connect, createConnectionControllerV3 as createConnectionController, } from "./connectSessionV3.js";
23
- /** @deprecated Use connect and createConnectionController. */
24
- export { connectV3, createConnectionControllerV3 } from "./connectSessionV3.js";
25
10
  export type { ConnectionControllerOptionsV3 as ConnectionControllerOptions, NodeTLSRootsV3 as NodeTLSRoots, SessionOptionsV3 as SessionOptions, } from "./connectSessionV3.js";
26
- /** @deprecated Use ConnectionControllerOptions, SessionTLSOptions, and SessionOptions. */
27
- export type { ConnectionControllerOptionsV3, NodeTLSRootsV3, SessionOptionsV3, } from "./connectSessionV3.js";
28
11
  export type SessionTLSOptions = Readonly<{
29
12
  ca?: NodeTLSRoots;
30
13
  }>;
31
14
  export { HandlerRegistrationError, RPCHandlers, SessionHandlersV3 as SessionHandlers, } from "./acceptor.js";
32
15
  export type { NotificationHandler, RPCHandler, RPCHandlerResult, SessionHandlerOptions, } from "./acceptor.js";
16
+ export { ProxyServer, ProxyServerError } from "./proxyServer.js";
17
+ export type { ProxyServerOptions } from "./proxyServer.js";
@@ -1,15 +1,7 @@
1
1
  export { AcceptedSessionV3 as AcceptedSession, AcceptorV3 as Acceptor, createAcceptorV3 as createAcceptor, } from "./acceptorV3.js";
2
- /** @deprecated Use the corresponding unversioned acceptor exports. */
3
- export { AcceptedSessionV3, AcceptorV3, createAcceptorV3 } from "./acceptorV3.js";
4
2
  export { TunnelRuntimeV3 as TunnelRuntime, createTunnelRuntimeV3 as createTunnelRuntime, } from "./tunnelRuntimeV3.js";
5
- /** @deprecated Use TunnelRuntime and createTunnelRuntime. */
6
- export { TunnelRuntimeV3, createTunnelRuntimeV3 } from "./tunnelRuntimeV3.js";
7
3
  export { RuntimeAuthorizationRequestV3 as RuntimeAuthorizationRequest, TunnelAuthorizationGrantV3 as TunnelAuthorizationGrant, verifyTunnelAuthorizationGrantV3 as verifyTunnelAuthorizationGrant, } from "./runtimeAuthorizationV3.js";
8
- /** @deprecated Use the corresponding unversioned runtime-authorization exports. */
9
- export { RuntimeAuthorizationRequestV3, TunnelAuthorizationGrantV3, verifyTunnelAuthorizationGrantV3, } from "./runtimeAuthorizationV3.js";
10
4
  export * from "../facade.js";
11
- export * as v2 from "./v2.js";
12
5
  export { connectV3 as connect, createConnectionControllerV3 as createConnectionController, } from "./connectSessionV3.js";
13
- /** @deprecated Use connect and createConnectionController. */
14
- export { connectV3, createConnectionControllerV3 } from "./connectSessionV3.js";
15
6
  export { HandlerRegistrationError, RPCHandlers, SessionHandlersV3 as SessionHandlers, } from "./acceptor.js";
7
+ export { ProxyServer, ProxyServerError } from "./proxyServer.js";
@@ -1,16 +1,6 @@
1
- import { type NativeCarrierSessionV2 } from "../v2/carrier.js";
2
- import type { PathKind } from "../v2/contract.js";
3
1
  import type { NativeCarrierSessionV3 } from "../v3/carrier.js";
4
- export declare const NATIVE_TRANSPORT_CONTRACT_VERSION = 2;
5
- export type NativeRawQuicConnectOptions = Readonly<{
6
- host: string;
7
- port: number;
8
- serverName: string;
9
- path: PathKind;
10
- trustRootsDer: readonly Uint8Array[];
11
- inboundBidirectionalStreamCapacity: number;
12
- handshakeTimeoutMs: number;
13
- }>;
2
+ import type { PathKind } from "../v3/contract.js";
3
+ export declare const NATIVE_TRANSPORT_CONTRACT_VERSION = 3;
14
4
  export type NativeRawQuicBindOptions = Readonly<{
15
5
  host: string;
16
6
  port: number;
@@ -20,7 +10,7 @@ export type NativeRawQuicBindOptions = Readonly<{
20
10
  inboundBidirectionalStreamCapacity: number;
21
11
  handshakeTimeoutMs?: number;
22
12
  }>;
23
- type NativeRawQuicConnectOptionsV3Base = Readonly<{
13
+ type NativeRawQuicConnectOptionsBase = Readonly<{
24
14
  host: string;
25
15
  port: number;
26
16
  serverName: string;
@@ -28,7 +18,7 @@ type NativeRawQuicConnectOptionsV3Base = Readonly<{
28
18
  inboundBidirectionalStreamCapacity: number;
29
19
  handshakeTimeoutMs: number;
30
20
  }>;
31
- export type NativeRawQuicConnectOptionsV3 = NativeRawQuicConnectOptionsV3Base & (Readonly<{
21
+ export type NativeRawQuicConnectOptions = NativeRawQuicConnectOptionsBase & (Readonly<{
32
22
  tlsMode: "ca";
33
23
  trustRootsDer: readonly Uint8Array[];
34
24
  activeLeafDerSha256?: never;
@@ -44,30 +34,14 @@ export type NativeRawQuicListener = Readonly<{
44
34
  }>;
45
35
  accept(options?: Readonly<{
46
36
  signal?: AbortSignal;
47
- }>): Promise<NativeCarrierSessionV2>;
37
+ }>): Promise<NativeCarrierSessionV3>;
48
38
  close(): Promise<void>;
49
39
  }>;
50
40
  export type NativeRawQuicDriver = Readonly<{
51
41
  connectRawQuic(options: NativeRawQuicConnectOptions, operation?: Readonly<{
52
42
  signal?: AbortSignal;
53
- }>): Promise<NativeCarrierSessionV2>;
54
- bindRawQuic(options: NativeRawQuicBindOptions): Promise<NativeRawQuicListener>;
55
- }>;
56
- export type NativeRawQuicListenerV3 = Readonly<{
57
- address(): Readonly<{
58
- host: string;
59
- port: number;
60
- }>;
61
- accept(options?: Readonly<{
62
- signal?: AbortSignal;
63
43
  }>): Promise<NativeCarrierSessionV3>;
64
- close(): Promise<void>;
65
- }>;
66
- export type NativeRawQuicDriverV3 = Readonly<{
67
- connectRawQuic(options: NativeRawQuicConnectOptionsV3, operation?: Readonly<{
68
- signal?: AbortSignal;
69
- }>): Promise<NativeCarrierSessionV3>;
70
- bindRawQuic(options: NativeRawQuicBindOptions): Promise<NativeRawQuicListenerV3>;
44
+ bindRawQuic(options: NativeRawQuicBindOptions): Promise<NativeRawQuicListener>;
71
45
  }>;
72
46
  type NativeOperation<T> = Readonly<{
73
47
  result(): Promise<T>;
@@ -85,7 +59,7 @@ type NativeRawQuicStreamBinding = Readonly<{
85
59
  type NativeRawQuicSessionBinding = Readonly<{
86
60
  kind: "raw_quic";
87
61
  path: PathKind;
88
- wireVersion: 2 | 3;
62
+ wireVersion: 3;
89
63
  inboundBidirectionalStreamCapacity: number;
90
64
  maxDatagramSize?: number;
91
65
  localAddress(): Readonly<{
@@ -117,8 +91,6 @@ export type NativeTransportAddonBinding = Readonly<{
117
91
  contractVersion(): number;
118
92
  connectRawQuic(options: NativeRawQuicConnectOptions): NativeOperation<NativeRawQuicSessionBinding>;
119
93
  bindRawQuic(options: NativeRawQuicBindOptions): Promise<NativeRawQuicListenerBinding>;
120
- connectRawQuicV3(options: NativeRawQuicConnectOptionsV3): NativeOperation<NativeRawQuicSessionBinding>;
121
- bindRawQuicV3(options: NativeRawQuicBindOptions): Promise<NativeRawQuicListenerBinding>;
122
94
  }>;
123
95
  export type NativeTransportAddon = NativeTransportAddonBinding;
124
96
  export declare class NativeTransportUnavailableError extends Error {
@@ -129,5 +101,4 @@ type RequireFunction = (specifier: string) => unknown;
129
101
  export declare function loadNativeTransportAddon(requireFunction?: RequireFunction): NativeTransportAddonBinding;
130
102
  export declare function tryLoadNativeTransportAddon(requireFunction?: RequireFunction): NativeTransportAddonBinding | undefined;
131
103
  export declare function createNativeRawQuicDriver(addon?: NativeTransportAddonBinding): NativeRawQuicDriver;
132
- export declare function createNativeRawQuicDriverV3(addon?: NativeTransportAddonBinding): NativeRawQuicDriverV3;
133
104
  export {};