export function runWithCallbackSafe(test) { let finished = false return new Promise(function(res, rej) { try { let cb = function(err) { if (err) { return rej(err) } res() } let safeWrap = function(fn, ...args) { try { return fn(...args) } catch (err) { return rej(err) } } let safeWrapInFunction = function(finish, fn) { return function(...args) { safeWrap(fn, ...args) if (finish && !finished) { res() } } } cb.wrap = safeWrapInFunction.bind(this, false) cb.finish = safeWrapInFunction.bind(this, true) cb.safeWrap = safeWrap test.func(cb) } catch (err) { rej(err) } }) .then( function() { finished = true }, function(err) { finished = true; return Promise.reject(err) } ) }