From cb1ef62a10478c70f65913e42a67be61d9f68b3f Mon Sep 17 00:00:00 2001 From: Matheus Marchini Date: Tue, 10 Dec 2019 11:13:28 -0800 Subject: [PATCH] chore(lib): don't require domain by default Domains have an unwanted overhead on Node.js v12. The overhead is observable just by requiring `domain`. To prevent that, we postpone requiring `domain` until we are sure it's necessary (in which case it was already required somewhere else). --- lib/serializer.js | 19 ++++++++++++++++--- test/index.js | 3 ++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/serializer.js b/lib/serializer.js index ad6f0d7..0ccd264 100644 --- a/lib/serializer.js +++ b/lib/serializer.js @@ -2,13 +2,17 @@ // external modules var assert = require('assert-plus'); +var EventEmitter = require('events'); var _ = require('lodash'); var nerror = require('@netflix/nerror'); -var domain = require('domain'); var MultiError = nerror.MultiError; var VError = nerror.VError; var safeJsonStringify; +// We load the domain module lazily to avoid performance regression on Node.js +// v12. +var domain; + // try to require optional dependency try { // eslint-disable-next-line global-require @@ -157,8 +161,17 @@ function _getSerializedContext(err) { _.omit(err, self._knownFields) : {}; - if (topLevelFields.domain instanceof domain.Domain) { - topLevelFields = _.omit(topLevelFields, [ 'domain' ]); + // We don't want to load domains just to check if topLevelFields.domain is + // a Domain instance, so first we make sure domains are already loaded. + if (EventEmitter.usingDomains) { + if (!domain) { + // eslint-disable-next-line global-require + domain = require('domain'); + } + + if (topLevelFields.domain instanceof domain.Domain) { + topLevelFields = _.omit(topLevelFields, [ 'domain' ]); + } } // combine all fields into a pojo, and serialize diff --git a/test/index.js b/test/index.js index 7abf14b..dd248f7 100644 --- a/test/index.js +++ b/test/index.js @@ -5,7 +5,6 @@ // core modules var http = require('http'); -var domain = require('domain'); // userland var assert = require('chai').assert; @@ -1002,6 +1001,8 @@ describe('restify-errors node module.', function() { // eslint-disable-next-line max-len it('should not serialize domain when using node domains', function(done) { + // eslint-disable-next-line global-require + var domain = require('domain'); var dom = domain.create(); dom.on('error', function(err1) { var serializer = restifyErrors.bunyanSerializer.create({