UNPKG

@berish/orm-web-db-adapter

Version:

Адаптер базы данных по сети для @berish/orm

118 lines 5.82 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.WebDBAdapter = void 0; const emitter_1 = require("@berish/emitter"); const linq_1 = require("@berish/linq"); const orm_1 = require("@berish/orm"); class WebDBAdapter extends orm_1.BaseDBAdapter { constructor(constructorParams) { super(); this._emitter = new emitter_1.EventEmitter(); this._constructorParams = null; // Здесь хранятся кникальные запросы к списку callback (по queryHash) this._uniqueQueries = []; this._offTriggers = []; this.initialize = (params) => __awaiter(this, void 0, void 0, function* () { this.params = params; }); this.close = () => __awaiter(this, void 0, void 0, function* () { this.params = null; this._emitter.offAll(); }); this.get = (query) => { if (!this.params.get) throw new TypeError('webDBAdapter params.get is null'); return this.params.get(query); }; this.create = (tableName, items) => { if (!this.params.create) throw new TypeError('webDBAdapter params.create is null'); return this.params.create(tableName, items); }; this.update = (tableName, items) => { if (!this.params.update) throw new TypeError('webDBAdapter params.update is null'); return this.params.update(tableName, items); }; this.delete = (query) => { if (!this.params.delete) throw new TypeError('webDBAdapter params.delete is null'); return this.params.delete(query); }; this.index = (tableName, indexName, keys) => { if (!this.params.index) throw new TypeError('webDBAdapter params.index is null'); return this.params.index(tableName, indexName, keys); }; this.find = (query) => { if (!this.params.find) throw new TypeError('webDBAdapter params.find is null'); return this.params.find(query); }; this.subscribe = (data, callback) => __awaiter(this, void 0, void 0, function* () { if (!this.params.subscribe) throw new TypeError('webDBAdapter params.subscribe is null'); const queryHash = orm_1.Query.getHash(data); if (!this._emitter.hasEvent(queryHash)) { yield this._realSubscribe(data); } const eventHash = this._emitter.on(queryHash, ({ oldValue, newValue }) => callback(oldValue, newValue)); return () => { this._emitter.off(eventHash); }; }); this.connectSubscriptions = () => { // Здесь мы подключаем все реальные callback к текущим const eventNames = linq_1.default.from(this._emitter['_events']) .map((m) => m.eventName) .distinct((m) => m); for (const queryHash of eventNames) { const queryData = this._uniqueQueries.filter((m) => orm_1.Query.getHash(m) === queryHash)[0]; if (queryData) this._realSubscribe(queryData); } }; this.disconnectSubscriptions = () => { for (const eventHash of this._offTriggers) { this._emitter.offTriggerOff(eventHash); } this._offTriggers = []; }; this._realSubscribe = (data) => __awaiter(this, void 0, void 0, function* () { const queryHash = orm_1.Query.getHash(data); // Добавляем Query к списку уникальных if (this._uniqueQueries.filter((m) => orm_1.Query.getHash(m) === queryHash).length <= 0) this._uniqueQueries.push(data); const unsubcribe = yield this.params.subscribe(data, (oldValue, newValue) => this._emitter.emitSync(queryHash, { oldValue, newValue })); const triggerOffEventHash = this._emitter.triggerOffEvent(queryHash, () => { // Удаляем Query из списка уникальных this._uniqueQueries.filter((m) => orm_1.Query.getHash(m) !== queryHash); if (this._constructorParams.isConnected()) unsubcribe(); this._offTriggers = this._offTriggers.filter((m) => m !== triggerOffEventHash); this._emitter.offTriggerOff(triggerOffEventHash); }); this._offTriggers.push(triggerOffEventHash); }); if (!constructorParams) throw new TypeError('webDBAdapter constructorParams is null'); this._constructorParams = constructorParams; this._uniqueQueries = []; } count(query) { if (!this.params.count) throw new TypeError('webDBAdapter params.count is null'); return this.params.count(query); } } exports.WebDBAdapter = WebDBAdapter; //# sourceMappingURL=webDBAdapter.js.map