From 1f214bf3baef33f643779f5f19304734b919943b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Bajto=C5=A1?= Date: Fri, 29 Jul 2016 09:32:25 +0200 Subject: [PATCH] Lazy-load CLS module 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. --- server/current-context.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/server/current-context.js b/server/current-context.js index 19fcb93..8e6ae13 100644 --- a/server/current-context.js +++ b/server/current-context.js @@ -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; /** @@ -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() {