UNPKG

@synerty/vortexjs

Version:

Custom observable data serialisation and routing based on Angular 2+

112 lines 13.9 kB
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==