@berish/orm-web-db-adapter
Version:
Адаптер базы данных по сети для @berish/orm
118 lines • 5.82 kB
JavaScript
"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