Odoo GraphQL Subscription using Node, Express JS for Sample
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

'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