119 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			119 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, '__esModule', { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.default = void 0; | ||
|  | 
 | ||
|  | function _v() { | ||
|  |   const data = _interopRequireDefault(require('v8')); | ||
|  | 
 | ||
|  |   _v = function _v() { | ||
|  |     return data; | ||
|  |   }; | ||
|  | 
 | ||
|  |   return data; | ||
|  | } | ||
|  | 
 | ||
|  | function _vm() { | ||
|  |   const data = _interopRequireDefault(require('vm')); | ||
|  | 
 | ||
|  |   _vm = function _vm() { | ||
|  |     return data; | ||
|  |   }; | ||
|  | 
 | ||
|  |   return data; | ||
|  | } | ||
|  | 
 | ||
|  | function _prettyFormat() { | ||
|  |   const data = _interopRequireDefault(require('pretty-format')); | ||
|  | 
 | ||
|  |   _prettyFormat = function _prettyFormat() { | ||
|  |     return data; | ||
|  |   }; | ||
|  | 
 | ||
|  |   return data; | ||
|  | } | ||
|  | 
 | ||
|  | function _interopRequireDefault(obj) { | ||
|  |   return obj && obj.__esModule ? obj : {default: obj}; | ||
|  | } | ||
|  | 
 | ||
|  | function _defineProperty(obj, key, value) { | ||
|  |   if (key in obj) { | ||
|  |     Object.defineProperty(obj, key, { | ||
|  |       value: value, | ||
|  |       enumerable: true, | ||
|  |       configurable: true, | ||
|  |       writable: true | ||
|  |     }); | ||
|  |   } else { | ||
|  |     obj[key] = value; | ||
|  |   } | ||
|  |   return obj; | ||
|  | } | ||
|  | 
 | ||
|  | class _default { | ||
|  |   constructor(value) { | ||
|  |     _defineProperty(this, '_isReferenceBeingHeld', void 0); | ||
|  | 
 | ||
|  |     if (this._isPrimitive(value)) { | ||
|  |       throw new TypeError( | ||
|  |         [ | ||
|  |           'Primitives cannot leak memory.', | ||
|  |           'You passed a ' + | ||
|  |             typeof value + | ||
|  |             ': <' + | ||
|  |             (0, _prettyFormat().default)(value) + | ||
|  |             '>' | ||
|  |         ].join(' ') | ||
|  |       ); | ||
|  |     } | ||
|  | 
 | ||
|  |     let weak; | ||
|  | 
 | ||
|  |     try { | ||
|  |       // eslint-disable-next-line import/no-extraneous-dependencies
 | ||
|  |       weak = require('weak'); | ||
|  |     } catch (err) { | ||
|  |       if (!err || err.code !== 'MODULE_NOT_FOUND') { | ||
|  |         throw err; | ||
|  |       } | ||
|  | 
 | ||
|  |       throw new Error( | ||
|  |         'The leaking detection mechanism requires the "weak" package to be installed and work. ' + | ||
|  |           'Please install it as a dependency on your main project' | ||
|  |       ); | ||
|  |     } | ||
|  | 
 | ||
|  |     weak(value, () => (this._isReferenceBeingHeld = false)); | ||
|  |     this._isReferenceBeingHeld = true; // Ensure value is not leaked by the closure created by the "weak" callback.
 | ||
|  | 
 | ||
|  |     value = null; | ||
|  |   } | ||
|  | 
 | ||
|  |   isLeaking() { | ||
|  |     this._runGarbageCollector(); | ||
|  | 
 | ||
|  |     return this._isReferenceBeingHeld; | ||
|  |   } | ||
|  | 
 | ||
|  |   _runGarbageCollector() { | ||
|  |     const isGarbageCollectorHidden = !global.gc; // GC is usually hidden, so we have to expose it before running.
 | ||
|  | 
 | ||
|  |     _v().default.setFlagsFromString('--expose-gc'); | ||
|  | 
 | ||
|  |     _vm().default.runInNewContext('gc')(); // The GC was not initially exposed, so let's hide it again.
 | ||
|  | 
 | ||
|  |     if (isGarbageCollectorHidden) { | ||
|  |       _v().default.setFlagsFromString('--no-expose-gc'); | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   _isPrimitive(value) { | ||
|  |     return value !== Object(value); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | exports.default = _default; |