mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-10-24 10:03:20 +00:00
Refactored:
- PouchDB handling moved into Common lib.
This commit is contained in:
1 parent
b14ecdb205
commit
83209f3923
11 files changed
+154
-1727
No files matched your search
@@ -1 +0,0 @@
|
|||||||
node_modules
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
# PouchDB-browser
|
|
||||||
|
|
||||||
Just webpacked.
|
|
||||||
(Rollup couldn't pack pouchdb-browser into browser bundle)
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
var e={105:e=>{e.exports=function(e){return function(){var t=arguments.length;if(t){for(var n=[],r=-1;++r<t;)n[r]=arguments[r];return e.call(this,n)}return e.call(this,[])}}},187:e=>{var t,n="object"==typeof Reflect?Reflect:null,r=n&&"function"==typeof n.apply?n.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};t=n&&"function"==typeof n.ownKeys?n.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var i=Number.isNaN||function(e){return e!=e};function o(){o.init.call(this)}e.exports=o,e.exports.once=function(e,t){return new Promise((function(n,r){function i(n){e.removeListener(t,o),r(n)}function o(){"function"==typeof e.removeListener&&e.removeListener("error",i),n([].slice.call(arguments))}v(e,t,o,{once:!0}),"error"!==t&&function(e,t,n){"function"==typeof e.on&&v(e,"error",t,{once:!0})}(e,i)}))},o.EventEmitter=o,o.prototype._events=void 0,o.prototype._eventsCount=0,o.prototype._maxListeners=void 0;var s=10;function a(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function u(e){return void 0===e._maxListeners?o.defaultMaxListeners:e._maxListeners}function c(e,t,n,r){var i,o,s,c;if(a(n),void 0===(o=e._events)?(o=e._events=Object.create(null),e._eventsCount=0):(void 0!==o.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),o=e._events),s=o[t]),void 0===s)s=o[t]=n,++e._eventsCount;else if("function"==typeof s?s=o[t]=r?[n,s]:[s,n]:r?s.unshift(n):s.push(n),(i=u(e))>0&&s.length>i&&!s.warned){s.warned=!0;var f=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");f.name="MaxListenersExceededWarning",f.emitter=e,f.type=t,f.count=s.length,c=f,console&&console.warn&&console.warn(c)}return e}function f(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(e,t,n){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},i=f.bind(r);return i.listener=n,r.wrapFn=i,i}function d(e,t,n){var r=e._events;if(void 0===r)return[];var i=r[t];return void 0===i?[]:"function"==typeof i?n?[i.listener||i]:[i]:n?function(e){for(var t=new Array(e.length),n=0;n<t.length;++n)t[n]=e[n].listener||e[n];return t}(i):p(i,i.length)}function h(e){var t=this._events;if(void 0!==t){var n=t[e];if("function"==typeof n)return 1;if(void 0!==n)return n.length}return 0}function p(e,t){for(var n=new Array(t),r=0;r<t;++r)n[r]=e[r];return n}function v(e,t,n,r){if("function"==typeof e.on)r.once?e.once(t,n):e.on(t,n);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function i(o){r.once&&e.removeEventListener(t,i),n(o)}))}}Object.defineProperty(o,"defaultMaxListeners",{enumerable:!0,get:function(){return s},set:function(e){if("number"!=typeof e||e<0||i(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");s=e}}),o.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},o.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||i(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},o.prototype.getMaxListeners=function(){return u(this)},o.prototype.emit=function(e){for(var t=[],n=1;n<arguments.length;n++)t.push(arguments[n]);var i="error"===e,o=this._events;if(void 0!==o)i=i&&void 0===o.error;else if(!i)return!1;if(i){var s;if(t.length>0&&(s=t[0]),s instanceof Error)throw s;var a=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw a.context=s,a}var u=o[e];if(void 0===u)return!1;if("function"==typeof u)r(u,this,t);else{var c=u.length,f=p(u,c);for(n=0;n<c;++n)r(f[n],this,t)}return!0},o.prototype.addListener=function(e,t){return c(this,e,t,!1)},o.prototype.on=o.prototype.addListener,o.prototype.prependListener=function(e,t){return c(this,e,t,!0)},o.prototype.once=function(e,t){return a(t),this.on(e,l(this,e,t)),this},o.prototype.prependOnceListener=function(e,t){return a(t),this.prependListener(e,l(this,e,t)),this},o.prototype.removeListener=function(e,t){var n,r,i,o,s;if(a(t),void 0===(r=this._events))return this;if(void 0===(n=r[e]))return this;if(n===t||n.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit("removeListener",e,n.listener||t));else if("function"!=typeof n){for(i=-1,o=n.length-1;o>=0;o--)if(n[o]===t||n[o].listener===t){s=n[o].listener,i=o;break}if(i<0)return this;0===i?n.shift():function(e,t){for(;t+1<Line truncated
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "pouchdb-browser-webpack",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "pouchdb-browser webpack",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
|
||||||
"build": "webpack --mode=production --node-env=production",
|
|
||||||
"build:dev": "webpack --mode=development",
|
|
||||||
"build:prod": "webpack --mode=production --node-env=production",
|
|
||||||
"watch": "webpack --watch"
|
|
||||||
},
|
|
||||||
"keywords": [],
|
|
||||||
"author": "",
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"pouchdb-browser": "^7.3.0",
|
|
||||||
"transform-pouch": "^2.0.0",
|
|
||||||
"pouchdb-find": "^7.3.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"webpack": "^5.58.1",
|
|
||||||
"webpack-cli": "^4.9.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
/* eslint-disable no-undef */
|
|
||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
||||||
// This module just webpacks pouchdb-browser
|
|
||||||
// import * as PouchDB_src from "pouchdb-browser";
|
|
||||||
const pouch = require("pouchdb-browser").default;
|
|
||||||
const find = require("pouchdb-find").default;
|
|
||||||
const transform = require("transform-pouch");
|
|
||||||
const PouchDB = pouch.plugin(find).plugin(transform);
|
|
||||||
|
|
||||||
export { PouchDB };
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
// Generated using webpack-cli https://github.com/webpack/webpack-cli
|
|
||||||
|
|
||||||
const path = require("path");
|
|
||||||
|
|
||||||
const isProduction = process.env.NODE_ENV == "production";
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
entry: "./src/index.js",
|
|
||||||
output: {
|
|
||||||
filename: "pouchdb-browser.js",
|
|
||||||
path: path.resolve(__dirname, "dist"),
|
|
||||||
library: {
|
|
||||||
type: "module",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
experiments: {
|
|
||||||
outputModule: true,
|
|
||||||
},
|
|
||||||
plugins: [],
|
|
||||||
module: {},
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
if (isProduction) {
|
|
||||||
config.mode = "production";
|
|
||||||
} else {
|
|
||||||
config.mode = "development";
|
|
||||||
}
|
|
||||||
return config;
|
|
||||||
};
|
|
||||||
+150
-1369
File diff suppressed because it is too large.
Load diff
@@ -3,7 +3,7 @@ import { EntryDoc, LOG_LEVEL, RemoteDBSettings } from "./lib/src/types";
|
|||||||
import { path2id, id2path } from "./utils";
|
import { path2id, id2path } from "./utils";
|
||||||
import { delay, runWithLock, versionNumberString2Number } from "./lib/src/utils";
|
import { delay, runWithLock, versionNumberString2Number } from "./lib/src/utils";
|
||||||
import { Logger } from "./lib/src/logger";
|
import { Logger } from "./lib/src/logger";
|
||||||
import { checkSyncInfo, connectRemoteCouchDBWithSetting } from "./utils_couchdb";
|
import { checkSyncInfo } from "./lib/src/utils_couchdb";
|
||||||
import { testCrypt } from "./lib/src/e2ee_v2";
|
import { testCrypt } from "./lib/src/e2ee_v2";
|
||||||
import ObsidianLiveSyncPlugin from "./main";
|
import ObsidianLiveSyncPlugin from "./main";
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
|
|||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
}
|
}
|
||||||
async testConnection(): Promise<void> {
|
async testConnection(): Promise<void> {
|
||||||
const db = await connectRemoteCouchDBWithSetting(this.plugin.settings, this.plugin.localDatabase.isMobile);
|
const db = await this.plugin.localDatabase.connectRemoteCouchDBWithSetting(this.plugin.settings, this.plugin.localDatabase.isMobile);
|
||||||
if (typeof db === "string") {
|
if (typeof db === "string") {
|
||||||
this.plugin.addLog(`could not connect to ${this.plugin.settings.couchDB_URI} : ${this.plugin.settings.couchDB_DBNAME} \n(${db})`, LOG_LEVEL.NOTICE);
|
this.plugin.addLog(`could not connect to ${this.plugin.settings.couchDB_URI} : ${this.plugin.settings.couchDB_DBNAME} \n(${db})`, LOG_LEVEL.NOTICE);
|
||||||
return;
|
return;
|
||||||
@@ -225,7 +225,7 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
|
|||||||
passphrase: this.plugin.settings.workingPassphrase,
|
passphrase: this.plugin.settings.workingPassphrase,
|
||||||
};
|
};
|
||||||
console.dir(settingForCheck);
|
console.dir(settingForCheck);
|
||||||
const db = await connectRemoteCouchDBWithSetting(settingForCheck, this.plugin.localDatabase.isMobile);
|
const db = await this.plugin.localDatabase.connectRemoteCouchDBWithSetting(settingForCheck, this.plugin.localDatabase.isMobile);
|
||||||
if (typeof db === "string") {
|
if (typeof db === "string") {
|
||||||
Logger("Could not connect to the database.", LOG_LEVEL.NOTICE);
|
Logger("Could not connect to the database.", LOG_LEVEL.NOTICE);
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
+1
-1
Submodule src/lib updated: aacfa353a9...57db68352b.
@@ -1,4 +0,0 @@
|
|||||||
import { PouchDB as PouchDB_ } from "../pouchdb-browser-webpack/dist/pouchdb-browser.js";
|
|
||||||
|
|
||||||
const Pouch: PouchDB.Static = PouchDB_;
|
|
||||||
export { Pouch as PouchDB };
|
|
||||||
@@ -1,279 +0,0 @@
|
|||||||
import { Logger } from "./lib/src/logger";
|
|
||||||
import { LOG_LEVEL, VER, VERSIONINFO_DOCID, EntryVersionInfo, EntryDoc, RemoteDBSettings, SYNCINFO_ID, SyncInfo } from "./lib/src/types";
|
|
||||||
import { enableEncryption, resolveWithIgnoreKnownError } from "./lib/src/utils";
|
|
||||||
import { PouchDB } from "./pouchdb-browser";
|
|
||||||
import { requestUrl, RequestUrlParam, RequestUrlResponse } from "obsidian";
|
|
||||||
|
|
||||||
export const isValidRemoteCouchDBURI = (uri: string): boolean => {
|
|
||||||
if (uri.startsWith("https://")) return true;
|
|
||||||
if (uri.startsWith("http://")) return true;
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
let last_successful_post = false;
|
|
||||||
export const getLastPostFailedBySize = () => {
|
|
||||||
return !last_successful_post;
|
|
||||||
};
|
|
||||||
const fetchByAPI = async (request: RequestUrlParam): Promise<RequestUrlResponse> => {
|
|
||||||
const ret = await requestUrl(request);
|
|
||||||
if (ret.status - (ret.status % 100) !== 200) {
|
|
||||||
const er: Error & { status?: number } = new Error(`Request Error:${ret.status}`);
|
|
||||||
if (ret.json) {
|
|
||||||
er.message = ret.json.reason;
|
|
||||||
er.name = `${ret.json.error ?? ""}:${ret.json.message ?? ""}`;
|
|
||||||
}
|
|
||||||
er.status = ret.status;
|
|
||||||
throw er;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const connectRemoteCouchDBWithSetting = (settings: RemoteDBSettings, isMobile: boolean) =>
|
|
||||||
connectRemoteCouchDB(
|
|
||||||
settings.couchDB_URI + (settings.couchDB_DBNAME == "" ? "" : "/" + settings.couchDB_DBNAME),
|
|
||||||
{
|
|
||||||
username: settings.couchDB_USER,
|
|
||||||
password: settings.couchDB_PASSWORD,
|
|
||||||
},
|
|
||||||
settings.disableRequestURI || isMobile,
|
|
||||||
settings.encrypt ? settings.passphrase : settings.encrypt
|
|
||||||
);
|
|
||||||
|
|
||||||
const connectRemoteCouchDB = async (uri: string, auth: { username: string; password: string }, disableRequestURI: boolean, passphrase: string | boolean): Promise<string | { db: PouchDB.Database<EntryDoc>; info: PouchDB.Core.DatabaseInfo }> => {
|
|
||||||
if (!isValidRemoteCouchDBURI(uri)) return "Remote URI is not valid";
|
|
||||||
if (uri.toLowerCase() != uri) return "Remote URI and database name could not contain capital letters.";
|
|
||||||
if (uri.indexOf(" ") !== -1) return "Remote URI and database name could not contain spaces.";
|
|
||||||
let authHeader = "";
|
|
||||||
if (auth.username && auth.password) {
|
|
||||||
const utf8str = String.fromCharCode.apply(null, new TextEncoder().encode(`${auth.username}:${auth.password}`));
|
|
||||||
const encoded = window.btoa(utf8str);
|
|
||||||
authHeader = "Basic " + encoded;
|
|
||||||
} else {
|
|
||||||
authHeader = "";
|
|
||||||
}
|
|
||||||
const conf: PouchDB.HttpAdapter.HttpAdapterConfiguration = {
|
|
||||||
adapter: "http",
|
|
||||||
auth,
|
|
||||||
fetch: async function (url: string | Request, opts: RequestInit) {
|
|
||||||
let size = "";
|
|
||||||
const localURL = url.toString().substring(uri.length);
|
|
||||||
const method = opts.method ?? "GET";
|
|
||||||
if (opts.body) {
|
|
||||||
const opts_length = opts.body.toString().length;
|
|
||||||
if (opts_length > 1024 * 1024 * 10) {
|
|
||||||
// over 10MB
|
|
||||||
if (uri.contains(".cloudantnosqldb.")) {
|
|
||||||
last_successful_post = false;
|
|
||||||
Logger("This request should fail on IBM Cloudant.", LOG_LEVEL.VERBOSE);
|
|
||||||
throw new Error("This request should fail on IBM Cloudant.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
size = ` (${opts_length})`;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!disableRequestURI && typeof url == "string" && typeof (opts.body ?? "") == "string") {
|
|
||||||
const body = opts.body as string;
|
|
||||||
|
|
||||||
const transformedHeaders = { ...(opts.headers as Record<string, string>) };
|
|
||||||
if (authHeader != "") transformedHeaders["authorization"] = authHeader;
|
|
||||||
delete transformedHeaders["host"];
|
|
||||||
delete transformedHeaders["Host"];
|
|
||||||
delete transformedHeaders["content-length"];
|
|
||||||
delete transformedHeaders["Content-Length"];
|
|
||||||
const requestParam: RequestUrlParam = {
|
|
||||||
url: url as string,
|
|
||||||
method: opts.method,
|
|
||||||
body: body,
|
|
||||||
headers: transformedHeaders,
|
|
||||||
contentType: "application/json",
|
|
||||||
// contentType: opts.headers,
|
|
||||||
};
|
|
||||||
|
|
||||||
try {
|
|
||||||
const r = await fetchByAPI(requestParam);
|
|
||||||
if (method == "POST" || method == "PUT") {
|
|
||||||
last_successful_post = r.status - (r.status % 100) == 200;
|
|
||||||
} else {
|
|
||||||
last_successful_post = true;
|
|
||||||
}
|
|
||||||
Logger(`HTTP:${method}${size} to:${localURL} -> ${r.status}`, LOG_LEVEL.DEBUG);
|
|
||||||
|
|
||||||
return new Response(r.arrayBuffer, {
|
|
||||||
headers: r.headers,
|
|
||||||
status: r.status,
|
|
||||||
statusText: `${r.status}`,
|
|
||||||
});
|
|
||||||
} catch (ex) {
|
|
||||||
Logger(`HTTP:${method}${size} to:${localURL} -> failed`, LOG_LEVEL.VERBOSE);
|
|
||||||
// limit only in bulk_docs.
|
|
||||||
if (url.toString().indexOf("_bulk_docs") !== -1) {
|
|
||||||
last_successful_post = false;
|
|
||||||
}
|
|
||||||
Logger(ex);
|
|
||||||
throw ex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// -old implementation
|
|
||||||
|
|
||||||
try {
|
|
||||||
const response: Response = await fetch(url, opts);
|
|
||||||
if (method == "POST" || method == "PUT") {
|
|
||||||
last_successful_post = response.ok;
|
|
||||||
} else {
|
|
||||||
last_successful_post = true;
|
|
||||||
}
|
|
||||||
Logger(`HTTP:${method}${size} to:${localURL} -> ${response.status}`, LOG_LEVEL.DEBUG);
|
|
||||||
return response;
|
|
||||||
} catch (ex) {
|
|
||||||
Logger(`HTTP:${method}${size} to:${localURL} -> failed`, LOG_LEVEL.VERBOSE);
|
|
||||||
// limit only in bulk_docs.
|
|
||||||
if (url.toString().indexOf("_bulk_docs") !== -1) {
|
|
||||||
last_successful_post = false;
|
|
||||||
}
|
|
||||||
Logger(ex);
|
|
||||||
throw ex;
|
|
||||||
}
|
|
||||||
// return await fetch(url, opts);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const db: PouchDB.Database<EntryDoc> = new PouchDB<EntryDoc>(uri, conf);
|
|
||||||
if (passphrase && typeof passphrase === "string") {
|
|
||||||
enableEncryption(db, passphrase);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const info = await db.info();
|
|
||||||
return { db: db, info: info };
|
|
||||||
} catch (ex) {
|
|
||||||
let msg = `${ex.name}:${ex.message}`;
|
|
||||||
if (ex.name == "TypeError" && ex.message == "Failed to fetch") {
|
|
||||||
msg += "\n**Note** This error caused by many reasons. The only sure thing is you didn't touch the server.\nTo check details, open inspector.";
|
|
||||||
}
|
|
||||||
Logger(ex, LOG_LEVEL.VERBOSE);
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
// check the version of remote.
|
|
||||||
// if remote is higher than current(or specified) version, return false.
|
|
||||||
export const checkRemoteVersion = async (db: PouchDB.Database, migrate: (from: number, to: number) => Promise<boolean>, barrier: number = VER): Promise<boolean> => {
|
|
||||||
try {
|
|
||||||
const versionInfo = (await db.get(VERSIONINFO_DOCID)) as EntryVersionInfo;
|
|
||||||
if (versionInfo.type != "versioninfo") {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const version = versionInfo.version;
|
|
||||||
if (version < barrier) {
|
|
||||||
const versionUpResult = await migrate(version, barrier);
|
|
||||||
if (versionUpResult) {
|
|
||||||
await bumpRemoteVersion(db);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (version == barrier) return true;
|
|
||||||
return false;
|
|
||||||
} catch (ex) {
|
|
||||||
if (ex.status && ex.status == 404) {
|
|
||||||
if (await bumpRemoteVersion(db)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
throw ex;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
export const bumpRemoteVersion = async (db: PouchDB.Database, barrier: number = VER): Promise<boolean> => {
|
|
||||||
const vi: EntryVersionInfo = {
|
|
||||||
_id: VERSIONINFO_DOCID,
|
|
||||||
version: barrier,
|
|
||||||
type: "versioninfo",
|
|
||||||
};
|
|
||||||
const versionInfo = (await resolveWithIgnoreKnownError(db.get(VERSIONINFO_DOCID), vi)) as EntryVersionInfo;
|
|
||||||
if (versionInfo.type != "versioninfo") {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
vi._rev = versionInfo._rev;
|
|
||||||
await db.put(vi);
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const checkSyncInfo = async (db: PouchDB.Database): Promise<boolean> => {
|
|
||||||
try {
|
|
||||||
const syncinfo = (await db.get(SYNCINFO_ID)) as SyncInfo;
|
|
||||||
console.log(syncinfo);
|
|
||||||
// if we could decrypt the doc, it must be ok.
|
|
||||||
return true;
|
|
||||||
} catch (ex) {
|
|
||||||
if (ex.status && ex.status == 404) {
|
|
||||||
const randomStrSrc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
||||||
const temp = [...Array(30)]
|
|
||||||
.map((e) => Math.floor(Math.random() * randomStrSrc.length))
|
|
||||||
.map((e) => randomStrSrc[e])
|
|
||||||
.join("");
|
|
||||||
const newSyncInfo: SyncInfo = {
|
|
||||||
_id: SYNCINFO_ID,
|
|
||||||
type: "syncinfo",
|
|
||||||
data: temp,
|
|
||||||
};
|
|
||||||
if (await db.put(newSyncInfo)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
console.dir(ex);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
export async function putDesignDocuments(db: PouchDB.Database) {
|
|
||||||
type DesignDoc = {
|
|
||||||
_id: string;
|
|
||||||
_rev: string;
|
|
||||||
ver: number;
|
|
||||||
filters: {
|
|
||||||
default: string,
|
|
||||||
push: string,
|
|
||||||
pull: string,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
const design: DesignDoc = {
|
|
||||||
"_id": "_design/replicate",
|
|
||||||
"_rev": undefined as string | undefined,
|
|
||||||
"ver": 2,
|
|
||||||
"filters": {
|
|
||||||
"default": function (doc: any, req: any) {
|
|
||||||
return !("remote" in doc && doc.remote);
|
|
||||||
}.toString(),
|
|
||||||
"push": function (doc: any, req: any) {
|
|
||||||
return true;
|
|
||||||
}.toString(),
|
|
||||||
"pull": function (doc: any, req: any) {
|
|
||||||
return !(doc.type && doc.type == "leaf")
|
|
||||||
}.toString(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// We can use the filter on replication : filter: 'replicate/default',
|
|
||||||
|
|
||||||
try {
|
|
||||||
const w = await db.get<DesignDoc>(design._id);
|
|
||||||
if (w.ver < design.ver) {
|
|
||||||
design._rev = w._rev;
|
|
||||||
//@ts-ignore
|
|
||||||
await db.put(design);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} catch (ex) {
|
|
||||||
if (ex.status && ex.status == 404) {
|
|
||||||
delete design._rev;
|
|
||||||
//@ts-ignore
|
|
||||||
await db.put(design);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
Logger("Could not make design documents", LOG_LEVEL.INFO);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Reference in new issue
Block a user