@antseed/node 0.1.3 → 0.1.5

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 (65) hide show
  1. package/README.md +8 -0
  2. package/dist/discovery/announcer.d.ts +3 -0
  3. package/dist/discovery/announcer.d.ts.map +1 -1
  4. package/dist/discovery/announcer.js +28 -1
  5. package/dist/discovery/announcer.js.map +1 -1
  6. package/dist/discovery/metadata-codec.d.ts +3 -0
  7. package/dist/discovery/metadata-codec.d.ts.map +1 -1
  8. package/dist/discovery/metadata-codec.js +62 -0
  9. package/dist/discovery/metadata-codec.js.map +1 -1
  10. package/dist/discovery/metadata-validator.d.ts +1 -0
  11. package/dist/discovery/metadata-validator.d.ts.map +1 -1
  12. package/dist/discovery/metadata-validator.js +71 -2
  13. package/dist/discovery/metadata-validator.js.map +1 -1
  14. package/dist/discovery/peer-metadata.d.ts +6 -1
  15. package/dist/discovery/peer-metadata.d.ts.map +1 -1
  16. package/dist/discovery/peer-metadata.js +3 -1
  17. package/dist/discovery/peer-metadata.js.map +1 -1
  18. package/dist/index.d.ts +2 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +2 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/interfaces/seller-provider.d.ts +3 -0
  23. package/dist/interfaces/seller-provider.d.ts.map +1 -1
  24. package/dist/node.d.ts +1 -0
  25. package/dist/node.d.ts.map +1 -1
  26. package/dist/node.js +30 -3
  27. package/dist/node.js.map +1 -1
  28. package/dist/proxy/index.d.ts +1 -0
  29. package/dist/proxy/index.d.ts.map +1 -1
  30. package/dist/proxy/index.js +1 -0
  31. package/dist/proxy/index.js.map +1 -1
  32. package/dist/proxy/model-api-adapter.d.ts +20 -0
  33. package/dist/proxy/model-api-adapter.d.ts.map +1 -0
  34. package/dist/proxy/model-api-adapter.js +514 -0
  35. package/dist/proxy/model-api-adapter.js.map +1 -0
  36. package/dist/proxy/proxy-mux.d.ts +32 -1
  37. package/dist/proxy/proxy-mux.d.ts.map +1 -1
  38. package/dist/proxy/proxy-mux.js +190 -10
  39. package/dist/proxy/proxy-mux.js.map +1 -1
  40. package/dist/proxy/request-codec.d.ts +10 -1
  41. package/dist/proxy/request-codec.d.ts.map +1 -1
  42. package/dist/proxy/request-codec.js +40 -0
  43. package/dist/proxy/request-codec.js.map +1 -1
  44. package/dist/types/http.d.ts +9 -0
  45. package/dist/types/http.d.ts.map +1 -1
  46. package/dist/types/http.js +4 -0
  47. package/dist/types/http.js.map +1 -1
  48. package/dist/types/index.d.ts +1 -0
  49. package/dist/types/index.d.ts.map +1 -1
  50. package/dist/types/index.js +1 -0
  51. package/dist/types/index.js.map +1 -1
  52. package/dist/types/model-api.d.ts +4 -0
  53. package/dist/types/model-api.d.ts.map +1 -0
  54. package/dist/types/model-api.js +10 -0
  55. package/dist/types/model-api.js.map +1 -0
  56. package/dist/types/peer.d.ts +6 -0
  57. package/dist/types/peer.d.ts.map +1 -1
  58. package/dist/types/peer.js.map +1 -1
  59. package/dist/types/plugin-config.d.ts +1 -1
  60. package/dist/types/plugin-config.d.ts.map +1 -1
  61. package/dist/types/protocol.d.ts +2 -0
  62. package/dist/types/protocol.d.ts.map +1 -1
  63. package/dist/types/protocol.js +3 -0
  64. package/dist/types/protocol.js.map +1 -1
  65. package/package.json +1 -1
