@pure01fx/dsh-openai-codex-auth 0.5.0 → 0.6.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/CHANGELOG.md +42 -0
- package/README.md +33 -5
- package/client.js +186 -16
- package/cordis.patch.yml +2 -6
- package/lib/catalog.d.ts +77 -0
- package/lib/catalog.js +383 -0
- package/lib/endpoint.d.ts +2 -0
- package/lib/endpoint.js +38 -0
- package/lib/index.d.ts +63 -17
- package/lib/index.js +535 -130
- package/lib/native-adapter.d.ts +43 -0
- package/lib/native-adapter.js +246 -0
- package/lib/native-http.d.ts +61 -0
- package/lib/native-http.js +602 -0
- package/lib/native-websocket-session.d.ts +14 -0
- package/lib/native-websocket-session.js +109 -0
- package/lib/native-websocket-socket.d.ts +28 -0
- package/lib/native-websocket-socket.js +215 -0
- package/lib/native-websocket.d.ts +45 -0
- package/lib/native-websocket.js +615 -0
- package/lib/rate-limits.d.ts +35 -0
- package/lib/rate-limits.js +189 -0
- package/lib/replay.d.ts +49 -0
- package/lib/replay.js +240 -0
- package/lib/response-usage.d.ts +14 -0
- package/lib/response-usage.js +35 -0
- package/lib/responses.d.ts +126 -0
- package/lib/responses.js +572 -0
- package/lib/sse.d.ts +13 -0
- package/lib/sse.js +81 -0
- package/lib/upstream.d.ts +6 -0
- package/lib/upstream.js +6 -0
- package/lib/usage.d.ts +29 -0
- package/lib/usage.js +160 -0
- package/package.json +47 -11
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/** Pure WebSocket v2 previous-response and incremental suffix state. */
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { LlmError } from '@deepseek-ai/dsh-llm';
|
|
4
|
+
const MAX_OUTPUT_ITEMS = 2048;
|
|
5
|
+
const MAX_RESPONSE_ID_BYTES = 256;
|
|
6
|
+
const IGNORED_REUSE_FIELDS = new Set([
|
|
7
|
+
'input', 'previous_response_id', 'generate', 'client_metadata',
|
|
8
|
+
'stream_options', 'access_programs',
|
|
9
|
+
]);
|
|
10
|
+
function failure(message, code = 'WS_PROTOCOL_ERROR') {
|
|
11
|
+
return new LlmError(message, code);
|
|
12
|
+
}
|
|
13
|
+
function canonical(value) {
|
|
14
|
+
if (value === null || typeof value !== 'object')
|
|
15
|
+
return JSON.stringify(value);
|
|
16
|
+
if (Array.isArray(value))
|
|
17
|
+
return `[${value.map(canonical).join(',')}]`;
|
|
18
|
+
const row = value;
|
|
19
|
+
return `{${Object.keys(row).sort().map(key => `${JSON.stringify(key)}:${canonical(row[key])}`).join(',')}}`;
|
|
20
|
+
}
|
|
21
|
+
function digest(value) {
|
|
22
|
+
return createHash('sha256').update(canonical(value)).digest('base64url');
|
|
23
|
+
}
|
|
24
|
+
const EMPTY_SEQUENCE_HASH = digest([]);
|
|
25
|
+
/** Match ordered prefixes without retaining one hash per historical input item. */
|
|
26
|
+
function extendSequenceHash(sequenceHash, items) {
|
|
27
|
+
let current = sequenceHash;
|
|
28
|
+
for (const item of items) {
|
|
29
|
+
current = createHash('sha256')
|
|
30
|
+
.update(current).update(String.fromCharCode(0)).update(digest(item))
|
|
31
|
+
.digest('base64url');
|
|
32
|
+
}
|
|
33
|
+
return current;
|
|
34
|
+
}
|
|
35
|
+
function requestParts(request, prefixLength) {
|
|
36
|
+
if (!Array.isArray(request.input))
|
|
37
|
+
throw failure('native Codex WebSocket input is invalid', 'INVALID_ARGS');
|
|
38
|
+
const properties = Object.fromEntries(Object.entries(request).filter(([key]) => !IGNORED_REUSE_FIELDS.has(key)));
|
|
39
|
+
let inputHash = EMPTY_SEQUENCE_HASH;
|
|
40
|
+
let prefixHash = prefixLength === 0 ? inputHash : undefined;
|
|
41
|
+
for (let index = 0; index < request.input.length; index++) {
|
|
42
|
+
inputHash = extendSequenceHash(inputHash, [request.input[index]]);
|
|
43
|
+
if (index + 1 === prefixLength)
|
|
44
|
+
prefixHash = inputHash;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
propertyHash: digest(properties),
|
|
48
|
+
input: request.input,
|
|
49
|
+
inputHash,
|
|
50
|
+
...(prefixHash === undefined ? {} : { prefixHash }),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** One socket chain. Reset it whenever the socket reconnects or a request fails. */
|
|
54
|
+
export class NativeCodexWebSocketSessionState {
|
|
55
|
+
completed;
|
|
56
|
+
pending;
|
|
57
|
+
plan(request, allowEmptySuffix = false) {
|
|
58
|
+
const prefixLength = this.completed?.contextLength;
|
|
59
|
+
const current = requestParts(request, prefixLength);
|
|
60
|
+
const reusable = this.completed !== undefined
|
|
61
|
+
&& this.completed.propertyHash === current.propertyHash
|
|
62
|
+
&& current.prefixHash === this.completed.contextHash
|
|
63
|
+
&& (allowEmptySuffix || current.input.length > this.completed.contextLength);
|
|
64
|
+
this.pending = {
|
|
65
|
+
propertyHash: current.propertyHash,
|
|
66
|
+
inputLength: current.input.length,
|
|
67
|
+
inputHash: current.inputHash,
|
|
68
|
+
};
|
|
69
|
+
if (!reusable || this.completed === undefined) {
|
|
70
|
+
return { payload: { type: 'response.create', ...request }, incremental: false };
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
payload: {
|
|
74
|
+
type: 'response.create',
|
|
75
|
+
...request,
|
|
76
|
+
previous_response_id: this.completed.responseId,
|
|
77
|
+
input: current.input.slice(this.completed.contextLength),
|
|
78
|
+
},
|
|
79
|
+
incremental: true,
|
|
80
|
+
previousResponseId: this.completed.responseId,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
prewarm(request) {
|
|
84
|
+
const plan = this.plan(request);
|
|
85
|
+
return { ...plan, payload: { ...plan.payload, generate: false } };
|
|
86
|
+
}
|
|
87
|
+
complete(responseId, outputItems) {
|
|
88
|
+
if (this.pending === undefined || responseId.length === 0
|
|
89
|
+
|| Buffer.byteLength(responseId) > MAX_RESPONSE_ID_BYTES) {
|
|
90
|
+
this.reset();
|
|
91
|
+
throw failure('native Codex WebSocket completion identity is invalid');
|
|
92
|
+
}
|
|
93
|
+
if (outputItems.length > MAX_OUTPUT_ITEMS) {
|
|
94
|
+
this.reset();
|
|
95
|
+
throw failure('native Codex WebSocket response has too many items');
|
|
96
|
+
}
|
|
97
|
+
this.completed = {
|
|
98
|
+
propertyHash: this.pending.propertyHash,
|
|
99
|
+
contextLength: this.pending.inputLength + outputItems.length,
|
|
100
|
+
contextHash: extendSequenceHash(this.pending.inputHash, outputItems),
|
|
101
|
+
responseId,
|
|
102
|
+
};
|
|
103
|
+
this.pending = undefined;
|
|
104
|
+
}
|
|
105
|
+
reset() {
|
|
106
|
+
this.completed = undefined;
|
|
107
|
+
this.pending = undefined;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type NativeCodexWebSocketFrame = {
|
|
2
|
+
type: 'text';
|
|
3
|
+
text: string;
|
|
4
|
+
} | {
|
|
5
|
+
type: 'close';
|
|
6
|
+
code: number;
|
|
7
|
+
reason: string;
|
|
8
|
+
};
|
|
9
|
+
export interface NativeCodexWebSocket {
|
|
10
|
+
readonly responseHeaders: Readonly<Record<string, string>>;
|
|
11
|
+
send(text: string, signal?: AbortSignal): Promise<void>;
|
|
12
|
+
receive(signal?: AbortSignal): Promise<NativeCodexWebSocketFrame>;
|
|
13
|
+
close(): void;
|
|
14
|
+
}
|
|
15
|
+
export interface NativeCodexWebSocketConnectOptions {
|
|
16
|
+
url: string;
|
|
17
|
+
headers: Record<string, string>;
|
|
18
|
+
signal?: AbortSignal;
|
|
19
|
+
connectTimeoutMs?: number;
|
|
20
|
+
maxFrameBytes?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface NativeCodexWebSocketFactory {
|
|
23
|
+
connect(options: NativeCodexWebSocketConnectOptions): Promise<NativeCodexWebSocket>;
|
|
24
|
+
}
|
|
25
|
+
export declare function nativeCodexWebSocketUrl(endpoint: string): string;
|
|
26
|
+
export declare class NodeNativeCodexWebSocketFactory implements NativeCodexWebSocketFactory {
|
|
27
|
+
connect(options: NativeCodexWebSocketConnectOptions): Promise<NativeCodexWebSocket>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/** Bounded Node WebSocket client seam with injectable deterministic factories. */
|
|
2
|
+
import { LlmError, ProviderRequestId } from '@deepseek-ai/dsh-llm';
|
|
3
|
+
import { nativeCodexEndpoint } from './endpoint.js';
|
|
4
|
+
import { NATIVE_CODEX_CONNECTION_FAILED_CODE, isNativeCodexConnectionFailure, } from './native-adapter.js';
|
|
5
|
+
import WebSocket from 'ws';
|
|
6
|
+
const DEFAULT_CONNECT_TIMEOUT_MS = 10_000;
|
|
7
|
+
const DEFAULT_MAX_FRAME_BYTES = 1024 * 1024;
|
|
8
|
+
const MAX_QUEUED_FRAMES = 4096;
|
|
9
|
+
const MAX_QUEUED_BYTES = 24 * 1024 * 1024;
|
|
10
|
+
function failure(message, code, cause) {
|
|
11
|
+
return new LlmError(message, code, cause === undefined ? undefined : { cause });
|
|
12
|
+
}
|
|
13
|
+
function abortFailure(signal) {
|
|
14
|
+
return signal?.reason instanceof LlmError
|
|
15
|
+
? signal.reason
|
|
16
|
+
: failure('native Codex WebSocket request was aborted', 'ABORTED');
|
|
17
|
+
}
|
|
18
|
+
function handshakeFacts(status, headers) {
|
|
19
|
+
const first = (value) => Array.isArray(value) ? value[0] : value;
|
|
20
|
+
const requestId = first(headers['x-request-id']);
|
|
21
|
+
const retryAfter = Number(first(headers['retry-after']));
|
|
22
|
+
const providerRetryAfterMs = Number.isFinite(retryAfter) && retryAfter > 0
|
|
23
|
+
? Math.min(retryAfter * 1_000, 120_000) : undefined;
|
|
24
|
+
return {
|
|
25
|
+
...(status === undefined ? {} : { status }),
|
|
26
|
+
...(providerRetryAfterMs === undefined ? {} : { providerRetryAfterMs }),
|
|
27
|
+
...(requestId === undefined || requestId.length === 0 || requestId.length > 256
|
|
28
|
+
? {} : { requestId: ProviderRequestId(requestId) }),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function positive(value, fallback, label) {
|
|
32
|
+
if (value === undefined)
|
|
33
|
+
return fallback;
|
|
34
|
+
if (!Number.isSafeInteger(value) || value <= 0)
|
|
35
|
+
throw failure(`native Codex ${label} is invalid`, 'INVALID_ARGS');
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
export function nativeCodexWebSocketUrl(endpoint) {
|
|
39
|
+
const url = nativeCodexEndpoint(endpoint, true);
|
|
40
|
+
if (url.protocol === 'https:')
|
|
41
|
+
url.protocol = 'wss:';
|
|
42
|
+
else if (url.protocol === 'http:')
|
|
43
|
+
url.protocol = 'ws:';
|
|
44
|
+
return url.toString();
|
|
45
|
+
}
|
|
46
|
+
class NodeNativeCodexWebSocket {
|
|
47
|
+
socket;
|
|
48
|
+
responseHeaders;
|
|
49
|
+
maxFrameBytes;
|
|
50
|
+
queue = [];
|
|
51
|
+
queuedBytes = 0;
|
|
52
|
+
waiters = [];
|
|
53
|
+
ended = false;
|
|
54
|
+
constructor(socket, responseHeaders, maxFrameBytes) {
|
|
55
|
+
this.socket = socket;
|
|
56
|
+
this.responseHeaders = responseHeaders;
|
|
57
|
+
this.maxFrameBytes = maxFrameBytes;
|
|
58
|
+
socket.on('message', (data, isBinary) => {
|
|
59
|
+
if (isBinary) {
|
|
60
|
+
this.fail(failure('native Codex WebSocket returned a binary frame', 'WS_PROTOCOL_ERROR'));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (data.byteLength > maxFrameBytes) {
|
|
64
|
+
this.fail(failure('native Codex WebSocket frame exceeded the size limit', 'WS_FRAME_TOO_LARGE'));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.push({ type: 'text', text: data.toString('utf8') }, data.byteLength);
|
|
68
|
+
});
|
|
69
|
+
socket.on('close', (code, reason) => {
|
|
70
|
+
this.ended = true;
|
|
71
|
+
this.push({ type: 'close', code, reason: reason.subarray(0, 256).toString('utf8') });
|
|
72
|
+
});
|
|
73
|
+
socket.on('error', (error) => {
|
|
74
|
+
this.fail(failure('native Codex WebSocket transport failed', 'WS_RETRYABLE', error));
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
push(value, bytes = 0) {
|
|
78
|
+
const waiter = this.waiters.shift();
|
|
79
|
+
if (waiter !== undefined) {
|
|
80
|
+
if (value instanceof LlmError)
|
|
81
|
+
waiter.reject(value);
|
|
82
|
+
else
|
|
83
|
+
waiter.resolve(value);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (this.queue.length >= MAX_QUEUED_FRAMES || this.queuedBytes + bytes > MAX_QUEUED_BYTES) {
|
|
87
|
+
this.fail(failure('native Codex WebSocket queued too much response data', 'WS_RESPONSE_TOO_LARGE'));
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
this.queue.push({ value, bytes });
|
|
91
|
+
this.queuedBytes += bytes;
|
|
92
|
+
}
|
|
93
|
+
fail(error) {
|
|
94
|
+
if (!this.ended)
|
|
95
|
+
this.socket.terminate();
|
|
96
|
+
this.ended = true;
|
|
97
|
+
const waiters = this.waiters.splice(0);
|
|
98
|
+
for (const waiter of waiters)
|
|
99
|
+
waiter.reject(error);
|
|
100
|
+
this.queue.length = 0;
|
|
101
|
+
this.queuedBytes = 0;
|
|
102
|
+
if (waiters.length === 0)
|
|
103
|
+
this.queue.push({ value: error, bytes: 0 });
|
|
104
|
+
}
|
|
105
|
+
async send(text, signal) {
|
|
106
|
+
if (signal?.aborted)
|
|
107
|
+
throw abortFailure(signal);
|
|
108
|
+
if (this.ended || this.socket.readyState !== WebSocket.OPEN) {
|
|
109
|
+
throw failure('native Codex WebSocket is closed', 'WS_RETRYABLE');
|
|
110
|
+
}
|
|
111
|
+
await new Promise((resolve, reject) => {
|
|
112
|
+
const abort = () => {
|
|
113
|
+
this.socket.terminate();
|
|
114
|
+
reject(abortFailure(signal));
|
|
115
|
+
};
|
|
116
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
117
|
+
this.socket.send(text, (error) => {
|
|
118
|
+
signal?.removeEventListener('abort', abort);
|
|
119
|
+
if (error === undefined)
|
|
120
|
+
resolve();
|
|
121
|
+
else
|
|
122
|
+
reject(failure('native Codex WebSocket send failed', 'WS_RETRYABLE', error));
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
async receive(signal) {
|
|
127
|
+
if (signal?.aborted)
|
|
128
|
+
throw abortFailure(signal);
|
|
129
|
+
const queued = this.queue.shift();
|
|
130
|
+
if (queued !== undefined) {
|
|
131
|
+
this.queuedBytes -= queued.bytes;
|
|
132
|
+
if (queued.value instanceof LlmError)
|
|
133
|
+
throw queued.value;
|
|
134
|
+
return queued.value;
|
|
135
|
+
}
|
|
136
|
+
return new Promise((resolve, reject) => {
|
|
137
|
+
let waiter;
|
|
138
|
+
const abort = () => {
|
|
139
|
+
const index = this.waiters.indexOf(waiter);
|
|
140
|
+
if (index >= 0)
|
|
141
|
+
this.waiters.splice(index, 1);
|
|
142
|
+
this.socket.terminate();
|
|
143
|
+
reject(abortFailure(signal));
|
|
144
|
+
};
|
|
145
|
+
waiter = {
|
|
146
|
+
resolve: (frame) => { signal?.removeEventListener('abort', abort); resolve(frame); },
|
|
147
|
+
reject: (error) => { signal?.removeEventListener('abort', abort); reject(error); },
|
|
148
|
+
};
|
|
149
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
150
|
+
this.waiters.push(waiter);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
close() {
|
|
154
|
+
this.ended = true;
|
|
155
|
+
if (this.socket.readyState === WebSocket.OPEN)
|
|
156
|
+
this.socket.close(1000, 'done');
|
|
157
|
+
else
|
|
158
|
+
this.socket.terminate();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
export class NodeNativeCodexWebSocketFactory {
|
|
162
|
+
async connect(options) {
|
|
163
|
+
const timeout = positive(options.connectTimeoutMs, DEFAULT_CONNECT_TIMEOUT_MS, 'connect timeout');
|
|
164
|
+
const maximum = positive(options.maxFrameBytes, DEFAULT_MAX_FRAME_BYTES, 'frame limit');
|
|
165
|
+
if (options.signal?.aborted)
|
|
166
|
+
throw abortFailure(options.signal);
|
|
167
|
+
return new Promise((resolve, reject) => {
|
|
168
|
+
const responseHeaders = {};
|
|
169
|
+
const socket = new WebSocket(nativeCodexWebSocketUrl(options.url), {
|
|
170
|
+
headers: options.headers,
|
|
171
|
+
handshakeTimeout: timeout,
|
|
172
|
+
maxPayload: maximum,
|
|
173
|
+
perMessageDeflate: true,
|
|
174
|
+
});
|
|
175
|
+
const abort = () => {
|
|
176
|
+
socket.terminate();
|
|
177
|
+
reject(abortFailure(options.signal));
|
|
178
|
+
};
|
|
179
|
+
options.signal?.addEventListener('abort', abort, { once: true });
|
|
180
|
+
socket.on('upgrade', (response) => {
|
|
181
|
+
for (const [key, value] of Object.entries(response.headers)) {
|
|
182
|
+
if (typeof value === 'string')
|
|
183
|
+
responseHeaders[key.toLowerCase()] = value;
|
|
184
|
+
else if (Array.isArray(value))
|
|
185
|
+
responseHeaders[key.toLowerCase()] = value.join(', ');
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
socket.on('unexpected-response', (_request, response) => {
|
|
189
|
+
response.resume();
|
|
190
|
+
options.signal?.removeEventListener('abort', abort);
|
|
191
|
+
const code = response.statusCode === 426 ? 'WS_UPGRADE_REQUIRED'
|
|
192
|
+
: response.statusCode === 401 ? 'WS_AUTH'
|
|
193
|
+
: response.statusCode === 403 ? 'AUTH'
|
|
194
|
+
: response.statusCode === 429 ? 'RATE_LIMITED'
|
|
195
|
+
: response.statusCode !== undefined && response.statusCode >= 500
|
|
196
|
+
? 'WS_RETRYABLE'
|
|
197
|
+
: response.statusCode !== undefined && response.statusCode >= 400
|
|
198
|
+
? 'INVALID_REQUEST' : 'WS_HANDSHAKE';
|
|
199
|
+
reject(new LlmError(`native Codex WebSocket handshake failed (HTTP ${response.statusCode ?? 0})`, code, handshakeFacts(response.statusCode, response.headers)));
|
|
200
|
+
});
|
|
201
|
+
socket.on('open', () => {
|
|
202
|
+
options.signal?.removeEventListener('abort', abort);
|
|
203
|
+
resolve(new NodeNativeCodexWebSocket(socket, responseHeaders, maximum));
|
|
204
|
+
});
|
|
205
|
+
socket.on('error', (error) => {
|
|
206
|
+
options.signal?.removeEventListener('abort', abort);
|
|
207
|
+
if (isNativeCodexConnectionFailure(error)) {
|
|
208
|
+
reject(failure('native Codex WebSocket connection failed', NATIVE_CODEX_CONNECTION_FAILED_CODE, error));
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
reject(failure('native Codex WebSocket handshake failed', 'WS_HANDSHAKE', error));
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type GenerateOptions, type StreamChunk } from '@deepseek-ai/dsh-llm';
|
|
2
|
+
import { type NativeCodexTransport, type NativeCodexTransportMode } from './native-adapter.js';
|
|
3
|
+
import { type NativeCodexHttpOptions } from './native-http.js';
|
|
4
|
+
import { type NativeCodexWebSocketFactory } from './native-websocket-socket.js';
|
|
5
|
+
export interface NativeCodexWebSocketTransportOptions extends NativeCodexHttpOptions {
|
|
6
|
+
webSocketFactory?: NativeCodexWebSocketFactory;
|
|
7
|
+
webSocketConnectTimeoutMs?: number;
|
|
8
|
+
webSocketIdleTimeoutMs?: number;
|
|
9
|
+
maxWebSocketFrameBytes?: number;
|
|
10
|
+
maxWebSocketSessions?: number;
|
|
11
|
+
webSocketSessionIdleMs?: number;
|
|
12
|
+
maxWebSocketReconnects?: number;
|
|
13
|
+
}
|
|
14
|
+
/** Prefer WebSocket v2; once safe retries exhaust, keep that DSH session on HTTP. */
|
|
15
|
+
export declare class NativeCodexWebSocketTransport implements NativeCodexTransport {
|
|
16
|
+
private readonly options;
|
|
17
|
+
private readonly http;
|
|
18
|
+
private readonly factory;
|
|
19
|
+
private readonly sessions;
|
|
20
|
+
private readonly connectTimeoutMs;
|
|
21
|
+
private readonly idleTimeoutMs;
|
|
22
|
+
private readonly maxFrameBytes;
|
|
23
|
+
private readonly maxSessions;
|
|
24
|
+
private readonly sessionIdleMs;
|
|
25
|
+
private readonly maxReconnects;
|
|
26
|
+
private readonly initialRetryDelayMs;
|
|
27
|
+
private readonly maxRetryDelayMs;
|
|
28
|
+
private readonly active;
|
|
29
|
+
private disposed;
|
|
30
|
+
constructor(options: NativeCodexWebSocketTransportOptions);
|
|
31
|
+
private retryDelay;
|
|
32
|
+
private wait;
|
|
33
|
+
private waitForConnection;
|
|
34
|
+
private closeEntry;
|
|
35
|
+
private prune;
|
|
36
|
+
private entry;
|
|
37
|
+
private assertFastAuthority;
|
|
38
|
+
private headers;
|
|
39
|
+
private ensureSocket;
|
|
40
|
+
private receive;
|
|
41
|
+
private exchange;
|
|
42
|
+
private attempt;
|
|
43
|
+
stream(generation: GenerateOptions, mode?: NativeCodexTransportMode): AsyncIterable<StreamChunk>;
|
|
44
|
+
dispose(): void;
|
|
45
|
+
}
|