@synerty/vortexjs
Version:
Custom observable data serialisation and routing based on Angular 2+
112 lines • 13.9 kB
JavaScript
import { Inject, Injectable } from "@angular/core";
import { TupleStorageServiceABC, } from "./TupleStorageServiceABC";
import { TupleOfflineStorageNameService } from "./TupleOfflineStorageNameService";
import { SqlFactoryService } from "../storage-api/sql-api-factory";
import * as i0 from "@angular/core";
import * as i1 from "../storage-api/sql-api-factory";
// ----------------------------------------------------------------------------
const createTable = `CREATE TABLE IF NOT EXISTS tuples
(
tupleSelector TEXT,
dateTime REAL,
payload TEXT,
PRIMARY KEY (tupleSelector)
)`;
const dropTable = `DROP TABLE IF NOT EXISTS tuples`;
const deleteBySelectorSql = `DELETE
FROM tuples
WHERE tupleSelector = ?`;
const deleteByDateSql = `DELETE
FROM tuples
WHERE dateTime < ?`;
const insertSql = `INSERT OR REPLACE INTO tuples
(tupleSelector, dateTime, payload)
VALUES (?, ?, ?)`;
const selectSql = `SELECT tupleSelector, dateTime, payload
FROM tuples
WHERE tupleSelector = ?`;
export class TupleStorageWebSqlService extends TupleStorageServiceABC {
webSqlFactory;
name;
webSql;
constructor(webSqlFactory, name) {
super(name);
this.webSqlFactory = webSqlFactory;
this.name = name;
this.webSql = webSqlFactory.createApi(this.dbName, [createTable]);
}
open() {
return this.webSql.open();
}
async isOpen() {
return await this.webSql.isOpen();
}
async close() {
await this.webSql.close();
}
async truncateStorage() {
await this.webSql.execute([{ sql: dropTable }]);
await this.webSql.execute([{ sql: createTable }]);
}
async loadTuplesEncoded(tupleSelector) {
const bindParams = [tupleSelector.toOrderedJsonStr()];
const rows = await this.webSql.query({
sql: selectSql,
bindParams: bindParams,
});
if (!rows?.length) {
return null;
}
return rows[0].payload;
}
async saveTuplesEncoded(tupleSelector, vortexMsg, retries = 0) {
// The payload is a convenient way to serialise and compress the data
const tupleSelectorStr = tupleSelector.toOrderedJsonStr();
const bindParams = [tupleSelectorStr, Date.now(), vortexMsg];
await this.webSql.execute([{ sql: insertSql, bindParams: bindParams }]);
}
async batchSaveTuplesEncoded(data) {
const txData = [];
for (const data_ of data) {
txData.push({
sql: insertSql,
bindParams: [
data_.tupleSelector.toOrderedJsonStr(),
Date.now(),
data_.vortexMsg,
],
});
}
await this.webSql.execute(txData);
return Promise.resolve(undefined);
}
async deleteTuples(tupleSelector, retries = 0) {
const tupleSelectorStr = tupleSelector.toOrderedJsonStr();
await this.webSql.execute([
{
sql: deleteBySelectorSql,
bindParams: [tupleSelectorStr],
},
]);
}
async deleteOldTuples(deleteDataBeforeDate, retries = 0) {
await this.webSql.execute([
{
sql: deleteByDateSql,
bindParams: [deleteDataBeforeDate.getTime()],
},
]);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TupleStorageWebSqlService, deps: [{ token: SqlFactoryService }, { token: TupleOfflineStorageNameService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TupleStorageWebSqlService });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TupleStorageWebSqlService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.SqlFactoryService, decorators: [{
type: Inject,
args: [SqlFactoryService]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [TupleOfflineStorageNameService]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHVwbGVTdG9yYWdlV2ViU3FsU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy92b3J0ZXgvc3RvcmFnZS9UdXBsZVN0b3JhZ2VXZWJTcWxTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFFSCxzQkFBc0IsR0FDekIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7O0FBR25FLCtFQUErRTtBQUMvRSxNQUFNLFdBQVcsR0FBRzs7Ozs7O09BTWIsQ0FBQztBQUVSLE1BQU0sU0FBUyxHQUFHLGlDQUFpQyxDQUFDO0FBRXBELE1BQU0sbUJBQW1CLEdBQUc7O3lDQUVhLENBQUM7QUFFMUMsTUFBTSxlQUFlLEdBQUc7O29DQUVZLENBQUM7QUFFckMsTUFBTSxTQUFTLEdBQUc7O2tDQUVnQixDQUFDO0FBRW5DLE1BQU0sU0FBUyxHQUFHOzt5Q0FFdUIsQ0FBQztBQUcxQyxNQUFNLE9BQU8seUJBQTBCLFNBQVEsc0JBQXNCO0lBSTFCO0lBQ1k7SUFKM0MsTUFBTSxDQUFZO0lBRTFCLFlBQ3VDLGFBQWdDLEVBQ3BCLElBQUk7UUFFbkQsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBSHVCLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUNwQixTQUFJLEdBQUosSUFBSSxDQUFBO1FBR25ELElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsSUFBSTtRQUNBLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUs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QyxPQUFPLEVBQUUsQ0FBQzthQUMvQztTQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7d0dBbEdRLHlCQUF5QixrQkFJdEIsaUJBQWlCLGFBQ2pCLDhCQUE4Qjs0R0FMakMseUJBQXlCOzs0RkFBekIseUJBQXlCO2tCQURyQyxVQUFVOzswQkFLRixNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3hCLE1BQU07MkJBQUMsOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHVwbGVTZWxlY3RvciB9IGZyb20gXCIuLi9UdXBsZVNlbGVjdG9yXCI7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgICBUdXBsZVN0b3JhZ2VCYXRjaFNhdmVBcmd1bWVudHMsXG4gICAgVHVwbGVTdG9yYWdlU2VydmljZUFCQyxcbn0gZnJvbSBcIi4vVHVwbGVTdG9yYWdlU2VydmljZUFCQ1wiO1xuaW1wb3J0IHsgVHVwbGVPZmZsaW5lU3RvcmFnZU5hbWVTZXJ2aWNlIH0gZnJvbSBcIi4vVHVwbGVPZmZsaW5lU3RvcmFnZU5hbWVTZXJ2aWNlXCI7XG5pbXBvcnQgeyBTcWxGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi9zdG9yYWdlLWFwaS9zcWwtYXBpLWZhY3RvcnlcIjtcbmltcG9ydCB7IFNxbEFwaUFCQywgU3FsRXhlY3V0ZURhdGEgfSBmcm9tIFwiLi4vc3RvcmFnZS1hcGkvc3FsLWFwaS1hYmNcIjtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgY3JlYXRlVGFibGUgPSBgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgdHVwbGVzXG4gICAgIChcbiAgICAgICAgdHVwbGVTZWxlY3RvciBURVhULFxuICAgICAgICBkYXRlVGltZSBSRUFMLFxuICAgICAgICBwYXlsb2FkIFRFWFQsXG4gICAgICAgIFBSSU1BUlkgS0VZICh0dXBsZVNlbGVjdG9yKVxuICAgICApYDtcblxuY29uc3QgZHJvcFRhYmxlID0gYERST1AgVEFCTEUgSUYgTk9UIEVYSVNUUyB0dXBsZXNgO1xuXG5jb25zdCBkZWxldGVCeVNlbGVjdG9yU3FsID0gYERFTEVURVxuICAgICAgICAgICAgICAgICBGUk9NIHR1cGxlc1xuICAgICAgICAgICAgICAgICBXSEVSRSB0dXBsZVNlbGVjdG9yID0gP2A7XG5cbmNvbnN0IGRlbGV0ZUJ5RGF0ZVNxbCA9IGBERUxFVEVcbiAgICAgICAgICAgICAgICAgRlJPTSB0dXBsZXNcbiAgICAgICAgICAgICAgICAgV0hFUkUgZGF0ZVRpbWUgPCA/YDtcblxuY29uc3QgaW5zZXJ0U3FsID0gYElOU0VSVCBPUiBSRVBMQUNFIElOVE8gdHVwbGVzXG4gICAgICAgICAgICAgICAgICh0dXBsZVNlbGVjdG9yLCBkYXRlVGltZSwgcGF5bG9hZClcbiAgICAgICAgICAgICAgICAgVkFMVUVTICg/LCA/LCA/KWA7XG5cbmNvbnN0IHNlbGVjdFNxbCA9IGBTRUxFQ1QgdHVwbGVTZWxlY3RvciwgZGF0ZVRpbWUsIHBheWxvYWRcbiAgICAgICAgICAgICAgICAgRlJPTSB0dXBsZXNcbiAgICAgICAgICAgICAgICAgV0hFUkUgdHVwbGVTZWxlY3RvciA9ID9gO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVHVwbGVTdG9yYWdlV2ViU3FsU2VydmljZSBleHRlbmRzIFR1cGxlU3RvcmFnZVNlcnZpY2VBQkMge1xuICAgIHByaXZhdGUgd2ViU3FsOiBTcWxBcGlBQkM7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChTcWxGYWN0b3J5U2VydmljZSkgcHJpdmF0ZSB3ZWJTcWxGYWN0b3J5OiBTcWxGYWN0b3J5U2VydmljZSxcbiAgICAgICAgQEluamVjdChUdXBsZU9mZmxpbmVTdG9yYWdlTmFtZVNlcnZpY2UpIHB1YmxpYyBuYW1lXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKG5hbWUpO1xuICAgICAgICB0aGlzLndlYlNxbCA9IHdlYlNxbEZhY3RvcnkuY3JlYXRlQXBpKHRoaXMuZGJOYW1lLCBbY3JlYXRlVGFibGVdKTtcbiAgICB9XG5cbiAgICBvcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWJTcWwub3BlbigpO1xuICAgIH1cblxuICAgIGFzeW5jIGlzT3BlbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMud2ViU3FsLmlzT3BlbigpO1xuICAgIH1cblxuICAgIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLndlYlNxbC5jbG9zZSgpO1xuICAgIH1cblxuICAgIGFzeW5jIHRydW5jYXRlU3RvcmFnZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy53ZWJTcWwuZXhlY3V0ZShbeyBzcWw6IGRyb3BUYWJsZSB9XSk7XG4gICAgICAgIGF3YWl0IHRoaXMud2ViU3FsLmV4ZWN1dGUoW3sgc3FsOiBjcmVhdGVUYWJsZSB9XSk7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZFR1cGxlc0VuY29kZWQoXG4gICAgICAgIHR1cGxlU2VsZWN0b3I6IFR1cGxlU2VsZWN0b3JcbiAgICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgYmluZFBhcmFtcyA9IFt0dXBsZVNlbGVjdG9yLnRvT3JkZXJlZEpzb25TdHIoKV07XG5cbiAgICAgICAgY29uc3Qgcm93czogYW55W10gPSBhd2FpdCB0aGlzLndlYlNxbC5xdWVyeSh7XG4gICAgICAgICAgICBzcWw6IHNlbGVjdFNxbCxcbiAgICAgICAgICAgIGJpbmRQYXJhbXM6IGJpbmRQYXJhbXMsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJvd3M/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NbMF0ucGF5bG9hZDtcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlVHVwbGVzRW5jb2RlZChcbiAgICAgICAgdHVwbGVTZWxlY3RvcjogVHVwbGVTZWxlY3RvcixcbiAgICAgICAgdm9ydGV4TXNnOiBzdHJpbmcsXG4gICAgICAgIHJldHJpZXMgPSAwXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFRoZSBwYXlsb2FkIGlzIGEgY29udmVuaWVudCB3YXkgdG8gc2VyaWFsaXNlIGFuZCBjb21wcmVzcyB0aGUgZGF0YVxuICAgICAgICBjb25zdCB0dXBsZVNlbGVjdG9yU3RyID0gdHVwbGVTZWxlY3Rvci50b09yZGVyZWRKc29uU3RyKCk7XG4gICAgICAgIGNvbnN0IGJpbmRQYXJhbXMgPSBbdHVwbGVTZWxlY3RvclN0ciwgRGF0ZS5ub3coKSwgdm9ydGV4TXNnXTtcblxuICAgICAgICBhd2FpdCB0aGlzLndlYlNxbC5leGVjdXRlKFt7IHNxbDogaW5zZXJ0U3FsLCBiaW5kUGFyYW1zOiBiaW5kUGFyYW1zIH1dKTtcbiAgICB9XG5cbiAgICBhc3luYyBiYXRjaFNhdmVUdXBsZXNFbmNvZGVkKFxuICAgICAgICBkYXRhOiBUdXBsZVN0b3JhZ2VCYXRjaFNhdmVBcmd1bWVudHNbXVxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0eERhdGE6IFNxbEV4ZWN1dGVEYXRhW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBkYXRhXyBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0eERhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgc3FsOiBpbnNlcnRTcWwsXG4gICAgICAgICAgICAgICAgYmluZFBhcmFtczogW1xuICAgICAgICAgICAgICAgICAgICBkYXRhXy50dXBsZVNlbGVjdG9yLnRvT3JkZXJlZEpzb25TdHIoKSxcbiAgICAgICAgICAgICAgICAgICAgRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YV8udm9ydGV4TXNnLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMud2ViU3FsLmV4ZWN1dGUodHhEYXRhKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZVR1cGxlcyhcbiAgICAgICAgdHVwbGVTZWxlY3RvcjogVHVwbGVTZWxlY3RvcixcbiAgICAgICAgcmV0cmllcyA9IDBcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdHVwbGVTZWxlY3RvclN0ciA9IHR1cGxlU2VsZWN0b3IudG9PcmRlcmVkSnNvblN0cigpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMud2ViU3FsLmV4ZWN1dGUoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNxbDogZGVsZXRlQnlTZWxlY3RvclNxbCxcbiAgICAgICAgICAgICAgICBiaW5kUGFyYW1zOiBbdHVwbGVTZWxlY3RvclN0cl0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGVPbGRUdXBsZXMoXG4gICAgICAgIGRlbGV0ZURhdGFCZWZvcmVEYXRlOiBEYXRlLFxuICAgICAgICByZXRyaWVzID0gMFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLndlYlNxbC5leGVjdXRlKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzcWw6IGRlbGV0ZUJ5RGF0ZVNxbCxcbiAgICAgICAgICAgICAgICBiaW5kUGFyYW1zOiBbZGVsZXRlRGF0YUJlZm9yZURhdGUuZ2V0VGltZSgpXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgIH1cbn1cbiJdfQ==