@@ -0,0 +1,514 @@
1
+ const ANTHROPIC_PROVIDER_NAMES = new Set(['anthropic', 'claude-code', 'claude-oauth']);
2
+ const OPENAI_CHAT_PROVIDER_NAMES = new Set(['openai', 'local-llm']);
3
+ function parseJsonObject(body) {
4
+ try {
5
+ const parsed = JSON.parse(new TextDecoder().decode(body));
6
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
7
+ return null;
8
+ }
9
+ return parsed;
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
15
+ function encodeJson(value) {
16
+ return new TextEncoder().encode(JSON.stringify(value));
17
+ }
18
+ function toStringContent(value) {
19
+ if (typeof value === 'string') {
20
+ return value;
21
+ }
22
+ if (Array.isArray(value)) {
23
+ return value
24
+ .map((entry) => {
25
+ if (!entry || typeof entry !== 'object') {
26
+ return '';
27
+ }
28
+ const block = entry;
29
+ if (block.type === 'text' && typeof block.text === 'string') {
30
+ return block.text;
31
+ }
32
+ if (block.type === 'tool_result') {
33
+ return toStringContent(block.content);
34
+ }
35
+ return '';
36
+ })
37
+ .filter((entry) => entry.length > 0)
38
+ .join('\n');
39
+ }
40
+ if (value === null || value === undefined) {
41
+ return '';
42
+ }
43
+ return String(value);
44
+ }
45
+ function parseJsonSafe(raw) {
46
+ try {
47
+ return JSON.parse(raw);
48
+ }
49
+ catch {
50
+ return raw;
51
+ }
52
+ }
53
+ function mapFinishReasonToAnthropicStopReason(value) {
54
+ if (typeof value !== 'string' || value.length === 0) {
55
+ return null;
56
+ }
57
+ if (value === 'stop')
58
+ return 'end_turn';
59
+ if (value === 'length')
60
+ return 'max_tokens';
61
+ if (value === 'tool_calls' || value === 'function_call')
62
+ return 'tool_use';
63
+ return value;
64
+ }
65
+ function toNonNegativeInt(value) {
66
+ const parsed = Number(value);
67
+ if (!Number.isFinite(parsed) || parsed <= 0) {
68
+ return 0;
69
+ }
70
+ return Math.floor(parsed);
71
+ }
72
+ function convertAnthropicMessagesToOpenAI(body) {
73
+ const out = [];
74
+ if (body.system !== undefined) {
75
+ const systemText = toStringContent(body.system);
76
+ if (systemText.length > 0) {
77
+ out.push({ role: 'system', content: systemText });
78
+ }
79
+ }
80
+ const messagesRaw = body.messages;
81
+ if (!Array.isArray(messagesRaw)) {
82
+ return out;
83
+ }
84
+ for (const messageRaw of messagesRaw) {
85
+ if (!messageRaw || typeof messageRaw !== 'object') {
86
+ continue;
87
+ }
88
+ const message = messageRaw;
89
+ const role = typeof message.role === 'string' ? message.role : 'user';
90
+ const content = message.content;
91
+ if (role === 'assistant' && Array.isArray(content)) {
92
+ const textParts = [];
93
+ const toolCalls = [];
94
+ for (const blockRaw of content) {
95
+ if (!blockRaw || typeof blockRaw !== 'object') {
96
+ continue;
97
+ }
98
+ const block = blockRaw;
99
+ const blockType = typeof block.type === 'string' ? block.type : '';
100
+ if (blockType === 'tool_use') {
101
+ const callName = typeof block.name === 'string' && block.name.length > 0 ? block.name : 'tool';
102
+ const callId = typeof block.id === 'string' && block.id.length > 0
103
+ ? block.id
104
+ : `call_${toolCalls.length + 1}`;
105
+ const input = block.input && typeof block.input === 'object' ? block.input : {};
106
+ toolCalls.push({
107
+ id: callId,
108
+ type: 'function',
109
+ function: {
110
+ name: callName,
111
+ arguments: JSON.stringify(input),
112
+ },
113
+ });
114
+ continue;
115
+ }
116
+ const text = toStringContent(block);
117
+ if (text.length > 0) {
118
+ textParts.push(text);
119
+ }
120
+ }
121
+ const assistantMessage = {
122
+ role: 'assistant',
123
+ content: textParts.join('\n'),
124
+ };
125
+ if (toolCalls.length > 0) {
126
+ assistantMessage.tool_calls = toolCalls;
127
+ }
128
+ out.push(assistantMessage);
129
+ continue;
130
+ }
131
+ if (role === 'user' && Array.isArray(content)) {
132
+ const textParts = [];
133
+ const toolResults = [];
134
+ for (const blockRaw of content) {
135
+ if (!blockRaw || typeof blockRaw !== 'object') {
136
+ continue;
137
+ }
138
+ const block = blockRaw;
139
+ const blockType = typeof block.type === 'string' ? block.type : '';
140
+ if (blockType === 'tool_result') {
141
+ const toolCallId = typeof block.tool_use_id === 'string' ? block.tool_use_id : '';
142
+ if (toolCallId.length > 0) {
143
+ toolResults.push({
144
+ role: 'tool',
145
+ tool_call_id: toolCallId,
146
+ content: toStringContent(block.content),
147
+ });
148
+ continue;
149
+ }
150
+ }
151
+ const text = toStringContent(block);
152
+ if (text.length > 0) {
153
+ textParts.push(text);
154
+ }
155
+ }
156
+ if (textParts.length > 0) {
157
+ out.push({
158
+ role: 'user',
159
+ content: textParts.join('\n'),
160
+ });
161
+ }
162
+ out.push(...toolResults);
163
+ continue;
164
+ }
165
+ out.push({
166
+ role,
167
+ content: toStringContent(content),
168
+ });
169
+ }
170
+ return out;
171
+ }
172
+ function convertAnthropicToolsToOpenAI(toolsRaw) {
173
+ if (!Array.isArray(toolsRaw) || toolsRaw.length === 0) {
174
+ return undefined;
175
+ }
176
+ const out = [];
177
+ for (const toolRaw of toolsRaw) {
178
+ if (!toolRaw || typeof toolRaw !== 'object') {
179
+ continue;
180
+ }
181
+ const tool = toolRaw;
182
+ if (typeof tool.name !== 'string' || tool.name.length === 0) {
183
+ continue;
184
+ }
185
+ out.push({
186
+ type: 'function',
187
+ function: {
188
+ name: tool.name,
189
+ ...(typeof tool.description === 'string' && tool.description.length > 0
190
+ ? { description: tool.description }
191
+ : {}),
192
+ parameters: tool.input_schema && typeof tool.input_schema === 'object'
193
+ ? tool.input_schema
194
+ : { type: 'object', properties: {} },
195
+ },
196
+ });
197
+ }
198
+ return out.length > 0 ? out : undefined;
199
+ }
200
+ function convertAnthropicToolChoiceToOpenAI(toolChoice) {
201
+ if (typeof toolChoice === 'string') {
202
+ if (toolChoice === 'auto' || toolChoice === 'none' || toolChoice === 'required') {
203
+ return toolChoice;
204
+ }
205
+ return undefined;
206
+ }
207
+ if (!toolChoice || typeof toolChoice !== 'object') {
208
+ return undefined;
209
+ }
210
+ const choice = toolChoice;
211
+ const type = typeof choice.type === 'string' ? choice.type : '';
212
+ if (type === 'auto') {
213
+ return 'auto';
214
+ }
215
+ if (type === 'any') {
216
+ return 'required';
217
+ }
218
+ if (type === 'tool' && typeof choice.name === 'string' && choice.name.length > 0) {
219
+ return {
220
+ type: 'function',
221
+ function: {
222
+ name: choice.name,
223
+ },
224
+ };
225
+ }
226
+ return undefined;
227
+ }
228
+ function buildAnthropicStreamFromMessage(message) {
229
+ const chunks = [];
230
+ const pushEvent = (event, data) => {
231
+ chunks.push(`event: ${event}\n`);
232
+ chunks.push(`data: ${JSON.stringify(data)}\n\n`);
233
+ };
234
+ pushEvent('message_start', {
235
+ type: 'message_start',
236
+ message: {
237
+ id: message.id,
238
+ type: 'message',
239
+ role: 'assistant',
240
+ model: message.model,
241
+ content: [],
242
+ stop_reason: null,
243
+ stop_sequence: null,
244
+ usage: {
245
+ input_tokens: message.usage.inputTokens,
246
+ output_tokens: 0,
247
+ },
248
+ },
249
+ });
250
+ message.content.forEach((block, index) => {
251
+ pushEvent('content_block_start', {
252
+ type: 'content_block_start',
253
+ index,
254
+ content_block: block.type === 'text'
255
+ ? { type: 'text', text: '' }
256
+ : { type: 'tool_use', id: block.id, name: block.name, input: block.input },
257
+ });
258
+ if (block.type === 'text' && block.text.length > 0) {
259
+ pushEvent('content_block_delta', {
260
+ type: 'content_block_delta',
261
+ index,
262
+ delta: {
263
+ type: 'text_delta',
264
+ text: block.text,
265
+ },
266
+ });
267
+ }
268
+ pushEvent('content_block_stop', {
269
+ type: 'content_block_stop',
270
+ index,
271
+ });
272
+ });
273
+ pushEvent('message_delta', {
274
+ type: 'message_delta',
275
+ delta: {
276
+ stop_reason: message.stopReason,
277
+ stop_sequence: null,
278
+ },
279
+ usage: {
280
+ output_tokens: message.usage.outputTokens,
281
+ },
282
+ });
283
+ pushEvent('message_stop', {
284
+ type: 'message_stop',
285
+ });
286
+ return new TextEncoder().encode(chunks.join(''));
287
+ }
288
+ export function detectRequestModelApiProtocol(request) {
289
+ const normalizedPath = request.path.toLowerCase();
290
+ if (normalizedPath.startsWith('/v1/messages') || normalizedPath.startsWith('/v1/complete')) {
291
+ return 'anthropic-messages';
292
+ }
293
+ if (normalizedPath.startsWith('/v1/chat/completions')) {
294
+ return 'openai-chat-completions';
295
+ }
296
+ if (normalizedPath.startsWith('/v1/completions')) {
297
+ return 'openai-completions';
298
+ }
299
+ const hasAnthropicVersionHeader = Object.keys(request.headers)
300
+ .some((key) => key.toLowerCase() === 'anthropic-version');
301
+ if (hasAnthropicVersionHeader) {
302
+ return 'anthropic-messages';
303
+ }
304
+ return null;
305
+ }
306
+ export function inferProviderDefaultModelApiProtocols(providerName) {
307
+ const normalized = providerName.trim().toLowerCase();
308
+ if (normalized.length === 0) {
309
+ return [];
310
+ }
311
+ if (ANTHROPIC_PROVIDER_NAMES.has(normalized)) {
312
+ return ['anthropic-messages'];
313
+ }
314
+ if (OPENAI_CHAT_PROVIDER_NAMES.has(normalized)) {
315
+ return ['openai-chat-completions'];
316
+ }
317
+ return [];
318
+ }
319
+ export function selectTargetProtocolForRequest(requestProtocol, supportedProtocols) {
320
+ if (!requestProtocol) {
321
+ return null;
322
+ }
323
+ if (supportedProtocols.includes(requestProtocol)) {
324
+ return { targetProtocol: requestProtocol, requiresTransform: false };
325
+ }
326
+ if (requestProtocol === 'anthropic-messages' && supportedProtocols.includes('openai-chat-completions')) {
327
+ return { targetProtocol: 'openai-chat-completions', requiresTransform: true };
328
+ }
329
+ return null;
330
+ }
331
+ export function transformAnthropicMessagesRequestToOpenAIChat(request) {
332
+ if (!request.path.toLowerCase().startsWith('/v1/messages')) {
333
+ return null;
334
+ }
335
+ const body = parseJsonObject(request.body);
336
+ if (!body) {
337
+ return null;
338
+ }
339
+ const streamRequested = body.stream === true;
340
+ const requestedModel = typeof body.model === 'string' && body.model.trim().length > 0
341
+ ? body.model.trim()
342
+ : null;
343
+ const mappedMessages = convertAnthropicMessagesToOpenAI(body);
344
+ const mappedTools = convertAnthropicToolsToOpenAI(body.tools);
345
+ const mappedToolChoice = convertAnthropicToolChoiceToOpenAI(body.tool_choice);
346
+ const transformedBody = {
347
+ ...(requestedModel ? { model: requestedModel } : {}),
348
+ messages: mappedMessages,
349
+ stream: false,
350
+ };
351
+ if (typeof body.max_tokens === 'number') {
352
+ transformedBody.max_tokens = body.max_tokens;
353
+ }
354
+ if (typeof body.temperature === 'number') {
355
+ transformedBody.temperature = body.temperature;
356
+ }
357
+ if (typeof body.top_p === 'number') {
358
+ transformedBody.top_p = body.top_p;
359
+ }
360
+ if (Array.isArray(body.stop_sequences)) {
361
+ transformedBody.stop = body.stop_sequences;
362
+ }
363
+ if (mappedTools) {
364
+ transformedBody.tools = mappedTools;
365
+ }
366
+ if (mappedToolChoice !== undefined) {
367
+ transformedBody.tool_choice = mappedToolChoice;
368
+ }
369
+ if (body.metadata && typeof body.metadata === 'object' && !Array.isArray(body.metadata)) {
370
+ transformedBody.metadata = body.metadata;
371
+ }
372
+ if (typeof body.user === 'string') {
373
+ transformedBody.user = body.user;
374
+ }
375
+ const transformedHeaders = { ...request.headers };
376
+ for (const headerName of Object.keys(transformedHeaders)) {
377
+ const lower = headerName.toLowerCase();
378
+ if (lower === 'anthropic-version' || lower === 'anthropic-beta') {
379
+ delete transformedHeaders[headerName];
380
+ }
381
+ }
382
+ transformedHeaders['content-type'] = 'application/json';
383
+ return {
384
+ request: {
385
+ ...request,
386
+ path: '/v1/chat/completions',
387
+ headers: transformedHeaders,
388
+ body: encodeJson(transformedBody),
389
+ },
390
+ streamRequested,
391
+ requestedModel,
392
+ };
393
+ }
394
+ export function transformOpenAIChatResponseToAnthropicMessage(response, options) {
395
+ const parsed = parseJsonObject(response.body);
396
+ if (!parsed) {
397
+ return response;
398
+ }
399
+ if (response.statusCode >= 400) {
400
+ const openaiError = parsed.error && typeof parsed.error === 'object'
401
+ ? parsed.error
402
+ : null;
403
+ const message = openaiError && typeof openaiError.message === 'string'
404
+ ? openaiError.message
405
+ : 'Upstream error';
406
+ const anthropicError = {
407
+ type: 'error',
408
+ error: {
409
+ type: 'api_error',
410
+ message,
411
+ },
412
+ };
413
+ return {
414
+ ...response,
415
+ headers: {
416
+ ...response.headers,
417
+ 'content-type': options.streamRequested ? 'text/event-stream' : 'application/json',
418
+ },
419
+ body: options.streamRequested
420
+ ? new TextEncoder().encode(`event: error\ndata: ${JSON.stringify(anthropicError)}\n\n`)
421
+ : encodeJson(anthropicError),
422
+ };
423
+ }
424
+ const choices = Array.isArray(parsed.choices) ? parsed.choices : [];
425
+ const firstChoice = choices[0] && typeof choices[0] === 'object'
426
+ ? choices[0]
427
+ : null;
428
+ const message = firstChoice?.message && typeof firstChoice.message === 'object'
429
+ ? firstChoice.message
430
+ : null;
431
+ const finishReason = mapFinishReasonToAnthropicStopReason(firstChoice?.finish_reason);
432
+ const contentBlocks = [];
433
+ const textContent = toStringContent(message?.content);
434
+ if (textContent.length > 0) {
435
+ contentBlocks.push({ type: 'text', text: textContent });
436
+ }
437
+ const toolCalls = Array.isArray(message?.tool_calls) ? message.tool_calls : [];
438
+ for (const [index, toolCallRaw] of toolCalls.entries()) {
439
+ if (!toolCallRaw || typeof toolCallRaw !== 'object') {
440
+ continue;
441
+ }
442
+ const toolCall = toolCallRaw;
443
+ const functionPayload = toolCall.function && typeof toolCall.function === 'object'
444
+ ? toolCall.function
445
+ : {};
446
+ const id = typeof toolCall.id === 'string' && toolCall.id.length > 0
447
+ ? toolCall.id
448
+ : `toolu_${index + 1}`;
449
+ const name = typeof functionPayload.name === 'string' && functionPayload.name.length > 0
450
+ ? functionPayload.name
451
+ : 'tool';
452
+ const argsRaw = typeof functionPayload.arguments === 'string' ? functionPayload.arguments : '{}';
453
+ const parsedArgs = parseJsonSafe(argsRaw);
454
+ contentBlocks.push({
455
+ type: 'tool_use',
456
+ id,
457
+ name,
458
+ input: parsedArgs && typeof parsedArgs === 'object' && !Array.isArray(parsedArgs)
459
+ ? parsedArgs
460
+ : { raw: argsRaw },
461
+ });
462
+ }
463
+ const usage = parsed.usage && typeof parsed.usage === 'object'
464
+ ? parsed.usage
465
+ : {};
466
+ const inputTokens = toNonNegativeInt(usage.prompt_tokens ?? usage.input_tokens);
467
+ const outputTokens = toNonNegativeInt(usage.completion_tokens ?? usage.output_tokens);
468
+ const id = typeof parsed.id === 'string' && parsed.id.length > 0 ? parsed.id : `msg_${response.requestId}`;
469
+ const model = typeof parsed.model === 'string' && parsed.model.length > 0
470
+ ? parsed.model
471
+ : (options.fallbackModel ?? 'unknown');
472
+ const anthropicMessage = {
473
+ id,
474
+ type: 'message',
475
+ role: 'assistant',
476
+ model,
477
+ content: contentBlocks,
478
+ stop_reason: finishReason,
479
+ stop_sequence: null,
480
+ usage: {
481
+ input_tokens: inputTokens,
482
+ output_tokens: outputTokens,
483
+ },
484
+ };
485
+ if (options.streamRequested) {
486
+ return {
487
+ ...response,
488
+ headers: {
489
+ ...response.headers,
490
+ 'content-type': 'text/event-stream',
491
+ 'cache-control': 'no-cache',
492
+ },
493
+ body: buildAnthropicStreamFromMessage({
494
+ id,
495
+ model,
496
+ content: contentBlocks,
497
+ stopReason: finishReason,
498
+ usage: {
499
+ inputTokens,
500
+ outputTokens,
501
+ },
502
+ }),
503
+ };
504
+ }
505
+ return {
506
+ ...response,
507
+ headers: {
508
+ ...response.headers,
509
+ 'content-type': 'application/json',
510
+ },
511
+ body: encodeJson(anthropicMessage),
512
+ };
513
+ }
514
+ //# sourceMappingURL=model-api-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-api-adapter.js","sourceRoot":"","sources":["../../src/proxy/model-api-adapter.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,15 @@ type ResponseHandler = (response: SerializedHttpResponse, metadata: {
6
6
  }) => void;
