Skip to content

Commit 26b8ebb

Browse files
tsctxcrysmags
authored andcommitted
fix(cache): set AbortSignal (nodejs#2612)
* fix(cache): set AbortSignal * use utility * add test * fix test * fix test * use fromInnerRequest
1 parent 9028aed commit 26b8ebb

File tree

4 files changed

+55
-24
lines changed

4 files changed

+55
-24
lines changed

lib/cache/cache.js

+9-10
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ const { kEnumerableProperty, isDisturbed } = require('../core/util')
66
const { kHeadersList } = require('../core/symbols')
77
const { webidl } = require('../fetch/webidl')
88
const { Response, cloneResponse } = require('../fetch/response')
9-
const { Request } = require('../fetch/request')
9+
const { Request, fromInnerRequest } = require('../fetch/request')
1010
const { Headers } = require('../fetch/headers')
11-
const { kState, kHeaders, kGuard, kRealm } = require('../fetch/symbols')
11+
const { kState, kHeaders, kGuard } = require('../fetch/symbols')
1212
const { fetching } = require('../fetch/index')
1313
const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = require('../fetch/util')
1414
const assert = require('assert')
@@ -444,7 +444,7 @@ class Cache {
444444
* @see https://w3c.github.io/ServiceWorker/#dom-cache-keys
445445
* @param {any} request
446446
* @param {import('../../types/cache').CacheQueryOptions} options
447-
* @returns {readonly Request[]}
447+
* @returns {Promise<readonly Request[]>}
448448
*/
449449
async keys (request = undefined, options = {}) {
450450
webidl.brandCheck(this, Cache)
@@ -503,13 +503,12 @@ class Cache {
503503

504504
// 5.4.2
505505
for (const request of requests) {
506-
const requestObject = new Request(kConstruct)
507-
requestObject[kState] = request
508-
requestObject[kHeaders] = new Headers(kConstruct)
509-
requestObject[kHeaders][kHeadersList] = request.headersList
510-
requestObject[kHeaders][kGuard] = 'immutable'
511-
requestObject[kRealm] = request.client
512-
506+
const requestObject = fromInnerRequest(
507+
request,
508+
new AbortController().signal,
509+
'immutable',
510+
{ settingsObject: request.client }
511+
)
513512
// 5.4.2.1
514513
requestList.push(requestObject)
515514
}

lib/cache/cachestorage.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ class CacheStorage {
114114

115115
/**
116116
* @see https://w3c.github.io/ServiceWorker/#cache-storage-keys
117-
* @returns {string[]}
117+
* @returns {Promise<string[]>}
118118
*/
119119
async keys () {
120120
webidl.brandCheck(this, CacheStorage)

lib/fetch/request.js

+22-11
Original file line numberDiff line numberDiff line change
@@ -751,14 +751,6 @@ class Request {
751751

752752
// 3. Let clonedRequestObject be the result of creating a Request object,
753753
// given clonedRequest, this’s headers’s guard, and this’s relevant Realm.
754-
const clonedRequestObject = new Request(kConstruct)
755-
clonedRequestObject[kState] = clonedRequest
756-
clonedRequestObject[kRealm] = this[kRealm]
757-
clonedRequestObject[kHeaders] = new Headers(kConstruct)
758-
clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList
759-
clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]
760-
clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]
761-
762754
// 4. Make clonedRequestObject’s signal follow this’s signal.
763755
const ac = new AbortController()
764756
if (this.signal.aborted) {
@@ -771,10 +763,9 @@ class Request {
771763
}
772764
)
773765
}
774-
clonedRequestObject[kSignal] = ac.signal
775766

776767
// 4. Return clonedRequestObject.
777-
return clonedRequestObject
768+
return fromInnerRequest(clonedRequest, ac.signal, this[kHeaders][kGuard], this[kRealm])
778769
}
779770
}
780771

@@ -844,6 +835,26 @@ function cloneRequest (request) {
844835
return newRequest
845836
}
846837

838+
/**
839+
* @param {any} innerRequest
840+
* @param {AbortSignal} signal
841+
* @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard
842+
* @param {any} [realm]
843+
* @returns {Request}
844+
*/
845+
function fromInnerRequest (innerRequest, signal, guard, realm) {
846+
const request = new Request(kConstruct)
847+
request[kState] = innerRequest
848+
request[kRealm] = realm
849+
request[kSignal] = signal
850+
request[kSignal][kRealm] = realm
851+
request[kHeaders] = new Headers(kConstruct)
852+
request[kHeaders][kHeadersList] = innerRequest.headersList
853+
request[kHeaders][kGuard] = guard
854+
request[kHeaders][kRealm] = realm
855+
return request
856+
}
857+
847858
Object.defineProperties(Request.prototype, {
848859
method: kEnumerableProperty,
849860
url: kEnumerableProperty,
@@ -970,4 +981,4 @@ webidl.converters.RequestInit = webidl.dictionaryConverter([
970981
}
971982
])
972983

973-
module.exports = { Request, makeRequest }
984+
module.exports = { Request, makeRequest, fromInnerRequest }

test/fetch/request.js

+23-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@ const {
1010
Headers,
1111
fetch
1212
} = require('../../')
13+
const { fromInnerRequest, makeRequest } = require('../../lib/fetch/request')
1314
const {
1415
Blob: ThirdPartyBlob,
1516
FormData: ThirdPartyFormData
1617
} = require('formdata-node')
18+
const { kState, kGuard, kRealm, kSignal, kHeaders } = require('../../lib/fetch/symbols')
19+
const { kHeadersList } = require('../../lib/core/symbols')
1720

1821
const hasSignalReason = 'reason' in AbortSignal.prototype
1922

@@ -472,9 +475,8 @@ test('Clone the set-cookie header when Request is passed as the first parameter
472475

473476
// Tests for optimization introduced in https://github.com/nodejs/undici/pull/2456
474477
test('keys to object prototypes method', (t) => {
475-
const { ok } = tspl(t, { plan: 1 })
476478
const request = new Request('http://localhost', { method: 'hasOwnProperty' })
477-
ok(typeof request.method === 'string')
479+
assert(typeof request.method === 'string')
478480
})
479481

480482
// https://github.com/nodejs/undici/issues/2465
@@ -483,3 +485,22 @@ test('Issue#2465', async (t) => {
483485
const request = new Request('http://localhost', { body: new SharedArrayBuffer(0), method: 'POST' })
484486
strictEqual(await request.text(), '[object SharedArrayBuffer]')
485487
})
488+
489+
test('fromInnerRequest', () => {
490+
const realm = { settingsObject: {} }
491+
const innerRequest = makeRequest({
492+
urlList: [new URL('http://asd')],
493+
client: realm.settingsObject
494+
})
495+
const signal = new AbortController().signal
496+
const request = fromInnerRequest(innerRequest, signal, 'immutable', realm)
497+
498+
// check property
499+
assert.strictEqual(request[kState], innerRequest)
500+
assert.strictEqual(request[kRealm], realm)
501+
assert.strictEqual(request[kSignal], signal)
502+
assert.strictEqual(request[kSignal][kRealm], realm)
503+
assert.strictEqual(request[kHeaders][kHeadersList], innerRequest.headersList)
504+
assert.strictEqual(request[kHeaders][kGuard], 'immutable')
505+
assert.strictEqual(request[kHeaders][kRealm], realm)
506+
})

0 commit comments

Comments
 (0)