@wireapp/cryptobox
Version:
High-level API with persistent storage for Proteus.
2 lines • 13.1 kB
JavaScript
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("dexie")):"function"==typeof define&&define.amd?define(["dexie"],n):(e.Dexie=e.Dexie||{},e.Dexie.Observable=n(e.Dexie))}(this,function(e){"use strict";function n(){}function t(e,t){return e===n?t:function(){var n=e.apply(this,arguments);if(n&&"function"==typeof n.then){var o=this,i=arguments;return n.then(function(){return t.apply(o,i)})}return t.apply(this,arguments)}}function o(){var e=Date.now(),n="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(n){var t=(e+16*Math.random())%16|0;return e=Math.floor(e/16),("x"===n?t:7&t|8).toString(16)});return n}function i(e,n){return function(t){return function(o,i,r,a){if(e.dynamicallyOpened())return t.apply(this,arguments);var s=!1;"readwrite"===o&&i.some(function(e){return r[e]&&r[e].observable})&&(s=!0,i=i.slice(0),-1===i.indexOf("_changes")&&i.push("_changes"));var u=t.call(this,o,i,r,a);return s&&(u._lastWrittenRevision=0,u.on("complete",function(){if(u._lastWrittenRevision)if(a){var e=function t(e){return e.parent?t(e.parent):e}(a);e._lastWrittenRevision=Math.max(u._lastWrittenRevision,e.lastWrittenRevision||0)}else n.timeoutHandle&&clearTimeout(n.timeoutHandle),n.timeoutHandle=setTimeout(function(){delete n.timeoutHandle,n(u._lastWrittenRevision)},25)}),u.parent&&u.parent.source&&(u.source=u.parent.source)),u}}}function r(n,t,o){return function(i){t.latestRevision[n.name]<i&&(t.latestRevision[n.name]=i,e.ignoreTransaction(function(){t.on("latestRevisionIncremented").fire(n.name,i)}),o&&o.setItem("Dexie.Observable/latestRevision/"+n.name,i))}}function a(n,t){return function(i,r,a){var s=void 0;void 0===i&&t.schema.primKey.uuid&&(i=s=o(),t.schema.primKey.keyPath&&e.setByKeyPath(r,t.schema.primKey.keyPath,i));var u={source:a.source||null,table:t.name,key:void 0===i?null:i,type:p,obj:r},c=n._changes.add(u).then(function(e){return a._lastWrittenRevision=Math.max(a._lastWrittenRevision,e),e});return this.onsuccess=function(e){i!=e&&c._then(function(){u.key=e,n._changes.put(u)})},this.onerror=function(){c._then(function(e){n._changes["delete"](e)})},s}}function s(n,t){return function(o,i,r,a){var s={},u=!1,c=e.deepClone(r);for(var l in o){var d=o[l];if("undefined"==typeof d)e.delByKeyPath(c,l),s[l]=null,u=!0;else{var f=e.getByKeyPath(r,l);d!==f&&JSON.stringify(d)!==JSON.stringify(f)&&(e.setByKeyPath(c,l,d),s[l]=d,u=!0)}}if(u){var m={source:a.source||null,table:t,key:i,type:h,mods:s,oldObj:r,obj:c},v=n._changes.add(m);this.onsuccess=function(){v._then(function(e){a._lastWrittenRevision=Math.max(a._lastWrittenRevision,e)})},this.onerror=function(){v._then(function(e){n._changes["delete"](e)})}}}}function u(e,n){return function(t,o,i){var r=e._changes.add({source:i.source||null,table:n,key:t,type:b,oldObj:o}).then(function(e){return i._lastWrittenRevision=Math.max(i._lastWrittenRevision,e),e})["catch"](function(e){console.log(o),console.log(e.stack)});this.onerror=function(){r._then(function(n){e._changes["delete"](n)})}}}function c(e){return function(n){if(!n.hook._observing){n.hook._observing=!0;var t=n.name;n.hook("creating").subscribe(a(e,n)),n.hook("updating").subscribe(s(e,t)),n.hook("deleting").subscribe(u(e,t))}}}function l(n){return function(t){if(0===t.key.indexOf("Dexie.Observable/")){var o=t.key.split("/"),i=o[1],r=o[2];if("latestRevision"===i){var a=parseInt(t.newValue,10);!isNaN(a)&&a>n.latestRevision[r]&&(n.latestRevision[r]=a,e.ignoreTransaction(function(){n.on("latestRevisionIncremented").fire(r,a)}))}else if(0===i.indexOf("deadnode:")){var s=parseInt(i.split(":")[1],10);t.newValue&&n.on.suicideNurseCall.fire(r,s)}else"intercomm"===i&&t.newValue&&n.on.intercomm.fire(r)}}}function d(e,n,t){return function(o){return function(){return Object.keys(e._allTables).forEach(function(o){var i=e._allTables[o];i.schema.observable&&t(i),"_syncNodes"===i.name&&i.mapToClass(n)}),o.apply(this,arguments)}}}function f(n,t,o,i,r){function a(){return i.node?e.ignoreTransaction(function(){return n.transaction("rw","_intercomm",function(){return n._intercomm.where({destinationNode:i.node.id}).toArray(function(e){return e.forEach(function(e){return s(e)}),n._intercomm.where("id").anyOf(e.map(function(e){return e.id}))["delete"]()})})}):g.reject(new e.DatabaseClosedError)}function s(e){if("response"===e.type){var t=c[e.requestId.toString()];t&&(e.isFailure?t.reject(e.message.error):t.resolve(e.message.result),delete c[e.requestId.toString()])}else e.resolve=function(t){n.observable.sendMessage("response",{result:t},e.sender,{requestId:e.id})},e.reject=function(t){n.observable.sendMessage("response",{error:t.toString()},e.sender,{isFailure:!0,requestId:e.id})},n.on.message.fire(e)}function u(e){e===n.name&&a()["catch"]("DatabaseClosedError",function(){})}var c={};return n.observable.sendMessage=function(o,a,s,u){if(u=u||{},!i.node)return u.wantReply?g.reject(new e.DatabaseClosedError):g.resolve();var l={message:a,destinationNode:s,sender:i.node.id,type:o};return e.extend(l,u),e.ignoreTransaction(function(){var e=["_intercomm"];u.wantReply&&e.push("_syncNodes");var o=n.transaction("rw",e,function(){return u.wantReply?n._syncNodes.where("id").equals(s).count(function(e){return e?n._intercomm.add(l):n._syncNodes.where("isMaster").above(0).first(function(e){return l.destinationNode=e.id,n._intercomm.add(l)})}):n._intercomm.add(l)}).then(function(e){var o=null;return u.wantReply&&(o=new g(function(n,t){c[e.toString()]={resolve:n,reject:t}})),r&&r.setItem("Dexie.Observable/intercomm/"+n.name,e.toString()),t.on.intercomm.fire(n.name),o});return u.wantReply?o:void o["catch"](function(){})})},n.observable.broadcastMessage=function(t,o,r){if(i.node){var a=i.node.id;e.ignoreTransaction(function(){n._syncNodes.toArray(function(e){return g.all(e.filter(function(e){return"local"===e.type&&(r||e.id!==a)}).map(function(e){return n.observable.sendMessage(t,o,e.id)}))})["catch"](function(){})})}},{onIntercomm:u,consumeIntercommMessages:a}}function m(e){return function(n,t){n._changes="++rev",n._syncNodes="++id,myRevision,lastHeartBeat,&url,isMaster,type,status",n._intercomm="++id,destinationNode",n._uncommittedChanges="++id,node",e.call(this,n,t),Object.keys(t).forEach(function(e){var n=t[e];0===n.primKey.name.indexOf("$$")&&(n.primKey.uuid=!0,n.primKey.name=n.primKey.name.substr(2),n.primKey.keyPath=n.primKey.keyPath.substr(2))}),Object.keys(t).forEach(function(e){0!==e.indexOf("_")&&0!==e.indexOf("$")&&(t[e].observable=!0)})}}function v(n){var t=100;e.ignoreTransaction(function(){return n._syncNodes.orderBy("myRevision").first(function(e){return n._changes.where("rev").below(e.myRevision).limit(t).primaryKeys()}).then(function(e){return 0!==e.length?n._changes.bulkDelete(e).then(function(){e.length===t&&setTimeout(function(){return n.isOpen()&&v(n)},500)}):void 0})})["catch"](function(){})}function y(o){function a(n,t){if(n===o.name){if(W>=t)return;W=t,e.vip(function(){s(t)["catch"]("DatabaseClosedError",function(){})})}}function s(n,t,i){if(!t&&s.ongoingOperation)return s.ongoingOperation;var r=!1,a=B.node;if(!a)return w.reject(new e.DatabaseClosedError);var u=1e3,c=o._changes.where("rev").above(a.myRevision).limit(u).toArray(function(e){if(e.length>0){var n=e[e.length-1];r=e.length===u,o.on("changes").fire(e,r),a.myRevision=n.rev}else i&&o.on("changes").fire([],!1);var t=!1;return o._syncNodes.where(":id").equals(a.id).modify(function(e){t=!0,e.lastHeartBeat=Date.now(),e.deleteTimeStamp=null,e.myRevision=Math.max(e.myRevision,a.myRevision)}).then(function(){return t})}).then(function(e){if(!e)throw N?new Error("Browser is shutting down"):(o.close(),console.error("Out of sync"),_.location&&_.location.reload(!0),new Error("Out of sync"));return r||y.latestRevision[o.name]>a.myRevision?s(y.latestRevision[o.name],(t||0)+1,r):void 0})["finally"](function(){delete s.ongoingOperation});return t||(s.ongoingOperation=c),c}function u(){P=null;var e=B.node&&B.node.id;e&&o.transaction("rw!",o._syncNodes,function(){o._syncNodes.where({id:e}).first(function(e){return e?(e.lastHeartBeat=Date.now(),e.deleteTimeStamp=null,o._syncNodes.put(e)):void(o.isOpen()&&o.close())})})["catch"]("DatabaseClosedError",function(){})["finally"](function(){B.node&&B.node.id===e&&o.isOpen()&&(P=setTimeout(u,S))})}function l(){K=null;var n=B.node&&B.node.id;n&&e.vip(function(){s(y.latestRevision[o.name]).then(v).then(H)["catch"]("DatabaseClosedError",function(){})["finally"](function(){B.node&&B.node.id===n&&o.isOpen()&&(K=setTimeout(l,O))})})}function v(){var n=B.node;return n?o.transaction("rw","_syncNodes","_changes","_intercomm",function(){var e=!1;o._syncNodes.where("lastHeartBeat").below(Date.now()-b).filter(function(e){return"local"===e.type}).modify(function(t){t.deleteTimeStamp&&t.deleteTimeStamp<Date.now()?(delete this.value,T&&T.removeItem("Dexie.Observable/deadnode:"+t.id+"/"+o.name),t.isMaster&&(o._syncNodes.update(n,{isMaster:1}),e=!0),o._intercomm.where({destinationNode:t.id}).modify(function(e){e.wantReply?e.destinationNode=n.id:delete this.value})):t.deleteTimeStamp||(t.deleteTimeStamp=Date.now()+g)}).then(function(){return y.deleteOldChanges(o),o.on("cleanup").fire(e)})}):w.reject(new e.DatabaseClosedError)}function p(){B.node&&(N=!0,B.node.deleteTimeStamp=1,B.node.lastHeartBeat=0,o._syncNodes.put(B.node),y.wereTheOneDying=!0,T&&T.setItem("Dexie.Observable/deadnode:"+B.node.id.toString()+"/"+o.name,"dead"))}function h(n,t){n!==o.name||y.wereTheOneDying||e.vip(function(){o._syncNodes.update(t,{deleteTimeStamp:1,lastHeartBeat:0}).then(v)})}var b=2e4,g=2e4,O=500,S=b-5e3,T=y.localStorageImpl,D=e.defineClass({myRevision:Number,type:String,lastHeartBeat:Number,deleteTimeStamp:Number,url:String,isMaster:Number,syncProtocol:String,syncContext:null,syncOptions:Object,connected:!1,status:Number,appliedRemoteRevision:null,remoteBaseRevisions:[{local:Number,remote:null}],dbUploadState:{tablesToUpload:[String],currentTable:String,currentKey:null,localBaseRevision:Number}});o.observable={},o.observable.SyncNode=D;var C=r(o,y,T),I=i(o,C),M=c(o),j=d(o,D,M),B={node:null},k=f(o,y,D,B,T),E=k.onIntercomm,H=k.consumeIntercommMessages;Object.defineProperty(o,"_localSyncNode",{get:function(){return B.node}});var K=null,P=null;e.fake&&(o.version(1).stores({_syncNodes:"++id,myRevision,lastHeartBeat",_changes:"++rev",_intercomm:"++id,destinationNode",_uncommittedChanges:"++id,node"}),o._syncNodes.mapToClass(D),o._changes.mapToClass(x),B.node=new D({myRevision:0,type:"local",lastHeartBeat:Date.now(),deleteTimeStamp:null})),o.Version.prototype._parseStoresSpec=R(o.Version.prototype._parseStoresSpec,m),o.on.addEventType({changes:"asap",cleanup:[t,n],message:"asap"}),o._createTransaction=R(o._createTransaction,I),y.latestRevision[o.name]=y.latestRevision[o.name]||0,o.open=R(o.open,j),o.close=R(o.close,function(e){return function(){return o.dynamicallyOpened()?e.apply(this,arguments):(C.timeoutHandle&&(clearTimeout(C.timeoutHandle),delete C.timeoutHandle),y.on("latestRevisionIncremented").unsubscribe(a),y.on("suicideNurseCall").unsubscribe(h),y.on("intercomm").unsubscribe(E),y.on("beforeunload").unsubscribe(p),B.node&&B.node.id&&(y.on.suicideNurseCall.fire(o.name,B.node.id),T&&T.setItem("Dexie.Observable/deadnode:"+B.node.id.toString()+"/"+o.name,"dead"),B.node.deleteTimeStamp=1,B.node.lastHeartBeat=0,o._syncNodes.put(B.node),B.node=null),K&&clearTimeout(K),K=null,P&&clearTimeout(P),P=null,e.apply(this,arguments))}}),o["delete"]=R(o["delete"],function(e){return function(){return e.apply(this,arguments).then(function(e){return y.latestRevision[o.name]=0,e})}}),o.on("ready",function(){return o.dynamicallyOpened()?o:o.table("_changes").orderBy("rev").last(function(n){var t=n?n.rev:0;return B.node=new D({myRevision:t,type:"local",lastHeartBeat:Date.now(),deleteTimeStamp:null,isMaster:0}),y.latestRevision[o.name]<t&&(y.latestRevision[o.name]=t,e.ignoreTransaction(function(){y.on.latestRevisionIncremented.fire(t)})),o.transaction("rw","_syncNodes",function(){return o._syncNodes.where("isMaster").equals(1).first(function(e){if(e){if(e.lastHeartBeat<Date.now()-b)return B.node.isMaster=1,e.isMaster=0,o._syncNodes.put(e)}else B.node.isMaster=1}).then(function(){return o._syncNodes.add(B.node).then(function(){y.on("latestRevisionIncremented",a),y.on("beforeunload",p),y.on("suicideNurseCall",h),y.on("intercomm",E),K=setTimeout(l,O),P=setTimeout(u,S)})})}).then(function(){v()})})},!0);var W=0}e="default"in e?e["default"]:e;var p=1,h=2,b=3,g=e.Promise,_=self,x=e.defineClass({rev:Number,source:String,table:String,key:Object,type:Number,obj:Object,mods:Object,oldObj:Object}),R=e.override,w=e.Promise,N=!1;y.latestRevision={},y.on=e.Events(null,"latestRevisionIncremented","suicideNurseCall","intercomm","beforeunload"),y.createUUID=o,y.deleteOldChanges=v,y._onStorage=l(y),y._onBeforeUnload=function(){y.on.beforeunload.fire()};try{y.localStorageImpl=_.localStorage}catch(O){}return _.addEventListener&&(_.addEventListener("storage",y._onStorage),_.addEventListener("beforeunload",y._onBeforeUnload)),e.Observable=y,e.addons.push(y),y});
//# sourceMappingURL=dist/dexie-observable.min.js.map