Skip to content

Commit

Permalink
Lazy-load CLS module
Browse files Browse the repository at this point in the history
As soon as CLS module is loaded, the instrumentation/patching of
async-listener is fired. This may cause stack overflows due to promise
instrumentation.

By loading CLS module lazily (only when used for real), we avoid
this kind of problems in applications that are not using current-context
at all.
  • Loading branch information
bajtos committed Jul 29, 2016
1 parent 867a7c3 commit 1f214bf
Showing 1 changed file with 14 additions and 2 deletions.
16 changes: 14 additions & 2 deletions server/current-context.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,21 @@

'use strict';

var cls = require('continuation-local-storage');
var domain = require('domain');


// Require CLS only when using the current context feature.
// As soon as this require is done, all the instrumentation/patching
// of async-listener is fired which is not ideal.
//
// Some users observed stack overflows due to promise instrumentation
// and other people have seen similar things:
// https://github.com/othiym23/async-listener/issues/57
// It all goes away when instrumentation is disabled.
var cls = function() {
return require('continuation-local-storage');
};

var LoopBackContext = module.exports;

/**
Expand Down Expand Up @@ -74,7 +86,7 @@ LoopBackContext.createContext = function(scopeName) {
process.context = process.context || {};
var ns = process.context[scopeName];
if (!ns) {
ns = cls.createNamespace(scopeName);
ns = cls().createNamespace(scopeName);
process.context[scopeName] = ns;
// Set up LoopBackContext.getCurrentContext()
LoopBackContext.getCurrentContext = function() {
Expand Down

0 comments on commit 1f214bf

Please sign in to comment.