niceeval 0.14.1-canary.51 → 0.14.2
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/INDEX.md +1 -1
- package/dist/agents/codex-app-server.cjs +7 -1
- package/dist/agents/codex-app-server.cjs.map +1 -1
- package/dist/inspection/overview.cjs +7 -3
- package/dist/inspection/overview.cjs.map +1 -1
- package/dist/sandbox/incus/control.cjs +28 -1
- package/dist/sandbox/incus/control.cjs.map +1 -1
- package/dist/show/render.cjs +28 -15
- package/dist/show/render.cjs.map +1 -1
- package/dist/view/function-runtime.mjs +2 -2
- package/docs-site/zh/reference/cli.mdx +4 -2
- package/docs-site/zh/troubleshooting/debugging.mdx +20 -1
- package/docs-site/zh/tutorials/criteria-files.mdx +2 -0
- package/docs-site/zh/tutorials/evaluation-kinds.mdx +1 -1
- package/docs-site/zh/tutorials/rerun-and-cache.mdx +3 -1
- package/docs-site/zh/tutorials/viewing-results.mdx +43 -4
- package/node_modules/undici/docs/docs/api/Client.md +4 -0
- package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +3 -2
- package/node_modules/undici/docs/docs/api/EventSource.md +4 -0
- package/node_modules/undici/lib/cache/memory-cache-store.js +1 -1
- package/node_modules/undici/lib/dispatcher/agent.js +7 -2
- package/node_modules/undici/lib/dispatcher/balanced-pool.js +1 -1
- package/node_modules/undici/lib/dispatcher/client-h1.js +12 -4
- package/node_modules/undici/lib/dispatcher/client-h2.js +43 -3
- package/node_modules/undici/lib/dispatcher/client.js +3 -2
- package/node_modules/undici/lib/dispatcher/dispatcher-base.js +13 -1
- package/node_modules/undici/lib/dispatcher/dispatcher.js +10 -0
- package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +10 -3
- package/node_modules/undici/lib/dispatcher/proxy-agent.js +1 -1
- package/node_modules/undici/lib/dispatcher/round-robin-pool.js +1 -1
- package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +3 -1
- package/node_modules/undici/lib/handler/cache-handler.js +8 -0
- package/node_modules/undici/lib/handler/decorator-handler.js +7 -1
- package/node_modules/undici/lib/handler/deduplication-handler.js +12 -6
- package/node_modules/undici/lib/handler/redirect-handler.js +8 -0
- package/node_modules/undici/lib/handler/retry-handler.js +83 -11
- package/node_modules/undici/lib/interceptor/dump.js +1 -1
- package/node_modules/undici/lib/mock/mock-agent.js +13 -1
- package/node_modules/undici/lib/mock/mock-utils.js +11 -10
- package/node_modules/undici/lib/web/cookies/parse.js +4 -2
- package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +28 -1
- package/node_modules/undici/lib/web/eventsource/eventsource.js +4 -1
- package/node_modules/undici/lib/web/fetch/request.js +2 -3
- package/node_modules/undici/package.json +3 -3
- package/node_modules/undici/types/client.d.ts +10 -0
- package/package.json +4 -4
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
const assert = require('node:assert')
|
|
3
3
|
|
|
4
4
|
const { kRetryHandlerDefaultRetry } = require('../core/symbols')
|
|
5
|
-
const { RequestRetryError } = require('../core/errors')
|
|
5
|
+
const { RequestRetryError, RequestAbortedError } = require('../core/errors')
|
|
6
6
|
const {
|
|
7
7
|
isDisturbed,
|
|
8
8
|
parseRangeHeader,
|
|
@@ -41,14 +41,26 @@ function validatePartialResponseContentLength (headers, range, statusCode, retry
|
|
|
41
41
|
// new one: backpressure pauses the new connection's controller, but the
|
|
42
42
|
// consumer's resume() targets the old one, so the resumed body stalls forever.
|
|
43
43
|
// The proxy always forwards to the controller of the currently active connection.
|
|
44
|
+
// An abort is additionally reported to the handler so it can cancel a pending
|
|
45
|
+
// retry backoff instead of letting the request hang until the backoff elapses.
|
|
46
|
+
// The notification is a private callback the handler hands over on construction,
|
|
47
|
+
// so nothing outside the handler can trigger it.
|
|
44
48
|
class RetryController {
|
|
45
|
-
|
|
49
|
+
#onAbort
|
|
50
|
+
|
|
51
|
+
constructor (onAbort) {
|
|
52
|
+
this.#onAbort = onAbort
|
|
46
53
|
this.target = null
|
|
47
54
|
}
|
|
48
55
|
|
|
49
56
|
pause () { this.target?.pause() }
|
|
50
57
|
resume () { this.target?.resume() }
|
|
51
|
-
|
|
58
|
+
|
|
59
|
+
abort (reason) {
|
|
60
|
+
this.target?.abort(reason)
|
|
61
|
+
this.#onAbort(reason)
|
|
62
|
+
}
|
|
63
|
+
|
|
52
64
|
get paused () { return this.target?.paused ?? false }
|
|
53
65
|
get aborted () { return this.target?.aborted ?? false }
|
|
54
66
|
get reason () { return this.target?.reason ?? null }
|
|
@@ -112,7 +124,16 @@ class RetryHandler {
|
|
|
112
124
|
this.etag = null
|
|
113
125
|
this.statusCode = null
|
|
114
126
|
this.headers = null
|
|
115
|
-
this.controllerProxy = new RetryController()
|
|
127
|
+
this.controllerProxy = new RetryController(reason => this.#onAbort(reason))
|
|
128
|
+
// A retry decision is in flight (the policy may be holding a backoff
|
|
129
|
+
// timer). While pending, a consumer abort cancels the wait.
|
|
130
|
+
this.retryPending = false
|
|
131
|
+
// Backoff timer returned by the retry policy, so #onAbort can cancel it.
|
|
132
|
+
// Null for custom policies that do not return their timer.
|
|
133
|
+
this.retryTimer = null
|
|
134
|
+
// Set once an abort during the backoff delivered the terminal error
|
|
135
|
+
// downstream; late policy callbacks and connection errors are then moot.
|
|
136
|
+
this.aborted = false
|
|
116
137
|
}
|
|
117
138
|
|
|
118
139
|
onResponseStartWithRetry (controller, statusCode, headers, statusMessage, err) {
|
|
@@ -135,6 +156,13 @@ class RetryHandler {
|
|
|
135
156
|
}
|
|
136
157
|
|
|
137
158
|
function shouldRetry (passedErr) {
|
|
159
|
+
if (this.aborted) {
|
|
160
|
+
// Aborted while the policy was deciding; the decision is moot.
|
|
161
|
+
return
|
|
162
|
+
}
|
|
163
|
+
this.retryPending = false
|
|
164
|
+
this.retryTimer = null
|
|
165
|
+
|
|
138
166
|
if (passedErr) {
|
|
139
167
|
this.headersSent = true
|
|
140
168
|
this.handler.onResponseStart?.(this.controllerProxy, statusCode, headers, statusMessage)
|
|
@@ -154,14 +182,17 @@ class RetryHandler {
|
|
|
154
182
|
// between, leaving this one paused forever -- the very stall the proxy exists
|
|
155
183
|
// to prevent.
|
|
156
184
|
controller.pause()
|
|
157
|
-
|
|
185
|
+
// The default policy returns its backoff timer so an abort can cancel it;
|
|
186
|
+
// a custom policy may return anything (or nothing), which is ignored.
|
|
187
|
+
this.retryPending = true
|
|
188
|
+
this.retryTimer = this.retryOpts.retry(
|
|
158
189
|
err,
|
|
159
190
|
{
|
|
160
191
|
state: { counter: this.retryCount },
|
|
161
192
|
opts: { retryOptions: this.retryOpts, ...this.opts }
|
|
162
193
|
},
|
|
163
194
|
shouldRetry.bind(this)
|
|
164
|
-
)
|
|
195
|
+
) ?? null
|
|
165
196
|
}
|
|
166
197
|
|
|
167
198
|
onRequestStart (controller, context) {
|
|
@@ -176,6 +207,14 @@ class RetryHandler {
|
|
|
176
207
|
}
|
|
177
208
|
}
|
|
178
209
|
|
|
210
|
+
onBodySent (chunk) {
|
|
211
|
+
this.handler.onBodySent?.(chunk)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
onRequestSent () {
|
|
215
|
+
this.handler.onRequestSent?.()
|
|
216
|
+
}
|
|
217
|
+
|
|
179
218
|
onRequestUpgrade (_controller, statusCode, headers, socket) {
|
|
180
219
|
this.handler.onRequestUpgrade?.(this.controllerProxy, statusCode, headers, socket)
|
|
181
220
|
}
|
|
@@ -190,7 +229,8 @@ class RetryHandler {
|
|
|
190
229
|
timeoutFactor,
|
|
191
230
|
statusCodes,
|
|
192
231
|
errorCodes,
|
|
193
|
-
methods
|
|
232
|
+
methods,
|
|
233
|
+
retryAfter
|
|
194
234
|
} = retryOptions
|
|
195
235
|
const { counter } = state
|
|
196
236
|
|
|
@@ -222,7 +262,7 @@ class RetryHandler {
|
|
|
222
262
|
return
|
|
223
263
|
}
|
|
224
264
|
|
|
225
|
-
let retryAfterHeader = headers?.['retry-after']
|
|
265
|
+
let retryAfterHeader = retryAfter === false ? undefined : headers?.['retry-after']
|
|
226
266
|
if (retryAfterHeader) {
|
|
227
267
|
retryAfterHeader = Number(retryAfterHeader)
|
|
228
268
|
retryAfterHeader = Number.isNaN(retryAfterHeader)
|
|
@@ -237,7 +277,9 @@ class RetryHandler {
|
|
|
237
277
|
? Math.min(retryAfterHeader, maxTimeout)
|
|
238
278
|
: Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout)
|
|
239
279
|
|
|
240
|
-
|
|
280
|
+
// Return the backoff timer so the handler can cancel it when the
|
|
281
|
+
// consumer aborts while the retry decision is pending.
|
|
282
|
+
return setTimeout(() => cb(null), retryTimeout)
|
|
241
283
|
}
|
|
242
284
|
|
|
243
285
|
onResponseStart (controller, statusCode, headers, statusMessage) {
|
|
@@ -435,6 +477,12 @@ class RetryHandler {
|
|
|
435
477
|
}
|
|
436
478
|
|
|
437
479
|
onResponseError (controller, err) {
|
|
480
|
+
if (this.aborted) {
|
|
481
|
+
// #onAbort already delivered the terminal error downstream; the late
|
|
482
|
+
// error of the torn-down connection must not be forwarded twice.
|
|
483
|
+
return
|
|
484
|
+
}
|
|
485
|
+
|
|
438
486
|
// controller is THIS failed connection (not the proxy): we inspect whether
|
|
439
487
|
// the consumer aborted it to decide retry-vs-propagate.
|
|
440
488
|
if (controller?.aborted || isDisturbed(this.opts.body)) {
|
|
@@ -443,6 +491,13 @@ class RetryHandler {
|
|
|
443
491
|
}
|
|
444
492
|
|
|
445
493
|
function shouldRetry (returnedErr) {
|
|
494
|
+
if (this.aborted) {
|
|
495
|
+
// Aborted while the policy was deciding; the decision is moot.
|
|
496
|
+
return
|
|
497
|
+
}
|
|
498
|
+
this.retryPending = false
|
|
499
|
+
this.retryTimer = null
|
|
500
|
+
|
|
446
501
|
if (!returnedErr) {
|
|
447
502
|
this.retry()
|
|
448
503
|
return
|
|
@@ -462,14 +517,31 @@ class RetryHandler {
|
|
|
462
517
|
this.retryCount += 1
|
|
463
518
|
}
|
|
464
519
|
|
|
465
|
-
this.
|
|
520
|
+
this.retryPending = true
|
|
521
|
+
this.retryTimer = this.retryOpts.retry(
|
|
466
522
|
err,
|
|
467
523
|
{
|
|
468
524
|
state: { counter: this.retryCount },
|
|
469
525
|
opts: { retryOptions: this.retryOpts, ...this.opts }
|
|
470
526
|
},
|
|
471
527
|
shouldRetry.bind(this)
|
|
472
|
-
)
|
|
528
|
+
) ?? null
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
#onAbort (reason) {
|
|
532
|
+
// A consumer abort lands on the controller proxy. If the retry policy is
|
|
533
|
+
// still deciding (typically holding a backoff timer), cancel the wait and
|
|
534
|
+
// surface the abort immediately instead of letting the request hang until
|
|
535
|
+
// the backoff elapses.
|
|
536
|
+
if (!this.retryPending) {
|
|
537
|
+
return
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
this.aborted = true
|
|
541
|
+
this.retryPending = false
|
|
542
|
+
clearTimeout(this.retryTimer)
|
|
543
|
+
this.retryTimer = null
|
|
544
|
+
this.handler.onResponseError?.(this.controllerProxy, reason ?? new RequestAbortedError())
|
|
473
545
|
}
|
|
474
546
|
}
|
|
475
547
|
|
|
@@ -73,7 +73,7 @@ class MockAgent extends Dispatcher {
|
|
|
73
73
|
opts.origin = normalizeOrigin(opts.origin)
|
|
74
74
|
|
|
75
75
|
// Call MockAgent.get to perform additional setup before dispatching as normal
|
|
76
|
-
this.get(opts.origin)
|
|
76
|
+
const mockDispatcher = this.get(opts.origin)
|
|
77
77
|
|
|
78
78
|
this[kMockAgentAddCallHistoryLog](opts)
|
|
79
79
|
|
|
@@ -81,6 +81,18 @@ class MockAgent extends Dispatcher {
|
|
|
81
81
|
|
|
82
82
|
const dispatchOpts = { ...opts }
|
|
83
83
|
|
|
84
|
+
// Agent keeps HTTP/1.1-only dispatchers under a separate key. Legacy
|
|
85
|
+
// global dispatcher consumers use that path, so mirror the mock dispatches
|
|
86
|
+
// before delegating to the internal Agent.
|
|
87
|
+
if (dispatchOpts.allowH2 === false) {
|
|
88
|
+
const http1OnlyKey = `${dispatchOpts.origin}#http1-only`
|
|
89
|
+
if (!this[kClients].has(http1OnlyKey)) {
|
|
90
|
+
const http1OnlyDispatcher = this[kFactory](dispatchOpts.origin)
|
|
91
|
+
http1OnlyDispatcher[kDispatches] = mockDispatcher[kDispatches]
|
|
92
|
+
this[kMockAgentSet](http1OnlyKey, http1OnlyDispatcher)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
84
96
|
if (acceptNonStandardSearchParameters && dispatchOpts.path) {
|
|
85
97
|
const [path, searchParams] = dispatchOpts.path.split('?')
|
|
86
98
|
const normalizedSearchParams = normalizeSearchParams(searchParams, acceptNonStandardSearchParameters)
|
|
@@ -333,8 +333,7 @@ function mockDispatch (opts, handler) {
|
|
|
333
333
|
handler.onResponseError(null, new InvalidArgumentError('reply options callback must return an object'))
|
|
334
334
|
return
|
|
335
335
|
}
|
|
336
|
-
mockDispatch
|
|
337
|
-
dispatchMockReply(mockDispatches, mockDispatch, key, opts, handler)
|
|
336
|
+
dispatchMockReply(mockDispatches, mockDispatch, key, opts, handler, { ...responseDefaults, ...resolvedData })
|
|
338
337
|
},
|
|
339
338
|
(error) => {
|
|
340
339
|
handler.onResponseError(null, error)
|
|
@@ -347,7 +346,7 @@ function mockDispatch (opts, handler) {
|
|
|
347
346
|
throw new InvalidArgumentError('reply options callback must return an object')
|
|
348
347
|
}
|
|
349
348
|
|
|
350
|
-
mockDispatch
|
|
349
|
+
return dispatchMockReply(mockDispatches, mockDispatch, key, opts, handler, { ...responseDefaults, ...callbackResult })
|
|
351
350
|
}
|
|
352
351
|
|
|
353
352
|
return dispatchMockReply(mockDispatches, mockDispatch, key, opts, handler)
|
|
@@ -356,9 +355,13 @@ function mockDispatch (opts, handler) {
|
|
|
356
355
|
/**
|
|
357
356
|
* Replies to a request once the mock dispatch data is fully resolved
|
|
358
357
|
*/
|
|
359
|
-
function dispatchMockReply (mockDispatches, mockDispatch, key, opts, handler) {
|
|
360
|
-
// Parse mockDispatch data
|
|
361
|
-
|
|
358
|
+
function dispatchMockReply (mockDispatches, mockDispatch, key, opts, handler, resolvedResponse) {
|
|
359
|
+
// Parse mockDispatch data. When a reply callback has already been resolved
|
|
360
|
+
// in mockDispatch() (i.e. no body lifecycle hooks are involved), the resolved
|
|
361
|
+
// response is passed in here, leaving mockDispatch.data untouched so the
|
|
362
|
+
// callback can be re-invoked for persistent / times() replies.
|
|
363
|
+
const { data: responseData, delay } = mockDispatch
|
|
364
|
+
const response = resolvedResponse ?? responseData
|
|
362
365
|
|
|
363
366
|
// If specified, trigger dispatch error
|
|
364
367
|
if (response.error !== null) {
|
|
@@ -454,8 +457,7 @@ function dispatchMockReply (mockDispatches, mockDispatch, key, opts, handler) {
|
|
|
454
457
|
handler.onResponseError(null, new InvalidArgumentError('reply options callback must return an object'))
|
|
455
458
|
return
|
|
456
459
|
}
|
|
457
|
-
|
|
458
|
-
handleReply(dispatches, mockDispatch.data)
|
|
460
|
+
handleReply(dispatches, { ...responseDefaults, ...resolvedData })
|
|
459
461
|
},
|
|
460
462
|
(err) => {
|
|
461
463
|
handler.onResponseError(null, err)
|
|
@@ -468,8 +470,7 @@ function dispatchMockReply (mockDispatches, mockDispatch, key, opts, handler) {
|
|
|
468
470
|
throw new InvalidArgumentError('reply options callback must return an object')
|
|
469
471
|
}
|
|
470
472
|
|
|
471
|
-
|
|
472
|
-
handleReply(dispatches, mockDispatch.data)
|
|
473
|
+
handleReply(dispatches, { ...responseDefaults, ...callbackResult })
|
|
473
474
|
return
|
|
474
475
|
}
|
|
475
476
|
|
|
@@ -189,14 +189,16 @@ function parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {})
|
|
|
189
189
|
// 1. If the first character of the attribute-value is not a DIGIT or a
|
|
190
190
|
// "-" character, ignore the cookie-av.
|
|
191
191
|
const charCode = attributeValue.charCodeAt(0)
|
|
192
|
+
const startsWithDigit = charCode >= 48 && charCode <= 57
|
|
193
|
+
const startsWithSignedDigit = attributeValue[0] === '-' && attributeValue.length > 1
|
|
192
194
|
|
|
193
|
-
if (
|
|
195
|
+
if (!startsWithDigit && !startsWithSignedDigit) {
|
|
194
196
|
return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)
|
|
195
197
|
}
|
|
196
198
|
|
|
197
199
|
// 2. If the remainder of attribute-value contains a non-DIGIT
|
|
198
200
|
// character, ignore the cookie-av.
|
|
199
|
-
if (
|
|
201
|
+
if (/[^\d]/.test(attributeValue.slice(1))) {
|
|
200
202
|
return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)
|
|
201
203
|
}
|
|
202
204
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
'use strict'
|
|
2
|
+
const buffer = require('node:buffer')
|
|
2
3
|
const { Transform } = require('node:stream')
|
|
3
4
|
const { isASCIINumber, isValidLastEventId } = require('./util')
|
|
4
5
|
|
|
@@ -23,6 +24,8 @@ const COLON = 0x3A
|
|
|
23
24
|
*/
|
|
24
25
|
const SPACE = 0x20
|
|
25
26
|
|
|
27
|
+
const defaultMaxEventSize = buffer.kStringMaxLength
|
|
28
|
+
|
|
26
29
|
const DATA = Buffer.from('data')
|
|
27
30
|
const EVENT = Buffer.from('event')
|
|
28
31
|
const ID = Buffer.from('id')
|
|
@@ -66,6 +69,12 @@ function isFieldName (line, length, field) {
|
|
|
66
69
|
return true
|
|
67
70
|
}
|
|
68
71
|
|
|
72
|
+
function createMaxEventSizeExceededError () {
|
|
73
|
+
const error = new Error('EventSource message size exceeded')
|
|
74
|
+
error.aborted = false
|
|
75
|
+
return error
|
|
76
|
+
}
|
|
77
|
+
|
|
69
78
|
/**
|
|
70
79
|
* @typedef {object} EventSourceStreamEvent
|
|
71
80
|
* @type {object}
|
|
@@ -114,6 +123,8 @@ class EventSourceStream extends Transform {
|
|
|
114
123
|
pos = 0
|
|
115
124
|
lineChunkIndex = 0
|
|
116
125
|
linePos = 0
|
|
126
|
+
eventDataSize = 0
|
|
127
|
+
maxEventSize
|
|
117
128
|
|
|
118
129
|
event = {
|
|
119
130
|
data: undefined,
|
|
@@ -125,6 +136,7 @@ class EventSourceStream extends Transform {
|
|
|
125
136
|
/**
|
|
126
137
|
* @param {object} options
|
|
127
138
|
* @param {boolean} [options.readableObjectMode]
|
|
139
|
+
* @param {number} [options.maxEventSize]
|
|
128
140
|
* @param {eventSourceSettings} [options.eventSourceSettings]
|
|
129
141
|
* @param {(chunk: any, encoding?: BufferEncoding | undefined) => boolean} [options.push]
|
|
130
142
|
*/
|
|
@@ -136,6 +148,7 @@ class EventSourceStream extends Transform {
|
|
|
136
148
|
super(options)
|
|
137
149
|
|
|
138
150
|
this.state = options.eventSourceSettings || {}
|
|
151
|
+
this.maxEventSize = options.maxEventSize ?? defaultMaxEventSize
|
|
139
152
|
if (options.push) {
|
|
140
153
|
this.push = options.push
|
|
141
154
|
}
|
|
@@ -231,7 +244,12 @@ class EventSourceStream extends Transform {
|
|
|
231
244
|
|
|
232
245
|
// In any case, we can process the line as we reached an
|
|
233
246
|
// end-of-line character
|
|
234
|
-
|
|
247
|
+
try {
|
|
248
|
+
this.parseLine(this.readLine(), this.event)
|
|
249
|
+
} catch (error) {
|
|
250
|
+
callback(error)
|
|
251
|
+
return
|
|
252
|
+
}
|
|
235
253
|
this.consumeCurrentByte()
|
|
236
254
|
// A line was processed and this could be the end of the event. We need
|
|
237
255
|
// to check if the next line is empty to determine if the event is
|
|
@@ -282,6 +300,13 @@ class EventSourceStream extends Transform {
|
|
|
282
300
|
}
|
|
283
301
|
|
|
284
302
|
if (isFieldName(line, fieldLength, DATA)) {
|
|
303
|
+
const valueBytes = line.length - valueStart
|
|
304
|
+
const eventDataSize = this.eventDataSize + (event.data === undefined ? 0 : 1) + valueBytes
|
|
305
|
+
|
|
306
|
+
if (this.maxEventSize > 0 && eventDataSize > this.maxEventSize) {
|
|
307
|
+
throw createMaxEventSizeExceededError()
|
|
308
|
+
}
|
|
309
|
+
|
|
285
310
|
const value = line.toString('utf8', valueStart)
|
|
286
311
|
|
|
287
312
|
if (event.data === undefined) {
|
|
@@ -289,6 +314,7 @@ class EventSourceStream extends Transform {
|
|
|
289
314
|
} else {
|
|
290
315
|
event.data += `\n${value}`
|
|
291
316
|
}
|
|
317
|
+
this.eventDataSize = eventDataSize
|
|
292
318
|
return
|
|
293
319
|
}
|
|
294
320
|
|
|
@@ -345,6 +371,7 @@ class EventSourceStream extends Transform {
|
|
|
345
371
|
this.event.event = undefined
|
|
346
372
|
this.event.id = undefined
|
|
347
373
|
this.event.retry = undefined
|
|
374
|
+
this.eventDataSize = 0
|
|
348
375
|
}
|
|
349
376
|
|
|
350
377
|
hasPendingEvent () {
|
|
@@ -10,6 +10,7 @@ const { isNetworkError } = require('../fetch/response')
|
|
|
10
10
|
const { kEnumerableProperty } = require('../../core/util')
|
|
11
11
|
const { environmentSettingsObject } = require('../fetch/util')
|
|
12
12
|
const { createPotentialCORSRequest } = require('./util')
|
|
13
|
+
const { getGlobalDispatcher } = require('../../global')
|
|
13
14
|
|
|
14
15
|
let experimentalWarned = false
|
|
15
16
|
|
|
@@ -281,6 +282,7 @@ class EventSource extends EventTarget {
|
|
|
281
282
|
|
|
282
283
|
const eventSourceStream = new EventSourceStream({
|
|
283
284
|
eventSourceSettings: this.#state,
|
|
285
|
+
maxEventSize: this.#dispatcher.eventSourceOptions?.maxEventSize,
|
|
284
286
|
push: (event) => {
|
|
285
287
|
this.dispatchEvent(createFastMessageEvent(
|
|
286
288
|
event.type,
|
|
@@ -465,7 +467,8 @@ webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([
|
|
|
465
467
|
},
|
|
466
468
|
{
|
|
467
469
|
key: 'dispatcher', // undici only
|
|
468
|
-
converter: webidl.converters.any
|
|
470
|
+
converter: webidl.converters.any,
|
|
471
|
+
defaultValue: () => getGlobalDispatcher()
|
|
469
472
|
},
|
|
470
473
|
{
|
|
471
474
|
key: 'node', // undici only
|
|
@@ -923,7 +923,7 @@ function makeRequest (init) {
|
|
|
923
923
|
serviceWorkers: init.serviceWorkers ?? 'all',
|
|
924
924
|
initiator: init.initiator ?? '',
|
|
925
925
|
destination: init.destination ?? '',
|
|
926
|
-
priority: init.priority ??
|
|
926
|
+
priority: init.priority ?? 'auto',
|
|
927
927
|
origin: init.origin ?? 'client',
|
|
928
928
|
policyContainer: init.policyContainer ?? 'client',
|
|
929
929
|
referrer: init.referrer ?? 'client',
|
|
@@ -1129,8 +1129,7 @@ webidl.converters.RequestInit = webidl.dictionaryConverter([
|
|
|
1129
1129
|
{
|
|
1130
1130
|
key: 'priority',
|
|
1131
1131
|
converter: webidl.converters.DOMString,
|
|
1132
|
-
allowedValues: ['high', 'low', 'auto']
|
|
1133
|
-
defaultValue: () => 'auto'
|
|
1132
|
+
allowedValues: ['high', 'low', 'auto']
|
|
1134
1133
|
}
|
|
1135
1134
|
])
|
|
1136
1135
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "undici",
|
|
3
|
-
"version": "8.10.
|
|
3
|
+
"version": "8.10.1",
|
|
4
4
|
"description": "An HTTP/1.1 client, written from scratch for Node.js",
|
|
5
5
|
"homepage": "https://undici.nodejs.org",
|
|
6
6
|
"bugs": {
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
"test:websocket:autobahn": "node test/autobahn/client.js",
|
|
98
98
|
"test:websocket:autobahn:report": "node test/autobahn/report.js",
|
|
99
99
|
"test:wpt:setup": "node test/web-platform-tests/wpt-runner.mjs setup",
|
|
100
|
-
"test:wpt": "npm run test:wpt:setup && node test/web-platform-tests/wpt-runner.mjs run /fetch /mimesniff /
|
|
100
|
+
"test:wpt": "npm run test:wpt:setup && node test/web-platform-tests/wpt-runner.mjs run /fetch /mimesniff /xhr /websockets /eventsource",
|
|
101
101
|
"test:cache-tests": "node test/cache-interceptor/cache-tests.mjs --ci",
|
|
102
102
|
"coverage": "npm run coverage:clean && cross-env NODE_V8_COVERAGE=./coverage/tmp npm run test:javascript && npm run coverage:report",
|
|
103
103
|
"coverage:ci": "npm run coverage:clean && cross-env NODE_V8_COVERAGE=./coverage/tmp npm run test:javascript && npm run coverage:report:ci",
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
"prepare": "husky && node ./scripts/platform-shell.js"
|
|
110
110
|
},
|
|
111
111
|
"devDependencies": {
|
|
112
|
-
"@fastify/busboy": "3.2.
|
|
112
|
+
"@fastify/busboy": "3.2.2",
|
|
113
113
|
"@matteo.collina/tspl": "^0.2.0",
|
|
114
114
|
"@metcoder95/https-pem": "^1.0.0",
|
|
115
115
|
"@sinonjs/fake-timers": "^12.0.0",
|
|
@@ -80,6 +80,8 @@ export declare namespace Client {
|
|
|
80
80
|
maxResponseSize?: number;
|
|
81
81
|
/** WebSocket-specific options */
|
|
82
82
|
webSocket?: Client.WebSocketOptions;
|
|
83
|
+
/** EventSource-specific options */
|
|
84
|
+
eventSource?: Client.EventSourceOptions;
|
|
83
85
|
/** Enables a family autodetection algorithm that loosely implements section 5 of RFC 8305. */
|
|
84
86
|
autoSelectFamily?: boolean;
|
|
85
87
|
/** The amount of time in milliseconds to wait for a connection attempt to finish before trying the next address when using the `autoSelectFamily` option. */
|
|
@@ -169,6 +171,14 @@ export declare namespace Client {
|
|
|
169
171
|
*/
|
|
170
172
|
settings?: Omit<SessionOptions['settings'], 'enablePush' | 'maxConcurrentStreams' | 'enableConnectProtocol'>
|
|
171
173
|
}
|
|
174
|
+
export interface EventSourceOptions {
|
|
175
|
+
/**
|
|
176
|
+
* Maximum allowed event size in bytes for EventSource messages.
|
|
177
|
+
* Set to 0 to disable the limit.
|
|
178
|
+
* @default buffer.kStringMaxLength
|
|
179
|
+
*/
|
|
180
|
+
maxEventSize?: number;
|
|
181
|
+
}
|
|
172
182
|
}
|
|
173
183
|
|
|
174
184
|
export default Client
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "niceeval",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.2",
|
|
4
4
|
"description": "Agent-native eval tool — eval agents, services, functions, and coding-agent fixtures",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -206,7 +206,7 @@
|
|
|
206
206
|
"ws"
|
|
207
207
|
],
|
|
208
208
|
"dependencies": {
|
|
209
|
-
"autoevals": "0.0
|
|
209
|
+
"autoevals": "0.3.0",
|
|
210
210
|
"effect": "4.0.0-rc.112",
|
|
211
211
|
"jiti": "2.7.0",
|
|
212
212
|
"openai": "^6.49.0",
|
|
@@ -214,7 +214,7 @@
|
|
|
214
214
|
"yaml": "^2.9.0"
|
|
215
215
|
},
|
|
216
216
|
"devDependencies": {
|
|
217
|
-
"@ai-sdk/otel": "^1.0.
|
|
217
|
+
"@ai-sdk/otel": "^1.0.83",
|
|
218
218
|
"@effect/platform-node": "4.0.0-rc.112",
|
|
219
219
|
"@effect/platform-node-shared": "4.0.0-rc.112",
|
|
220
220
|
"@opentelemetry/exporter-trace-otlp-http": "^0.219.0",
|
|
@@ -251,7 +251,7 @@
|
|
|
251
251
|
"recharts": "3.10.1",
|
|
252
252
|
"tailwindcss": "4.3.3",
|
|
253
253
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
254
|
-
"undici": "8.10.
|
|
254
|
+
"undici": "8.10.1",
|
|
255
255
|
"vite": "^8.1.0",
|
|
256
256
|
"vitest": "^4.1.11",
|
|
257
257
|
"ws": "8.21.3"
|