You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

110 lines
2.1 KiB

/**
* Module dependencies.
*/
const Emitter = require('events').EventEmitter;
const bindings = require('bindings')('weakref.node');
/**
* Set global weak callback function.
*/
bindings._setCallback(callback);
/**
* Module exports.
*/
exports = module.exports = create;
exports.addCallback = exports.addListener = addCallback;
exports.removeCallback = exports.removeListener = removeCallback;
exports.removeCallbacks = exports.removeListeners = removeCallbacks;
exports.callbacks = exports.listeners = callbacks;
// backwards-compat with node-weakref
exports.weaken = exports.create = exports;
// re-export all the binding functions onto the exports
Object.keys(bindings).forEach(function (name) {
exports[name] = bindings[name];
});
/**
* Internal emitter event name.
* This is completely arbitrary...
* Could be any value....
*/
var CB = '_CB';
/**
* Creates and returns a new Weakref instance. Optionally attaches
* a weak callback to invoke when the Object gets garbage collected.
*
* @api public
*/
function create (obj, fn) {
var weakref = bindings._create(obj, new Emitter());
if ('function' == typeof fn) {
exports.addCallback(weakref, fn);
}
return weakref;
}
/**
* Adds a weak callback function to the Weakref instance.
*
* @api public
*/
function addCallback (weakref, fn) {
var emitter = bindings._getEmitter(weakref);
return emitter.on(CB, fn);
}
/**
* Removes a weak callback function from the Weakref instance.
*
* @api public
*/
function removeCallback (weakref, fn) {
var emitter = bindings._getEmitter(weakref);
return emitter.removeListener(CB, fn);
}
/**
* Returns a copy of the listeners on the Weakref instance.
*
* @api public
*/
function callbacks (weakref) {
var emitter = bindings._getEmitter(weakref);
return emitter.listeners(CB);
}
/**
* Removes all callbacks on the Weakref instance.
*
* @api public
*/
function removeCallbacks (weakref) {
var emitter = bindings._getEmitter(weakref);
return emitter.removeAllListeners(CB);
}
/**
* Common weak callback function.
*
* @api private
*/
function callback (emitter) {
emitter.emit(CB);
emitter = null;
}