UNPKG

firewalk

Version:

A collection traversal library for Firestore

86 lines 5.33 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _TraverserImpl_instances, _a, _TraverserImpl_defaultConfig, _TraverserImpl_limit, _TraverserImpl_makeRetriableAccordingToConfig; Object.defineProperty(exports, "__esModule", { value: true }); exports.TraverserImpl = void 0; const p_limit_1 = __importDefault(require("p-limit")); const utils_1 = require("../utils"); const abstract_1 = require("./abstract"); class TraverserImpl extends abstract_1.AbstractTraverser { constructor(traversable, exitEarlyPredicates = [], config) { super(Object.assign(Object.assign({}, __classPrivateFieldGet(_a, _a, "f", _TraverserImpl_defaultConfig)), config), exitEarlyPredicates); _TraverserImpl_instances.add(this); this.traversable = traversable; _TraverserImpl_limit.set(this, void 0); __classPrivateFieldSet(this, _TraverserImpl_limit, (0, p_limit_1.default)(this.traversalConfig.maxConcurrentBatchCount), "f"); } withConfig(config) { return new _a(this.traversable, this.exitEarlyPredicates, Object.assign(Object.assign({}, this.traversalConfig), config)); } withExitEarlyPredicate(predicate) { return new _a(this.traversable, [...this.exitEarlyPredicates, predicate], this.traversalConfig); } traverse(callback) { return __awaiter(this, void 0, void 0, function* () { const { maxConcurrentBatchCount } = this.traversalConfig; callback = __classPrivateFieldGet(this, _TraverserImpl_instances, "m", _TraverserImpl_makeRetriableAccordingToConfig).call(this, callback); if (maxConcurrentBatchCount === 1) { return this.runTraversal((batchDocs, batchIndex) => __awaiter(this, void 0, void 0, function* () { yield callback(batchDocs, batchIndex); })); } const callbackPromises = []; const traversalResult = yield this.runTraversal((batchDocs, batchIndex) => { const callbackPromise = __classPrivateFieldGet(this, _TraverserImpl_limit, "f").call(this, () => { var _b; return (_b = callback(batchDocs, batchIndex)) !== null && _b !== void 0 ? _b : Promise.resolve(); }); callbackPromises.push(callbackPromise); }); yield Promise.all(callbackPromises); return traversalResult; }); } } exports.TraverserImpl = TraverserImpl; _a = TraverserImpl, _TraverserImpl_limit = new WeakMap(), _TraverserImpl_instances = new WeakSet(), _TraverserImpl_makeRetriableAccordingToConfig = function _TraverserImpl_makeRetriableAccordingToConfig(callback) { const { maxBatchRetryCount, sleepTimeBetweenTrials } = this.traversalConfig; let cb = callback; if (maxBatchRetryCount > 0) { const retriableCallback = (0, utils_1.makeRetriable)(callback, { maxTrialCount: 1 + maxBatchRetryCount, sleepTimeBetweenTrials, returnErrors: true, }); cb = (...args) => __awaiter(this, void 0, void 0, function* () { const result = yield retriableCallback(...args); if (!result.hasSucceeded) { const { errors } = result; const lastError = errors[errors.length - 1]; throw lastError; } }); } return cb; }; _TraverserImpl_defaultConfig = { value: Object.assign({}, abstract_1.AbstractTraverser.baseConfig) }; //# sourceMappingURL=TraverserImpl.js.map