firewalk
Version:
A collection traversal library for Firestore
86 lines • 5.33 kB
JavaScript
;
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