7
7
  type ChunkHandler = (chunk: SerializedHttpResponseChunk) => void;
8
8
  type RequestHandler = (request: SerializedHttpRequest) => void | Promise<void>;
9
+ /** Per-request upload size cap, total budget, and stall timeout. */
10
+ export interface ProxyMuxUploadLimits {
11
+ /** Max body bytes for a single upload. Default: 32 MiB. Buyer receives 413 on violation. */
12
+ maxUploadBodyBytes?: number;
13
+ /** Max bytes across ALL concurrent in-progress uploads. Default: 256 MiB. */
14
+ maxTotalPendingUploadBytes?: number;
15
+ /** Max ms between the header frame and HttpRequestEnd. Default: 120_000 ms. */
16
+ uploadTimeoutMs?: number;
17
+ }
9
18
  /**
10
19
  * Request/response multiplexer over DataChannel.
11
20
  * Handles both buyer-side and seller-side proxy communication.
@@ -16,9 +25,16 @@ export declare class ProxyMux {
16
25
  private readonly _responseHandlers;
17
26
  private readonly _chunkHandlers;
18
27
  private _requestHandler;
19
- constructor(connection: PeerConnection);
28
+ private readonly _pendingUploads;
29
+ private _totalPendingUploadBytes;
30
+ private readonly _maxUploadBodyBytes;
31
+ private readonly _maxTotalPendingUploadBytes;
32
+ private readonly _uploadTimeoutMs;
33
+ constructor(connection: PeerConnection, uploadLimits?: ProxyMuxUploadLimits);
20
34
  /** Buyer side: send a proxy request and register response/chunk handlers. */
