UNPKG

jinaga

Version:

Data management for web and mobile applications.

94 lines 3.94 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()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PersistentFork = void 0; const sorter_1 = require("../fact/sorter"); const QueueProcessor_1 = require("../managers/QueueProcessor"); const storage_1 = require("../storage"); const trace_1 = require("../util/trace"); const serialize_1 = require("./serialize"); const web_client_saver_1 = require("./web-client-saver"); class PersistentFork { constructor(storage, queue, client, delayMilliseconds) { this.storage = storage; this.queue = queue; this.client = client; this.delayMilliseconds = delayMilliseconds; const saver = new web_client_saver_1.WebClientSaver(client, queue); this.queueProcessor = new QueueProcessor_1.QueueProcessor(saver, delayMilliseconds); } initialize() { // Schedule processing of any existing items in the queue this.queueProcessor.scheduleProcessing(); } close() { return __awaiter(this, void 0, void 0, function* () { // Process any pending facts before closing try { yield this.processQueueNow(); } catch (error) { trace_1.Trace.error(error); } this.queueProcessor.dispose(); return Promise.resolve(); }); } save(envelopes) { return __awaiter(this, void 0, void 0, function* () { yield this.queue.enqueue(envelopes); this.queueProcessor.scheduleProcessing(); }); } load(references) { return __awaiter(this, void 0, void 0, function* () { const known = yield this.storage.load(references); const remaining = references.filter(reference => !known.some((0, storage_1.factEnvelopeEquals)(reference))); if (remaining.length === 0) { return known; } else { const records = yield this.loadEnvelopes(remaining); return records.concat(known); } }); } /** * Processes the queue immediately, bypassing any delay. */ processQueueNow() { return __awaiter(this, void 0, void 0, function* () { yield this.queueProcessor.processQueueNow(); }); } loadEnvelopes(references) { return __awaiter(this, void 0, void 0, function* () { const sorter = new sorter_1.TopologicalSorter(); let loaded = []; for (let start = 0; start < references.length; start += 300) { const chunk = references.slice(start, start + 300); const response = yield this.client.loadWithRetry((0, serialize_1.serializeLoad)(chunk)); const facts = sorter.sort(response.facts, (p, f) => f); const envelopes = facts.map(fact => { return { fact: fact, signatures: [] }; }); yield this.storage.save(envelopes); loaded = loaded.concat(envelopes); } return loaded; }); } } exports.PersistentFork = PersistentFork; //# sourceMappingURL=persistent-fork.js.map