@floegence/flowersec-core 3.2.1 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -200
- package/THIRD_PARTY_NOTICES.md +11 -11
- package/dist/browser/index.d.ts +0 -5
- package/dist/browser/index.js +0 -3
- package/dist/cli.js +93 -64
- package/dist/facade.d.ts +0 -17
- package/dist/facade.js +0 -11
- package/dist/generated/unicode151.d.ts +2 -0
- package/dist/generated/unicode151.js +83 -0
- package/dist/interop/proxyServerPeer.js +34 -20
- package/dist/interop/serverParityPeer.js +11 -252
- package/dist/node/acceptor.d.ts +1 -57
- package/dist/node/acceptor.js +3 -420
- package/dist/node/acceptorV3.js +2 -2
- package/dist/node/connectSessionV3.js +2 -2
- package/dist/node/index.d.ts +2 -17
- package/dist/node/index.js +1 -9
- package/dist/node/nativeTransportAddon.d.ts +7 -36
- package/dist/node/nativeTransportAddon.js +7 -27
- package/dist/node/proxyServer.d.ts +2 -2
- package/dist/node/proxyServer.js +2 -2
- package/dist/node/rawQuicAdapterV3.d.ts +2 -2
- package/dist/node/rawQuicAdapterV3.js +1 -1
- package/dist/node/rawQuicServerV3.d.ts +2 -2
- package/dist/node/rawQuicServerV3.js +1 -1
- package/dist/node/rawQuicTls.d.ts +2 -0
- package/dist/node/{rawQuicAdapter.js → rawQuicTls.js} +30 -45
- package/dist/node/tunnelRuntimeV3.js +2 -2
- package/dist/proxy/index.d.ts +1 -1
- package/dist/proxy/index.js +1 -1
- package/dist/proxy/integration.d.ts +5 -5
- package/dist/proxy/integration.js +2 -2
- package/dist/proxy/runtime.js +11 -26
- package/dist/proxy/serviceWorkerRuntime.d.ts +7 -0
- package/dist/proxy/serviceWorkerRuntime.js +75 -0
- package/dist/proxy/types.d.ts +0 -1
- package/dist/proxy/windowBridge.d.ts +2 -0
- package/dist/proxy/windowBridge.js +53 -6
- package/dist/public/contract.d.ts +1 -3
- package/dist/public/streamHandlers.d.ts +0 -3
- package/dist/public/streamHandlers.js +2 -4
- package/dist/public/streamMetadata.js +2 -2
- package/dist/runtime/errors.d.ts +2 -2
- package/dist/testSupport/tlsFixture.d.ts +2 -0
- package/dist/testSupport/tlsFixture.js +8 -0
- package/dist/utils/errors.d.ts +0 -2
- package/dist/utils/errors.js +0 -80
- package/dist/v3/artifact.js +17 -3
- package/dist/v3/carrier.d.ts +2 -2
- package/dist/v3/controller.js +2 -6
- package/dist/v3/protocol.js +2 -103
- package/dist/v3/retryDisposition.d.ts +2 -2
- package/dist/v3/retryDisposition.js +0 -7
- package/dist/v3/security.d.ts +1 -10
- package/dist/v3/security.js +2 -9
- package/dist/vendor/tr46.d.ts +4 -0
- package/dist/vendor/tr46.js +37 -32
- package/package.json +19 -17
- package/sbom/cyclonedx.json +62 -62
- package/sbom/spdx.json +65 -65
- package/dist/browser/connectSession.d.ts +0 -13
- package/dist/browser/connectSession.js +0 -40
- package/dist/browser/runtimeCapability.d.ts +0 -13
- package/dist/browser/runtimeCapability.js +0 -27
- package/dist/browser/sessionRuntime.d.ts +0 -2
- package/dist/browser/sessionRuntime.js +0 -21
- package/dist/browser/v2.d.ts +0 -3
- package/dist/browser/v2.js +0 -2
- package/dist/browser/webTransportClient.d.ts +0 -8
- package/dist/browser/webTransportClient.js +0 -55
- package/dist/connectionController.d.ts +0 -55
- package/dist/connectionController.js +0 -441
- package/dist/connector/adapters/rawQuicCandidate.d.ts +0 -5
- package/dist/connector/adapters/rawQuicCandidate.js +0 -71
- package/dist/connector/adapters/webSocketCandidate.d.ts +0 -7
- package/dist/connector/adapters/webSocketCandidate.js +0 -116
- package/dist/connector/adapters/webTransportCandidate.d.ts +0 -5
- package/dist/connector/adapters/webTransportCandidate.js +0 -73
- package/dist/connector/admissionCommit.d.ts +0 -31
- package/dist/connector/admissionCommit.js +0 -239
- package/dist/connector/sessionAcceptor.d.ts +0 -38
- package/dist/connector/sessionAcceptor.js +0 -158
- package/dist/connector/sessionConfig.d.ts +0 -3
- package/dist/connector/sessionConfig.js +0 -30
- package/dist/connector/sessionConnector.d.ts +0 -47
- package/dist/connector/sessionConnector.js +0 -606
- package/dist/node/connectSession.d.ts +0 -23
- package/dist/node/connectSession.js +0 -93
- package/dist/node/controlplane.d.ts +0 -137
- package/dist/node/controlplane.js +0 -443
- package/dist/node/rawQuicAdapter.d.ts +0 -9
- package/dist/node/rawQuicServer.d.ts +0 -24
- package/dist/node/rawQuicServer.js +0 -37
- package/dist/node/runtimeCapability.d.ts +0 -14
- package/dist/node/runtimeCapability.js +0 -24
- package/dist/node/sessionRuntime.d.ts +0 -2
- package/dist/node/sessionRuntime.js +0 -13
- package/dist/node/tunnelRuntime.d.ts +0 -42
- package/dist/node/tunnelRuntime.js +0 -559
- package/dist/node/v2.d.ts +0 -11
- package/dist/node/v2.js +0 -6
- package/dist/node/webSocketServer.d.ts +0 -24
- package/dist/node/webSocketServer.js +0 -135
- package/dist/public/artifact.d.ts +0 -11
- package/dist/public/artifact.js +0 -44
- package/dist/public/artifactLease.d.ts +0 -10
- package/dist/public/artifactLease.js +0 -41
- package/dist/public/connectError.d.ts +0 -6
- package/dist/public/connectError.js +0 -9
- package/dist/transport/webSocketAdapter.d.ts +0 -31
- package/dist/transport/webSocketAdapter.js +0 -370
- package/dist/transport/webTransportAdapter.d.ts +0 -27
- package/dist/transport/webTransportAdapter.js +0 -534
- package/dist/v2/admissionError.d.ts +0 -4
- package/dist/v2/admissionError.js +0 -8
- package/dist/v2/artifact.d.ts +0 -128
- package/dist/v2/artifact.js +0 -1131
- package/dist/v2/artifactLease.d.ts +0 -1
- package/dist/v2/artifactLease.js +0 -7
- package/dist/v2/capability.d.ts +0 -29
- package/dist/v2/capability.js +0 -190
- package/dist/v2/carrier.d.ts +0 -84
- package/dist/v2/carrier.js +0 -411
- package/dist/v2/contract.d.ts +0 -46
- package/dist/v2/contract.js +0 -1
- package/dist/v2/handshake.d.ts +0 -80
- package/dist/v2/handshake.js +0 -470
- package/dist/v2/index.d.ts +0 -14
- package/dist/v2/index.js +0 -7
- package/dist/v2/opaqueArtifact.d.ts +0 -1
- package/dist/v2/opaqueArtifact.js +0 -2
- package/dist/v2/protocol.d.ts +0 -99
- package/dist/v2/protocol.js +0 -737
- package/dist/v2/publicSession.d.ts +0 -1
- package/dist/v2/publicSession.js +0 -281
- package/dist/v2/retryDisposition.d.ts +0 -16
- package/dist/v2/retryDisposition.js +0 -30
- package/dist/v2/session.d.ts +0 -310
- package/dist/v2/session.js +0 -2127
- package/dist/v2/streamLifetimeLedger.d.ts +0 -31
- package/dist/v2/streamLifetimeLedger.js +0 -131
- package/dist/v2/streamMetadata.d.ts +0 -1
- package/dist/v2/streamMetadata.js +0 -7
- package/dist/v2/unreliableMessage.d.ts +0 -43
- package/dist/v2/unreliableMessage.js +0 -254
package/dist/node/acceptor.js
CHANGED
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
import { RpcRouter } from "../rpc/server.js";
|
|
2
2
|
import { assertRpcError, assertRpcTypeId } from "../rpc/validate.js";
|
|
3
|
-
import {
|
|
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);
|
package/dist/node/acceptorV3.js
CHANGED
|
@@ -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 {
|
|
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 ??=
|
|
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 {
|
|
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 :
|
|
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 {
|
package/dist/node/index.d.ts
CHANGED
|
@@ -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";
|
package/dist/node/index.js
CHANGED
|
@@ -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
|
-
|
|
5
|
-
export
|
|
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
|
|
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
|
|
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<
|
|
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
|
-
|
|
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:
|
|
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 {};
|