UNPKG

174 kBSource Map (JSON)View Raw
1{"version":3,"file":"index.js","sources":["src/ram_indexer.js","src/proto.js","src/pouchdb.js","src/adapter.js","src/index.js"],"sourcesContent":["/**\n * ### Кеш первого уровня - по датам\n * с функцией поиска в этом кеше\n *\n * @module indexer\n *\n * Created by Evgeniy Malyarov on 29.09.2018.\n */\n\n//const debug = require('debug')('wb:indexer');\n\n// компаратор сортировки\nfunction sort_fn(a, b) {\n if (a.date < b.date){\n return -1;\n }\n else if (a.date > b.date){\n return 1;\n }\n else{\n return 0;\n }\n}\n\nexport default class RamIndexer {\n\n static waitError() {\n const err = new Error('Индекс прочитн не полностью, повторите запрос позже');\n err.status = 403;\n throw err;\n }\n\n static truth(fld, cond) {\n const blank = '00000000-0000-0000-0000-000000000000';\n if(cond === true || (cond && cond.hasOwnProperty('$ne') && !cond.$ne)) {\n return function (doc) {\n return doc[fld];\n };\n }\n else if(cond === false || (cond && cond.hasOwnProperty('$ne') && cond.$ne && typeof cond.$ne === 'boolean')) {\n return function (doc) {\n return !doc[fld];\n };\n }\n else if(cond && cond.hasOwnProperty('filled')) {\n return function (doc) {\n return doc[fld] && doc[fld] !== blank;\n };\n }\n else if(cond && cond.hasOwnProperty('nfilled')) {\n return function (doc) {\n return !doc[fld] || doc[fld] === blank;\n };\n }\n else if(cond && cond.hasOwnProperty('$ne')) {\n return function (doc) {\n return doc[fld] !== cond.$ne;\n };\n }\n else if(cond && cond.hasOwnProperty('$in')) {\n const acond = typeof cond.$in === 'string' ? cond.$in.split(',').map((v) => v.trim()) : cond.$in;\n return function (doc) {\n return acond.includes(doc[fld]);\n };\n }\n else if(cond && cond.hasOwnProperty('$nin')) {\n const acond = typeof cond.$nin === 'string' ? cond.$nin.split(',').map((v) => v.trim()) : cond.$nin;\n return function (doc) {\n return !acond.includes(doc[fld]);\n };\n }\n else {\n return function (doc) {\n return doc[fld] === cond;\n };\n }\n }\n\n constructor({fields, search_fields, mgr}) {\n\n this._fields = fields;\n this._search_fields = search_fields;\n this._mgrs = Array.isArray(mgr) ? mgr : [mgr];\n this._count = 0;\n this._ready = false;\n this._listeners = new Map();\n this._area = this._mgrs.length > 1;\n\n // кеш по дате\n this.by_date = {};\n }\n\n // сортирует кеш\n sort() {\n //debug('sorting');\n for(const date in this.by_date) {\n this.by_date[date].sort(sort_fn);\n }\n this._ready = true;\n //debug('ready');\n }\n\n // помещает документ в кеш\n put(indoc, force) {\n const doc = {};\n if(this._area) {\n doc._area = indoc._area;\n }\n this._fields.forEach((fld) => {\n if(indoc.hasOwnProperty(fld)) {\n doc[fld] = indoc[fld];\n }\n });\n const date = doc.date.substr(0, 7);\n const arr = this.by_date[date];\n if(arr) {\n if(force || !arr.some((row) => {\n if(row._id === doc._id) {\n Object.assign(row, doc);\n return true;\n }\n })) {\n arr.push(doc);\n !force && arr.sort(sort_fn);\n }\n }\n else {\n this.by_date[date] = [doc];\n }\n }\n\n // возаращает фрагмент кеша по датам\n get_range(from, till, step, desc) {\n if(!from || !till) {\n return [];\n }\n if(desc) {\n if(step) {\n let [year, month] = till.split('-');\n month = parseInt(month, 10) - step;\n while (month < 1) {\n year = parseInt(year, 10) - 1;\n month += 12;\n }\n till = `${year}-${month.pad(2)}`;\n }\n if(till < from) {\n return null;\n }\n let res = this.by_date[till];\n if(!res) {\n res = [];\n }\n return res;\n }\n else {\n if(step) {\n let [year, month] = from.split('-');\n month = parseInt(month, 10) + step;\n while (month > 12) {\n year = parseInt(year, 10) + 1;\n month -= 12;\n }\n from = `${year}-${month.pad(2)}`;\n }\n if(from > till) {\n return null;\n }\n let res = this.by_date[from];\n if(!res) {\n res = [];\n }\n return res;\n }\n }\n\n // перебирает кеш в диапазоне дат\n find({selector, sort, ref, limit, skip = 0}, auth) {\n\n if(!this._ready) {\n RamIndexer.waitError();\n }\n\n // извлекаем значения полей фильтра из селектора\n let dfrom, dtill, from, till, search;\n for(const row of selector.$and) {\n const fld = Object.keys(row)[0];\n const cond = Object.keys(row[fld])[0];\n if(fld === 'date') {\n if(cond === '$lt' || cond === '$lte') {\n dtill = row[fld][cond];\n till = dtill.substr(0,7);\n }\n else if(cond === '$gt' || cond === '$gte') {\n dfrom = row[fld][cond];\n from = dfrom.substr(0,7);\n }\n }\n else if(fld === 'search') {\n search = row[fld][cond] ? row[fld][cond].toLowerCase().split(' ') : [];\n }\n }\n\n if(sort && sort.length && sort[0][Object.keys(sort[0])[0]] === 'desc' || sort === 'desc') {\n sort = 'desc';\n }\n else {\n sort = 'asc';\n }\n\n const {_search_fields} = this;\n const {utils} = $p;\n\n let part,\n // выборка диапазона кеша\n step = 0,\n // флаг поиска страницы со ссылкой\n flag = skip === 0 && utils.is_guid(ref),\n // результат поиска строки со ссылкой\n scroll = null,\n count = 0;\n\n const docs = [];\n\n function add(doc) {\n count++;\n if(flag && doc._id.endsWith(ref)) {\n scroll = count - 1;\n flag = false;\n }\n if(skip > 0) {\n return skip--;\n }\n if(limit > 0) {\n limit--;\n docs.push(doc);\n }\n }\n\n function check(doc) {\n\n // фильтруем по дате\n if(doc.date < dfrom || doc.date > dtill) {\n return;\n }\n\n // фильтруем по строке\n let ok = true;\n for(const word of search) {\n if(!word) {\n continue;\n }\n if(!_search_fields.some((fld) => {\n const val = doc[fld];\n return val && typeof val === 'string' && val.toLowerCase().includes(word);\n })){\n ok = false;\n break;\n }\n }\n\n ok && add(doc);\n }\n\n // получаем очередной кусочек кеша\n while((part = this.get_range(from, till, step, sort === 'desc'))) {\n step += 1;\n // фильтруем\n if(sort === 'desc') {\n for(let i = part.length - 1; i >= 0; i--){\n check(part[i]);\n }\n }\n else {\n for(let i = 0; i < part.length; i++){\n check(part[i]);\n }\n }\n }\n\n return {docs, scroll, flag, count};\n }\n\n // формирует начальный дамп\n init(bookmark, _mgr) {\n\n if(!_mgr) {\n return this._mgrs.reduce((sum, _mgr) => sum.then(() => this.init(bookmark, _mgr)), Promise.resolve())\n .then(() => {\n this.sort();\n });\n }\n\n if(!bookmark) {\n const listener = (change) => {\n if(!change) {\n return;\n }\n if(this._area) {\n change._area = _mgr.cachable;\n }\n this.put(change);\n };\n this._listeners.set(_mgr, listener)\n _mgr.on('change', listener);\n //debug('start');\n }\n\n return _mgr.pouch_db.find({\n selector: {\n class_name: _mgr.class_name,\n },\n fields: this._fields,\n bookmark,\n limit: 10000,\n })\n .then(({bookmark, docs}) => {\n this._count += docs.length;\n //debug(`received ${this._count}`);\n for(const doc of docs) {\n if(this._area) {\n doc._area = _mgr.cachable;\n }\n this.put(doc, true);\n }\n _mgr.adapter.emit('indexer_page', {indexer: this, bookmark: bookmark || '', _mgr});\n //debug(`indexed ${this._count} ${bookmark.substr(10, 30)}`);\n return docs.length === 10000 && this.init(bookmark, _mgr);\n });\n }\n\n // чистит кеш и подписки на события\n reset(mgrs) {\n for(const date in this.by_date) {\n this.by_date[date].length = 0;\n }\n for(const [_mgr, listener] of this._listeners) {\n _mgr.off('change', listener);\n }\n this._listeners.clear();\n this._mgrs.length = 0;\n mgrs && this._mgrs.push.apply(this._mgrs, mgrs);\n this._area = this._mgrs.length > 1;\n }\n}\n\n","/**\n * ### Переопределяет методы менеджеров данных\n *\n * @module proto\n *\n */\n\nimport RamIndexer from './ram_indexer'\n\nexport default ({classes}) => {\n\n\tconst {DataManager, DataObj, DocObj, TaskObj, BusinessProcessObj} = classes;\n\n\t// RamIndexer в classes\n classes.RamIndexer = RamIndexer;\n\n\t// методы в прототип DataObj\n DataObj.prototype.new_number_doc = function new_number_doc(prefix) {\n if (!this._metadata().code_length) {\n return Promise.resolve(this);\n }\n\n const {organization, _manager} = this;\n const {current_user, utils} = _manager._owner.$p;\n\n if(this.date === utils.blank.date) {\n this.date = new Date();\n }\n const year = (this.date instanceof Date) ? this.date.getFullYear() : 0\n\n // если не указан явно, рассчитываем префикс по умолчанию\n if (!prefix) {\n prefix = ((current_user && current_user.prefix) || '') + ((organization && organization.prefix) || '');\n }\n\n let part = '',\n code_length = this._metadata().code_length - prefix.length;\n\n // для кешируемых в озу, вычисляем без индекса\n if (_manager.cachable == 'ram' || _manager.cachable == 'doc_ram') {\n return Promise.resolve(this.new_cat_id(prefix));\n }\n\n return _manager.pouch_db.query('doc/number_doc',\n {\n limit: 1,\n include_docs: false,\n startkey: [_manager.class_name, year, prefix + '\\ufff0'],\n endkey: [_manager.class_name, year, prefix],\n descending: true,\n })\n .then((res) => {\n if(res.rows.length) {\n const num0 = res.rows[0].key[2];\n for (let i = num0.length - 1; i >= prefix.length; i--) {\n if(isNaN(parseInt(num0[i]))) {\n break;\n }\n part = num0[i] + part;\n }\n part = (parseInt(part || 0) + 1).toFixed(0);\n }\n else {\n part = '1';\n }\n while (part.length < code_length) {\n part = '0' + part;\n }\n\n if (this instanceof DocObj || this instanceof TaskObj || this instanceof BusinessProcessObj){\n this.number_doc = prefix + part;\n }\n else{\n this.id = prefix + part;\n }\n return this;\n });\n };\n\n DataObj.prototype.new_cat_id = function new_cat_id(prefix) {\n const {organization, _manager} = this;\n const {current_user, wsql} = _manager._owner.$p;\n\n if (!prefix)\n prefix = ((current_user && current_user.prefix) || '') +\n (organization && organization.prefix ? organization.prefix : (wsql.get_user_param('zone') + '-'));\n\n let code_length = this._metadata().code_length - prefix.length,\n field = (this instanceof DocObj || this instanceof TaskObj || this instanceof BusinessProcessObj) ? 'number_doc' : 'id',\n part = '',\n res = wsql.alasql('select top 1 ' + field + ' as id from ? where ' + field + ' like \"' + prefix + '%\" order by ' + field + ' desc', [_manager.alatable]);\n\n if (res.length) {\n const num0 = res[0].id || '';\n for (let i = num0.length - 1; i > 0; i--) {\n if (isNaN(parseInt(num0[i])))\n break;\n part = num0[i] + part;\n }\n part = (parseInt(part || 0) + 1).toFixed(0);\n } else {\n part = '1';\n }\n while (part.length < code_length){\n part = '0' + part;\n }\n this[field] = prefix + part;\n return this;\n };\n\n\t// методы в прототип DataManager\n\tObject.defineProperties(DataManager.prototype, {\n\n\t\t/**\n\t\t * Возвращает базу PouchDB, связанную с объектами данного менеджера\n\t\t * @property pouch_db\n\t\t * @for DataManager\n\t\t */\n\t\tpouch_db: {\n get () {\n const cachable = this.cachable.replace('_ram', '').replace('_doc', '');\n const {adapter} = this;\n if(cachable.indexOf('remote') != -1) {\n return adapter.remote[cachable.replace('_remote', '')];\n }\n else {\n return adapter.local[cachable] || adapter.remote[cachable];\n }\n }\n },\n\n\t})\n\n}\n","/**\n * Экспортирует конструктор PouchDB с учетом среды исполнения\n */\n\nlet PouchDB;\n\n/**\n * В зависимости от среды исполнения, подключаем адаптер memory или idb или websql\n * isNode\n */\nif(typeof process !== 'undefined' && process.versions && process.versions.node) {\n PouchDB = require('pouchdb-core')\n .plugin(require('pouchdb-adapter-http'))\n .plugin(require('pouchdb-replication'))\n .plugin(require('pouchdb-mapreduce'))\n .plugin(require('pouchdb-find'))\n .plugin(require('pouchdb-adapter-memory'));\n}\nelse if(typeof window !== 'undefined' && window.PouchDB) {\n PouchDB = window.PouchDB;\n}\nelse {\n PouchDB = require('pouchdb-core').default\n .plugin(require('pouchdb-adapter-http').default)\n .plugin(require('pouchdb-replication').default)\n .plugin(require('pouchdb-mapreduce').default)\n .plugin(require('pouchdb-find').default)\n .plugin(require('pouchdb-adapter-idb').default);\n if(typeof window !== 'undefined') {\n window.PouchDB = PouchDB;\n }\n}\n\nexport default PouchDB;\n\n","/**\n * Содержит методы и подписки на события PouchDB\n *\n * &copy; Evgeniy Malyarov http://www.oknosoft.ru 2014-2019\n * @module common\n * @submodule pouchdb\n */\n\n/**\n * ### PouchDB для хранения данных в idb браузера и синхронизации с CouchDB\n */\n\nimport PouchDB from './pouchdb';\n\n\nfunction adapter({AbstracrAdapter}) {\n\n const fieldsToDelete = '_id,search,timestamp'.split(',');\n\n /**\n * ### Интерфейс локальной и сетевой баз данных PouchDB\n * Содержит абстрактные методы методы и подписки на события PouchDB, отвечает за авторизацию, синхронизацию и доступ к данным в IndexedDB и на сервере\n *\n * @class AdapterPouch\n * @static\n * @menuorder 34\n * @tooltip Данные pouchdb\n */\n return class AdapterPouch extends AbstracrAdapter {\n\n constructor($p) {\n\n super($p);\n\n this.props = {\n _data_loaded: false,\n _doc_ram_loading: false,\n _doc_ram_loaded: false,\n _auth: null,\n _suffix: '',\n _user: '',\n _push_only: false,\n branch: null,\n };\n\n /**\n * ### Локальные базы PouchDB\n *\n * @property local\n * @type {{ram: PouchDB, doc: PouchDB, meta: PouchDB, sync: {}}}\n */\n this.local = {_loading: false, sync: {}};\n\n /**\n * ### Базы PouchDB на сервере\n *\n * @property remote\n * @type {{ram: PouchDB, doc: PouchDB}}\n */\n this.remote = {};\n\n this.fetch = this.fetch.bind(this);\n\n }\n\n /**\n * Инициализация адаптера\n * @param wsql\n * @param job_prm\n */\n init(wsql, job_prm) {\n\n const {props, local, remote, fetch, $p: {md}} = this;\n\n // настриваем параметры\n Object.assign(props, {\n path: wsql.get_user_param('couch_path', 'string') || job_prm.couch_path || '',\n zone: wsql.get_user_param('zone', 'number'),\n prefix: job_prm.local_storage_prefix,\n direct: wsql.get_user_param('zone', 'number') == job_prm.zone_demo ? false :\n (job_prm.hasOwnProperty('couch_direct') ? job_prm.couch_direct : wsql.get_user_param('couch_direct', 'boolean')),\n user_node: job_prm.user_node,\n noreplicate: job_prm.noreplicate,\n autologin: job_prm.autologin || [],\n });\n if(props.path && props.path.indexOf('http') != 0 && typeof location != 'undefined') {\n props.path = `${location.protocol}//${location.host}${props.path}`;\n }\n if(job_prm.use_meta === false) {\n props.use_meta = false;\n }\n if(job_prm.use_ram === false) {\n props.use_ram = false;\n }\n if(props.user_node && props.user_node.suffix) {\n props._suffix = props.user_node.suffix;\n }\n\n // создаём локальные базы\n const opts = {auto_compaction: true, revs_limit: 3, owner: this, fetch};\n const bases = md.bases();\n\n // если используется meta, вместе с локальной создаём удалённую, т.к. для неё не нужна авторизация\n if(props.use_meta !== false) {\n local.meta = new PouchDB(props.prefix + 'meta', opts);\n if(props.path) {\n remote.meta = new PouchDB(props.path + 'meta', {skip_setup: true, owner: this, fetch});\n setTimeout(() => this.run_sync('meta'));\n }\n }\n\n const pbases = ['doc', 'user'];\n if(props.use_ram !== false) {\n pbases.push('ram');\n }\n\n for (const name of pbases) {\n if(bases.indexOf(name) != -1) {\n // в Node, локальные базы - это алиасы удалённых\n // если direct, то все базы, кроме ram, так же - удалённые\n Object.defineProperty(local, name, {\n get() {\n const dynamic_doc = wsql.get_user_param('dynamic_doc');\n if(dynamic_doc && name === 'doc' && props.direct) {\n return remote[dynamic_doc];\n }\n else {\n return local[`__${name}`] || remote[name];\n }\n }\n });\n\n if(job_prm.couch_memory && job_prm.couch_memory.includes(name)) {\n local[`__${name}`] = new PouchDB(props.prefix + props.zone + '_' + name, Object.assign({adapter: 'memory'}, opts));\n }\n else if(props.user_node || (props.direct && name != 'ram' && name != 'user')) {\n local[`__${name}`] = null;\n }\n else {\n local[`__${name}`] = new PouchDB(props.prefix + props.zone + '_' + name, opts);\n }\n }\n }\n\n // В штатном режиме, серверную базу ram создаём сразу\n // superlogin переопределяет метод after_init и создаёт базы после авторизации\n this.after_init( props.user_node ? bases : (props.autologin.length ? props.autologin : ['ram']));\n\n }\n\n /**\n * В штатном режиме (без суперлогина), серверные базы создаём сразу\n */\n after_init(bases, auth) {\n\n const {props, remote, fetch, $p: {md, wsql}} = this;\n const opts = {skip_setup: true, adapter: 'http', owner: this, fetch};\n\n if(auth) {\n opts.auth = auth;\n }\n else if(props.user_node) {\n opts.auth = props.user_node;\n }\n\n (bases || md.bases()).forEach((name) => {\n if((!auth && remote[name]) ||\n name.match(/(e1cib|github|user)/) ||\n (name === 'ram' && props.use_ram === false) ||\n (name === 'pgsql' && wsql.alasql.utils.isNode)) {\n return;\n }\n remote[name] = new PouchDB(this.dbpath(name), opts);\n });\n }\n\n /**\n * запускает репликацию\n */\n after_log_in() {\n\n const {props, local, remote, $p: {md, wsql}} = this;\n const run_sync = [];\n\n md.bases().forEach((dbid) => {\n if(dbid !== 'meta' &&\n local[dbid] && remote[dbid] && local[dbid] != remote[dbid] &&\n (dbid !== 'doc' || !wsql.get_user_param('dynamic_doc'))\n ) {\n if(props.noreplicate && props.noreplicate.includes(dbid)) {\n return;\n }\n run_sync.push(this.run_sync(dbid));\n }\n });\n\n return Promise.all(run_sync)\n .then(() => {\n // широковещательное оповещение об окончании загрузки локальных данных\n if(props.use_ram === false) {\n ;\n }\n else if(local._loading) {\n return new Promise((resolve) => {\n this.once('pouch_data_loaded', resolve);\n });\n }\n else if(!props.user_node) {\n return this.call_data_loaded();\n }\n });\n }\n\n /**\n * ### Выполняет авторизацию и запускает репликацию\n * @method log_in\n * @param username {String}\n * @param password {String}\n * @return {Promise}\n */\n log_in(username, password) {\n const {props, remote, $p} = this;\n const {job_prm, wsql, aes, md} = $p;\n\n // реквизиты гостевого пользователя для демобаз\n if(username == undefined && password == undefined) {\n if(job_prm.guests && job_prm.guests.length) {\n username = job_prm.guests[0].username;\n password = aes.Ctr.decrypt(job_prm.guests[0].password);\n }\n else {\n const err = new Error('empty login or password');\n this.emit('user_log_fault', err);\n return Promise.reject(err);\n }\n }\n else if(!username || !password){\n const err = new Error('empty login or password');\n this.emit('user_log_fault', err);\n return Promise.reject(err);\n }\n\n // если уже авторизованы под тем же пользователем, выходим с успешным результатом\n if(props._auth) {\n if(props._auth.username == username) {\n return Promise.resolve();\n }\n else {\n const err = new Error('need logout first');\n this.emit('user_log_fault', err);\n return Promise.reject(err);\n }\n }\n\n // в node - мы уже авторизованы\n // браузере - авторизуемся и получаем info() во всех базах\n const bases = md.bases();\n let try_auth = (props.user_node || !remote.ram) ?\n Promise.resolve(true) :\n remote.ram.login(username, password)\n .then((user) => {\n if(user.ref && typeof user.roles === 'string') {\n // уточним зону\n if(user.zones && user.zones.length && !user.zones.includes(props.zone)) {\n props.zone = user.zones[0];\n wsql.set_user_param('zone', props.zone);\n }\n this.emit('authenticated', user);\n props._suffix = user.suffix || '';\n props._user = user.ref;\n props._push_only = Boolean(user.push_only);\n if(user.direct && !props.direct && props.zone != job_prm.zone_demo) {\n props.direct = true;\n wsql.set_user_param('couch_direct', true);\n }\n if(user.su) {\n username = user.su;\n }\n }\n else {\n const {roles} = user;\n // установим суффикс базы отдела абонента\n const suffix = /^suffix:/;\n const ref = /^ref:/;\n\n // уточняем значения констант в соответствии с ролями пользователя\n roles.forEach((role) => {\n if(suffix.test(role)) {\n props._suffix = role.substr(7);\n }\n else if(ref.test(role)) {\n props._user = role.substr(4);\n }\n else if(role === 'direct' && !props.direct && props.zone != job_prm.zone_demo) {\n props.direct = true;\n wsql.set_user_param('couch_direct', true);\n }\n else if(role === 'push_only' && !props._push_only) {\n props._push_only = true;\n }\n });\n }\n\n if(props._push_only && props.direct) {\n props.direct = false;\n wsql.set_user_param('couch_direct', false);\n }\n\n if(props._suffix) {\n while (props._suffix.length < 4) {\n props._suffix = '0' + props._suffix;\n }\n }\n\n return true;\n })\n .catch((err) => {\n // если direct, вываливаемся с ошибкой\n if(props.direct) {\n throw err;\n }\n // ожидаем текущего пользователя из ram\n return new Promise((resolve, reject) => {\n let count = 0;\n function props_by_user() {\n setTimeout(() => {\n const {current_user} = $p;\n if(current_user) {\n if(current_user.push_only) {\n props._push_only = true;\n }\n if(current_user.suffix) {\n props._suffix = current_user.suffix;\n while (props._suffix.length < 4) {\n props._suffix = '0' + props._suffix;\n }\n }\n resolve();\n }\n else {\n if(count > 4) {\n return reject();\n }\n count++;\n props_by_user();\n }\n }, 100 + count * 500);\n }\n props_by_user();\n });\n });\n\n if(!props.user_node) {\n try_auth = try_auth\n .then((ram_logged_in) => {\n ram_logged_in && this.after_init(bases, {username, password});\n return ram_logged_in;\n })\n .then((ram_logged_in) => {\n let postlogin = Promise.resolve(ram_logged_in);\n if(!props.user_node) {\n bases.forEach((dbid) => {\n if(dbid !== 'meta' && dbid !== 'ram' && remote[dbid]) {\n postlogin = postlogin\n .then((ram_logged_in) => ram_logged_in && remote[dbid].info());\n }\n });\n }\n return postlogin;\n });\n }\n\n return try_auth.then((info) => {\n\n props._auth = {username};\n\n // сохраняем имя пользователя в localstorage\n if(wsql.get_user_param('user_name') != username) {\n wsql.set_user_param('user_name', username);\n }\n\n // если настроено сохранение пароля - сохраняем и его\n if(info) {\n if(wsql.get_user_param('enable_save_pwd')) {\n if(aes.Ctr.decrypt(wsql.get_user_param('user_pwd')) != password) {\n wsql.set_user_param('user_pwd', aes.Ctr.encrypt(password)); // сохраняем имя пользователя в базе\n }\n }\n else if(wsql.get_user_param('user_pwd') != '') {\n wsql.set_user_param('user_pwd', '');\n }\n\n // излучаем событие\n this.emit('user_log_in', username);\n }\n else {\n this.emit('user_log_stop', username);\n }\n // врезаем асинхронную подписку на событие\n return this.emit_promise('on_log_in').then(() => info);\n\n })\n .then((info) => {\n if(props._data_loaded && !props._doc_ram_loading) {\n if(props._doc_ram_loaded) {\n this.emit('pouch_doc_ram_loaded');\n }\n else {\n this.load_doc_ram();\n }\n }\n // запускаем синхронизацию для нужных баз\n return info && this.after_log_in();\n })\n .catch(err => {\n // излучаем событие\n this.emit('user_log_fault', err);\n });\n }\n\n /**\n * ### Останавливает синхронизацию и снимает признак авторизованности\n * @method log_out\n */\n log_out() {\n const {props, local, remote, fetch, authorized, $p: {md}} = this;\n\n if(authorized) {\n for (const name in local.sync) {\n if(name != 'meta' && props.autologin.indexOf(name) === -1) {\n try {\n local.sync[name].removeAllListeners();\n local.sync[name].cancel();\n local.sync[name] = null;\n }\n catch (err) {\n }\n }\n }\n props._auth = null;\n }\n\n return Promise.all(md.bases().map((name) => {\n if(name != 'meta' && remote[name]) {\n let res = remote[name].logout && remote[name].logout();\n if(name != 'ram') {\n const dbpath = AdapterPouch.prototype.dbpath.call(this, name);\n if(remote[name].name !== dbpath) {\n const sub = remote[name].close()\n .then(() => {\n remote[name].removeAllListeners();\n if(props.autologin.indexOf(name) === -1) {\n remote[name] = null;\n }\n else {\n remote[name] = new PouchDB(dbpath, {skip_setup: true, adapter: 'http', owner: this, fetch});\n }\n });\n res = res ? res.then(() => sub) : sub;\n }\n }\n return res;\n }\n }))\n .then(() => {\n props._user = '';\n this.emit('user_log_out');\n });\n }\n\n auth_prefix() {\n switch (this.props._auth_provider) {\n case 'google':\n return 'Google ';\n case 'ldap':\n return 'LDAP ';\n case 'github':\n return 'Github ';\n case 'vkontakte':\n return 'Vkontakte ';\n case 'facebook':\n return 'Facebook ';\n default:\n return 'Basic ';\n }\n }\n\n /**\n * ### Загружает условно-постоянные данные в alasql\n * @param db - по умолчанию, грузим из local.ram, но можно переопределить\n * @return {Promise<never>|Promise<any>}\n */\n load_data(db) {\n\n const {local, $p: {job_prm}} = this;\n const options = {\n limit: 700,\n include_docs: true,\n };\n const _page = {\n total_rows: 0,\n limit: options.limit,\n page: 0,\n start: Date.now(),\n };\n\n if(job_prm.second_instance) {\n return Promise.reject(new Error('second_instance'));\n }\n\n if(!db) {\n db = local.ram;\n }\n\n // бежим по всем документам из ram\n return new Promise((resolve, reject) => {\n\n let index;\n\n const processPage = (err, response) => {\n if(response) {\n // широковещательное оповещение о загрузке порции локальных данных\n _page.page++;\n _page.total_rows = response.total_rows;\n\n this.emit('pouch_data_page', Object.assign({}, _page));\n\n if(this.load_changes(response, options)) {\n fetchNextPage();\n }\n // широковещательное оповещение об окончании загрузки локальных данных\n else {\n local._loading = false;\n this.call_data_loaded(_page);\n resolve();\n }\n }\n else if(err) {\n reject(err);\n // широковещательное оповещение об ошибке загрузки\n this.emit('pouch_data_error', 'ram', err);\n }\n }\n\n const fetchNextPage = () => {\n if(index){\n db.query('server/load_order', options, processPage);\n }\n else {\n db.allDocs(options, processPage);\n }\n };\n\n db.get('_design/server')\n .catch((err) => {\n if(err.status === 404) {\n return {views: {}}\n }\n else {\n reject(err);\n }\n })\n .then((design) => {\n if(design) {\n const {views} = design;\n if(views.load_order){\n index = true;\n }\n return (Object.keys(views).length ? this.rebuild_indexes('ram') : Promise.resolve())\n .then(() => db.info());\n }\n })\n .then((info) => {\n if(info) {\n if(info.doc_count >= (job_prm.pouch_ram_doc_count || 10)) {\n // широковещательное оповещение о начале загрузки локальных данных\n this.emit('pouch_load_start', Object.assign(_page, {local_rows: info.doc_count}));\n local._loading = true;\n fetchNextPage();\n }\n else {\n this.emit('pouch_no_data', info);\n resolve();\n }\n }\n });\n });\n\n }\n\n /**\n * ### Путь к базе couchdb\n * внешние плагины, например, superlogin, могут переопределить этот метод\n * @param name\n * @return {*}\n */\n dbpath(name) {\n const {props: {path, zone, _suffix}, $p: {wsql, job_prm}} = this;\n if(name == 'meta') {\n return path + 'meta';\n }\n else if(name == 'ram') {\n return path + zone + '_ram';\n }\n else if(name === 'pgsql') {\n return (job_prm.pg_path.startsWith('/') && !wsql.alasql.utils.isNode ? location.origin + job_prm.pg_path : job_prm.pg_path) + zone;\n }\n else {\n return path + zone + '_' + name + (_suffix ? '_' + _suffix : '');\n }\n }\n\n /**\n * Возвращает базу PouchDB, связанную с объектами данного менеджера\n * @method db\n * @param _mgr {DataManager}\n * @return {PouchDB}\n */\n db(_mgr) {\n const dbid = _mgr.cachable.replace('_remote', '').replace('_ram', '').replace('_doc', '');\n const {props, local, remote} = this;\n if(dbid.indexOf('remote') != -1 || dbid === 'pgsql' || (props.noreplicate && props.noreplicate.includes(dbid))) {\n return remote[dbid.replace('_remote', '')];\n }\n else {\n return local[dbid] || remote[dbid] || local.user;\n }\n }\n\n /**\n * Интервал опроса при live-репликации\n * @param delay\n * @return {number}\n */\n back_off (delay) {\n if (!delay) {\n return 1000 + Math.floor(Math.random() * 2000);\n }\n else if (delay >= 200000) {\n return 200000;\n }\n return delay * 3;\n }\n\n /**\n * Перезапускает репликацию в цикле\n * для режима, когда вместо ilve-репликации используется sync по расписанию\n * @param id\n * @param options\n * @param sync_events\n */\n rerun_sync(id, options, sync_events) {\n const {local, remote} = this;\n const sync = local.sync[id];\n const rerun = () => {\n if(sync) {\n sync.cancel();\n sync.removeAllListeners();\n }\n setTimeout(() => {\n local.sync[id] = sync_events(local[id].replicate.from(remote[id], options));\n this.rerun_sync(id, options, sync_events);\n }, 300000 + Math.floor(Math.random() * 60000));\n }\n\n if(sync) {\n sync.listeners('complete').forEach((fn) => {\n if(fn.toString().includes('(info)')) {\n sync.removeListener('complete', fn);\n }\n });\n sync.on('complete', rerun);\n sync.on('error', rerun);\n }\n else {\n rerun();\n }\n }\n\n /**\n * ### Запускает процесс синхронизвации\n *\n * @method run_sync\n * @param local {PouchDB}\n * @param remote {PouchDB}\n * @param id {String}\n * @return {Promise}\n */\n run_sync(id) {\n\n const {local, remote, $p: {wsql, job_prm, record_log}, props} = this;\n\n // если синхронизация для данной базы уже запущена, выходим\n if(local.sync[id]) {\n return Promise.resolve(id);\n }\n\n const {_push_only, _user} = props;\n const db_local = local[id];\n const db_remote = remote[id];\n let linfo, _page;\n\n return db_local.info()\n .then((info) => {\n linfo = info;\n return db_remote.info();\n })\n .then((rinfo) => {\n\n // для базы \"ram\", сервер мог указать тотальную перезагрузку данных\n // в этом случае - очищаем базы и перезапускаем браузер\n if(id == 'ram') {\n return db_remote.get('data_version')\n .then((v) => {\n if(v.version != wsql.get_user_param('couch_ram_data_version')) {\n // если это не первый запуск - перезагружаем\n if(wsql.get_user_param('couch_ram_data_version')) {\n rinfo = this.reset_local_data();\n }\n // сохраняем версию в localStorage\n wsql.set_user_param('couch_ram_data_version', v.version);\n }\n return rinfo;\n })\n .catch(record_log)\n .then(() => rinfo);\n }\n\n return rinfo;\n })\n .then((rinfo) => {\n\n if(!rinfo) {\n return;\n }\n\n // репликация больших данных\n if(!_push_only && rinfo.data_size > (job_prm.data_size_sync_limit || 2e8)) {\n this.emit('pouch_sync_error', id, {data_size: rinfo.data_size});\n props.direct = true;\n wsql.set_user_param('couch_direct', true);\n return;\n }\n\n if(id == 'ram' && linfo.doc_count < (job_prm.pouch_ram_doc_count || 10)) {\n // широковещательное оповещение о начале загрузки локальных данных\n _page = {\n total_rows: rinfo.doc_count,\n local_rows: linfo.doc_count,\n docs_written: 0,\n limit: 300,\n page: 0,\n start: Date.now(),\n };\n this.emit('pouch_load_start', _page);\n }\n\n return new Promise((resolve) => {\n\n const options = {\n batch_size: 200,\n batches_limit: 3,\n heartbeat: 20000,\n retry: true,\n };\n\n // если указан клиентский или серверный фильтр - подключаем\n if(job_prm.pouch_filter && job_prm.pouch_filter[id]) {\n options.filter = job_prm.pouch_filter[id];\n }\n // если для базы meta фильтр не задан, используем умолчание\n else if(id == 'meta') {\n options.filter = 'auth/meta';\n }\n\n const final_sync = (options) => {\n\n options.back_off_function = this.back_off;\n\n // ram и meta синхронизируем в одну сторону, doc в демо-режиме, так же, в одну сторону\n if(id == 'ram' || id == 'meta' || props.zone == job_prm.zone_demo) {\n options.live = !job_prm.crazy_ram;\n if(options.live) {\n local.sync[id] = sync_events(db_local.replicate.from(db_remote, options));\n }\n else {\n this.rerun_sync(id, options, sync_events);\n }\n }\n else if(_push_only) {\n options.live = true;\n if(options.filter) {\n delete options.filter;\n delete options.query_params;\n }\n local.sync[id] = sync_events(db_local.replicate.to(db_remote, Object.assign({}, options, {batch_size: 50})));\n }\n else {\n options.live = true;\n local.sync[id] = sync_events(db_local.sync(db_remote, options));\n }\n }\n\n const sync_events = (sync, options) => {\n\n sync.on('change', (change) => {\n if(change.pending > 10) {\n change.db = id;\n this.emit_async('repl_state', change);\n }\n\n change.update_only = id !== 'ram';\n this.load_changes(change);\n\n this.emit('pouch_sync_data', id, change);\n })\n .on('denied', (info) => {\n // a document failed to replicate, e.g. due to permissions\n this.emit('pouch_sync_denied', id, info);\n\n })\n .on('error', (err) => {\n this.emit('pouch_sync_error', id, err);\n })\n .on('complete', (info) => {\n\n sync.cancel();\n sync.removeAllListeners();\n\n if(options) {\n\n // handle complete\n info.db = id;\n this.emit_async('repl_state', info);\n\n final_sync(options);\n this.rebuild_indexes(id)\n .then(() => resolve(id));\n }\n });\n\n if(id == 'ram') {\n sync\n // replication was paused, usually because of a lost connection\n .on('paused', (info) => this.emit('pouch_sync_paused', id, info))\n // replication was resumed\n .on('active', (info) => this.emit('pouch_sync_resumed', id, info));\n }\n\n return sync;\n };\n\n if(_push_only && !options.filter && id !== 'ram' && id !== 'meta') {\n options.filter = 'auth/push_only';\n options.query_params = {user: _user};\n }\n\n (job_prm.templates ? this.from_files(db_local, db_remote, options) : this.from_dump(db_local, db_remote, options))\n .then((synced) => {\n if(synced) {\n final_sync(options);\n if(typeof synced === 'number') {\n this.rebuild_indexes(id)\n .then(() => this.load_data());\n }\n }\n else {\n sync_events(db_local.replicate.from(db_remote, options), options);\n }\n });\n\n });\n\n });\n }\n\n /**\n * Предпринимает попытку загрузки начального образа из _local/dump базы remote\n * @param local\n * @param remote\n * @return {Promise<Boolean>}\n */\n from_dump(local, remote, opts = {}) {\n const {utils, job_prm} = this.$p;\n\n // иногда, ram из дампа не нужен\n if(job_prm.crazy_ram && local === this.local.ram) {\n return Promise.resolve(false);\n }\n\n // если уже грузили из дампа, не суетимся\n return local.get('_local/dumped')\n .then(() => true)\n // проверяем наличие дампа в remote\n .catch(() => remote.get('_local/dump'))\n .then(doc => {\n if(doc === true) {\n return doc;\n }\n // извлекаем и разархивируем дамп\n const byteCharacters = atob(doc.dump);\n const byteNumbers = new Array(byteCharacters.length);\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n const blob = new Blob([new Uint8Array(byteNumbers)], {type: 'application/zip'});\n return utils.blob_as_text(blob, 'array');\n })\n .then((uarray) => {\n if(uarray === true) {\n return uarray;\n }\n\n return ('JSZip' in window ? Promise.resolve() : utils.load_script('https://cdn.jsdelivr.net/jszip/2/jszip.min.js', 'script'))\n .then(() => {\n const zip = new JSZip(uarray);\n return zip.files.dump.asText();\n });\n })\n .then((text) => {\n if(text === true) {\n return text;\n }\n\n const opt = {\n proxy: remote.name,\n checkpoints: 'target',\n emit: (docs) => {\n this.emit('pouch_dumped', {db: local, docs});\n if(local.name.indexOf('ram') !== -1) {\n // широковещательное оповещение о начале загрузки локальных данных\n this.emit('pouch_data_page', {\n total_rows: docs.length,\n local_rows: 3,\n docs_written: 3,\n limit: 300,\n page: 0,\n start: Date.now(),\n });\n }\n }\n };\n if(remote.__opts.auth) {\n opt.auth = remote.__opts.auth;\n }\n if(opts.filter) {\n opt.filter = opts.filter;\n }\n if(opts.query_params) {\n opt.query_params = opts.query_params;\n }\n if(opts.selector) {\n opt.selector = opts.selector;\n }\n\n return (local.load ? Promise.resolve() : utils.load_script('/dist/pouchdb.load.js', 'script'))\n .then(() => {\n return local.load(text, opt);\n })\n .then(() => local.put({_id: '_local/dumped'}))\n .then(() => -1);\n })\n .catch((err) => {\n err.status !== 404 && console.log(err);\n return false;\n });\n }\n\n /**\n * Предпринимает попытку загрузки начального образа из файлов\n * @param local\n * @param remote\n * @return {Promise<Boolean>}\n */\n from_files(local, remote, opts = {}) {\n const li = local.name.lastIndexOf('_');\n const id = local.name.substr(li + 1);\n\n // иногда, ram из файлов не нужен\n const {job_prm} = this.$p;\n if(job_prm.crazy_ram && local === this.local.ram) {\n return Promise.resolve(false);\n }\n\n return fetch(`/${id}/00000.json`)\n .then((res) => res.json())\n .then((info) => {\n return local.get('_local/stamp')\n .then((doc) => {\n if(doc.stamp === info.stamp) {\n return true;\n }\n info._rev = doc._rev;\n return info;\n })\n .catch(() => {\n return info;\n });\n })\n .then((info) => {\n if(info === true) {\n return info;\n }\n if(info) {\n return (local.load ? Promise.resolve() : this.$p.utils.load_script('/dist/pouchdb.load.js', 'script'))\n .then(() => info);\n }\n })\n .then((info) => {\n if(info === true) {\n return info;\n }\n if(info) {\n const {origin} = location;\n let series = Promise.resolve();\n\n const msg = {db: id, ok: true, docs_read: 0, pending: info.doc_count, start_time: new Date().toISOString()}\n this.emit_async('repl_state', msg);\n\n const opt = {\n proxy: remote.name,\n checkpoints: 'target',\n emit: (docs) => {\n this.emit('pouch_dumped', {db: local, docs});\n }\n };\n if(remote.__opts.auth) {\n opt.auth = remote.__opts.auth;\n }\n if(opts.filter) {\n opt.filter = opts.filter;\n }\n if(opts.query_params) {\n opt.query_params = opts.query_params;\n }\n if(opts.selector) {\n opt.selector = opts.selector;\n }\n\n for(let i = 1; i <= info.files; i++) {\n series = series.then(() => {\n return local.load(`${origin}/${id}/${i.pad(5)}.json`, opt);\n })\n .then((step) => {\n msg.docs_read = (info.doc_count * i / info.files).round();\n msg.pending = info.doc_count - msg.docs_read;\n this.emit_async('repl_state', msg);\n });\n }\n return series\n .then(() => {\n info._id = '_local/stamp';\n return local.put(info);\n })\n .then(() => -1);\n }\n })\n .catch(() => {\n return false;\n });\n }\n\n /**\n * ### Перестраивает индексы\n * Обычно, вызывается после начальной синхронизации\n * @param id {String}\n * @return {Promise}\n */\n rebuild_indexes(id, silent) {\n const {local, remote} = this;\n const msg = {db: id, ok: true, docs_read: 0, pending: 0, start_time: new Date().toISOString()}\n let promises = Promise.resolve();\n return local[id] === remote[id] ?\n Promise.resolve() :\n local[id].allDocs({\n include_docs: true,\n startkey: '_design/',\n endkey : '_design/\\u0fff',\n limit: 1000,\n })\n .then(({rows}) => {\n for(const {doc} of rows) {\n if(doc._id.indexOf('/server') !== -1 && id !== 'ram') {\n continue;\n }\n if(doc.views) {\n for(const name in doc.views) {\n const view = doc.views[name];\n const index = doc._id.replace('_design/', '') + '/' + name;\n if(doc.language === 'javascript') {\n promises = promises.then(() => {\n if(silent) {\n this.emit('rebuild_indexes', {id, index, start: true});\n }\n else {\n msg.index = index;\n this.emit('repl_state', msg);\n }\n return local[id].query(index, {limit: 1}).catch(() => null);\n });\n }\n else {\n const selector = {\n //use_index: index,\n limit: 1,\n fields: ['_id'],\n selector: {},\n use_index: index.split('/'),\n };\n for(const fld of view.options.def.fields) {\n selector.selector[fld] = '';\n }\n promises = promises.then(() => {\n if(silent) {\n this.emit('rebuild_indexes', {id, index, start: true});\n }\n else {\n msg.index = index;\n this.emit('repl_state', msg);\n }\n return local[id].find(selector).catch(() => null);\n });\n }\n }\n }\n }\n return promises.then(() => {\n msg.index = '';\n msg.end_time = new Date().toISOString();\n this.emit('repl_state', msg);\n this.emit('rebuild_indexes', {id, start: false, finish: true});\n });\n });\n\n }\n\n /**\n * ### Информирует о загруженности данных\n * если к этому моменту мы уже авторизованы, запускает load_doc_ram\n *\n * @method call_data_loaded\n */\n call_data_loaded(page) {\n const {local, props} = this;\n if(!props._data_loaded) {\n props._data_loaded = true;\n if(!page) {\n page = local.sync._page || {};\n }\n if(!local.sync._page) {\n local.sync._page = page;\n }\n // информируем мир о загруженности данных\n Promise.resolve().then(() => {\n this.emit(page.note = 'pouch_data_loaded', page);\n // пытаемся загрузить doc_ram\n this.authorized && this.load_doc_ram();\n });\n }\n else if(!props._doc_ram_loaded && !props._doc_ram_loading && this.authorized) {\n this.load_doc_ram();\n }\n }\n\n /**\n * ### Уничтожает локальные данные\n * Используется при изменении структуры данных на сервере\n *\n * @method reset_local_data\n */\n reset_local_data() {\n const {local, remote} = this;\n const do_reload = () => {\n setTimeout(() => typeof location != 'undefined' && location.reload(true), 1000);\n };\n\n return this.log_out()\n .then(() => {\n return local.templates && local.templates.adapter === 'idb' && local.templates.destroy()\n })\n .then(() => {\n return remote.ram != local.ram && local.ram.destroy()\n })\n .then(() => {\n return remote.doc != local.doc && local.doc.destroy()\n })\n .then(do_reload)\n .catch(do_reload);\n }\n\n /**\n * ### Читает объект из pouchdb\n *\n * @method load_obj\n * @param tObj {DataObj} - объект данных, который необходимо прочитать - дозаполнить\n * @param attr {Object} - ополнительные параметры, например, db - прочитать из другой базы\n * @return {Promise.<DataObj>} - промис с загруженным объектом\n */\n load_obj(tObj, attr) {\n\n // нас могли попросить прочитать объект не из родной базы менеджера, а из любой другой\n const db = (attr && attr.db) || this.db(tObj._manager);\n\n if(!db) {\n return Promise.resolve(tObj);\n }\n\n return db.get(tObj._manager.class_name + '|' + tObj.ref)\n .then((res) => {\n for(const fld of fieldsToDelete) {\n delete res[fld];\n }\n tObj._data._loading = true;\n tObj._mixin(res);\n tObj._obj._rev = res._rev;\n })\n .catch((err) => {\n if(err.status != 404) {\n throw err;\n }\n else {\n //console.log(db.name + '/' + tObj._manager.class_name + '|' + tObj.ref);\n }\n })\n .then(() => {\n return tObj;\n });\n }\n\n /**\n * ### Записывает объект в pouchdb\n *\n * @method save_obj\n * @param tObj {DataObj} - записываемый объект\n * @param attr {Object} - ополнительные параметры записи\n * @return {Promise.<DataObj>} - промис с записанным объектом\n */\n save_obj(tObj, attr) {\n\n const {_manager, _obj, _data, ref, class_name} = tObj;\n\n // нас могли попросить записать объект не в родную базу менеджера, а в любую другую\n const db = attr.db || this.db(_manager);\n\n if(!_data || (_data._saving && !_data._modified) || !db) {\n return Promise.resolve(tObj);\n }\n // TODO: опасное место с гонками при одновременной записи\n if(_data._saving && _data._modified) {\n _data._saving++;\n if(_data._saving > 10) {\n return Promise.reject(new Error(`Циклическая перезапись`));\n }\n return new Promise((resolve) => {\n setTimeout(() => resolve(this.save_obj(tObj, attr)), 200);\n });\n }\n\n _data._saving = 1;\n\n // подмешиваем class_name\n const tmp = Object.assign({_id: `${class_name}|${ref}`, class_name}, _obj);\n\n // формируем строку поиска\n const {utils, wsql} = this.$p;\n if(utils.is_doc_obj(tObj) || _manager.build_search) {\n if(_manager.build_search) {\n _manager.build_search(tmp, tObj);\n }\n else {\n tmp.search = ((_obj.number_doc || '') + (_obj.note ? ' ' + _obj.note : '')).toLowerCase();\n }\n }\n\n // установим timestamp\n tmp.timestamp = {\n user: this.authorized || wsql.get_user_param('user_name'),\n moment: utils.moment().format('YYYY-MM-DDTHH:mm:ss ZZ'),\n };\n\n if(attr.attachments) {\n tmp._attachments = attr.attachments;\n }\n\n // сохраняем с учетом grouping метаданных\n if(_manager.metadata().grouping === 'array') {\n delete tmp._id;\n delete tmp.class_name;\n const index = Math.floor(utils.crc32(tmp.ref) / 268435455);\n const _id = `${class_name}|${index.pad()}`;\n return db.get(_id)\n .catch((err) => {\n if(err.status !== 404) throw err;\n return {_id, class_name, rows: []};\n })\n .then((doc) => {\n let finded;\n for(const row of doc.rows) {\n if(row.ref === tmp.ref) {\n Object.assign(row, tmp);\n finded = true;\n break;\n }\n }\n if(!finded) {\n doc.rows.push(tmp);\n }\n return db.put(doc);\n })\n .then(() => {\n tObj.is_new() && tObj._set_loaded(tObj.ref);\n return tObj;\n });\n }\n else {\n delete tmp.ref;\n return (tObj.is_new() ? Promise.resolve(true) : db.get(tmp._id))\n .then((res) => {\n if(typeof res === 'object') {\n if(tmp._rev !== res._rev && _manager.metadata().check_rev !== false) {\n const {timestamp} = res;\n const err = new Error(`Объект ${timestamp && typeof timestamp.user === 'string' ?\n `изменил ${timestamp.user}<br/>${timestamp.moment}` : 'изменён другим пользователем'}`);\n err._rev = true;\n throw err;\n }\n tmp._rev = res._rev;\n for (let att in res._attachments) {\n if(!tmp._attachments) {\n tmp._attachments = {};\n }\n if(!tmp._attachments[att]) {\n tmp._attachments[att] = res._attachments[att];\n }\n }\n }\n return res;\n })\n .catch((err) => {\n if(err.status !== 404) throw err;\n })\n .then(() => db.put(tmp))\n .then((res) => {\n if(res) {\n tObj.is_new() && tObj._set_loaded(tObj.ref);\n if(tmp._attachments) {\n if(!tObj._attachments) {\n tObj._attachments = {};\n }\n for (let att in tmp._attachments) {\n if(!tObj._attachments[att] || !tmp._attachments[att].stub) {\n tObj._attachments[att] = tmp._attachments[att];\n }\n }\n }\n _obj._rev = res.rev;\n return tObj;\n }\n });\n }\n }\n\n /**\n * ### Возвращает набор данных для дерева динсписка\n *\n * @method get_tree\n * @param _mgr {DataManager}\n * @param attr {Object}\n * @return {Promise.<Array>}\n */\n get_tree(_mgr, attr) {\n return this.find_rows(_mgr, {\n is_folder: true,\n _raw: true,\n _top: attr.count || 300,\n _skip: attr.start || 0\n })\n .then((rows) => {\n rows.sort((a, b) => {\n const {guid} = this.$p.utils.blank\n if(a.parent == guid && b.parent != guid) {\n return -1;\n }\n if(b.parent == guid && a.parent != guid) {\n return 1;\n }\n if(a.name < b.name) {\n return -1;\n }\n if(a.name > b.name) {\n return 1;\n }\n return 0;\n });\n return rows.map((row) => ({\n ref: row.ref,\n parent: row.parent,\n presentation: row.name\n }));\n })\n .then((ares) => this.$p.iface.data_to_tree.call(_mgr, ares, attr));\n }\n\n /**\n * ### Возвращает набор данных для динсписка\n *\n * @method get_selection\n * @param _mgr {DataManager}\n * @param attr\n * @return {Promise.<Array>}\n */\n get_selection(_mgr, attr) {\n const {classes} = this.$p;\n const cmd = attr.metadata || _mgr.metadata();\n const flds = ['ref', '_deleted']; // поля запроса\n const selection = {\n _raw: true,\n _total_count: true,\n _top: attr.count || 30,\n _skip: attr.start || 0,\n }; // условие см. find_rows()\n const ares = [];\n\n // набираем поля\n if(cmd.form && cmd.form.selection) {\n cmd.form.selection.fields.forEach((fld) => flds.push(fld));\n }\n else if(_mgr instanceof classes.DocManager) {\n flds.push('posted');\n flds.push('date');\n flds.push('number_doc');\n }\n else if(_mgr instanceof classes.TaskManager) {\n flds.push('name as presentation');\n flds.push('date');\n flds.push('number_doc');\n flds.push('completed');\n }\n else if(_mgr instanceof classes.BusinessProcessManager) {\n flds.push('date');\n flds.push('number_doc');\n flds.push('started');\n flds.push('finished');\n }\n else {\n if(cmd.hierarchical && cmd.group_hierarchy) {\n flds.push('is_folder');\n }\n else {\n flds.push('0 as is_folder');\n }\n\n if(cmd.main_presentation_name) {\n flds.push('name as presentation');\n }\n else {\n if(cmd.code_length) {\n flds.push('id as presentation');\n }\n else {\n flds.push('... as presentation');\n }\n }\n\n if(cmd.has_owners) {\n flds.push('owner');\n }\n\n if(cmd.code_length) {\n flds.push('id');\n }\n\n }\n\n // набираем условие\n // фильтр по дате\n if(_mgr.metadata('date') && (attr.date_from || attr.date_till)) {\n\n if(!attr.date_from) {\n attr.date_from = new Date('2017-01-01');\n }\n if(!attr.date_till) {\n attr.date_till = $p.utils.date_add_day(new Date(), 1);\n }\n\n selection.date = {between: [attr.date_from, attr.date_till]};\n }\n\n // фильтр по родителю\n if(cmd.hierarchical && attr.parent) {\n selection.parent = attr.parent;\n }\n\n // добавляем условия из attr.selection\n if(attr.selection) {\n if(Array.isArray(attr.selection)) {\n attr.selection.forEach((asel) => {\n for (const fld in asel) {\n if(fld[0] != '_' || fld == '_view' || fld == '_key') {\n selection[fld] = asel[fld];\n }\n }\n });\n }\n else {\n for (const fld in attr.selection) {\n if(fld[0] != '_' || fld == '_view' || fld == '_key') {\n selection[fld] = attr.selection[fld];\n }\n }\n }\n }\n\n // прибиваем фильтр по дате, если он встроен в ключ\n if(selection._key && selection._key._drop_date && selection.date) {\n delete selection.date;\n }\n\n // строковый фильтр по полям поиска, если он не описан в ключе\n if(attr.filter && (!selection._key || !selection._key._search)) {\n if(cmd.input_by_string.length == 1) {\n selection[cmd.input_by_string] = {like: attr.filter};\n }\n else {\n selection.or = [];\n cmd.input_by_string.forEach((ifld) => {\n const flt = {};\n flt[ifld] = {like: attr.filter};\n selection.or.push(flt);\n });\n }\n }\n\n // обратная сортировка по ключу, если есть признак сортировки в ключе и 'des' в атрибутах\n if(selection._key && selection._key._order_by) {\n selection._key._order_by = attr.direction;\n }\n\n // фильтр по владельцу\n //if(cmd[\"has_owners\"] && attr.owner)\n //\tselection.owner = attr.owner;\n\n return this.find_rows(_mgr, selection)\n .then((rows) => {\n\n if(rows.hasOwnProperty('_total_count') && rows.hasOwnProperty('rows')) {\n attr._total_count = rows._total_count;\n rows = rows.rows;\n }\n\n rows.forEach((doc) => {\n\n // наполняем\n const o = {};\n flds.forEach((fld) => {\n\n let fldsyn;\n\n if(fld == 'ref') {\n o[fld] = doc[fld];\n return;\n }\n else if(fld.indexOf(' as ') != -1) {\n fldsyn = fld.split(' as ')[1];\n fld = fld.split(' as ')[0].split('.');\n fld = fld[fld.length - 1];\n }\n else {\n fldsyn = fld;\n }\n\n const mf = _mgr.metadata(fld);\n if(mf) {\n if(mf.type.date_part) {\n o[fldsyn] = $p.moment(doc[fld]).format($p.moment._masks[mf.type.date_part]);\n }\n else if(mf.type.is_ref) {\n if(!doc[fld] || doc[fld] == $p.utils.blank.guid) {\n o[fldsyn] = '';\n }\n else {\n const mgr = _mgr.value_mgr(o, fld, mf.type, false, doc[fld]);\n if(mgr) {\n o[fldsyn] = mgr.get(doc[fld]).presentation;\n }\n else {\n o[fldsyn] = '';\n }\n }\n }\n else if(typeof doc[fld] === 'number' && mf.type.fraction) {\n o[fldsyn] = doc[fld].toFixed(mf.type.fraction);\n }\n else {\n o[fldsyn] = doc[fld];\n }\n }\n });\n ares.push(o);\n });\n\n return $p.iface.data_to_grid.call(_mgr, ares, attr);\n })\n .catch($p.record_log);\n\n }\n\n /**\n * Загружает объекты из PouchDB по массиву ссылок\n *\n * @param _mgr {DataManager}\n * @param refs {Array}\n * @param with_attachments {Boolean}\n * @return {*}\n */\n load_array(_mgr, refs, with_attachments, db) {\n if(!refs || !refs.length) {\n return Promise.resolve(false);\n }\n if(!db && _mgr) {\n db = this.db(_mgr);\n }\n const options = {\n limit: refs.length + 1,\n include_docs: true,\n keys: _mgr ? refs.map((v) => _mgr.class_name + '|' + v) : refs,\n };\n if(with_attachments) {\n options.attachments = true;\n options.binary = true;\n }\n return db.allDocs(options).then((result) => this.load_changes(result, {}));\n }\n\n /**\n * Загружает объекты из PouchDB, обрезанные по view\n */\n load_view(_mgr, _view, options) {\n return new Promise((resolve, reject) => {\n\n const db = this.db(_mgr);\n if(!options) {\n options = {\n limit: 1000,\n include_docs: true,\n startkey: _mgr.class_name + '|',\n endkey: _mgr.class_name + '|\\ufff0',\n };\n }\n\n function process_docs(err, result) {\n\n if(result) {\n\n if(result.rows.length) {\n\n options.startkey = result.rows[result.rows.length - 1].key;\n options.skip = 1;\n\n // наполняем\n _mgr.load_array(result.rows.map(({doc}) => {\n doc.ref = doc._id.split('|')[1];\n delete doc._id;\n return doc;\n }), true);\n\n if(result.rows.length < options.limit) {\n resolve();\n }\n else {\n db.query(_view, options, process_docs);\n }\n }\n else {\n resolve();\n }\n }\n else if(err && err.status !== 404) {\n reject(err);\n }\n }\n\n db.query(_view, options, process_docs);\n\n });\n }\n\n /**\n * ### Загружает объекты с типом кеширования doc_ram в ОЗУ\n * @method load_doc_ram\n */\n load_doc_ram() {\n const {local, props, $p: {md}} = this;\n if(!local.doc){\n return;\n }\n const res = [];\n const {_m} = md;\n\n // информируем мир о начале загрузки doc_ram\n this.emit('pouch_doc_ram_start');\n\n // ищем элементы с подходящим типом кеширования\n props._doc_ram_loading = true;\n ['cat', 'cch', 'ireg'].forEach((kind) => {\n for (const name in _m[kind]) {\n (_m[kind][name].cachable === 'doc_ram' || _m[kind][name].cachable === 'templates_ram') && res.push(kind + '.' + name);\n }\n });\n\n return res.reduce((acc, name) => {\n return acc.then(() => {\n const opt = {\n include_docs: true,\n startkey: name + '|',\n endkey: name + '|\\ufff0',\n limit: 10000,\n };\n const page = local.sync._page || {};\n const meta = md.get(name);\n this.emit('pouch_data_page', Object.assign(page, {synonym: meta.synonym}));\n return local[meta.cachable.replace(/_ram$/, '')].allDocs(opt).then((res) => {\n this.load_changes(res, opt);\n });\n });\n }, Promise.resolve())\n .catch((err) => {\n props._doc_ram_loading = false;\n this.emit('pouch_sync_error', 'doc', err);\n return {docs: []};\n })\n .then(() => {\n props._doc_ram_loading = false;\n props._doc_ram_loaded = true;\n this.emit('pouch_doc_ram_loaded');\n });\n }\n\n /**\n * ### Найти строки\n * Возвращает массив дата-объектов, обрезанный отбором _selection_<br />\n * Eсли отбор пустой, возвращаются все строки из PouchDB.\n *\n * @method find_rows\n * @param _mgr {DataManager}\n * @param selection {Object|function} - в ключах имена полей, в значениях значения фильтра или объект {like: \"значение\"} или {not: значение}\n * @param [selection._top] {Number}\n * @param [selection._skip] {Number}\n * @param [selection._raw] {Boolean} - если _истина_, возвращаются сырые данные, а не дата-объекты\n * @param [selection._total_count] {Boolean} - если _истина_, вычисляет общее число записей под фильтром, без учета _skip и _top\n * @return {Promise.<Array>}\n */\n find_rows(_mgr, selection, db) {\n\n if(!db) {\n db = this.db(_mgr);\n }\n\n // если базы не инициализированы, возвращаем пустой массив\n if(!db) {\n return Promise.resolve([]);\n }\n\n const err_handler = this.emit.bind(this, 'pouch_sync_error', _mgr.cachable);\n\n // если указан MangoQuery, выполняем его без лишних церемоний\n if(selection && selection._mango) {\n const sel = {};\n for(const fld in selection) {\n if(fld[0] !== '_') {\n sel[fld] = selection[fld];\n }\n }\n return db.find(sel)\n .then(({docs}) => {\n if(!docs) {\n docs = [];\n }\n for (const doc of docs) {\n doc.ref = doc._id.split('|')[1];\n if(!selection._raw){\n delete doc._id;\n delete doc.class_name;\n }\n }\n return selection._raw ? docs : _mgr.load_array(docs);\n })\n .catch((err) => {\n err_handler(err);\n return [];\n });\n }\n\n const {utils} = this.$p;\n const res = [];\n const options = {\n limit: 100,\n include_docs: true,\n startkey: _mgr.class_name + '|',\n endkey: _mgr.class_name + '|\\ufff0',\n };\n let doc, _raw, _view, _total_count, top, calc_count, top_count = 0, skip = 0, skip_count = 0;\n\n if(selection) {\n\n if(selection._top) {\n top = selection._top;\n delete selection._top;\n }\n else {\n top = 300;\n }\n\n if(selection._raw) {\n _raw = selection._raw;\n delete selection._raw;\n }\n\n if(selection._total_count) {\n _total_count = selection._total_count;\n delete selection._total_count;\n }\n\n if(selection._view) {\n _view = selection._view;\n delete selection._view;\n }\n\n if(selection._key) {\n\n if(selection._key._order_by == 'des') {\n options.startkey = selection._key.endkey || selection._key + '\\ufff0';\n options.endkey = selection._key.startkey || selection._key;\n options.descending = true;\n }\n else {\n options.startkey = selection._key.startkey || selection._key;\n options.endkey = selection._key.endkey || selection._key + '\\ufff0';\n }\n }\n\n if(typeof selection._skip == 'number') {\n skip = selection._skip;\n delete selection._skip;\n }\n\n if(selection._attachments) {\n options.attachments = true;\n options.binary = true;\n delete selection._attachments;\n }\n }\n\n // если сказано посчитать все строки...\n if(_total_count) {\n\n calc_count = true;\n _total_count = 0;\n\n // если нет фильтра по строке или фильтр растворён в ключе\n if(Object.keys(selection).length <= 1) {\n\n // если фильтр в ключе, получаем все строки без документов\n if(selection._key && selection._key.hasOwnProperty('_search')) {\n options.include_docs = false;\n options.limit = 100000;\n\n return db.query(_view, options)\n .then((result) => {\n\n result.rows.forEach((row) => {\n\n // фильтруем\n if(!selection._key._search || row.key[row.key.length - 1].toLowerCase().indexOf(selection._key._search) != -1) {\n\n _total_count++;\n\n // пропукскаем лишние (skip) элементы\n if(skip) {\n skip_count++;\n if(skip_count < skip) {\n return;\n }\n }\n\n // ограничиваем кол-во возвращаемых элементов\n if(top) {\n top_count++;\n if(top_count > top) {\n return;\n }\n }\n res.push(row.id);\n }\n });\n\n delete options.startkey;\n delete options.endkey;\n if(options.descending) {\n delete options.descending;\n }\n options.keys = res;\n options.include_docs = true;\n\n return db.allDocs(options);\n\n })\n .catch((err) => {\n err_handler(err);\n return {rows: []};\n })\n .then((result) => {\n return {\n rows: result.rows.map(({doc}) => {\n doc.ref = doc._id.split('|')[1];\n if(!_raw) {\n delete doc._id;\n }\n return doc;\n }),\n _total_count: _total_count,\n };\n });\n }\n\n }\n\n }\n\n // бежим по всем документам из ram\n return new Promise((resolve, reject) => {\n\n function process_docs(result) {\n if(result && result.rows.length) {\n\n options.startkey = result.rows[result.rows.length - 1].key;\n options.skip = 1;\n\n result.rows.forEach((rev) => {\n doc = rev.doc;\n\n let key = doc._id.split('|');\n doc.ref = key[1];\n\n if(!_raw) {\n delete doc._id;\n }\n\n // фильтруем\n if(!utils._selection.call(_mgr, doc, selection)) {\n return;\n }\n\n if(calc_count) {\n _total_count++;\n }\n\n // пропукскаем лишние (skip) элементы\n if(skip) {\n skip_count++;\n if(skip_count < skip) {\n return;\n }\n }\n\n // ограничиваем кол-во возвращаемых элементов\n if(top) {\n top_count++;\n if(top_count > top) {\n return;\n }\n }\n\n // наполняем\n res.push(doc);\n });\n\n if((result.rows.length < options.limit) || top && top_count > top && !calc_count) {\n resolve(_raw ? res : _mgr.load_array(res));\n }\n else {\n fetch_next_page();\n }\n }\n else {\n if(calc_count) {\n resolve({\n rows: _raw ? res : _mgr.load_array(res),\n _total_count: _total_count,\n });\n }\n else {\n resolve(_raw ? res : _mgr.load_array(res));\n }\n }\n }\n\n function fetch_next_page() {\n (_view ? db.query(_view, options) : db.allDocs(options))\n .catch((err) => {\n err_handler(err);\n reject(err);\n })\n .then(process_docs);\n }\n\n fetch_next_page();\n });\n }\n\n /**\n * ### Сохраняет присоединенный файл\n *\n * @method save_attachment\n * @param _mgr {DataManager}\n * @param ref\n * @param att_id\n * @param attachment\n * @param type\n * @return {Promise}\n * @async\n */\n save_attachment(_mgr, ref, att_id, attachment, type) {\n\n if(!type) {\n type = {type: 'text/plain'};\n }\n\n if(!(attachment instanceof Blob) && type.indexOf('text') == -1) {\n attachment = new Blob([attachment], {type: type});\n }\n\n // получаем ревизию документа\n let _rev,\n db = this.db(_mgr);\n\n ref = _mgr.class_name + '|' + this.$p.utils.fix_guid(ref);\n\n return db.get(ref)\n .then((res) => {\n if(res) {\n _rev = res._rev;\n }\n })\n .catch((err) => {\n if(err.status != 404) {\n throw err;\n }\n })\n .then(() => {\n return db.putAttachment(ref, att_id, _rev, attachment, type);\n });\n\n }\n\n /**\n * Получает присоединенный к объекту файл\n * @param _mgr {DataManager}\n * @param ref\n * @param att_id\n * @return {Promise}\n */\n get_attachment(_mgr, ref, att_id) {\n\n return this.db(_mgr).getAttachment(_mgr.class_name + '|' + this.$p.utils.fix_guid(ref), att_id);\n\n }\n\n /**\n * Удаляет присоединенный к объекту файл\n * @param _mgr {DataManager}\n * @param ref\n * @param att_id\n * @return {Promise}\n */\n delete_attachment(_mgr, ref, att_id) {\n\n // получаем ревизию документа\n let _rev,\n db = this.db(_mgr);\n\n ref = _mgr.class_name + '|' + this.$p.utils.fix_guid(ref);\n\n return db.get(ref)\n .then((res) => {\n if(res) {\n _rev = res._rev;\n }\n })\n .catch((err) => {\n if(err.status != 404) {\n throw err;\n }\n })\n .then(() => {\n return db.removeAttachment(ref, att_id, _rev);\n });\n }\n\n /**\n * ### Загружает в менеджер изменения или полученные через allDocs данные\n *\n * @method load_changes\n * @param changes\n * @param options\n * @return {boolean}\n */\n load_changes(changes, options) {\n\n let docs, doc, res = {}, cn, key, {$p} = this;\n\n if(!options) {\n if(changes.direction) {\n if(changes.direction != 'pull') {\n return;\n }\n docs = changes.change.docs;\n }\n else {\n docs = changes.docs;\n }\n }\n else {\n docs = changes.rows;\n }\n\n if(docs.length > 0) {\n if(options) {\n options.startkey = docs[docs.length - 1].key;\n options.skip = 1;\n }\n\n docs.forEach((rev) => {\n doc = options ? rev.doc : rev;\n if(!doc) {\n if((rev.value && rev.value.deleted)) {\n doc = {\n _id: rev.id,\n _deleted: true,\n };\n }\n else if(rev.error) {\n return;\n }\n }\n key = doc._id.split('|');\n if(key[0] === 'system') {\n return !options && this.emit('system', key[1], doc);\n }\n cn = key[0].split('.');\n doc.ref = key[1];\n delete doc._id;\n if(!res[cn[0]]) {\n res[cn[0]] = {};\n }\n if(!res[cn[0]][cn[1]]) {\n res[cn[0]][cn[1]] = [];\n }\n res[cn[0]][cn[1]].push(doc);\n });\n\n for (let mgr in res) {\n for (cn in res[mgr]) {\n if($p[mgr] && $p[mgr][cn]) {\n $p[mgr][cn].load_array(res[mgr][cn], changes.update_only ? 'update_only' : true);\n }\n }\n }\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Дёргает сервер для освежения авторизации\n * @param regex {RegExp}\n * @param timout {Number}\n */\n attach_refresher(regex, timout = 500000) {\n if(this.props._refresher) {\n clearInterval(this.props._refresher);\n }\n setInterval(() => {\n if(this.authorized && this.remote.ram && this.remote.ram.adapter == 'http') {\n this.remote.ram.info()\n .then(response => {\n response = null;\n })\n .catch(err => {\n err = null;\n });\n }\n }, timout);\n }\n\n /**\n * Формирует архив полной выгрузки базы для сохранения в файловой системе клиента\n * @method backup_database\n * @param [do_zip] {Boolean} - указывает на необходимость архивировать стоки таблиц в озу перед записью файла\n * @async\n */\n backup_database(do_zip) {\n\n // получаем строку create_tables\n\n // получаем строки для каждой таблицы\n\n // складываем все части в файл\n }\n\n /**\n * Восстанавливает базу из архивной копии\n * @method restore_database\n * @async\n */\n restore_database(do_zip) {\n\n // получаем строку create_tables\n\n // получаем строки для каждой таблицы\n\n // складываем все части в файл\n }\n\n /**\n * ### Информирует об авторизованности на сервере CouchDB\n *\n * @property authorized\n */\n get authorized() {\n const {_auth} = this.props;\n return _auth && _auth.username;\n }\n\n fetch(url, opts) {\n const {authorized, remote, props} = this;\n if(!opts.headers.get('Authorization')) {\n if(authorized) {\n for(const name in remote) {\n const db = remote[name];\n const {auth} = db.__opts;\n if(auth) {\n const {Authorization} = db.getBasicAuthHeaders({prefix: this.auth_prefix(), ...auth});\n opts.headers.set('Authorization', Authorization);\n break;\n }\n }\n }\n }\n if(props.branch) {\n opts.headers.set('branch', props.branch.valueOf());\n }\n return PouchDB.fetch(url, opts);\n }\n\n };\n}\n\nexport default (constructor) => {\n\n const {classes} = constructor;\n classes.PouchDB = PouchDB;\n classes.AdapterPouch = adapter(classes);\n\n}\n\n","\nimport proto from './proto';\nimport adapter from './adapter';\n\nconst plugin = {\n\n\tproto(constructor) {\n\t\t// дополняем и модифицируем конструкторы\n\t\tproto(constructor);\n\t\tadapter(constructor);\n\t},\n\n\tconstructor(){\n\t\t// создаём экземпляр адаптера нашего типа\n\t\tconst {AdapterPouch} = this.classes;\n\t\tthis.adapters.pouch = new AdapterPouch(this);\n\t}\n}\nexport default plugin;"],"names":["PouchDB","adapter"],"mappings":"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"}
\No newline at end of file