Skip to content

Commit 27f46c1

Browse files
authored
test: add test for memory leak (#3450)
* test: add test for memory leak * lint
1 parent d63afeb commit 27f46c1

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

test/fetch/response.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
const { test } = require('node:test')
44
const assert = require('node:assert')
5+
const { setImmediate } = require('node:timers/promises')
6+
const { AsyncLocalStorage } = require('node:async_hooks')
57
const { tspl } = require('@matteo.collina/tspl')
68
const {
79
Response,
@@ -300,3 +302,29 @@ test('fromInnerResponse', () => {
300302
assert.strictEqual(getHeadersList(response[kHeaders]), innerResponse.headersList)
301303
assert.strictEqual(getHeadersGuard(response[kHeaders]), 'immutable')
302304
})
305+
306+
test('clone body garbage collection', async () => {
307+
const asyncLocalStorage = new AsyncLocalStorage()
308+
let ref
309+
310+
await new Promise(resolve => {
311+
asyncLocalStorage.run(new Map(), async () => {
312+
const res = new Response('hello world')
313+
const clone = res.clone()
314+
315+
asyncLocalStorage.getStore().set('key', clone)
316+
ref = new WeakRef(clone.body)
317+
318+
await res.text()
319+
await clone.text() // consume body
320+
321+
resolve()
322+
})
323+
})
324+
325+
await setImmediate()
326+
global.gc()
327+
328+
const cloneBody = ref.deref()
329+
assert.equal(cloneBody, undefined, 'clone body was not garbage collected')
330+
})

0 commit comments

Comments
 (0)