Skip to content

Commit cb1ef62

Browse files
committed
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).
1 parent e79fdf1 commit cb1ef62

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

lib/serializer.js

+16-3
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22

33
// external modules
44
var assert = require('assert-plus');
5+
var EventEmitter = require('events');
56
var _ = require('lodash');
67
var nerror = require('@netflix/nerror');
7-
var domain = require('domain');
88
var MultiError = nerror.MultiError;
99
var VError = nerror.VError;
1010
var safeJsonStringify;
1111

12+
// We load the domain module lazily to avoid performance regression on Node.js
13+
// v12.
14+
var domain;
15+
1216
// try to require optional dependency
1317
try {
1418
// eslint-disable-next-line global-require
@@ -157,8 +161,17 @@ function _getSerializedContext(err) {
157161
_.omit(err, self._knownFields) :
158162
{};
159163

160-
if (topLevelFields.domain instanceof domain.Domain) {
161-
topLevelFields = _.omit(topLevelFields, [ 'domain' ]);
164+
// We don't want to load domains just to check if topLevelFields.domain is
165+
// a Domain instance, so first we make sure domains are already loaded.
166+
if (EventEmitter.usingDomains) {
167+
if (!domain) {
168+
// eslint-disable-next-line global-require
169+
domain = require('domain');
170+
}
171+
172+
if (topLevelFields.domain instanceof domain.Domain) {
173+
topLevelFields = _.omit(topLevelFields, [ 'domain' ]);
174+
}
162175
}
163176

164177
// combine all fields into a pojo, and serialize

test/index.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
// core modules
77
var http = require('http');
8-
var domain = require('domain');
98

109
// userland
1110
var assert = require('chai').assert;
@@ -1002,6 +1001,8 @@ describe('restify-errors node module.', function() {
10021001

10031002
// eslint-disable-next-line max-len
10041003
it('should not serialize domain when using node domains', function(done) {
1004+
// eslint-disable-next-line global-require
1005+
var domain = require('domain');
10051006
var dom = domain.create();
10061007
dom.on('error', function(err1) {
10071008
var serializer = restifyErrors.bunyanSerializer.create({

0 commit comments

Comments
 (0)