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.
159 lines
6.6 KiB
159 lines
6.6 KiB
'use strict'; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
var tslib = require('tslib'); |
|
var core = require('../core'); |
|
var utilities = require('../../utilities'); |
|
|
|
var OperationBatcher = (function () { |
|
function OperationBatcher(_a) { |
|
var batchDebounce = _a.batchDebounce, batchInterval = _a.batchInterval, batchMax = _a.batchMax, batchHandler = _a.batchHandler, batchKey = _a.batchKey; |
|
this.batchesByKey = new Map(); |
|
this.scheduledBatchTimerByKey = new Map(); |
|
this.batchDebounce = batchDebounce; |
|
this.batchInterval = batchInterval; |
|
this.batchMax = batchMax || 0; |
|
this.batchHandler = batchHandler; |
|
this.batchKey = batchKey || (function () { return ""; }); |
|
} |
|
OperationBatcher.prototype.enqueueRequest = function (request) { |
|
var _this = this; |
|
var requestCopy = tslib.__assign(tslib.__assign({}, request), { next: [], error: [], complete: [], subscribers: new Set() }); |
|
var key = this.batchKey(request.operation); |
|
if (!requestCopy.observable) { |
|
requestCopy.observable = new utilities.Observable(function (observer) { |
|
var batch = _this.batchesByKey.get(key); |
|
if (!batch) |
|
_this.batchesByKey.set(key, (batch = new Set())); |
|
var isFirstEnqueuedRequest = batch.size === 0; |
|
var isFirstSubscriber = requestCopy.subscribers.size === 0; |
|
requestCopy.subscribers.add(observer); |
|
if (isFirstSubscriber) { |
|
batch.add(requestCopy); |
|
} |
|
if (observer.next) { |
|
requestCopy.next.push(observer.next.bind(observer)); |
|
} |
|
if (observer.error) { |
|
requestCopy.error.push(observer.error.bind(observer)); |
|
} |
|
if (observer.complete) { |
|
requestCopy.complete.push(observer.complete.bind(observer)); |
|
} |
|
if (isFirstEnqueuedRequest || _this.batchDebounce) { |
|
_this.scheduleQueueConsumption(key); |
|
} |
|
if (batch.size === _this.batchMax) { |
|
_this.consumeQueue(key); |
|
} |
|
return function () { |
|
var _a; |
|
if (requestCopy.subscribers.delete(observer) && |
|
requestCopy.subscribers.size < 1) { |
|
if (batch.delete(requestCopy) && batch.size < 1) { |
|
_this.consumeQueue(key); |
|
(_a = batch.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe(); |
|
} |
|
} |
|
}; |
|
}); |
|
} |
|
return requestCopy.observable; |
|
}; |
|
OperationBatcher.prototype.consumeQueue = function (key) { |
|
if (key === void 0) { key = ""; } |
|
var batch = this.batchesByKey.get(key); |
|
this.batchesByKey.delete(key); |
|
if (!batch || !batch.size) { |
|
return; |
|
} |
|
var operations = []; |
|
var forwards = []; |
|
var observables = []; |
|
var nexts = []; |
|
var errors = []; |
|
var completes = []; |
|
batch.forEach(function (request) { |
|
operations.push(request.operation); |
|
forwards.push(request.forward); |
|
observables.push(request.observable); |
|
nexts.push(request.next); |
|
errors.push(request.error); |
|
completes.push(request.complete); |
|
}); |
|
var batchedObservable = this.batchHandler(operations, forwards) || utilities.Observable.of(); |
|
var onError = function (error) { |
|
errors.forEach(function (rejecters) { |
|
if (rejecters) { |
|
rejecters.forEach(function (e) { return e(error); }); |
|
} |
|
}); |
|
}; |
|
batch.subscription = batchedObservable.subscribe({ |
|
next: function (results) { |
|
if (!Array.isArray(results)) { |
|
results = [results]; |
|
} |
|
if (nexts.length !== results.length) { |
|
var error = new Error("server returned results with length ".concat(results.length, ", expected length of ").concat(nexts.length)); |
|
error.result = results; |
|
return onError(error); |
|
} |
|
results.forEach(function (result, index) { |
|
if (nexts[index]) { |
|
nexts[index].forEach(function (next) { return next(result); }); |
|
} |
|
}); |
|
}, |
|
error: onError, |
|
complete: function () { |
|
completes.forEach(function (complete) { |
|
if (complete) { |
|
complete.forEach(function (c) { return c(); }); |
|
} |
|
}); |
|
}, |
|
}); |
|
return observables; |
|
}; |
|
OperationBatcher.prototype.scheduleQueueConsumption = function (key) { |
|
var _this = this; |
|
clearTimeout(this.scheduledBatchTimerByKey.get(key)); |
|
this.scheduledBatchTimerByKey.set(key, setTimeout(function () { |
|
_this.consumeQueue(key); |
|
_this.scheduledBatchTimerByKey.delete(key); |
|
}, this.batchInterval)); |
|
}; |
|
return OperationBatcher; |
|
}()); |
|
|
|
var BatchLink = (function (_super) { |
|
tslib.__extends(BatchLink, _super); |
|
function BatchLink(fetchParams) { |
|
var _this = _super.call(this) || this; |
|
var _a = fetchParams || {}, batchDebounce = _a.batchDebounce, _b = _a.batchInterval, batchInterval = _b === void 0 ? 10 : _b, _c = _a.batchMax, batchMax = _c === void 0 ? 0 : _c, _d = _a.batchHandler, batchHandler = _d === void 0 ? function () { return null; } : _d, _e = _a.batchKey, batchKey = _e === void 0 ? function () { return ""; } : _e; |
|
_this.batcher = new OperationBatcher({ |
|
batchDebounce: batchDebounce, |
|
batchInterval: batchInterval, |
|
batchMax: batchMax, |
|
batchHandler: batchHandler, |
|
batchKey: batchKey, |
|
}); |
|
if (fetchParams.batchHandler.length <= 1) { |
|
_this.request = function (operation) { return _this.batcher.enqueueRequest({ operation: operation }); }; |
|
} |
|
return _this; |
|
} |
|
BatchLink.prototype.request = function (operation, forward) { |
|
return this.batcher.enqueueRequest({ |
|
operation: operation, |
|
forward: forward, |
|
}); |
|
}; |
|
return BatchLink; |
|
}(core.ApolloLink)); |
|
|
|
exports.BatchLink = BatchLink; |
|
exports.OperationBatcher = OperationBatcher; |
|
//# sourceMappingURL=batch.cjs.map
|
|
|