UNPKG

@wireapp/cryptobox

Version:

High-level API with persistent storage for Proteus.

2 lines 15.7 kB
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dexie"),require("dexie-observable")):"function"==typeof define&&define.amd?define(["dexie","dexie-observable"],n):(e.Dexie=e.Dexie||{},e.Dexie.Syncable=n(e.Dexie))}(this,function(e){"use strict";function n(n,t){return function(r,o,i,c){if(n.isOpen()){if(!n._localSyncNode)throw new Error("Precondition failed: local sync node is missing. Make sure Dexie.Observable is active!");return n._localSyncNode.isMaster?t(r,o,i,c,n._localSyncNode.id):n.table("_syncNodes").where("isMaster").above(0).first(function(e){return n.observable.sendMessage("connect",{protocolName:o,url:i,options:c},e.id,{wantReply:!0})})}if(n.hasBeenClosed())return N.reject(new e.DatabaseClosedError);if(n.hasFailed())return N.reject(new e.InvalidStateError("Dexie.Syncable: Cannot connect. Database has failed to open"));var a=new N(function(t,r){n.on("ready",function(){return n._syncNodes.get({url:i},function(e){var a=n.syncable.connect(o,i,c);return a.then(t,r),e&&e.appliedRemoteRevision?void 0:a})}),n.open()["catch"](function(n){r(new e.InvalidStateError("Dexie.Syncable: Couldn't connect. Database failed to open",n))})});return a}}function t(n){return function(){function t(n,t){this.nodeID=n,t&&e.extend(this,t)}return t.prototype.save=function(){return e.vip(function(){return n.save()})},t}()}function r(n,r,o){return function(i){return n.transaction("rw",n._syncNodes,n._changes,function(){if(!o)throw new Error("Url cannot be empty");return n._syncNodes.where("url").equalsIgnoreCase(o).first(function(c){if(c){var a=t(c);c.syncContext=new a(c.id,c.syncContext),c.syncProtocol=r,c.syncOptions=i,n._syncNodes.put(c)}else{c=new n.observable.SyncNode,c.myRevision=-1,c.appliedRemoteRevision=null,c.remoteBaseRevisions=[],c.type="remote",c.syncProtocol=r,c.url=o,c.syncOptions=i,c.lastHeartBeat=Date.now(),c.dbUploadState=null;var s=t(c);e.Promise.resolve(function(){return i.initialUpload===!1?n._changes.toCollection().lastKey(function(e){c.myRevision=e}):void 0}()).then(function(){n._syncNodes.add(c).then(function(e){c.syncContext=new s(e),n._syncNodes.put(c)})})}return c})})}}function o(n){return function t(r,o,i){function c(){return r.ongoingOperation=r.ongoingOperation?r.ongoingOperation.then(function(){return t(r,o,i)}):e.ignoreTransaction(function(){return e.vip(function(){return o()})})["finally"](function(){delete r.ongoingOperation}),r.ongoingOperation}return i?n._localSyncNode&&i===n._localSyncNode.id?c():e.Promise.reject(new e.DatabaseClosedError):n.isOpen()?c():e.Promise.reject(new e.DatabaseClosedError)}}function i(e,n){return function(t,r){return e.transaction("rw!",e._uncommittedChanges,function(){return e._uncommittedChanges.bulkAdd(t.map(function(e){var t={node:n.id,type:e.type,table:e.table,key:e.key};return e.obj&&(t.obj=e.obj),e.mods&&(t.mods=e.mods),t}))}).then(function(){return n.appliedRemoteRevision=r,n.save()})}}function c(n,t){var r=t.map(function(e){return e.key}),o={};return n.where(":id").anyOf(r).raw().each(function(e,n){o[n.primaryKey+""]=e}).then(function(){var r=t.filter(function(e){return o.hasOwnProperty(e.key+"")}),i=r.map(function(n){var t=o[n.key+""];return Object.keys(n.mods).forEach(function(r){e.setByKeyPath(t,r,n.mods[r])}),t});return n.bulkPut(i)})}function a(e){return function(n){var t={};n.forEach(function(e){t.hasOwnProperty(e.table)||(t[e.table]=(n={},n[g]=[],n[O]=[],n[R]=[],n)),t[e.table][e.type].push(e);var n});var r=Object.keys(t),o=r.map(function(n){return e.table(n)});return e.transaction("rw",o,function(){r.forEach(function(n){var r=e.table(n),o=!r.schema.primKey.keyPath,i=t[n][g],a=t[n][O],s=t[n][R];i.length>0&&r.bulkPut(i.map(function(e){return e.obj}),o?i.map(function(e){return e.key}):void 0),s.length>0&&c(r,s),a.length>0&&r.bulkDelete(a.map(function(e){return e.key}))})})}}function s(n,t){var r=a(n);return function(o,i){var c=n.tables.filter(function(e){return"_changes"===e.name||"_uncommittedChanges"===e.name||e.schema.observable});return n.transaction("rw!",c,function(){var c=e.currentTransaction,a=0;return n._changes.orderBy("rev").last(function(e){a=e&&e.rev||0}).then(function(){return c.source=t.id,n._uncommittedChanges.where("node").equals(t.id).toArray()}).then(function(e){return r(e)}).then(function(){return n._uncommittedChanges.where("node").equals(t.id)["delete"]()}).then(function(){return r(o)}).then(function(){return n._changes.orderBy("rev").last()}).then(function(e){var n=e&&e.rev||0;if(t.appliedRemoteRevision=i,t.remoteBaseRevisions.push({remote:i,local:n}),t.myRevision===a&&(t.myRevision=n),t.remoteBaseRevisions.length>1)for(var r=t.remoteBaseRevisions.length-1;r>0;--r)if(t.myRevision>=t.remoteBaseRevisions[r].local){t.remoteBaseRevisions.splice(0,r);break}t.save()["catch"](function(e){console.warn("Dexie.Syncable: Unable to save SyncNode after applying remote changes: "+(e.stack||e))})})})}}function u(e){if(0===e.remoteBaseRevisions.length)return{maxClientRevision:1/0,remoteBaseRevision:null};for(var n=e.remoteBaseRevisions.length-1;n>=0;--n)if(e.myRevision>=e.remoteBaseRevisions[n].local)return{maxClientRevision:n===e.remoteBaseRevisions.length-1?1/0:e.remoteBaseRevisions[n+1].local,remoteBaseRevision:e.remoteBaseRevisions[n].remote};return{maxClientRevision:e.remoteBaseRevisions[0].local,remoteBaseRevision:null}}function l(n,t){var r=e.deepClone(n);return Object.keys(t.mods).forEach(function(n){e.setByKeyPath(r.obj,n,t.mods[n])}),r}function f(n,t){var r=e.deepClone(n);return Object.keys(t.mods).forEach(function(o){var i=!1;Object.keys(n.mods).filter(function(e){return 0===o.indexOf(e+".")}).forEach(function(n){e.setByKeyPath(r.mods[n],o.substr(n.length+1),t.mods[o]),i=!0}),i||(r.mods[o]=t.mods[o]),Object.keys(n.mods).filter(function(e){return 0===e.indexOf(o+".")}).forEach(function(e){delete r.mods[e]})}),r}function d(e,n){switch(e.type){case g:switch(n.type){case g:return n;case R:return l(e,n);case O:return n}break;case R:switch(n.type){case g:return n;case R:return f(e,n);case O:return n}break;case O:switch(n.type){case g:return n;case R:return e;case O:return e}}}function y(e,n,t){return function(r,o,i,c){var a={},s=0,u=!1,l=n.id,f=r;return e.transaction("r",e._changes,function(){var n=e._changes.where("rev").between(r,i,!1,!0);return n.until(function(){return s===o?(u=!0,!0):void 0}).each(function(e){if(f=e.rev,e.source!==l){var n={type:e.type,table:e.table,key:e.key};e.type===g?n.obj=e.obj:e.type===R&&(n.mods=e.mods);var t=e.table+":"+e.key,r=a[t];if(r){var o=n,i=d(r,o);a[t]=i}else a[t]=n,++s}})}).then(function(){var e=Object.keys(a).map(function(e){return a[e]});return t.hasMoreToGive=u,c(e,u,{myRevision:f})})}}function h(e,n,t,r,o,i){return function c(a,s,l){var f=!1;return l.until(function(){return s.length===t?(f=!0,!0):void 0}).each(function(e,n){s.push({type:g,table:a.currentTable,key:n.key,obj:n.value}),a.currentKey=n.key}).then(function(){if(f)return o.hasMoreToGive=!0,i(s,null,!0,{dbUploadState:a});if(0===a.tablesToUpload.length){var l=u(n);return r(a.localBaseRevision,t-s.length,l.maxClientRevision,function(e,n,t){return s=s.concat(e),t.dbUploadState=null,i(s,l.remoteBaseRevision,n,t)})}return a.currentTable=a.tablesToUpload.shift(),c(a,s,e.table(a.currentTable).orderBy(":id"))})}}function v(n,t,r){var o=r;return function(r,i){var c=y(n,r,t),a=h(n,r,o,c,t,i);if(r.myRevision>=0){var s=u(r);return c(r.myRevision,o,s.maxClientRevision,function(e,n,t){return i(e,s.remoteBaseRevision,n,t)})}if(null===r.dbUploadState){var l=n.tables.filter(function(e){return e.schema.observable}).map(function(e){return e.name});if(0===l.length)return e.Promise.resolve(i([],null,!1,{}));var f={tablesToUpload:l,currentTable:l.shift(),currentKey:null};return n._changes.orderBy("rev").last(function(e){f.localBaseRevision=e&&e.rev||0;var t=n.table(f.currentTable).orderBy(":id");return a(f,[],t)})}if(r.dbUploadState.currentKey){var d=n.table(r.dbUploadState.currentTable).where(":id").above(r.dbUploadState.currentKey);return a(e.deepClone(r.dbUploadState),[],d)}var d=n.table(f.currentTable).orderBy(":id");return a(e.deepClone(r.dbUploadState),[],d)}}function b(n,t,r,c,a){function u(){return n._localSyncNode&&n._localSyncNode.id===r}var l=o(n),f={hasMoreToGive:!0};return function(o,d){function y(e){o.status!==e&&(o.status=e,o.save().then(function(){n.syncable.on.statusChanged.fire(e,_),n.observable.broadcastMessage("syncStatusChanged",{newStatus:e,url:_},!1)})["catch"]("DatabaseClosedError",function(){}))}function h(){return l(h,function(){return p(o,b)},r)}function b(n,r,i,s){function l(){return Object.keys(s).forEach(function(n){e.setByKeyPath(o,n,s[n])}),f.then(g),o.save()}var f=new C(function(s,f){a.p=function(e){f(e)},e.asap(function(){function e(e,n){f(e),u()&&(!isNaN(n)&&1/0>n?(setTimeout(function(){u()&&(y(E.SYNCING),h()["catch"]("DatabaseClosedError",m))},n),y(E.ERROR_WILL_RETRY,e),S&&S.disconnect&&S.disconnect(),S=null):m(e))}try{t.sync(o.syncContext,_,c,r,o.appliedRemoteRevision,n,i,N,l,function(e){s(e)},e)}catch(a){e(a,1/0)}})});return f.then(function(){return void 0})["finally"](function(){a.p=null})}function m(e){d.disconnect(E.ERROR,e)}function p(n,t){return w(n,function r(o,i,c,a){return 0===o.length&&"myRevision"in a&&a.myRevision!==n.myRevision?(Object.keys(a).forEach(function(t){e.setByKeyPath(n,t,a[t])}),n.save()["catch"]("DatabaseClosedError",function(){}),w(n,r)):t(o,i,c,a)})}function N(t,c,a){var f=i(n,o),d=s(n,o);return l(N,function(){return u()?(a?f(t,c):d(t,c))["catch"](function(e){return m(e),C.reject(e)}):C.reject(new e.DatabaseClosedError)},r)}function g(e){return u()?(S=e,d.on("disconnect",function(){if(S){if(S.react)try{S.disconnect()}catch(e){}S=null}}),void(e.react?R(e):O(e))):void(e.disconnect&&e.disconnect())}function R(t){function r(){S&&(y(E.SYNCING),a?c=!0:i())}function i(){S&&(c=!1,a=!0,p(o,function(n,r,s,u){S&&(n.length>0?t.react(n,r,s,function(){Object.keys(u).forEach(function(n){e.setByKeyPath(o,n,u[n])}),o.save()["catch"]("DatabaseClosedError",function(){}),i()}):(a=!1,c?i():y(E.ONLINE)))})["catch"](function(e){console.error("Got "+e.message+" caught by reactToChanges"),m(e)}))}var c,a;n.on("changes",r),d.on("disconnect",function(){n.on.changes.unsubscribe(r)}),i()}function O(){function n(){p(o,function(r,i,a,s){function u(){Object.keys(s).forEach(function(n){e.setByKeyPath(o,n,s[n])}),o.save()["catch"]("DatabaseClosedError",function(){})}function l(e){S&&(S=e,a?n():!isNaN(e.again)&&e.again<1/0?(y(E.ONLINE),setTimeout(function(){S&&(y(E.SYNCING),n())},e.again)):d.disconnect(E.OFFLINE))}function f(e,t){!isNaN(t)&&1/0>t?S&&(setTimeout(function(){S&&(y(E.SYNCING),n())},t),y(E.ERROR_WILL_RETRY)):m(e)}t.sync(o.syncContext,_,c,i,o.appliedRemoteRevision,r,a,N,u,l,f)})["catch"](m)}f.hasMoreToGive?n():S&&!isNaN(S.again)&&S.again<1/0?(y(E.ONLINE),setTimeout(function(){S&&(y(E.SYNCING),n())},S.again)):d.disconnect(E.OFFLINE)}var w=v(n,f,t.partialsThreshold),_=d.url;d.on("disconnect",function(e){isNaN(e)||y(e)});var S;return y(E.CONNECTING),h()}}function m(n,t){return function(o,i,c,a,s){function u(){var u={p:null},l=b(n,o,s,a,u),f=r(n,i,c),d=f(a).then(function(e){return l(e,h)}),y=!1,h={url:c,status:E.OFFLINE,connectPromise:d,syncOptions:a,on:e.Events(null,"disconnect"),disconnect:function(e,n){var r=t.indexOf(h);r>=0&&t.splice(r,1),n&&u.p&&u.p(n),y||h.on.disconnect.fire(e,n),y=!0}};return t.push(h),d}var l=t.filter(function(e){return e.url===c});if(l.length>0){var f=l[0],d={};return e.getObjectDiff(f.syncOptions,a,d),0!==Object.keys(d).length?n.syncable.disconnect(c).then(function(){return u()}):l[0].connectPromise}return u()}}function p(t){var r=[],o=m(t,r),i=n(t,o);t.on("message",function(n){e.vip(function(){"connect"===n.type?t.syncable.connect(n.message.protocolName,n.message.url,n.message.options).then(n.resolve,n.reject):"disconnect"===n.type?t.syncable.disconnect(n.message.url).then(n.resolve,n.reject):"syncStatusChanged"===n.type&&t.syncable.on.statusChanged.fire(n.message.newStatus,n.message.url)})}),t.on("cleanup",function(n){n&&e.ignoreTransaction(function(){return e.vip(function(){return t._syncNodes.where({type:"remote"}).filter(function(e){return e.status!==E.OFFLINE}).toArray(function(e){return S.all(e.map(function(e){return t.syncable.connect(e.syncProtocol,e.url,e.syncOptions)["catch"](function(n){console.warn("Dexie.Syncable: Could not connect to "+e.url+". "+(n.stack||n))})}))})})})["catch"]("DatabaseClosedError",function(){})}),t.on("ready",function(){t._localSyncNode&&t._localSyncNode.isMaster&&t._syncNodes.where("type").equals("remote").and(function(e){return e.status!==E.OFFLINE}).toArray(function(e){e.forEach(function(e){return t.syncable.connect(e.syncProtocol,e.url,e.syncOptions)["catch"](function(){})})})["catch"]("DatabaseClosedError",function(){})},!0),t.syncable={},t.syncable.getStatus=function(n,r){return t.isOpen()?e.vip(function(){return t._syncNodes.where("url").equals(n).first(function(e){return e?e.status:E.OFFLINE})}).then(r):S.resolve(p.Statuses.OFFLINE).then(r)},t.syncable.getOptions=function(e,n){return t.transaction("r?",t._syncNodes,function(){return t._syncNodes.where("url").equals(e).first(function(e){return e.syncOptions}).then(n)})},t.syncable.list=function(){return t.transaction("r?",t._syncNodes,function(){return t._syncNodes.where("type").equals("remote").toArray(function(e){return e.map(function(e){return e.url})})})},t.syncable.on=e.Events(t,{statusChanged:"asap"}),t.syncable.disconnect=function(n){return e.ignoreTransaction(function(){return S.resolve().then(function(){return t._localSyncNode&&t._localSyncNode.isMaster?S.all(r.filter(function(e){return e.url===n}).map(function(e){return e.disconnect(E.OFFLINE)})):t._syncNodes.where("isMaster").above(0).first(function(e){return t.observable.sendMessage("disconnect",{url:n},e.id,{wantReply:!0})})}).then(function(){return t._syncNodes.where("url").equals(n).modify(function(e){e.status=E.OFFLINE})})})},t.syncable.connect=function(e,n,t){t=t||{};var r=p.registeredProtocols[e];return r?i(r,e,n,t):S.reject(new Error("ISyncProtocol '"+e+"' is not registered in Dexie.Syncable.registerSyncProtocol()"))},t.syncable["delete"]=function(e){return t.syncable.disconnect(e).then(function(){return t.transaction("rw!",t._syncNodes,t._changes,t._uncommittedChanges,function(){var n;return t._syncNodes.where("url").equals(e).toArray(function(e){return e.map(function(e){return e.id})}).then(function(e){return n=e,t._syncNodes.where("id").anyOf(e)["delete"]()}).then(function(){return t._uncommittedChanges.where("node").anyOf(n)["delete"]()})}).then(function(){k.deleteOldChanges(t)})})},t.syncable.unsyncedChanges=function(e){return t._syncNodes.where("url").equals(e).first(function(e){return t._changes.where("rev").above(e.myRevision).toArray()})},t.close=_(t.close,function(e){return function(){return r.forEach(function(e){e.disconnect()}),e.apply(this,arguments)}}),Object.defineProperty(t.observable.SyncNode.prototype,"save",{enumerable:!1,configurable:!0,writable:!0,value:function(){var e=this;return t.transaction("rw?",t._syncNodes,function(){return t._syncNodes.put(e)})}})}e="default"in e?e["default"]:e;var N=e.Promise,g=1,R=2,O=3,E={ERROR:-1,OFFLINE:0,CONNECTING:1,ONLINE:2,SYNCING:3,ERROR_WILL_RETRY:4},w={"-1":"ERROR",0:"OFFLINE",1:"CONNECTING",2:"ONLINE",3:"SYNCING",4:"ERROR_WILL_RETRY"},C=e.Promise,_=e.override,S=e.Promise,k=e.Observable;return p.Statuses=E,p.StatusTexts=w,p.registeredProtocols={},p.registerSyncProtocol=function(e,n){var t=n.partialsThreshold;if("number"==typeof t){if(isNaN(t)||0>t)throw new Error("The given number for the threshold is not supported")}else n.partialsThreshold=1/0;p.registeredProtocols[e]=n},e.Syncable=p,e.addons.push(p),p}); //# sourceMappingURL=dist/dexie-syncable.min.js.map