UNPKG

decorator-synchronized

Version:

function decorator which ensures that calls do not run simultaneously

124 lines (101 loc) 4.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.synchronized = void 0; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 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; } var toDecorator = function toDecorator(wrapFn) { var wrapMd = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : wrapFn; return function () { var wrapFn_ = wrapFn.apply(void 0, arguments); var wrapMd_ = wrapMd.apply(void 0, arguments); return function (target, key, descriptor) { return key === undefined ? wrapFn_(target) : _objectSpread({}, descriptor, { value: (typeof target === "function" ? wrapFn_ : wrapMd_)(descriptor.value) }); }; }; }; var synchronized = toDecorator(function () { var queue = Promise.resolve(); return function (fn) { return function () { var _this = this, _arguments = arguments; var makeCall = function makeCall() { return fn.apply(_this, _arguments); }; return queue = queue.then(makeCall, makeCall); }; }; }, function () { var queues = new WeakMap(); return function (method) { return function () { var _this2 = this, _arguments2 = arguments; var makeCall = function makeCall() { return method.apply(_this2, _arguments2); }; var queue = queues.get(this); queues.set(this, queue = queue === undefined ? makeCall() : queue.then(makeCall, makeCall)); return queue; }; }; }); exports.synchronized = synchronized; var DEFAULT_KEY_FUNCTION = function DEFAULT_KEY_FUNCTION(arg) { return arg; }; synchronized.withKey = toDecorator(function () { var keyFunction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_KEY_FUNCTION; var queues = new Map(); return function (fn) { return function () { var _this3 = this, _arguments3 = arguments; var key = keyFunction.apply(this, arguments); var makeCall = function makeCall() { return fn.apply(_this3, _arguments3); }; var queue = queues.get(key); queues.set(key, queue = queue === undefined ? makeCall() : queue.then(makeCall, makeCall)); var clean = function clean() { if (queues.get(key) === queue) { queues.delete(key); } }; queue.then(clean, clean); return queue; }; }; }, function () { var keyFunction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_KEY_FUNCTION; var instancesQueues = new WeakMap(); return function (method) { return function () { var _this4 = this, _arguments4 = arguments; var key = keyFunction.apply(this, arguments); var queues = instancesQueues.get(this); if (queues === undefined) { instancesQueues.set(this, queues = new Map()); } var makeCall = function makeCall() { return method.apply(_this4, _arguments4); }; var queue = queues.get(key); queues.set(key, queue = queue === undefined ? makeCall() : queue.then(makeCall, makeCall)); var clean = function clean() { if (queues.get(key) === queue) { queues.delete(key); } }; queue.then(clean, clean); return queue; }; }; }); //# sourceMappingURL=index.js.map