21
35
  sendProxyRequest(request: SerializedHttpRequest, onResponse: ResponseHandler, onChunk: ChunkHandler): void;
36
+ /** Buyer side: split a large request body into HttpRequest + HttpRequestChunk* + HttpRequestEnd. */
37
+ private _sendChunkedRequest;
22
38
  /** Buyer side: cancel handlers for an in-flight request. */
23
39
  cancelProxyRequest(requestId: string): void;
24
40
  /** Seller side: register a handler for incoming proxy requests. */
@@ -31,6 +47,21 @@ export declare class ProxyMux {
31
47
  handleFrame(frame: FramedMessage): Promise<void>;
32
48
  /** Number of in-flight requests (buyer side). */
33
49
  activeRequestCount(): number;
50
+ /** Number of in-progress chunked uploads buffered on the seller side. */
51
+ pendingUploadCount(): number;
52
+ /** Total bytes currently buffered across all in-progress uploads. */
53
+ pendingUploadBytes(): number;
54
+ /**
55
+ * Seller side: abort and discard all buffered chunked-upload state.
56
+ * Call on connection close or session end to prevent memory leaks.
57
+ * Zeros all buffered chunk data before discarding.
58
+ */
59
+ abortPendingUploads(): void;
60
+ /**
61
+ * Abort a single in-progress upload, zero its buffers, and send an error
62
+ * response to the buyer.
63
+ */
64
+ private _abortUpload;
34
65
  private _nextMessageId;
35
66
  }
