UNPKG

c8osdkjscore

Version:
440 lines 21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var c8oCore_1 = require("./c8oCore"); var c8oProgress_1 = require("./c8oProgress"); var c8oResponse_1 = require("./c8oResponse"); var fullSyncReplication_1 = require("./fullSyncReplication"); var pouchdb_browser_1 = require("pouchdb-browser"); var PouchDBLoad = require("pouchdb-load"); var C8oFullSyncDatabase = (function () { function C8oFullSyncDatabase(c8o, databaseName, fullSyncDatabases, localSuffix) { this.database = null; this.pullFullSyncReplication = new fullSyncReplication_1.FullSyncReplication(true); this.pushFullSyncReplication = new fullSyncReplication_1.FullSyncReplication(false); this.syncFullSyncReplication = new fullSyncReplication_1.FullSyncReplication(); this.c8o = c8o; var header = { "x-convertigo-sdk": this.c8o.sdkVersion, }; Object.assign(header, this.c8o.headers); this.remotePouchHeader = { ajax: { headers: header, }, }; this.c8oFullSyncDatabaseUrl = fullSyncDatabases + databaseName; this.databaseName = databaseName + localSuffix; try { if (c8o.couchUrl != null) { this.database = new pouchdb_browser_1.default(c8o.couchUrl + "/" + databaseName); this.c8o.log.debug("PouchDb launched on couchbaselite"); } else { pouchdb_browser_1.default.plugin(PouchDBLoad); this.database = new pouchdb_browser_1.default(databaseName); this.c8o.log.debug("PouchDb launched normally"); } } catch (error) { throw error; } } C8oFullSyncDatabase.prototype.startAllReplications = function (parameters, c8oResponseListener) { return this.startSync(this.syncFullSyncReplication, parameters, c8oResponseListener); }; C8oFullSyncDatabase.prototype.startPullReplication = function (parameters, c8oResponseListener) { return this.startReplication(this.pullFullSyncReplication, parameters, c8oResponseListener); }; C8oFullSyncDatabase.prototype.startPushReplication = function (parameters, c8oResponseListener) { return this.startReplication(this.pushFullSyncReplication, parameters, c8oResponseListener); }; C8oFullSyncDatabase.prototype.startSync = function (fullSyncReplication, parameters, c8oResponseListener) { var _this = this; var continuous = false; var cancel = false; var parametersObj = {}; if (fullSyncReplication.replication != null) { fullSyncReplication.replication.cancel(); } if (parameters["continuous"] != null) { if (parameters["continuous"] === true) { continuous = true; } else { continuous = false; } } if (parameters["cancel"] != null) { if (parameters["cancel"] === true) { cancel = true; } else { cancel = false; } } parametersObj["retry"] = true; if (parameters["retry"] != null) { parametersObj["retry"] = parameters["retry"]; } if (parameters["filter"] != null) { parametersObj["filter"] = parameters["filter"]; } if (parameters["doc_ids"] != null) { parametersObj["doc_ids"] = parameters["doc_ids"]; } if (parameters["query_params"] != null) { parametersObj["query_params"] = parameters["query_params"]; } if (parameters["view"] != null) { parametersObj["view"] = parameters["view"]; } if (parameters["since"] != null) { parametersObj["since"] = parameters["since"]; } if (parameters["heartbeat"] != null) { parametersObj["heartbeat"] = parameters["heartbeat"]; } if (parameters["timeout"] != null) { parametersObj["timeout"] = parameters["timeout"]; } if (parameters["batch_size"] != null) { parametersObj["batch_size"] = parameters["batch_size"]; } if (parameters["batches_limit"] != null) { parametersObj["batches_limit"] = parameters["batches_limit"]; } if (parameters["back_off_function"] != null) { parametersObj["back_off_function"] = parameters["back_off_function"]; } if (parameters["checkpoint"] != null) { parametersObj["checkpoint"] = parameters["checkpoint"]; } if (parameters["seq_interval"] != null) { parametersObj["seq_interval"] = parameters["seq_interval"]; } var remoteDB = new pouchdb_browser_1.default(this.c8oFullSyncDatabaseUrl, this.remotePouchHeader); var rep = fullSyncReplication.replication = this.database.sync(remoteDB, parametersObj); var param = parameters; var progress = new c8oProgress_1.C8oProgress(); progress.raw = rep; progress.continuous = false; return new Promise(function (resolve, reject) { rep.on("change", function (info) { progress.finished = false; if (info.direction === "pull") { progress.pull = true; progress.status = rep.pull.state; progress.finished = rep.pull.state !== "active"; } else if (info.direction === "push") { progress.pull = false; progress.status = rep.push.state; progress.finished = rep.push.state !== "active"; } progress.total = info.change.docs_read; progress.current = info.change.docs_written; param[c8oCore_1.C8oCore.ENGINE_PARAMETER_PROGRESS] = progress; c8oResponseListener.onProgressResponse(progress, param); }).on("complete", function (info) { progress.finished = true; progress.pull = false; progress.total = info.push.docs_read; progress.current = info.push.docs_written; progress.status = info.status; progress.finished = true; param[c8oCore_1.C8oCore.ENGINE_PARAMETER_PROGRESS] = progress; c8oResponseListener.onProgressResponse(progress, param); progress.pull = true; progress.total = info.pull.docs_read; progress.current = info.pull.docs_written; c8oResponseListener.onProgressResponse(progress, param); rep.cancel(); if (continuous) { parametersObj["live"] = true; rep = fullSyncReplication.replication = _this.database.sync(remoteDB, parametersObj); progress.continuous = true; progress.raw = rep; progress.taskInfo = "n/a"; progress.pull = true; progress.status = "live"; progress.finished = false; progress.pull = true; progress.total = 0; progress.current = 0; c8oResponseListener.onProgressResponse(progress, param); progress.pull = false; c8oResponseListener.onProgressResponse(progress, param); rep.on("change", function (info) { progress.finished = false; if (info.direction === "pull") { progress.pull = true; progress.status = rep.pull.state; } else if (info.direction === "push") { progress.pull = false; progress.status = rep.push.state; } progress.total = info.change.docs_read; progress.current = info.change.docs_written; param[c8oCore_1.C8oCore.ENGINE_PARAMETER_PROGRESS] = progress; c8oResponseListener.onProgressResponse(progress, param); }) .on("paused", function () { progress.finished = true; c8oResponseListener.onProgressResponse(progress, param); if (progress.total === 0 && progress.current === 0) { progress.pull = !progress.pull; c8oResponseListener.onProgressResponse(progress, param); } }) .on("error", function (err) { if (err.message === "Unexpected end of JSON input") { progress.finished = true; progress.status = "live"; c8oResponseListener.onProgressResponse(progress, parameters); } else { rep.cancel(); if (err.code === "ETIMEDOUT" && err.status === 0) { if (parameters["force_retry"] == true) { _this.c8o.log.warn("C80=>FullSyncDatabase: Timeout handle during fullsync replication (fs://.sync) \n Forcing Restarting replication"); _this.database.sync(remoteDB, { timeout: 600000, retry: true }); } else { _this.c8o.log.warn("C80=>FullSyncDatabase: Timeout handle during fullsync replication (fs://.sync) \n Restarting automatically replication"); } } else if (err.name === "unknown" && err.status === 0 && err.message === "getCheckpoint rejected with ") { reject("NO_NETWORK"); } else { reject(err); } } }); } }).on("error", function (err) { rep.cancel(); if (err.message === "Unexpected end of JSON input") { progress.finished = true; progress.status = "Complete"; c8oResponseListener.onProgressResponse(progress, parameters); rep.cancel(); } else if (err.code === "ETIMEDOUT" && err.status === 0) { if (parameters["force_retry"] == true) { _this.c8o.log.warn("C80=>FullSyncDatabase: Timeout handle during fullsync replication (fs://.sync) \n Forcing Restarting replication"); _this.database.sync(remoteDB, { timeout: 600000, retry: true }); } else { _this.c8o.log.warn("C80=>FullSyncDatabase: Timeout handle during fullsync replication (fs://.sync) \n Restarting automatically replication"); } } else if (err.name === "unknown" && err.status === 0 && err.message === "getCheckpoint rejected with ") { reject("NO_NETWORK"); } else { reject(err); } }); if (cancel) { if (rep != null) { rep.cancel(); progress.finished = true; if (c8oResponseListener != null && c8oResponseListener instanceof c8oResponse_1.C8oResponseProgressListener) { c8oResponseListener.onProgressResponse(progress, parameters); } } } }).catch(function (error) { throw error.toString(); }); }; C8oFullSyncDatabase.prototype.startReplication = function (fullSyncReplication, parameters, c8oResponseListener) { var _this = this; var continuous = false; var cancel = false; var parametersObj = {}; if (fullSyncReplication.replication != null) { fullSyncReplication.replication.cancel(); } if (parameters["continuous"] != null) { if (parameters["continuous"] == true) { continuous = true; } else { continuous = false; } } if (parameters["cancel"] != null) { if (parameters["cancel"] == true) { cancel = true; } else { cancel = false; } } parametersObj["retry"] = true; if (parameters["retry"] != null) { parametersObj["retry"] = parameters["retry"]; } if (parameters["filter"] != null) { parametersObj["filter"] = parameters["filter"]; } if (parameters["doc_ids"] != null) { parametersObj["doc_ids"] = parameters["doc_ids"]; } if (parameters["query_params"] != null) { parametersObj["query_params"] = parameters["query_params"]; } if (parameters["view"] != null) { parametersObj["view"] = parameters["view"]; } if (parameters["since"] != null) { parametersObj["since"] = parameters["since"]; } if (parameters["heartbeat"] != null) { parametersObj["heartbeat"] = parameters["heartbeat"]; } if (parameters["timeout"] != null) { parametersObj["timeout"] = parameters["timeout"]; } if (parameters["batch_size"] != null) { parametersObj["batch_size"] = parameters["batch_size"]; } if (parameters["batches_limit"] != null) { parametersObj["batches_limit"] = parameters["batches_limit"]; } if (parameters["back_off_function"] != null) { parametersObj["back_off_function"] = parameters["back_off_function"]; } if (parameters["checkpoint"] != null) { parametersObj["checkpoint"] = parameters["checkpoint"]; } if (parameters["seq_interval"] != null) { parametersObj["seq_interval"] = parameters["seq_interval"]; } var remoteDB = new pouchdb_browser_1.default(this.c8oFullSyncDatabaseUrl, this.remotePouchHeader); var rep = fullSyncReplication.replication = fullSyncReplication.pull ? this.database.replicate.from(remoteDB, parametersObj) : this.database.replicate.to(remoteDB, parametersObj); var progress = new c8oProgress_1.C8oProgress(); progress.raw = rep; progress.pull = fullSyncReplication.pull; progress.continuous = false; return new Promise(function (resolve, reject) { rep.on("change", function (info) { progress.total = info.docs_read; progress.current = info.docs_written; progress.status = "change"; parameters[c8oCore_1.C8oCore.ENGINE_PARAMETER_PROGRESS] = progress; c8oResponseListener.onProgressResponse(progress, parameters); }).on("complete", function (info) { progress.finished = true; progress.total = info.docs_read; progress.current = info.docs_written; progress.status = "complete"; parameters[c8oCore_1.C8oCore.ENGINE_PARAMETER_PROGRESS] = progress; c8oResponseListener.onProgressResponse(progress, parameters); rep.cancel(); if (continuous) { parametersObj["live"] = true; rep = fullSyncReplication.replication = fullSyncReplication.pull ? _this.database.replicate.from(remoteDB, parametersObj) : _this.database.replicate.to(remoteDB, parametersObj); progress.continuous = true; progress.raw = rep; progress.taskInfo = "n/a"; rep.on("change", function (info) { progress.finished = false; progress.total = info.docs_read; progress.current = info.docs_written; progress.status = "change"; parameters[c8oCore_1.C8oCore.ENGINE_PARAMETER_PROGRESS] = progress; c8oResponseListener.onProgressResponse(progress, parameters); }) .on("error", function (err) { if (err.message === "Unexpected end of JSON input") { progress.finished = true; progress.status = "live"; c8oResponseListener.onProgressResponse(progress, parameters); } else { rep.cancel(); if (err.code === "ETIMEDOUT" && err.status === 0) { reject("TIMEOUT"); } else if (err.name === "unknown" && err.status === 0 && err.message === "getCheckpoint rejected with ") { reject("NO_NETWORK"); } else { reject(err); } } }); } }).on("error", function (err) { if (err.message === "Unexpected end of JSON input") { progress.finished = true; progress.status = "complete"; parameters[c8oCore_1.C8oCore.ENGINE_PARAMETER_PROGRESS] = progress; c8oResponseListener.onProgressResponse(progress, parameters); rep.cancel(); } else if (err.code === "ETIMEDOUT" && err.status === 0) { reject("TIMEOUT"); } else if (err.name === "unknown" && err.status === 0 && err.message === "getCheckpoint rejected with ") { reject("NO_NETWORK"); } else { reject(err); } }); if (cancel) { if (rep != null) { rep.cancel(); progress.finished = true; if (c8oResponseListener != null && c8oResponseListener instanceof c8oResponse_1.C8oResponseProgressListener) { c8oResponseListener.onProgressResponse(progress, parameters); } } } }).catch(function (error) { throw error.toString(); }); }; Object.defineProperty(C8oFullSyncDatabase.prototype, "getdatabseName", { get: function () { return this.databaseName; }, enumerable: true, configurable: true }); Object.defineProperty(C8oFullSyncDatabase.prototype, "getdatabase", { get: function () { return this.database; }, enumerable: true, configurable: true }); C8oFullSyncDatabase.prototype.deleteDB = function () { var _this = this; return new Promise(function (resolve, reject) { if (_this.database != null) { _this.database.destroy().then(function (response) { _this.database = null; resolve(response); }).catch(function (error) { _this.c8o.log.debug("Failed to close DB, will retry: ", error.message); _this.database.destroy().then(function (response) { _this.database = null; resolve(response); }).catch(function (error) { _this.c8o.log.debug("Failed to close DB, second attempt has failed ", error.message); reject(error); }); }); } }); }; return C8oFullSyncDatabase; }()); exports.C8oFullSyncDatabase = C8oFullSyncDatabase; //# sourceMappingURL=fullSyncDatabase.js.map