jinaga
Version:
Data management for web and mobile applications.
94 lines • 3.94 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());
});
};
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