36
67
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"proxy-mux.d.ts","sourceRoot":"","sources":["../../src/proxy/proxy-mux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAWnE,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,EAC5B,MAAM,kBAAkB,CAAC;AAE1B,KAAK,eAAe,GAAG,CACrB,QAAQ,EAAE,sBAAsB,EAChC,QAAQ,EAAE;IAAE,cAAc,EAAE,OAAO,CAAA;CAAE,KAClC,IAAI,CAAC;AACV,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,2BAA2B,KAAK,IAAI,CAAC;AACjE,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE/E;;;GAGG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;IAC7C,OAAO,CAAC,iBAAiB,CAAK;IAG9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsC;IACxE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmC;IAGlE,OAAO,CAAC,eAAe,CAA+B;gBAE1C,UAAU,EAAE,cAAc;IAItC,6EAA6E;IAC7E,gBAAgB,CACd,OAAO,EAAE,qBAAqB,EAC9B,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE,YAAY,GACpB,IAAI;IAcP,4DAA4D;IAC5D,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK3C,mEAAmE;IACnE,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAI7C,mDAAmD;IACnD,iBAAiB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAWzD,gDAAgD;IAChD,cAAc,CAAC,KAAK,EAAE,2BAA2B,GAAG,IAAI;IAexD,4EAA4E;IACtE,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAkEtD,iDAAiD;IACjD,kBAAkB,IAAI,MAAM;IAI5B,OAAO,CAAC,cAAc;CAKvB"}
1
+ {"version":3,"file":"proxy-mux.d.ts","sourceRoot":"","sources":["../../src/proxy/proxy-mux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAiBnE,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,EAC5B,MAAM,kBAAkB,CAAC;AAE1B,KAAK,eAAe,GAAG,CACrB,QAAQ,EAAE,sBAAsB,EAChC,QAAQ,EAAE;IAAE,cAAc,EAAE,OAAO,CAAA;CAAE,KAClC,IAAI,CAAC;AACV,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,2BAA2B,KAAK,IAAI,CAAC;AACjE,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE/E,oEAAoE;AACpE,MAAM,WAAW,oBAAoB;IACnC,4FAA4F;IAC5F,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6EAA6E;IAC7E,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAaD;;;GAGG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;IAC7C,OAAO,CAAC,iBAAiB,CAAK;IAG9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsC;IACxE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmC;IAGlE,OAAO,CAAC,eAAe,CAA+B;IAGtD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IACpE,OAAO,CAAC,wBAAwB,CAAK;IAErC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAS;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,UAAU,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,oBAAoB;IAO3E,6EAA6E;IAC7E,gBAAgB,CACd,OAAO,EAAE,qBAAqB,EAC9B,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE,YAAY,GACpB,IAAI;IAgBP,oGAAoG;IACpG,OAAO,CAAC,mBAAmB;IAiC3B,4DAA4D;IAC5D,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK3C,mEAAmE;IACnE,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAI7C,mDAAmD;IACnD,iBAAiB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAWzD,gDAAgD;IAChD,cAAc,CAAC,KAAK,EAAE,2BAA2B,GAAG,IAAI;IAexD,4EAA4E;IACtE,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAkJtD,iDAAiD;IACjD,kBAAkB,IAAI,MAAM;IAI5B,yEAAyE;IACzE,kBAAkB,IAAI,MAAM;IAI5B,qEAAqE;IACrE,kBAAkB,IAAI,MAAM;IAI5B;;;;OAIG;IACH,mBAAmB,IAAI,IAAI;IAS3B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,cAAc;CAKvB"}