held
Version:
Detect paths within an object which held external references.
100 lines (84 loc) • 2.68 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _util = require('./util');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function inspect(value, refMap) {
return (0, _util.fnMap)(value, (0, _util.createRefMapper)(refMap));
}
/**
* Inspects a value for memory leaks.
*
* ```
* let value = { ... }
*
* const inspector = new Inspector(value);
*
* value = null
* ```
*
* If you want to check for cross references among several objects pass in an object like so:
* ```
* const inspector = new Inspector({
* obj1,
* obj2,
* obj3.
* ...etc.
* });
* ```
*
* Note: If you use destroy() each and every object reference within will be nullified.
*/
var Inspector = function () {
function Inspector(value) {
_classCallCheck(this, Inspector);
Object.defineProperty(this, '_refMap', {
enumerable: true,
writable: true,
value: new Map()
});
this._value = value;
inspect(this._value, this._refMap);
this._detectors = (0, _util.createDetectors)(this._refMap);
}
_createClass(Inspector, [{
key: 'leaked',
value: function leaked() {
var detected = [];
this._detectors.forEach(function (detector) {
if (detector.isLeaking()) {
detected.push({
type: detector.type,
paths: detector.paths
});
}
});
return detected;
}
}, {
key: 'crossed',
value: function crossed() {
return this.leaked().filter(function (object) {
return object.paths.length > 1;
});
}
}, {
key: 'destroy',
value: function destroy() {
(0, _util.deRef)(this._value, this._refMap);
this._value = null;
return this.leaked();
}
}], [{
key: 'held',
value: function held(object) {
var inspector = new Inspector(object);
return inspector;
}
}]);
return Inspector;
}();
exports.default = Inspector;
module.exports = exports['default'];