Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Jest memory leak from nock.restore() #2407

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
27 changes: 21 additions & 6 deletions lib/common.js
Expand Up @@ -68,14 +68,25 @@ let requestOverrides = {}
*/
function overrideRequests(newRequest) {
debug('overriding requests')
;['http', 'https'].forEach(function (proto) {

const modules = {
http: require('http'),
https: require('https'),
}

Object.keys(modules).forEach(function (proto) {
debug('- overriding request for', proto)

const moduleName = proto // 1 to 1 match of protocol and module is fortunate :)
const module = {
http: require('http'),
https: require('https'),
}[moduleName]

// TODO - this imports both modules twice in Jest
// const module = {
// http: require('http'),
// https: require('https'),
// }[moduleName]

const module = modules[moduleName]

const overriddenRequest = module.request
const overriddenGet = module.get

Expand Down Expand Up @@ -126,9 +137,13 @@ function restoreOverriddenRequests() {
module.request = request
module.get = get
debug('- restored request for', proto)

delete requestOverrides[proto]
}
)
requestOverrides = {}

// TODO - Node 16 wasn't freeing the overridden modules with an explicit delete
// requestOverrides = {}
}

/**
Expand Down
5 changes: 3 additions & 2 deletions lib/intercept.js
Expand Up @@ -366,8 +366,6 @@ function activate() {
throw new Error('Nock already active')
}

overrideClientRequest()

// ----- Overriding http.request and https.request:

common.overrideRequests(function (proto, overriddenRequest, args) {
Expand Down Expand Up @@ -431,6 +429,9 @@ function activate() {
}
}
})

// TODO - moving this AFTER common.overrideRequests fixes another Jest leak
overrideClientRequest()
}

module.exports = {
Expand Down