From df60f13f4d86988a5f89da4910c275ec99248c06 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() {