jinaga
Version:
Data management for web and mobile applications.
72 lines • 3 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.TransientFork = void 0;
const sorter_1 = require("../fact/sorter");
const storage_1 = require("../storage");
const trace_1 = require("../util/trace");
const serialize_1 = require("./serialize");
class TransientFork {
constructor(storage, client) {
this.storage = storage;
this.client = client;
}
close() {
return Promise.resolve();
}
save(envelopes) {
return __awaiter(this, void 0, void 0, function* () {
yield this.client.save(envelopes);
});
}
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);
}
});
}
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.load((0, serialize_1.serializeLoad)(chunk));
const facts = sorter.sort(response.facts, (p, f) => f);
const envelopes = facts.map(fact => {
return {
fact: fact,
signatures: []
};
});
const saved = yield this.storage.save(envelopes);
if (saved.length > 0) {
trace_1.Trace.counter("facts_saved", saved.length);
}
loaded = loaded.concat(envelopes);
}
return loaded;
});
}
processQueueNow() {
// No-op for transient fork
return Promise.resolve();
}
}
exports.TransientFork = TransientFork;
//# sourceMappingURL=transient-fork.js.map