diff --git a/.gitignore b/.gitignore index 5048f8506..6aeef717d 100644 --- a/.gitignore +++ b/.gitignore @@ -88,7 +88,7 @@ cypress/videos src/app/models/beast-orm-pro.ts - +doc/TypeDoc src/app/pipes/process.service.spec.ts src/app/pipes/process.service.ts @@ -99,6 +99,8 @@ _src/ -src plugin copy pm2.yaml +doc/TypeDoc/** +doc/TypeDoc # Sentry Config File .sentryclirc diff --git a/angular.json b/angular.json index cd7b53a72..faff05a6b 100644 --- a/angular.json +++ b/angular.json @@ -36,7 +36,8 @@ "output": "./svg" }, "src/manifest.webmanifest", - "src/firebase-messaging-sw.js" + "src/firebase-messaging-sw.js", + "src/shared-worker.js" ], "styles": [ "./node_modules/@angular/material/prebuilt-themes/pink-bluegrey.css", diff --git a/doc/TypeDoc/.nojekyll b/doc/TypeDoc/.nojekyll new file mode 100644 index 000000000..e2ac6616a --- /dev/null +++ b/doc/TypeDoc/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/doc/TypeDoc/assets/highlight.css b/doc/TypeDoc/assets/highlight.css new file mode 100644 index 000000000..6c6dfb1b9 --- /dev/null +++ b/doc/TypeDoc/assets/highlight.css @@ -0,0 +1,78 @@ +:root { + --light-hl-0: #795E26; + --dark-hl-0: #DCDCAA; + --light-hl-1: #000000; + --dark-hl-1: #D4D4D4; + --light-hl-2: #A31515; + --dark-hl-2: #CE9178; + --light-hl-3: #0000FF; + --dark-hl-3: #569CD6; + --light-hl-4: #008000; + --dark-hl-4: #6A9955; + --light-hl-5: #098658; + --dark-hl-5: #B5CEA8; + --light-hl-6: #001080; + --dark-hl-6: #9CDCFE; + --light-hl-7: #AF00DB; + --dark-hl-7: #C586C0; + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +.hl-7 { color: var(--hl-7); } +pre, code { background: var(--code-background); } diff --git a/doc/TypeDoc/assets/icons.js b/doc/TypeDoc/assets/icons.js new file mode 100644 index 000000000..e88e8ca77 --- /dev/null +++ b/doc/TypeDoc/assets/icons.js @@ -0,0 +1,18 @@ +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `""`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); + } + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/doc/TypeDoc/assets/icons.svg b/doc/TypeDoc/assets/icons.svg new file mode 100644 index 000000000..e371b8b5d --- /dev/null +++ b/doc/TypeDoc/assets/icons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/doc/TypeDoc/assets/main.js b/doc/TypeDoc/assets/main.js new file mode 100644 index 000000000..35728810f --- /dev/null +++ b/doc/TypeDoc/assets/main.js @@ -0,0 +1,60 @@ +"use strict"; +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings."}; +"use strict";(()=>{var Pe=Object.create;var ie=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _e(e))!Me.call(t,i)&&i!==n&&ie(t,i,{get:()=>e[i],enumerable:!(r=Oe(e,i))||r.enumerable});return t};var Ae=(t,e,n)=>(n=t!=null?Pe(Re(t)):{},De(e||!t||!t.__esModule?ie(n,"default",{value:t,enumerable:!0}):n,t));var ue=Fe((ae,le)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ae=="object"?le.exports=n():e.lunr=n()}(this,function(){return t})})()});var se=[];function G(t,e){se.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){se.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!Ve(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function Ve(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var oe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var pe=Ae(ue());async function ce(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=pe.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function fe(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{ce(e,t)}),ce(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{te(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),He(t,i,r,e)}function He(t,e,n,r){n.addEventListener("input",oe(()=>{Ne(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Be(e,t):i.key=="ArrowUp"?(de(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(de(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),te(t))})}function te(t){t.classList.remove("has-focus")}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=he(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${he(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function de(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function Be(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),te(e)}}function he(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ee(t.substring(s,o)),`${ee(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ee(t.substring(s))),i.join("")}var je={"&":"&","<":"<",">":">","'":"'",'"':"""};function ee(t){return t.replace(/[&<>"'"]/g,e=>je[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",ye="mousemove",N="mouseup",J={x:0,y:0},me=!1,ne=!1,qe=!1,D=!1,ve=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(ve?"is-mobile":"not-mobile");ve&&"ontouchstart"in document.documentElement&&(qe=!0,F="touchstart",ye="touchmove",N="touchend");document.addEventListener(F,t=>{ne=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(ye,t=>{if(ne&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(N,()=>{ne=!1});document.addEventListener("click",t=>{me&&(t.preventDefault(),t.stopImmediatePropagation(),me=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(N,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(N,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var re;try{re=localStorage}catch{re={getItem(){return null},setItem(){}}}var Q=re;var ge=document.head.appendChild(document.createElement("style"));ge.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ge.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function Ee(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,xe(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),xe(t.value)})}function xe(t){document.documentElement.dataset.theme=t}var K;function we(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Le),Le())}async function Le(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();K=t.dataset.base,K.endsWith("/")||(K+="/"),t.innerHTML="";for(let s of i)Se(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Se(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',be(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)Se(u,l,i)}else be(t,r,t.class)}function be(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=K+t.path,n&&(r.className=n),location.pathname===r.pathname&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Te=document.getElementById("tsd-theme");Te&&Ee(Te);var $e=new U;Object.defineProperty(window,"app",{value:$e});fe();we();})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/doc/TypeDoc/assets/navigation.js b/doc/TypeDoc/assets/navigation.js new file mode 100644 index 000000000..4eab0eecd --- /dev/null +++ b/doc/TypeDoc/assets/navigation.js @@ -0,0 +1 @@ +window.navigationData = "data:application/octet-stream;base64,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" \ No newline at end of file diff --git a/doc/TypeDoc/assets/search.js b/doc/TypeDoc/assets/search.js new file mode 100644 index 000000000..7f8929720 --- /dev/null +++ b/doc/TypeDoc/assets/search.js @@ -0,0 +1 @@ +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/doc/TypeDoc/assets/style.css b/doc/TypeDoc/assets/style.css new file mode 100644 index 000000000..9d619a641 --- /dev/null +++ b/doc/TypeDoc/assets/style.css @@ -0,0 +1,1448 @@ +:root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + --light-color-warning-text: #222; + --light-color-background-warning: #e6e600; + --light-color-icon-background: var(--light-color-background); + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-accent); + --light-color-text: #222; + --light-color-text-aside: #6e6e6e; + --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: var(--light-color-ts-variable); + --light-color-ts-method: var(--light-color-ts-function); + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var(--light-color-ts-constructor); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: #a55c0e; + --light-color-ts-accessor: var(--light-color-ts-property); + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: #5d5d6a; + --dark-color-text: #f5f5f5; + --dark-color-text-aside: #dddddd; + --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: var(--dark-color-ts-class); + --dark-color-ts-property: var(--dark-color-ts-variable); + --dark-color-ts-method: var(--dark-color-ts-function); + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: #e07d13; + --dark-color-ts-accessor: var(--dark-color-ts-property); + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; +} + +@media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } +} + +html { + color-scheme: var(--color-scheme); +} + +body { + margin: 0; +} + +:root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); +} + +:root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); +} + +*:focus-visible, +.tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); +} + +.always-visible, +.always-visible .tsd-signatures { + display: inherit !important; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} + +h1 { + font-size: 1.875rem; + margin: 0.67rem 0; +} + +h2 { + font-size: 1.5rem; + margin: 0.83rem 0; +} + +h3 { + font-size: 1.25rem; + margin: 1rem 0; +} + +h4 { + font-size: 1.05rem; + margin: 1.33rem 0; +} + +h5 { + font-size: 1rem; + margin: 1.5rem 0; +} + +h6 { + font-size: 0.875rem; + margin: 2.33rem 0; +} + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +.container { + max-width: 1700px; + padding: 0 2rem; +} + +/* Footer */ +footer { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: 3.5rem; +} +footer > p { + margin: 0 1em; +} + +.container-main { + margin: 0 auto; + /* toolbar, footer, margin */ + min-height: calc(100vh - 41px - 56px - 4rem); +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: var(--color-background); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + color: var(--color-text); +} + +a { + color: var(--color-link); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; +} +a.tsd-anchor-link { + color: var(--color-text); +} + +code, +pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; +} + +pre { + position: relative; + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); +} +pre code { + padding: 0; + font-size: 100%; +} +pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; +} +pre:hover > button, +pre > button.visible { + opacity: 1; +} + +blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography .tsd-index-panel h3, +.tsd-index-panel .tsd-typography h3, +.tsd-typography h4, +.tsd-typography h5, +.tsd-typography h6 { + font-size: 1em; +} +.tsd-typography h5, +.tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, +.tsd-typography ul, +.tsd-typography ol { + margin: 1em 0; +} +.tsd-typography table { + border-collapse: collapse; + border: none; +} +.tsd-typography td, +.tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); +} +.tsd-typography thead, +.tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); +} +.tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +.tsd-comment-tags { + display: flex; + flex-direction: column; +} +dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; +} +dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; +} +dl.tsd-comment-tag-group dd { + margin: 0; +} +code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; +} +h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; +} + +dl.tsd-comment-tag-group dd:before, +dl.tsd-comment-tag-group dd:after { + content: " "; +} +dl.tsd-comment-tag-group dd pre, +dl.tsd-comment-tag-group dd:after { + clear: both; +} +dl.tsd-comment-tag-group p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; +} +.tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; +} +.tsd-filter-input { + display: flex; + width: -moz-fit-content; + width: fit-content; + align-items: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; +} +.tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; +} +.tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; +} +.tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; +} +.tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); +} +.tsd-checkbox-background { + fill: var(--color-accent); +} +input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); +} + +.settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; +} + +.tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; +} + +.tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; +} + +.tsd-hierarchy { + list-style: square; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); +} +.tsd-full-hierarchy, +.tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; +} +.tsd-full-hierarchy ul { + padding-left: 1.5rem; +} +.tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); +} + +.tsd-panel-group.tsd-index-group { + margin-bottom: 0; +} +.tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; +} +@media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } +} +@media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } +} +.tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} + +.tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; +} + +.tsd-anchor { + position: relative; + top: -100px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; +} + +.tsd-navigation.settings { + margin: 1rem 0; +} +.tsd-navigation > a, +.tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; +} +.tsd-navigation a, +.tsd-navigation summary > span, +.tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; +} +.tsd-navigation a.current, +.tsd-page-navigation a.current { + background: var(--color-active-menu-item); +} +.tsd-navigation a:hover, +.tsd-page-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul, +.tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li, +.tsd-page-navigation li { + padding: 0; + max-width: 100%; +} +.tsd-navigation .tsd-nav-link { + display: none; +} +.tsd-nested-navigation { + margin-left: 3rem; +} +.tsd-nested-navigation > li > details { + margin-left: -1.5rem; +} +.tsd-small-nested-navigation { + margin-left: 1.5rem; +} +.tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; +} + +.tsd-page-navigation-section { + margin-left: 10px; +} +.tsd-page-navigation-section > summary { + padding: 0.25rem; +} +.tsd-page-navigation-section > div { + margin-left: 20px; +} +.tsd-page-navigation ul { + padding-left: 1.75rem; +} + +#tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; +} +#tsd-sidebar-links a:last-of-type { + margin-bottom: 0; +} + +a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); +} +.tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ +} +.tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ +} +.tsd-accordion-summary, +.tsd-accordion-summary a { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; +} +.tsd-accordion-summary a { + width: calc(100% - 1.5rem); +} +.tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; +} +.tsd-accordion .tsd-accordion-summary > svg { + margin-left: 0.25rem; + vertical-align: text-top; +} +.tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; +} +.tsd-index-heading { + margin-top: 1.5rem; + margin-bottom: 0.75rem; +} + +.tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; +} +.tsd-kind-icon path { + transform-origin: center; + transform: scale(1.1); +} +.tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; +} + +.tsd-panel { + margin-bottom: 2.5rem; +} +.tsd-panel.tsd-member { + margin-bottom: 4rem; +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, +.tsd-panel > h2, +.tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; +} +.tsd-panel > h1.tsd-before-signature, +.tsd-panel > h2.tsd-before-signature, +.tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; +} + +.tsd-panel-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group details { + margin: 2rem 0; +} +.tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 2.5rem; + height: 100%; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title, +#tsd-toolbar-links a { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + background-color: var(--color-background); + line-height: initial; + padding: 4px; +} +#tsd-search .results li:nth-child(even) { + background-color: var(--color-background-secondary); +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current:not(.no-results), +#tsd-search .results li:hover:not(.no-results) { + background-color: var(--color-accent); +} +#tsd-search .results a { + display: flex; + align-items: center; + padding: 0.25rem; + box-sizing: border-box; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; +} +#tsd-search.has-focus { + background-color: var(--color-accent); +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title, +#tsd-search.has-focus #tsd-toolbar-links a { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +#tsd-toolbar-links { + position: absolute; + top: 0; + right: 2rem; + height: 100%; + display: flex; + align-items: center; + justify-content: flex-end; +} +#tsd-toolbar-links a { + margin-left: 1.5rem; +} +#tsd-toolbar-links a:hover { + text-decoration: underline; +} + +.tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; +} + +.tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; +} + +.tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; +} +.tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; +} +.tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; +} +.tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; +} +.tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; +} + +ul.tsd-parameter-list, +ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; +} +ul.tsd-parameter-list > li.tsd-parameter-signature, +ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; +} +ul.tsd-parameter-list h5, +ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} +.tsd-sources { + margin-top: 1rem; + font-size: 0.875em; +} +.tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: 1px var(--color-accent) solid; + transition: transform 0.3s ease-in-out; +} +.tsd-page-toolbar a { + color: var(--color-text); + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .tsd-toolbar-contents { + display: flex; + justify-content: space-between; + height: 2.5rem; + margin: 0 auto; +} +.tsd-page-toolbar .table-cell { + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} +.tsd-page-toolbar .tsd-toolbar-icon { + box-sizing: border-box; + line-height: 0; + padding: 12px 0; +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: + opacity 0.1s, + background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.9; +} +.tsd-widget.active { + opacity: 1; + background-color: var(--color-accent); +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} + +.tsd-widget.options, +.tsd-widget.menu { + display: none; +} +input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; +} +input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +img { + max-width: 100%; +} + +.tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + vertical-align: middle; + color: var(--color-text); +} + +.tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; +} + +.tsd-anchor-link:hover > .tsd-anchor-icon svg { + visibility: visible; +} + +.deprecated { + text-decoration: line-through !important; +} + +.warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); +} + +.tsd-kind-project { + color: var(--color-ts-project); +} +.tsd-kind-module { + color: var(--color-ts-module); +} +.tsd-kind-namespace { + color: var(--color-ts-namespace); +} +.tsd-kind-enum { + color: var(--color-ts-enum); +} +.tsd-kind-enum-member { + color: var(--color-ts-enum-member); +} +.tsd-kind-variable { + color: var(--color-ts-variable); +} +.tsd-kind-function { + color: var(--color-ts-function); +} +.tsd-kind-class { + color: var(--color-ts-class); +} +.tsd-kind-interface { + color: var(--color-ts-interface); +} +.tsd-kind-constructor { + color: var(--color-ts-constructor); +} +.tsd-kind-property { + color: var(--color-ts-property); +} +.tsd-kind-method { + color: var(--color-ts-method); +} +.tsd-kind-call-signature { + color: var(--color-ts-call-signature); +} +.tsd-kind-index-signature { + color: var(--color-ts-index-signature); +} +.tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); +} +.tsd-kind-parameter { + color: var(--color-ts-parameter); +} +.tsd-kind-type-literal { + color: var(--color-ts-type-literal); +} +.tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); +} +.tsd-kind-accessor { + color: var(--color-ts-accessor); +} +.tsd-kind-get-signature { + color: var(--color-ts-get-signature); +} +.tsd-kind-set-signature { + color: var(--color-ts-set-signature); +} +.tsd-kind-type-alias { + color: var(--color-ts-type-alias); +} + +/* if we have a kind icon, don't color the text by kind */ +.tsd-kind-icon ~ span { + color: var(--color-text); +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); +} + +*::-webkit-scrollbar { + width: 0.75rem; +} + +*::-webkit-scrollbar-track { + background: var(--color-icon-background); +} + +*::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); +} + +/* mobile */ +@media (max-width: 769px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } + + .container-main { + display: flex; + } + html .col-content { + float: none; + max-width: 100%; + width: 100%; + } + html .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-sidebar > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } + #tsd-toolbar-links { + display: none; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } +} + +/* one sidebar */ +@media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + margin: 2rem auto; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } +} +@media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + padding-top: 1rem; + } + .site-menu { + margin-top: 1rem; + } +} + +/* two sidebars */ +@media (min-width: 1200px) { + .container-main { + grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax(0, 20rem); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 1rem 0; + } + + .page-menu, + .site-menu { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + } +} diff --git a/doc/TypeDoc/index.html b/doc/TypeDoc/index.html new file mode 100644 index 000000000..34d5582d3 --- /dev/null +++ b/doc/TypeDoc/index.html @@ -0,0 +1,36 @@ +gabinete-digital

gabinete-digital

Gabinete Digital v0.1

node >= 14

+

Use the package manager npm to install dependencies.

+
npm ci
npm install
npm install -g @ionic/cli
npm install -g lite-server
npm install -g @angular/cli
npm install -g cordova
npm install -g cordova-res

## memory leak
set NODE_OPTIONS=--max_old_space_size=99999996 &&
npm i cordova-plugin-androidx-adapter --force &&
npm install jetifier --force &&
npx jetify --force
+
+ +

Java version 11

+

ionic build && +npx cap add android && +npx cap update

+

Fix cordova-plugin-camera crash

+
## uninstall
npx cordova plugin remove cordova-plugin-camera
## install

npx cordova plugin add https://github.com/PieterVanPoyer/cordova-plugin-camera/#bugfix/issue-665-save-instance-restore-bug
+
+ +
ionic serve
+
+ +
ionic serve build --prod
npm run start +
+ +
# incase you don't have .env file
cp ./.env.example ./.env
# incase you don't have a local build yet
ionic serve build --prod

npm run test +
+ +
ionic build --prod
cp -r ./www ./serve
npm run dev:share +
+ +

Open xcode

ionic cap copy && +ionic cap update && +ionic cap open ios &&

+

Android

npx cap copy android && +ionic cap sync android

+
git tag stable
+
+ +

For major changes, please open an issue first to discuss what you would like to change.

+

Please make sure to update tests as appropriate.

+
diff --git a/gabinete-digital-fo.code-workspace b/gabinete-digital-fo.code-workspace index adcf73350..a43274b99 100644 --- a/gabinete-digital-fo.code-workspace +++ b/gabinete-digital-fo.code-workspace @@ -4,28 +4,6 @@ "name": "gabinete-digital-fo", "path": "." }, - { - "name": "socket-server", - "path": "../socket-server" - }, - { - "name": "logs", - "path": "../logs" - }, - { - "name": "opentelemetry-js-main", - "path": "../../../Downloads/opentelemetry-js-main/opentelemetry-js-main" - }, - { - "name": "nestjs-microservice-boilerplate-api-master", - "path": "../../../Downloads/nestjs-microservice-boilerplate-api-master" - }, - { - "path": "../../../Downloads/swiper-master" - }, - { - "path": "../sentry" - } ], "settings": { "nuxt.isNuxtApp": false, diff --git a/jest-puppeteer.config.js b/jest-puppeteer.config.js deleted file mode 100644 index b2d30d9a6..000000000 --- a/jest-puppeteer.config.js +++ /dev/null @@ -1,28 +0,0 @@ -// jest-puppeteer.config.js -require('dotenv').config() - -const port = process.env.PUPPETEER_PORT -const host = process.env.PUPPETEER_HOST -const openChrome = process.env.PUPPETEER_OPEN_CHROME -const chromPath = process.env.PUPPETEER_CHROME_PATH - -module.exports = { - server: { - command: ` `, - port: port, - launchTimeout: 10000 - }, - launch: { - dumpio: true, - headless: openChrome != 'true', - product: 'chrome', - args: [`--window-size=1200,1080`], - defaultViewport: { - width:1200, - height:1080 - }, - // executablePath: chromPath - }, - browserContext: 'default', - -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 883619c02..0fc37764a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -99,19 +99,17 @@ "@ngx-translate/core": "^13.0.0", "@ngxs/store": "^3.8.2", "@opentelemetry/exporter-metrics-otlp-http": "^0.52.1", - "@opentelemetry/exporter-otlp-http": "^0.26.0", "@opentelemetry/exporter-trace-otlp-http": "^0.52.1", - "@opentelemetry/exporter-trace-otlp-proto": "^0.48.0", - "@opentelemetry/exporter-zipkin": "^1.25.0", - "@opentelemetry/resources": "^1.25.0", + "@opentelemetry/exporter-zipkin": "^1.25.1", + "@opentelemetry/resources": "^1.25.1", "@opentelemetry/sdk-metrics": "^1.25.1", - "@opentelemetry/sdk-trace-base": "^1.25.0", - "@opentelemetry/sdk-trace-web": "^1.25.0", - "@opentelemetry/semantic-conventions": "^1.25.0", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/sdk-trace-web": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", "@pdftron/pdfjs-express": "^8.0.1", "@sentry/angular": "^7.73.0", "@sentry/capacitor": "^0.14.0", - "@sentry/tracing": "^7.114.0", + "@sentry/cli": "^2.33.1", "@teamhive/capacitor-video-recorder": "^5.0.0", "@tinymce/tinymce-angular": "^4.2.4", "@types/jest-environment-puppeteer": "^5.0.3", @@ -145,11 +143,13 @@ "cross-env": "^7.0.3", "crypto-js": "^4.0.0", "date-fns": "^2.17.0", + "deep-object-diff": "^1.1.9", "depd": "^2.0.0", "dexie": "^4.0.7", "dompurify": "^3.0.6", "dotenv": "^10.0.0", "duration": "^0.2.2", + "fake-indexeddb": "^6.0.0", "faker": "^5.5.3", "fifo-process-queue": "^1.2.0", "file-saver": "^2.0.5", @@ -170,7 +170,7 @@ "ionicons": "^5.5.3", "jest-puppeteer": "^7.0.1", "lite-server": "^2.6.1", - "log4js": "^6.9.1", + "luxon": "^3.4.4", "minisearch": "^6.0.1", "moment": "^2.29.3", "neverthrow": "^6.1.0", @@ -181,6 +181,7 @@ "ngx-extended-pdf-viewer": "^13.0.0-alpha.2", "ngx-image-compress": "^11.0.3", "ngx-image-cropper": "^5.0.1", + "ngx-indexed-db": "^18.0.0", "ngx-letters-avatar": "^1.0.2", "ngx-socket-io": "^3.2.0", "path-browserify": "^1.0.1", @@ -199,12 +200,13 @@ "ts-jest": "^27.0.3", "ts-jest-puppeteer": "^0.0.5", "tslib": "^2.0.0", + "typedoc": "^0.26.5", "uuidv4": "^6.2.11", "videogular2": "^7.0.2", "webpack": "^5.88.2", "wordcloud": "^1.1.2", - "ws": "^7.4.6", - "zod": "^3.22.2", + "ws": "^7.5.9", + "zod": "^3.23.8", "zone.js": "~0.11.4" }, "devDependencies": { @@ -579,6 +581,22 @@ "node": ">=6.9.0" } }, + "node_modules/@angular-devkit/build-angular/node_modules/@ngtools/webpack": { + "version": "12.2.18", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.18.tgz", + "integrity": "sha512-6h/QSG6oZDs2BGfrozdOKqtM5daoCu05q+0gyb3owHz1u9FtMeXXKQ3sQfyFC/GNT3dTMlH6YFxsJPvMPwuy9A==", + "dev": true, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^12.0.0", + "typescript": "~4.2.3 || ~4.3.2", + "webpack": "^5.30.0" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/@types/estree": { "version": "0.0.50", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", @@ -7606,22 +7624,6 @@ "rxjs": "^6.5.3" } }, - "node_modules/@ngtools/webpack": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.18.tgz", - "integrity": "sha512-6h/QSG6oZDs2BGfrozdOKqtM5daoCu05q+0gyb3owHz1u9FtMeXXKQ3sQfyFC/GNT3dTMlH6YFxsJPvMPwuy9A==", - "dev": true, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^12.0.0", - "typescript": "~4.2.3 || ~4.3.2", - "webpack": "^5.30.0" - } - }, "node_modules/@ngx-translate/core": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-13.0.0.tgz", @@ -7759,9 +7761,9 @@ } }, "node_modules/@opentelemetry/api": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", - "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "engines": { "node": ">=8.0.0" } @@ -7777,24 +7779,12 @@ "node": ">=14" } }, - "node_modules/@opentelemetry/api-metrics": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.26.0.tgz", - "integrity": "sha512-idDSUTx+LRwJiHhVHhdh45SWow5u9lKNDROKu5AMzsIVPI29utH5FfT9vor8qMM6blxWWvlT22HUNdNMWqUQfQ==", - "deprecated": "Please use @opentelemetry/api >= 1.3.0", - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, "node_modules/@opentelemetry/core": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.0.tgz", - "integrity": "sha512-n0B3s8rrqGrasTgNkXLKXzN0fXo+6IYP7M5b7AMsrZM33f/y6DS6kJ0Btd7SespASWq8bgL3taLo0oe0vB52IQ==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.0" + "@opentelemetry/semantic-conventions": "1.25.1" }, "engines": { "node": ">=14" @@ -7821,117 +7811,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-otlp-http": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-otlp-http/-/exporter-otlp-http-0.26.0.tgz", - "integrity": "sha512-V3FcUEIVDZ66b3/6vjSBjwwozf/XV5eUXuELNzN8PAvGZH4mw36vaWlaxnGEV8HaZb2hbu2KbRpcOzqxx3tFDA==", - "deprecated": "Please use trace and metric specific exporters @opentelemetry/exporter-trace-otlp-http and @opentelemetry/exporter-metrics-otlp-http", - "dependencies": { - "@opentelemetry/api-metrics": "0.26.0", - "@opentelemetry/core": "1.0.0", - "@opentelemetry/resources": "1.0.0", - "@opentelemetry/sdk-metrics-base": "0.26.0", - "@opentelemetry/sdk-trace-base": "1.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/exporter-otlp-http/node_modules/@opentelemetry/core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.0.tgz", - "integrity": "sha512-1+qvKilADnSFW4PiXy+f7D22pvfGVxepZ69GcbF8cTcbQTUt7w63xEBWn5f5j92x9I3c0sqbW1RUx5/a4wgzxA==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/exporter-otlp-http/node_modules/@opentelemetry/resources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.0.tgz", - "integrity": "sha512-ORP8F2LLcJEm5M3H24RmdlMdiDc70ySPushpkrAW34KZGdZXwkrFoFXZhhs5MUxPT+fLrTuBafXxZVr8eHtFuQ==", - "dependencies": { - "@opentelemetry/core": "1.0.0", - "@opentelemetry/semantic-conventions": "1.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/exporter-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.0.tgz", - "integrity": "sha512-/rXoyQlDlJTJ4SOVAbP0Gpj89B8oZ2hJApYG2Dq5klkgFAtDifN8271TIzwtM8/ET8HUhgx9eyoUJi42LhIesg==", - "dependencies": { - "@opentelemetry/core": "1.0.0", - "@opentelemetry/resources": "1.0.0", - "@opentelemetry/semantic-conventions": "1.0.0", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/exporter-otlp-http/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.0.tgz", - "integrity": "sha512-XCZ6ZSmc8FOspxKUU+Ow9UtJeSSRcS5rFBYGpjzix02U2v+X9ofjOjgNRnpvxlSvkccYIhdTuwcvNskmZ46SeA==", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@opentelemetry/exporter-trace-otlp-http": { "version": "0.52.1", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.52.1.tgz", @@ -7950,220 +7829,19 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { + "node_modules/@opentelemetry/exporter-zipkin": { "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz", + "integrity": "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==", "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "engines": { "node": ">=14" }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.48.0.tgz", - "integrity": "sha512-hVXr/8DYlAKAzQYMsCf3ZsGweS6NTK3IHIEqmLokJZYcvJQBEEazeAdISfrL/utWnapg1Qnpw8u+W6SpxNzmTw==", - "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-exporter-base": "0.48.0", - "@opentelemetry/otlp-proto-exporter-base": "0.48.0", - "@opentelemetry/otlp-transformer": "0.48.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/api-logs": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.48.0.tgz", - "integrity": "sha512-1/aMiU4Eqo3Zzpfwu51uXssp5pzvHFObk8S9pKAiXb1ne8pvg1qxBQitYL1XUiAMEXFzgjaidYG2V6624DRhhw==", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.21.0.tgz", - "integrity": "sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.21.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.48.0.tgz", - "integrity": "sha512-T4LJND+Ugl87GUONoyoQzuV9qCn4BFIPOnCH1biYqdGhc2JahjuLqVD9aefwLzGBW638iLAo88Lh68h2F1FLiA==", - "dependencies": { - "@opentelemetry/core": "1.21.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-transformer": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.48.0.tgz", - "integrity": "sha512-yuoS4cUumaTK/hhxW3JUy3wl2U4keMo01cFDrUOmjloAdSSXvv1zyQ920IIH4lymp5Xd21Dj2/jq2LOro56TJg==", - "dependencies": { - "@opentelemetry/api-logs": "0.48.0", - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-logs": "0.48.0", - "@opentelemetry/sdk-metrics": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.8.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.21.0.tgz", - "integrity": "sha512-1Z86FUxPKL6zWVy2LdhueEGl9AHDJcx+bvHStxomruz6Whd02mE3lNUMjVJ+FGRoktx/xYQcxccYb03DiUP6Yw==", - "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/semantic-conventions": "1.21.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-logs": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.48.0.tgz", - "integrity": "sha512-lRcA5/qkSJuSh4ItWCddhdn/nNbVvnzM+cm9Fg1xpZUeTeozjJDBcHnmeKoOaWRnrGYBdz6UTY6bynZR9aBeAA==", - "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.8.0", - "@opentelemetry/api-logs": ">=0.39.1" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-metrics": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.21.0.tgz", - "integrity": "sha512-on1jTzIHc5DyWhRP+xpf+zrgrREXcHBH4EDAfaB5mIG7TWpKxNXooQ1JCylaPsswZUv4wGnVTinr4HrBdGARAQ==", - "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.8.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.21.0.tgz", - "integrity": "sha512-yrElGX5Fv0umzp8Nxpta/XqU71+jCAyaLk34GmBzNcrW43nqbrqvdPs4gj4MVy/HcTjr6hifCDCYA3rMkajxxA==", - "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/semantic-conventions": "1.21.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz", - "integrity": "sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-zipkin": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.0.tgz", - "integrity": "sha512-nnhY0e5DHg8BfUSNCQZoGZnGeqz+zMTeEUOh1dfgtaXmF99uM0QPuTa1i2lH+eZqebP8w1WDWZlewu9FUlHqIg==", - "dependencies": { - "@opentelemetry/core": "1.25.0", - "@opentelemetry/resources": "1.25.0", - "@opentelemetry/sdk-trace-base": "1.25.0", - "@opentelemetry/semantic-conventions": "1.25.0" - }, - "engines": { - "node": ">=14" - }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } @@ -8183,121 +7861,6 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/otlp-proto-exporter-base": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.48.0.tgz", - "integrity": "sha512-14GSTvPZPfrWsB54fYMGb8v+Uge5xGXyz0r2rf4SzcRnO2hXCPHEuL3yyL50emaKPAY+fj29Dm0bweawe8UA6A==", - "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-exporter-base": "0.48.0", - "protobufjs": "^7.2.3" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/otlp-proto-exporter-base/node_modules/@opentelemetry/core": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.21.0.tgz", - "integrity": "sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.21.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" - } - }, - "node_modules/@opentelemetry/otlp-proto-exporter-base/node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.48.0.tgz", - "integrity": "sha512-T4LJND+Ugl87GUONoyoQzuV9qCn4BFIPOnCH1biYqdGhc2JahjuLqVD9aefwLzGBW638iLAo88Lh68h2F1FLiA==", - "dependencies": { - "@opentelemetry/core": "1.21.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/otlp-proto-exporter-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz", - "integrity": "sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/otlp-proto-exporter-base/node_modules/@types/node": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", - "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", - "dependencies": { - "undici-types": "~6.13.0" - } - }, - "node_modules/@opentelemetry/otlp-proto-exporter-base/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/@opentelemetry/otlp-proto-exporter-base/node_modules/protobufjs": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", - "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@opentelemetry/otlp-proto-exporter-base/node_modules/undici-types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" - }, "node_modules/@opentelemetry/otlp-transformer": { "version": "0.52.1", "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz", @@ -8318,63 +7881,10 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/otlp-transformer/node_modules/@types/node": { - "version": "20.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.6.tgz", - "integrity": "sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw==", + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -8408,12 +7918,12 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.0.tgz", - "integrity": "sha512-iHjydPMYJ+Li1auveJCq2rp5U2h6Mhq8BidiyE0jfVlDTFyR1ny8AfJHfmFzJ/RAM8vT8L7T21kcmGybxZC7lQ==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", + "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", "dependencies": { - "@opentelemetry/core": "1.25.0", - "@opentelemetry/semantic-conventions": "1.25.0" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" }, "engines": { "node": ">=14" @@ -8438,43 +7948,6 @@ "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/sdk-metrics": { "version": "1.25.1", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", @@ -8491,82 +7964,13 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-metrics-base": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.26.0.tgz", - "integrity": "sha512-PbJsso7Vy/CLATAOyXbt/VP7ZQ2QYnvlq28lhOWaLPw8aqLogMBvidNGRrt7rF4/hfzLT6pMgpAAcit2C/nUMA==", - "deprecated": "Please use @opentelemetry/sdk-metrics", - "dependencies": { - "@opentelemetry/api-metrics": "0.26.0", - "@opentelemetry/core": "1.0.0", - "@opentelemetry/resources": "1.0.0", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/sdk-metrics-base/node_modules/@opentelemetry/core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.0.tgz", - "integrity": "sha512-1+qvKilADnSFW4PiXy+f7D22pvfGVxepZ69GcbF8cTcbQTUt7w63xEBWn5f5j92x9I3c0sqbW1RUx5/a4wgzxA==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=8.5.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/sdk-metrics-base/node_modules/@opentelemetry/resources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.0.tgz", - "integrity": "sha512-ORP8F2LLcJEm5M3H24RmdlMdiDc70ySPushpkrAW34KZGdZXwkrFoFXZhhs5MUxPT+fLrTuBafXxZVr8eHtFuQ==", - "dependencies": { - "@opentelemetry/core": "1.0.0", - "@opentelemetry/semantic-conventions": "1.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.2" - } - }, - "node_modules/@opentelemetry/sdk-metrics-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.0.tgz", - "integrity": "sha512-XCZ6ZSmc8FOspxKUU+Ow9UtJeSSRcS5rFBYGpjzix02U2v+X9ofjOjgNRnpvxlSvkccYIhdTuwcvNskmZ46SeA==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": { + "node_modules/@opentelemetry/sdk-trace-base": { "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", "dependencies": { "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "engines": { @@ -8576,38 +7980,14 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.0.tgz", - "integrity": "sha512-6+g2fiRQUG39guCsKVeY8ToeuUf3YUnPkN6DXRA1qDmFLprlLvZm9cS6+chgbW70cZJ406FTtSCDnJwxDC5sGQ==", - "dependencies": { - "@opentelemetry/core": "1.25.0", - "@opentelemetry/resources": "1.25.0", - "@opentelemetry/semantic-conventions": "1.25.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/sdk-trace-web": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.25.0.tgz", - "integrity": "sha512-TAWRDRiVOeliE1A99z8idWb4pwEKKY9Vj5aTpLtrF4cvPOl0mPg3ZczvOw/HnpfRsWY0Ra/J3vS5uFSpoqPwEA==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.25.1.tgz", + "integrity": "sha512-SS6JaSkHngcBCNdWGthzcvaKGRnDw2AeP57HyTEileLToJ7WLMeV+064iRlVyoT4+e77MRp2T2dDSrmaUyxoNg==", "dependencies": { - "@opentelemetry/core": "1.25.0", - "@opentelemetry/sdk-trace-base": "1.25.0", - "@opentelemetry/semantic-conventions": "1.25.0" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" }, "engines": { "node": ">=14" @@ -8617,9 +7997,9 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.0.tgz", - "integrity": "sha512-M+kkXKRAIAiAP6qYyesfrC5TOmDpDVtsxuGfPcqd9B/iBrac+E14jYwrgm0yZBUIbIP2OnqC3j+UgkXLm1vxUQ==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", "engines": { "node": ">=14" } @@ -8865,22 +8245,10 @@ } } }, - "node_modules/@sentry/capacitor/node_modules/@sentry/tracing": { - "version": "7.73.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.73.0.tgz", - "integrity": "sha512-LOQR6Hkc8ZoflCXWtMlxTbCBEwv0MSOr3vesnRsmlFG8TW1YUIneU+wKnVxToWAZ8fq+6ubclnuIUKHfqTk/Tg==", - "dependencies": { - "@sentry-internal/tracing": "7.73.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@sentry/cli": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.32.2.tgz", - "integrity": "sha512-m/6Z3FWu+rTd8jepVlJPKQhvbT8vCjt0N7BSWZiEUVW/8mhwAYJiwO0b+Ch/u4IqbBg1dp3805q5TFPl4AdrNw==", - "dev": true, + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.33.1.tgz", + "integrity": "sha512-dUlZ4EFh98VFRPJ+f6OW3JEYQ7VvqGNMa0AMcmvk07ePNeK/GicAWmSQE4ZfJTTl80ul6HZw1kY01fGQOQlVRA==", "hasInstallScript": true, "dependencies": { "https-proxy-agent": "^5.0.0", @@ -8896,20 +8264,19 @@ "node": ">= 10" }, "optionalDependencies": { - "@sentry/cli-darwin": "2.32.2", - "@sentry/cli-linux-arm": "2.32.2", - "@sentry/cli-linux-arm64": "2.32.2", - "@sentry/cli-linux-i686": "2.32.2", - "@sentry/cli-linux-x64": "2.32.2", - "@sentry/cli-win32-i686": "2.32.2", - "@sentry/cli-win32-x64": "2.32.2" + "@sentry/cli-darwin": "2.33.1", + "@sentry/cli-linux-arm": "2.33.1", + "@sentry/cli-linux-arm64": "2.33.1", + "@sentry/cli-linux-i686": "2.33.1", + "@sentry/cli-linux-x64": "2.33.1", + "@sentry/cli-win32-i686": "2.33.1", + "@sentry/cli-win32-x64": "2.33.1" } }, "node_modules/@sentry/cli-darwin": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.32.2.tgz", - "integrity": "sha512-GDtePIavx3FKSRowdPdtIssahn46MfFFYNN+s7a9MjlhFwJtvC9A1bSDw7ksEtDaQolepUwmLPHaVe19y0T/zw==", - "dev": true, + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.33.1.tgz", + "integrity": "sha512-+4/VIx/E1L2hChj5nGf5MHyEPHUNHJ/HoG5RY+B+vyEutGily1c1+DM2bum7RbD0xs6wKLIyup5F02guzSzG8A==", "optional": true, "os": [ "darwin" @@ -8919,13 +8286,12 @@ } }, "node_modules/@sentry/cli-linux-arm": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.32.2.tgz", - "integrity": "sha512-u9s08wr8bDDqsAl6pk9iGGlOHtU+T8btU6voNKy71QzeIBpV9c8VVk/OnmP9aswp/ea4NY416yjnzcTvCrFKAw==", + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.33.1.tgz", + "integrity": "sha512-zbxEvQju+tgNvzTOt635le4kS/Fbm2XC2RtYbCTs034Vb8xjrAxLnK0z1bQnStUV8BkeBHtsNVrG+NSQDym2wg==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux", @@ -8936,13 +8302,12 @@ } }, "node_modules/@sentry/cli-linux-arm64": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.32.2.tgz", - "integrity": "sha512-VECLVC1rLyvXk6rTVUfmfs4vhANjMgm4BVKGlA3rydmf2PJw2/NfipH3KeyijdE2vEoyLri+/6HH883pP0iniQ==", + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.33.1.tgz", + "integrity": "sha512-DbGV56PRKOLsAZJX27Jt2uZ11QfQEMmWB4cIvxkKcFVE+LJP4MVA+MGGRUL6p+Bs1R9ZUuGbpKGtj0JiG6CoXw==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux", @@ -8953,14 +8318,13 @@ } }, "node_modules/@sentry/cli-linux-i686": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.32.2.tgz", - "integrity": "sha512-XhofQz32OqLrQK1DEOsryhT7d29Df6VkccvxueGoIt2gpXEXtgRczsUwZjZqquDdkNCt+HPj9eUGcj8pY8JkmQ==", + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.33.1.tgz", + "integrity": "sha512-g2LS4oPXkPWOfKWukKzYp4FnXVRRSwBxhuQ9eSw2peeb58ZIObr4YKGOA/8HJRGkooBJIKGaAR2mH2Pk1TKaiA==", "cpu": [ "x86", "ia32" ], - "dev": true, "optional": true, "os": [ "linux", @@ -8971,13 +8335,12 @@ } }, "node_modules/@sentry/cli-linux-x64": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.32.2.tgz", - "integrity": "sha512-anyng4Qqt7zX4ZY4IzDH1RJWAVZNBe6sUHcuciNy7giCU3B4/XnxAHlwYmBSN5txpaumsWdstPgRKEUJG6AOSA==", + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.33.1.tgz", + "integrity": "sha512-IV3dcYV/ZcvO+VGu9U6kuxSdbsV2kzxaBwWUQxtzxJ+cOa7J8Hn1t0koKGtU53JVZNBa06qJWIcqgl4/pCuKIg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux", @@ -8988,14 +8351,13 @@ } }, "node_modules/@sentry/cli-win32-i686": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.32.2.tgz", - "integrity": "sha512-/auqx7QXG7F556fNK7vaB26pX7Far1CQMfI65iV4u/VWg6gV2WfvJWXB4iowhjqkYv56sZ+zOymLkEVF0R8wtg==", + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.33.1.tgz", + "integrity": "sha512-F7cJySvkpzIu7fnLKNHYwBzZYYwlhoDbAUnaFX0UZCN+5DNp/5LwTp37a5TWOsmCaHMZT4i9IO4SIsnNw16/zQ==", "cpu": [ "x86", "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -9005,13 +8367,12 @@ } }, "node_modules/@sentry/cli-win32-x64": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.32.2.tgz", - "integrity": "sha512-w7hW2sEWVYQquqdILBSFhcVW+HdoyLqVPPkLPAXRSLTwBnuni9nQEIdXr0h/7db+K3cm7PvWndp5ixVyswLHZA==", + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.33.1.tgz", + "integrity": "sha512-8VyRoJqtb2uQ8/bFRKNuACYZt7r+Xx0k2wXRGTyH05lCjAiVIXn7DiS2BxHFty7M1QEWUCMNsb/UC/x/Cu2wuA==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -9178,6 +8539,14 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/@shikijs/core": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.12.1.tgz", + "integrity": "sha512-biCz/mnkMktImI6hMfMX3H9kOeqsInxWEyCHbSlL8C/2TR1FqfmGxTLRNwYCKsyCyxWLbB8rEqXRVZuyxuLFmA==", + "dependencies": { + "@types/hast": "^3.0.4" + } + }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -9451,6 +8820,14 @@ "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.40.tgz", "integrity": "sha512-VbjwR1fhsn2h2KXAY4oy1fm7dCxaKy0D+deTb8Ilc3Eo3rc5+5eA4rfYmZaHgNJKxVyI0f6WIXzO2zLkVmQPHA==" }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -9611,6 +8988,11 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, "node_modules/@types/uuid": { "version": "8.3.1", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", @@ -15327,6 +14709,11 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, + "node_modules/deep-object-diff": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz", + "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==" + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -17468,6 +16855,14 @@ "node >=0.6.0" ] }, + "node_modules/fake-indexeddb": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-6.0.0.tgz", + "integrity": "sha512-YEboHE5VfopUclOck7LncgIqskAqnv4q0EWbYCaxKKjAvO93c+TJIaBuGy8CBFdbg9nKdpN3AuPRwVBJ4k7NrQ==", + "engines": { + "node": ">=18" + } + }, "node_modules/faker": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", @@ -26987,6 +26382,14 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha512-8ZmlJFVK9iCmtLz19HpSsR8HaAMWBT284VMNednLwlIMDP2hJDCIhUp0IZ2xUcZ+Ob6BM0VvCSJwzASDM45NLQ==" }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, "node_modules/listr2": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", @@ -27396,6 +26799,19 @@ "node": ">=10" } }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + }, + "node_modules/luxon": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", + "engines": { + "node": ">=12" + } + }, "node_modules/macos-release": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", @@ -27507,6 +26923,38 @@ "node": ">=0.10.0" } }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/md5-file": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", @@ -27535,6 +26983,11 @@ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -28952,6 +28405,18 @@ "@angular/platform-browser": ">=10.0.0" } }, + "node_modules/ngx-indexed-db": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/ngx-indexed-db/-/ngx-indexed-db-18.0.0.tgz", + "integrity": "sha512-G2fUZZOHdFn8+g4fNtTQPX0Hf5huEBsGNvbjhXX8gbeoetVI8i7mPPVxnLwHsG/9WtXlW2690U5JQCptUJQMlA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": ">=10.0.6", + "@angular/core": ">=10.0.6" + } + }, "node_modules/ngx-letters-avatar": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/ngx-letters-avatar/-/ngx-letters-avatar-1.0.2.tgz", @@ -33159,6 +32624,14 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "engines": { + "node": ">=6" + } + }, "node_modules/pupa": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", @@ -35403,6 +34876,15 @@ "optional": true, "peer": true }, + "node_modules/shiki": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.12.1.tgz", + "integrity": "sha512-nwmjbHKnOYYAe1aaQyEBHvQymJgfm86ZSS7fT8OaPRr4sbAcBNz7PbfAikMEFSDQ6se2j2zobkXvVKcBOm0ysg==", + "dependencies": { + "@shikijs/core": "1.12.1", + "@types/hast": "^3.0.4" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -42659,6 +42141,60 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typedoc": { + "version": "0.26.5", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.5.tgz", + "integrity": "sha512-Vn9YKdjKtDZqSk+by7beZ+xzkkr8T8CYoiasqyt4TTRFy5+UHzL/mF/o4wGBjRF+rlWQHDb0t6xCpA3JNL5phg==", + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.9.1", + "yaml": "^2.4.5" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typedoc/node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/typescript": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", @@ -42690,6 +42226,11 @@ "node": "*" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + }, "node_modules/uglify-js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.3.5.tgz", @@ -44852,9 +44393,9 @@ } }, "node_modules/ws": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", - "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "engines": { "node": ">=8.3.0" }, @@ -45076,9 +44617,9 @@ } }, "node_modules/zod": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.2.tgz", - "integrity": "sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==", + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -45327,6 +44868,13 @@ "@babel/types": "^7.14.5" } }, + "@ngtools/webpack": { + "version": "12.2.18", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.18.tgz", + "integrity": "sha512-6h/QSG6oZDs2BGfrozdOKqtM5daoCu05q+0gyb3owHz1u9FtMeXXKQ3sQfyFC/GNT3dTMlH6YFxsJPvMPwuy9A==", + "dev": true, + "requires": {} + }, "@types/estree": { "version": "0.0.50", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", @@ -50546,13 +50094,6 @@ "tslib": "^2.0.0" } }, - "@ngtools/webpack": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.18.tgz", - "integrity": "sha512-6h/QSG6oZDs2BGfrozdOKqtM5daoCu05q+0gyb3owHz1u9FtMeXXKQ3sQfyFC/GNT3dTMlH6YFxsJPvMPwuy9A==", - "dev": true, - "requires": {} - }, "@ngx-translate/core": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-13.0.0.tgz", @@ -50659,9 +50200,9 @@ } }, "@opentelemetry/api": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", - "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" }, "@opentelemetry/api-logs": { "version": "0.52.1", @@ -50671,18 +50212,12 @@ "@opentelemetry/api": "^1.0.0" } }, - "@opentelemetry/api-metrics": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.26.0.tgz", - "integrity": "sha512-idDSUTx+LRwJiHhVHhdh45SWow5u9lKNDROKu5AMzsIVPI29utH5FfT9vor8qMM6blxWWvlT22HUNdNMWqUQfQ==", - "requires": {} - }, "@opentelemetry/core": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.0.tgz", - "integrity": "sha512-n0B3s8rrqGrasTgNkXLKXzN0fXo+6IYP7M5b7AMsrZM33f/y6DS6kJ0Btd7SespASWq8bgL3taLo0oe0vB52IQ==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", "requires": { - "@opentelemetry/semantic-conventions": "1.25.0" + "@opentelemetry/semantic-conventions": "1.25.1" } }, "@opentelemetry/exporter-metrics-otlp-http": { @@ -50695,78 +50230,6 @@ "@opentelemetry/otlp-transformer": "0.52.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-metrics": "1.25.1" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.25.1" - } - }, - "@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "requires": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==" - } - } - }, - "@opentelemetry/exporter-otlp-http": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-otlp-http/-/exporter-otlp-http-0.26.0.tgz", - "integrity": "sha512-V3FcUEIVDZ66b3/6vjSBjwwozf/XV5eUXuELNzN8PAvGZH4mw36vaWlaxnGEV8HaZb2hbu2KbRpcOzqxx3tFDA==", - "requires": { - "@opentelemetry/api-metrics": "0.26.0", - "@opentelemetry/core": "1.0.0", - "@opentelemetry/resources": "1.0.0", - "@opentelemetry/sdk-metrics-base": "0.26.0", - "@opentelemetry/sdk-trace-base": "1.0.0" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.0.tgz", - "integrity": "sha512-1+qvKilADnSFW4PiXy+f7D22pvfGVxepZ69GcbF8cTcbQTUt7w63xEBWn5f5j92x9I3c0sqbW1RUx5/a4wgzxA==", - "requires": { - "@opentelemetry/semantic-conventions": "1.0.0", - "semver": "^7.3.5" - } - }, - "@opentelemetry/resources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.0.tgz", - "integrity": "sha512-ORP8F2LLcJEm5M3H24RmdlMdiDc70ySPushpkrAW34KZGdZXwkrFoFXZhhs5MUxPT+fLrTuBafXxZVr8eHtFuQ==", - "requires": { - "@opentelemetry/core": "1.0.0", - "@opentelemetry/semantic-conventions": "1.0.0" - } - }, - "@opentelemetry/sdk-trace-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.0.tgz", - "integrity": "sha512-/rXoyQlDlJTJ4SOVAbP0Gpj89B8oZ2hJApYG2Dq5klkgFAtDifN8271TIzwtM8/ET8HUhgx9eyoUJi42LhIesg==", - "requires": { - "@opentelemetry/core": "1.0.0", - "@opentelemetry/resources": "1.0.0", - "@opentelemetry/semantic-conventions": "1.0.0", - "lodash.merge": "^4.6.2" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.0.tgz", - "integrity": "sha512-XCZ6ZSmc8FOspxKUU+Ow9UtJeSSRcS5rFBYGpjzix02U2v+X9ofjOjgNRnpvxlSvkccYIhdTuwcvNskmZ46SeA==" - } } }, "@opentelemetry/exporter-trace-otlp-http": { @@ -50779,146 +50242,17 @@ "@opentelemetry/otlp-transformer": "0.52.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.25.1" - } - }, - "@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "requires": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - } - }, - "@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", - "requires": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==" - } - } - }, - "@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.48.0.tgz", - "integrity": "sha512-hVXr/8DYlAKAzQYMsCf3ZsGweS6NTK3IHIEqmLokJZYcvJQBEEazeAdISfrL/utWnapg1Qnpw8u+W6SpxNzmTw==", - "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-exporter-base": "0.48.0", - "@opentelemetry/otlp-proto-exporter-base": "0.48.0", - "@opentelemetry/otlp-transformer": "0.48.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0" - }, - "dependencies": { - "@opentelemetry/api-logs": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.48.0.tgz", - "integrity": "sha512-1/aMiU4Eqo3Zzpfwu51uXssp5pzvHFObk8S9pKAiXb1ne8pvg1qxBQitYL1XUiAMEXFzgjaidYG2V6624DRhhw==", - "requires": { - "@opentelemetry/api": "^1.0.0" - } - }, - "@opentelemetry/core": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.21.0.tgz", - "integrity": "sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==", - "requires": { - "@opentelemetry/semantic-conventions": "1.21.0" - } - }, - "@opentelemetry/otlp-exporter-base": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.48.0.tgz", - "integrity": "sha512-T4LJND+Ugl87GUONoyoQzuV9qCn4BFIPOnCH1biYqdGhc2JahjuLqVD9aefwLzGBW638iLAo88Lh68h2F1FLiA==", - "requires": { - "@opentelemetry/core": "1.21.0" - } - }, - "@opentelemetry/otlp-transformer": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.48.0.tgz", - "integrity": "sha512-yuoS4cUumaTK/hhxW3JUy3wl2U4keMo01cFDrUOmjloAdSSXvv1zyQ920IIH4lymp5Xd21Dj2/jq2LOro56TJg==", - "requires": { - "@opentelemetry/api-logs": "0.48.0", - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-logs": "0.48.0", - "@opentelemetry/sdk-metrics": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0" - } - }, - "@opentelemetry/resources": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.21.0.tgz", - "integrity": "sha512-1Z86FUxPKL6zWVy2LdhueEGl9AHDJcx+bvHStxomruz6Whd02mE3lNUMjVJ+FGRoktx/xYQcxccYb03DiUP6Yw==", - "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/semantic-conventions": "1.21.0" - } - }, - "@opentelemetry/sdk-logs": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.48.0.tgz", - "integrity": "sha512-lRcA5/qkSJuSh4ItWCddhdn/nNbVvnzM+cm9Fg1xpZUeTeozjJDBcHnmeKoOaWRnrGYBdz6UTY6bynZR9aBeAA==", - "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0" - } - }, - "@opentelemetry/sdk-metrics": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.21.0.tgz", - "integrity": "sha512-on1jTzIHc5DyWhRP+xpf+zrgrREXcHBH4EDAfaB5mIG7TWpKxNXooQ1JCylaPsswZUv4wGnVTinr4HrBdGARAQ==", - "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "lodash.merge": "^4.6.2" - } - }, - "@opentelemetry/sdk-trace-base": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.21.0.tgz", - "integrity": "sha512-yrElGX5Fv0umzp8Nxpta/XqU71+jCAyaLk34GmBzNcrW43nqbrqvdPs4gj4MVy/HcTjr6hifCDCYA3rMkajxxA==", - "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/semantic-conventions": "1.21.0" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz", - "integrity": "sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==" - } } }, "@opentelemetry/exporter-zipkin": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.0.tgz", - "integrity": "sha512-nnhY0e5DHg8BfUSNCQZoGZnGeqz+zMTeEUOh1dfgtaXmF99uM0QPuTa1i2lH+eZqebP8w1WDWZlewu9FUlHqIg==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz", + "integrity": "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==", "requires": { - "@opentelemetry/core": "1.25.0", - "@opentelemetry/resources": "1.25.0", - "@opentelemetry/sdk-trace-base": "1.25.0", - "@opentelemetry/semantic-conventions": "1.25.0" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" } }, "@opentelemetry/otlp-exporter-base": { @@ -50928,91 +50262,6 @@ "requires": { "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-transformer": "0.52.1" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.25.1" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==" - } - } - }, - "@opentelemetry/otlp-proto-exporter-base": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.48.0.tgz", - "integrity": "sha512-14GSTvPZPfrWsB54fYMGb8v+Uge5xGXyz0r2rf4SzcRnO2hXCPHEuL3yyL50emaKPAY+fj29Dm0bweawe8UA6A==", - "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-exporter-base": "0.48.0", - "protobufjs": "^7.2.3" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.21.0.tgz", - "integrity": "sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==", - "requires": { - "@opentelemetry/semantic-conventions": "1.21.0" - } - }, - "@opentelemetry/otlp-exporter-base": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.48.0.tgz", - "integrity": "sha512-T4LJND+Ugl87GUONoyoQzuV9qCn4BFIPOnCH1biYqdGhc2JahjuLqVD9aefwLzGBW638iLAo88Lh68h2F1FLiA==", - "requires": { - "@opentelemetry/core": "1.21.0" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz", - "integrity": "sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==" - }, - "@types/node": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", - "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", - "requires": { - "undici-types": "~6.13.0" - } - }, - "long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "protobufjs": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", - "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - } - }, - "undici-types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" - } } }, "@opentelemetry/otlp-transformer": { @@ -51029,42 +50278,10 @@ "protobufjs": "^7.3.0" }, "dependencies": { - "@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.25.1" - } - }, - "@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "requires": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - } - }, - "@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", - "requires": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==" - }, "@types/node": { - "version": "20.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.6.tgz", - "integrity": "sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw==", + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", "requires": { "undici-types": "~5.26.4" } @@ -51096,12 +50313,12 @@ } }, "@opentelemetry/resources": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.0.tgz", - "integrity": "sha512-iHjydPMYJ+Li1auveJCq2rp5U2h6Mhq8BidiyE0jfVlDTFyR1ny8AfJHfmFzJ/RAM8vT8L7T21kcmGybxZC7lQ==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", + "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", "requires": { - "@opentelemetry/core": "1.25.0", - "@opentelemetry/semantic-conventions": "1.25.0" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" } }, "@opentelemetry/sdk-logs": { @@ -51112,30 +50329,6 @@ "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.25.1" - } - }, - "@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "requires": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==" - } } }, "@opentelemetry/sdk-metrics": { @@ -51146,92 +50339,32 @@ "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "lodash.merge": "^4.6.2" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "requires": { - "@opentelemetry/semantic-conventions": "1.25.1" - } - }, - "@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "requires": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==" - } - } - }, - "@opentelemetry/sdk-metrics-base": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.26.0.tgz", - "integrity": "sha512-PbJsso7Vy/CLATAOyXbt/VP7ZQ2QYnvlq28lhOWaLPw8aqLogMBvidNGRrt7rF4/hfzLT6pMgpAAcit2C/nUMA==", - "requires": { - "@opentelemetry/api-metrics": "0.26.0", - "@opentelemetry/core": "1.0.0", - "@opentelemetry/resources": "1.0.0", - "lodash.merge": "^4.6.2" - }, - "dependencies": { - "@opentelemetry/core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.0.tgz", - "integrity": "sha512-1+qvKilADnSFW4PiXy+f7D22pvfGVxepZ69GcbF8cTcbQTUt7w63xEBWn5f5j92x9I3c0sqbW1RUx5/a4wgzxA==", - "requires": { - "@opentelemetry/semantic-conventions": "1.0.0", - "semver": "^7.3.5" - } - }, - "@opentelemetry/resources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.0.tgz", - "integrity": "sha512-ORP8F2LLcJEm5M3H24RmdlMdiDc70ySPushpkrAW34KZGdZXwkrFoFXZhhs5MUxPT+fLrTuBafXxZVr8eHtFuQ==", - "requires": { - "@opentelemetry/core": "1.0.0", - "@opentelemetry/semantic-conventions": "1.0.0" - } - }, - "@opentelemetry/semantic-conventions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.0.tgz", - "integrity": "sha512-XCZ6ZSmc8FOspxKUU+Ow9UtJeSSRcS5rFBYGpjzix02U2v+X9ofjOjgNRnpvxlSvkccYIhdTuwcvNskmZ46SeA==" - } } }, "@opentelemetry/sdk-trace-base": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.0.tgz", - "integrity": "sha512-6+g2fiRQUG39guCsKVeY8ToeuUf3YUnPkN6DXRA1qDmFLprlLvZm9cS6+chgbW70cZJ406FTtSCDnJwxDC5sGQ==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", "requires": { - "@opentelemetry/core": "1.25.0", - "@opentelemetry/resources": "1.25.0", - "@opentelemetry/semantic-conventions": "1.25.0" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" } }, "@opentelemetry/sdk-trace-web": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.25.0.tgz", - "integrity": "sha512-TAWRDRiVOeliE1A99z8idWb4pwEKKY9Vj5aTpLtrF4cvPOl0mPg3ZczvOw/HnpfRsWY0Ra/J3vS5uFSpoqPwEA==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.25.1.tgz", + "integrity": "sha512-SS6JaSkHngcBCNdWGthzcvaKGRnDw2AeP57HyTEileLToJ7WLMeV+064iRlVyoT4+e77MRp2T2dDSrmaUyxoNg==", "requires": { - "@opentelemetry/core": "1.25.0", - "@opentelemetry/sdk-trace-base": "1.25.0", - "@opentelemetry/semantic-conventions": "1.25.0" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" } }, "@opentelemetry/semantic-conventions": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.0.tgz", - "integrity": "sha512-M+kkXKRAIAiAP6qYyesfrC5TOmDpDVtsxuGfPcqd9B/iBrac+E14jYwrgm0yZBUIbIP2OnqC3j+UgkXLm1vxUQ==" + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==" }, "@pdftron/pdfjs-express": { "version": "8.1.0", @@ -51436,18 +50569,17 @@ } }, "@sentry/cli": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.32.2.tgz", - "integrity": "sha512-m/6Z3FWu+rTd8jepVlJPKQhvbT8vCjt0N7BSWZiEUVW/8mhwAYJiwO0b+Ch/u4IqbBg1dp3805q5TFPl4AdrNw==", - "dev": true, + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.33.1.tgz", + "integrity": "sha512-dUlZ4EFh98VFRPJ+f6OW3JEYQ7VvqGNMa0AMcmvk07ePNeK/GicAWmSQE4ZfJTTl80ul6HZw1kY01fGQOQlVRA==", "requires": { - "@sentry/cli-darwin": "2.32.2", - "@sentry/cli-linux-arm": "2.32.2", - "@sentry/cli-linux-arm64": "2.32.2", - "@sentry/cli-linux-i686": "2.32.2", - "@sentry/cli-linux-x64": "2.32.2", - "@sentry/cli-win32-i686": "2.32.2", - "@sentry/cli-win32-x64": "2.32.2", + "@sentry/cli-darwin": "2.33.1", + "@sentry/cli-linux-arm": "2.33.1", + "@sentry/cli-linux-arm64": "2.33.1", + "@sentry/cli-linux-i686": "2.33.1", + "@sentry/cli-linux-x64": "2.33.1", + "@sentry/cli-win32-i686": "2.33.1", + "@sentry/cli-win32-x64": "2.33.1", "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.7", "progress": "^2.0.3", @@ -51456,52 +50588,45 @@ } }, "@sentry/cli-darwin": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.32.2.tgz", - "integrity": "sha512-GDtePIavx3FKSRowdPdtIssahn46MfFFYNN+s7a9MjlhFwJtvC9A1bSDw7ksEtDaQolepUwmLPHaVe19y0T/zw==", - "dev": true, + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.33.1.tgz", + "integrity": "sha512-+4/VIx/E1L2hChj5nGf5MHyEPHUNHJ/HoG5RY+B+vyEutGily1c1+DM2bum7RbD0xs6wKLIyup5F02guzSzG8A==", "optional": true }, "@sentry/cli-linux-arm": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.32.2.tgz", - "integrity": "sha512-u9s08wr8bDDqsAl6pk9iGGlOHtU+T8btU6voNKy71QzeIBpV9c8VVk/OnmP9aswp/ea4NY416yjnzcTvCrFKAw==", - "dev": true, + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.33.1.tgz", + "integrity": "sha512-zbxEvQju+tgNvzTOt635le4kS/Fbm2XC2RtYbCTs034Vb8xjrAxLnK0z1bQnStUV8BkeBHtsNVrG+NSQDym2wg==", "optional": true }, "@sentry/cli-linux-arm64": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.32.2.tgz", - "integrity": "sha512-VECLVC1rLyvXk6rTVUfmfs4vhANjMgm4BVKGlA3rydmf2PJw2/NfipH3KeyijdE2vEoyLri+/6HH883pP0iniQ==", - "dev": true, + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.33.1.tgz", + "integrity": "sha512-DbGV56PRKOLsAZJX27Jt2uZ11QfQEMmWB4cIvxkKcFVE+LJP4MVA+MGGRUL6p+Bs1R9ZUuGbpKGtj0JiG6CoXw==", "optional": true }, "@sentry/cli-linux-i686": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.32.2.tgz", - "integrity": "sha512-XhofQz32OqLrQK1DEOsryhT7d29Df6VkccvxueGoIt2gpXEXtgRczsUwZjZqquDdkNCt+HPj9eUGcj8pY8JkmQ==", - "dev": true, + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.33.1.tgz", + "integrity": "sha512-g2LS4oPXkPWOfKWukKzYp4FnXVRRSwBxhuQ9eSw2peeb58ZIObr4YKGOA/8HJRGkooBJIKGaAR2mH2Pk1TKaiA==", "optional": true }, "@sentry/cli-linux-x64": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.32.2.tgz", - "integrity": "sha512-anyng4Qqt7zX4ZY4IzDH1RJWAVZNBe6sUHcuciNy7giCU3B4/XnxAHlwYmBSN5txpaumsWdstPgRKEUJG6AOSA==", - "dev": true, + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.33.1.tgz", + "integrity": "sha512-IV3dcYV/ZcvO+VGu9U6kuxSdbsV2kzxaBwWUQxtzxJ+cOa7J8Hn1t0koKGtU53JVZNBa06qJWIcqgl4/pCuKIg==", "optional": true }, "@sentry/cli-win32-i686": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.32.2.tgz", - "integrity": "sha512-/auqx7QXG7F556fNK7vaB26pX7Far1CQMfI65iV4u/VWg6gV2WfvJWXB4iowhjqkYv56sZ+zOymLkEVF0R8wtg==", - "dev": true, + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.33.1.tgz", + "integrity": "sha512-F7cJySvkpzIu7fnLKNHYwBzZYYwlhoDbAUnaFX0UZCN+5DNp/5LwTp37a5TWOsmCaHMZT4i9IO4SIsnNw16/zQ==", "optional": true }, "@sentry/cli-win32-x64": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.32.2.tgz", - "integrity": "sha512-w7hW2sEWVYQquqdILBSFhcVW+HdoyLqVPPkLPAXRSLTwBnuni9nQEIdXr0h/7db+K3cm7PvWndp5ixVyswLHZA==", - "dev": true, + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.33.1.tgz", + "integrity": "sha512-8VyRoJqtb2uQ8/bFRKNuACYZt7r+Xx0k2wXRGTyH05lCjAiVIXn7DiS2BxHFty7M1QEWUCMNsb/UC/x/Cu2wuA==", "optional": true }, "@sentry/core": { @@ -51639,6 +50764,14 @@ } } }, + "@shikijs/core": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.12.1.tgz", + "integrity": "sha512-biCz/mnkMktImI6hMfMX3H9kOeqsInxWEyCHbSlL8C/2TR1FqfmGxTLRNwYCKsyCyxWLbB8rEqXRVZuyxuLFmA==", + "requires": { + "@types/hast": "^3.0.4" + } + }, "@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -51888,6 +51021,14 @@ "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.40.tgz", "integrity": "sha512-VbjwR1fhsn2h2KXAY4oy1fm7dCxaKy0D+deTb8Ilc3Eo3rc5+5eA4rfYmZaHgNJKxVyI0f6WIXzO2zLkVmQPHA==" }, + "@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "requires": { + "@types/unist": "*" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -52049,6 +51190,11 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" }, + "@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, "@types/uuid": { "version": "8.3.1", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", @@ -56398,6 +55544,11 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, + "deep-object-diff": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz", + "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==" + }, "deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -58027,6 +57178,11 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz", "integrity": "sha512-6NW8DZ8pWBc5NbGYUiqqccj9dXnuSzilZYqprdKJBZsQodGH9IyUoFOGxIWVDcBzHMb8ET24aqx9p66tZEWZkA==" }, + "fake-indexeddb": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-6.0.0.tgz", + "integrity": "sha512-YEboHE5VfopUclOck7LncgIqskAqnv4q0EWbYCaxKKjAvO93c+TJIaBuGy8CBFdbg9nKdpN3AuPRwVBJ4k7NrQ==" + }, "faker": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", @@ -65491,6 +64647,14 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha512-8ZmlJFVK9iCmtLz19HpSsR8HaAMWBT284VMNednLwlIMDP2hJDCIhUp0IZ2xUcZ+Ob6BM0VvCSJwzASDM45NLQ==" }, + "linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "requires": { + "uc.micro": "^2.0.0" + } + }, "listr2": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", @@ -65812,6 +64976,16 @@ "yallist": "^4.0.0" } }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + }, + "luxon": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==" + }, "macos-release": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", @@ -65898,6 +65072,31 @@ "object-visit": "^1.0.0" } }, + "markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "requires": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + } + } + }, "md5-file": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", @@ -65920,6 +65119,11 @@ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, + "mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -67039,6 +66243,14 @@ "tslib": "^2.0.0" } }, + "ngx-indexed-db": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/ngx-indexed-db/-/ngx-indexed-db-18.0.0.tgz", + "integrity": "sha512-G2fUZZOHdFn8+g4fNtTQPX0Hf5huEBsGNvbjhXX8gbeoetVI8i7mPPVxnLwHsG/9WtXlW2690U5JQCptUJQMlA==", + "requires": { + "tslib": "^2.0.0" + } + }, "ngx-letters-avatar": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/ngx-letters-avatar/-/ngx-letters-avatar-1.0.2.tgz", @@ -70223,6 +69435,11 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==" + }, "pupa": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", @@ -71908,6 +71125,15 @@ "optional": true, "peer": true }, + "shiki": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.12.1.tgz", + "integrity": "sha512-nwmjbHKnOYYAe1aaQyEBHvQymJgfm86ZSS7fT8OaPRr4sbAcBNz7PbfAikMEFSDQ6se2j2zobkXvVKcBOm0ysg==", + "requires": { + "@shikijs/core": "1.12.1", + "@types/hast": "^3.0.4" + } + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -77584,6 +76810,41 @@ "is-typedarray": "^1.0.0" } }, + "typedoc": { + "version": "0.26.5", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.5.tgz", + "integrity": "sha512-Vn9YKdjKtDZqSk+by7beZ+xzkkr8T8CYoiasqyt4TTRFy5+UHzL/mF/o4wGBjRF+rlWQHDb0t6xCpA3JNL5phg==", + "requires": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.9.1", + "yaml": "^2.4.5" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==" + } + } + }, "typescript": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", @@ -77595,6 +76856,11 @@ "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", "dev": true }, + "uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + }, "uglify-js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.3.5.tgz", @@ -79326,9 +78592,9 @@ } }, "ws": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", - "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "requires": {} }, "xdg-basedir": { @@ -79488,9 +78754,9 @@ "dev": true }, "zod": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.2.tgz", - "integrity": "sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==" + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==" }, "zone.js": { "version": "0.11.4", diff --git a/package.json b/package.json index 354b3d941..c8349dcb1 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,8 @@ "docker:publish": "docker run -p gabinetedigital:0.0.0.1", "build:oapr": "ionic cap build android --configuration oapr", "build:dev": "ionic cap build android --configuration dev", - "sentry:releases": "sentry-cli releases new -p your-project-name $(git rev-parse HEAD) && sentry-cli releases set-commits --auto $(git rev-parse HEAD) && sentry-cli releases files $(git rev-parse HEAD) upload-sourcemaps ./www --rewrite && sentry-cli releases finalize $(git rev-parse HEAD)", - "build:sentry": "npm run build && npm run sentry:releases", + "doc:generate": "rimraf doc/TypeDoc && typedoc ", + "build-and-upload-sourcemaps": "ng build --prod && sentry-cli releases files $(jq -r .version package.json) upload-sourcemaps ./www --url-prefix '~' --rewrite", "sentry:sourcemaps": "sentry-cli sourcemaps inject --org equilibrium-sa --project oapr-gabinetedigital-fo ./www && sentry-cli sourcemaps upload --org equilibrium-sa --project oapr-gabinetedigital-fo ./www" }, "private": true, @@ -118,19 +118,17 @@ "@ngx-translate/core": "^13.0.0", "@ngxs/store": "^3.8.2", "@opentelemetry/exporter-metrics-otlp-http": "^0.52.1", - "@opentelemetry/exporter-otlp-http": "^0.26.0", "@opentelemetry/exporter-trace-otlp-http": "^0.52.1", - "@opentelemetry/exporter-trace-otlp-proto": "^0.48.0", - "@opentelemetry/exporter-zipkin": "^1.25.0", - "@opentelemetry/resources": "^1.25.0", + "@opentelemetry/exporter-zipkin": "^1.25.1", + "@opentelemetry/resources": "^1.25.1", "@opentelemetry/sdk-metrics": "^1.25.1", - "@opentelemetry/sdk-trace-base": "^1.25.0", - "@opentelemetry/sdk-trace-web": "^1.25.0", - "@opentelemetry/semantic-conventions": "^1.25.0", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/sdk-trace-web": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", "@pdftron/pdfjs-express": "^8.0.1", "@sentry/angular": "^7.73.0", "@sentry/capacitor": "^0.14.0", - "@sentry/tracing": "^7.114.0", + "@sentry/cli": "^2.33.1", "@teamhive/capacitor-video-recorder": "^5.0.0", "@tinymce/tinymce-angular": "^4.2.4", "@types/jest-environment-puppeteer": "^5.0.3", @@ -164,11 +162,13 @@ "cross-env": "^7.0.3", "crypto-js": "^4.0.0", "date-fns": "^2.17.0", + "deep-object-diff": "^1.1.9", "depd": "^2.0.0", "dexie": "^4.0.7", "dompurify": "^3.0.6", "dotenv": "^10.0.0", "duration": "^0.2.2", + "fake-indexeddb": "^6.0.0", "faker": "^5.5.3", "fifo-process-queue": "^1.2.0", "file-saver": "^2.0.5", @@ -189,7 +189,7 @@ "ionicons": "^5.5.3", "jest-puppeteer": "^7.0.1", "lite-server": "^2.6.1", - "log4js": "^6.9.1", + "luxon": "^3.4.4", "minisearch": "^6.0.1", "moment": "^2.29.3", "neverthrow": "^6.1.0", @@ -200,6 +200,7 @@ "ngx-extended-pdf-viewer": "^13.0.0-alpha.2", "ngx-image-compress": "^11.0.3", "ngx-image-cropper": "^5.0.1", + "ngx-indexed-db": "^18.0.0", "ngx-letters-avatar": "^1.0.2", "ngx-socket-io": "^3.2.0", "pdfjs": "^2.4.6", @@ -217,12 +218,13 @@ "ts-jest": "^27.0.3", "ts-jest-puppeteer": "^0.0.5", "tslib": "^2.0.0", + "typedoc": "^0.26.5", "uuidv4": "^6.2.11", "videogular2": "^7.0.2", "webpack": "^5.88.2", "wordcloud": "^1.1.2", - "ws": "^7.4.6", - "zod": "^3.22.2", + "ws": "^7.5.9", + "zod": "^3.23.8", "zone.js": "~0.11.4" }, "devDependencies": { diff --git a/src/app/animations/animations.ts b/src/app/animations/animations.ts deleted file mode 100644 index ce536f126..000000000 --- a/src/app/animations/animations.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Animation, AnimationController } from '@ionic/angular'; - -/* export const enterAnimation = (base) */ \ No newline at end of file diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index d9bd2a28d..aea2886e3 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -10,10 +10,6 @@ const routes = [ path: '', loadChildren: () => import('./home/home.module').then( m => m.HomePageModule) }, - { - path: 'empty-chat', - loadChildren: () => import('./shared/chat/empty-chat/empty-chat.module').then( m => m.EmptyChatPageModule) - }, { path: 'empty-container', loadChildren: () => import('./shared/empty-container/empty-container.module').then( m => m.EmptyContainerPageModule) @@ -30,10 +26,6 @@ const routes = [ path: 'document-detail', loadChildren: () => import('./modals/document-detail/document-detail.module').then( m => m.DocumentDetailPageModule) }, - { - path: 'edit-group', - loadChildren: () => import('./shared/chat/edit-group/edit-group.module').then( m => m.EditGroupPageModule) - }, { path: 'pedidos', loadChildren: () => import('./shared/gabinete-digital/pedidos/pedidos.module').then( m => m.PedidosPageModule) @@ -234,10 +226,6 @@ const routes = [ path: 'previewer', loadChildren: () => import('./modals/previewer/previewer.module').then( m => m.PreviewerPageModule) }, - { - path: 'set-room-owner', - loadChildren: () => import('./modals/set-room-owner/set-room-owner.module').then( m => m.SetRoomOwnerPageModule) - }, { path: 'diplomas-gerar', loadChildren: () => import('./shared/gabinete-digital/diplomas-gerar/diplomas-gerar.module').then( m => m.DiplomasGerarPageModule) @@ -246,26 +234,10 @@ const routes = [ path: 'diplomas-gerar-options', loadChildren: () => import('./shared/popover/diplomas-gerar-options/diplomas-gerar-options.module').then( m => m.DiplomasGerarOptionsPageModule) }, - { - path: 'chat-debugging', - loadChildren: () => import('./shared/popover/chat-debugging/chat-debugging.module').then( m => m.ChatDebuggingPageModule) - }, - { - path: 'chat-message-debugging', - loadChildren: () => import('./shared/popover/chat-message-debugging/chat-message-debugging.module').then( m => m.ChatMessageDebuggingPageModule) - }, - { - path: 'add-user', - loadChildren: () => import('./shared/chat/add-user/add-user.module').then( m => m.AddUserPageModule) - }, { path: 'information', loadChildren: () => import('./modals/information/information.module').then( m => m.InformationPageModule) }, - { - path: 'chat-options-popover', - loadChildren:() => import('./shared/popover/chat-options-popover/chat-options-popover.module').then( m => m.ChatOptionsPopoverPageModule) - }, { path: 'task-listt-header', loadChildren: () => import('./shared/gabinete-digital/generic/task-listt-header/task-listt-header.module').then( m => m.TaskListtHeaderPageModule) @@ -318,8 +290,6 @@ const routes = [ path: 'delete-event-recurrence', loadChildren: () => import('./modals/delete-event-recurrence/delete-event-recurrence.module').then( m => m.DeleteEventRecurrencePageModule) } - - /* path: 'chat', component: ChatPage diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 04671f596..91e612c38 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,19 +1,14 @@ import { Component } from '@angular/core'; - import { Platform } from '@ionic/angular'; import { StatusBar } from '@ionic-native/status-bar/ngx'; import { NgxMatDateFormats } from '@angular-material-components/datetime-picker'; import { NGX_MAT_DATE_FORMATS } from '@angular-material-components/datetime-picker'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; -import { InativityService } from "src/app/services/inativity.service"; import { ThemeService } from 'src/app/services/theme.service'; import { environment } from 'src/environments/environment'; import { Storage } from '@ionic/storage'; -import { ChatController } from './controller/chat'; import { register } from 'swiper/element/bundle'; import { DomSanitizer } from '@angular/platform-browser'; -import {ScreenOrientation} from "@ionic-native/screen-orientation/ngx"; - +import { ScreenOrientation } from "@ionic-native/screen-orientation/ngx"; const CUSTOM_DATE_FORMATS: NgxMatDateFormats = { parse: { dateInput: "YYYY-MMMM-DD HH:mm" @@ -41,15 +36,13 @@ export class AppComponent { private statusBar: StatusBar, public ThemeService: ThemeService, private storage: Storage, - private ChatSystemService: ChatSystemService, private sanitizer: DomSanitizer, - private screenOrientation: ScreenOrientation + private screenOrientation: ScreenOrientation, ) { window["sanitizer"] = this.sanitizer this.initializeApp(); this.storage.set('version', environment.version).then(() => {}) - ChatController.ChatSystemService = this.ChatSystemService } @@ -82,7 +75,7 @@ export class AppComponent { if(this.platform.is('ios')){ this.screenOrientation.lock('portrait') } else { - window.screen.orientation.lock('portrait'); + (window.screen.orientation as any).lock('portrait'); } } }); diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 25143448c..46ae5c12c 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -22,7 +22,6 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { CalendarModule, DateAdapter } from 'angular-calendar'; import { adapterFactory } from 'angular-calendar/date-adapters/date-fns'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ChatService } from './services/chat.service'; import {MatDatepickerModule} from '@angular/material/datepicker'; import {MAT_DATE_LOCALE} from '@angular/material/core'; import { Network } from '@ionic-native/network/ngx'; @@ -97,20 +96,20 @@ import { DiplomaOptionsPage } from './shared/popover/deploma-options/deploma-opt import { ImageCropperModule } from 'ngx-image-cropper'; import { metricsInterceptor, MetricsInterceptor } from './interceptors/metter.interceptor'; import { environment } from 'src/environments/environment'; -import { StoreModule } from '@ngrx/store'; import {MatMenuModule} from '@angular/material/menu'; import {MatIconModule} from '@angular/material/icon'; import { AngularCropperjsModule } from 'angular-cropperjs'; import { calendarReducer } from './module/agenda/data/data-source/agenda-memory-source.service'; -// import { ServiceWorkerModule } from '@angular/service-worker'; -// import { AngularFireModule } from '@angular/fire'; -// import { AngularFireMessagingModule } from '@angular/fire/messaging'; -// import { environment } from 'src/environments/environment'; +import { createAction, createReducer, on, StoreModule } from '@ngrx/store'; +import { ChatModule } from './module/chat/chat.module'; +import { openTelemetryLogging, OpenTelemetryLogging } from './services/monitoring/opentelemetry/logging'; -/* import { FCM } from '@ionic-native/fcm/ngx'; -import { FirebaseX } from '@ionic-native/firebase-x/ngx'; */ -//import { FCM } from 'cordova-plugin-fcm-with-dependecy-updated/ionic/ngx'; +import { registerLocaleData } from '@angular/common'; +import localePt from '@angular/common/locales/pt'; + +// Register the locale data +registerLocaleData(localePt, 'pt'); Sentry.init( { @@ -122,26 +121,55 @@ import { FirebaseX } from '@ionic-native/firebase-x/ngx'; */ // We recommend adjusting this value in production. tracesSampleRate: 1.0, integrations: [ - // new BrowserTracing({ - // tracingOrigins: ['localhost', 'https://gd-api.oapr.gov.ao/api/'], - // }) as Integration, + new BrowserTracing({ + tracingOrigins: ['localhost', 'https://gd-api.oapr.gov.ao/api/'], + }) as Integration, ], - beforeSend(event, hint) { - - // Modify the event here - // console.log('Intercepted Sentry event:', event); - - // Optionally, return null to drop the event or return the modified event + beforeSend(event) { + if (event.level === 'error') { + // console.log(event.exception.values[0].value) + openTelemetryLogging.send({ + type: 'graylog', + payload: { + message: event.exception.values[0].value, + object: { + sentry: true, + error: event + } + }, + spanContext: null + }) + } + // Return event to send it to Sentry return event; - } + }, }, // Forward the init method to the sibling Framework. - SentrySibling.init + SentrySibling.init, ); + +export const increment = createAction('[Counter Component] Increment'); +export const decrement = createAction('[Counter Component] Decrement'); +export const reset = createAction('[Counter Component] Reset'); + +export const initialState = 0; + +const _counterReducer = createReducer( + initialState, + on(increment, (state) => state + 1), + on(decrement, (state) => state - 1), + on(reset, (state) => 0) +); + +export function counterReducer(state, action) { + return _counterReducer(state, action); +} + @NgModule({ declarations: [AppComponent, PopupQuestionPipe, InputFilterDirective], imports: [BrowserModule, StoreModule.forRoot({ calendar: calendarReducer }), + // StoreModule.forRoot({ userTyping: typingReducer }), CommonModule, FormsModule, CalendarModule.forRoot({ @@ -196,9 +224,10 @@ import { FirebaseX } from '@ionic-native/firebase-x/ngx'; */ DeplomaOptionsPageModule, CreateProcessPageModule, ImageCropperModule, - MatMenuModule, - MatIconModule + MatIconModule, + // module + ChatModule ], entryComponents: [ DiplomaOptionsPage, @@ -223,7 +252,6 @@ import { FirebaseX } from '@ionic-native/firebase-x/ngx'; */ FilePath, /* FCM, FirebaseX, */ - ChatService, ScreenOrientation, Network, SQLite, @@ -244,8 +272,6 @@ import { FirebaseX } from '@ionic-native/firebase-x/ngx'; */ chatTokenInterceptor, tokenInterceptor, metricsInterceptor - - ], bootstrap: [AppComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA] diff --git a/src/app/config/auth-constants.ts b/src/app/config/auth-constants.ts deleted file mode 100644 index 677d091cc..000000000 --- a/src/app/config/auth-constants.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* This file stores all the keys */ -export class AuthConnstants{ - /* My reference key */ - public static readonly AUTH = 'userDataKey'; - public static readonly PROFILE = 'profile'; - public static readonly USER = 'userId'; - public static readonly USERCHAT = 'userChat'; -} \ No newline at end of file diff --git a/src/app/controller/chat.ts b/src/app/controller/chat.ts deleted file mode 100644 index 16308223f..000000000 --- a/src/app/controller/chat.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { ChatSystemService } from "../services/chat/chat-system.service"; - -export class ChatController { - - static ChatSystemService: ChatSystemService - - static async createGroup(name) { - let data: any = await this.ChatSystemService.createGroup(name) - - if(data?.error?.error == 'error-invalid-room-name') { - name = name.slice(0, 12) - data = await this.ChatSystemService.createGroup(name) - return { - data, - roomName: name - } - } - - return { - data, - roomName: name - } - } - - static async createOrFindGroup(name) { - let data: any = await this.createGroup(name) - } - -} \ No newline at end of file diff --git a/src/app/controller/event.ts b/src/app/controller/event.ts index c1571f62b..b08488d20 100644 --- a/src/app/controller/event.ts +++ b/src/app/controller/event.ts @@ -1,5 +1,5 @@ -import { chatUser } from '../models/chatMethod' -import { ChatController } from './chat' + +//import { ChatController } from './chat' export class EventController { static create() { @@ -12,36 +12,36 @@ export class EventController { static async createOrFindGroupFromEvent(name, attendees) { // chatController. - const {data, roomName} = await ChatController.createGroup(name) + // const {data, roomName} = await ChatController.createGroup(name) - const roomId = data.rid + // const roomId = data.rid - if (data.error.error == "error-duplicate-channel-name") { - const getGroupByName = ChatController.ChatSystemService.getGroupByName(roomName) - if(getGroupByName) { - return getGroupByName - } - } else if (roomId) { - const room = await ChatController.ChatSystemService.waitRoomToCreate(roomId) - - const chatUsers: chatUser[] = [] + // if (data.error.error == "error-duplicate-channel-name") { + // const getGroupByName = ChatController.ChatSystemService.getGroupByName(roomName) + // if(getGroupByName) { + // return getGroupByName + // } + // } else if (roomId) { + // const room = await ChatController.ChatSystemService.waitRoomToCreate(roomId) - for (let webTRIXUser of attendees ) { - const username = webTRIXUser.EmailAddress.split("@")[0]; - const name = webTRIXUser.Name - - const findChatUser = ChatController.ChatSystemService.searchContact(name, username) - if(findChatUser) { - chatUsers.push(findChatUser) - } - } - - for (let chatUser of chatUsers) { - room.addContacts(chatUser._id) - } + // const chatUsers: chatUser[] = [] - return room - } + // for (let webTRIXUser of attendees ) { + // const username = webTRIXUser.EmailAddress.split("@")[0]; + // const name = webTRIXUser.Name + + // const findChatUser = ChatController.ChatSystemService.searchContact(name, username) + // if(findChatUser) { + // chatUsers.push(findChatUser) + // } + // } + + // for (let chatUser of chatUsers) { + // room.addContacts(chatUser._id) + // } + + // return room + // } } diff --git a/src/app/core/chat/entity/distribution.ts b/src/app/core/chat/entity/distribution.ts new file mode 100644 index 000000000..e3d005ae8 --- /dev/null +++ b/src/app/core/chat/entity/distribution.ts @@ -0,0 +1,30 @@ +import { object, z } from 'zod'; +import { MessageEntitySchema } from './message'; +import { BaseEntity } from 'src/app/utils/entity'; + +const DistributionEntitySchema = z.object({ + $messageIdMemberId: z.string().optional(), + messageId: z.string(), + memberId: z.number(), + readAt: z.string().nullable(), + deliverAt: z.string().nullable(), + roomId: z.string(), +}) + +export type IDistribution = z.infer + + +export class DistributionEntity extends BaseEntity(DistributionEntitySchema) implements IDistribution{ + + roomId: typeof DistributionEntitySchema._input.roomId + readAt: typeof DistributionEntitySchema._input.readAt + messageId: typeof DistributionEntitySchema._input.messageId + memberId: typeof DistributionEntitySchema._input.memberId + deliverAt: typeof DistributionEntitySchema._input.deliverAt + + constructor(data: IDistribution) { + super(); + Object.assign(this, data) + } + +} \ No newline at end of file diff --git a/src/app/core/chat/entity/group.ts b/src/app/core/chat/entity/group.ts new file mode 100644 index 000000000..7c885ca4d --- /dev/null +++ b/src/app/core/chat/entity/group.ts @@ -0,0 +1,72 @@ +import { SessionStore } from "src/app/store/session.service"; +import { BaseEntity } from "src/app/utils/entity"; +import { z } from "zod" +import { MessageEntitySchema } from "./message"; + +export enum RoomType { + Group = 1, + Direct = 2 +} + +const UserSchema = z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().nullable(), +}); + +const MemberSchema = z.object({ + id: z.string(), + user: UserSchema, + joinAt: z.string(), + isAdmin: z.boolean() +}); + +export const RoomEntitySchema = z.object({ + id: z.string(), + roomName: z.string(), + createdBy: z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string().email(), + userPhoto: z.string().nullable().optional()// api check + }), + createdAt: z.any(), + expirationDate: z.any().nullable(), + roomType: z.nativeEnum(RoomType), + members: z.array(MemberSchema).optional(), + messages: MessageEntitySchema.array().optional() +}) + +export type IRoom = z.infer + +export class RoomEntity extends BaseEntity(RoomEntitySchema) implements IRoom{ + + id: typeof RoomEntitySchema._input.id + roomName: typeof RoomEntitySchema._input.roomName + createdBy: typeof RoomEntitySchema._input.createdBy + createdAt: typeof RoomEntitySchema._input.createdAt + expirationDate: typeof RoomEntitySchema._input.expirationDate + roomType: typeof RoomEntitySchema._input.roomType + members: typeof RoomEntitySchema._input.members + messages: typeof RoomEntitySchema._input.messages + + constructor(data: IRoom) { + super(); + Object.assign(this, data) + if(data.roomType == RoomType.Direct) { + this.setName() + } + } + + setName() { + const userChatName = this.members?.find((e) => e.user.wxUserId != SessionStore.user.UserId) + if(userChatName) { + this.roomName = userChatName.user.wxFullName + } + } + + hasLastMessage() { + return this.messages?.length >= 1 + } +} diff --git a/src/app/core/chat/entity/member.ts b/src/app/core/chat/entity/member.ts new file mode 100644 index 000000000..d45a45199 --- /dev/null +++ b/src/app/core/chat/entity/member.ts @@ -0,0 +1,33 @@ +import { z } from "zod"; + +export const MemberEntitySchema = z.object({ + $roomIdUserId: z.string().optional(), + id: z.string().optional(), // useless + roomId: z.string(), + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().nullable(), + joinAt: z.string(), + status: z.string().optional(), // useless + isAdmin: z.boolean() +}) + +export type IMember = z.infer + + +export class MemberEntity implements IMember { + id: typeof MemberEntitySchema._type.id + roomId: typeof MemberEntitySchema._type.roomId + wxUserId: typeof MemberEntitySchema._type.wxUserId + wxFullName: typeof MemberEntitySchema._type.wxFullName + wxeMail: typeof MemberEntitySchema._type.wxeMail + userPhoto: typeof MemberEntitySchema._type.userPhoto + joinAt: typeof MemberEntitySchema._type.joinAt + status: typeof MemberEntitySchema._type.status + isAdmin: typeof MemberEntitySchema._type.isAdmin + + hasPhoto() { + return typeof this.userPhoto == 'string' + } +} diff --git a/src/app/core/chat/entity/message.ts b/src/app/core/chat/entity/message.ts new file mode 100644 index 000000000..d0490935b --- /dev/null +++ b/src/app/core/chat/entity/message.ts @@ -0,0 +1,116 @@ +import { z } from "zod"; +import { base64Schema } from "src/app/utils/zod"; +import { SessionStore } from "src/app/store/session.service"; + +export enum MessageAttachmentSource { + Webtrix = 1, + Device, +} + +export enum MessageAttachmentFileType { + Doc = 1, + Image , + Audio , + Video +} + +export enum IMessageType { + normal = 1, + information +} + +export const MessageEntityAttachmentSchema = z.object({ + fileType: z.nativeEnum(MessageAttachmentFileType), + source: z.nativeEnum(MessageAttachmentSource), + file: base64Schema.optional(), + fileName: z.string().optional(), + applicationId: z.number().optional(), + docId: z.number().optional(), + id: z.string().optional().nullable(), + mimeType: z.string().nullable().optional(), + safeFile: z.any().optional(), + description: z.string().nullable().optional(), +}) + +export const MessageEntitySchema = z.object({ + $id: z.any().optional(), + id: z.string().uuid().optional(), + roomId: z.string().uuid().optional(), + receiverId: z.number().optional(), + message: z.string().nullable().optional(), + messageType: z.nativeEnum(IMessageType), + canEdit: z.boolean(), + oneShot: z.boolean(), + sentAt: z.string().optional(), + requireUnlock: z.boolean(), + isDeleted: z.boolean().optional(), + editedAt: z.string().nullable().optional(), + sender: z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().nullable(), + }).nullable(), + reactions: z.object({ + id: z.string(), + reactedAt: z.string(), + reaction: z.string(), + sender: z.object({}), + }).array().optional(), + info: z.array(z.object({ + memberId: z.number(), + readAt: z.string().nullable(), + deliverAt: z.string().nullable() + })).optional(), + sending: z.boolean().optional(), + attachments: z.array(MessageEntityAttachmentSchema).optional(), + origin: z.enum(['history', 'local', 'incoming']).optional(), + requestId: z.string().nullable().optional(), + sendAttemp: z.number().optional(), + hasAttachment: z.boolean().optional() +}) + +export type IMessage = z.infer; + +export class MessageEntity { + + $id?: string + id?: string + roomId?: string + receiverId?: number + message?: string + canEdit: boolean = false + oneShot: boolean = false + sentAt?: string + requireUnlock: boolean = false + info: typeof MessageEntitySchema._type.info = [] + sender!: typeof MessageEntitySchema._type.sender + sending: boolean = false + sendAttemp = 0 + messageType = IMessageType.normal + attachments: typeof MessageEntitySchema._type.attachments = [] + reactions: typeof MessageEntitySchema._type.reactions = [] + requestId!: string + isDeleted: typeof MessageEntitySchema._type.isDeleted = false + + constructor() {} + + get messageStatus() { + if(this.id) { + return 'send' + } + } + + get hasAttachment() { + return this.attachments.length >= 1 + } + + static haveSeen(info: typeof MessageEntitySchema._type.info) { + return info.filter(e => typeof e.readAt == 'string' && e.memberId == SessionStore.user.UserId).length == 1 + } + + meSender() { + return this.sender?.wxUserId == SessionStore.user.UserId + } + +} diff --git a/src/app/core/chat/mapper/getRoomByIdMapper.ts b/src/app/core/chat/mapper/getRoomByIdMapper.ts new file mode 100644 index 000000000..a0d50eaf9 --- /dev/null +++ b/src/app/core/chat/mapper/getRoomByIdMapper.ts @@ -0,0 +1,17 @@ +import { RoomByIdOutputDTO } from "src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service"; +import { RoomEntity } from "../entity/group"; + +export class GetRoomByIdMapper { + static toDomain(input: RoomByIdOutputDTO): RoomEntity { + + return new RoomEntity({ + createdAt: input.data.createdAt, + createdBy: input.data.createdBy, + expirationDate: input.data.expirationDate, + id: input.data.id, + members: input.data.members, + roomName: input.data.roomName, + roomType: input.data.roomType, + }) + } +} \ No newline at end of file diff --git a/src/app/core/chat/mapper/getRoomListMapper.ts b/src/app/core/chat/mapper/getRoomListMapper.ts new file mode 100644 index 000000000..a9c0bc66c --- /dev/null +++ b/src/app/core/chat/mapper/getRoomListMapper.ts @@ -0,0 +1,31 @@ +import { RoomListItemOutPutDTO } from "src/app/module/chat/domain/use-case/room/room-get-list-use-case.service"; +import { RoomEntity } from "../entity/group"; + +export class GetRoomListMapper{ + + // @captureAndReraiseAsync('GetRoomListMapper/toDomain') + static toDomain(inputs: RoomListItemOutPutDTO[]): RoomEntity[] { + + return inputs.map((roomData) => new RoomEntity({ + createdAt: roomData.chatRoom.createdAt, + createdBy: roomData.chatRoom.createdBy, + expirationDate: roomData.chatRoom.expirationDate, + id: roomData.chatRoom.id, + roomName: roomData.chatRoom.roomName, + roomType: roomData.chatRoom.roomType, + members: [ roomData.chatRoom.user2, roomData.chatRoom.user1].filter((e) => e?.wxUserId).map((b) => ({ + id: '', + isAdmin: false, + joinAt: '', + user: { + userPhoto: b.userPhoto, + wxeMail: b.wxeMail, + wxFullName: b.wxFullName, + wxUserId: b.wxUserId + } + })), + messages: roomData.chatRoom.messages, + })); + + } +} \ No newline at end of file diff --git a/src/app/core/chat/repository/attachment/attachment-local-repository.ts b/src/app/core/chat/repository/attachment/attachment-local-repository.ts new file mode 100644 index 000000000..e5047ab56 --- /dev/null +++ b/src/app/core/chat/repository/attachment/attachment-local-repository.ts @@ -0,0 +1,10 @@ +import { MessageTable } from "src/app/infra/database/dexie/instance/chat/schema/message"; +import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; +import { MessageEntity } from "../../entity/message"; +import { Observable as DexieObservable, PromiseExtended } from 'Dexie'; +import { AttachmentTable } from "src/app/infra/database/dexie/instance/chat/schema/attachment"; +import { TypingTable } from "src/app/infra/database/dexie/instance/chat/schema/typing"; + +export abstract class ITypingLocalRepository extends DexieRepository { + +} \ No newline at end of file diff --git a/src/app/core/chat/repository/attachment/attachment-remote-repository.ts b/src/app/core/chat/repository/attachment/attachment-remote-repository.ts new file mode 100644 index 000000000..38118f350 --- /dev/null +++ b/src/app/core/chat/repository/attachment/attachment-remote-repository.ts @@ -0,0 +1,5 @@ +import { DataSourceReturn } from "src/app/services/Repositorys/type"; + +export abstract class IAttachmentRemoteRepository { + abstract getAttachment(id: string | number): DataSourceReturn +} \ No newline at end of file diff --git a/src/app/core/chat/repository/bold/bold-local-repository.ts b/src/app/core/chat/repository/bold/bold-local-repository.ts new file mode 100644 index 000000000..ddf528081 --- /dev/null +++ b/src/app/core/chat/repository/bold/bold-local-repository.ts @@ -0,0 +1,8 @@ +import Dexie, { PromiseExtended } from "Dexie"; +import { BoldTable } from "src/app/infra/database/dexie/instance/chat/schema/bold"; +import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; + + +export abstract class IBoldLocalRepository extends DexieRepository implements IBoldLocalRepository { + abstract open(): PromiseExtended +} diff --git a/src/app/core/chat/repository/distribution/distribution-local-repository.ts b/src/app/core/chat/repository/distribution/distribution-local-repository.ts new file mode 100644 index 000000000..fc57f24f2 --- /dev/null +++ b/src/app/core/chat/repository/distribution/distribution-local-repository.ts @@ -0,0 +1,9 @@ +import { DistributionTable, DistributionTableSchema } from "src/app/infra/database/dexie/instance/chat/schema/destribution"; +import { chatDatabase } from "src/app/infra/database/dexie/service"; +import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; + + + +export abstract class IDistributionLocalRepository extends DexieRepository implements IDistributionLocalRepository { + +} \ No newline at end of file diff --git a/src/app/core/chat/repository/dto/messageOutputDTO.ts b/src/app/core/chat/repository/dto/messageOutputDTO.ts new file mode 100644 index 000000000..abaff3972 --- /dev/null +++ b/src/app/core/chat/repository/dto/messageOutputDTO.ts @@ -0,0 +1,53 @@ +import { z } from "zod" + +export enum MessageAttachmentSource { + Webtrix = 1, + Device, +} + +export enum MessageAttachmentFileType { + Doc = 1, + Image , + Audio , + Video +} + +export const MessageOutPutDataDTOSchema = z.object({ + id: z.string(), + roomId: z.string(), + sender: z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().nullable().optional() + }), + message: z.string().nullable().optional(), + messageType: z.number(), + sentAt: z.string(), + canEdit: z.boolean(), + oneShot: z.boolean(), + requireUnlock: z.boolean(), + requestId: z.string().optional().nullable(), + reactions: z.object({ + id: z.string(), + reactedAt: z.string(), + reaction: z.string(), + sender: z.object({}), + }).array(), + info: z.array(z.object({ + memberId: z.number(), + readAt: z.string().nullable(), + deliverAt: z.string().nullable() + })), + attachments: z.array(z.object({ + fileType: z.nativeEnum(MessageAttachmentFileType), + source: z.nativeEnum(MessageAttachmentSource), + file: z.string().optional(), + fileName: z.string().optional(), + applicationId: z.number().optional(), + docId: z.number().optional(), + id: z.string().optional() + })) +}); + +export type MessageOutPutDataDTO = z.infer diff --git a/src/app/core/chat/repository/member/member-local-repository.ts b/src/app/core/chat/repository/member/member-local-repository.ts new file mode 100644 index 000000000..155c50bc9 --- /dev/null +++ b/src/app/core/chat/repository/member/member-local-repository.ts @@ -0,0 +1,40 @@ +import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; +import { Observable as DexieObservable, PromiseExtended } from 'Dexie'; +import { AttachmentTable } from "src/app/infra/database/dexie/instance/chat/schema/attachment"; +import { Result } from "neverthrow"; +import { MemberTable, MemberTableSchema } from "src/app/infra/database/dexie/instance/chat/schema/members"; +import { RepositoryResult } from "src/app/infra/repository"; +import { z } from "zod"; +import { MemberListUPdateStatusInputDTO } from "src/app/module/chat/domain/use-case/socket/member-list-update-status-use-case.service"; +import { Observable } from "rxjs"; + + +export const DirectMemberInput = MemberTableSchema.pick({ + roomId: true, +}).extend({ + currentUserId: z.number(), +}) + +export type IDirectMemberInput = z.infer + +export const GetMemberLiveInput = MemberTableSchema.pick({ + wxUserId: true, + roomId: true, +}) + +export type IGetMemberLive = z.infer +export abstract class IMemberLocalRepository extends DexieRepository { + + abstract directMember(input:IDirectMemberInput): Promise> + abstract addMember(data: MemberTable): Promise> + abstract updateMemberRole(data: MemberTable): Promise> + abstract updateMembersStatus(data: MemberListUPdateStatusInputDTO): Promise> + abstract allMemberOnline(roomId:string): DexieObservable + abstract removeMemberFromRoom(roomId:string): Promise> + + abstract getMemberLive(input: IGetMemberLive): DexieObservable + abstract getRoomMemberById(roomId:string): Promise + abstract getRoomMemberByIdLive(roomId:string): Observable + abstract getRoomMemberNoneAdminByIdLive(roomId:string): DexieObservable + +} diff --git a/src/app/core/chat/repository/member/member-remote-repository.ts b/src/app/core/chat/repository/member/member-remote-repository.ts new file mode 100644 index 000000000..54ff89303 --- /dev/null +++ b/src/app/core/chat/repository/member/member-remote-repository.ts @@ -0,0 +1,12 @@ +import { DataSourceReturn } from "src/app/services/Repositorys/type"; +import { Result } from "neverthrow"; +import { AddMemberToRoomInputDTO } from "src/app/module/chat/domain/use-case/member/member-add-use-case.service"; +import { MemberSetAdminDTO } from "src/app/module/chat/domain/use-case/member/member-admin-use-case.service"; +import { UserRemoveListInputDTO } from "src/app/module/chat/domain/use-case/room/room-leave-by-id-use-case.service"; + +export abstract class IMemberRemoteRepository { + abstract addMemberToRoom(data: AddMemberToRoomInputDTO): DataSourceReturn + + abstract removeMemberFromRoom(data: UserRemoveListInputDTO): Promise> + abstract setAmin(data: MemberSetAdminDTO): Promise> +} \ No newline at end of file diff --git a/src/app/core/chat/repository/message/message-local-repository.ts b/src/app/core/chat/repository/message/message-local-repository.ts new file mode 100644 index 000000000..db56ad23a --- /dev/null +++ b/src/app/core/chat/repository/message/message-local-repository.ts @@ -0,0 +1,13 @@ +import { MessageTable } from "src/app/infra/database/dexie/instance/chat/schema/message"; +import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; +import { MessageEntity } from "../../entity/message"; +import { Observable as DexieObservable, PromiseExtended } from 'Dexie'; +import { Observable } from "rxjs"; + +export abstract class IMessageLocalRepository extends DexieRepository { + abstract setAllSenderToFalse(): void + abstract getItems(roomId: string): PromiseExtended + abstract getItemsLive(roomId: string): DexieObservable + abstract getOfflineMessages(): Promise + abstract onCreateObservable(): Observable +} diff --git a/src/app/core/chat/repository/message/message-remote-repository.ts b/src/app/core/chat/repository/message/message-remote-repository.ts new file mode 100644 index 000000000..a05038fbf --- /dev/null +++ b/src/app/core/chat/repository/message/message-remote-repository.ts @@ -0,0 +1,6 @@ +import { DataSourceReturn } from "src/app/services/Repositorys/type"; +import { IMessageGetAllByRoomIdOutPut } from "../../usecase/message/message-get-all-by-room-Id"; + +export abstract class IMessageRemoteRepository { + abstract getMessagesFromRoom(id: string): DataSourceReturn +} \ No newline at end of file diff --git a/src/app/core/chat/repository/message/message-socket-repository.ts b/src/app/core/chat/repository/message/message-socket-repository.ts new file mode 100644 index 000000000..150990c48 --- /dev/null +++ b/src/app/core/chat/repository/message/message-socket-repository.ts @@ -0,0 +1,31 @@ +import { HubConnection } from "@microsoft/signalr"; +import { Result } from "neverthrow"; +import { MessageCreateOutPutDataDTO, MessageInputDTO } from "src/app/module/chat/domain/use-case/message/message-create-use-case.service"; +import { MessageMarkAsReadInput } from "src/app/module/chat/domain/use-case/message/message-mark-as-read-use-case.service"; +import { MessageDeleteInputDTO } from "src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service"; +import { MessageOutPutDataDTO } from "../dto/messageOutputDTO"; +import { Observable } from "rxjs"; +import { MessageReactionInput } from "src/app/module/chat/domain/use-case/message/message-reaction-by-id-use-case.service"; +import { MessageUpdateInput } from "src/app/module/chat/domain/use-case/message/message-update-by-id-use-case.service"; +import { SocketMessage } from "src/app/infra/socket/signalR/signalR"; + +export abstract class IMessageSocketRepository { + + abstract connect(): Promise> + abstract sendGroupMessage(data: MessageInputDTO): Promise> + abstract sendDirectMessage(data: MessageInputDTO): Promise> + + // abstract sendDeliverAt(): Promise> + abstract sendReadAt(data: MessageMarkAsReadInput): Promise> + abstract sendDelete(data: MessageDeleteInputDTO): Promise> + + abstract listenToMessages(): Observable + abstract listenToDeleteMessages(): Observable + abstract listenToUpdateMessages(): Observable + + abstract listenToSendMessage(): Observable> + + abstract reactToMessageSocket(data: MessageReactionInput): void + abstract updateMessage(input: MessageUpdateInput): void + abstract sendMessageDelete(data: MessageDeleteInputDTO): Promise> +} diff --git a/src/app/core/chat/repository/message/socket-repositoty-parameter.ts b/src/app/core/chat/repository/message/socket-repositoty-parameter.ts new file mode 100644 index 000000000..6ba7adcaa --- /dev/null +++ b/src/app/core/chat/repository/message/socket-repositoty-parameter.ts @@ -0,0 +1,8 @@ + + +export interface sendReadAtInput { + memberId: number, + messageId:string, + roomId: string, + requestId: string +} diff --git a/src/app/core/chat/repository/room/room-local-repository.ts b/src/app/core/chat/repository/room/room-local-repository.ts new file mode 100644 index 000000000..b37bec155 --- /dev/null +++ b/src/app/core/chat/repository/room/room-local-repository.ts @@ -0,0 +1,12 @@ +import { MessageTable } from "src/app/infra/database/dexie/instance/chat/schema/message"; +import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; +import { MessageEntity } from "../../entity/message"; +import { Observable as DexieObservable, PromiseExtended } from 'Dexie'; +import { AttachmentTable } from "src/app/infra/database/dexie/instance/chat/schema/attachment"; +import { RoomTable } from "src/app/infra/database/dexie/instance/chat/schema/room"; +import { Observable } from "rxjs"; + +export abstract class IRoomLocalRepository extends DexieRepository { + abstract getItemsLive(): Observable + abstract getRoomByIdLive(id: any) : Observable +} diff --git a/src/app/core/chat/repository/room/room-remote-repository.ts b/src/app/core/chat/repository/room/room-remote-repository.ts new file mode 100644 index 000000000..7e000d29d --- /dev/null +++ b/src/app/core/chat/repository/room/room-remote-repository.ts @@ -0,0 +1,17 @@ +import { DataSourceReturn } from "src/app/services/Repositorys/type"; +import { IMessageGetAllByRoomIdOutPut } from "../../usecase/message/message-get-all-by-room-Id"; +import { CreateRoomInputDTO, RoomOutPutDTO } from "src/app/module/chat/domain/use-case/room/room-create-use-case.service"; +import { RoomByIdInputDTO, RoomByIdOutputDTO } from "src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service"; +import { RoomUpdateInputDTO, RoomUpdateOutputDTO } from "src/app/module/chat/domain/use-case/room/room-update-by-id-use-case.service"; +import { Result } from "neverthrow"; +import { AddMemberToRoomInputDTO } from "src/app/module/chat/domain/use-case/member/member-add-use-case.service"; +import { RoomListOutPutDTO } from "src/app/module/chat/domain/use-case/room/room-get-list-use-case.service"; + +export abstract class IRoomRemoteRepository { + abstract createRoom(data: CreateRoomInputDTO): DataSourceReturn + abstract getRoomList(): Promise> + abstract getRoom(id: RoomByIdInputDTO): DataSourceReturn + abstract updateRoom(data: RoomUpdateInputDTO): Promise> + abstract deleteRoom(id: string): Promise> + abstract addMemberToRoomSocket(data: AddMemberToRoomInputDTO): Promise> +} \ No newline at end of file diff --git a/src/app/core/chat/repository/room/room-socket-repository.ts b/src/app/core/chat/repository/room/room-socket-repository.ts new file mode 100644 index 000000000..7f763a60f --- /dev/null +++ b/src/app/core/chat/repository/room/room-socket-repository.ts @@ -0,0 +1,16 @@ +import { HubConnection } from "@microsoft/signalr"; +import { Result } from "neverthrow"; +import { Observable } from "rxjs"; +import { ListenToDeleteRoomInput, RoomSocketOutPutDTO } from "src/app/module/chat/data/repository/room/room-socket-repository.service"; +import { CreateRoomInputDTO } from "src/app/module/chat/domain/use-case/room/room-create-use-case.service"; + +export abstract class IRoomSocketRepository { + + + abstract CreateGroup(data: CreateRoomInputDTO): Promise> + + abstract listenToCreateRoom(): Observable + abstract listenToDeleteRoom(): Observable + + +} diff --git a/src/app/core/chat/repository/typing/typing-local-repository.ts b/src/app/core/chat/repository/typing/typing-local-repository.ts new file mode 100644 index 000000000..ea114ba43 --- /dev/null +++ b/src/app/core/chat/repository/typing/typing-local-repository.ts @@ -0,0 +1,9 @@ +import { MessageTable } from "src/app/infra/database/dexie/instance/chat/schema/message"; +import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; +import { MessageEntity } from "../../entity/message"; +import { Observable as DexieObservable, PromiseExtended } from 'Dexie'; +import { AttachmentTable } from "src/app/infra/database/dexie/instance/chat/schema/attachment"; + +export abstract class IAttachmentLocalRepository extends DexieRepository { + +} \ No newline at end of file diff --git a/src/app/core/chat/repository/typing/typing-remote-repository.ts b/src/app/core/chat/repository/typing/typing-remote-repository.ts new file mode 100644 index 000000000..c4d61cb3f --- /dev/null +++ b/src/app/core/chat/repository/typing/typing-remote-repository.ts @@ -0,0 +1,8 @@ +import { Observable } from "rxjs"; +import { Result } from "neverthrow"; +import { UserTypingDTO } from "src/app/module/chat/data/repository/typing/user-typing-live-data-source.service"; + +export abstract class ITypingRemoteRepository { + abstract sendTyping(roomId: string): Promise> + abstract listenToTyping(): Observable +} \ No newline at end of file diff --git a/src/app/core/chat/repository/user-photo/user-photo-local-repository.ts b/src/app/core/chat/repository/user-photo/user-photo-local-repository.ts new file mode 100644 index 000000000..bb57cff85 --- /dev/null +++ b/src/app/core/chat/repository/user-photo/user-photo-local-repository.ts @@ -0,0 +1,8 @@ +import Dexie, { PromiseExtended } from "Dexie"; +import { UserPhotoTable } from "src/app/infra/database/dexie/instance/chat/schema/user-foto"; +import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; + + +export abstract class IUserPhotoLocalRepository extends DexieRepository implements IUserPhotoLocalRepository { + +} diff --git a/src/app/core/chat/repository/user-photo/user-photo-remote-repository.ts b/src/app/core/chat/repository/user-photo/user-photo-remote-repository.ts new file mode 100644 index 000000000..9e20ffa80 --- /dev/null +++ b/src/app/core/chat/repository/user-photo/user-photo-remote-repository.ts @@ -0,0 +1,13 @@ +import { HttpResult, IHttPReturn } from "src/app/infra/http/type" +import { UserPhotoGetByIdInputSchema } from "src/app/module/chat/domain/use-case/user-photo/user-photo-get-by-id-use-case.service" +import { z } from "zod" + +export const IGetUserPhotoByAttachmentIdInputSchema = z.object({ + attachmentId: z.string(), +}) + +export type IGetUserPhotoByAttachmentId = z.infer + +export abstract class IUserPhotoRemoteRepository { + abstract getUserPhotoByAttachmentId(input: IGetUserPhotoByAttachmentId): IHttPReturn +} diff --git a/src/app/core/chat/usecase/message/http-listen-to-message-load-history-by-roomId-use-case.ts b/src/app/core/chat/usecase/message/http-listen-to-message-load-history-by-roomId-use-case.ts new file mode 100644 index 000000000..34fb9f7a0 --- /dev/null +++ b/src/app/core/chat/usecase/message/http-listen-to-message-load-history-by-roomId-use-case.ts @@ -0,0 +1,33 @@ +import { HttpErrorResponse } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { Observable } from "rxjs"; +import { filter, map } from "rxjs/operators"; +import { HttpAdapter } from "src/app/infra/http/adapter"; +import { z } from "zod"; +import { IMessageGetAllByRoomIdOutPut } from "./message-get-all-by-room-Id"; + +const HttpListenToMessageLoadHistoryUseCaseInputSchema = z.object({ + roomId: z.string() +}) + +export type HttpListenToMessageLoadHistoryUseCaseInput = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class HttpListenToMessageLoadHistoryUseCase{ + + constructor( + private http: HttpAdapter + ) {} + + execute(input: HttpListenToMessageLoadHistoryUseCaseInput): Observable { + return this.http.listen().pipe( + filter((response)=> response.isOk()), + filter((response: any)=> { + return response.value.url.includes(`Room/${input.roomId}/Messages`) + }), + map((response: any) => response.value.data as IMessageGetAllByRoomIdOutPut) + ) + } +} diff --git a/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts b/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts new file mode 100644 index 000000000..479bc57c9 --- /dev/null +++ b/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts @@ -0,0 +1,65 @@ +import { HttpErrorResponse } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { Result } from "neverthrow"; +import { Observable } from "rxjs"; +import { filter, map } from "rxjs/operators"; +import { HttpAdapter } from "src/app/infra/http/adapter"; +import { z } from "zod"; +import { MessageAttachmentFileType, MessageAttachmentSource } from "../../entity/message"; + +export const MessageGetAllByRoomIdUseCaseOutputSchema = z.object({ + success: z.boolean(), + message: z.string(), + data: z.object({ + id: z.string(), + roomId: z.string(), + isDeleted: z.boolean(), + sender: z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().nullable().optional() + }), + message: z.string().nullable().optional(), + messageType: z.number(), + sentAt: z.string(), + canEdit: z.boolean(), + oneShot: z.boolean(), + requireUnlock: z.boolean(), + requestId: z.string().optional().nullable(), + reactions: z.object({ + id: z.string(), + reactedAt: z.string(), + reaction: z.string(), + sender: z.object({}), + }).array(), + info: z.array(z.object({ + memberId: z.number(), + readAt: z.string().nullable(), + deliverAt: z.string().nullable() + })), + attachments: z.array(z.object({ + fileType: z.nativeEnum(MessageAttachmentFileType), + source: z.nativeEnum(MessageAttachmentSource), + file: z.string().optional(), + fileName: z.string().optional(), + applicationId: z.number().optional(), + docId: z.number().optional(), + id: z.string().optional() + })) + }).array() +}) + +export type IMessageGetAllByRoomIdOutPut = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class MessageGetAllByRoomIdUseCase{ + + constructor( + private http: HttpAdapter + ) {} + + execute(input: any) {} +} diff --git a/src/app/core/chat/usecase/socket/socket-on-reconnect-use-case.ts b/src/app/core/chat/usecase/socket/socket-on-reconnect-use-case.ts new file mode 100644 index 000000000..112f140c0 --- /dev/null +++ b/src/app/core/chat/usecase/socket/socket-on-reconnect-use-case.ts @@ -0,0 +1,20 @@ +import { Injectable } from "@angular/core"; +import { Observable } from "rxjs"; +import { ISignalRService } from "src/app/infra/socket/adapter"; +import { z } from "zod" + +const e = z.object({}) + +@Injectable({ + providedIn: 'root' +}) +export class SocketOnReconnectUseCase { + + constructor(private SignalRService: ISignalRService) {} + + execute(): Observable { + + const connection = this.SignalRService.onReconnect() + return connection + } +} \ No newline at end of file diff --git a/src/app/home/home-routing.module.ts b/src/app/home/home-routing.module.ts index 988385635..a8e70e987 100644 --- a/src/app/home/home-routing.module.ts +++ b/src/app/home/home-routing.module.ts @@ -3,11 +3,11 @@ import { Routes, RouterModule } from '@angular/router'; import { AuthGuard } from '../guards/auth.guard'; import { InactivityGuard } from '../guards/inactivity.guard'; import { AgendaPageModule } from '../pages/agenda/agenda.module'; -import { ChatPageModule } from '../pages/chat/chat.module'; import { EventsPageModule } from '../pages/events/events.module'; import { GabineteDigitalPageModule } from '../pages/gabinete-digital/gabinete-digital.module'; import { PublicationsPageModule } from '../pages/publications/publications.module'; import { HomePage } from './home.page'; +import { ChatPageModule } from '../ui/chat/chat.module'; const routes: Routes = [ { @@ -322,47 +322,8 @@ const routes: Routes = [ path:'', loadChildren: ()=> ChatPageModule }, - { - path:'messages', - children: [ - { - path:':roomId', - loadChildren: ()=> import('../pages/chat/messages/messages.module').then(m => m.MessagesPageModule) - }, - { - path:'contacts', - loadChildren: ()=> import('../shared/chat/messages/contacts/contacts.module').then(m => m.ContactsPageModule) - }, - { - path:'contacts', - loadChildren: ()=> import('../pages/chat/messages/contacts/contacts.module').then(m => m.ContactsPageModule) - }, - ] - }, - { - path:'group-messages', - children:[ - { - path:'', - loadChildren: ()=> import('../pages/chat/group-messages/group-messages.module').then(m => m.GroupMessagesPageModule) - }, - { - path:'group-contacts', - loadChildren: ()=> import('../shared/chat/group-messages/group-contacts/group-contacts.module').then(m => m.GroupContactsPageModule) - }, - { - path:'group-contacts', - loadChildren: ()=> import('../pages/chat/group-messages/group-contacts/group-contacts.module').then(m => m.GroupContactsPageModule) - }, - ] - }, - { - path:':eventId/:caller', - loadChildren: () => import('../pages/agenda/view-event/view-event.module').then( m => m.ViewEventPageModule), - }, - ], - // canActivate: [AuthGuard] + canActivate: [AuthGuard] }, { @@ -376,7 +337,7 @@ const routes: Routes = [ }, ], - // canActivate: [AuthGuard] + canActivate: [AuthGuard] }, { path: 'inactivity', @@ -386,7 +347,7 @@ const routes: Routes = [ loadChildren: ()=> import('../pages/inactivity/inactivity.module').then(m => m.InactivityPageModule) }, ], - // canActivate: [InactivityGuard] + canActivate: [InactivityGuard] }, { path: 'login', @@ -396,7 +357,7 @@ const routes: Routes = [ loadChildren: ()=> import('../pages/inactivity/inactivity.module').then(m => m.InactivityPageModule) }, ], - // canActivate: [InactivityGuard] + canActivate: [InactivityGuard] }, { path: 'pin', @@ -406,7 +367,7 @@ const routes: Routes = [ loadChildren: ()=> import('../pages/inactivity/inactivity.module').then(m => m.InactivityPageModule) }, ], - // canActivate: [InactivityGuard] + canActivate: [InactivityGuard] }, diff --git a/src/app/home/home.page.html b/src/app/home/home.page.html index 85937d51d..656f49cf6 100644 --- a/src/app/home/home.page.html +++ b/src/app/home/home.page.html @@ -6,7 +6,7 @@ - + diff --git a/src/app/home/home.page.ts b/src/app/home/home.page.ts index 5ca662914..f3696f6ed 100644 --- a/src/app/home/home.page.ts +++ b/src/app/home/home.page.ts @@ -10,7 +10,7 @@ import { PermissionService } from '../services/permission.service'; import { BackgroundService } from 'src/app/services/background.service'; import { Storage } from '@ionic/storage'; import { EventsService } from 'src/app/services/events.service'; -import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service'; +// import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service'; import { ProcessesService } from 'src/app/services/processes.service'; import { RoleIdService } from 'src/app/services/role-id.service'; import { ActiveTabService } from 'src/app/services/active-tab.service'; @@ -91,7 +91,7 @@ export class HomePage implements OnInit { private storage: Storage, private processservice: ProcessesService, public RouteService: RouteService, - private RochetChatConnectorService: RochetChatConnectorService, + // private RochetChatConnectorService: RochetChatConnectorService, private NetworkServiceService: NetworkServiceService, public eventService: EventsService, public ActiveTabService: ActiveTabService, @@ -205,12 +205,12 @@ export class HomePage implements OnInit { } }); - this.RochetChatConnectorService.registerCallback({ - type: 'reConnect', - funx: async () => { - this.backgroundservice.online() - } - }) + // this.RochetChatConnectorService.registerCallback({ + // type: 'reConnect', + // funx: async () => { + // this.backgroundservice.online() + // } + // }) this.NetworkServiceService.onNetworkChange().subscribe((status) => { if (status == ConnectionStatus.Online) { diff --git a/src/app/services/chat/nf.service.spec.ts b/src/app/infra/camera/camera.service.spec.ts similarity index 55% rename from src/app/services/chat/nf.service.spec.ts rename to src/app/infra/camera/camera.service.spec.ts index b8546cad7..73b57d3a5 100644 --- a/src/app/services/chat/nf.service.spec.ts +++ b/src/app/infra/camera/camera.service.spec.ts @@ -1,13 +1,13 @@ import { TestBed } from '@angular/core/testing'; -import { NfService } from './nf.service'; +import { CameraService } from './camera.service'; -describe('NfService', () => { - let service: NfService; +describe('CameraService', () => { + let service: CameraService; beforeEach(() => { TestBed.configureTestingModule({}); - service = TestBed.inject(NfService); + service = TestBed.inject(CameraService); }); it('should be created', () => { diff --git a/src/app/infra/camera/camera.service.ts b/src/app/infra/camera/camera.service.ts index c73a4e32e..180a06fd0 100644 --- a/src/app/infra/camera/camera.service.ts +++ b/src/app/infra/camera/camera.service.ts @@ -5,6 +5,21 @@ import { err, ok, Result } from 'neverthrow'; import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; import { error } from '../../services/Either/index'; +/** + * Parameters for taking a picture. + * @typedef {Object} takePictureParams + * @property {number} [quality=90] - The quality of the picture, from 0 to 100. + * @property {CameraResultType} cameraResultType - The result type of the photo, e.g., Base64, URI. + */ +export type takePictureParams = { + quality?: number; + cameraResultType: CameraResultType; +}; + +/** + * Service for handling camera functionality. + * This service provides methods to interact with the device's camera. + */ @Injectable({ providedIn: 'root' }) @@ -13,7 +28,7 @@ export class CameraService { constructor() { } - async takePicture(data: ITakePictureParams, tracing?: TracingType): Promise> { + async takePictureAgenda(data: ITakePictureParams, tracing?: TracingType): Promise> { try { tracing?.addEvent('take picture') const capturedImage = await Camera.getPhoto({ @@ -35,4 +50,25 @@ export class CameraService { } } + + /** + * Takes a picture using the device's camera. + * @param {takePictureParams} params - The parameters for taking the picture. + * @param {number} [params.quality=90] - The quality of the picture, from 0 to 100. + * @param {CameraResultType} params.cameraResultType - The result type of the photo. + * @returns {Promise | err>} A promise that resolves with an `ok` result containing the file or an `err` result containing the error. + */ + async takePicture({quality = 90, cameraResultType }: takePictureParams) { + try { + const file = await Camera.getPhoto({ + quality: quality, + resultType: cameraResultType, + source: CameraSource.Camera + }); + + return ok(file); + } catch (e) { + return err(e); + } + } } diff --git a/src/app/infra/database/dexie/instance/chat/schema/attachment.ts b/src/app/infra/database/dexie/instance/chat/schema/attachment.ts new file mode 100644 index 000000000..f8e698704 --- /dev/null +++ b/src/app/infra/database/dexie/instance/chat/schema/attachment.ts @@ -0,0 +1,25 @@ +import { z } from "zod"; +import { EntityTable } from 'Dexie'; +import { zodDataUrlSchema } from "src/app/utils/zod"; +import { MessageAttachmentFileType, MessageAttachmentSource } from "src/app/core/chat/entity/message"; + +export const AttachmentTableSchema = z.object({ + $id: z.number().optional(), // local id + $messageId: z.string(), + attachmentId: z.string().optional(), + file: z.instanceof(Blob).optional(), + base64: zodDataUrlSchema.nullable().optional(), + // + fileType: z.nativeEnum(MessageAttachmentFileType).optional(), + source: z.nativeEnum(MessageAttachmentSource).optional(), + fileName: z.string().optional(), + applicationId: z.number().optional(), + docId: z.number().optional(), + mimeType: z.string().nullable().optional(), + id: z.string().uuid().optional(), + description: z.string().optional() +}) + +export type AttachmentTable = z.infer +export type DexieAttachmentsTableSchema = EntityTable; +export const AttachmentTableColumn = '++$id, id, $messageId, messageId, file' diff --git a/src/app/infra/database/dexie/instance/chat/schema/bold.ts b/src/app/infra/database/dexie/instance/chat/schema/bold.ts new file mode 100644 index 000000000..d75044759 --- /dev/null +++ b/src/app/infra/database/dexie/instance/chat/schema/bold.ts @@ -0,0 +1,11 @@ +import { EntityTable } from 'Dexie'; +import { z } from 'zod'; + +export const BoldTableSchema = z.object({ + roomId: z.string(), + bold: z.number() +}) + +export type BoldTable = z.infer; +export type DexieBoldTable = EntityTable; +export const BoldTableColumn = 'roomId, bold'; diff --git a/src/app/infra/database/dexie/instance/chat/schema/destribution.ts b/src/app/infra/database/dexie/instance/chat/schema/destribution.ts new file mode 100644 index 000000000..e717259f5 --- /dev/null +++ b/src/app/infra/database/dexie/instance/chat/schema/destribution.ts @@ -0,0 +1,15 @@ +import { EntityTable } from 'Dexie'; +import { z } from 'zod'; + +export const DistributionTableSchema = z.object({ + $messageIdMemberId: z.string().optional(), + messageId: z.string(), + memberId: z.number(), + readAt: z.string().nullable(), + deliverAt: z.string().nullable(), + roomId: z.string(), +}) + +export type DistributionTable = z.infer +export type DexieDistributionTable = EntityTable; +export const DistributionTableColumn = '$messageIdMemberId, messageId, memberId, readAt, deliverAt, roomId' \ No newline at end of file diff --git a/src/app/infra/database/dexie/instance/chat/schema/members.ts b/src/app/infra/database/dexie/instance/chat/schema/members.ts new file mode 100644 index 000000000..5c9f4cb14 --- /dev/null +++ b/src/app/infra/database/dexie/instance/chat/schema/members.ts @@ -0,0 +1,19 @@ +import { z } from "zod"; +import { EntityTable } from 'Dexie'; + +export const MemberTableSchema = z.object({ + $roomIdUserId: z.string().optional(), + id: z.string().optional(), // useless + roomId: z.string(), + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().nullable(), + joinAt: z.string(), + status: z.string().optional(), // useless + isAdmin: z.boolean() +}) + +export type MemberTable = z.infer +export type DexieMembersTableSchema = EntityTable; +export const MemberTableColumn = '$roomIdUserId, userId, id, user, joinAt, roomId, status, wxUserId, isAdmin' diff --git a/src/app/infra/database/dexie/instance/chat/schema/message.ts b/src/app/infra/database/dexie/instance/chat/schema/message.ts new file mode 100644 index 000000000..e85c6c7b8 --- /dev/null +++ b/src/app/infra/database/dexie/instance/chat/schema/message.ts @@ -0,0 +1,54 @@ +import { EntityTable } from 'Dexie'; +import { MessageAttachmentFileType, MessageAttachmentSource } from 'src/app/core/chat/entity/message'; +import { z } from 'zod'; + +export const MessageTableSchema = z.object({ + $id: z.string().optional(), + $createAt: z.number().optional(), + id: z.string().uuid().optional(), + roomId: z.string().uuid().optional(), + message: z.string().nullable().optional(), + requestId: z.string().nullable().optional(), + messageType: z.number(), + canEdit: z.boolean(), + oneShot: z.boolean(), + sentAt: z.string().optional(), + editedAt: z.string().nullable().optional(), + isDeleted: z.boolean().optional(), + requireUnlock: z.boolean(), + sender: z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().nullable().optional(), + }), + receiverId: z.number().optional(), + sending: z.boolean().optional(), + reactions: z.object({ + id: z.string(), + reactedAt: z.string(), + reaction: z.string(), + sender: z.object({}), + }).array().optional(), + info: z.array(z.object({ + memberId: z.number(), + readAt: z.string().nullable(), + deliverAt: z.string().nullable() + })).optional(), + attachments: z.array(z.object({ + fileType: z.nativeEnum(MessageAttachmentFileType), + source: z.nativeEnum(MessageAttachmentSource), + fileName: z.string().optional(), + applicationId: z.number().optional(), + docId: z.number().optional(), + id: z.string().optional(), + description: z.string().nullable().optional(), + mimeType: z.string().nullable().optional() + })).optional(), + origin: z.enum(['history', 'local', 'incoming']).optional() +}) + +export type MessageTable = z.infer +export type DexieMessageTable = EntityTable; +export const messageTableColumn = '$id, id, roomId, senderId, message, messageType, canEdit, oneShot, requireUnlock, sending' + diff --git a/src/app/infra/database/dexie/instance/chat/schema/room.ts b/src/app/infra/database/dexie/instance/chat/schema/room.ts new file mode 100644 index 000000000..90c9ed896 --- /dev/null +++ b/src/app/infra/database/dexie/instance/chat/schema/room.ts @@ -0,0 +1,25 @@ +import { z } from "zod"; +import { EntityTable } from 'Dexie'; +import { RoomType } from "src/app/core/chat/entity/group"; +import { MessageEntity, MessageEntitySchema } from "src/app/core/chat/entity/message"; +import { MessageTableSchema } from "./message"; + +export const RoomTableSchema = z.object({ + id: z.string().uuid(), + roomName: z.string(), + createdBy: z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string().email(), + userPhoto: z.string().nullable().optional()// api check + }), + createdAt: z.any(), + expirationDate: z.any().nullable(), + roomType: z.nativeEnum(RoomType), + messages: MessageTableSchema.array().optional(), + bold: z.number().optional() +}) + +export type RoomTable = z.infer +export type DexieRoomsTable = EntityTable; +export const RoomTableColumn = 'id, createdBy, roomName, roomType, expirationDate, lastMessage' diff --git a/src/app/infra/database/dexie/instance/chat/schema/typing.ts b/src/app/infra/database/dexie/instance/chat/schema/typing.ts new file mode 100644 index 000000000..50ac388d7 --- /dev/null +++ b/src/app/infra/database/dexie/instance/chat/schema/typing.ts @@ -0,0 +1,13 @@ +import { z } from "zod"; +import { EntityTable } from 'Dexie'; + +export const TypingTableSchema = z.object({ + id: z.string().optional(), + userId: z.number().optional(), + userName: z.string(), + roomId: z.string(), +}) + +export type TypingTable = z.infer +export type DexieTypingsTable = EntityTable; +export const TypingTableColumn = 'id, userId, userName, roomId, entryDate' diff --git a/src/app/infra/database/dexie/instance/chat/schema/user-foto.ts b/src/app/infra/database/dexie/instance/chat/schema/user-foto.ts new file mode 100644 index 000000000..047a4cb65 --- /dev/null +++ b/src/app/infra/database/dexie/instance/chat/schema/user-foto.ts @@ -0,0 +1,12 @@ +import { EntityTable } from 'Dexie'; +import { z } from 'zod'; + +export const UserPhotoTableSchema = z.object({ + wxUserId: z.number(), + file: z.string(), + attachmentId: z.string().nullable() +}) + +export type UserPhotoTable = z.infer +export type DexieUserPhotoTable = EntityTable; +export const UserPhotoTableColumn = 'wxUserId' diff --git a/src/app/infra/database/dexie/service.ts b/src/app/infra/database/dexie/service.ts new file mode 100644 index 000000000..3961edb39 --- /dev/null +++ b/src/app/infra/database/dexie/service.ts @@ -0,0 +1,43 @@ + +import { Dexie } from 'Dexie'; +import { DexieMessageTable, messageTableColumn, MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; +import { DexieMembersTableSchema, MemberTableColumn } from 'src/app/infra/database/dexie/instance/chat/schema/members'; +import { DexieRoomsTable, RoomTableColumn } from 'src/app/infra/database/dexie/instance/chat/schema/room'; +import { DexieTypingsTable, TypingTableColumn } from 'src/app/infra/database/dexie/instance/chat/schema/typing'; +import { MessageEntity } from 'src/app/core/chat/entity/message'; +import { AttachmentTableColumn, DexieAttachmentsTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/attachment'; +import { DexieDistributionTable, DistributionTable, DistributionTableColumn } from './instance/chat/schema/destribution'; +import { BoldTableColumn, DexieBoldTable } from './instance/chat/schema/bold'; +import { DexieUserPhotoTable, UserPhotoTable, UserPhotoTableColumn } from './instance/chat/schema/user-foto'; +// import FDBFactory from 'fake-indexeddb/lib/FDBFactory'; +// import FDBKeyRange from 'fake-indexeddb/lib/FDBKeyRange'; + + +// Database declaration (move this to its own module also) +export const chatDatabase = new Dexie('chat-database-v2',{ +// indexedDB: new FDBFactory, +// IDBKeyRange: FDBKeyRange, // Mocking IDBKeyRange +}) as Dexie & { + message: DexieMessageTable, + members: DexieMembersTableSchema, + room: DexieRoomsTable, + typing: DexieTypingsTable, + attachment: DexieAttachmentsTableSchema, + distribution: DexieDistributionTable, + bold: DexieBoldTable, + userPhoto: DexieUserPhotoTable +}; + +chatDatabase.version(1).stores({ + message: messageTableColumn, + members: MemberTableColumn, + room: RoomTableColumn, + typing: TypingTableColumn, + attachment: AttachmentTableColumn, + distribution: DistributionTableColumn, + bold:BoldTableColumn, + userPhoto: UserPhotoTableColumn +}); + +chatDatabase.message.mapToClass(MessageEntity) +// Apply in-memory storage diff --git a/src/app/shared/chat/add-user/add-user.page.scss b/src/app/infra/file-picker/adapter.ts similarity index 100% rename from src/app/shared/chat/add-user/add-user.page.scss rename to src/app/infra/file-picker/adapter.ts diff --git a/src/app/infra/file-picker/file-picker.service.ts b/src/app/infra/file-picker/file-picker.service.ts new file mode 100644 index 000000000..c4e5db745 --- /dev/null +++ b/src/app/infra/file-picker/file-picker.service.ts @@ -0,0 +1,74 @@ +import { Injectable } from '@angular/core'; +import { Camera, CameraPhoto, CameraResultType, CameraSource } from '@capacitor/camera'; +import { err, ok, Result } from 'neverthrow'; + +/** + * Parameters for picking a picture. + * @typedef {Object} PickPictureParams + * @property {number} [quality=90] - The quality of the picture, from 0 to 100. Defaults to 90. + * @property {CameraResultType} [cameraResultType=CameraResultType.DataUrl] - The result type of the photo. Defaults to `CameraResultType.DataUrl`. + */ +type PickPictureParams = { + quality?: number; + cameraResultType?: CameraResultType; +}; + +/** + * Error types for the FilePickerService. + */ +export interface FilePickerError { + type: 'PERMISSION_DENIED' | 'CANCELLED' | 'UNKNOWN'; + message: string; + originalError?: any; +} + +/** + * Service for handling file picking functionality. + * This service provides methods to pick a picture from the device's photo library. + */ +@Injectable({ + providedIn: 'root' +}) +export class FilePickerService { + + constructor() { } + + /** + * Picks a picture from the device's photo library. + * @param {PickPictureParams} params - The parameters for picking the picture. + * @param {number} [params.quality=90] - The quality of the picture, from 0 to 100. Defaults to 90. + * @param {CameraResultType} [params.cameraResultType=CameraResultType.DataUrl] - The result type of the photo. Defaults to `CameraResultType.DataUrl`. + * @returns {Promise | err>} A promise that resolves with an `ok` result containing the file or an `err` result containing the error. + */ + async getPicture({quality = 90, cameraResultType = CameraResultType.DataUrl }: PickPictureParams): Promise> { + try { + const file = await Camera.getPhoto({ + quality: quality, + resultType: cameraResultType, + source: CameraSource.Photos + }) + + return ok(file); + } catch (e) { + if (e.message.includes('denied')) { + return err({ + type: 'PERMISSION_DENIED', + message: 'Permission to access photos was denied.', + originalError: e + }); + } else if (e.message.includes('User cancelled photos app')) { + return err({ + type: 'CANCELLED', + message: 'User cancelled the photo selection.', + originalError: e + }); + } else { + return err({ + type: 'UNKNOWN', + message: 'An unknown error occurred while picking the picture.', + originalError: e + }); + } + } + } +} diff --git a/src/app/infra/file-picker/mobile/file-picker-mobile.service.ts b/src/app/infra/file-picker/mobile/file-picker-mobile.service.ts new file mode 100644 index 000000000..2d4fad859 --- /dev/null +++ b/src/app/infra/file-picker/mobile/file-picker-mobile.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@angular/core'; +import { FilePicker, PickFilesResult } from '@capawesome/capacitor-file-picker'; +import { err, ok, Result } from 'neverthrow'; + +@Injectable({ + providedIn: 'root' +}) +export class FilePickerMobileService { + + constructor() { } + + /** + * @example + * ```typescript + * const types = ['application/pdf', 'application/doc', 'application/docx','application/xls', 'application/xlsx', 'application/ppt','application/pptx', 'application/txt']; + * const multiple = false; // Invalid due to commas + * const readData = true; // Invalid due to commas + * ``` + */ + async getFile({types, multiple, readData}): Promise> { + try { + + const result = await FilePicker.pickFiles({ + types: types, + multiple: multiple, + readData: readData, + }); + + return ok(result) + } catch (e) { + return err(e) + } + + } +} diff --git a/src/app/infra/file-picker/web/file-picker-web.service.ts b/src/app/infra/file-picker/web/file-picker-web.service.ts new file mode 100644 index 000000000..c045883cf --- /dev/null +++ b/src/app/infra/file-picker/web/file-picker-web.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { Camera, CameraResultType, CameraSource } from '@capacitor/camera'; +import { err, ok, Result } from 'neverthrow'; +import { FileType } from 'src/app/models/fileType'; + + + +@Injectable({ + providedIn: 'root' +}) +export class FilePickerWebService { + + constructor() { } + + getFileFromDevice(types: typeof FileType[]): Promise> { + let input = document.createElement('input'); + input.type = 'file'; + input.accept = types.join(', ') + + input.click(); + + return new Promise((resolve, reject)=>{ + input.onchange = async () => { + const file = Array.from(input.files) + resolve(ok(file[0] as File)); + }; + }) + } + +} diff --git a/src/app/infra/file-system/mobile/file-system-mobile.service.ts b/src/app/infra/file-system/mobile/file-system-mobile.service.ts new file mode 100644 index 000000000..f6323056f --- /dev/null +++ b/src/app/infra/file-system/mobile/file-system-mobile.service.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@angular/core'; +import { File, IWriteOptions } from '@awesome-cordova-plugins/file/ngx'; +import { err, ok, Result } from 'neverthrow'; +import { FileOpener } from '@awesome-cordova-plugins/file-opener/ngx'; + + +@Injectable({ + providedIn: 'root' +}) +export class FileSystemMobileService { + + constructor( + private file: File, + private FileOpener: FileOpener, + ) { } + + /** + * Write a new file to the desired location. + * + * @param {string} path Base FileSystem. Please refer to the iOS and Android filesystem above + * @param {string} fileName path relative to base path + * @param {string | Blob | ArrayBuffer} text content, blob or ArrayBuffer to write + * @param {IWriteOptions} whether to replace/append to an existing file. See IWriteOptions for more information. + * @param options + * @returns {Promise} Returns a Promise that resolves to updated file entry or rejects with an error. + */ + async writeFile(path: string, fileName: string, context: string | Blob | ArrayBuffer, options?: IWriteOptions): Promise> { + try { + const result = await this.file.writeFile(path, fileName, context, { replace: true }) + return ok(result) + } catch (e) { + console.log('Error writing file', e) + return err(e) + } + } + + async fileOpener(filePath: string, mimetype: string) { + try { + const result = this.FileOpener.open(filePath, mimetype) + return ok(result) + } catch (e) { + console.error('Error opening file', e) + return err(e) + } + } + +} diff --git a/src/app/infra/http/adapter.ts b/src/app/infra/http/adapter.ts new file mode 100644 index 000000000..dea156c06 --- /dev/null +++ b/src/app/infra/http/adapter.ts @@ -0,0 +1,14 @@ +import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http'; +import { HttpResult } from './type'; +import { Result } from 'neverthrow'; +import { Observable } from 'rxjs'; + + +export abstract class HttpAdapter { + abstract post(url: string, body: any): Promise, HttpErrorResponse>> + abstract get(url: string, options?: Object): Promise, HttpErrorResponse>> + abstract put(url: string, body: any): Promise, HttpErrorResponse>> + abstract patch(url: string, body?: Object): Promise, HttpErrorResponse>> + abstract delete(url: string, body?: Object): Promise, HttpErrorResponse>> + abstract listen():Observable, HttpErrorResponse>> +} \ No newline at end of file diff --git a/src/app/infra/http/http.module.ts b/src/app/infra/http/http.module.ts new file mode 100644 index 000000000..169ba0117 --- /dev/null +++ b/src/app/infra/http/http.module.ts @@ -0,0 +1,17 @@ +import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { HttpAdapter } from './adapter'; +import { HttpService } from './http.service'; + +@NgModule({ + imports: [], + declarations: [], + schemas: [], + providers: [ + { + provide: HttpAdapter, + useClass: HttpService, // or MockDataService + } + ], + entryComponents: [] +}) +export class HttpModule {} diff --git a/src/app/infra/http/http.service.ts b/src/app/infra/http/http.service.ts new file mode 100644 index 000000000..c6c06967f --- /dev/null +++ b/src/app/infra/http/http.service.ts @@ -0,0 +1,128 @@ +import { HttpErrorResponse, HttpHeaders, HttpParams, HttpResponse } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { ok, err, Result } from 'neverthrow'; +import { HttpResult } from './type'; +import { BehaviorSubject } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class HttpService { + + private responseSubject = new BehaviorSubject, HttpErrorResponse>>(null); + + constructor(private http: HttpClient) { } + + async post(url: string, body: any): Promise, HttpErrorResponse>> { + try { + const response = await this.http.post(url, body, { observe: 'response' }).toPromise(); + const data = { + data: response.body, + status: response.status, + headers: response.headers, + url: response.url || url, + method: '', + } + this.responseSubject.next(ok(data)) + return ok(data); + } catch (e) { + this.responseSubject.next(err(e)) + return err(e as HttpErrorResponse); + } + } + + async get(url: string, options = {}): Promise, HttpErrorResponse>> { + try { + const response = await this.http.get(url, { ...options, observe: 'response' }).toPromise(); + + const data = { + method: 'GET', + data: response.body, + status: response.status, + headers: response.headers, + url: response.url || url + } + + this.responseSubject.next(ok(data)) + return ok(data); + } catch (e) { + this.responseSubject.next(err(e)) + return err(e as HttpErrorResponse); + } + } + + async put(url: string, body: any): Promise, HttpErrorResponse>> { + try { + const response = await this.http.put(url, body, { observe: 'response' }).toPromise(); + + const data = { + data: response.body, + status: response.status, + headers: response.headers, + url: response.url || url, + method: '', + } + + this.responseSubject.next(ok(data)) + return ok(data); + } catch (e) { + this.responseSubject.next(err(e)) + return err(e as HttpErrorResponse); + } + } + + async patch(url: string, body: any = {}): Promise, HttpErrorResponse>> { + try { + const response = await this.http.patch(url, body, { observe: 'response' }).toPromise(); + + const data = { + data: response.body, + status: response.status, + headers: response.headers, + url: response.url || url, + method: '', + } + + this.responseSubject.next(ok(data)) + return ok(data); + } catch (e) { + this.responseSubject.next(err(e)) + return err(e as HttpErrorResponse); + } + } + + async delete(url: string, body = {}): Promise, HttpErrorResponse>> { + const options = { + body: body, // Pass payload as the body of the request + observe: 'response' as 'body' + }; + + try { + const response: any = await this.http.delete(url, options).toPromise(); + + const data = { + data: response?.body, + status: response?.status, + headers: response?.headers, + url: response?.url || url, + method: '', + } + + this.responseSubject.next(ok(data)) + return ok(data as any); + } catch (e) { + this.responseSubject.next(err(e)) + return err(e as HttpErrorResponse); + } + } + + listen() { + return this.responseSubject.asObservable() + } +} + +export function isHttpResponse(data: any): data is HttpResponse { + return typeof data.status == 'number'; +} + diff --git a/src/app/infra/http/type.ts b/src/app/infra/http/type.ts new file mode 100644 index 000000000..cae486b71 --- /dev/null +++ b/src/app/infra/http/type.ts @@ -0,0 +1,17 @@ +import { HttpErrorResponse, HttpHeaders, HttpParams } from '@angular/common/http'; +import { Result } from 'neverthrow'; + +export interface Options { + headers?: HttpHeaders + params?: HttpParams +} + +export interface HttpResult { + data: T | null; + status: number; + headers: HttpHeaders; + url: string; + method: string +} + +export type IHttPReturn = Promise, HttpErrorResponse>> \ No newline at end of file diff --git a/src/app/infra/repository/adapter.ts b/src/app/infra/repository/adapter.ts new file mode 100644 index 000000000..72bdbf4d8 --- /dev/null +++ b/src/app/infra/repository/adapter.ts @@ -0,0 +1,28 @@ +import { Result } from 'neverthrow'; +import { ZodError} from 'zod'; +import { IDBError } from './types'; +import Dexie, { EntityTable, Table } from 'Dexie'; + +// Define a type for the Result of repository operations +export type RepositoryResult = Result>; +export abstract class IDexieRepository> { + + abstract createTransaction(callback: (table: I) => Promise): Promise + abstract insert(document: T): Promise> + + abstract insertMany(documents: T[]): Promise> + + abstract update(id: any, updatedDocument: Partial) : Promise> + + abstract delete(id: any): Promise> + + abstract findById(id: any) : Promise> + + abstract find(filter: Partial): Promise> + + abstract findOne(filter: Partial): Promise> + + abstract findAll(): Promise> + + abstract count(filter?: Object): Promise> +} diff --git a/src/app/infra/repository/dexie/dexie-repository.service.ts b/src/app/infra/repository/dexie/dexie-repository.service.ts new file mode 100644 index 000000000..eaef5b12d --- /dev/null +++ b/src/app/infra/repository/dexie/dexie-repository.service.ts @@ -0,0 +1,256 @@ +import { Result, ok, err } from 'neverthrow'; +import Dexie, { EntityTable, Table } from 'Dexie'; +import { ZodError, ZodObject, ZodSchema } from 'zod'; +import { Logger } from 'src/app/services/logger/main/service'; +import { IDexieRepository, RepositoryResult } from '../adapter' +import { IDBError, IDexieError } from '../types'; + +// Define a type for the Result of repository operations + +class DBError extends Error implements IDBError { + zodError?: ZodError; + parameters: T; + error?: IDexieError; + + constructor(data: IDBError) { + super(data.message); + this.zodError = data.zodError; + this.parameters = data.parameters; + this.error = data.error; + + Logger.error(data.message, { + zodError: this.zodError, + parameters: this.parameters + }) + + // // Manually capture the stack trace if needed + // if (Error.captureStackTrace) { + // Error.captureStackTrace(this, DBError); + // } + } +} + +export class DexieRepository> implements IDexieRepository { + private table: EntityTable; + private ZodSchema: ZodSchema + private ZodPartialSchema: ZodSchema + private db: Dexie + + constructor(table: EntityTable, ZodSchema: ZodSchema, db?:Dexie) { + this.table = table as any + this.ZodSchema = ZodSchema + this.ZodPartialSchema = (ZodSchema as ZodObject).partial() as any; + this.db = db + } + + // Method to create a transaction and use the callback + async createTransaction(callback: (table:I) => Promise): Promise { + return this.db.transaction('rw', this.table, async () => { + try { + // Execute the callback function + await callback(this.table as any); + } catch (error) { + // Transactions are automatically rolled back on error + throw error; + } + }).then(() => { + console.log('Transaction completed successfully'); + }).catch((error) => { + console.error('Transaction failed: ' + error); + }); + } + + + async insert(document: T): Promise> { + + const dataValidation = this.ZodSchema.safeParse(document) + + if(dataValidation.success) { + try { + const id = await this.table.add(dataValidation.data); + return ok(id); + } catch (_error) { + const error: IDexieError = _error + return err(new DBError({ + message: `dexie.js failed to insert into ${this.table.name}, ${error.message}`, + parameters: document, + error: error + })) + } + } else { + return err(new DBError({ + message: `dexie.js failed to insert into ${this.table.name}, invalid data`, + parameters: document, + zodError: dataValidation.error + })) + } + } + + async insertMany(documents: T[]): Promise> { + // Validate each document + const schema = this.ZodSchema.array() + + const validationResult = schema.safeParse(documents) + if(!validationResult.success) { + return err(new DBError({ + message: `dexie.js failed to insert many into ${this.table.name}, invalid data`, + parameters: documents, + zodError: validationResult.error + })) + } + + try { + const ids = await this.table.bulkAdd(documents as any); + return ok(ids); + } catch (_error) { + const error: IDexieError = _error + return err(new DBError({ + message: `dexie.js failed to insert into many ${this.table.name}, ${error.message}`, + parameters: documents, + error: error + })) + } + } + + async update(id: any, updatedDocument: Partial) { + + const dataValidation = this.ZodPartialSchema.safeParse(updatedDocument) + + if(dataValidation.success) { + try { + const updatedCount = await this.table.update(id, dataValidation.data); + return ok(updatedCount); + } catch (_error) { + const error: IDexieError = _error + return err(new DBError({ + message: `dexie.js Failed to update into ${this.table.name}, ${error.message} `, + parameters: { + ...updatedDocument, + [this.table.schema.primKey.name]: id + } as unknown as T, + error: error + })) + } + } else { + return err(new DBError({ + message: `dexie.js failed to update into ${this.table.name}, invalid data`, + parameters: { + ...updatedDocument, + [this.table.schema.primKey.name]: id + } as unknown as T, + zodError: dataValidation.error + })) + } + } + + async updateMany(updatedDocument: Partial[]) { + + const schema = this.ZodSchema.array() + const dataValidation = schema.safeParse(updatedDocument) + + if(dataValidation.success) { + try { + const updatedCount = await this.table.bulkPut(dataValidation.data); + return ok(updatedCount); + } catch (_error) { + const error: IDexieError = _error + return err(new DBError({ + message: `dexie.js Failed to update into ${this.table.name}, ${error.message} `, + parameters: document, + error: error + })) + } + } else { + return err(new DBError({ + message: `dexie.js failed to update many into ${this.table.name}, invalid data`, + parameters: updatedDocument , + zodError: dataValidation.error + })) + } + } + + + async delete(id: any): Promise> { + try { + await this.table.delete(id); + return ok(undefined); + } catch (_error) { + const error: IDexieError = _error + return err(new DBError({ + message: `dexie.js Failed to delete into ${this.table.name}, ${error.message} `, + parameters: id, + error: error + })) + } + } + + async findById(id: any) { + try { + const document = await this.table.get(id); + return ok(document); + } catch (_error) { + const error: IDexieError = _error + return err(new DBError({ + message: `dexie.js Failed to delete into ${this.table.name}, ${error.message} `, + parameters: id, + error: error + })) + } + } + + async find(filter: Partial): Promise> { + try { + const documents: any = await this.table.where(filter).toArray(); + return ok(documents); + } catch (_error) { + const error: IDexieError = _error; + return err(new DBError({ + message: `dexie.js Failed to find into ${this.table.name}, ${error.message} `, + parameters: filter as any, + error: error + })) + } + } + + async findOne(filter: Partial): Promise> { + try { + const document = await this.table.where(filter).first(); + return ok(document); + } catch (_error) { + const error: IDexieError = _error + return err(new DBError({ + message: `dexie.js Failed to findOne into ${this.table.name}, ${error.message} `, + parameters: filter as any, + error: error + })) + } + } + + async findAll(): Promise> { + try { + const documents = await this.table.toArray() + return ok(documents); + } catch (_error) { + const error: IDexieError = _error + return err(new DBError({ + message: `dexie.js Failed to findAll into ${this.table.name}, ${error.message} `, + parameters: null, + error: error + })) + } + } + + async count(filter?: Object): Promise> { + try { + const count = filter ? await this.table.where(filter).count() : await this.table.count(); + return ok(count); + } catch (_error) { + const error: IDexieError = _error + return err(new DBError({ + message: `dexie.js Failed to count into ${this.table.name}, ${error.message}`, + parameters: filter as any, + error: error + })) + } + } +} diff --git a/src/app/infra/repository/index.ts b/src/app/infra/repository/index.ts new file mode 100644 index 000000000..462cc2869 --- /dev/null +++ b/src/app/infra/repository/index.ts @@ -0,0 +1,2 @@ +export * from './adapter'; +// export * from './types'; diff --git a/src/app/infra/repository/types.ts b/src/app/infra/repository/types.ts new file mode 100644 index 000000000..f623814c0 --- /dev/null +++ b/src/app/infra/repository/types.ts @@ -0,0 +1,56 @@ +// export type UpdatedModel = { +// matchedCount: number; +// modifiedCount: number; +// acknowledged: boolean; +// upsertedId: unknown | any; +// upsertedCount: number; +// }; + +import { ZodError } from "zod" + +// export type RemovedModel = { +// deletedCount: number; +// deleted: boolean; +// }; + +// export type CreatedModel = { +// id: string; +// created: boolean; +// }; + +// export type CreatedOrUpdateModel = { +// id: string; +// created: boolean; +// updated: boolean; +// }; + +// export enum DatabaseOperationEnum { +// EQUAL = 'equal', +// NOT_EQUAL = 'not_equal', +// NOT_CONTAINS = 'not_contains', +// CONTAINS = 'contains' +// } + +// export type DatabaseOperationCommand = { +// property: keyof T; +// value: unknown[]; +// command: DatabaseOperationEnum; +// }; + +export type IDBError = { + message: string, + zodError?: ZodError, + parameters?: T, + error?: IDexieError +} + +export interface IDexieError extends Error { + name: string; // The name of the error, e.g., 'NotFoundError', 'ConstraintError' + message: string; // The error message + stack?: string; // Optional stack trace + inner?: Error; // Some Dexie errors have an inner error + dbName?: string; // The name of the Dexie database where the error occurred + tableName?: string; // The name of the table where the error occurred + operation?: string; // The operation being performed (e.g., 'put', 'get', 'delete') + key?: any; // The key involved in the operation, if applicable +} diff --git a/src/app/shared/popover/chat-debugging/chat-debugging.page.scss b/src/app/infra/repository/util.ts similarity index 100% rename from src/app/shared/popover/chat-debugging/chat-debugging.page.scss rename to src/app/infra/repository/util.ts diff --git a/src/app/infra/socket/adapter.ts b/src/app/infra/socket/adapter.ts new file mode 100644 index 000000000..064b4d77c --- /dev/null +++ b/src/app/infra/socket/adapter.ts @@ -0,0 +1,14 @@ +import { Observable, BehaviorSubject } from 'rxjs'; +import { Result } from 'neverthrow'; +import { HubConnection } from '@microsoft/signalr'; +import { ISignalRInput } from './type'; + +export abstract class ISignalRService { + abstract establishConnection(): Promise>; + abstract sendData(input: ISignalRInput): Promise; + abstract join(): void; + abstract getData(): Observable<{ method: string; data: T }>; + abstract getConnectionState(): Observable; + abstract onReconnect(): Observable; + abstract newConnection(): void; +} \ No newline at end of file diff --git a/src/app/infra/socket/signalR/signal-r.service.ts b/src/app/infra/socket/signalR/signal-r.service.ts new file mode 100644 index 000000000..5dc31bc98 --- /dev/null +++ b/src/app/infra/socket/signalR/signal-r.service.ts @@ -0,0 +1,104 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject, Observable, Subject, timer } from 'rxjs'; +import { Platform } from '@ionic/angular'; +import { SignalRConnection, SocketMessage } from './signalR'; +import { Plugins } from '@capacitor/core'; +import { switchMap } from 'rxjs/operators'; +import { Result } from 'neverthrow'; +import { HubConnection } from '@microsoft/signalr'; +import { ISignalRInput } from '../type'; + +const { App } = Plugins; + +@Injectable({ + providedIn: 'root' +}) +export class SignalRService { + private connection!: SignalRConnection; + private connectingSubject: BehaviorSubject = new BehaviorSubject(null); + private sendDataSubject: BehaviorSubject<{method: string, data: any}> = new BehaviorSubject<{method: string, data: any}>(null); + + private deadConnectionBackGround: Subject; + + constructor(private platform: Platform) { + + this.deadConnectionBackGround = new Subject() + this.deadConnectionBackGround.pipe( + switchMap(() => timer(150000)), // 2 minutes 30 seconds + ).subscribe(() => { + console.log('trigger new connections') + this.newConnection() + }) + + try { + if (!this.platform.is('desktop')) { + App.addListener('appStateChange', ({ isActive }) => { + if (isActive) { + // The app is in the foreground. + // console.log('App is in the foreground'); + this.deadConnectionBackGround.next() + + } + }); + } else { + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'visible') { + this.deadConnectionBackGround.next() + } + }); + } + } catch(error) {} + } + + async establishConnection(): Promise> { + + // const connection = new SignalRConnection({url:'https://41e3-41-63-166-54.ngrok-free.app/api/v2/chathub'}) + const connection = new SignalRConnection({url:'https://gdapi-dev.dyndns.info/stage/api/v2/chathub'}) + const attempConnection = await connection.establishConnection() + + if(attempConnection.isOk()) { + console.log('connect') + this.connection?.closeConnection() + this.connection = connection + + this.connection.getData().subscribe((data) => { + this.sendDataSubject.next(data) + this.deadConnectionBackGround.next() + }) + + this.connection.getConnectionState().subscribe((data) => { + this.connectingSubject.next(data) + }) + + return attempConnection + } else { + + return new Promise((resolve) => { + setTimeout(() => { + resolve(this.establishConnection()) + }, 2000) + }) + } + } + + sendData(input: ISignalRInput) { + return this.connection.sendData(input) + } + + join() { + return this.connection.join() + } + + getData() { + return this.sendDataSubject.asObservable() as BehaviorSubject<{method: string, data: T}> + } + + public getConnectionState(): Observable { + return this.connectingSubject.asObservable(); + } + + newConnection() { + this.establishConnection() + } + +} diff --git a/src/app/infra/socket/signalR/signalR.ts b/src/app/infra/socket/signalR/signalR.ts new file mode 100644 index 000000000..9b863fadb --- /dev/null +++ b/src/app/infra/socket/signalR/signalR.ts @@ -0,0 +1,207 @@ +import * as signalR from '@microsoft/signalr'; +import { BehaviorSubject, Observable, race, timer } from 'rxjs'; +import { ok, Result, err } from 'neverthrow'; +import { SessionStore } from 'src/app/store/session.service'; +import { filter, first } from 'rxjs/operators'; +import { v4 as uuidv4 } from 'uuid' +import { ISignalRInput } from '../type'; +import { MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; + +export interface SocketMessage { + method: string, + data: T +} + +export enum EnumSocketError { + catch = 1, + close +} + +export class SignalRConnection { + + private hubConnection: signalR.HubConnection; + private connectionStateSubject: BehaviorSubject = new BehaviorSubject(false); + private disconnectSubject: BehaviorSubject = new BehaviorSubject(false); + private reconnectSubject: BehaviorSubject = new BehaviorSubject(false); + private sendLaterSubject: BehaviorSubject = new BehaviorSubject(false); + private reconnect = true + + private sendDataSubject: BehaviorSubject<{method: string, data: any}> = new BehaviorSubject<{method: string, data: any}>(null); + private pendingRequests: Map = new Map(); + url: string + private hasConnectOnce = false + + constructor({url}) { + this.url = url + } + + establishConnection(): Promise> { + return new Promise((resolve, reject) => { + + const hubConnection = new signalR.HubConnectionBuilder() + .withUrl(this.url) + .build(); + + this.hubConnection = hubConnection + + hubConnection + .start() + .then(() => { + this.hubConnection = hubConnection + this.hasConnectOnce = true + console.log('Connection started'); + this.connectionStateSubject.next(true); + this.join() + this.addMessageListener() + resolve(ok(hubConnection)) + }) + .catch(error => { + console.log('Error while starting connection: ' + error); + if(this.hasConnectOnce) { + setTimeout(()=> { + resolve(this.attempReconnect()); + }, 2000) + } else { + resolve(err(false)) + } + }); + + hubConnection.onclose(() => { + console.log('Connection closed'); + this.connectionStateSubject.next(false); + this.disconnectSubject.next(true) + + this.pendingRequests.forEach((_, requestId) => { + const data = this.pendingRequests.get(requestId); + + if(data) { + const { reject } = data + reject(err({ + type: EnumSocketError.close + })); + this.pendingRequests.delete(requestId); + } + + }); + + if(this.reconnect) { + resolve(this.attempReconnect()); + } else { + resolve(err(false)) + } + + }); + }) + } + + + async attempReconnect() { + const attempConnection = await this.establishConnection() + + if(attempConnection.isOk()) { + this.reconnectSubject.next(true) + } + + return attempConnection + } + + public join() { + if(this.connectionStateSubject.value == true) { + this.hubConnection.invoke("Join", SessionStore.user.UserId, SessionStore.user.FullName); + //this.hubConnection.invoke("Join", 105, "UserFirefox"); + } else { + this.sendLaterSubject.next({method: 'SendMessage', args:["Join", 312, "Daniel"]}) + } + + } + + + sendData(input: ISignalRInput): Promise> { + return new Promise((resolve, reject) => { + + if(this.connectionStateSubject.value == true) { + try { + this.pendingRequests.set(input.data.requestId, { resolve, reject: (data: any) => resolve(data) }); + + this.hubConnection.invoke(input.method, input.data) + + this.sendDataSubject.pipe( + filter((message) => { + return input.data.requestId == message?.data.requestId || + input?.data?.roomName == message?.data.roomName && typeof input?.data?.roomName == 'string' + + }), + ).subscribe(value => { + resolve(ok(value.data as unknown as T)) + // console.log('Received valid value:', value); + }); + + } catch(error) { + resolve(err({ + type: EnumSocketError.catch + })) + } + + + } else { + this.sendLaterSubject.next({method: 'SendMessage', args: input}) + return reject(err(false)) + } + + }) + } + + private addMessageListener(): void { + + const methods = ['ReceiveMessage', 'TypingMessage', 'AvailableUsers', + 'ReadAt', 'DeleteMessage', 'UpdateMessage', 'GroupAddedMembers', + 'GroupDeletedMembers', 'UserAddGroup'] + + for(const method of methods) { + this.hubConnection.on(method, (message: any) => { + this.sendDataSubject.next({ + method: method, + data: message + }) + }); + } + } + + public getConnectionState(): Observable { + return this.connectionStateSubject.asObservable(); + } + + public getDisconnectTrigger(): Observable { + return this.disconnectSubject.asObservable(); + } + + public getData() { + return this.sendDataSubject.asObservable() + } + + public closeConnection(): void { + this.reconnect = false + if (this.hubConnection) { + this.hubConnection + .stop() + .then(() => { + console.log('Connection closed by user'); + this.connectionStateSubject.next(false); + this.pendingRequests.forEach((_, requestId) => { + const data = this.pendingRequests.get(requestId); + + if(data) { + const { reject } = data + reject(err({ + type: EnumSocketError.close + })); + this.pendingRequests.delete(requestId); + } + + }); + }) + .catch(err => console.log('Error while closing connection: ' + err)); + } + } + +} diff --git a/src/app/infra/socket/signalR/simple.html b/src/app/infra/socket/signalR/simple.html new file mode 100644 index 000000000..d0747bc17 --- /dev/null +++ b/src/app/infra/socket/signalR/simple.html @@ -0,0 +1,50 @@ + + + + SignalR Client + + + +

SignalR Client

+
+ + + + diff --git a/src/app/infra/socket/signalR/socket.ts b/src/app/infra/socket/signalR/socket.ts new file mode 100644 index 000000000..815029b1a --- /dev/null +++ b/src/app/infra/socket/signalR/socket.ts @@ -0,0 +1,129 @@ +import { Injectable } from '@angular/core'; +import { Observable, Subject, BehaviorSubject } from 'rxjs'; +import { webSocket, WebSocketSubject } from 'rxjs/webSocket'; +import { catchError, retryWhen, tap, delay } from 'rxjs/operators'; +import { SessionStore } from 'src/app/store/session.service'; +import { v4 as uuidv4 } from 'uuid' + + +export interface WebSocketMessage { + type: string; + payload: any; + requestId?: string; +} + +interface WebSocketError { + type: string; + error: any; +} + +@Injectable({ + providedIn: 'root' +}) +export class WebSocketService { + private socket$: WebSocketSubject; + private messageSubject$: Subject; + private connectionStatus$: BehaviorSubject; + private reconnectAttempts = 0; + private readonly maxReconnectAttempts = 5; + + callback: {[key: string]: Function} = {} + + constructor() { + this.messageSubject$ = new Subject(); + this.connectionStatus$ = new BehaviorSubject(false); + + // this.connect('https://5-180-182-151.cloud-xip.com:85/ws/') + + // this.messages$.subscribe(({payload, requestId, type}) => { + // if(this.callback[requestId]) { + // this.callback[requestId]({payload, requestId, type}) + // delete this.callback[requestId] + + + // } + // }) + } + + public connect(url: string) { + this.socket$ = webSocket(url); + + this.socket$.pipe( + tap({ + + error: () => { + this.connectionStatus$.next(false); + } + }), + retryWhen(errors => errors.pipe( + tap(() => { + this.reconnectAttempts++; + if (this.reconnectAttempts >= this.maxReconnectAttempts) { + throw new Error('Max reconnect attempts reached'); + } + }), + delay(1000) + )) + ).subscribe( + (message) => { + this.messageSubject$.next(message); + + if (!this.connectionStatus$.getValue()) { + this.connectionStatus$.next(true); + this.reconnectAttempts = 0; + + // Send a message when the connection is established + this.sendMessage(SessionStore.user.UserId as any).subscribe(); + } + }, + (err) => { + console.error('WebSocket connection error:', err); + }, + () => { + console.log('WebSocket connection closed'); + this.connectionStatus$.next(false); + } + ); + } + + public sendMessage(message: WebSocketMessage): Observable { + return new Observable(observer => { + + + + if(typeof message == 'object') { + message.requestId = uuidv4() + this.socket$.next(message); + + this.callback[message.requestId] = ({payload, requestId})=> { + observer.next(payload as any); + observer.complete(); + } + + } else { + this.socket$.next(message); + observer.next({} as any); + observer.complete(); + } + + + + }).pipe( + catchError(err => { + console.error('Send message error:', err); + return new Observable(observer => { + observer.error({ type: 'SEND_ERROR', error: err }); + }); + }) + ); + } + + + public get messages$(): Observable { + return this.messageSubject$.asObservable(); + } + + public get connectionStatus(): Observable { + return this.connectionStatus$.asObservable(); + } +} diff --git a/src/app/infra/socket/type.ts b/src/app/infra/socket/type.ts new file mode 100644 index 000000000..f8f7e35e3 --- /dev/null +++ b/src/app/infra/socket/type.ts @@ -0,0 +1,10 @@ +import { z } from "zod"; + +const SignalRInputSchema = z.object({ + method: z.string(), + data: z.object({ + requestId: z.string(), + }).catchall(z.unknown()), // Allows any additional properties with unknown values +}) + +export type ISignalRInput = z.infer; diff --git a/src/app/infra/speaker/speaker.service.ts b/src/app/infra/speaker/speaker.service.ts new file mode 100644 index 000000000..8e28cc607 --- /dev/null +++ b/src/app/infra/speaker/speaker.service.ts @@ -0,0 +1,105 @@ +import { Injectable } from '@angular/core'; +import { GenericResponse, RecordingData, VoiceRecorder } from 'capacitor-voice-recorder'; +import { err, ok, Result } from 'neverthrow'; + +export enum StartRecordingResultError { + NoSpeaker, + NeedPermission, + alreadyRecording +} + +export enum StopRecordingResultError { + haventStartYet, + NoValue, + UnknownError +} + +@Injectable({ + providedIn: 'root' +}) +export class SpeakerService { + + + recording = false; + + constructor() { } + + + async startRecording(): Promise> { + // Request audio recording permission + await VoiceRecorder.requestAudioRecordingPermission(); + + // Check if the device can record audio + const canRecord = await VoiceRecorder.canDeviceVoiceRecord(); + if (!canRecord.value) { + return err(StartRecordingResultError.NoSpeaker); + } + + // Check if the app has permission to record audio + const hasPermission = await VoiceRecorder.requestAudioRecordingPermission(); + if (!hasPermission.value) { + return err(StartRecordingResultError.NeedPermission); + } + + // Check if recording is already in progress + if (this.recording) { + return err(StartRecordingResultError.alreadyRecording) + } + + // Start recording + this.recording = true; + VoiceRecorder.startRecording(); + return ok(true); + } + + + /** + * Example of a poorly structured startRecording method (commented out). + * + * - This example demonstrates improper chaining of promises and lack of proper error handling. + * - Avoid using this approach for better readability and maintainability. + */ + // bad code example + // async startRecording() { + // VoiceRecorder.requestAudioRecordingPermission(); + // if (await VoiceRecorder.canDeviceVoiceRecord().then((result: GenericResponse) => { return result.value })) { + // if (await VoiceRecorder.requestAudioRecordingPermission().then((result: GenericResponse) => { return result.value })) { + // //if(await this.hasAudioRecordingPermission()){ + // if (this.recording) { + // return; + // } + // this.recording = true; + // VoiceRecorder.startRecording() + // //} + // } + // else { + // return err('need Permission'); + // } + // } + // else { + // return err('no speaker'); + // } + // } + + async stopRecording(): Promise> { + if (!this.recording) { + return err(StopRecordingResultError.haventStartYet); + } + + this.recording = false; + + try { + const result = await VoiceRecorder.stopRecording(); + + if (result.value && result.value.recordDataBase64) { + const recordData = result.value.recordDataBase64; + return ok(result); + } else { + return err(StopRecordingResultError.NoValue); + } + } catch (error) { + // Handle any unexpected errors that might occur during stopRecording + return err(StopRecordingResultError.UnknownError); + } + } +} diff --git a/src/app/infra/speaker/type.ts b/src/app/infra/speaker/type.ts new file mode 100644 index 000000000..4a084fd74 --- /dev/null +++ b/src/app/infra/speaker/type.ts @@ -0,0 +1,11 @@ +export enum StartRecordingResultError { + NoSpeaker, + NeedPermission, + alreadyRecording +} + +export enum StopRecordingResultError { + haventStartYet, + NoValue, + UnknownError +} diff --git a/src/app/interceptors/chatToken.interceptor.ts b/src/app/interceptors/chatToken.interceptor.ts index f440cb4a2..2185ce850 100644 --- a/src/app/interceptors/chatToken.interceptor.ts +++ b/src/app/interceptors/chatToken.interceptor.ts @@ -15,8 +15,8 @@ import { Router } from '@angular/router'; import { SessionStore } from '../store/session.service'; import { environment } from "src/environments/environment"; import { PermissionService } from '../services/permission.service'; -import { NetworkServiceService } from 'src/app/services/network-service.service'; -import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service'; +import { NetworkServiceService, ConnectionStatus } from 'src/app/services/network-service.service'; +// import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service'; @Injectable() export class ChatTokenInterceptor implements HttpInterceptor { @@ -29,8 +29,7 @@ export class ChatTokenInterceptor implements HttpInterceptor { private excludedDomains = ['Login',environment.apiURL, 'http://localhost:8019'];// Add other domains as needed - constructor(private http: HttpClient, private router: Router, private p: PermissionService, private NetworkServiceService: NetworkServiceService, - private RochetChatConnectorService: RochetChatConnectorService) { } + constructor(private http: HttpClient, private router: Router, private p: PermissionService, private NetworkServiceService: NetworkServiceService) { } intercept( request: HttpRequest, diff --git a/src/app/modals/chat-options-features/chat-options-features.page.ts b/src/app/modals/chat-options-features/chat-options-features.page.ts index 70794ecab..6529f9c81 100644 --- a/src/app/modals/chat-options-features/chat-options-features.page.ts +++ b/src/app/modals/chat-options-features/chat-options-features.page.ts @@ -5,7 +5,6 @@ import { SearchList } from 'src/app/models/search-document'; import { NewEventPage } from 'src/app/pages/agenda/new-event/new-event.page'; import { SearchPage } from 'src/app/pages/search/search.page'; import { AlertService } from 'src/app/services/alert.service'; -import { ChatService } from 'src/app/services/chat.service'; import { FileLoaderService } from 'src/app/services/file/file-loader.service'; import { FileToBase64Service } from 'src/app/services/file/file-to-base64.service'; import { environment } from 'src/environments/environment'; @@ -33,7 +32,6 @@ export class ChatOptionsFeaturesPage implements OnInit { private navParams: NavParams, private fileLoaderService: FileLoaderService, private fileToBase64Service: FileToBase64Service, - private chatService: ChatService, public ThemeService: ThemeService ) { @@ -121,9 +119,7 @@ export class ChatOptionsFeaturesPage implements OnInit { } } - this.chatService.sendMessage(body).subscribe(res=> { - // - }); + // }; } @@ -145,10 +141,7 @@ export class ChatOptionsFeaturesPage implements OnInit { } } - this.chatService.sendMessage(body).subscribe(res=> { - - }); } /* getGroupContacts(room:any){ diff --git a/src/app/modals/profile/edit-profile/edit-profile.page.ts b/src/app/modals/profile/edit-profile/edit-profile.page.ts index 59025bafe..1715fc433 100644 --- a/src/app/modals/profile/edit-profile/edit-profile.page.ts +++ b/src/app/modals/profile/edit-profile/edit-profile.page.ts @@ -168,7 +168,7 @@ export class EditProfilePage implements OnInit { @XTracerAsync({name:'edit-profile/takePicture', bugPrint: true}) async uploadPicture(source: CameraSource, tracing?: TracingType) { - const capturedImage = await this.CameraService.takePicture({ + const capturedImage = await this.CameraService.takePictureAgenda({ width: 250, height: 250, quality: 100, diff --git a/src/app/modals/set-room-owner/set-room-owner.page.ts b/src/app/modals/set-room-owner/set-room-owner.page.ts deleted file mode 100644 index 9c5b73d1b..000000000 --- a/src/app/modals/set-room-owner/set-room-owner.page.ts +++ /dev/null @@ -1,98 +0,0 @@ - -import { Component, OnInit } from '@angular/core'; -import { ModalController, NavParams } from '@ionic/angular'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; -import { ThemeService } from 'src/app/services/theme.service' -import { ToastService } from 'src/app/services/toast.service'; - -@Component({ - selector: 'app-set-room-owner', - templateUrl: './set-room-owner.page.html', - styleUrls: ['./set-room-owner.page.scss'], -}) -export class SetRoomOwnerPage implements OnInit { - - textSearch:string = ""; - roomId:any; - members:any; - - constructor( - private modalController: ModalController, - private navParams: NavParams, - public ThemeService: ThemeService, - private toastService: ToastService, - public ChatSystemService: ChatSystemService, - ) { - this.roomId = this.navParams.get('roomId'); - this.members = this.navParams.get('members'); - } - - ngOnInit() { - // this.chatService.refreshtoken(); - } - - async close(){ - this.modalController.dismiss(); - } - - onChange(event){ - this.textSearch = event.detail.value; - } - - separateLetter(record, recordIndex, records){ - if(recordIndex == 0){ - return record.name[0]; - } - - let first_prev = records[recordIndex - 1].name[0]; - let first_current = record.name[0]; - - if(first_prev != first_current){ - return first_current; - } - return null; - } - - async setRoomOwner(user:any){ - - let res:any; - try { - res = await this.ChatSystemService.addRoomOwner(this.roomId, user._id) - } catch (error) { - console.error(error) - } - - - if(res.error){ - if(res.error.error == 'error-user-already-owner'){ - this.toastService._badRequest('Este utilizador já é administrador'); - } - else{ - this.toastService._badRequest('Não foi possível completar a ação, por favor tente novamente.'); - } - } - else{ - this.modalController.dismiss('success'); - } - - /* - let body = { - "roomId": this.roomId, - "userId": user._id - } - - this.chatService.addGroupOwner(body).subscribe((res)=>{ - this.close(); - this.toastService._successMessage('Operação realizada com sucesso'); - }, (e) => { - if(e.error.errorType == 'error-user-already-owner'){ - this.toastService._badRequest('Este utilizador já é administrador'); - } - else{ - this.toastService._badRequest('Não foi possível completar a ação, por favor tente novamente.'); - } - }); */ - - } - -} diff --git a/src/app/models/beast-orm-function.ts b/src/app/models/beast-orm-function.ts deleted file mode 100644 index 287f30792..000000000 --- a/src/app/models/beast-orm-function.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { AES, SHA1, enc } from "crypto-js"; -import { environment } from 'src/environments/environment' - - -function prefix() { - return environment.version.lastCommitNumber + environment.id+"-"; -} - -export function GET({key, instance}) { - if(environment.storageProduction) { - - try { - const newKey = prefix() + SHA1(key).toString() - const cipherText = localStorage.getItem(newKey) - const bytes = AES.decrypt(cipherText, newKey) - var decryptedData = bytes.toString(enc.Utf8); - const restoredData = JSON.parse(decryptedData) - - Object.assign(instance, restoredData); - - return restoredData - - } catch(error) { - console.log(error) - return {} - } - - } else { - const newKey = prefix() + key - const restoredData = JSON.parse(localStorage.getItem(newKey)) - Object.assign(instance, restoredData); - - return restoredData - } - -} - -export function SAVE({key, instance, dataToSave}) { - if(environment.storageProduction) { - const newKey = prefix() + SHA1(key).toString() - const stringifyData = JSON.stringify(dataToSave) - - const cipherText = AES.encrypt(stringifyData, newKey).toString(); - - localStorage.setItem(newKey, cipherText) - - } else { - const stringifyData = JSON.stringify(dataToSave) - const newKey = prefix() + key - - localStorage.setItem(newKey, stringifyData) - } -} - -export function DELETE({key, instance}) { - if(environment.storageProduction) { - const newKey = prefix() + SHA1(key).toString() - localStorage.removeItem(newKey) - - } else { - const newKey = prefix() + key - localStorage.removeItem(newKey) - } -} \ No newline at end of file diff --git a/src/app/models/beast-orm.ts b/src/app/models/beast-orm.ts deleted file mode 100644 index e1f119cce..000000000 --- a/src/app/models/beast-orm.ts +++ /dev/null @@ -1,116 +0,0 @@ -//import { models } from 'beast-orm' -import { environment } from 'src/environments/environment' -import { models } from 'src/plugin/src' -const { ArrayField, JsonField} = models.indexedDB.fields - -export class MessageModel extends models.Model { - channels = ArrayField() - mentions = ArrayField() - msg = models.CharField() - sendAttempt = models.IntegerField() - rid = models.CharField() - t = models.CharField({default:'', blank: true}) - ts = JsonField({blank:true}) - u = JsonField() - _id = models.CharField({blank:true}) - origin = models.CharField({blank:true}) - _updatedAt = models.IntegerField() - messageSend = models.BooleanField() - offline = models.BooleanField() - hasFile = models.BooleanField({blank:true}) - viewed = ArrayField({blank:true}) - received = ArrayField({blank:true}) - localReference = models.CharField({blank:true, unique: true}) - attachments = ArrayField({blank:true}) - file = JsonField({blank:true}) - UploadAttachmentsTemp = models.IntegerField() - - async getAttachments() { - console.log('this[id]', this['id']) - const _attachments = await attachments.filter({messageId: this['id']}).execute() - return _attachments[0] - } -} - -export class attachments extends models.Model { - messageId = models.IntegerField() - attachments = ArrayField({blank:true}) - file = JsonField({blank:true}) -} - -export class DeleteMessageModel extends models.Model { - messageId = models.CharField() - rid = models.CharField() - u = JsonField() - needToReceiveBy = ArrayField() -} - -models.register({ - databaseName: 'chat-storage'+environment.version.lastCommitNumber + environment.id + Number(environment.storageProduction), - type: 'indexedDB', - version: 11, - models: [MessageModel, DeleteMessageModel, attachments] -}) - - - -// // acçoes -export class ActionModel extends models.Model{ - static $tableName = 'ActionModel11' - - ProcessId = models.IntegerField({unique: true}) - Description = models.CharField() - Detail = models.CharField() - DateBegin = models.CharField() - DateEnd = models.CharField() - ActionType = models.CharField() - -} - - -export class PublicationFolderModel extends models.Model{ - - DateBegin = models.CharField() - Description = models.CharField() - Detail = models.CharField() -} - -export class PublicationDetailsModel extends models.Model{ - - DateIndex = models.CharField() - DocumentId = models.IntegerField({unique: true}) - ProcessId = models.CharField() - Title = models.CharField() - Message = models.CharField() - DatePublication = models.CharField() - OriginalFileName = models.CharField() - FileBase64 = models.CharField() - FileExtension = models.CharField() - OrganicEntityId = models.IntegerField() -} - - -export class WebtrixUserModel extends models.Model { - - FullName = models.CharField() - Role = models.CharField() -} - -models.register({ - databaseName: 'webtrix'+environment.version.lastCommitNumber + environment.id + Number(environment.storageProduction), - type: 'indexedDB', - version: 1, - models: [WebtrixUserModel] -}) - - -models.register({ - databaseName: 'actions'+environment.version.lastCommitNumber + environment.id + Number(environment.storageProduction), - type: 'indexedDB', - version: 14, - models: [PublicationDetailsModel, ActionModel, PublicationFolderModel] -}) - - - -window["MessageModel"] = MessageModel diff --git a/src/app/models/chatMethod.ts b/src/app/models/chatMethod.ts deleted file mode 100644 index e1ac3a2ba..000000000 --- a/src/app/models/chatMethod.ts +++ /dev/null @@ -1,390 +0,0 @@ -interface Ts { - $date: any; -} - -interface U { - _id: string; - username: string; - name: string; -} - -interface UpdatedAt { - $date: any; -} - -interface Attachment { - ts: Date; - title_link_download: boolean; -} - -export interface File { - type: string; - guid: string; - image_url: string; - subject: string; - start_date?: Date; - end_date?: Date; - venue: string; - id: string; -} - -interface EditedAt { - $date: number; -} - -interface EditedBy { - _id: string; - username: string; -} - - - -interface Ts2 { - $date: number; -} - -interface U2 { - _id: string; - username: string; - name: string; -} - -interface UpdatedAt2 { - $date: number; -} - -interface FirstUnread { - _id: string; - rid: string; - msg: string; - ts: Ts2; - u: U2; - _updatedAt: string; - mentions: any[]; - channels: any[]; -} - -export interface Message { - customFields:any; - _id: string; - id: null | string; - rid: string; - msg: string; - ts: Ts; - sendAttempt?: number - u: U; - from: 'Offline'|'History'|'stream'| 'send' - t: string; - origin: 'history' | 'stream' | 'local' - _updatedAt: ''; - mentions: any[]; - channels: any[]; - attachments: Attachment[]; - file: File; - editedAt: EditedAt; - editedBy: EditedBy; - urls: any[]; - temporaryData: object - localReference?: string, - viewed: string[], - received: string[], - delate: boolean, - delateRequest: boolean - attachmentsModelData: { - fileBase64: string - } - hasFile: boolean - UploadAttachmentsTemp: number -} - - - - -export interface Lm { - $date: any; -} - - - - -export interface LastMessage { - _id: string; - rid: string; - msg: string; - ts: Ts; - u: U; - _updatedAt: UpdatedAt2; - mentions: any[]; - channels: any[]; - file: File; - attachments: Attachment[]; -} - -export interface CustomFields { -} - -export interface Update { - _id: string; - t: string; - usernames: string[]; - usersCount: number; - uids: string[]; - default: boolean; - ro: boolean; - sysMes: boolean; - _updatedAt: UpdatedAt; - lm: Lm; - lastMessage: LastMessage; - name: string; - fname: string; - u: U2; - customFields: CustomFields; -} - -export interface DeletedAt { - $date: any; -} - -export interface Remove { - _id: string; - _deletedAt: DeletedAt; -} - -export interface Result { - update: Update[]; - remove: Remove[]; -} - -export interface Rooms { - msg: string; - id: string; - result: Result; -} - - - -export interface ChatMessage { - msg: string; - id: string; - result: Message -} - - - - - -export interface chatHistory { - msg: string; - id: string; - result: { - messages: Message[]; - firstUnread: FirstUnread; - unreadNotLoaded: number; - }; -} - - - - -interface Ts { - $date: any; -} - -interface U { - _id: string; - username: string; - name: string; -} - -interface UpdatedAt { - $date: any; -} - -interface Attachment { - ts: Date; - title_link_download: boolean; -} - -export interface File { - type: string; - guid: string; - image_url: string; - subject: string; - start_date?: Date; - end_date?: Date; - venue: string; - id: string; -} - -interface EditedAt { - $date: number; -} - -interface EditedBy { - _id: string; - username: string; -} - - - -interface Ts2 { - $date: number; -} - -interface U2 { - _id: string; - username: string; - name: string; -} - -interface UpdatedAt2 { - $date: number; -} - -interface FirstUnread { - _id: string; - rid: string; - msg: string; - ts: Ts2; - u: U2; - _updatedAt: string; - mentions: any[]; - channels: any[]; -} - -export interface Message { - customFields:any; - _id: string; - rid: string; - msg: string; - ts: Ts; - u: U; - t: string; - _updatedAt: ''; - mentions: any[]; - channels: any[]; - attachments: Attachment[]; - file: File; - editedAt: EditedAt; - editedBy: EditedBy; - urls: any[]; -} - - - - -export interface Lm { - $date: any; -} - - - - -export interface LastMessage { - _id: string; - rid: string; - msg: string; - ts: Ts; - u: U; - _updatedAt: UpdatedAt2; - mentions: any[]; - channels: any[]; - file: File; - attachments: Attachment[]; -} - -export interface CustomFields { -} - -export interface Update { - _id: string; - t: string; - usernames: string[]; - usersCount: number; - uids: string[]; - default: boolean; - ro: boolean; - sysMes: boolean; - _updatedAt: UpdatedAt; - lm: Lm; - lastMessage: LastMessage; - name: string; - fname: string; - u: U2; - customFields: CustomFields; -} - -export interface DeletedAt { - $date: any; -} - -export interface Remove { - _id: string; - _deletedAt: DeletedAt; -} - -export interface Result { - update: Update[]; - remove: Remove[]; -} - -export interface Rooms { - msg: string; - id: string; - result: Result; -} - - - -export interface ChatMessage { - msg: string; - id: string; - result: Message -} - - - - - -export interface chatHistory { - msg: string; - id: string; - result: { - messages: Message[]; - firstUnread: FirstUnread; - unreadNotLoaded: number; - }; -} - -export interface chatUser { - _id: string; - createdAt: Date; - emails: { - address: string; - verified: boolean; - } - type: string; - status: 'online' | 'offline' | 'away' | 'busy' ; - active: boolean; - _updatedAt: Date; - roles: string[]; - name: string; - lastLogin: Date; - statusConnection: string; - utcOffset: number; - username: string; - __rooms: string[]; - requirePasswordChange?: boolean; - settings: { - preferences: { - language: string; - }; - }; - nickname: string; - statusText: string; - banners: any; - statusDefault: string; - language: string; - avatarOrigin: string; - avatarETag?: any; -} \ No newline at end of file diff --git a/src/app/models/search-document.spec.ts b/src/app/models/search-document.spec.ts deleted file mode 100644 index 6944883c5..000000000 --- a/src/app/models/search-document.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { SearchDocument } from './search-document'; - -describe('SearchDocument', () => { - it('should create an instance', () => { - expect(new SearchDocument()).toBeTruthy(); - }); -}); diff --git a/src/app/module/chat/1tsconfig.json b/src/app/module/chat/1tsconfig.json new file mode 100644 index 000000000..360475c49 --- /dev/null +++ b/src/app/module/chat/1tsconfig.json @@ -0,0 +1,31 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "strict": true, + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "skipLibCheck": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "es2020", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2017", + //"target": "es5", + "lib": [ + "es2018", + "dom" + ], + "inlineSources": true, + "sourceRoot": "/" + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true + }, + "include": [ + "./**/*.ts" // Include all TypeScript files in the current directory and subdirectories + ] +} \ No newline at end of file diff --git a/src/app/module/chat/chat.module.ts b/src/app/module/chat/chat.module.ts new file mode 100644 index 000000000..7918f9ea4 --- /dev/null +++ b/src/app/module/chat/chat.module.ts @@ -0,0 +1,192 @@ +import { NgModule } from '@angular/core'; +import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service' +import { skip, switchMap } from 'rxjs/operators'; +import { SessionStore } from 'src/app/store/session.service'; +import { Subject, timer } from 'rxjs'; +import { UserTypingLocalRepository } from './data/repository/typing/user-typing-local-data-source.service'; +import { UserTypingRemoteRepositoryService } from './data/repository/typing/user-typing-live-data-source.service'; +import { RoomService } from 'src/app/module/chat/domain/service/room.service' +import { HttpListenToMessageLoadHistoryAdapter } from './domain/adapter'; +import { ISignalRService } from 'src/app/infra/socket/adapter'; +import { HttpModule } from 'src/app/infra/http/http.module'; +import { HttpListenToMessageLoadHistoryUseCase } from 'src/app/core/chat/usecase/message/http-listen-to-message-load-history-by-roomId-use-case'; +import { IMessageLocalRepository } from 'src/app/core/chat/repository/message/message-local-repository'; +import { MessageLocalDataSourceService } from './data/repository/message/message-local-data-source.service'; +import { MessageRemoteDataSourceService } from './data/repository/message/message-remote-data-source.service'; +import { IMessageRemoteRepository } from 'src/app/core/chat/repository/message/message-remote-repository'; +import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; +import { MessageSocketRepositoryService } from './data/repository/message/message-live-signalr-data-source.service'; +import { MemberListLocalRepository } from './data/repository/member/member-list-local-repository.service'; +import { IMemberLocalRepository } from 'src/app/core/chat/repository/member/member-local-repository'; +import { MemberListRemoteRepository } from './data/repository/member/member-list-remote-repository.service'; +import { IMemberRemoteRepository } from 'src/app/core/chat/repository/member/member-remote-repository'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; +import { RoomLocalRepository } from './data/repository/room/room-local-repository.service'; +import { RoomRemoteDataSourceService } from './data/repository/room/room-remote-repository.service'; +import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-remote-repository'; +import { RoomSocketRepositoryService } from './data/repository/room/room-socket-repository.service'; +import { IRoomSocketRepository } from 'src/app/core/chat/repository/room/room-socket-repository'; +import { IAttachmentLocalRepository } from 'src/app/core/chat/repository/typing/typing-local-repository'; +import { AttachmentLocalDataSource } from './data/repository/attachment/attachment-local-repository.service'; +import { IAttachmentRemoteRepository } from 'src/app/core/chat/repository/attachment/attachment-remote-repository'; +import { AttachmentRemoteDataSourceService } from './data/repository/attachment/attachment-remote-repository.service'; +import { IDistributionLocalRepository } from 'src/app/core/chat/repository/distribution/distribution-local-repository'; +import { DistributionLocalRepository } from './data/repository/destribution/destribution-local-repository'; +import { DistributionService } from './domain/service/distribution.service' +import { BoldLocalRepository } from './data/repository/bold/bold-local-repository'; +import { IBoldLocalRepository } from 'src/app/core/chat/repository/bold/bold-local-repository'; +import { RoomLastMessageService } from 'src/app/module/chat/domain/service/room-last-message.service' +import { IUserPhotoLocalRepository } from 'src/app/core/chat/repository/user-photo/user-photo-local-repository'; +import { UserPhotoLocalRepository } from './data/repository/user-foto/user-photo-local-repository.service'; +import { IUserPhotoRemoteRepository } from 'src/app/core/chat/repository/user-photo/user-photo-remote-repository'; +import { UserPhotoRemoteRepositoryService } from './data/repository/user-foto/user-photo-remote-repository.service'; +@NgModule({ + imports: [HttpModule], + providers: [ + { + provide: ISignalRService, + useClass: SignalRService, // or MockDataService + }, + { + provide: HttpListenToMessageLoadHistoryAdapter, + useClass: HttpListenToMessageLoadHistoryUseCase, // or MockDataService + }, + // message repository + { + provide: IMessageLocalRepository, + useClass: MessageLocalDataSourceService + }, + { + provide: IMessageRemoteRepository, + useClass: MessageRemoteDataSourceService + }, + { + provide: IMessageSocketRepository, + useClass: MessageSocketRepositoryService + }, + // member repository + { + provide: IMemberLocalRepository, + useClass: MemberListLocalRepository + }, + { + provide: IMemberRemoteRepository, + useClass: MemberListRemoteRepository + }, + // room repository + { + provide: IRoomLocalRepository, + useClass: RoomLocalRepository + }, + { + provide: IRoomRemoteRepository, + useClass: RoomRemoteDataSourceService + }, + { + provide: IRoomSocketRepository, + useClass: RoomSocketRepositoryService + }, + // attachment + { + provide: IAttachmentLocalRepository, + useClass: AttachmentLocalDataSource + }, + { + provide: IAttachmentRemoteRepository, + useClass: AttachmentRemoteDataSourceService + }, + // + { + provide: IDistributionLocalRepository, + useClass: DistributionLocalRepository + }, + { + provide: IBoldLocalRepository, + useClass: BoldLocalRepository + }, + // user-photo + { + provide: IUserPhotoLocalRepository, + useClass: UserPhotoLocalRepository + }, + // + { + provide: IUserPhotoRemoteRepository, + useClass: UserPhotoRemoteRepositoryService + } + ], + declarations: [], + schemas: [], + entryComponents: [] +}) +export class ChatModule { + + typingCallback: {[key: string]: Subject } = {} + + constructor( + private SignalRService: SignalRService, + private ChatServiceService: ChatServiceService, + private signalR: SignalRService, + private localDataSource: UserTypingLocalRepository, + private UserTypingRemoteRepositoryService: UserTypingRemoteRepositoryService, + private RoomService: RoomService, + private DistributionService: DistributionService, + private RoomLastMessageService: RoomLastMessageService + ) { + + this.RoomService.init() + this.syncMessage() + this.listenToTyping() + } + + async listenToTyping() { + this.UserTypingRemoteRepositoryService.listenToTyping().subscribe(async(e) => { + + // this.memoryDataSource.dispatch(removeUserTyping({data: {...e} as any})) + // this.memoryDataSource.dispatch(addUserTyping({data: {...e} as any})) + // + const value = await this.localDataSource.addUserTyping(e); + + const id = e.roomId + '@' + e.userName + if(!this.typingCallback[id]) { + this.typingCallback[id] = new Subject() + this.typingCallback[id].pipe( + switchMap(() => timer(2000)), + ).subscribe(() => { + // console.log('111111==============') + // this.memoryDataSource.dispatch(removeUserTyping({data: {...e} as any})) + this.localDataSource.removeUserTyping(e) + }) + } else { + this.typingCallback[id].next() + } + }) + + } + + async syncMessage() { + const connection = this.SignalRService.getConnectionState() + + connection.pipe( + skip(1) // Skip the first value + ).subscribe((value: boolean)=> { + if(value) { + // on reconnect + this.ChatServiceService.chatSync(); + } + }); + + connection.subscribe((value: boolean) => { + if(value) { + // on connect + this.ChatServiceService.sendLocalMessages() + } + }) + + // on page reload sync + if(!(!SessionStore.user.Inactivity || !SessionStore.exist)) { + this.ChatServiceService.start(); + } + } +} diff --git a/src/app/module/chat/data/async/list/rooms/distributionListChangedetector.ts b/src/app/module/chat/data/async/list/rooms/distributionListChangedetector.ts new file mode 100644 index 000000000..03c25d800 --- /dev/null +++ b/src/app/module/chat/data/async/list/rooms/distributionListChangedetector.ts @@ -0,0 +1,29 @@ + +import { DistributionTable } from "src/app/infra/database/dexie/instance/chat/schema/destribution"; +import { DistributionOutPutDTO } from "src/app/module/chat/domain/service/distribution.service"; + +export function distributionListDetermineChanges(____serverDistributions: DistributionOutPutDTO[], localDistributions: DistributionTable[], messageId: string) { + + const serverDistribution = ____serverDistributions.map( e=> { + return { + ...e, + $messageIdMemberId: messageId + e.memberId + } + }) + + const serverDistributionMap = new Map(serverDistribution.map(distribution => [distribution.$messageIdMemberId, distribution])); + const localDistributionMap = new Map(localDistributions.map(distribution => [distribution.$messageIdMemberId, distribution])); + + const distributionToInsert = serverDistribution.filter(distribution => !localDistributionMap.has(distribution.$messageIdMemberId)); + const distributionToUpdate = serverDistribution.filter(distribution => { + const localDistribution = localDistributionMap.get(distribution.$messageIdMemberId); + return localDistribution && ( + distribution.deliverAt !== localDistribution.deliverAt || + distribution.readAt !== localDistribution.readAt + ) + }); + + const distributionToDelete = localDistributions.filter(distribution => !serverDistributionMap.has(distribution.$messageIdMemberId)); + + return { distributionToInsert, distributionToUpdate, distributionToDelete }; +} diff --git a/src/app/module/chat/data/async/list/rooms/messageListChangedetector.ts b/src/app/module/chat/data/async/list/rooms/messageListChangedetector.ts new file mode 100644 index 000000000..0479dc0a8 --- /dev/null +++ b/src/app/module/chat/data/async/list/rooms/messageListChangedetector.ts @@ -0,0 +1,40 @@ +import { MessageTable } from "src/app/infra/database/dexie/instance/chat/schema/message"; + +export function messageListDetermineChanges(serverList: MessageTable[], localList: MessageTable[]) { + + localList = localList.filter(e => e.id) + // Convert lists to dictionaries for easier comparison + const localDict = localList.reduce((acc, item) => { + acc[item.id] = item; + return acc; + }, {}); + + const serverDict = serverList.reduce((acc, item) => { + acc[item.id] = item; + return acc; + }, {}); + + // Identify added and deleted items + const addedItems = serverList.filter(item => !localDict[item.id]); + const deletedItems = localList.filter(item => !serverDict[item.id]); + + // Identify changed items + const changedItems = serverList.filter(item => { + const localItem = localDict[item.id]; + + if(localItem?.$id) { + item.$id = localItem.$id + } + + return localItem && (item.editedAt !== localItem.editedAt || item.sentAt != item.sentAt || item.reactions.some((r, index) => { + const localReaction = localItem.reactions[index]; + return !localReaction || r.reactedAt !== localReaction.reactedAt; + })); + }); + + return { + addedItems, + deletedItems, + changedItems + } +} diff --git a/src/app/module/chat/data/async/list/rooms/roomByIdChangeDetector.ts b/src/app/module/chat/data/async/list/rooms/roomByIdChangeDetector.ts new file mode 100644 index 000000000..8807d3f26 --- /dev/null +++ b/src/app/module/chat/data/async/list/rooms/roomByIdChangeDetector.ts @@ -0,0 +1,33 @@ +import { RoomTable } from "src/app/infra/database/dexie/instance/chat/schema/room"; +import { RoomByIdOutputDTO } from "src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service"; +import { RoomListItemOutPutDTO } from "src/app/module/chat/domain/use-case/room/room-get-list-use-case.service"; + +export function roomByIdDetermineChanges(serverResponse: RoomByIdOutputDTO, localRooms: RoomTable[]) { + + const localRoomMap = new Map(localRooms.map(room => [room.id, room])); + + let roomsToInsert:RoomByIdOutputDTO | undefined; + let roomsToUpdate: RoomByIdOutputDTO | undefined; + + const fond = localRooms.filter(room => !localRoomMap.has(serverResponse.data.id)); + if(!fond) { + roomsToInsert = serverResponse + } + + const needToUpdate = localRooms.filter(room => { + const localRoom = localRoomMap.get(room.id); + return localRoom && ( + room.roomName !== serverResponse.data.roomName || + room.createdBy.wxUserId !== serverResponse.data.createdBy.wxUserId || + room.createdAt !== serverResponse.data.createdAt || + room.expirationDate !== serverResponse.data.expirationDate // || + // room.chatRoom.roomType !== localRoom.roomType + ); + }); + + if(needToUpdate) { + roomsToUpdate = serverResponse + } + + return { roomsToInsert, roomsToUpdate }; +} diff --git a/src/app/module/chat/data/async/list/rooms/roomListChangeDetector.ts b/src/app/module/chat/data/async/list/rooms/roomListChangeDetector.ts new file mode 100644 index 000000000..2770c2855 --- /dev/null +++ b/src/app/module/chat/data/async/list/rooms/roomListChangeDetector.ts @@ -0,0 +1,25 @@ +import { RoomType } from "src/app/core/chat/entity/group"; +import { RoomTable } from "src/app/infra/database/dexie/instance/chat/schema/room"; +import { RoomListItemOutPutDTO } from "src/app/module/chat/domain/use-case/room/room-get-list-use-case.service"; + +export function roomListDetermineChanges(serverRooms: RoomListItemOutPutDTO[], localRooms: RoomTable[]) { + const serverRoomMap = new Map(serverRooms.map(room => [room.chatRoom.id, room])); + const localRoomMap = new Map(localRooms.map(room => [room.id, room])); + + const roomsToInsert = serverRooms.filter(room => !localRoomMap.has(room.chatRoom.id)); + const roomsToUpdate = serverRooms.filter(room => { + const localRoom = localRoomMap.get(room.chatRoom.id); + + return localRoom && ( + room.chatRoom.roomName !== localRoom.roomName && room.chatRoom.roomType == RoomType.Group || + room.chatRoom.createdBy.wxUserId !== localRoom.createdBy.wxUserId || + room.chatRoom.createdAt !== localRoom.createdAt || + room.chatRoom.expirationDate !== localRoom.expirationDate // || + // room.chatRoom.messages?.[0]?.id !== localRoom.messages?.[0]?.id + // room.chatRoom.roomType !== localRoom.roomType + ); + }); + const roomsToDelete = localRooms.filter(room => !serverRoomMap.has(room.id)); + + return { roomsToInsert, roomsToUpdate, roomsToDelete }; +} diff --git a/src/app/module/chat/data/async/list/rooms/roomMembersChangeDetector.ts b/src/app/module/chat/data/async/list/rooms/roomMembersChangeDetector.ts new file mode 100644 index 000000000..a521e9df2 --- /dev/null +++ b/src/app/module/chat/data/async/list/rooms/roomMembersChangeDetector.ts @@ -0,0 +1,31 @@ +import { MemberTable } from "src/app/infra/database/dexie/instance/chat/schema/members"; +import { RoomByIdMemberItemOutputDTO } from "src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service"; + +export function roomMemberListDetermineChanges(____serverRooms: RoomByIdMemberItemOutputDTO[], localRooms: MemberTable[], roomId: string) { + + const PServerRooms: (RoomByIdMemberItemOutputDTO & {$roomIdUserId: string})[] = ____serverRooms.map( e=> { + + return { + ...e, + $roomIdUserId: roomId + e.user.wxUserId + } + }) + + const serverRoomMap = new Map(PServerRooms.map(room => [room.$roomIdUserId, room])); + const localRoomMap = new Map(localRooms.map(room => [room.$roomIdUserId, room])); + + const membersToInsert = PServerRooms.filter(room => !localRoomMap.has(room.$roomIdUserId)); + const membersToUpdate = PServerRooms.filter(room => { + const localRoom = localRoomMap.get(room.$roomIdUserId); + return localRoom && ( + room.user.wxUserId !== localRoom.wxUserId || + room.user.userPhoto !== localRoom.userPhoto || + room.joinAt !== localRoom.joinAt, + room.isAdmin !== localRoom.isAdmin + ) + }); + + const membersToDelete = localRooms.filter(room => !serverRoomMap.has(room.$roomIdUserId)); + + return { membersToInsert, membersToUpdate, membersToDelete }; +} diff --git a/src/app/module/chat/data/repository/attachment/attachment-local-repository.service.ts b/src/app/module/chat/data/repository/attachment/attachment-local-repository.service.ts new file mode 100644 index 000000000..587a71806 --- /dev/null +++ b/src/app/module/chat/data/repository/attachment/attachment-local-repository.service.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@angular/core'; +import { Subject } from 'rxjs'; +import { IAttachmentLocalRepository } from 'src/app/core/chat/repository/typing/typing-local-repository'; +import { AttachmentTable, AttachmentTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/attachment'; +import { chatDatabase } from 'src/app/infra/database/dexie/service'; +import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AttachmentLocalDataSource extends DexieRepository implements IAttachmentLocalRepository { + + messageSubject = new Subject(); + + constructor() { + super(chatDatabase.attachment, AttachmentTableSchema) + } + +} + diff --git a/src/app/module/chat/data/repository/attachment/attachment-remote-repository.service.ts b/src/app/module/chat/data/repository/attachment/attachment-remote-repository.service.ts new file mode 100644 index 000000000..e6ad27a61 --- /dev/null +++ b/src/app/module/chat/data/repository/attachment/attachment-remote-repository.service.ts @@ -0,0 +1,20 @@ +import { Injectable, Input } from '@angular/core'; +import { IAttachmentRemoteRepository } from 'src/app/core/chat/repository/attachment/attachment-remote-repository'; +import { HttpService } from 'src/app/services/http.service'; +import { DataSourceReturn } from 'src/app/services/Repositorys/type'; + +@Injectable({ + providedIn: 'root' +}) +export class AttachmentRemoteDataSourceService implements IAttachmentRemoteRepository { + private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2/Chat'; // Your base URL + + constructor( + private httpService: HttpService + ) { } + + async getAttachment(id: string | number): DataSourceReturn { + return await this.httpService.get(`${this.baseUrl}/attachment/${id}`, { responseType: 'blob' }); + } + +} diff --git a/src/app/module/chat/data/repository/bold/bold-local-repository.ts b/src/app/module/chat/data/repository/bold/bold-local-repository.ts new file mode 100644 index 000000000..a93bfdda6 --- /dev/null +++ b/src/app/module/chat/data/repository/bold/bold-local-repository.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import { from } from "rxjs"; +import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; +import { Dexie, EntityTable, liveQuery, Observable } from 'Dexie'; +import { BoldTable, BoldTableSchema } from "src/app/infra/database/dexie/instance/chat/schema/bold"; +import { chatDatabase } from "src/app/infra/database/dexie/service"; +import { IBoldLocalRepository } from "src/app/core/chat/repository/bold/bold-local-repository"; + +@Injectable({ + providedIn: 'root' +}) +export class BoldLocalRepository extends DexieRepository implements IBoldLocalRepository { + constructor() { + super(chatDatabase.bold, BoldTableSchema) + } + + open() { + return chatDatabase.open() + } + + listen() { + return from(liveQuery(() => chatDatabase.bold.toArray())) + } +} diff --git a/src/app/module/chat/data/repository/destribution/destribution-local-repository.ts b/src/app/module/chat/data/repository/destribution/destribution-local-repository.ts new file mode 100644 index 000000000..70abfeb63 --- /dev/null +++ b/src/app/module/chat/data/repository/destribution/destribution-local-repository.ts @@ -0,0 +1,14 @@ +import { DistributionTable, DistributionTableSchema } from "src/app/infra/database/dexie/instance/chat/schema/destribution"; +import { chatDatabase } from "src/app/infra/database/dexie/service"; +import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; + + +export class DistributionLocalRepository extends DexieRepository { + constructor() { + super(chatDatabase.distribution, DistributionTableSchema) + + chatDatabase.distribution.hook("creating", function (primKey, obj, transaction) { + obj.$messageIdMemberId = `${obj.messageId}${obj.memberId}` + }); + } +} \ No newline at end of file diff --git a/src/app/module/chat/data/repository/member/member-list-local-repository.service.ts b/src/app/module/chat/data/repository/member/member-list-local-repository.service.ts new file mode 100644 index 000000000..3bd3d1572 --- /dev/null +++ b/src/app/module/chat/data/repository/member/member-list-local-repository.service.ts @@ -0,0 +1,114 @@ +import { Injectable } from '@angular/core'; +import { Dexie, EntityTable, liveQuery, Observable } from 'Dexie'; +import { z } from 'zod'; +import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service'; +import { ok } from 'neverthrow'; +import { err, Result } from 'neverthrow'; +import { MemberListUPdateStatusInputDTO } from '../../../domain/use-case/socket/member-list-update-status-use-case.service'; +import { from } from 'rxjs'; +import { MemberTable, MemberTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/members'; +import { chatDatabase } from 'src/app/infra/database/dexie/service'; +import { IDirectMemberInput, IGetMemberLive, IMemberLocalRepository } from 'src/app/core/chat/repository/member/member-local-repository'; + +@Injectable({ + providedIn: 'root' +}) +export class MemberListLocalRepository extends DexieRepository implements IMemberLocalRepository { + + constructor() { + super(chatDatabase.members, MemberTableSchema) + } + + + async directMember({roomId, currentUserId}:IDirectMemberInput) { + try { + let a = await chatDatabase.members.where('roomId') + .equals(roomId) + .and(message => message.wxUserId !== currentUserId) + .first() + + return ok(a as MemberTable) + } catch (e) { + return err(e) + } + } + + async addMember(data: MemberTable) { + data.$roomIdUserId = data.roomId + data.wxUserId + return this.insert(data) + } + + async updateMemberRole(data: MemberTable) { + try { + const result = await chatDatabase.members.where({ + wxUserId: data.wxUserId, + roomId: data.roomId, + }).modify(data); + + return ok(result) + } catch (e) { + return err(false) + } + } + + async updateMembersStatus(data: MemberListUPdateStatusInputDTO): Promise> { + try { + await chatDatabase.members.toCollection().modify({ status: 'offline' }); + for (const item of data) { + const wxUserId = item.value.userId; // Extract wxUserId + await chatDatabase.members.where('wxUserId').equals(wxUserId).modify({ status: 'online' }); + } + return ok(true) + } catch (error) { + console.error("Error updating user statuses:", error); + return err(error) + } + } + + allMemberOnline(roomId:string) { + return liveQuery(async () => { + + const allMessages = await chatDatabase.members + .where('roomId') + .equals(roomId) + .toArray(); + + return allMessages.every(message => message?.status === "online"); + }); + } + + async removeMemberFromRoom($roomIdUserId): Promise> { + try { + const member = await chatDatabase.members.where({ $roomIdUserId: $roomIdUserId }).first(); + if (member) { + const result = ok(await chatDatabase.members.delete($roomIdUserId)); + return result + } else { + return err('not Found') + } + + } catch (e) { + return err(false) + } + } + + + getMemberLive(data: IGetMemberLive) { + const $roomIdUserId = data.roomId + data.wxUserId + return liveQuery(() => chatDatabase.members.get($roomIdUserId)); + } + + async getRoomMemberById(roomId: any) { + return await chatDatabase.members.where({roomId}).toArray() + } + getRoomMemberByIdLive(roomId: any) { + return from (liveQuery(() => chatDatabase.members.where({roomId}).toArray())) + } + + getRoomMemberNoneAdminByIdLive(roomId: any) { + return liveQuery(async() => { + const members = await chatDatabase.members.where({roomId}).toArray() + return members.filter(e => e.isAdmin != true) + }) + } +} diff --git a/src/app/module/chat/data/repository/member/member-list-remote-repository.service.ts b/src/app/module/chat/data/repository/member/member-list-remote-repository.service.ts new file mode 100644 index 000000000..ccf5104dd --- /dev/null +++ b/src/app/module/chat/data/repository/member/member-list-remote-repository.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@angular/core'; +import { Result } from 'neverthrow'; +import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; +import { HttpService } from 'src/app/services/http.service'; +import { DataSourceReturn } from 'src/app/services/Repositorys/type'; +import { IMemberRemoteRepository } from 'src/app/core/chat/repository/member/member-remote-repository'; +import { AddMemberToRoomInputDTO, AddMemberToRoomInputDTOSchema } from '../../../domain/use-case/member/member-add-use-case.service'; +import { MemberSetAdminDTO } from '../../../domain/use-case/member/member-admin-use-case.service'; +import { UserRemoveListInputDTOSchema, UserRemoveListInputDTO } from '../../../domain/use-case/room/room-leave-by-id-use-case.service'; +@Injectable({ + providedIn: 'root' +}) +export class MemberListRemoteRepository implements IMemberRemoteRepository { + + private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2/Chat'; // Your base URL + + constructor(private httpService: HttpService) { } + + + @ValidateSchema(AddMemberToRoomInputDTOSchema) + async addMemberToRoom(data: AddMemberToRoomInputDTO): DataSourceReturn { + return await this.httpService.post(`${this.baseUrl}/Room/${data.id}/Member`, { members:data.members }); + } + + + @ValidateSchema(UserRemoveListInputDTOSchema) + async removeMemberFromRoom(data: UserRemoveListInputDTO): Promise> { + return await this.httpService.delete(`${this.baseUrl}/Room/${data.id}/Member`, {members:data.members}); + } + + async setAmin(data: MemberSetAdminDTO): Promise> { + return await this.httpService.patch(`${this.baseUrl}/Room/${data.roomId}/Member/${data.memberId}/admin`); + } + +} diff --git a/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts b/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts new file mode 100644 index 000000000..98080eb9c --- /dev/null +++ b/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts @@ -0,0 +1,171 @@ +import { Injectable } from '@angular/core'; +import { v4 as uuidv4 } from 'uuid' +import { InstanceId } from '../../../domain/chat-service.service'; +import { MessageUpdateInput } from '../../../domain/use-case/message/message-update-by-id-use-case.service'; +import { MessageReactionInput } from '../../../domain/use-case/message/message-reaction-by-id-use-case.service'; +import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; +import { filter, map } from 'rxjs/operators'; +import { SocketMessage } from 'src/app/infra/socket/signalR/signalR'; +import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; +import { MessageCreateOutPutDataDTO, MessageInputDTO } from '../../../domain/use-case/message/message-create-use-case.service'; +import { MessageMarkAsReadInput } from '../../../domain/use-case/message/message-mark-as-read-use-case.service'; +import { MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; +import { MessageDeleteInputDTO } from '../../../domain/use-case/message/message-delete-by-id-live-use-case.service'; +import { BehaviorSubject, Observable } from 'rxjs'; + +interface sendDeliverAt { + memberId: number, + messageId:string, + roomId: string, + requestId: string +} + +@Injectable({ + providedIn: 'root' +}) +export class MessageSocketRepositoryService implements IMessageSocketRepository { + + private sendDataSubject: BehaviorSubject<{method: string, data: any}> = new BehaviorSubject<{method: string, data: any}>(null); + + constructor( + private socket: SignalRService + ) {} + + connect() { + return this.socket.establishConnection(); + } + + async join() { + return await this.socket.join() + } + + + async sendGroupMessage(data: MessageInputDTO) { + + if(!data.requestId) { + data.requestId = InstanceId +'@'+ uuidv4(); + } + + const result = await this.socket.sendData({ + method: 'sendMessage', + data: data, + }) + + this.sendDataSubject.next({ + method: 'sendMessage', + data: data, + }) + + return result; + } + + async sendDirectMessage(data: MessageInputDTO) { + + if(!data.requestId) { + data.requestId = InstanceId +'@'+ uuidv4(); + } + const result = await this.socket.sendData({ + method: 'SendDirectMessage', + data: data as any, + }) + + this.sendDataSubject.next({ + method: 'SendDirectMessage', + data: data, + }) + return result; + } + + async sendDeliverAt(data: sendDeliverAt) { + const result = await this.socket.sendData({ + method: 'DeliverAt', + data: data as any, + }) + + return result; + } + + async sendReadAt(data: MessageMarkAsReadInput) { + const result = await this.socket.sendData({ + method: 'ReadAt', + data: data as any, + }) + + return result; + } + + async sendDelete(data: MessageDeleteInputDTO) { + const result = await this.socket.sendData({ + method: 'ReadAt', + data: data, + }) + + return result; + } + + listenToMessages() { + return this.socket.getData().pipe( + filter((e) : e is SocketMessage=> e?.method == 'ReceiveMessage' + ), + map((e)=> e.data) + ) + } + + + listenToDeleteMessages() { + return this.socket.getData().pipe( + filter((e) : e is SocketMessage=> e?.method == 'DeleteMessage' + ), + map((e)=> e.data) + ) + } + + listenToUpdateMessages() { + return this.socket.getData().pipe( + filter((e) : e is SocketMessage=> e?.method == 'UpdateMessage' + ), + map((e)=> e.data) + ) + } + + listenToSendMessage() { + return this.sendDataSubject.pipe( + filter((e) : e is SocketMessage=> { + console.log(e, e?.method == 'sendMessage' || e?.method == 'SendDirectMessage') + + return e?.method == 'sendMessage' || e?.method == 'SendDirectMessage' + } + )) + + + } + + + reactToMessageSocket(data: MessageReactionInput) { + this.socket.sendData({ + method: 'ReactMessage', + data + }) + } + + updateMessage(input: MessageUpdateInput) { + this.socket.sendData({ + method: 'EditMessage', + data: input, + }) + } + + + sendMessageDelete(data: MessageDeleteInputDTO) { + + data['requestId'] = InstanceId +'@'+ uuidv4(); + + const result = this.socket.sendData({ + method: 'DeleteMessage', + data: data, + }) + + return result; + } + +} diff --git a/src/app/module/chat/data/repository/message/message-local-data-source.service.ts b/src/app/module/chat/data/repository/message/message-local-data-source.service.ts new file mode 100644 index 000000000..b3a5788a1 --- /dev/null +++ b/src/app/module/chat/data/repository/message/message-local-data-source.service.ts @@ -0,0 +1,118 @@ +import { Injectable } from '@angular/core'; +import { liveQuery } from 'Dexie'; +import { MessageEntity } from '../../../../../core/chat/entity/message'; +import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service'; +import { Observable as DexieObservable, PromiseExtended } from 'Dexie'; +import { DexieMessageTable, MessageTable, MessageTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/message'; +import { chatDatabase } from 'src/app/infra/database/dexie/service'; +import { IMessageLocalRepository } from 'src/app/core/chat/repository/message/message-local-repository'; +import { BehaviorSubject, combineLatest, from, Observable } from 'rxjs'; +import { filter, map } from 'rxjs/operators'; +import { v4 as uuidv4 } from 'uuid' + +@Injectable({ + providedIn: 'root' +}) +export class MessageLocalDataSourceService extends DexieRepository implements IMessageLocalRepository { + + private creatingSubject : BehaviorSubject = new BehaviorSubject(null); + private lastTimestamp = 0; + + constructor() { + super(chatDatabase.message, MessageTableSchema, chatDatabase) + + this.setAllSenderToFalse(); + this.onCreatingHook() + } + + private onCreatingHook() { + chatDatabase.message.hook('creating', (primaryKey, obj, transaction) => { + + let now = Date.now(); + + // If the current time is the same as the last, increment + if (now <= this.lastTimestamp) { + obj.$createAt = this.lastTimestamp + 1; + this.lastTimestamp = this.lastTimestamp + 1; + } else { + this.lastTimestamp = now; + obj.$createAt = now; + } + + if(obj.id) { + obj.$id = obj.id + } else { + obj.$id = 'Local-'+uuidv4() + } + + this.creatingSubject.next(obj) + }); + } + + onCreateObservable() { + return this.creatingSubject.asObservable() + } + + async setAllSenderToFalse() { + + // this.createTransaction(async (table) => { + // const result = await this.find({sending: true }) + // if(result.isOk()) { + // for(const message of result.value) { + // await this.update(message.$id, { sending: false }) + // } + // } + // }) + + try { + await chatDatabase.transaction('rw', chatDatabase.message, async () => { + // Perform the update operation within the transaction + await chatDatabase.message.toCollection().modify({ sending: false }); + }); + // console.log('All messages updated successfully.'); + } catch (error) { + console.error('Error updating messages:', error); + } + } + + getItems(roomId: string): PromiseExtended { + return chatDatabase.message.where('roomId').equals(roomId).sortBy('sentAt') as any + } + + getItemsLive(roomId: string): DexieObservable { + return liveQuery(() => chatDatabase.message.where('roomId').equals(roomId).sortBy('sentAt') as any) + } + + async getOfflineMessages () { + try { + const allMessages = await chatDatabase.message + .filter(msg => typeof msg.id !== 'string' && msg.sending == false) + .toArray(); + + return allMessages as MessageEntity[]; + } catch (error) { + console.error('Error fetching messages:', error); + } + } + + + + getLastMessageForRooms(roomIds: string[]): Observable { + const observables = roomIds.map(roomId => + from (liveQuery(async() =>{ + const messages = await chatDatabase.message + .where('roomId') + .equals(roomId) + .reverse() + .sortBy('timestamp') + + return messages[0] || null; // Return the first item (latest message) or null if no message + })).pipe( + map((message) => ({ roomId, message: message || null })) // Attach roomId to the result + ) + ); + + return combineLatest(observables); // Combine all observables into one array of results + } +} + diff --git a/src/app/module/chat/data/repository/message/message-remote-data-source.service.ts b/src/app/module/chat/data/repository/message/message-remote-data-source.service.ts new file mode 100644 index 000000000..cea7e1c2a --- /dev/null +++ b/src/app/module/chat/data/repository/message/message-remote-data-source.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@angular/core'; +import { HttpService } from 'src/app/services/http.service'; +import { DataSourceReturn } from 'src/app/services/Repositorys/type'; +import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; +import { HttpAdapter } from 'src/app/infra/http/adapter'; +import { IMessageGetAllByRoomIdOutPut } from 'src/app/core/chat/usecase/message/message-get-all-by-room-Id'; +import { IMessageRemoteRepository } from 'src/app/core/chat/repository/message/message-remote-repository'; + +@Injectable({ + providedIn: 'root' +}) +export class MessageRemoteDataSourceService implements IMessageRemoteRepository { + + private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2/Chat'; // Your base URL + + constructor( + private httpService: HttpService, + private socket: SignalRService, + private http: HttpAdapter + ) {} + + + // @APIReturn(MessageOutPutDTOSchema, 'get/Messages') + async getMessagesFromRoom(id: string): DataSourceReturn { + + var a = await this.http.get(`${this.baseUrl}/Room/${id}/Messages`) + + return a.map((e) => { + return e.data + }) + + // return await this.httpService.get(`${this.baseUrl}/Room/${id}/Messages`); + } + +} diff --git a/src/app/module/chat/data/repository/room/room-local-repository.service.ts b/src/app/module/chat/data/repository/room/room-local-repository.service.ts new file mode 100644 index 000000000..123778457 --- /dev/null +++ b/src/app/module/chat/data/repository/room/room-local-repository.service.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@angular/core'; +import { liveQuery, Observable } from 'Dexie'; +import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service'; +import { from } from 'rxjs'; +import { RoomTable, RoomTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/room'; +import { chatDatabase } from 'src/app/infra/database/dexie/service'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; + +@Injectable({ + providedIn: 'root' +}) +export class RoomLocalRepository extends DexieRepository implements IRoomLocalRepository { + + constructor() { + super(chatDatabase.room, RoomTableSchema) + + chatDatabase.room.hook('updating', (modifications, primKey, oldValue, transaction) => { + + // if((modifications as Partial).messages?.[0].requestId == oldValue.messages?.[0].requestId) { + // (modifications as Partial).messages[0].sentAt = oldValue.messages?.[0]?.sentAt; + // } else if ((modifications as Partial).messages?.[0].id == oldValue.messages?.[0].id) { + // (modifications as Partial).messages[0].sentAt = oldValue.messages?.[0]?.sentAt + // } + + return modifications + }); + + } + + getItemsLive() { + return from (liveQuery(() => chatDatabase.room.toArray())); + } + + getRoomByIdLive(id: any) { + return from(liveQuery(() => chatDatabase.room.get(id))); + } + +} + diff --git a/src/app/module/chat/data/repository/room/room-remote-repository.service.ts b/src/app/module/chat/data/repository/room/room-remote-repository.service.ts new file mode 100644 index 000000000..1110bc5c5 --- /dev/null +++ b/src/app/module/chat/data/repository/room/room-remote-repository.service.ts @@ -0,0 +1,85 @@ +import { Injectable } from '@angular/core'; +import { Result } from 'neverthrow'; +import { HttpService } from 'src/app/services/http.service'; +import { AddMemberToRoomInputDTO } from '../../../domain/use-case/member/member-add-use-case.service'; +import { DataSourceReturn } from 'src/app/services/Repositorys/type'; +import { SessionStore } from 'src/app/store/session.service'; +import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; +import { v4 as uuidv4 } from 'uuid' +import { CreateRoomInputDTO, RoomOutPutDTO } from '../../../domain/use-case/room/room-create-use-case.service'; +import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-remote-repository'; +import { RoomByIdOutputDTO } from 'src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service'; +import { RoomUpdateInputDTO, RoomUpdateOutputDTO } from 'src/app/module/chat/domain/use-case/room/room-update-by-id-use-case.service'; +import { RoomListOutPutDTO } from '../../../domain/use-case/room/room-get-list-use-case.service'; +import { z } from 'zod'; +import { HttpAdapter } from 'src/app/infra/http/adapter'; + +const RoomByIdInputDTOSchema = z.string() +type RoomByIdInputDTO = z.infer + + +@Injectable({ + providedIn: 'root' +}) +export class RoomRemoteDataSourceService implements IRoomRemoteRepository { + + private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2/Chat'; // Your base URL + + constructor( + private httpService: HttpService, + private socket: SignalRService, + private Http: HttpAdapter + ) {} + + + //@ValidateSchema(CreateRoomInputDTOSchema) + //@APIReturn(RoomOutPutDTOSchema, 'post/Room') + async createRoom(data: CreateRoomInputDTO): DataSourceReturn { + return await this.httpService.post(`${this.baseUrl}/Room`, data); + } + + + //@APIReturn(RoomListOutPutDTOSchema, 'get/Room') + async getRoomList(): Promise> { + const result = await this.Http.get(`${this.baseUrl}/Room?userId=${SessionStore.user.UserId}`); + + return result.map((e)=> e.data) + } + + //@ValidateSchema(RoomByIdInputDTOSchema) + //@APIReturn(RoomByIdOutputDTOSchema,'get/Room/${id}') + async getRoom(id: RoomByIdInputDTO): DataSourceReturn { + const result = await this.Http.get(`${this.baseUrl}/Room/${id}`); + + return result.map((e)=> e.data) + } + + //@ValidateSchema(RoomUpdateInputDTOSchema) + //@APIReturn(RoomByIdOutputDTOSchema,'update/Room/${id}') + async updateRoom(data: RoomUpdateInputDTO): Promise> { + const id = data.roomId + delete data.roomId + return await this.httpService.put(`${this.baseUrl}/Room/${id}`, data); + } + + async deleteRoom(id: string): Promise> { + return await this.httpService.delete(`${this.baseUrl}/Room/${id}`, {}); + } + + + async addMemberToRoomSocket(data: AddMemberToRoomInputDTO) { + + const result = await this.socket.sendData({ + method: 'AddRoomMember', + data: { + requestId: uuidv4(), + roomId: data.id, + members: data.members + } + }) + + console.log({result}) + + return result + } +} diff --git a/src/app/module/chat/data/repository/room/room-socket-repository.service.ts b/src/app/module/chat/data/repository/room/room-socket-repository.service.ts new file mode 100644 index 000000000..9071513e9 --- /dev/null +++ b/src/app/module/chat/data/repository/room/room-socket-repository.service.ts @@ -0,0 +1,65 @@ +import { Injectable } from '@angular/core'; +import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; +import { filter, map } from 'rxjs/operators'; +import { z } from 'zod'; +import { SocketMessage } from 'src/app/infra/socket/signalR/signalR'; +import { v4 as uuidv4 } from 'uuid' +import { IRoomSocketRepository } from 'src/app/core/chat/repository/room/room-socket-repository'; +import { CreateRoomInputDTO } from '../../../domain/use-case/room/room-create-use-case.service'; + +const listenToDeleteRoomInputSchema = z.object({ + roomId: z.string() +}) + + +export const RoomSocketOutPutDTOSchema = z.object({ + id: z.string(), + roomName: z.string(), + createdBy: z.any().nullable(), + createdAt: z.string(), + expirationDate: z.string().nullable(), + roomType: z.any() +}); + +export type RoomSocketOutPutDTO = z.infer + + +export type ListenToDeleteRoomInput = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class RoomSocketRepositoryService implements IRoomSocketRepository { + + constructor( + private socket: SignalRService + ) { } + + + async CreateGroup(data: CreateRoomInputDTO) { + const result = await this.socket.sendData({ + method: 'CreateGroup', + data: { + ...data, + requestId: uuidv4() + } as any, + }) + + return result; + } + + listenToCreateRoom() { + return this.socket.getData().pipe( + filter((data) => data?.method == 'UserAddGroup') + ) + } + + listenToDeleteRoom() { + return this.socket.getData().pipe( + filter((data): data is SocketMessage => + data?.method === 'UserRemoveGroup' + ), + map((e) => e.data) + ); + } +} diff --git a/src/app/module/chat/data/repository/typing/user-typing-live-data-source.service.ts b/src/app/module/chat/data/repository/typing/user-typing-live-data-source.service.ts new file mode 100644 index 000000000..04eec867a --- /dev/null +++ b/src/app/module/chat/data/repository/typing/user-typing-live-data-source.service.ts @@ -0,0 +1,51 @@ +import { Injectable } from '@angular/core'; +import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; +import { SessionStore } from 'src/app/store/session.service'; +import { filter, map } from 'rxjs/operators'; +import { SocketMessage } from 'src/app/infra/socket/signalR/signalR'; +import { ITypingRemoteRepository } from 'src/app/core/chat/repository/typing/typing-remote-repository'; +import { z } from "zod" +import { InstanceId } from '../../../domain/chat-service.service'; +import { v4 as uuidv4 } from 'uuid' + +export const UserTypingDTOSchema = z.object({ + requestId: z.string(), + roomId: z.string(), + userId: z.number(), + userName: z.string() +}) +export type UserTypingDTO = z.infer + + + +@Injectable({ + providedIn: 'root' +}) +export class UserTypingRemoteRepositoryService implements ITypingRemoteRepository { + + constructor( + private socket: SignalRService + ) { } + + sendTyping(roomId: string) { + return this.socket.sendData({ + method: 'Typing', + data: { + roomId, + UserName:SessionStore.user.FullName, + userId:SessionStore.user.UserId, + requestId: InstanceId +'@'+ uuidv4(), + }, + }) + } + + + listenToTyping() { + return this.socket.getData().pipe( + filter((e) : e is SocketMessage=> e?.method == 'TypingMessage' + ), + map((e)=> e.data) + ) + } + +} diff --git a/src/app/module/chat/data/repository/typing/user-typing-local-data-source.service.ts b/src/app/module/chat/data/repository/typing/user-typing-local-data-source.service.ts new file mode 100644 index 000000000..e12b71e6e --- /dev/null +++ b/src/app/module/chat/data/repository/typing/user-typing-local-data-source.service.ts @@ -0,0 +1,66 @@ +import { Injectable } from '@angular/core'; +import { z } from 'zod'; +import { Dexie, EntityTable, liveQuery, Observable } from 'Dexie'; +import { err, ok } from 'neverthrow'; +import { chatDatabase } from 'src/app/infra/database/dexie/service'; +import { TypingTable, TypingTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/typing'; +import { ITypingLocalRepository } from 'src/app/core/chat/repository/attachment/attachment-local-repository'; +import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service'; + + + +@Injectable({ + providedIn: 'root' +}) +export class UserTypingLocalRepository extends DexieRepository implements ITypingLocalRepository { + + constructor() { + super(chatDatabase.typing, TypingTableSchema) + this.clear(); + } + + + async clear() { + try { + const result = await chatDatabase.typing.clear() + return ok(result) + } catch (e) { + return err(false) + } + } + + async addUserTyping(data: TypingTable) { + + data.id = data.roomId + '@' + data.userName + try { + const result = await chatDatabase.typing.add(data) + return ok(result) + } catch (e) { + return err(false) + } + } + + async removeUserTyping(data: TypingTable) { + + const id = data.roomId + '@' + data.userName + try { + const result = await chatDatabase.typing.delete(id) + return ok(result) + } catch (e) { + return err(false) + } + } + + + getUserTypingLive() { + return liveQuery(() => chatDatabase.typing.toArray()); + } + + getUserTypingLiveByRoomId(roomId: string) { + return liveQuery(() => chatDatabase.typing + .where('roomId') + .equals(roomId) + .sortBy('id') + ); + } +} diff --git a/src/app/module/chat/data/repository/user-foto/user-photo-local-repository.service.ts b/src/app/module/chat/data/repository/user-foto/user-photo-local-repository.service.ts new file mode 100644 index 000000000..4a9f9ef38 --- /dev/null +++ b/src/app/module/chat/data/repository/user-foto/user-photo-local-repository.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import Dexie, { PromiseExtended } from 'Dexie'; +import { IUserPhotoLocalRepository } from 'src/app/core/chat/repository/user-photo/user-photo-local-repository'; +import { UserPhotoTable, UserPhotoTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/user-foto'; +import { chatDatabase } from 'src/app/infra/database/dexie/service'; +import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service'; + +@Injectable({ + providedIn: 'root' +}) +export class UserPhotoLocalRepository extends DexieRepository implements IUserPhotoLocalRepository { + constructor() { + super(chatDatabase.userPhoto, UserPhotoTableSchema) + } +} diff --git a/src/app/module/chat/data/repository/user-foto/user-photo-remote-repository.service.ts b/src/app/module/chat/data/repository/user-foto/user-photo-remote-repository.service.ts new file mode 100644 index 000000000..5cf6e3fd4 --- /dev/null +++ b/src/app/module/chat/data/repository/user-foto/user-photo-remote-repository.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import { IGetUserPhotoByAttachmentId, IGetUserPhotoByAttachmentIdInputSchema, IUserPhotoRemoteRepository } from 'src/app/core/chat/repository/user-photo/user-photo-remote-repository'; +import { HttpAdapter } from 'src/app/infra/http/adapter'; +import { SafeValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; +import { environment } from 'src/environments/environment'; +import { z } from 'zod'; + +@Injectable({ + providedIn: 'root' +}) +export class UserPhotoRemoteRepositoryService implements IUserPhotoRemoteRepository{ + + constructor( + private http: HttpAdapter + ) { } + + @SafeValidateSchema(IGetUserPhotoByAttachmentIdInputSchema, 'GET/UserAuthentication/GetPhoto?UserPhoto=') + getUserPhotoByAttachmentId(input: IGetUserPhotoByAttachmentId) { + const geturl = environment.apiURL + `UserAuthentication/GetPhoto?UserPhoto=${input.attachmentId}`; + + return this.http.get(geturl) + } + +} diff --git a/src/app/module/chat/domain/adapter.ts b/src/app/module/chat/domain/adapter.ts new file mode 100644 index 000000000..031a88344 --- /dev/null +++ b/src/app/module/chat/domain/adapter.ts @@ -0,0 +1,21 @@ +import { HttpErrorResponse } from "@angular/common/http"; +import { Result } from "neverthrow"; +import { Observable } from "rxjs"; +import { MessageEntity } from "src/app/core/chat/entity/message"; +import { HttpListenToMessageLoadHistoryUseCaseInput } from "src/app/core/chat/usecase/message/http-listen-to-message-load-history-by-roomId-use-case"; +import { HttpResult } from "src/app/infra/http/type"; +import { UseCase } from "src/app/utils/use-case-interface"; +import { IMessageGetAllByRoomIdOutPut } from 'src/app/core/chat/usecase/message/message-get-all-by-room-Id' +export abstract class ITemplateCreateAdapter implements UseCase { + execute(input: MessageEntity): Promise { + throw new Error("Method not implemented."); + } +} + +export abstract class SocketOnReconnectAdapter { + abstract execute(): Observable +} + +export abstract class HttpListenToMessageLoadHistoryAdapter { + abstract execute(input: HttpListenToMessageLoadHistoryUseCaseInput): Observable +} diff --git a/src/app/module/chat/domain/chat-service.service.ts b/src/app/module/chat/domain/chat-service.service.ts new file mode 100644 index 000000000..383043a06 --- /dev/null +++ b/src/app/module/chat/domain/chat-service.service.ts @@ -0,0 +1,285 @@ +import { Injectable } from '@angular/core'; +import { MessageDeleteLiveUseCaseService } from 'src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service' +import { SessionStore } from 'src/app/store/session.service'; +import { MessageReactionInput, MessageReactionUseCaseService } from 'src/app/module/chat/domain/use-case/message/message-reaction-by-id-use-case.service'; +import { MessageUpdateInput, MessageUpdateUseCaseService } from 'src/app/module/chat/domain/use-case/message/message-update-by-id-use-case.service'; +import { MemberAdminUseCaseService, MemberSetAdminDTO } from 'src/app/module/chat/domain/use-case/member/member-admin-use-case.service'; +import { MessageCreateUseCaseService } from 'src/app/module/chat/domain/use-case/message/message-create-use-case.service'; +import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; +import { SocketMessageDeleteUseCaseService } from 'src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service'; +import { SocketMessageUpdateUseCaseService } from 'src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service'; +import { SocketMessageCreateUseCaseService } from 'src/app/module/chat/domain/use-case/socket/socket-message-create-use-case.service'; +import { DownloadMessageAttachmentByMessageId, DownloadMessageAttachmentUserCaseService } from 'src/app/module/chat/domain/use-case/message/message-download-attachment-user-case.service'; +import { ListenMessageByRoomIdNewUseCase } from 'src/app/module/chat/domain/use-case/message/listen-message-by-roomId.service'; +import { MemberListUpdateStatusUseCaseService } from 'src/app/module/chat/domain/use-case/socket/member-list-update-status-use-case.service'; +import { ListenMessageDeleteByRoomIdService } from './use-case/message/listene-message-delete-by-roomId.service'; +import { ListenMessageUpdateByRoomIdUseCase } from './use-case/message/listen-message-update-by-roomId.service'; +import { GetRoomByIdUseCaseService } from './use-case/room/room-get-by-id-use-case.service'; +import { DeleteRoomUseCaseService } from './use-case/room/room-delete-by-id-use-case.service'; +import { CreateRoomInputDTO, CreateRoomUseCaseService } from './use-case/room/room-create-use-case.service'; +import { RoomLeaveUseCase, UserRemoveListInputDTO } from './use-case/room/room-leave-by-id-use-case.service'; +import { SyncAllRoomMessagesService } from './use-case/message/sync-all-room-messages.service'; +import { ListenSendMessageUseCase } from './use-case/message/listen-send-message.service'; +import { SendLocalMessagesUseCaseService } from './use-case/message/messages-send-offline-use-case.service' +import { RemoveMemberUseCaseService } from './use-case/member/-use-case.service' +import { AddMemberUseCaseService } from './use-case/member/member-add-use-case.service' +import { RoomUpdateInputDTO, UpdateRoomByIdUseCaseService } from './use-case/room/room-update-by-id-use-case.service' +import { SocketConnectUseCaseService } from './use-case/socket-connect-use-case.service' +import { MessageMarkAsReadUseCaseService } from './use-case/message/message-mark-as-read-use-case.service' +import { MessageMarkAllMessageAsReadByRoomIdInputSchema, MessageMarkAllMessageAsReadByRoomIdService } from './use-case/message/message-mark-all-message-as-read-by-room-id.service' +import { GetRoomListUseCaseService } from 'src/app/module/chat/domain/use-case/room/room-get-list-use-case.service'; +import { filter } from 'rxjs/operators'; +import { v4 as uuidv4 } from 'uuid' +import { IMessage, MessageEntity } from '../../../core/chat/entity/message'; +import { MessageAttachmentByMessageIdInput, MessageAttachmentByMessageIdUseCase } from './use-case/message/message-attachment-by-message-id.service'; +import { AddMemberToRoomInputDTO } from '../domain/use-case/member/member-add-use-case.service'; +import { RoomType } from "src/app/core/chat/entity/group"; +import { HttpListenToMessageLoadHistoryAdapter } from './adapter' +import { HttpListenToMessageLoadHistoryUseCaseInput } from 'src/app/core/chat/usecase/message/http-listen-to-message-load-history-by-roomId-use-case'; +import { MessageSocketRepositoryService } from 'src/app/module/chat/data/repository/message/message-live-signalr-data-source.service' +import { MessageMarkAsReadInput } from "src/app/module/chat/domain/use-case/message/message-mark-as-read-use-case.service"; +import { BoldRemoveByRoomIdInput, BoldRemoveByRoomIdService } from 'src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service'; +import { MemberListHttpSyncUseCase } from 'src/app/module/chat/domain/use-case/member/member-list-http-sync-use-case.ts.service' +import { RoomBoldSyncUseCaseService } from 'src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service' +import { RoomSetLastMessageService } from 'src/app/module/chat/domain/use-case/room/room-set-last-message.service'; +import { IUserPhotoGetByIdInput, UserPhotoGetByIdUseCase } from 'src/app/module/chat/domain/use-case/user-photo/user-photo-get-by-id-use-case.service' + + +export const getInstanceId = (): string => { + const storageKey = 'instanceId'; // Key for localStorage + let instanceId = localStorage.getItem(storageKey); + + // If not found in localStorage, generate and set a new UUID + if (!instanceId) { + instanceId = uuidv4(); + localStorage.setItem(storageKey, instanceId); + } + + return instanceId; +}; + +export const InstanceId = getInstanceId(); + +@Injectable({ + providedIn: 'root' +}) +export class ChatServiceService { + + constructor( + private MessageDeleteLiveUseCaseService: MessageDeleteLiveUseCaseService, + private MessageReactionUseCaseService: MessageReactionUseCaseService, + private MessageUpdateUseCaseService: MessageUpdateUseCaseService, + private SocketMessageDeleteUseCaseService: SocketMessageDeleteUseCaseService, + private messageLiveSignalRDataSourceService: SignalRService, + private SocketMessageUpdateUseCaseService: SocketMessageUpdateUseCaseService, + private SocketMessageCreateUseCaseService: SocketMessageCreateUseCaseService, + private MemberListUpdateStatusUseCaseService: MemberListUpdateStatusUseCaseService, + private MemberAdminUseCaseService: MemberAdminUseCaseService, + private MessageCreateUseCaseService: MessageCreateUseCaseService, + private ListenMessageByRoomIdNewUseCase: ListenMessageByRoomIdNewUseCase, + private ListenMessageDeleteService: ListenMessageDeleteByRoomIdService, + private ListenMessageUpdateByRoomIdUseCase: ListenMessageUpdateByRoomIdUseCase, + private ListenSendMessageUseCase: ListenSendMessageUseCase, + private MessageAttachmentByMessageIdService: MessageAttachmentByMessageIdUseCase, + private SyncAllRoomMessagesService: SyncAllRoomMessagesService, + private DownloadMessageAttachmentUserCaseService: DownloadMessageAttachmentUserCaseService, + private GetRoomListUseCaseService: GetRoomListUseCaseService, + private GetRoomByIdUseCaseService: GetRoomByIdUseCaseService, + private DeleteRoomUseCaseService: DeleteRoomUseCaseService, + private CreateRoomUseCaseService: CreateRoomUseCaseService, + private RoomLeaveUseCase: RoomLeaveUseCase, + private AddMemberUseCaseService: AddMemberUseCaseService, + private UpdateRoomByIdUseCaseService: UpdateRoomByIdUseCaseService, + private RemoveMemberUseCaseService: RemoveMemberUseCaseService, + private SendLocalMessagesUseCaseService: SendLocalMessagesUseCaseService, + private MessageMarkAsReadUseCaseService: MessageMarkAsReadUseCaseService, + private SocketConnectUseCaseService: SocketConnectUseCaseService, + private MessageMarkAllMessageAsReadByRoomIdService: MessageMarkAllMessageAsReadByRoomIdService, + private HttpListenToMessageLoadHistory: HttpListenToMessageLoadHistoryAdapter, + private MessageSocketRepositoryService: MessageSocketRepositoryService, + private BoldRemoveByRoomIdService: BoldRemoveByRoomIdService, + private MemberListHttpSyncUseCase: MemberListHttpSyncUseCase, // dont remove + private RoomBoldSyncUseCaseService: RoomBoldSyncUseCaseService, // dont remove + private RoomSetLastMessageService: RoomSetLastMessageService, // dont remove + private UserPhotoGetByIdUseCase: UserPhotoGetByIdUseCase + ) { + this.MessageSocketRepositoryService.listenToDeleteMessages() + .pipe() + .subscribe(async (message) => { + if(message?.id) { + this.SocketMessageDeleteUseCaseService.execute(message) + } + }) + + this.MessageSocketRepositoryService.listenToUpdateMessages().pipe( + filter((message) => { + return !message?.requestId?.startsWith(InstanceId) + }) + ).subscribe(async (message) => { + if(message?.id) { + this.SocketMessageUpdateUseCaseService.execute(message) + } + }) + + this.MessageSocketRepositoryService.listenToMessages().pipe( + filter((message) => { + if(!message?.requestId?.startsWith(InstanceId) == false) { + // console.log('exclude my message---') + } + return !message?.requestId?.startsWith(InstanceId) + }) + ).subscribe(async (message) => { + if(message?.id) { + this.SocketMessageCreateUseCaseService.execute(message) + } + }) + + this.messageLiveSignalRDataSourceService.getData().pipe( + filter((message) => { + if(message?.method == 'AvailableUsers') { + // console.log('exclude my message---') + return true + } + }) + ).subscribe(async (message) => { + this.MemberListUpdateStatusUseCaseService.execute(message.data as any) + }) + + } + + async start() { + this.chatSync() + this.SocketConnectUseCaseService.execute(); + } + + + async chatSync() { + await this.getRoomList(); + await this.asyncAllRoomMessage(); + } + + removeMemberToRoom(data: UserRemoveListInputDTO) { + return this.RemoveMemberUseCaseService.execute(data) + } + + messageDelete(data: {roomId, messageId}) { + + const params = { + ...data, + senderId: SessionStore.user.UserId, + } + + return this.MessageDeleteLiveUseCaseService.execute(params) + } + + getUserPhoto(input: IUserPhotoGetByIdInput) { + return this.UserPhotoGetByIdUseCase.execute(input) + } + + reactToMessage(input: MessageReactionInput) { + return this.MessageReactionUseCaseService.execute(input); + } + + updateMessage(input: MessageUpdateInput) { + return this.MessageUpdateUseCaseService.execute(input); + } + + setAdmin(input: MemberSetAdminDTO) { + return this.MemberAdminUseCaseService.execute(input) + } + + sendMessage(input: IMessage, messageEnum: RoomType) { + return this.MessageCreateUseCaseService.execute(input, messageEnum); + } + + asyncAllRoomMessage() { + return this.SyncAllRoomMessagesService.execute() + } + + getMessageAttachmentByMessageId(input: MessageAttachmentByMessageIdInput) { + return this.MessageAttachmentByMessageIdService.execute(input) + } + + downloadMessageAttachmentByMessageId(input: DownloadMessageAttachmentByMessageId) { + return this.DownloadMessageAttachmentUserCaseService.execute(input) + } + + // getMessageAttachmentLocallyByMessageId(input: GetMessageAttachmentLocallyByMessageId) { + // return this.GetMessageAttachmentLocallyUseCaseService.execute(input) + // } + + removeBoldFromRoom(input: BoldRemoveByRoomIdInput) { + return this.BoldRemoveByRoomIdService.execute(input) + } + + listenToMessageLoadHistory(input: HttpListenToMessageLoadHistoryUseCaseInput) { + return this.HttpListenToMessageLoadHistory.execute(input) + } + + getRoomList() { + return this.GetRoomListUseCaseService.execute() + } + + getRoomById(id: string) { + return this.GetRoomByIdUseCaseService.execute(id) + } + + + deleteRoomById(id: string) { + return this.DeleteRoomUseCaseService.execute(id) + } + + createRoom(data: CreateRoomInputDTO) { + return this.CreateRoomUseCaseService.execute(data) + } + + leaveRoom(data: UserRemoveListInputDTO) { + return this.RoomLeaveUseCase.execute(data) + } + + addMemberToRoom(data: AddMemberToRoomInputDTO) { + return this.AddMemberUseCaseService.execute(data) + } + + updateRoomById(data: RoomUpdateInputDTO) { + return this.UpdateRoomByIdUseCaseService.execute(data) + } + + // messageMarkAsRead(roomId) { + // return this.MessageReadAtByIdUseCaseService.execute({roomId}) + // } + + sendLocalMessages() { + return this.SendLocalMessagesUseCaseService.execute() + } + removeMember() { + + } + + sendReadAt(sendReadAt: MessageMarkAsReadInput) { + return this.MessageMarkAsReadUseCaseService.execute(sendReadAt) + } + + markAllMessagesAsRead(input: MessageMarkAllMessageAsReadByRoomIdInputSchema) { + return this.MessageMarkAllMessageAsReadByRoomIdService.execute(input) + } + + listenToIncomingMessage(roomId:string) { + return this.ListenMessageByRoomIdNewUseCase.execute({roomId}) + } + + listenToDeleteMessage(roomId: string) { + return this.ListenMessageDeleteService.execute({roomId}) + } + + listenToUpdateMessage(roomId: string) { + return this.ListenMessageUpdateByRoomIdUseCase.execute({roomId}) + } + + + listenToSendMessage(roomId: string) { + return this.ListenSendMessageUseCase.execute({roomId}) + } + +} + diff --git a/src/app/module/chat/domain/mapper/memberLIstMapper.ts b/src/app/module/chat/domain/mapper/memberLIstMapper.ts new file mode 100644 index 000000000..953912f2c --- /dev/null +++ b/src/app/module/chat/domain/mapper/memberLIstMapper.ts @@ -0,0 +1,15 @@ + +import { MemberTable } from "src/app/infra/database/dexie/instance/chat/schema/members"; +import { RoomByIdMemberItemOutputDTO } from "../use-case/room/room-get-by-id-use-case.service"; + +export function MemberListMapper(outputDto: RoomByIdMemberItemOutputDTO, roomId: string): MemberTable { + return { + roomId: roomId, + wxUserId: outputDto.user.wxUserId, + wxFullName: outputDto.user.wxFullName, + wxeMail: outputDto.user.wxFullName, + userPhoto: outputDto.user.userPhoto, + joinAt: outputDto.joinAt, + isAdmin: outputDto.isAdmin + } +} diff --git a/src/app/module/chat/domain/mapper/messageMapper.ts b/src/app/module/chat/domain/mapper/messageMapper.ts new file mode 100644 index 000000000..4e7bc021d --- /dev/null +++ b/src/app/module/chat/domain/mapper/messageMapper.ts @@ -0,0 +1,34 @@ +import { MessageEntity, IMessage } from "../../../../core/chat/entity/message"; +import { MessageOutPutDataDTO } from "src/app/core/chat/repository/dto/messageOutputDTO"; +import { MessageInputDTO } from "../use-case/message/message-create-use-case.service"; + +export class MessageMapper { + static toDomain(DTO: MessageOutPutDataDTO) : MessageEntity { + return DTO as MessageEntity + } + + static fromDomain(entity:IMessage, requestId): MessageInputDTO { + return { + receiverId: entity.receiverId, + canEdit: entity.canEdit, + message: entity.message, + messageType: entity.messageType, + oneShot: entity.oneShot, + requireUnlock: entity.requireUnlock, + roomId: entity.roomId, + senderId: entity.sender.wxUserId, + requestId: entity.requestId || requestId, + attachment: entity.attachments.map((e)=>({ + fileType:e.fileType, + source: e.source, + file: e.file, + fileName: e.fileName, + applicationId: e.applicationId || 0, + docId: Number(e.docId) || 0, + mimeType: e.mimeType, + description: e.description + }))[0] || {} + + } + } +} diff --git a/src/app/services/chat/chat-system.service.spec.ts b/src/app/module/chat/domain/service/distribution.service.spec.ts similarity index 51% rename from src/app/services/chat/chat-system.service.spec.ts rename to src/app/module/chat/domain/service/distribution.service.spec.ts index 3afb80345..d2662a6d2 100644 --- a/src/app/services/chat/chat-system.service.spec.ts +++ b/src/app/module/chat/domain/service/distribution.service.spec.ts @@ -1,13 +1,13 @@ import { TestBed } from '@angular/core/testing'; -import { ChatSystemService } from './chat-system.service'; +import { DistributionService } from './distribution.service'; -describe('ChatSystemService', () => { - let service: ChatSystemService; +describe('DistributionService', () => { + let service: DistributionService; beforeEach(() => { TestBed.configureTestingModule({}); - service = TestBed.inject(ChatSystemService); + service = TestBed.inject(DistributionService); }); it('should be created', () => { diff --git a/src/app/module/chat/domain/service/distribution.service.ts b/src/app/module/chat/domain/service/distribution.service.ts new file mode 100644 index 000000000..7b415563c --- /dev/null +++ b/src/app/module/chat/domain/service/distribution.service.ts @@ -0,0 +1,85 @@ +import { Injectable } from '@angular/core'; +import { filter, map } from 'rxjs/operators'; +import { IMessageGetAllByRoomIdOutPut } from 'src/app/core/chat/usecase/message/message-get-all-by-room-Id'; +import { HttpAdapter } from 'src/app/infra/http/adapter'; +import { IDistributionLocalRepository } from 'src/app/core/chat/repository/distribution/distribution-local-repository' +import { z } from 'zod'; +import { distributionListDetermineChanges } from '../../data/async/list/rooms/distributionListChangedetector'; +import { DistributionEntity } from 'src/app/core/chat/entity/distribution'; + +export const DistributionOutPutDTOSchema = z.object({ + $messageIdMemberId: z.string(), + memberId: z.number(), + readAt: z.string().nullable(), + deliverAt: z.string().nullable() +}) +export type DistributionOutPutDTO = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class DistributionService { + + constructor( + private http: HttpAdapter, + private distributionLocalRepository: IDistributionLocalRepository + ) {} + + listenToLoadHistory() { + return this.http.listen().pipe( + filter((response)=> { + if(response?.isOk()) { + return response.value.url.endsWith('Messages') + } + + return false + }), + map((response: any) => response.value.data as IMessageGetAllByRoomIdOutPut) + ) + .subscribe(async (data) => { + + const localList = await this.distributionLocalRepository.find({roomId: data.data[0].roomId}) + + data.data.map(async (message) => { + const serverList = message.info + + if(localList.isOk() && localList.value) { + + // const localListForCurrentMessage = localList.value.filter((e) => e.messageId == message.id) + + // console.log('localListForCurrentMessage', localListForCurrentMessage) + + // const { distributionToInsert, distributionToUpdate, distributionToDelete } = await distributionListDetermineChanges(serverList, localListForCurrentMessage, message.id) + // console.log({distributionToInsert, distributionToUpdate, distributionToDelete}) + + // const map = distributionToInsert.map((e) => { + // e. + // }) + + // this.distributionLocalRepository.insertMany(distributionToInsert) + + // const distributionEntityToInsert = distributionToInsert.map((ee)=> { + // return new DistributionEntity({ + // roomId: message.roomId, + // deliverAt: ee.deliverAt, + // memberId: ee.memberId, + // messageId: message.roomId, + // readAt: ee.readAt, + // }) + + // console.log('create') + // }) + + // if(distributionEntityToInsert.length >= 0) { + // // console.log('distributionEntityToInsert', distributionEntityToInsert) + // //this.distributionLocalRepository.insertMany(distributionEntityToInsert) + // } + + + } + + }) + + }) + } +} diff --git a/src/app/services/webnotifications.service.spec.ts b/src/app/module/chat/domain/service/room-last-message.service.spec.ts similarity index 50% rename from src/app/services/webnotifications.service.spec.ts rename to src/app/module/chat/domain/service/room-last-message.service.spec.ts index 5af6818b3..660392bf3 100644 --- a/src/app/services/webnotifications.service.spec.ts +++ b/src/app/module/chat/domain/service/room-last-message.service.spec.ts @@ -1,13 +1,13 @@ import { TestBed } from '@angular/core/testing'; -import { WebNotificationsService } from './webnotifications.service'; +import { RoomLastMessageService } from './room-last-message.service'; -describe('WebNotificationsService', () => { - let service: WebNotificationsService; +describe('RoomLastMessageService', () => { + let service: RoomLastMessageService; beforeEach(() => { TestBed.configureTestingModule({}); - service = TestBed.inject(WebNotificationsService); + service = TestBed.inject(RoomLastMessageService); }); it('should be created', () => { diff --git a/src/app/module/chat/domain/service/room-last-message.service.ts b/src/app/module/chat/domain/service/room-last-message.service.ts new file mode 100644 index 000000000..04144070b --- /dev/null +++ b/src/app/module/chat/domain/service/room-last-message.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { filter, map } from 'rxjs/operators'; +import { MessageEntity } from 'src/app/core/chat/entity/message'; +import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; +import { InstanceId } from '../chat-service.service'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; + +@Injectable({ + providedIn: 'root' +}) +export class RoomLastMessageService { + + constructor( + private MessageSocketRepositoryService: IMessageSocketRepository, + private roomLocalRepository: IRoomLocalRepository + ) { + // this.listenToIncomingMessage() + } + + listenToIncomingMessage() { + return this.MessageSocketRepositoryService.listenToMessages().pipe( + filter((message) => !message?.requestId?.startsWith(InstanceId)), + map(message => Object.assign(new MessageEntity(), message)) + ).subscribe(async (message) => { + this.roomLocalRepository.update(message.roomId, { + messages: [message] + }) + + }); + + } +} diff --git a/src/app/services/chat/room.service.spec.ts b/src/app/module/chat/domain/service/room.service.spec.ts similarity index 100% rename from src/app/services/chat/room.service.spec.ts rename to src/app/module/chat/domain/service/room.service.spec.ts diff --git a/src/app/module/chat/domain/service/room.service.ts b/src/app/module/chat/domain/service/room.service.ts new file mode 100644 index 000000000..27da9fdf1 --- /dev/null +++ b/src/app/module/chat/domain/service/room.service.ts @@ -0,0 +1,29 @@ +import { Injectable } from '@angular/core'; +import { RoomSocketRepositoryService } from 'src/app/module/chat/data/repository/room/room-socket-repository.service' +@Injectable({ + providedIn: 'root' +}) +export class RoomService { + + constructor( + private RoomSocketRepositoryService: RoomSocketRepositoryService + ) {} + + init() { + this.OnReceiveCreateRoom() + this.OnDeleteCreateRoom() + } + + + OnReceiveCreateRoom() { + this.RoomSocketRepositoryService.listenToCreateRoom().subscribe((data)=> { + console.log('OnReceiveCreateRoom', data) + }) + } + + OnDeleteCreateRoom() { + this.RoomSocketRepositoryService.listenToDeleteRoom().subscribe((data)=> { + console.log('OnDeleteCreateRoom7', data) + }) + } +} diff --git a/src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service.spec.ts b/src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service.spec.ts new file mode 100644 index 000000000..5765c451f --- /dev/null +++ b/src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { BoldRemoveByRoomIdService } from './bold-remove-by-room-id.service'; + +describe('BoldRemoveByRoomIdService', () => { + let service: BoldRemoveByRoomIdService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(BoldRemoveByRoomIdService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service.ts b/src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service.ts new file mode 100644 index 000000000..46e5860fb --- /dev/null +++ b/src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@angular/core'; +import { IBoldLocalRepository } from 'src/app/core/chat/repository/bold/bold-local-repository'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { zodSafeValidation } from 'src/app/utils/zodValidation'; +import { z } from 'zod'; + + +const BoldRemoveByRoomIdInputSchema = z.object({ + roomId: z.string() +}) +export type BoldRemoveByRoomIdInput = z.infer +@Injectable({ + providedIn: 'root' +}) +export class BoldRemoveByRoomIdService { + + constructor( + private boldLocalRepository: IBoldLocalRepository, + ) { } + + @XTracerAsync({name:'BoldRemoveByRoomIdService', module:'chat', bugPrint: true}) + async execute(input: BoldRemoveByRoomIdInput, tracing?: TracingType) { + + const validation = zodSafeValidation(BoldRemoveByRoomIdInputSchema, input) + + if(validation.isOk()) { + return await this.boldLocalRepository.delete(input.roomId) + } else { + tracing.hasError("invalid parameter") + } + + } +} diff --git a/src/app/module/chat/domain/use-case/member/-use-case.service.ts b/src/app/module/chat/domain/use-case/member/-use-case.service.ts new file mode 100644 index 000000000..ff2f5bdbe --- /dev/null +++ b/src/app/module/chat/domain/use-case/member/-use-case.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; +import { RoomRemoteDataSourceService } from '../../../data/repository/room/room-remote-repository.service'; +import { MemberListRemoteRepository } from '../../../data/repository/member/member-list-remote-repository.service'; +import { UserRemoveListInputDTO } from '../room/room-leave-by-id-use-case.service'; + +@Injectable({ + providedIn: 'root' +}) +export class RemoveMemberUseCaseService { + + constructor( + private memberRemoteDataSourceService: MemberListRemoteRepository, + ) { } + + + @captureAndReraiseAsync('RoomRepositoryService/removeMemberToRoom') + async execute(data: UserRemoveListInputDTO) { + const result = await this.memberRemoteDataSourceService.removeMemberFromRoom(data) + + return result + } +} diff --git a/src/app/module/chat/domain/use-case/member/member-add-use-case.service.ts b/src/app/module/chat/domain/use-case/member/member-add-use-case.service.ts new file mode 100644 index 000000000..4947e7132 --- /dev/null +++ b/src/app/module/chat/domain/use-case/member/member-add-use-case.service.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@angular/core'; +import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; +import { z } from 'zod'; +import { IMemberRemoteRepository } from 'src/app/core/chat/repository/member/member-remote-repository'; + + +export const AddMemberToRoomInputDTOSchema = z.object({ + id: z.string(), + members: z.array(z.number()), +}); + +export type AddMemberToRoomInputDTO = z.infer + + +@Injectable({ + providedIn: 'root' +}) +export class AddMemberUseCaseService { + + constructor( + private memberRemoteDataSourceService: IMemberRemoteRepository, + ) { } + + + + @captureAndReraiseAsync('RoomRepositoryService/addMemberToRoom') + async execute(data: AddMemberToRoomInputDTO) { + + // return this.roomLiveSignalRDataSourceService.addMemberToRoom(data) + + const result = await this.memberRemoteDataSourceService.addMemberToRoom(data) + + return result + } + +} diff --git a/src/app/module/chat/domain/use-case/member/member-admin-use-case.service.ts b/src/app/module/chat/domain/use-case/member/member-admin-use-case.service.ts new file mode 100644 index 000000000..d037b5d09 --- /dev/null +++ b/src/app/module/chat/domain/use-case/member/member-admin-use-case.service.ts @@ -0,0 +1,29 @@ +import { Injectable } from '@angular/core'; +import { z } from "zod"; +import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; +import { IMemberRemoteRepository } from 'src/app/core/chat/repository/member/member-remote-repository'; + +// Define the schema for the entire response +const MemberSetAdminDTOSchema = z.object({ + roomId: z.string(), + memberId: z.string() +}); + +export type MemberSetAdminDTO = z.infer + + +@Injectable({ + providedIn: 'root' +}) +export class MemberAdminUseCaseService { + + constructor( + public repository: IMemberRemoteRepository + ) { } + + @ValidateSchema(MemberSetAdminDTOSchema) + execute(input: MemberSetAdminDTO) { + + return this.repository.setAmin(input) + } +} diff --git a/src/app/module/chat/domain/use-case/member/member-list-http-sync-use-case.ts.service.ts b/src/app/module/chat/domain/use-case/member/member-list-http-sync-use-case.ts.service.ts new file mode 100644 index 000000000..a0ef1c59a --- /dev/null +++ b/src/app/module/chat/domain/use-case/member/member-list-http-sync-use-case.ts.service.ts @@ -0,0 +1,61 @@ +import { Injectable } from '@angular/core'; +import { filter, map } from 'rxjs/operators'; +import { HttpAdapter } from 'src/app/infra/http/adapter'; +import { RoomByIdOutputDTO } from '../../../domain/use-case/room/room-get-by-id-use-case.service'; +import { IMemberLocalRepository } from 'src/app/core/chat/repository/member/member-local-repository'; +import { MemberListMapper } from '../../../domain/mapper/memberLIstMapper'; +import { roomMemberListDetermineChanges } from '../../../data/async/list/rooms/roomMembersChangeDetector'; +@Injectable({ + providedIn: 'root' +}) +export class MemberListHttpSyncUseCase { + + constructor( + private http: HttpAdapter, + private memberLocalRepository: IMemberLocalRepository + ) { + + this.http.listen().pipe( + filter((response)=> { + if(response?.isOk()) { + return response.value.url.includes('/Room/') && typeof response.value?.data?.data?.roomName == 'string' + } + + return false + }), + map((response: any) => response.value.data as RoomByIdOutputDTO) + ) + .subscribe(async (data) => { + + this.syncMembers(data) + }) + } + + private async syncMembers(roomData: RoomByIdOutputDTO): Promise { + const roomId = roomData.data.id; + + // Fetch local members and determine changes + const localList = await this.memberLocalRepository.getRoomMemberById(roomId); + const { membersToInsert, membersToUpdate, membersToDelete } = roomMemberListDetermineChanges(roomData.data.members, localList, roomId); + + // Sync members + // for (const user of membersToInsert) { + // await this.memberLocalRepository.addMember(MemberListMapper(user, roomId)); + // } + // for (const user of membersToUpdate) { + // await this.memberLocalRepository.updateMemberRole(MemberListMapper(user, roomId)); + // } + // for (const user of membersToDelete) { + // await this.memberLocalRepository.removeMemberFromRoom(user.$roomIdUserId); + // } + + // console.log({membersToInsert, membersToUpdate, membersToDelete}) + + await Promise.all([ + ...membersToInsert.map(user => this.memberLocalRepository.addMember(MemberListMapper(user, roomId))), + ...membersToUpdate.map(user => this.memberLocalRepository.updateMemberRole(MemberListMapper(user, roomId))), + ...membersToDelete.map(user => this.memberLocalRepository.removeMemberFromRoom(user.$roomIdUserId)) + ]); + + } +} diff --git a/src/app/module/chat/domain/use-case/message/listen-message-by-roomId.service.ts b/src/app/module/chat/domain/use-case/message/listen-message-by-roomId.service.ts new file mode 100644 index 000000000..281970a2c --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/listen-message-by-roomId.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { filter, map } from 'rxjs/operators'; +import { InstanceId } from '../../chat-service.service'; +import { MessageEntity } from '../../../../../core/chat/entity/message'; +import { z } from 'zod'; +import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; + + +export const ListenMessageByRoomIdNewInputDTOSchema = z.object({ + roomId: z.string(), +}); +export type ListenMessageByRoomIdNewInputDTO = z.infer + + +@Injectable({ + providedIn: 'root' +}) +export class ListenMessageByRoomIdNewUseCase { + + constructor( + private MessageSocketRepositoryService: IMessageSocketRepository + ) { } + + execute(data: ListenMessageByRoomIdNewInputDTO) { + + return this.MessageSocketRepositoryService.listenToMessages().pipe( + filter((message) => !message?.requestId?.startsWith(InstanceId) && message?.roomId == data.roomId), + map(message => Object.assign(new MessageEntity(), message)) + ) + + } +} diff --git a/src/app/module/chat/domain/use-case/message/listen-message-update-by-roomId.service.ts b/src/app/module/chat/domain/use-case/message/listen-message-update-by-roomId.service.ts new file mode 100644 index 000000000..642b64870 --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/listen-message-update-by-roomId.service.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { filter } from 'rxjs/operators'; +import { z } from 'zod'; +import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; + +export const ListenMessageUpdateByRoomIdInputDTOSchema = z.object({ + roomId: z.string(), +}); +export type ListenMessageUpdateByRoomIdInputDTO = z.infer + + + +@Injectable({ + providedIn: 'root' +}) +export class ListenMessageUpdateByRoomIdUseCase { + + constructor( + private messageLiveSignalRDataSourceService: IMessageSocketRepository, + ) { } + + execute(input: ListenMessageUpdateByRoomIdInputDTO) { + return this.messageLiveSignalRDataSourceService.listenToUpdateMessages().pipe( + filter((message) => input.roomId == message?.roomId ) + ) + } +} diff --git a/src/app/module/chat/domain/use-case/message/listen-send-message.service.ts b/src/app/module/chat/domain/use-case/message/listen-send-message.service.ts new file mode 100644 index 000000000..c49e4a8ed --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/listen-send-message.service.ts @@ -0,0 +1,34 @@ +import { Injectable } from '@angular/core'; +import { MessageSocketRepositoryService } from 'src/app/module/chat/data/repository/message/message-live-signalr-data-source.service' +import { InstanceId } from '../../chat-service.service'; +import { filter, map } from 'rxjs/operators'; +import { z } from 'zod'; + +export const ListenSendMessageInputDTOSchema = z.object({ + roomId: z.string(), +}); +export type ListenSendMessageInputDTO = z.infer + + + +@Injectable({ + providedIn: 'root' +}) +export class ListenSendMessageUseCase { + + constructor( + private MessageSocketRepositoryService: MessageSocketRepositoryService + ) { } + + execute({roomId}: {roomId: string}) { + + return this.MessageSocketRepositoryService.listenToMessages().pipe( + filter((message) => { + + return message?.requestId?.startsWith(InstanceId) && message?.roomId == roomId + }), + map(message => message) + ) + + } +} diff --git a/src/app/module/chat/domain/use-case/message/listene-message-delete-by-roomId.service.ts b/src/app/module/chat/domain/use-case/message/listene-message-delete-by-roomId.service.ts new file mode 100644 index 000000000..2358178ff --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/listene-message-delete-by-roomId.service.ts @@ -0,0 +1,29 @@ +import { Injectable } from '@angular/core'; +import { filter } from 'rxjs/operators'; +import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; +import { MessageSocketRepositoryService } from 'src/app/module/chat/data/repository/message/message-live-signalr-data-source.service' +import { z } from 'zod'; + +export const ListenMessageDeleteByRoomIdInputDTOSchema = z.object({ + roomId: z.string(), +}); +export type ListenMessageDeleteByRoomIdInputDTO = z.infer + + +@Injectable({ + providedIn: 'root' +}) +export class ListenMessageDeleteByRoomIdService { + + constructor( + private MessageSocketRepositoryService: MessageSocketRepositoryService, + ) { } + + execute({roomId}: ListenMessageDeleteByRoomIdInputDTO) { + return this.MessageSocketRepositoryService.listenToDeleteMessages().pipe( + filter((message) => { + return roomId == message?.roomId + } ) + ) + } +} diff --git a/src/app/module/chat/domain/use-case/message/message-attachment-by-message-id.service.ts b/src/app/module/chat/domain/use-case/message/message-attachment-by-message-id.service.ts new file mode 100644 index 000000000..52b2161d5 --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/message-attachment-by-message-id.service.ts @@ -0,0 +1,125 @@ +import { Injectable } from '@angular/core'; +import { z } from 'zod'; +import { AttachmentRemoteDataSourceService } from 'src/app/module/chat/data/repository/attachment/attachment-remote-repository.service' +import { AttachmentLocalDataSource } from 'src/app/module/chat/data/repository/attachment/attachment-local-repository.service' +import { createBlobUrl } from 'src/app/utils/ToBase64'; +import { err, Result } from 'neverthrow'; +import { MessageEntitySchema } from '../../../../../core/chat/entity/message'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { isHttpResponse } from 'src/app/infra/http/http.service'; + +const MessageAttachmentByMessageIdSchema = MessageEntitySchema.pick({ + $id: true, + id: true, + attachments: true, +}) + +export type MessageAttachmentByMessageIdInput = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class MessageAttachmentByMessageIdUseCase { + + constructor( + private AttachmentRemoteDataSourceService: AttachmentRemoteDataSourceService, + private AttachmentLocalDataSource: AttachmentLocalDataSource + ) { } + + @XTracerAsync({name:'Message-Attachment-By-MessageIdUseCase', module:'chat', bugPrint: true, waitNThrow: 15000}) + async execute(input: MessageAttachmentByMessageIdInput, tracing?: TracingType): Promise> { + + tracing.setAttribute('messageId', input.id) + + const getLocalAttachment = await this.AttachmentLocalDataSource.findOne({ + $messageId: input.$id + }) + + if(getLocalAttachment.isOk() && getLocalAttachment.value) { + tracing.setAttribute('download', 'false') + + // has blob + if(getLocalAttachment.value.file) { + const dataUrl = await createBlobUrl(getLocalAttachment.value.file) + + if(dataUrl.isOk()) { + return dataUrl + } else { + return dataUrl + } + } else { + // has data url + return getLocalAttachment.map((e) => { + + // Logger.info('restored file .', { + // data: e.base64.slice(0, 100)+'...' + // }) + + return e.base64 + }) + } + + + } else { + tracing.setAttribute('download', 'true') + tracing.setAttribute('attachmentId', input.attachments[0].id.toString()) + + const result = await this.AttachmentRemoteDataSourceService.getAttachment(input.attachments[0].id) + if(result.isErr()) { + tracing.hasError('failed to download message attachment', { + error: result.error, + data: 'document id '+ input.attachments[0].id, + messageId: input.id, + $messageId: input.$id + }) + + if(isHttpResponse(result.error)) { + tracing.setAttribute('attachmentUrl', result.error.message) + } + } + + + if(result.isOk()) { + + const dataUrl = await createBlobUrl(result.value) + + if(dataUrl.isOk()) { + + //console.log('done convert') + //Logger.info('downloaded file .', { + // data: dataUrl.value.slice(0, 100)+'...' + //}) + + this.AttachmentLocalDataSource.insert({ + $messageId: input.$id, + file: result.value, + fileType: input.attachments[0].fileType, + source: input.attachments[0].source, + fileName: input.attachments[0].fileName, + applicationId: input.attachments[0].applicationId, + docId: input.attachments[0].docId, + mimeType: input.attachments[0].mimeType, + }).then((e) => { + if(e.isErr()) { + tracing.hasError('failed to create attachment locally on send message', { + error: e.error, + // data: dataUrl.value.slice(0, 100)+'...' + }) + } + }) + + return dataUrl + } else { + console.log('dataUrl eerror', dataUrl.error) + return err(false) + } + + + } else { + return result as any + } + + } + + } +} diff --git a/src/app/module/chat/domain/use-case/message/message-create-use-case.service.ts b/src/app/module/chat/domain/use-case/message/message-create-use-case.service.ts new file mode 100644 index 000000000..90bf29849 --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/message-create-use-case.service.ts @@ -0,0 +1,241 @@ +import { Injectable } from '@angular/core'; +import { IMessage, MessageAttachmentSource, MessageEntity, MessageEntitySchema, } from '../../../../../core/chat/entity/message'; +import { AttachmentLocalDataSource } from "src/app/module/chat/data/repository/attachment/attachment-local-repository.service"; +import { z } from 'zod'; +import { v4 as uuidv4 } from 'uuid'; +import { InstanceId } from '../../chat-service.service'; +import { createBlobFromBase64, createDataURL } from 'src/app/utils/ToBase64'; +import { zodSafeValidation } from 'src/app/utils/zodValidation'; +import { Logger } from 'src/app/services/logger/main/service'; +import { err, Result } from 'neverthrow'; +import { MessageMapper } from '../../mapper/messageMapper'; +import { RoomType } from "src/app/core/chat/entity/group"; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member/member-list-local-repository.service' +import { SessionStore } from 'src/app/store/session.service'; +import { MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; +import { MessageAttachmentFileType, MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; +import { IMessageLocalRepository } from 'src/app/core/chat/repository/message/message-local-repository'; +import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; +import { IMemberLocalRepository } from 'src/app/core/chat/repository/member/member-local-repository'; +import { IAttachmentLocalRepository } from 'src/app/core/chat/repository/typing/typing-local-repository'; +import { base64Schema } from 'src/app/utils/zod'; + + +export const MessageInputDTOSchema = z.object({ + roomId: z.string().uuid().optional(), + receiverId: z.number().optional(), + senderId: z.number(), + message: z.string().nullable().optional(), + messageType: z.number(), + canEdit: z.boolean(), + oneShot: z.boolean(), + requireUnlock: z.boolean(), + requestId: z.string(), + attachment: z.object({ + fileType: z.nativeEnum(MessageAttachmentFileType), + source: z.nativeEnum(MessageAttachmentSource), + file: base64Schema.optional(), + fileName: z.string().optional(), + applicationId: z.number().optional(), + docId: z.number().optional(), + mimeType: z.string().nullable().optional(), + description: z.string().optional() + }).optional() +}); +export type MessageInputDTO = z.infer + + + +export const MessageCreatePutDataDTOSchema = z.object({ + id: z.string(), + roomId: z.string(), + sender: z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().optional() + }), + message: z.string().nullable().optional(), + messageType: z.number(), + sentAt: z.string(), + canEdit: z.boolean(), + oneShot: z.boolean(), + requireUnlock: z.boolean(), + requestId: z.string().optional().nullable(), + reactions: z.object({ + id: z.string(), + reactedAt: z.string(), + reaction: z.string(), + sender: z.object({}), + }).array(), + info: z.array(z.object({ + memberId: z.number(), + readAt: z.string().nullable(), + deliverAt: z.string().nullable() + })), + attachments: z.array(z.object({ + fileType: z.nativeEnum(MessageAttachmentFileType), + source: z.nativeEnum(MessageAttachmentSource), + file: z.string().optional(), + fileName: z.string().optional(), + applicationId: z.number().optional(), + docId: z.number().optional(), + id: z.string().optional() + })) +}); + +export type MessageCreateOutPutDataDTO = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class MessageCreateUseCaseService { + + constructor( + private AttachmentLocalRepositoryService: IAttachmentLocalRepository, + private messageLocalDataSourceService: IMessageLocalRepository, + private messageSocketRepositoryService: IMessageSocketRepository, + private MemberListLocalRepository: IMemberLocalRepository + ) { } + + + @XTracerAsync({name:'MessageCreateUseCaseService', module:'chat', bugPrint: true, waitNThrow: 5000}) + async execute(message: IMessage, messageEnum: RoomType, tracing?: TracingType) { + + const validation = zodSafeValidation(MessageEntitySchema, message) + + if(validation.isOk()) { + message.sendAttemp++; + + message.requestId = InstanceId +'@'+ uuidv4(); + message.sending = true; + + const createMessageLocally = await this.messageLocalDataSourceService.insert(message) + + if(createMessageLocally.isOk()) { + + message.$id = createMessageLocally.value + + if(message.hasAttachment) { + + for (const attachment of message.attachments) { + + if(attachment.source != MessageAttachmentSource.Webtrix) { + + this.AttachmentLocalRepositoryService.insert({ + $messageId: createMessageLocally.value, + file: createBlobFromBase64(attachment.file, attachment.mimeType), + fileType: attachment.fileType, + source: attachment.source, + fileName: attachment.fileName, + applicationId: attachment.applicationId, + docId: attachment.docId, + mimeType: attachment.mimeType, + base64: createDataURL(attachment.file, attachment.mimeType) + }).then((e) => { + if(e.isErr()) { + Logger.error('failed to create attachment locally on send message', { + error: e.error, + data: createDataURL(attachment.file, attachment.mimeType).slice(0, 100) +'...' + }) + } + + }) + + attachment.safeFile = createDataURL(attachment.file, attachment.mimeType) + } + } + + } + + //==================== + message.sending = true + + let sendMessageResult: Result + if(messageEnum == RoomType.Group) { + const DTO = MessageMapper.fromDomain(message, message.requestId) + sendMessageResult = await this.messageSocketRepositoryService.sendGroupMessage(DTO) + } else { + + if(message.receiverId) { + const DTO = MessageMapper.fromDomain(message, message.requestId) + sendMessageResult = await this.messageSocketRepositoryService.sendDirectMessage(DTO) + } else { + const getRoomMembers = await this.MemberListLocalRepository.directMember({ + roomId:message.roomId, + currentUserId: SessionStore.user.UserId + }) + if(getRoomMembers.isOk()) { + message.receiverId = getRoomMembers.value.wxUserId + const DTO = MessageMapper.fromDomain(message, message.requestId) + sendMessageResult = await this.messageSocketRepositoryService.sendGroupMessage(DTO) + } else { + console.log('not found direct users', getRoomMembers.error) + } + } + + + } + + // return this sendMessageResult + + if(sendMessageResult.isOk()) { + + message.id = sendMessageResult.value.id + + console.log('sendMessageResult', sendMessageResult.value.id) + + if(sendMessageResult.value.sender == undefined || sendMessageResult.value.sender == null) { + + delete sendMessageResult.value.sender + } + + let clone: MessageTable = { + ...sendMessageResult.value, + id: sendMessageResult.value.id, + $id : message.$id + } + + this.messageLocalDataSourceService.update(message.$id, {...clone, sending: false, roomId: message.roomId}).then((data)=> { + if(data.isOk()) { + + } else { + tracing.hasError('failed to update send message') + console.log(sendMessageResult) + console.log(data.error) + } + }) + + return sendMessageResult + } else { + Logger.error('failed to send message to the server', { + error: sendMessageResult.error + }) + await this.messageLocalDataSourceService.update(message.$id, {sending: false, $id: message.$id}) + return err('no connection') + } + + } else { + Logger.error('failed to insert locally', { + error: createMessageLocally.error.message + }) + } + } else { + + if(validation.error.formErrors.fieldErrors.attachments) { + Logger.error('failed to send message doe to invalid attachment', { + zodErrorList: validation.error.errors, + data: message.attachments + }) + } else { + Logger.error('failed to send message, validation failed', { + zodErrorList: validation.error.errors, + data: message + }) + } + + } + + } +} diff --git a/src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service.ts b/src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service.ts new file mode 100644 index 000000000..94c82e4bd --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { z } from 'zod'; +import { MessageSocketRepositoryService } from '../../../data/repository/message/message-live-signalr-data-source.service'; +import { XTracerAsync, TracingType } from 'src/app/services/monitoring/opentelemetry/tracer'; + +export const MessageDeleteInputDTOSchema = z.object({ + requestId: z.string().optional(), + roomId: z.string(), + messageId: z.string(), + senderId: z.number(), +}); +export type MessageDeleteInputDTO = z.infer + + +@Injectable({ + providedIn: 'root' +}) +export class MessageDeleteLiveUseCaseService { + constructor( + public repository: MessageSocketRepositoryService + ) { } + + @XTracerAsync({name:'MessageDeleteLiveUseCaseService', module:'chat', bugPrint: true, waitNThrow: 5000}) + async execute(data: MessageDeleteInputDTO, tracing?: TracingType) { + tracing.log('MessageDeleteLiveUseCaseService payload', { + data: data + }) + return this.repository.sendMessageDelete(data) + } +} diff --git a/src/app/module/chat/domain/use-case/message/message-download-attachment-user-case.service.ts b/src/app/module/chat/domain/use-case/message/message-download-attachment-user-case.service.ts new file mode 100644 index 000000000..df5a81c9a --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/message-download-attachment-user-case.service.ts @@ -0,0 +1,68 @@ +import { Injectable } from '@angular/core'; +import { AttachmentRemoteDataSourceService } from 'src/app/module/chat/data/repository/attachment/attachment-remote-repository.service' +import { Logger } from 'src/app/services/logger/main/service'; +import { convertBlobToDataURL, createBlobUrl } from 'src/app/utils/ToBase64'; +import { AttachmentLocalDataSource } from 'src/app/module/chat/data/repository/attachment/attachment-local-repository.service' +import { z } from 'zod'; +import { zodSafeValidation } from 'src/app/utils/zodValidation'; +import { IMessage, MessageEntitySchema } from 'src/app/core/chat/entity/message'; + +const DownloadMessageAttachmentByMessageIdSchema = z.object({ + $messageId: z.string(), + id: z.string() +}) + +export type DownloadMessageAttachmentByMessageId = z.infer + + +@Injectable({ + providedIn: 'root' +}) +export class DownloadMessageAttachmentUserCaseService { + + constructor( + private AttachmentRemoteDataSourceService: AttachmentRemoteDataSourceService, + private AttachmentLocalDataSource: AttachmentLocalDataSource + ) { } + + async execute(input: DownloadMessageAttachmentByMessageId) { + + const validation = zodSafeValidation(DownloadMessageAttachmentByMessageIdSchema, input) + + if(validation.isOk()) { + + const result = await this.AttachmentRemoteDataSourceService.getAttachment(input.id) + return result.asyncMap(async (blob) => { + + const dataUrl = await createBlobUrl(blob) + + if(dataUrl.isOk()) { + + Logger.info('downloaded file #1', { + // data: dataUrl.slice(0, 100)+'...', + context: 'DownloadMessageAttachmentUserCaseService' + }) + + this.AttachmentLocalDataSource.insert({ + $messageId: input.$messageId, + id: input.id, + file: blob, + }) + + return dataUrl.value + } else { + + } + }) + } else { + + Logger.error('failed to download message doe to invalid attachment', { + zodErrorList: validation.error.errors, + data: input + }) + + return validation + } + + } +} diff --git a/src/app/module/chat/domain/use-case/message/message-get-attachment-localy-use-case.service.ts b/src/app/module/chat/domain/use-case/message/message-get-attachment-localy-use-case.service.ts new file mode 100644 index 000000000..e16555e1f --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/message-get-attachment-localy-use-case.service.ts @@ -0,0 +1,46 @@ +import { Injectable } from '@angular/core'; +import { MessageAttachmentByMessageIdInput } from './message-attachment-by-message-id.service'; +import { AttachmentRemoteDataSourceService } from 'src/app/module/chat/data/repository/attachment/attachment-remote-repository.service' +import { AttachmentLocalDataSource } from 'src/app/module/chat/data/repository/attachment/attachment-local-repository.service' +import { err, Result } from 'neverthrow'; +import { AttachmentTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/attachment'; +import { z } from 'zod'; +import { createBlobUrl } from 'src/app/utils/ToBase64'; + +const GetMessageAttachmentLocallyByMessageIdSchema = AttachmentTableSchema.pick({ + $messageId: true +}) + +export type GetMessageAttachmentLocallyByMessageId = z.infer + + + +@Injectable({ + providedIn: 'root' +}) +export class GetMessageAttachmentLocallyUseCaseService { + + constructor( + private AttachmentRemoteDataSourceService: AttachmentRemoteDataSourceService, + private AttachmentLocalDataSource: AttachmentLocalDataSource + ) { } + + + async execute(input: GetMessageAttachmentLocallyByMessageId): Promise> { + + const getLocalAttachment = await this.AttachmentLocalDataSource.findOne({ + $messageId: input.$messageId + }) + + if(getLocalAttachment.isOk()) { + if(getLocalAttachment.value) { + const dataUrl = await createBlobUrl(getLocalAttachment.value.file) + + return dataUrl + } + } else { + return err(getLocalAttachment.error) + } + } + +} diff --git a/src/app/module/chat/domain/use-case/message/message-mark-all-message-as-read-by-room-id.service.ts b/src/app/module/chat/domain/use-case/message/message-mark-all-message-as-read-by-room-id.service.ts new file mode 100644 index 000000000..d851ba046 --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/message-mark-all-message-as-read-by-room-id.service.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@angular/core'; +import { z } from 'zod'; +import { MessageLocalDataSourceService } from 'src/app/module/chat/data/repository/message/message-local-data-source.service' +import { MessageSocketRepositoryService } from 'src/app/module/chat/data/repository/message/message-live-signalr-data-source.service' +import { SessionStore } from 'src/app/store/session.service'; + +const MessageMarkAllMessageAsReadByRoomIdInputSchema = z.object({ + roomId: z.string(), +}) + +export type MessageMarkAllMessageAsReadByRoomIdInputSchema = z.infer + + +/** + * @description avoid using it, avoid duplicate query. do it on the UI layer as the component load the message. + */ +@Injectable({ + providedIn: 'root' +}) +export class MessageMarkAllMessageAsReadByRoomIdService { + + constructor( + private MessageLocalDataSourceService: MessageLocalDataSourceService, + private MessageSocketRepositoryService: MessageSocketRepositoryService + ) { } + + + async execute(input: MessageMarkAllMessageAsReadByRoomIdInputSchema) { + const messages = await this.MessageLocalDataSourceService.find({roomId:input.roomId}) + + if(messages.isOk()) { + for(const message of messages.value) { + this.MessageSocketRepositoryService.sendReadAt({ + memberId: SessionStore.user.UserId, + messageId: message.id, + roomId: input.roomId, + requestId: 'uuid' + }); + } + } + + } +} diff --git a/src/app/module/chat/domain/use-case/message/message-mark-as-read-use-case.service.ts b/src/app/module/chat/domain/use-case/message/message-mark-as-read-use-case.service.ts new file mode 100644 index 000000000..99084bf82 --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/message-mark-as-read-use-case.service.ts @@ -0,0 +1,37 @@ +import { Injectable } from '@angular/core'; +import { MessageSocketRepositoryService } from '../../../data/repository/message/message-live-signalr-data-source.service'; +import { XTracerAsync, TracingType } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { z } from 'zod'; + +export const MessageMarkAsReadInputSchema = z.object({ + memberId: z.number(), + messageId: z.string(), + roomId: z.string(), + requestId: z.string() +}) + +export type MessageMarkAsReadInput = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class MessageMarkAsReadUseCaseService { + + constructor( + private MessageSocketRepositoryService: MessageSocketRepositoryService, + ) { } + + + @XTracerAsync({name:'MessageMarkAsReadUseCaseService', module:'chat', bugPrint: true}) + async execute(sendReadAt: MessageMarkAsReadInput, tracing?: TracingType) { + const result = await this.MessageSocketRepositoryService.sendReadAt(sendReadAt as any) + + if(result.isErr()) { + tracing.setAttribute('meesageId', sendReadAt.messageId) + tracing.hasError('failed to read message') + } + + return result + + } +} diff --git a/src/app/module/chat/domain/use-case/message/message-reaction-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/message/message-reaction-by-id-use-case.service.ts new file mode 100644 index 000000000..cf77e7559 --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/message-reaction-by-id-use-case.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; +import { object, z } from 'zod'; +import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; +import { MessageRemoteDataSourceService } from '../../../data/repository/message/message-remote-data-source.service'; +import { MessageSocketRepositoryService } from '../../../data/repository/message/message-live-signalr-data-source.service'; + + +const MessageReactionInputDTOSchema = z.object({ + memberId: z.number(), + messageId: z.string(), + roomId: z.string(), + reaction: z.string(), + requestId: z.string().optional() +}) + +export type MessageReactionInput = z.infer< typeof MessageReactionInputDTOSchema> + +@Injectable({ + providedIn: 'root' +}) +export class MessageReactionUseCaseService { + + constructor( + public repository: MessageSocketRepositoryService + ) { } + + @ValidateSchema(MessageReactionInputDTOSchema) + execute(input: MessageReactionInput) { + return this.repository.reactToMessageSocket(input) + } +} diff --git a/src/app/module/chat/domain/use-case/message/message-update-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/message/message-update-by-id-use-case.service.ts new file mode 100644 index 000000000..452a9cdaa --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/message-update-by-id-use-case.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@angular/core'; +import { z } from 'zod'; +import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; +import { MessageRemoteDataSourceService } from '../../../data/repository/message/message-remote-data-source.service'; +import { MessageSocketRepositoryService } from '../../../data/repository/message/message-live-signalr-data-source.service'; + + +const MessageUpdateInputDTOSchema = z.object({ + memberId: z.number(), + messageId: z.string(), + roomId: z.string(), + message: z.string().optional().nullable(), + requestId: z.string().optional() +}) + +export type MessageUpdateInput = z.infer< typeof MessageUpdateInputDTOSchema> + + +@Injectable({ + providedIn: 'root' +}) +export class MessageUpdateUseCaseService { + + constructor( + public repository: MessageSocketRepositoryService + ) { } + + @ValidateSchema(MessageUpdateInputDTOSchema) + execute(input: MessageUpdateInput) { + return this.repository.updateMessage(input); + } + +} diff --git a/src/app/module/chat/domain/use-case/message/messages-send-offline-use-case.service.ts b/src/app/module/chat/domain/use-case/message/messages-send-offline-use-case.service.ts new file mode 100644 index 000000000..ebf9a24b0 --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/messages-send-offline-use-case.service.ts @@ -0,0 +1,120 @@ +import { Injectable } from '@angular/core'; +import { MessageLocalDataSourceService } from '../../../data/repository/message/message-local-data-source.service'; +import { MessageSocketRepositoryService } from '../../../data/repository/message/message-live-signalr-data-source.service'; +import { InstanceId } from '../../chat-service.service'; +import { MessageMapper } from '../../mapper/messageMapper'; +import { v4 as uuidv4 } from 'uuid' +import { AttachmentLocalDataSource } from '../../../data/repository/attachment/attachment-local-repository.service'; +import { RoomLocalRepository } from '../../../data/repository/room/room-local-repository.service'; +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member/member-list-local-repository.service' +import { Result } from 'neverthrow'; +import { RoomType } from 'src/app/core/chat/entity/group'; +import { SessionStore } from 'src/app/store/session.service'; +import { MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; +import { MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; + +@Injectable({ + providedIn: 'root' +}) +export class SendLocalMessagesUseCaseService { + + constructor( + private MessageSocketRepositoryService: MessageSocketRepositoryService, + private messageLocalDataSourceService: MessageLocalDataSourceService, + private AttachmentRepositoryService: AttachmentLocalDataSource, + private roomLocalDataSourceService: RoomLocalRepository, + private MemberListLocalRepository: MemberListLocalRepository, + private messageSocketRepositoryService: MessageSocketRepositoryService, + ) { } + + async execute() { + + const allRooms = await this.roomLocalDataSourceService.findAll() + const messages = await this.messageLocalDataSourceService.getOfflineMessages() + + if(allRooms.isOk()) { + if(allRooms.value.length == 0) { + + } else { + + for(const message of messages) { + const room = allRooms.value.find(e => e.id == message.roomId) + + if(room) { + + const attachments = await this.AttachmentRepositoryService.find({$messageId: message.$id}) + + if(attachments.isOk()) { + + message.attachments = attachments.value.map(e => ({ + fileType: e.fileType, + source: e.source, + fileName: e.fileName, + applicationId: e.applicationId, + docId: e.docId, + id: e.id, + mimeType: e.mimeType, + description: e.description, + file: e.base64.split(',')[1] + })) + console.log('to upload', messages) + const requestId = InstanceId +'@'+ uuidv4(); + + await this.messageLocalDataSourceService.update(message.$id, { sending: true }) + + let sendMessageResult: Result + if(room.roomType == RoomType.Group) { + const DTO = MessageMapper.fromDomain(message, message.requestId) + sendMessageResult = await this.MessageSocketRepositoryService.sendGroupMessage(DTO) + } else { + + if(message.receiverId) { + const DTO = MessageMapper.fromDomain(message, message.requestId) + sendMessageResult = await this.messageSocketRepositoryService.sendDirectMessage(DTO) + } else { + const getRoomMembers = await this.MemberListLocalRepository.directMember({ + roomId:message.roomId, + currentUserId: SessionStore.user.UserId + }) + if(getRoomMembers.isOk() && getRoomMembers.value) { + message.receiverId = getRoomMembers.value.wxUserId + const DTO = MessageMapper.fromDomain(message, message.requestId) + sendMessageResult = await this.messageSocketRepositoryService.sendGroupMessage(DTO) + } else { + console.error('direct users not found', getRoomMembers) + } + } + + } + + if(sendMessageResult?.isOk()) { + + if(sendMessageResult.value.sender == undefined || sendMessageResult.value.sender == null) { + + delete sendMessageResult.value.sender + } + + let clone: MessageTable = { + ...sendMessageResult.value, + id: sendMessageResult.value.id, + $id : message.$id + } + + clone.sending = false + console.log({clone}) + console.log('send message local '+ messages.length) + + this.messageLocalDataSourceService.update(message.$id, {id: sendMessageResult.value.id, sending: false}) + } else { + this.messageLocalDataSourceService.update(message.$id, {sending: false}) + } + } + } + + } + } + + } + } + +} diff --git a/src/app/module/chat/domain/use-case/message/sync-all-room-messages.service.ts b/src/app/module/chat/domain/use-case/message/sync-all-room-messages.service.ts new file mode 100644 index 000000000..33b216395 --- /dev/null +++ b/src/app/module/chat/domain/use-case/message/sync-all-room-messages.service.ts @@ -0,0 +1,91 @@ +import { Injectable } from '@angular/core'; +import { MessageLocalDataSourceService } from '../../../data/repository/message/message-local-data-source.service'; +import { messageListDetermineChanges } from '../../../data/async/list/rooms/messageListChangedetector'; +import { MessageRemoteDataSourceService } from '../../../data/repository/message/message-remote-data-source.service'; +import { MessageSocketRepositoryService } from '../../../data/repository/message/message-live-signalr-data-source.service'; +import { ok } from 'neverthrow'; +import { RoomLocalRepository } from '../../../data/repository/room/room-local-repository.service'; +import { Logger } from 'src/app/services/logger/main/service'; +import { XTracerAsync, TracingType } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; + +@Injectable({ + providedIn: 'root' +}) +export class SyncAllRoomMessagesService { + + constructor( + private messageLocalDataSourceService: MessageLocalDataSourceService, + private messageRemoteDataSourceService: MessageRemoteDataSourceService, + private MessageSocketRepositoryService: MessageSocketRepositoryService, + private roomLocalDataSourceService: RoomLocalRepository, + ) { } + + @XTracerAsync({name:'SyncAllRoomMessagesService', module:'chat', bugPrint: true}) + async execute(tracing?: TracingType) { + + const allRooms = await this.roomLocalDataSourceService.findAll() + + if(allRooms.isOk()) { + if(allRooms.value.length == 0) { + tracing.addEvent('no need to sync') + } else { + tracing.addEvent('total sync '+ allRooms.value.length) + } + + let n =0 + const roomPromises = allRooms.value.map(async (room) => { + const [result, localResult] = await Promise.all([ + this.messageRemoteDataSourceService.getMessagesFromRoom(room.id), + this.messageLocalDataSourceService.getItems(room.id) + ]); + + tracing.addEvent('async n ' + n); + n++; + + if (result.isOk()) { + const { addedItems, changedItems, deletedItems } = messageListDetermineChanges(result.value.data, localResult); + + for (const message of changedItems) { + delete message.sentAt + let clone: MessageTable = { ...message, roomId: room.id }; + this.messageLocalDataSourceService.update(clone.$id, clone); + + // const me = message.info.find(e => e.memberId === SessionStore.user.UserId && typeof e.deliverAt === 'string'); + + // if (!me) { + // this.MessageSocketRepositoryService.sendDeliverAt({ + // memberId: SessionStore.user.UserId, + // messageId: message.id, + // roomId: message.roomId, + // requestId: uuidv4() + // }); + + // tracing.addEvent('send deliver roomId ' + room.id); + // } + } + + for (const message of addedItems) { + let clone: MessageTable = { ...message, roomId: room.id }; + // You can perform operations with addedItems here if needed + } + + this.messageLocalDataSourceService.insertMany(addedItems.reverse().map(e => { + e.origin = 'history' + return e + })); + } else { + Logger.error('failed to get room message ' + room.id); + } + }); + + // Wait for all the promises to resolve + await Promise.all(roomPromises); + + return ok(true) + } else { + console.log('sync all error', allRooms) + } + + } +} diff --git a/src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service.ts new file mode 100644 index 000000000..69cebc7fa --- /dev/null +++ b/src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service.ts @@ -0,0 +1,105 @@ +import { Injectable } from '@angular/core'; +import { filter, map } from 'rxjs/operators'; +import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; +import { MessageEntity } from 'src/app/core/chat/entity/message'; +import { IBoldLocalRepository } from 'src/app/core/chat/repository/bold/bold-local-repository'; +import { IMessageLocalRepository } from 'src/app/core/chat/repository/message/message-local-repository'; +import { InstanceId } from '../../chat-service.service'; +import { HttpAdapter } from 'src/app/infra/http/adapter'; +import { SessionStore } from 'src/app/store/session.service'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; + + +@Injectable({ + providedIn: 'root' +}) +export class RoomBoldSyncUseCaseService { + + constructor( + private MessageSocketRepositoryService: IMessageSocketRepository, + private boldLocalRepository: IBoldLocalRepository, + private http: HttpAdapter, + private messageLocalRepository: IMessageLocalRepository, + private roomLocalDataSourceService: IRoomLocalRepository, + ) { + this.listenToIncomingMessage(); + // this.loadHistory() + this.onInsertToDB() + this.listenToUpdateMessages(); + } + + private listenToIncomingMessage() { + return this.MessageSocketRepositoryService.listenToMessages().pipe( + filter((message) => !message?.requestId?.startsWith(InstanceId)), + map(message => Object.assign(new MessageEntity(), message)), + filter((message) => !message.meSender()) + ).subscribe(async (message) => { + + const result = await this.boldLocalRepository.findOne({roomId: message.roomId}) + + if(result.isOk() && !result.value) { + const result = await this.boldLocalRepository.insert({roomId: message.roomId, bold: 1}) + } else if(result.isOk() && result.value.bold == 0) { + const result = await this.boldLocalRepository.update(message.roomId, {bold: 1}) + } + + }); + } + + private listenToUpdateMessages() { + return this.MessageSocketRepositoryService.listenToUpdateMessages().pipe( + filter((message) => !message?.requestId?.startsWith(InstanceId)), + map(message => Object.assign(new MessageEntity(), message)) + ).subscribe(async (message) => { + + const haveSeen = MessageEntity.haveSeen(message.info) + + if(haveSeen) { + + const result = await this.boldLocalRepository.findOne({roomId: message.roomId}) + + if(result.isOk() && result.value?.bold == 1) { + const lastMessage = await this.roomLocalDataSourceService.findOne({id: message.roomId}) + if(lastMessage.isOk()) { + if(lastMessage.value.messages[0].id == message.id) { + const result = await this.boldLocalRepository.update(message.roomId, {bold: 0}) + } + } + + } + } + + }); + } + + + @XTracerAsync({name:'RoomBoldSyncUseCaseService/onInsertToDB', module:'chat', bugPrint: true}) + private onInsertToDB(tracing?: TracingType) { + + let delay = 2000 + this.messageLocalRepository.onCreateObservable().pipe( + filter(e => e?.origin == 'history'), + filter(e => e.sender.wxUserId != SessionStore.user.UserId), + ).subscribe(async (newMessage)=> { + + setTimeout(async ()=> { + const haveSeen = MessageEntity.haveSeen(newMessage.info) + if(!haveSeen) { + await this.boldLocalRepository.open() + const result = await this.boldLocalRepository.findOne({roomId: newMessage.roomId}) + + if(result.isOk() && !result.value?.bold) { + const result = await this.boldLocalRepository.insert({roomId: newMessage.roomId, bold: 1}) + } else if(result.isOk() && result.value.bold == 0) { + const result = await this.boldLocalRepository.update(newMessage.roomId, {bold: 1}) + } else { + // tracing.hasError("failed to set bold",{}) + } + } + + }, delay); + delay = 0 + }) + } +} diff --git a/src/app/module/chat/domain/use-case/room/room-create-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-create-use-case.service.ts new file mode 100644 index 000000000..7094bcc03 --- /dev/null +++ b/src/app/module/chat/domain/use-case/room/room-create-use-case.service.ts @@ -0,0 +1,63 @@ +import { Injectable } from '@angular/core'; +import { SessionStore } from 'src/app/store/session.service'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { z } from "zod"; +import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-remote-repository'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; +import { IRoomSocketRepository } from 'src/app/core/chat/repository/room/room-socket-repository'; + +export const CreateRoomInputDTOSchema = z.object({ + roomName: z.string(), + createdBy: z.number(), + roomType: z.number(), + expirationDate: z.string().nullable().optional(), + members: z.array(z.number()) +}); +export type CreateRoomInputDTO = z.infer + + +export const RoomOutPutDTOSchema = z.object({ + success: z.boolean(), + message: z.string(), + data: z.object({ + id: z.string(), + roomName: z.string(), + createdBy: z.any().nullable(), + createdAt: z.string(), + expirationDate: z.string().nullable(), + roomType: z.any() + }) +}); +export type RoomOutPutDTO = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class CreateRoomUseCaseService { + + constructor( + private roomRemoteDataSourceService: IRoomRemoteRepository, + private roomLocalDataSourceService: IRoomLocalRepository, + private RoomSocketRepositoryService: IRoomSocketRepository + ) { } + + @XTracerAsync({name:'room-create-use-case.service', module:'chat', bugPrint: true, waitNThrow: 5000}) + async execute(data: CreateRoomInputDTO, tracing?: TracingType) { + + const result = await this.RoomSocketRepositoryService.CreateGroup(data) + + console.log('history', result) + // const result = await this.roomRemoteDataSourceService.createRoom(data) + + if(result.isOk()) { + + return result + } else { + tracing.hasError("socket close"); + console.log(result.error) + } + + return result + } + +} diff --git a/src/app/module/chat/domain/use-case/room/room-delete-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-delete-by-id-use-case.service.ts new file mode 100644 index 000000000..ae1250d8f --- /dev/null +++ b/src/app/module/chat/domain/use-case/room/room-delete-by-id-use-case.service.ts @@ -0,0 +1,46 @@ +import { Injectable } from '@angular/core'; +import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; +import { z } from "zod"; +import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-remote-repository'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; +import { isHttpResponse } from 'src/app/infra/http/http.service'; + +export const DeleteRoomByIdInputDTOSchema = z.string() +export type DeleteRoomByIdInputDTO = z.infer + + +@Injectable({ + providedIn: 'root' +}) +export class DeleteRoomUseCaseService { + + constructor( + private roomRemoteDataSourceService: IRoomRemoteRepository, + // private roomMemoryDataSourceService: Store, + private roomLocalDataSourceService: IRoomLocalRepository, + ) { } + + + @captureAndReraiseAsync('RoomRepositoryService/deleteRoomById') + async execute(id: DeleteRoomByIdInputDTO) { + const result = await this.roomRemoteDataSourceService.deleteRoom(id) + + if(result.isOk()) { + + const result = await this.roomLocalDataSourceService.delete(id) + // this.messageLiveDataSourceService.sendMessage({ + // type: 'createRoom', + // payload: {a: '5'} + // }) + + return result + } else if (isHttpResponse(result.error)) { + if(result.error.status == 404) { + await this.roomLocalDataSourceService.delete(id) + } + // this.httpErrorHandle.httpStatusHandle(result.error) + } + + return result + } +} diff --git a/src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service.ts new file mode 100644 index 000000000..82b576604 --- /dev/null +++ b/src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service.ts @@ -0,0 +1,112 @@ +import { Injectable } from '@angular/core'; +import { isHttpResponse } from 'src/app/infra/http/http.service'; +import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; +import { z } from 'zod'; +import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-remote-repository'; +import { IMemberLocalRepository } from 'src/app/core/chat/repository/member/member-local-repository'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; +import { GetRoomByIdMapper } from 'src/app/core/chat/mapper/getRoomByIdMapper'; +import { RoomEntity, RoomType } from 'src/app/core/chat/entity/group'; +import { diff, addedDiff, deletedDiff, updatedDiff, detailedDiff } from 'deep-object-diff'; +import { zodSafeValidation } from 'src/app/utils/zodValidation'; + +const UserSchema = z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().nullable(), +}); + +const MemberSchema = z.object({ + id: z.string(), + user: UserSchema, + joinAt: z.string(), + isAdmin: z.boolean() +}); + +export const RoomByIdOutputDTOSchema = z.object({ + success: z.boolean(), + message: z.string(), + data: z.object({ + id: z.string(), + roomName: z.string(), + createdBy: UserSchema, + createdAt: z.string(), + expirationDate: z.string().nullable(), + roomType: z.number(), + members: z.array(MemberSchema), + }), +}) + +export type RoomByIdMemberItemOutputDTO = z.infer +export type RoomByIdOutputDTO = z.infer + + + +export const RoomByIdInputDTOSchema = z.string() +export type RoomByIdInputDTO = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class GetRoomByIdUseCaseService { + + constructor( + private roomRemoteDataSourceService: IRoomRemoteRepository, + private roomLocalDataSourceService: IRoomLocalRepository, + private MemberListLocalRepository: IMemberLocalRepository + ) { } + + @captureAndReraiseAsync('RoomRepositoryService/getRoomById') + async execute(id: RoomByIdInputDTO) { + const result = await this.roomRemoteDataSourceService.getRoom(id) + + if(result.isOk()) { + const validData = zodSafeValidation(RoomByIdOutputDTOSchema, result.value) + + if(validData.isOk()) { + const localListRoom = await this.roomLocalDataSourceService.findAll() + if(localListRoom.isOk()) { + + const getRoomById = await this.roomLocalDataSourceService.findOne({id:validData.value.data.id}) + if(getRoomById.isOk() && getRoomById.value) { + const room = GetRoomByIdMapper.toDomain(validData.value) + + const added: Partial = addedDiff(getRoomById.value, room); + const deleted: Partial = deletedDiff(getRoomById.value, room); + const updated: Partial = updatedDiff(getRoomById.value, room); + + delete added.members + if(room.roomType == RoomType.Direct) { + delete updated.roomName + } + + if(Object.keys(added).length >= 1 || Object.keys(updated).length >= 1) { + console.log('added', added); + console.log('deleted', deleted); + console.log('updated', updated); + this.roomLocalDataSourceService.update(room.id, room) + } + + } else if (getRoomById.isOk() && !getRoomById.value) { + const room = GetRoomByIdMapper.toDomain(validData.value) + this.roomLocalDataSourceService.insert(room) + } + + } + } else { + + } + + + + } else if (isHttpResponse(result.error) ) { + if(result.error.status == 404) { + await this.roomLocalDataSourceService.delete(id) + } + // this.httpErrorHandle.httpStatusHandle(result.error) + } + + return result + } +} diff --git a/src/app/module/chat/domain/use-case/room/room-get-list-on-create-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-get-list-on-create-use-case.service.ts new file mode 100644 index 000000000..c9088fd0f --- /dev/null +++ b/src/app/module/chat/domain/use-case/room/room-get-list-on-create-use-case.service.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@angular/core'; +import { GetRoomListUseCaseService } from './room-get-list-use-case.service' +import { RoomSocketRepositoryService } from '../../../data/repository/room/room-socket-repository.service' + +@Injectable({ + providedIn: 'root' +}) +export class RoomGetListOnCreateUseCaseService { + + constructor( + private RoomSocketRepositoryService: RoomSocketRepositoryService, + private getRoomListUseCaseService: GetRoomListUseCaseService + ) { + this.init() + } + + + private init() { + this.OnReceiveCreateRoom() + this.OnDeleteCreateRoom() + } + + + private OnReceiveCreateRoom() { + this.RoomSocketRepositoryService.listenToCreateRoom().subscribe((data)=> { + console.log('OnReceiveCreateRoom', data) + this.getRoomListUseCaseService.execute() + }) + } + + private OnDeleteCreateRoom() { + this.RoomSocketRepositoryService.listenToDeleteRoom().subscribe((data)=> { + console.log('OnDeleteCreateRoom7', data) + }) + } +} diff --git a/src/app/module/chat/domain/use-case/room/room-get-list-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-get-list-use-case.service.ts new file mode 100644 index 000000000..9a57bdfee --- /dev/null +++ b/src/app/module/chat/domain/use-case/room/room-get-list-use-case.service.ts @@ -0,0 +1,91 @@ +import { Injectable } from '@angular/core'; +import { roomListDetermineChanges } from '../../../data/async/list/rooms/roomListChangeDetector'; +import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; +import { CronJobService } from 'src/app/utils/task-scheduler' +import { z } from "zod"; +import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-remote-repository'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; +import { MessageEntitySchema } from 'src/app/core/chat/entity/message'; +import { GetRoomListMapper } from 'src/app/core/chat/mapper/getRoomListMapper'; + + +const CreatedBySchema = z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string().email(), + userPhoto: z.string().nullable()// api check +}); + +const RoomListItemOutPutDTOSchema = z.object({ + chatRoom: z.object({ + id: z.string(), + roomName: z.string(), + createdBy: CreatedBySchema, + createdAt: z.string(), + expirationDate: z.string().nullable(), // api check + roomType: z.number(), + messages: MessageEntitySchema.array(), + user1: CreatedBySchema.nullable(), + user2: CreatedBySchema.nullable() + }), + joinAt: z.string() +}) + + +// Define the schema for the entire response +export const RoomListOutPutDTOSchema = z.object({ + success: z.boolean(), + message: z.string(), + data: z.array(RoomListItemOutPutDTOSchema), +}); + +export type RoomListItemOutPutDTO = z.infer + +export type RoomListOutPutDTO = z.infer + + +@Injectable({ + providedIn: 'root' +}) +export class GetRoomListUseCaseService { + + constructor( + private roomRemoteDataSourceService: IRoomRemoteRepository, + private roomLocalDataSourceService: IRoomLocalRepository, + private CronJobService: CronJobService + ) { } + + @captureAndReraiseAsync('RoomRepositoryService/list') + async execute() { + const result = await this.roomRemoteDataSourceService.getRoomList() + + const localList = await this.roomLocalDataSourceService.findAll() + + if(localList.isOk()) { + if(result.isOk()) { + + const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges(result.value.data, localList.value) + + if(roomsToInsert) { + const roomsToInsertEntity = GetRoomListMapper.toDomain(roomsToInsert) + for( const room of roomsToInsertEntity) { + this.roomLocalDataSourceService.insert(room) + if(room.expirationDate) { + this.CronJobService.createCronJob('remove expired room', new Date(room.expirationDate), this.execute) + } + } + } + + const roomsToUpdateEntity = GetRoomListMapper.toDomain(roomsToUpdate) + this.roomLocalDataSourceService.updateMany(roomsToUpdateEntity) + + for( const room of roomsToDelete) { + this.roomLocalDataSourceService.delete(room.id) + } + + } + } + return result + } + +} diff --git a/src/app/module/chat/domain/use-case/room/room-leave-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-leave-by-id-use-case.service.ts new file mode 100644 index 000000000..0ca341b28 --- /dev/null +++ b/src/app/module/chat/domain/use-case/room/room-leave-by-id-use-case.service.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@angular/core'; +import { z } from "zod"; +import { IMemberRemoteRepository } from 'src/app/core/chat/repository/member/member-remote-repository'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; +import { isHttpResponse } from 'src/app/infra/http/http.service'; + +// Define the schema for the entire response +export const UserRemoveListInputDTOSchema = z.object({ + id: z.string(), + members: z.array(z.number()) +}); + +export type UserRemoveListInputDTO = z.infer + + +@Injectable({ + providedIn: 'root' +}) +export class RoomLeaveUseCase { + + constructor( + private memberRemoteDataSourceService: IMemberRemoteRepository, + private roomLocalDataSourceService: IRoomLocalRepository, + ) { } + + + + async execute(data: UserRemoveListInputDTO) { + const result = await this.memberRemoteDataSourceService.removeMemberFromRoom(data) + + if(result.isOk()) { + this.roomLocalDataSourceService.delete(data.id) + } else if (isHttpResponse(result.error)) { + if(result.error.status == 404) { + await this.roomLocalDataSourceService.delete(data.id) + + } + // this.httpErrorHandle.httpStatusHandle(result.error) + } + + return result + } +} diff --git a/src/app/module/chat/domain/use-case/room/room-set-last-message.service.ts b/src/app/module/chat/domain/use-case/room/room-set-last-message.service.ts new file mode 100644 index 000000000..d9f253ce3 --- /dev/null +++ b/src/app/module/chat/domain/use-case/room/room-set-last-message.service.ts @@ -0,0 +1,152 @@ +import { Injectable } from '@angular/core'; +import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; +import { filter, map, tap } from 'rxjs/operators'; +import { MessageEntity } from 'src/app/core/chat/entity/message'; +import { HttpAdapter } from 'src/app/infra/http/adapter'; +import { IMessageGetAllByRoomIdOutPut } from 'src/app/core/chat/usecase/message/message-get-all-by-room-Id'; +import { RoomEntity } from 'src/app/core/chat/entity/group'; +import { RoomTable } from 'src/app/infra/database/dexie/instance/chat/schema/room'; +import { IMessageLocalRepository } from 'src/app/core/chat/repository/message/message-local-repository'; + +@Injectable({ + providedIn: 'root' +}) +export class RoomSetLastMessageService { + + constructor( + private roomLocalRepository: IRoomLocalRepository, + private messageSocketRepository: IMessageSocketRepository, + private messageLocalRepository: IMessageLocalRepository, + private http: HttpAdapter, + ) { + this.listenToIncomingMessage() + this.listenToOnSendDataToSocket() + this.loadHistory() + this.listenToUpdateMessage() + } + + private listenToUpdateMessage() { + let roomList: RoomTable[] = [] + this.roomLocalRepository.getItemsLive().pipe( + tap((_roomList) => { + + roomList = _roomList + + }) + ).subscribe(); + + this.messageSocketRepository.listenToUpdateMessages().subscribe(async(_message) => { + const message = {..._message} + + for(const room of roomList) { + if(room.messages?.[0]?.id == message.id) { + console.log('listenToUpdateMessage', message.roomId) + const result = await this.roomLocalRepository.update(message.roomId, { + messages: [message] + }) + } + } + }) + + this.messageSocketRepository.listenToDeleteMessages().subscribe(async(_message) => { + const message = {..._message} + + for(const room of roomList) { + if(room.messages?.[0]?.id == message.id) { + console.log({...room.messages?.[0],isDeleted: true}) + const result = await this.roomLocalRepository.update(message.roomId, { + messages: [{...room.messages?.[0],isDeleted: true}] + }) + } + } + }) + } + + private listenToIncomingMessage() { + return this.messageSocketRepository.listenToMessages().pipe( + map(message => Object.assign(new MessageEntity(), message)) + ).subscribe(async (message) => { + if(message?.roomId) { + console.log('listenToIncomingMessage', message.roomId) + const result = await this.roomLocalRepository.update(message.roomId, { + messages: [message] + }) + + if(result.isErr()) { + console.log('failed to update last message') + } else { + console.log('set last message') + } + } + + + }); + + } + + private listenToOnSendDataToSocket() { + this.messageLocalRepository.onCreateObservable().subscribe(async (message) => { + if(message?.roomId) { + + setTimeout(async() => { + if(message.origin != 'history') { + const result = await this.roomLocalRepository.update(message.roomId, { + messages: [message] + }) + } + }, 100) + } + + }) + } + + private loadHistory() { + const regex = new RegExp("Room\\/([0-9a-fA-F]{8})-([0-9a-fA-F]{4})-([0-9a-fA-F]{4})-([0-9a-fA-F]{4})-([0-9a-fA-F]{12})\\/Messages"); + + return this.http.listen().pipe( + filter((response: any)=> { + return response?.isOk() && regex.test(response.value.url) && response.value.url.endsWith('/Messages') + }), + map((response: any) => response.value.data as IMessageGetAllByRoomIdOutPut) + ).subscribe(async (data)=> { + const loadHistoryFirstMessage = data.data[0] + if(loadHistoryFirstMessage) { + + const roomId = loadHistoryFirstMessage.roomId + + const room = await this.roomLocalRepository.findOne({id: roomId}) + + if(room.isOk()) { + const roomEntity = new RoomEntity(room.value) + if(!roomEntity.hasLastMessage()) { + await this.roomLocalRepository.update(loadHistoryFirstMessage.roomId, { + messages: [loadHistoryFirstMessage] + }) + } else if (roomEntity.hasLastMessage()) { + const localLastMessageDate = new Date(room.value.messages[0].sentAt).getTime() + const loadHistoryLastMessageDate = new Date(loadHistoryFirstMessage.sentAt).getTime() + + if(loadHistoryFirstMessage.id == room.value.messages?.[0]?.id) { + // do nothing + } else if(loadHistoryLastMessageDate>localLastMessageDate) { + await this.roomLocalRepository.update(loadHistoryFirstMessage.roomId, { + messages: [loadHistoryFirstMessage] + }) + } else if(loadHistoryLastMessageDate == localLastMessageDate) { + // do nothing + } else if(room.value.messages[0].isDeleted != loadHistoryFirstMessage.isDeleted) { + await this.roomLocalRepository.update(loadHistoryFirstMessage.roomId, { + messages: [loadHistoryFirstMessage] + }) + } + + } + + } + + } + }) + } + +} diff --git a/src/app/module/chat/domain/use-case/room/room-update-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-update-by-id-use-case.service.ts new file mode 100644 index 000000000..552c86a9e --- /dev/null +++ b/src/app/module/chat/domain/use-case/room/room-update-by-id-use-case.service.ts @@ -0,0 +1,77 @@ +import { Injectable } from '@angular/core'; +import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; +import { z } from "zod"; +import { DataSourceReturn } from 'src/app/services/Repositorys/type'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; +import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-remote-repository'; + +export const RoomUpdateInputDTOSchema = z.object({ + roomName: z.string(), + roomId: z.string(), + roomType: z.number(), +}); +export type RoomUpdateInputDTO = z.infer + + + +const UserSchema = z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().nullable(), +}); +const MemberSchema = z.object({ + id: z.string(), + user: UserSchema, + joinAt: z.string(), +}); + +export const RoomUpdateOutputDTOSchema = z.object({ + success: z.boolean(), + message: z.string(), + data: z.object({ + id: z.string(), + roomName: z.string(), + createdBy: UserSchema, + createdAt: z.string(), + expirationDate: z.string().nullable(), + roomType: z.number(), + members: z.array(MemberSchema), + }), +}); +export type RoomUpdateOutputDTO = z.infer + + +@Injectable({ + providedIn: 'root' +}) +export class UpdateRoomByIdUseCaseService { + + constructor( + private roomRemoteDataSourceService: IRoomRemoteRepository, + private roomLocalDataSourceService: IRoomLocalRepository, + ) { } + + + @captureAndReraiseAsync('RoomRepositoryService/updateRoomBy') + async execute(data: RoomUpdateInputDTO): Promise> { + + const result = await this.roomRemoteDataSourceService.updateRoom(data) + + if(result.isOk()) { + const localList = await this.roomLocalDataSourceService.findAll() + // const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges([result.value.data], localList) + + // for( const roomData of roomsToUpdate) { + // if(!roomData.chatRoom.createdBy?.wxUserId) { + // delete roomData.chatRoom.createdBy; + // } + + // this.roomLocalDataSourceService.updateRoom(roomData.chatRoom) + // } + + } + + return result + } +} diff --git a/src/app/module/chat/domain/use-case/socket-connect-use-case.service.ts b/src/app/module/chat/domain/use-case/socket-connect-use-case.service.ts new file mode 100644 index 000000000..1e33628b9 --- /dev/null +++ b/src/app/module/chat/domain/use-case/socket-connect-use-case.service.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@angular/core'; +import { MessageSocketRepositoryService } from 'src/app/module/chat/data/repository/message/message-live-signalr-data-source.service'; +import { XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; + +@Injectable({ + providedIn: 'root' +}) +export class SocketConnectUseCaseService { + + constructor( + private MessageSocketRepositoryService: MessageSocketRepositoryService + ) { } + + @XTracerAsync({name:'SocketConnectUseCaseService', module:'chat', bugPrint: true}) + async execute() { + return await this.MessageSocketRepositoryService.connect() + } + + +} diff --git a/src/app/module/chat/domain/use-case/socket-join-use-case.service.ts b/src/app/module/chat/domain/use-case/socket-join-use-case.service.ts new file mode 100644 index 000000000..32accb991 --- /dev/null +++ b/src/app/module/chat/domain/use-case/socket-join-use-case.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; +import { MessageSocketRepositoryService } from 'src/app/module/chat/data/repository/message/message-live-signalr-data-source.service'; + + +@Injectable({ + providedIn: 'root' +}) +export class SocketJoinUseCaseService { + + constructor( + private MessageSocketRepositoryService: MessageSocketRepositoryService + ) { } + + + execute() { + + this.MessageSocketRepositoryService.sendDirectMessage + } +} diff --git a/src/app/module/chat/domain/use-case/socket/member-list-update-status-use-case.service.ts b/src/app/module/chat/domain/use-case/socket/member-list-update-status-use-case.service.ts new file mode 100644 index 000000000..23b22e939 --- /dev/null +++ b/src/app/module/chat/domain/use-case/socket/member-list-update-status-use-case.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { z } from 'zod'; +import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member/member-list-local-repository.service' + +export const MemberListUPdateStatus = z.object({ + key: z.string(), + value: z.object({ + userId: z.number(), + userName: z.string() + }) +}).array(); +export type MemberListUPdateStatusInputDTO = z.infer + + +@Injectable({ + providedIn: 'root' +}) +export class MemberListUpdateStatusUseCaseService { + + constructor( + private MemberListLocalRepository: MemberListLocalRepository + ) { } + + + @ValidateSchema(MemberListUPdateStatus) + execute(input: MemberListUPdateStatusInputDTO) { + return this.MemberListLocalRepository.updateMembersStatus(input) + } +} diff --git a/src/app/module/chat/domain/use-case/socket/socket-message-create-use-case.service.ts b/src/app/module/chat/domain/use-case/socket/socket-message-create-use-case.service.ts new file mode 100644 index 000000000..dce15d831 --- /dev/null +++ b/src/app/module/chat/domain/use-case/socket/socket-message-create-use-case.service.ts @@ -0,0 +1,88 @@ +import { Injectable, Input } from '@angular/core'; +import { MessageLocalDataSourceService } from '../../../data/repository/message/message-local-data-source.service'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { ParamsValidation } from 'src/app/services/decorators/validate-schema.decorator'; +import { MessageEntitySchema } from 'src/app/core/chat/entity/message'; +import { z } from 'zod'; + +const SocketMessageCreateOutputSchema = MessageEntitySchema.pick({ + id: true, + attachments: true, + canEdit: true, + editedAt: true, + info: true, + isDeleted: true, + message: true, + messageType: true, + oneShot: true, + reactions: true, + receiverId: true, + requireUnlock: true, + roomId: true, + sender: true, + sending: true, + sentAt: true, +}) + +export type ISocketMessageCreateOutput = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class SocketMessageCreateUseCaseService { + + private broadcastChannel: BroadcastChannel; + private processedMessages = new Set(); + + constructor( + private messageLocalDataSourceService: MessageLocalDataSourceService, + ) { + this.broadcastChannel = new BroadcastChannel('socket-message'); + this.broadcastChannel.onmessage = (event) => { + console.log('hello', event.data) + const messageId = event.data; + this.processedMessages.add(messageId); + }; + + // this.broadcastChannel.postMessage('incomingMessage.id'); + } + + @XTracerAsync({name:'Socket-Message-Create-UseCase', module:'chat', bugPrint: true}) + async execute(input: ISocketMessageCreateOutput, tracing?: TracingType) { + + this.broadcastChannel.postMessage(input.id); + ParamsValidation(SocketMessageCreateOutputSchema, input, tracing) + + const incomingMessage = { + ...input, + sending: false + } + + // Check if the message ID already exists in the processedMessages set + if (this.processedMessages.has(incomingMessage.id)) { + console.warn(`Duplicate message detected: ${incomingMessage.id}`); + return; // Exit early to prevent duplicate handling + } else { + console.log('no duplicate') + } + + // Add the message ID to the processedMessages set and broadcast it + this.processedMessages.add(incomingMessage.id); + + + console.log('create message', { incomingMessage }); + + tracing?.addEvent("Message Create start"); + const result = await this.messageLocalDataSourceService.insert(incomingMessage); + tracing?.addEvent("Message Create end"); + + if (result.isOk()) { + // Optionally, you can handle post-insertion logic here + } else { + tracing?.addEvent("error while creating message"); + tracing.log("error while creating message", { + error: result.error + }); + } + } +} diff --git a/src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service.ts b/src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service.ts new file mode 100644 index 000000000..02a754994 --- /dev/null +++ b/src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@angular/core'; +import { MessageLocalDataSourceService } from '../../../data/repository/message/message-local-data-source.service'; +import { MessageEntitySchema } from 'src/app/core/chat/entity/message'; +import { z } from 'zod'; + +const SocketMessageDeleteOutputSchema = MessageEntitySchema.pick({ + id: true, + attachments: true, + canEdit: true, + editedAt: true, + info: true, + isDeleted: true, + message: true, + messageType: true, + oneShot: true, + reactions: true, + receiverId: true, + requireUnlock: true, + roomId: true, + sender: true, + sending: true, + sentAt: true, +}) + + +export type ISocketMessageDeleteOutput = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class SocketMessageDeleteUseCaseService { + + constructor( + private messageLocalDataSourceService: MessageLocalDataSourceService + ) { } + + + async execute(input: ISocketMessageDeleteOutput) { + const result = await this.messageLocalDataSourceService.update(input.id, { isDeleted: true}) + + if(result.isOk()) { + console.log('deleled', result.value) + } else { + console.log(result.error) + } + } +} diff --git a/src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service.ts b/src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service.ts new file mode 100644 index 000000000..e681058b8 --- /dev/null +++ b/src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service.ts @@ -0,0 +1,63 @@ +import { Injectable } from '@angular/core'; +import { MessageLocalDataSourceService } from '../../../data/repository/message/message-local-data-source.service'; +import { ParamsValidation, SafeValidateSchema, ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { MessageEntitySchema } from 'src/app/core/chat/entity/message'; +import { z } from 'zod'; +import { MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; +import { MessageOutPutDataDTOSchema } from 'src/app/core/chat/repository/dto/messageOutputDTO'; + + +const SocketMessageUpdateOutputSchema = MessageEntitySchema.pick({ + id: true, + attachments: true, + canEdit: true, + editedAt: true, + info: true, + isDeleted: true, + message: true, + messageType: true, + oneShot: true, + reactions: true, + receiverId: true, + requireUnlock: true, + roomId: true, + sender: true, + sending: true, + sentAt: true, +}) + +export type ISocketMessageUpdateOutput = z.infer +@Injectable({ + providedIn: 'root' +}) +export class SocketMessageUpdateUseCaseService { + + constructor( + private messageLocalDataSourceService: MessageLocalDataSourceService + ) { } + + + @XTracerAsync({name:'Socket-Message-Update-UseCase', bugPrint: true, module:'chat',}) + async execute(input: ISocketMessageUpdateOutput, tracing?: TracingType) { + + ParamsValidation(MessageOutPutDataDTOSchema, input, tracing) + tracing?.addEvent("Message existe?") + const result = await this.messageLocalDataSourceService.findOne({id: input.id}) + + const messageToSave: MessageTable = input + messageToSave.sending = false + + if(result.isOk() && result.value) { + + tracing?.addEvent("Message found") + const updateResult = await this.messageLocalDataSourceService.update(result.value.$id, messageToSave) + tracing.setAttribute('outcome', 'success') + return updateResult + } else if(result.isOk() && !result.value) { + tracing?.addEvent("Message not found") + } + + + } +} diff --git a/src/app/module/chat/domain/use-case/typing/typing-send-use-case.service.ts b/src/app/module/chat/domain/use-case/typing/typing-send-use-case.service.ts new file mode 100644 index 000000000..4019b6964 --- /dev/null +++ b/src/app/module/chat/domain/use-case/typing/typing-send-use-case.service.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@angular/core'; +import { SessionStore } from 'src/app/store/session.service'; +import { UserTypingRemoteRepositoryService } from '../../../data/repository/typing/user-typing-live-data-source.service'; + +@Injectable({ + providedIn: 'root' +}) +export class SendTypingUseCaseService { + + constructor( + private UserTypingRemoteRepositoryService: UserTypingRemoteRepositoryService, + ) { } + + + execute(roomId) { + return this.UserTypingRemoteRepositoryService.sendTyping(roomId) + } +} diff --git a/src/app/module/chat/domain/use-case/user-photo/user-photo-get-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/user-photo/user-photo-get-by-id-use-case.service.ts new file mode 100644 index 000000000..c1b5b62e3 --- /dev/null +++ b/src/app/module/chat/domain/use-case/user-photo/user-photo-get-by-id-use-case.service.ts @@ -0,0 +1,49 @@ +import { Injectable } from '@angular/core'; +import { IUserPhotoLocalRepository } from 'src/app/core/chat/repository/user-photo/user-photo-local-repository'; +import { IUserPhotoRemoteRepository } from 'src/app/core/chat/repository/user-photo/user-photo-remote-repository'; +import { UserPhotoTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/user-foto'; +import { z } from 'zod'; + +export const UserPhotoGetByIdInputSchema = UserPhotoTableSchema.pick({ + attachmentId: true, + wxUserId: true, +}) + +export type IUserPhotoGetByIdInput = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class UserPhotoGetByIdUseCase { + + constructor( + private userPhotoLocalRepository: IUserPhotoLocalRepository, + private userPhotoRemoteRepository: IUserPhotoRemoteRepository + ) { } + + async execute(input: IUserPhotoGetByIdInput) { + + const result = await this.userPhotoLocalRepository.findOne({wxUserId: input.wxUserId}) + if(result.isOk() && result.value) { + return result.map(e => { + return e.file + }) + } else if(result.isOk() && !result.value) { + const remoteResult = await this.userPhotoRemoteRepository.getUserPhotoByAttachmentId({attachmentId: input.attachmentId}) + + if(remoteResult.isOk()) { + this.userPhotoLocalRepository.insert({ + wxUserId: input.wxUserId, + file: remoteResult.value.data, + attachmentId: input.attachmentId + }) + } + + return remoteResult.map(e => { + return e.data + }) + + } + + } +} diff --git a/src/app/shared/popover/chat-message-debugging/chat-message-debugging.page.scss b/src/app/module/chat/type.ts similarity index 100% rename from src/app/shared/popover/chat-message-debugging/chat-message-debugging.page.scss rename to src/app/module/chat/type.ts diff --git a/src/app/pages/chat/chat-routing.module.ts b/src/app/pages/chat/chat-routing.module.ts deleted file mode 100644 index 4d1596c1b..000000000 --- a/src/app/pages/chat/chat-routing.module.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; - -import { ChatPage } from './chat.page'; -import { GroupMessagesPage } from './group-messages/group-messages.page'; -import { MessagesPage } from './messages/messages.page'; - -const routes: Routes = [ - { - path: '', - component: ChatPage, - }, - { - path: 'new-group', - loadChildren: () => import('./new-group/new-group.module').then( m => m.NewGroupPageModule) - }, - { - path: 'group-messages', - loadChildren: () => import('./group-messages/group-messages.module').then( m => m.GroupMessagesPageModule) - }, - { - path: 'messages', - outlet:'message', - loadChildren: () => import('./messages/messages.module').then( m => m.MessagesPageModule) - }, - { - path: 'edit-group', - loadChildren: () => import('./edit-group/edit-group.module').then( m => m.EditGroupPageModule) - } - -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class ChatPageRoutingModule {} diff --git a/src/app/pages/chat/chat.page.html b/src/app/pages/chat/chat.page.html deleted file mode 100644 index d058c8ae2..000000000 --- a/src/app/pages/chat/chat.page.html +++ /dev/null @@ -1,299 +0,0 @@ - - - - - - -
- -
- - -
-
- Chat -
-
- - - - -
-
- - - - - Conversas - - - Grupos - - - - -
-
- - -
-
- - - - - -
-
-
-
- - -
-
- {{room.name}} -
-
-
-
-
-
{{room.duration}}
-
-
-
{{room.lastMessage.msg}}
-
está escrever ...
- -
- - - audio - - {{ room.lastMessage.attachments[0].title }} - - -
-
-
- - Fotografia -
-
-
-
-
-
- -
-
-
-
-
-
-
-
- - -
-
-
-
-
- - -
- - -
- - - - - - - -
-
-
-
-

{{group.name.split('-').join(' ')}}

-
-
{{group.duration }}
-
{{group.countDownTime }}
-
-
-
{{group.lastMessage.u.name}} : {{group.lastMessage.msg}}
-
{{group.userThatIsTyping}} está escrever ...
- -
- - - audio - - {{ group.lastMessage.attachments[0].title }} - - -
-
-
- - Fotografia -
-
-
-
-
-
- -
-
-
-
-
-
-
-
- - -
-
-
-
- -
-
- - -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
diff --git a/src/app/pages/chat/chat.page.ts b/src/app/pages/chat/chat.page.ts deleted file mode 100644 index a2a7ea13b..000000000 --- a/src/app/pages/chat/chat.page.ts +++ /dev/null @@ -1,908 +0,0 @@ -import { HttpHeaders, HttpParams } from '@angular/common/http'; -import { - Component, - OnInit, - ViewChild, - ViewContainerRef, - Output, - NgZone, -} from '@angular/core'; -import { ModalController, Platform } from '@ionic/angular'; -import { AuthService } from 'src/app/services/auth.service'; -import { ChatService } from 'src/app/services/chat.service'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service' -import { GroupMessagesPage } from './group-messages/group-messages.page'; -import { ContactsPage } from './messages/contacts/contacts.page'; -import { MessagesPage } from './messages/messages.page'; -import { NewGroupPage } from './new-group/new-group.page'; -import { EditGroupPage } from 'src/app/shared/chat/edit-group/edit-group.page'; -import { Subject } from "rxjs/Rx"; -import { NavigationStart, Router, NavigationEnd, ActivatedRoute } from '@angular/router'; -import { EventPerson } from 'src/app/models/eventperson.model'; -import { removeDuplicate } from 'src/plugin/removeDuplicate.js' -import { environment } from 'src/environments/environment'; -import { TimeService } from 'src/app/services/functions/time.service'; -import { ThemeService } from 'src/app/services/theme.service' -import { DataService } from 'src/app/services/data.service'; -import { SqliteService } from 'src/app/services/sqlite.service'; -import { StorageService } from 'src/app/services/storage.service'; -import { SessionStore } from 'src/app/store/session.service'; -import { ChatDebuggingPage } from 'src/app/shared/popover/chat-debugging/chat-debugging.page'; -import { EventTrigger } from 'src/app/services/eventTrigger.service'; -import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service'; -import { RouteService } from 'src/app/services/route.service'; -import { Plugins } from '@capacitor/core'; - - -const { App } = Plugins; - -@Component({ - selector: 'app-chat', - templateUrl: './chat.page.html', - styleUrls: ['./chat.page.scss'], -}) -export class ChatPage implements OnInit { - - showLoader: boolean; - - headers: HttpHeaders; - options: any; - X_User_Id: any; - X_Auth_Token: any; - - loggedUser: any; - segment: string; - allGroups: any[]; - privateGroups: any[]; - publicGroups: any[]; - userConnectedList: any[]; - userRooms: any[]; - userChannels: any[]; - userDirectMessages: any[]; - result: any; - dmUsers: any[] = []; - idSelected: string; - - desktopComponent: any = { - showMessages: false, - showGroupMessages: false, - } - - @ViewChild('messagecontainer', { read: ViewContainerRef }) entry: ViewContainerRef; - componentRef: any; - - roomId: any; - task: any; - groupRoomId: any; - showEmptyComponent = true; - showMessages = false; - showContacts = false; - showNewGroup = false; - showEditGroup = false; - showGroupMessages = false; - showGroupContacts = false; - showNewEvent = false; - showAttendees = false; - emptyTextDescription = 'Sem conversa selecionada'; - - @Output() getRoomInfo; - - - subject: any; - public messages: Subject; - - message = { - "msg": "connect", - "version": "1", - "support": ["1"] - }; - - loggedUserChat: any; - hideRefreshBtn = true; - - taskParticipants: any = []; - taskParticipantsCc: any = []; - adding: "intervenient" | "CC" = "intervenient"; - profile: 'mdgpr' | 'pr'; - eventSelectedDate: Date = new Date(); - contacts: EventPerson[]; - showEventEditOrOpen: "edit" | "add" | "" | "eventoToApprove" = "" - socket: WebSocket; - receivedData: any; - routerSubscription - - constructor( - private chatService: ChatService, - private modalController: ModalController, - private authService: AuthService, - private route: Router, - private timeService: TimeService, - public ThemeService: ThemeService, - private dataService: DataService, - private router: Router, - private sqlservice: SqliteService, - private platform: Platform, - private storageservice: StorageService, - public ChatSystemService: ChatSystemService, - private activatedRoute: ActivatedRoute, - private eventTriger: EventTrigger, - private RochetChatConnectorService: RochetChatConnectorService, - private zone: NgZone, - public RouteService: RouteService - ) { - - this.headers = new HttpHeaders();; - window.onresize = (event) => { - if (window.innerWidth > 701) { - this.modalController.dismiss(); - } - }; - - this.showLoader = true; - - this.segment = 'Contactos' - - /* this.eventTriger.getObservable().subscribe((event) => { - if (event.notification == "recive") { - this.onSegmentChange() - } - // console.log(event) - }); */ - - } - - ngOnInit() { - - this.segment = "Contactos"; - - this.authService.userData$.subscribe((res: any) => { - this.loggedUser = res; - }); - - this.hideRefreshButton(); - this.getChatMembers(); - - - this.router.events.forEach((event) => { - if (event instanceof NavigationEnd && event.url == '/home/chat' || - event instanceof NavigationEnd && event.url == "/home/chat?gbCreateGroup=true") { - this.checkCreateGroup(); - } - }); - - this.routerSubscription = this.router.events.subscribe((event) => { - if (event instanceof NavigationEnd && event.url.startsWith('/home/chat')) { - this.routeCheck() - } - }); - - } - - - ngOnDestroy() { - // this.setStatus('offline'); - this.routerSubscription?.unsubscribe(); - } - - reopenWebSocketConnection() { - // Implement your reconnection logic here. - const newWebSocket = new WebSocket(environment.apiWsChatUrl); - // Add event listeners to the newWebSocket. - // Retry connecting or other reconnection logic can be added here. - } - - firstEnter = true - - routeCheck() { - const urlParams = new URLSearchParams(window.location.search); - const roomId = urlParams.get('roomId'); - - if (roomId) { - - if (this.firstEnter) { - this.firstEnter = false - - let delay = this.RouteService.liveHistory.find((item) => { - return ['/home/publications', '/home/agenda', '/home/gabinete', '/home/events'].filter(x => { - return item.includes(x) - }).length >= 1 - }) - if (!delay) { - console.log("delay") - setTimeout(() => { - this.openChat(roomId) - }, 2000) - } else { - console.log("no dalay") - this.openChat(roomId) - } - } else { - this.openChat(roomId) - } - - - } - - } - - openFailed = 0 - openChat(roomId) { - const room = this.ChatSystemService.getRoomById(roomId); - if (room) { - this.openFailed = 0 - if (room.isGroup) { - this.segment = 'Grupos' - this.openGroupMessagesPage(roomId) - } else { - this.segment = 'Contactos' - this.openMessagesPage(roomId) - } - } else { - if (this.openFailed <= 3) { - this.openFailed++ - - setTimeout(() => { - this.openChat(roomId) - }, 1000) - } else { - this.openFailed = 0 - } - } - - } - - checkCreateGroup() { - if (this.dataService.get("newGroup")) { - this.openNewGroupPage(); - } - else { - this.closeAllDesktopComponents(); - this.showEmptyComponent = true; - } - - } - - numSequence(n: number): Array { - return Array(n); - } - - setStatus(status: string) { - let body = { - message: '', - status: status, - } - this.chatService.setUserStatus(body).subscribe(res => { - - }) - } - - hideRefreshButton() { - window.onresize = (event) => { - if (window.innerWidth < 701) { - this.idSelected = ''; - this.hideRefreshBtn = false; - this.closeAllDesktopComponents() - - this.ChatSystemService.getRoomById(this.roomId)?.roomLeave() - } - else { - this.hideRefreshBtn = true; - if (this.idSelected == '') { - this.showEmptyComponent = true; - } - } - } - if (window.innerWidth < 701) { - this.idSelected = ''; - this.hideRefreshBtn = false; - } - } - - closeAllDesktopComponents() { - this.showMessages = false; - this.showContacts = false; - this.showNewGroup = false; - this.showEditGroup = false; - this.showGroupMessages = false; - this.showEmptyComponent = false; - this.showGroupContacts = false; - this.showNewEvent = false; - this.showAttendees = false; - - } - - showEmptyContainer() { - this.idSelected = ''; - this.showEmptyComponent = true; - } - openGroupContactsPage(data) { - this.idSelected = ''; - this.groupRoomId = data; - this.closeAllDesktopComponents(); - if (window.innerWidth < 701) { - - } - else { - this.showGroupContacts = true; - } - } - openMessagesPage(rid) { - - // this.chatService.refreshtoken(); - this.roomId = rid; - - if (window.innerWidth < 701) { - this.openMessagesModal(rid); - } - else { - this.idSelected = rid; - this.closeAllDesktopComponents(); - this.showEmptyComponent = false; - this.showMessages = true; - } - } - openContactsPage() { - this.segment = 'Contactos'; - this.idSelected = ''; - this.closeAllDesktopComponents(); - - if (window.innerWidth < 701) { - this.selectContact(); - } - else { - this.showEmptyComponent = false; - this.showContacts = true; - } - } - openNewGroupPage() { - this.segment = 'Grupos'; - - this.idSelected = ''; - if (window.innerWidth < 701) { - this.newGroup(); - } - else { - this.closeAllDesktopComponents(); - this.showEmptyComponent = false; - this.showNewGroup = true; - } - } - - openEditGroupPage(rid) { - if (window.innerWidth < 701) { - this.editGroup(rid); - } - else { - this.closeAllDesktopComponents(); - this.showEditGroup = true; - } - } - - openGroupMessagesPage(rid) { - - this.roomId = rid; - if (window.innerWidth < 701) { - this.openGroupMessagesModal(rid); - } - else { - this.idSelected = rid; - this.closeAllDesktopComponents(); - this.showEmptyComponent = false; - - - this.showGroupMessages = true; - } - } - - openNewEventPage(data?) { - - if (data) { - this.taskParticipants = data.members.map((val) => { - return { - Name: val.name, - EmailAddress: val.username + "@" + environment.domain, - IsRequired: "true", - } - }); - this.groupRoomId = data.roomId; - } - - this.closeAllDesktopComponents(); - if (window.innerWidth < 701) { - - } - else { - this.showNewEvent = true; - } - } - - async openAttendeesComponent(data) { - this.adding = data.type - this.closeAllDesktopComponents(); - this.showAttendees = true; - } - - async clearContact() { - this.contacts = []; - } - - async setContact(data: EventPerson[]) { - this.contacts = data; - } - - async setIntervenient(data) { - this.taskParticipants = removeDuplicate(data) - } - - async setIntervenientCC(data) { - this.taskParticipantsCc = removeDuplicate(data) - } - - async closeAttendeesComponent() { - this.closeAllDesktopComponents(); - this.showNewEvent = true; - } - - async closeNewEventComponent() { - this.closeAllDesktopComponents(); - this.showEmptyComponent = true; - this.idSelected = ""; - } - - async closeNewEventComponentAndOpenChat({ roomId }) { - this.closeAllDesktopComponents(); - - this.ChatSystemService._group.forEach((room) => { - if (room.id == roomId) { - - - this.openGroupMessagesPage(roomId) - } - }) - - this.ChatSystemService._dm.forEach((room) => { - if (room.id == roomId) { - this.openMessagesPage(roomId) - } - }) - - } - - onSegmentChange() { - this.ChatSystemService.getAllRooms(); - this.ChatSystemService._dm - } - - doRefresh(event) { - setTimeout(() => { - try { - event?.target?.complete(); - } catch (error) { } - }, 1000); - } - - customRoom() { - let params = new HttpParams(); - params = params.set("types", "c"); - this.chatService.customsRooms(params).subscribe(res => { - // - }); - } - - // getDirectMessagesDB() { - // if (this.platform.is('desktop') || this.platform.is('mobileweb')) { - // this.storageservice.get("rooms").then((rooms) =>{ - - // this.userDirectMessages = rooms.sort((a, b) => { - // var dateA = new Date(a._updatedAt).getTime(); - // var dateB = new Date(b._updatedAt).getTime(); - // return dateB - dateA; - // }); - // // - - // // - // }).catch((error) => { - // console.error('storage getdirectmessagedb: ',error) - // }) - - // this.storageservice.get('chatusers').then((users) => { - // this.dmUsers = users.filter(data => data.username != SessionStore.user.UserName); - // }).catch((error) => { - // console.error('storage getchatusers: ',error) - // }) - // } - // // else { - // // this.sqlservice.getAllChatRoom().then((rooms: any) => { - // // // - // // let roomsArray = []; - // // rooms.forEach(element => { - // // let roomListDB = { - // // _id: element.Id, - // // uids: this.isJson(element.Uids), - // // usernames: this.isJson(element.Usernames), - // // lastMessage: this.isJson(element.LastMessage), - // // _updatedAt: element.UpdatedAt - // // } - // // if(element.customFields == "undefined") { - // // roomsArray.push(roomListDB) - // // } - // // }); - - // // this.userDirectMessages = roomsArray.sort((a, b) => { - // // var dateA = new Date(a._updatedAt).getTime(); - // // var dateB = new Date(b._updatedAt).getTime(); - // // return dateB - dateA; - // // }); - // // // - - // // // - // // }) - - // // this.sqlservice.getAllChatUsers().then((userslist: any) => { - // // // - // // let chatusersArray = []; - // // userslist.forEach(element => { - - // // let userListDB = { - // // _id: element.Id, - // // name: element.Name, - // // username: element.Username - // // } - - // // chatusersArray.push(userListDB); - // // }); - - // // this.dmUsers = chatusersArray.filter(data => data.username != SessionStore.user.UserName); - - // // }) - // // } - // } - - // transformDataRoomList(data) { - // if (this.platform.is('desktop') || this.platform.is('mobileweb')) { - // let roomsArray = []; - // data.forEach(element => { - // let roomList = { - // _id: element._id, - // uids: element.uids, - // usernames: element.usernames, - // lastMessage: element.lastMessage, - // _updatedAt: element._updatedAt - // } - - // // - // roomsArray.push(roomList) - // }); - - // this.storageservice.remove('rooms'); - // this.storageservice.store('rooms', roomsArray); - - // } else { - // data.forEach(element => { - // let roomList = { - // id: element._id, - // uids: element.uids, - // usernames: element.usernames, - // lastMessage: element.lastMessage, - // updatedat: element._updatedAt - // } - - // // - // // this.sqlservice.addChatListRoom(roomList); - // }); - // } - // } - - async transformDataUserList(users) { - if (this.platform.is('desktop') || this.platform.is('mobileweb')) { - let usersArray = []; - users.forEach(element => { - // - let chatusers = { - _id: element._id, - name: element.name, - username: element.username - } - // - usersArray.push(chatusers); - }); - await this.storageservice.remove('chatusers'); - await this.storageservice.store('chatusers', usersArray); - } else { - users.forEach(element => { - // - let chatusers = { - id: element._id, - name: element.name, - username: element.username - } - // - // this.sqlservice.addChatListUsers(chatusers); - }); - } - } - - showDateDuration(start: any) { - return this.timeService.showDateDuration(start); - } - - countDownDate(date: any, roomId: string) { - return this.timeService.countDownDate(date, roomId); - } - - async getChatMembers() { - - this.chatService.getAllUsers().subscribe(res => { - // - this.transformDataUserList(res['users']) - - }); - } - - getGroupsDB() { - if (this.platform.is('desktop') || this.platform.is('mobileweb')) { - this.storageservice.get("grouprooms").then((rooms) => { - - let k = rooms.sort((a, b) => { - var dateA = new Date(a._updatedAt).getTime(); - var dateB = new Date(b._updatedAt).getTime(); - return dateB - dateA; - }); - - - - - this.allGroups = rooms.sort((a, b) => { - var dateA = new Date(a._updatedAt).getTime(); - var dateB = new Date(b._updatedAt).getTime(); - return dateB - dateA; - }); - - - // - }).catch((error) => { - console.error('storage getGrup Romm db: ', error) - }) - - this.storageservice.get('chatusers').then((users) => { - this.dmUsers = users.filter(data => data.username != SessionStore.user.UserName); - }).catch((error) => { - console.error('storage getgrupDb: ', error) - }) - } else { - // this.sqlservice.getAllChatRoom().then((rooms: any) => { - - // let roomsArray = []; - // rooms.forEach(element => { - // let fddf = this.isJson(element.LastMessage); - // let roomListDB = { - // _id: element.Id, - // customFields: this.isJson(element.customFields), - // name: element.name, - // lastMessage: this.isJson(element.LastMessage), - // _updatedAt: element.UpdatedAt - // } - // if(element.customFields != "undefined") { - // roomsArray.push(roomListDB) - // } - // }); - - // this.allGroups = roomsArray.sort((a, b) => { - // var dateA = new Date(a._updatedAt).getTime(); - // var dateB = new Date(b._updatedAt).getTime(); - // return dateB - dateA; - // }); - // // - // }) - } - } - - - roomDataFileType(roomData) { - return roomData?.lastMessage?.file?.type || null - } - - async transformGroups(data) { - if (this.platform.is('desktop') || this.platform.is('mobileweb')) { - let groupsArray = []; - data.forEach(element => { - let roomList = { - _id: element._id, - uids: element.uids, - usernames: element.usernames, - name: element.name, - customFields: element.customFields, - lastMessage: element.lastMessage, - _updatedAt: element._updatedAt - } - - groupsArray.push(roomList) - }); - - await this.storageservice.remove('grouprooms'); - await this.storageservice.store('grouprooms', groupsArray); - - } else { - data.forEach(element => { - let roomList = { - id: element._id, - uids: element.uids, - usernames: element.usernames, - customFields: element.customFields, - name: element.name, - lastMessage: element.lastMessage, - updatedat: element._updatedAt - } - - // this.sqlservice.addChatListRoom(roomList); - }); - } - - } - - - async emptyTextDescriptionOpen() { - this.closeAllDesktopComponents() - this.showEmptyComponent = true - } - - async getGroups(event?) { - this.result = this.chatService.getAllPrivateGroups().subscribe(async (res: any) => { - // - this.showLoader = false; - if (res.groups != 200) { - - this.transformGroups(res.groups); - this.getGroupsDB(); - - this.privateGroups = res.groups; - - - if (this.route.url != "/home/chat") { - // - } - else { - //Check if modal is opened - if (this.segment == "Grupos" && this.showGroupMessages != true) { - await new Promise(resolve => setTimeout(resolve, 1000)).catch((error) => { - console.error(error); - }); - //await this.getGroups(); - } - } - } - else { - //await this.getGroups(); - } - }); - } - - isJson(str) { - try { - JSON.parse(str); - } catch (e) { - return str; - } - return JSON.parse(str); - } - - async selectContact() { - const modal = await this.modalController.create({ - component: ContactsPage, - cssClass: 'modal modal-desktop', - }); - - modal.onDidDismiss().then((Data) => { - - // let data = Data.data - // let roomId = data.roomId - // this.openMessagesPage(roomId); - - }); - - await modal.present(); - - } - - async newGroup() { - const modal = await this.modalController.create({ - component: NewGroupPage, - cssClass: 'modal modal-desktop', - }); - await modal.present(); - modal.onDidDismiss(); - } - - async editGroup(roomId) { - const modal = await this.modalController.create({ - component: EditGroupPage, - cssClass: 'modal modal-desktop', - componentProps: { - roomId: roomId, - }, - }); - - modal.onDidDismiss().then((res) => { - - this.modalController.dismiss(res.data); - }); - - await modal.present(); - } - - async openMessagesModal(roomId: any) { - this.closeAllDesktopComponents(); - - // - - const modal = await this.modalController.create({ - component: MessagesPage, - cssClass: 'modal modal-desktop isMessagesChatOpened', - componentProps: { - roomId: roomId, - }, - }); - await modal.present(); - modal.onDidDismiss(); - } - - - backToChat({ roomId }) { - - const room = this.ChatSystemService.getRoomById(roomId); - - if (room.isGroup) { - this.segment = "Grupos" - this.openGroupMessagesPage(room.id); - } else { - this.segment = "Contactos" - this.openMessagesPage(room.id); - } - - } - - async openChatDebuggingPageModal(roomId?: any) { - - const modal = await this.modalController.create({ - component: ChatDebuggingPage, - cssClass: 'modal modal-desktop isMessagesChatOpened', - componentProps: { - // roomId: roomId, - }, - }); - - modal.onDidDismiss(); - await modal.present(); - } - - async openGroupMessagesModal(roomId: any) { - - const modal = await this.modalController.create({ - component: GroupMessagesPage, - cssClass: 'modal modal-desktop isGroupChatOpened', - componentProps: { - roomId: roomId, - }, - }); - - modal.onDidDismiss().then(() => { - this.ChatSystemService.currentRoom.roomLeave() - }); - await modal.present(); - } - - reloadComponent(self: boolean, urlToNavigateTo?: string) { - //skipLocationChange:true means dont update the url to / when navigating - console.log("Current route I am on:", this.router.url); - const url = self ? this.router.url : urlToNavigateTo; - this.zone.run(() => this.router.navigateByUrl('/', { skipLocationChange: true }).then(() => { - this.zone.run(() => this.router.navigate([`/${url}`]).then(() => { - console.log(`After navigation I am on:${this.router.url}`) - })) - })) - } - - - -} - diff --git a/src/app/pages/chat/group-messages/group-messages.page.html b/src/app/pages/chat/group-messages/group-messages.page.html deleted file mode 100644 index 16b0b3de4..000000000 --- a/src/app/pages/chat/group-messages/group-messages.page.html +++ /dev/null @@ -1,344 +0,0 @@ - - -
-
- -
- -
-
-
- {{ ChatSystemService.getGroupRoom(roomId).name.split('-').join(' ') }} -
-
-
- -
-
- -
-
-
-
- - -
-
- - {{member.name}}, - -
-
-
- - {{ChatSystemService.getGroupRoom(roomId).countDownTime}} -
-
-
-
- - - - -
-
- Esta conversa passou a grupo
- A conversa original mantêm-se como chat individual -
-
-
-
- {{msg.u.name ?? ""}} - {{msg.time}} -
-
-
{{msg.msg}}
-
{{msg.msg}}
- - - - - Enviado - - - - - Lido -
Tentar
-
- {{last ? scrollToBottom() : ''}} -
-
- - -
-
-
- {{msg.u.name ?? ""}} - {{msg.time}} -
-
-
-
-
- NOT UPLOADED -
-
-
- - - {{"Imagem"}} - - - - -
- image - - - - Enviado - - - - - Lido -
Tentar
-
-
-
-
-
-
- - - - - {{ file.title}} - - - - - - -
-
- - - - - - - - {{file.title}} -
-
-
-
- - - {{"Mensagem de voz"}} - - - - -
-
- -
-
- - {{file.description}} - - - - - - - Enviado - - - - - Lido -
Tentar
-
-
-
-
-
- {{last ? scrollToBottom() : ''}} -
-
-
- {{msg.u.name ?? ""}} criou esta reunião
- -
- De - {{showDateDuration(msg.file.start_date)}} a {{showDateDuration(msg.file.end_date)}}
- - {{msg.file.venue}}
-
-
- -
- {{ msg.msg}} -
- -
- Apagou a mensagem -
- -
- Alterou o nome do grupo para "{{msg.msg.split('-').join(' ')}}"
- {{last ? scrollToBottom() : ''}} -
-
-
-
- {{user.name}} saiu do grupo
-
-
- {{last ? scrollToBottom() : ''}} -
-
-
-
- {{user.name}} foi removido do grupo
-
-
- {{last ? scrollToBottom() : ''}} -
-
- -
-
- Adicionou {{user.name}}
-
-
- {{last ? scrollToBottom() : ''}} -
-
-
- - - - - - -
- - - -
- - {{ ChatSystemService.getGroupRoom(roomId).userThatIsTyping }} está a escrever... -
- -
- {{durationDisplay}} - -
- -
-
- - -
-
-
- -
-
- -
-
-
- - - -
-
- -
diff --git a/src/app/pages/chat/messages/contacts/contacts.page.ts b/src/app/pages/chat/messages/contacts/contacts.page.ts deleted file mode 100644 index a304b03f5..000000000 --- a/src/app/pages/chat/messages/contacts/contacts.page.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http'; -import { Component, OnInit } from '@angular/core'; -import { ModalController } from '@ionic/angular'; -import { AuthService } from 'src/app/services/auth.service'; -import { ChatService } from 'src/app/services/chat.service'; -import { MessagesPage } from '../messages.page'; -import { ThemeService } from 'src/app/services/theme.service' -import { ChatSystemService} from 'src/app/services/chat/chat-system.service' -import { SessionStore } from 'src/app/store/session.service'; - -@Component({ - selector: 'app-contacts', - templateUrl: './contacts.page.html', - styleUrls: ['./contacts.page.scss'], -}) -export class ContactsPage implements OnInit { - showLoader: boolean; - loggedUser: any; - users = []; - - contacts:any; - textSearch:string; - room:any; - dm:any; - sessionStore = SessionStore - userList = this.ChatSystemService.users - - constructor( - private modalController: ModalController, - private http: HttpClient, - private chatService: ChatService, - private authService: AuthService, - public ThemeService: ThemeService, - public ChatSystemService: ChatSystemService, - ) - { - this.loggedUser = SessionStore.user.ChatData['data']; - - this.textSearch=""; - this.dm=null; - this.room=null; - } - - ngOnInit() { - // this.chatService.refreshtoken(); - // this.loadUsers(); - this.ChatSystemService.getUser() - - } - - onChange(event) { - - this.textSearch = event.detail.value.toLowerCase(); - - this.userList = this.ChatSystemService.users.filter((e) => { - const username = e.name.toLowerCase() - return username.includes(this.textSearch) - }) - - } - - - separateLetter(record, recordIndex, records){ - if(recordIndex == 0){ - return record.name[0]; - } - - let first_prev = records[recordIndex - 1].name[0]; - let first_current = record.name[0]; - - if(first_prev != first_current){ - return first_current; - } - return null; - } - - doRefresh(event){ - } - - close() { - this.modalController.dismiss({}); - } - - clicked() {} - loading = false - - createRoom(username:string) { - - if(this.loading) { - return - } - - this.loading = true - let body = { - username: username, - } - this.chatService.createRoom(body).subscribe(async(res) => { - this.room = res['room']; - - this.ChatSystemService.getAllRooms(() => { - this.getDirectMessage(this.room._id); - this.loading = false - }, this.room._id); - - - }, ()=> { - this.loading = false - }); - - } - - getDirectMessage(roomId:any) { - - this.openModal(roomId); - - } - - async openModal(roomId:any){ - this.close(); - console.log('open chat') - - const modal = await this.modalController.create({ - component: MessagesPage, - cssClass: 'group-messages', - componentProps: { - roomId: roomId, - }, - }); - - modal.onDidDismiss(); - await modal.present(); - } - -} diff --git a/src/app/pages/chat/messages/messages.page.html b/src/app/pages/chat/messages/messages.page.html deleted file mode 100644 index d0572fba5..000000000 --- a/src/app/pages/chat/messages/messages.page.html +++ /dev/null @@ -1,314 +0,0 @@ - - -
-
-
- -
-
-
- {{ChatSystemService.getDmRoom(roomId).name}} - -
-
- - -
- - -
- -
- -
-
-
- - -
- -
-
-
- {{msg.u.name}} - {{msg.time}} -
-
-
- -
{{msg.msg}}
- - Apagou a mensagem - - - - - Enviado - - - - - Lido -
Tentar
-
-
- {{last ? scrollToBottom() : ''}} -
-
- -
-
-
- {{msg.u.name}} - {{msg.time}} -
-
-
-
-
-
- - - {{"Imagem"}} - - - - -
- image - - - - Enviado - - - - - Lido -
Tentar
-
- -
-
-
-
- -
- - - - - {{ file.title}} - - - - - -
- -
- - - - - - - - - - {{file.title}} -
- -
-
-
- - - {{"Mensagem de voz"}} - - - - -
-
- -
-
- - {{file.description}} - - - - - - - - Enviado - - - - - Lido -
Tentar
-
- -
-
-
-
- {{last ? scrollToBottom() : ''}} -
-
-
- {{msg.u.name}} criou esta reunião
-
- - De {{showDateDuration(msg.file.start_date)}} a - {{showDateDuration(msg.file.end_date)}} -
- - - {{msg.file.venue}} -
-
- -
- -
- Apagou a mensagem -
-
- -
- - - - - - -
- - - -
- - está a escrever ... -
-
- {{durationDisplay}} - -
- -
-
- - -
-
-
- -
-
- -
-
-
- - - -
-
- -
\ No newline at end of file diff --git a/src/app/pages/chat/messages/messages.page.ts b/src/app/pages/chat/messages/messages.page.ts deleted file mode 100644 index 623b6dd3f..000000000 --- a/src/app/pages/chat/messages/messages.page.ts +++ /dev/null @@ -1,1342 +0,0 @@ -import { AfterViewInit, Component, ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { Router } from '@angular/router' -import { GestureController, ModalController, NavParams, PopoverController, Platform, AlertController } from '@ionic/angular'; -import { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page'; -import { ViewDocumentSecondOptionsPage} from 'src/app/modals/view-document-second-options/view-document-second-options.page'; -import { EventPerson } from 'src/app/models/eventperson.model'; -import { ExpedientTaskModalPageNavParamsTask } from 'src/app/models/ExpedientTaskModalPage'; -import { ContactsPage } from 'src/app/pages/chat/messages/contacts/contacts.page'; -import { AlertService } from 'src/app/services/alert.service'; -import { FileService } from 'src/app/services/functions/file.service'; -import { ToastService } from 'src/app/services/toast.service'; -import { ChatOptionsPopoverPage } from 'src/app/shared/popover/chat-options-popover/chat-options-popover.page'; -import { MessagesOptionsPage } from 'src/app/shared/popover/messages-options/messages-options.page'; -import { ChatMessageStore } from 'src/app/store/chat/chat-message.service'; -import { ChatUserStorage } from 'src/app/store/chat/chat-user.service'; -import { environment } from 'src/environments/environment'; -import { ThemeService } from 'src/app/services/theme.service' - -import { VoiceRecorder, RecordingData, GenericResponse } from 'capacitor-voice-recorder'; -import { Haptics, ImpactStyle } from '@capacitor/haptics'; -import { ViewEventPage } from 'src/app/modals/view-event/view-event.page'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service' -import { MessageService } from 'src/app/services/chat/message.service'; -import { FileType } from 'src/app/models/fileType'; -import { SearchPage } from 'src/app/pages/search/search.page'; -import { Storage } from '@ionic/storage'; -import { Camera, CameraResultType, CameraSource } from '@capacitor/camera'; -import { DomSanitizer } from '@angular/platform-browser'; -import { SessionStore } from 'src/app/store/session.service'; -import { ViewMediaPage } from 'src/app/modals/view-media/view-media.page'; -import { File } from '@awesome-cordova-plugins/file/ngx'; -import { FileOpener } from '@awesome-cordova-plugins/file-opener/ngx'; -import { Filesystem, Directory, Encoding } from '@capacitor/filesystem'; -import { NewEventPage } from '../../agenda/new-event/new-event.page'; -import { NotificationsService } from 'src/app/services/notifications.service'; -import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service' -import { FileValidatorService } from "src/app/services/file/file-validator.service" -import { sanitize } from "sanitize-filename-ts"; -import { FilePicker } from '@capawesome/capacitor-file-picker'; - - - -const IMAGE_DIR = 'stored-images'; - -@Component({ - selector: 'app-messages', - templateUrl: './messages.page.html', - styleUrls: ['./messages.page.scss'], -}) -export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { - showLoader: boolean; - - @ViewChild('scrollMe') private myScrollContainer: ElementRef; - /* @ViewChild('messageContainer') messageContainer: ElementRef; */ - @ViewChild('rectangle') private rectangle: ElementRef; - - canvas: any - ctx: any - loggedUser: any; - userPresence = ''; - dmUsers: any; - roomId: string; - el: any; - members: any; - scrollingOnce: boolean = true; - - chatMessageStore = ChatMessageStore; - chatUserStorage = ChatUserStorage; - - private scrollChangeCallback: () => void; - currentPosition: any; - startPosition: number; - scrollToBottomBtn = false; - attendees: EventPerson[] = []; - longPressActive = false; - showMessageOptions = false; - selectedMsgId: string; - - dicIndex = 0; - task: ExpedientTaskModalPageNavParamsTask; - LoadedDocument: any = null; - - recording = false; - allowTyping = true; - storedFileNames = []; - lastAudioRecorded = ''; - audioRecorded: any = ""; - audioDownloaded: any = ""; - durationDisplay = ''; - duration = 0; - @ViewChild('recordbtn', { read: ElementRef }) recordBtn: ElementRef; - myAudio: any; - downloadfile: any; - downloadFile: any; - files: any[] = []; - @ViewChild('filechooser') fileChooserElementRef: ElementRef; - //items: File[] = []; - fileSelected?: Blob; - pdfUrl?: string; - base64File: string; - downloadProgess: number; - downloadLoader: boolean; - - audioPermissionStatus: 'granted' | 'denied' | 'prompt' | null = null - sessionStore = SessionStore - - constructor( - public popoverController: PopoverController, - private modalController: ModalController, - private navParams: NavParams, - private alertService: AlertService, - private toastService: ToastService, - private fileService: FileService, - private gestureController: GestureController, - public ThemeService: ThemeService, - private platform: Platform, - public ChatSystemService: ChatSystemService, - private storage: Storage, - //private fileOpener: FileOpener, - private sanitiser: DomSanitizer, - // private document: DocumentViewer - private file: File, - private fileOpener: FileOpener, - private router: Router, - public RochetChatConnectorService: RochetChatConnectorService, - private FileValidatorService: FileValidatorService, - ) { - - try { - - this.loggedUser = SessionStore.user.ChatData['data']; - this.roomId = this.navParams.get('roomId'); - - - window.onresize = (event) => { - if (window.innerWidth > 701) { - this.modalController.dismiss(); - } - } - - - this.ChatSystemService.getDmRoom(this.roomId).loadHistory({}) - this.ChatSystemService.getDmRoom(this.roomId).scrollDown = this.scrollToBottomClicked - this.ChatSystemService.openRoom(this.roomId) - - setTimeout(() => { - this.scrollToBottomClicked() - }, 150) - } catch (error) { - //alert(error) - } - } - - - - ngOnInit() { - try { - // console.log(this.router.url); - this.createDirectoryImage() - // this.chatService.refreshtoken(); - this.ChatSystemService.getUserOfRoom(this.roomId).then((value) => { - - }).catch((error) => { - console.error(error) - }) - - this.getChatMembers(); - } catch (error) { - //alert(error) - } - - } - - - ngAfterViewInit() { - this.scrollChangeCallback = () => this.onContentScrolled(event); - window.addEventListener('scroll', this.scrollChangeCallback, true); - - const longpress = this.gestureController.create({ - el: this.recordBtn.nativeElement, - threshold: 0, - gestureName: 'long-press', - onStart: ev => { - Haptics.impact({ style: ImpactStyle.Light }) - this.startRecording(); - //this.calculateDuration(); - }, - onEnd: ev => { - Haptics.impact({ style: ImpactStyle.Light }) - this.stopRecording(); - } - }, true); - longpress.enable(); - } - - onDragOver(e?) { } - onDragLeave(e?) { } - - calculateDuration() { - if (!this.recording) { - this.duration = 0; - this.durationDisplay = ''; - return; - } - this.duration += 1; - const minutes = Math.floor(this.duration / 60); - const seconds = (this.duration % 60).toString().padStart(2, '0'); - this.durationDisplay = `${minutes}:${seconds}`; - - setTimeout(() => { - this.calculateDuration(); - }, 1000) - } - - async loadFiles() { - - this.storage.get('fileName').then((fileName) => { - this.lastAudioRecorded = fileName; - }) - - try { - this.storage.get('recordData').then((recordData) => { - - if (recordData?.value?.recordDataBase64.includes('data:audio')) { - this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(recordData?.value?.recordDataBase64); - } - else if (recordData?.value?.mimeType && recordData?.value?.recordDataBase64) { - this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(`data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`); - } - }); - } catch (error) { } - - - } - - async startRecording() { - VoiceRecorder.requestAudioRecordingPermission(); - if (await VoiceRecorder.canDeviceVoiceRecord().then((result: GenericResponse) => { return result.value })) { - if (await VoiceRecorder.requestAudioRecordingPermission().then((result: GenericResponse) => { return result.value })) { - //if(await this.hasAudioRecordingPermission()){ - if (this.recording) { - return; - } - this.recording = true; - VoiceRecorder.startRecording(); - this.calculateDuration(); - //} - } - else { - this.toastService._badRequest('Para gravar uma mensagem de voz, permita o acesso do Gabinete Digital ao seu microfone.'); - } - } - else { - this.toastService._badRequest('Este dispositivo não tem capacidade para gravação de áudio!'); - } - } - - stopRecording() { - this.deleteRecording(); - this.allowTyping = false; - - if (!this.recording) { - return; - } - this.recording = false; - VoiceRecorder.stopRecording().then(async (result: RecordingData) => { - - this.recording = false; - if (result.value && result.value.recordDataBase64) { - const recordData = result.value.recordDataBase64; - // - const fileName = new Date().getTime() + ".mp3"; - //Save file - this.storage.set('fileName', fileName); - this.storage.set('recordData', result).then(() => { - - }) - } - }) - setTimeout(async () => { - this.loadFiles(); - }, 1000); - } - - async deleteRecording() { - this.storage.remove('fileName'); - this.storage.remove('recordData'); - - this.allowTyping = true; - this.lastAudioRecorded = ''; - this.loadFiles(); - } - - - - handlePress(id?: string) { - this.selectedMsgId = id; - this.showMessageOptions = true; - } - - handleClick() { - this.showMessageOptions = false; - this.selectedMsgId = ""; - } - - deleteMessage(msgId: string) { - const room = this.ChatSystemService.getDmRoom(this.roomId) - this.alertService.confirmDeleteMessage(msgId, room); - } - - - notImplemented() { - this.alertService.presentAlert('Funcionalidade em desenvolvimento'); - } - - close() { - this.modalController.dismiss(); - this.deleteRecording(); - } - - load() { - this.getChatMembers(); - } - - doRefresh(ev: any) { - this.load(); - ev.target.complete(); - } - - scrollToBottom(): void { - try { - if (this.scrollingOnce) { - this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight; - //this.scrollingOnce = false; - } - } catch (err) { } - } - - scrollToBottomClicked = () => { - try { - this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight; - } catch (err) { } - } - - async goToEvent(event: any) { - - let classs; - if (window.innerWidth < 701) { - classs = 'modal modal-desktop' - } else { - classs = 'modal modal-desktop showAsideOptions' - } - const modal = await this.modalController.create({ - component: ViewEventPage, - componentProps: { - eventId: event.id, - CalendarId: event.calendarId - }, - cssClass: classs, - }); - await modal.present(); - modal.onDidDismiss().then((res) => { - - }); - } - - onContentScrolled(e) { - this.startPosition = e.srcElement.scrollTop; - let scroll = e.srcElement.scrollTop; - let windowHeight = e.srcElement.scrollHeight; - let containerHeight = windowHeight - e.srcElement.clientHeight; - - if (scroll > this.currentPosition) { - } else { - this.scrollingOnce = false; - } - if ((containerHeight - 100) > scroll) { - this.scrollToBottomBtn = true; - } - else { - this.scrollToBottomBtn = false; - } - this.currentPosition = scroll; - - } - - ngOnDestroy() { - window.removeEventListener('scroll', this.scrollChangeCallback, true); - } - - sendMessage() { - this.ChatSystemService.getDmRoom(this.roomId).send({}).then(() => { - }) - } - - /* sendMessage(msg) { - let lastMsg = msg.pop(); - console.log(msg) - console.log(lastMsg._id,lastMsg.u.username,lastMsg.msg) - this.ChatSystemService.getDmRoom(this.roomId).send({}).then(() => { - if(lastMsg.u.username == this.members[1].username) { - this.notificationService.ChatSendMessageNotification(this.members[0].username,this.members[1].name,lastMsg.msg,this.roomId) - } else if (msg.u.username == this.members[0].username) { - this.notificationService.ChatSendMessageNotification(this.members[1].username,this.members[1].name,lastMsg.msg,this.roomId) - } - - }) - } */ - - async sendAudio(fileName) { - const roomId = this.roomId - let audioFile; - this.storage.get('recordData').then(async (recordData) => { - - audioFile = recordData; - if (recordData?.value?.recordDataBase64.includes('data:audio')) { - this.audioRecorded = recordData?.value?.recordDataBase64; - } - else if (recordData?.value?.mimeType && recordData?.value?.recordDataBase64) { - this.audioRecorded = `data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`; - } - - //Converting base64 to blob - const encodedData = btoa(this.audioRecorded); - const blob = this.fileService.base64toBlob(encodedData, recordData.value.mimeType) - - - const validation = await this.FileValidatorService.validateAudioFromBlob(blob) - - const formData = new FormData(); - formData.append("blobFile", blob); - - this.ChatSystemService.getDmRoom(roomId).send({ - file: { - "type": "application/audio", - "msDuration": audioFile.value.msDuration, - "mimeType": audioFile.value.mimeType, - }, - attachments: [{ - "title": sanitize(fileName), - "title_link_download": true, - "type": "audio" - }], - temporaryData: formData, - attachmentsModelData: { - fileBase64: encodedData, - } - }) - - }); - this.deleteRecording(); - } - - viewDocument(file: any, url?: string) { - - if (file.type == "application/webtrix") { - this.openViewDocumentModal(file); - } - else { - let fullUrl = "https://www.tabularium.pt" + url; - this.fileService.viewDocumentByUrl(fullUrl); - } - } - - - docIndex(index: number) { - this.dicIndex = index - } - - async openViewDocumentModal(file: any) { - - let task = { - serialNumber: '', - taskStartDate: '', - isEvent: true, - workflowInstanceDataFields: { - FolderID: '', - Subject: file.Assunto, - SourceSecFsID: file.ApplicationId, - SourceType: 'PDF', - SourceID: file.DocId, - DispatchNumber: '' - } - } - - let doc = { - "Id": "", - "ParentId": "", - "Source": 1, - "ApplicationId": file.ApplicationId, - "CreateDate": "", - "Data": null, - "Description": "", - "Link": null, - "SourceId": file.DocId, - "SourceName": file.Assunto, - "Stakeholders": "", - } - - const modal = await this.modalController.create({ - component: ViewDocumentPage, - componentProps: { - trustedUrl: '', - file: { - title: file.Assunto, - url: '', - title_link: '', - }, - Document: doc, - applicationId: file.ApplicationId, - docId: file.DocId, - folderId: '', - task: task - }, - cssClass: 'modal modal-desktop' - }); - await modal.present(); - } - - getChatMembers() { - // this.showLoader = true; - // this.chatService.getMembers(this.roomId).subscribe(res => { - // this.members = res['members']; - // this.dmUsers = res['members'].filter(data => data.username != this.sessionStore.user.UserName) - // this.showLoader = false; - // }); - - this.members = this.ChatSystemService.getDmRoom(this.roomId).members - this.dmUsers = this.ChatSystemService.getDmRoom(this.roomId).membersExcludeMe - } - - showDateDuration(start: any) { - let end; - end = new Date(); - start = new Date(start); - let customizedDate; - - const totalSeconds = Math.floor((end - (start)) / 1000);; - const totalMinutes = Math.floor(totalSeconds / 60); - const totalHours = Math.floor(totalMinutes / 60); - const totalDays = Math.floor(totalHours / 24); - - const hours = totalHours - (totalDays * 24); - const minutes = totalMinutes - (totalDays * 24 * 60) - (hours * 60); - const seconds = totalSeconds - (totalDays * 24 * 60 * 60) - (hours * 60 * 60) - (minutes * 60); - - if (totalDays == 0) { - if (start.getDate() == new Date().getDate()) { - let time = start.getHours() + ":" + this.addZero(start.getUTCMinutes()); - return time; - } - else { - return 'Ontem'; - } - } - else { - let date = start.getDate() + "/" + (start.getMonth() + 1) + "/" + start.getFullYear(); - return date; - } - } - - addZero(i) { - if (i < 10) { - i = "0" + i; - } - return i; - } - - async openMessagesOptions(ev?: any) { - const popover = await this.popoverController.create({ - component: MessagesOptionsPage, - componentProps: { - roomId: this.roomId, - }, - cssClass: 'messages-options', - event: ev, - translucent: true, - }); - return await popover.present(); - } - - async addContacts() { - const modal = await this.modalController.create({ - component: ContactsPage, - componentProps: {}, - cssClass: 'contacts', - backdropDismiss: false - }); - - - - modal.onDidDismiss(); - await modal.present(); - } - - async bookMeeting() { - let attendees = this.ChatSystemService.getDmRoom(this.roomId).members.map((val) => { - return { - Name: val.name, - EmailAddress: val.username + "@" + environment.domain, - IsRequired: "true", - } - }); - - this.popoverController.dismiss(); - if (window.innerWidth <= 1024) { - const modal = await this.modalController.create({ - component: NewEventPage, - componentProps: { - attendees: attendees, - roomId: this.roomId - }, - cssClass: 'modal modal-desktop', - backdropDismiss: false - }); - - modal.onDidDismiss().then((data) => { - if (data?.data && data.data.id) { - - // const roomId = this.roomId - - // this.ChatSystemService.getDmRoom(roomId).send({ - // file: { - // "type": "application/meeting", - // "subject": data.data.Subject, - // "start_date": data.data.StartDate, - // "end_date": data.data.EndDate, - // "venue": data.data.venue, - // "id": data.data.id, - // "calendarId": data.data.CalendarId - // }, - // temporaryData: {} - // }) - } - }); - - await modal.present(); - } - } - - - async takePicture() { - - const roomId = this.roomId - - const file = await Camera.getPhoto({ - quality: 90, - // allowEditing: true, - resultType: CameraResultType.Base64, - source: CameraSource.Camera - }); - - var imageBase64 = 'data:image/jpeg;base64,' + file.base64String - - - const compressedImage = await this.compressImageBase64( - imageBase64, - 800, // maxWidth - 800, // maxHeight - 0.9 // quality - ).then((picture) => { - console.log('Selected: ', picture) - imageBase64 = picture - }); - - //console.log(imageBase64) - const blob = this.dataURItoBlob(imageBase64) - - const formData = new FormData(); - formData.append("blobFile", blob); - - this.ChatSystemService.getDmRoom(roomId).send({ - file: { - "type": "application/img", - "guid": '' - }, - attachments: [{ - "title": "file.jpg", - "text": "description", - "title_link_download": false, - }], - temporaryData: formData, - attachmentsModelData: { - fileBase64: imageBase64, - } - }) - - } - - dataURItoBlob(dataURI) { - // convert base64 to raw binary data held in a string - // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this - var byteString = atob(dataURI.split(',')[1]); - - // separate out the mime component - var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0] - - // write the bytes of the string to an ArrayBuffer - var ab = new ArrayBuffer(byteString.length); - - // create a view into the buffer - var ia = new Uint8Array(ab); - - // set the bytes of the buffer to the correct values - for (var i = 0; i < byteString.length; i++) { - ia[i] = byteString.charCodeAt(i); - } - - // write the ArrayBuffer to a blob, and you're done - var blob = new Blob([ab], { type: mimeString }); - return blob; - - } - - async addImageMobile() { - this.addFileToChatMobile(['image/apng', 'image/jpeg', 'image/png']) - } - - async addImage() { - this.addFileToChat(['image/apng', 'image/jpeg', 'image/png']) - } - - async addFile() { - this.addFileToChat(['.doc', '.docx', '.pdf']) - } - - async addFileWebtrix() { - const modal = await this.modalController.create({ - component: SearchPage, - cssClass: 'group-messages modal-desktop search-modal search-modal-to-desktop', - componentProps: { - type: 'AccoesPresidenciais & ArquivoDespachoElect', - select: true, - showSearchInput: true, - } - }); - await modal.present(); - modal.onDidDismiss().then(async res => { - const data = res.data; - const roomId = this.roomId - - if (data.selected) { - - this.ChatSystemService.getDmRoom(roomId).send({ - file: { - "name": res.data.selected.Assunto, - "type": "application/webtrix", - "ApplicationId": res.data.selected.ApplicationType, - "DocId": res.data.selected.Id, - "Assunto": res.data.selected.Assunto, - }, - temporaryData: res, - attachments: [{ - "title": res.data.selected.Assunto, - "description": res.data.selected.DocTypeDesc, - // "title_link": url_no_options, - "title_link_download": true, - "thumb_url": "https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png", - // "message_link": url_no_options, - "text": res.data.selected.DocTypeDesc, - "type": "webtrix" - }], - }) - - } - }); - } - - async addFileToChatMobile(types: typeof FileType[]) { - const roomId = this.roomId - - const file = await Camera.getPhoto({ - quality: 90, - // allowEditing: true, - resultType: CameraResultType.Base64, - source: CameraSource.Photos - }); - - //const imageData = await this.fileToBase64Service.convert(file) - // - - var imageBase64 = 'data:image/jpeg;base64,' + file.base64String - - - const compressedImage = await this.compressImageBase64( - imageBase64, - 800, // maxWidth - 800, // maxHeight - 0.9 // quality - ).then((picture) => { - console.log('Selected: ', picture) - imageBase64 = picture - }); - - //console.log(imageBase64) - - const response = await fetch(imageBase64); - const blob = await response.blob(); - - const formData = new FormData(); - //console.log('add file', formData) - formData.append("blobFile", blob); - //console.log('add file', formData) - - this.ChatSystemService.getDmRoom(roomId).send({ - file: { - "type": "application/img", - "guid": '' - }, - temporaryData: formData, - attachments: [{ - "title": file.path, - "text": "description", - "title_link_download": false, - }], - attachmentsModelData: { - fileBase64: imageBase64, - } - }) - - } - - getFileReader(): FileReader { - const fileReader = new FileReader(); - const zoneOriginalInstance = (fileReader as any)["__zone_symbol__originalInstance"]; - return zoneOriginalInstance || fileReader; - } - - - _getBase64(file) { - return new Promise((resolve, reject) => { - var reader = new FileReader(); - reader.readAsDataURL(file); - reader.onload = function () { - resolve(reader.result) - }; - reader.onerror = function (error) { - console.log('Error: ', error); - }; - }) - } - - async addFileToChat(types: typeof FileType[]) { - console.log('add file ') - const roomId = this.roomId - - if (this.platform.is('ios')) { - console.log('ios add file ') - - const resultt = await FilePicker.pickFiles({ - types: ['application/pdf', 'application/doc', 'application/docx','application/xls', 'application/xlsx', 'application/ppt', - 'application/pptx', 'application/txt'], - multiple: false, - readData: true, - }); - - console.log('RESULT', resultt.files[0].data) - - const blobb = this.fileService.base64toBlob(resultt.files[0].data, resultt.files[0].mimeType) - const blob = new Blob([resultt.files[0].data], {type: resultt.files[0].mimeType}); - - const formDataa = new FormData(); - formDataa.append('blobFile', blobb); - /* console.log('add file', fileBase64) */ - - this.ChatSystemService.getDmRoom(roomId).send({ - file: { - "type": resultt.files[0].mimeType, - "guid": '', - }, - attachments: [{ - "title": sanitize(resultt.files[0].name), - "name": sanitize(resultt.files[0].name), - // "text": "description", - "title_link_download": false, - }], - temporaryData: formDataa, - attachmentsModelData: { - fileBase64: '', - } - }) - return - - } - - const file: any = await this.fileService.getFileFromDevice(types); - console.log(file) - - - /* const encodedData = btoa(JSON.stringify(await this.getBase64(file).catch ((error) => { - console.error(error); - }))); - const blob = this.fileService.base64toBlob(encodedData, file.type) - - const fileBase64 = await this._getBase64(file) - - const formData = new FormData(); - formData.append('blobFile', blob); - console.log('add file', fileBase64) */ - - const fileName = file.name - - const validation = this.FileValidatorService.fileNameValidation(fileName) - - if (validation.isOk) { - - const encodedData = btoa(JSON.stringify(await this.getBase64(file).catch((error) => { - console.error(error); - }))); - console.log(encodedData) - const blob = this.fileService.base64toBlob(encodedData, file.type) - - const formData = new FormData(); - formData.append('blobFile', blob); - /* console.log('add file', fileBase64) */ - - this.ChatSystemService.getDmRoom(roomId).send({ - file: { - "type": file.type, - "guid": '', - }, - attachments: [{ - "title": sanitize(fileName), - "name": sanitize(fileName), - // "text": "description", - "title_link_download": false, - }], - temporaryData: formData, - attachmentsModelData: { - fileBase64: encodedData, - } - }); - } else { - this.toastService._badRequest("Ficheiro inválido") - } - - } - - getBase64(file) { - var reader = this.getFileReader(); - reader.readAsDataURL(file); - return new Promise(resolve => { - reader.onload = function () { - resolve(reader.result) - }; - reader.onerror = function (error) { - - }; - }); - - } - - async openChatOptions(ev?: any) { - const roomId = this.roomId - - - const popover = await this.popoverController.create({ - component: ChatOptionsPopoverPage, - cssClass: 'chat-options-popover', - event: ev, - componentProps: { - room: this.roomId, - members: this.members, - eventSelectedDate: new Date(), - }, - translucent: true - }); - await popover.present(); - popover.onDidDismiss().then(async (res) => { - - if (res['data'] == 'meeting') { - this.bookMeeting(); - } - else if (res['data'] == 'take-picture') { - this.takePicture() - } - else if (res['data'] == 'add-picture') { - console.log('add-picture') - this.addImageMobile() - } - else if (res['data'] == 'add-document') { - this.addFile() - } - else if (res['data'] == 'documentoGestaoDocumental') { - - this.addFileWebtrix() - } - - - }); - } - - - // getRoomMessageDB(roomId) { - // if (this.platform.is('desktop') || this.platform.is('mobileweb')) { - // } else { - // this.sqlservice.getAllChatMSG(roomId).then((msg: any) => { - - // let chatmsgArray = []; - // msg.forEach(element => { - - - // let msgChat = { - // _id: element.Id, - // attachments: this.isJson(element.Attachments), - // channels: this.isJson(element.Channels), - // file: this.isJson(element.File), - // mentions: this.isJson(element.Mentions), - // msg: element.Msg, - // rid: element.Rid, - // ts: element.Ts, - // u: this.isJson(element.U), - // _updatedAt: element.UpdatedAt, - // image_url: this.isJson(element.image_url) - // } - - // chatmsgArray.push(msgChat) - // }); - - - - // }) - // } - // } - - isJson(str) { - try { - JSON.parse(str); - } catch (e) { - return ""; - } - return JSON.parse(str); - } - - - - transformDataMSG(res) { - if (this.platform.is('desktop') || this.platform.is('mobileweb')) { - } else { - res.forEach(element => { - - let chatmsg = { - _id: element._id, - attachments: element.attachments, - channels: element.channels, - file: element.file, - mentions: element.mentions, - msg: element.msg, - rid: element.rid, - ts: element.ts, - u: element.u, - _updatedAt: element._updatedAt, - /* image_url: { - name: name, - path: `${IMAGE_DIR}/${name}`, - data: `data:image/jpeg;base64,${readFile.data}`, - }, */ - } - - // this.sqlservice.addChatMSG(chatmsg) - - }); - } - - } - - /* testeDownload(msg: MessageService) { - this.downloadFile = ""; - this.AttachmentsService.downloadFileAndStore(msg.file.guid); - } */ - - - downloadFileMsg(msg: MessageService) { - msg.downloadFileMsg(); - } - - b64toBlob(b64Data, contentType) { - contentType = contentType || ''; - var sliceSize = 512; - b64Data = b64Data.replace(/^[^,]+,/, ''); - b64Data = b64Data.replace(/\s/g, ''); - var byteCharacters = window.atob(b64Data); - var byteArrays = []; - - for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) { - var slice = byteCharacters.slice(offset, offset + sliceSize); - - var byteNumbers = new Array(slice.length); - for (var i = 0; i < slice.length; i++) { - byteNumbers[i] = slice.charCodeAt(i); - } - - var byteArray = new Uint8Array(byteNumbers); - - byteArrays.push(byteArray); - } - - var blob = new Blob(byteArrays, { type: contentType }); - return blob; - } - - blobToBase64(blob) { - return new Promise((resolve, _) => { - const reader = new FileReader(); - reader.onloadend = () => resolve(reader.result); - reader.readAsDataURL(blob); - }); - } - - async openFile(pdfString, filename, type) { - - console.log('url while open ',pdfString) - - /* const modal = await this.modalController.create({ - component: ViewDocumentSecondOptionsPage, - componentProps: { - fileUrl: pdfString, - filename: filename - }, - cssClass: 'modal modal-desktop' - }); - await modal.present(); -/* - await modal.present(); */ - - var blob = new Blob([pdfString], { type: 'application/pdf' }); - - console.log('blob blob', blob) - - this.blobToBase64(blob).then((value) => { - console.log(value) - }).catch((error) => { - console.log(error) - }) - - let pathFile = '' - const fileName = filename - if (this.platform.is('ios')) { - pathFile = this.file.documentsDirectory - } else { - pathFile = this.file.externalRootDirectory - } - - console.log('file data', pdfString) - console.log(pathFile) - - let removePre = this.removeTextBeforeSlash(pdfString,',') - console.log('file data remove ', removePre) - - await Filesystem.writeFile({ - path: fileName, - data: removePre, - directory: Directory.Cache, - }).then((dir) => { - console.log('DIR ', dir) - this.fileOpener - .open(dir.uri, type) - .then(() => console.log()) - .catch(e => console.error(e)) - }).catch((error) => { - console.log('error writing the file', error) - }); - } - - removeTextBeforeSlash(inputString, controlString) { - if (inputString.includes(controlString)) { - const parts = inputString.split(controlString); - return parts.length > 1 ? parts[1] : inputString; - } else { - return inputString; - } - } - - downloadFileFromBrowser(fileName: string, data: any): void { - const linkSource = data; - const downloadLink = document.createElement("a"); - downloadLink.href = linkSource; - downloadLink.download = fileName; - downloadLink.click(); - } - - - async openPreview(msg) { - - - if (msg.file.type === "application/webtrix") { - this.viewDocument(msg.file, msg.attachments.image_url) - } else { - - if (!msg.attachments[0].image_url || msg.attachments[0].image_url === null || msg.attachments[0].image_url === '') { - this.downloadFileMsg(msg) - //this.testDownlod(msg) - - } else { - var str = msg.attachments[0].image_url; - str = str.substring(1, ((str.length) - 1)); - - if (this.platform.is('desktop') || this.platform.is('mobileweb')) { - - console.log(msg) - - if (msg.file.type == "application/img") { - const modal = await this.modalController.create({ - component: ViewMediaPage, - cssClass: 'modal modal-desktop', - componentProps: { - image: msg.attachments[0].image_url, - type: msg.file.type, - username: msg.u.name, - _updatedAt: msg._updatedAt - } - }); - modal.present(); - } else { - - this.downloadFileFromBrowser("file", str) - this.downloadFileFromBrowser(msg.attachments[0].title, str) - - this.downloadFileFromBrowser(msg.attachments[0].title, str) - - } - - } else { - if (msg.file.type == "application/img") { - const modal = await this.modalController.create({ - component: ViewMediaPage, - cssClass: 'modal modal-desktop', - componentProps: { - image: msg.attachments[0].image_url, - type: msg.file.type, - username: msg.u.name, - _updatedAt: msg._updatedAt - } - }); - modal.present(); - } else { - this.openFile(msg.attachments[0].image_url, msg.attachments[0].title, msg.file.type); - } - } - - } - } - - } - - async audioPreview(msg) { - - if (!msg.attachments[0].title_link || msg.attachments[0].title_link === null || msg.attachments[0].title_link === '') { - this.downloadFileMsg(msg) - } else { } - } - - - imageSize(img) { - var canvas = document.createElement('canvas'); - var ctx = canvas.getContext('2d'); - canvas.width = 300 - canvas.height = 234 - ctx.drawImage(img.attachments[0].image_url, 0, 0, 300, 234); - document.body.appendChild(canvas); - } - - getPicture(img) { - var canvas = document.createElement('canvas'); - var ctx = canvas.getContext('2d'); - canvas.width = 300 - canvas.height = 234 - ctx.drawImage(img.attachments[0].image_url, 0, 0, 300, 234); - document.body.appendChild(canvas); - - } - - - // async ShareEmail(msg){ - // // Check if sharing via email is supported - // await Share.share({ - // title: msg.u.username, - // text: msg._updatedAt, - // url: msg.attachments[0].image_url, - // dialogTitle: 'Share with buddies', - // }); - // } - - async createDirectoryImage() { - await Filesystem.mkdir({ - path: IMAGE_DIR, - directory: Directory.Data, - recursive: true - }); - } - - async compressImageBase64(base64String: string, maxWidth: number, maxHeight: number, quality: number): Promise { - return new Promise((resolve, reject) => { - const image = new (window as any).Image(); - image.src = base64String; - - image.onload = async () => { - const canvas = document.createElement('canvas'); - let newWidth = image.width; - let newHeight = image.height; - - if (newWidth > maxWidth) { - newHeight *= maxWidth / newWidth; - newWidth = maxWidth; - } - - if (newHeight > maxHeight) { - newWidth *= maxHeight / newHeight; - newHeight = maxHeight; - } - - canvas.width = newWidth; - canvas.height = newHeight; - - const context = canvas.getContext('2d'); - context?.drawImage(image, 0, 0, newWidth, newHeight); - - const compressedBase64 = canvas.toDataURL('image/jpeg', quality); - resolve(compressedBase64); - }; - - image.onerror = (error) => { - reject(error); - }; - }); - } - - dataURItoBlobIso(dataURI: any) { - const byteString = window.atob(dataURI); - const arrayBuffer = new ArrayBuffer(byteString.length); - const int8Array = new Uint8Array(arrayBuffer); - for (let i = 0; i < byteString.length; i++) { - int8Array[i] = byteString.charCodeAt(i); - } - const blob = new Blob([int8Array], { type: 'application/pdf' }); - return blob; - } - -} - - - diff --git a/src/app/pages/events/events.page.html b/src/app/pages/events/events.page.html index d6cb0cd8d..521424752 100644 --- a/src/app/pages/events/events.page.html +++ b/src/app/pages/events/events.page.html @@ -16,6 +16,8 @@ + + diff --git a/src/app/pages/events/events.page.ts b/src/app/pages/events/events.page.ts index 89a722e7c..6700d3315 100644 --- a/src/app/pages/events/events.page.ts +++ b/src/app/pages/events/events.page.ts @@ -18,6 +18,8 @@ import { TaskService } from 'src/app/services/task.service'; import { AgendaDataRepositoryService } from 'src/app/module/agenda/data/repository/agenda-data-repository.service'; import { EEventFilterStatus } from 'src/app/module/agenda/data/dto/enums'; import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { Observable } from 'rxjs'; + @Component({ selector: 'app-events', @@ -70,7 +72,6 @@ export class EventsPage implements OnInit { agendaColor = '' - filterName: 'Para hoje' | 'Novos'| 'Lidos'| 'Não lidos'| 'OverdueTasks' | 'Todos' = 'Não lidos' showSearch = true; searchSubject: string = ''; @@ -80,6 +81,7 @@ export class EventsPage implements OnInit { delete(): void; } + count$: Observable; constructor( private eventService: EventsService, @@ -161,6 +163,7 @@ export class EventsPage implements OnInit { } + async dynamicSearch() { const ordinance = this.ordinance diff --git a/src/app/pages/gabinete-digital/expediente/expediente-detail/expediente-detail.page.ts b/src/app/pages/gabinete-digital/expediente/expediente-detail/expediente-detail.page.ts index dfdfc11a1..ea30d5e16 100644 --- a/src/app/pages/gabinete-digital/expediente/expediente-detail/expediente-detail.page.ts +++ b/src/app/pages/gabinete-digital/expediente/expediente-detail/expediente-detail.page.ts @@ -22,7 +22,7 @@ import { ThemeService } from 'src/app/services/theme.service' import { EventTrigger } from 'src/app/services/eventTrigger.service'; import { Platform } from '@ionic/angular'; import { BackgroundService } from 'src/app/services/background.service'; -import { NewGroupPage } from 'src/app/pages/chat/new-group/new-group.page'; +import { NewGroupPage } from 'src/app/ui/chat/modal/new-group/new-group.page'; import { DataService } from 'src/app/services/data.service'; import { RouteService } from 'src/app/services/route.service'; import { Storage } from '@ionic/storage'; diff --git a/src/app/pages/gabinete-digital/pedidos/pedido/pedido.page.ts b/src/app/pages/gabinete-digital/pedidos/pedido/pedido.page.ts index 5b6e7f36c..d90913c4c 100644 --- a/src/app/pages/gabinete-digital/pedidos/pedido/pedido.page.ts +++ b/src/app/pages/gabinete-digital/pedidos/pedido/pedido.page.ts @@ -21,7 +21,7 @@ import { PermissionService } from 'src/app/services/permission.service'; import { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page'; import { ThemeService } from 'src/app/services/theme.service' import { DataService } from 'src/app/services/data.service'; -import { NewGroupPage } from 'src/app/pages/chat/new-group/new-group.page'; +import { NewGroupPage } from 'src/app/ui/chat/modal/new-group/new-group.page'; import { RouteService } from 'src/app/services/route.service'; import { SessionStore } from 'src/app/store/session.service'; import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; diff --git a/src/app/pages/login/login.page.ts b/src/app/pages/login/login.page.ts index 9716ba458..d03bd6fb6 100644 --- a/src/app/pages/login/login.page.ts +++ b/src/app/pages/login/login.page.ts @@ -11,20 +11,15 @@ import { ClearStoreService } from 'src/app/services/clear-store.service'; import { ChangeProfileService } from 'src/app/services/change-profile.service'; import { ThemeService } from 'src/app/services/theme.service'; import { PermissionService } from 'src/app/services/permission.service'; -import { MessageModel, DeleteMessageModel } from '../../models/beast-orm'; -import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; -import { ChatService } from 'src/app/services/chat.service'; import { NotificationHolderService } from 'src/app/store/notification-holder.service'; import { Platform } from '@ionic/angular'; -import { FirstEnterService } from '../../services/first-enter.service'; import { Storage } from '@ionic/storage'; -import { CPSession } from 'src/app/store/documentManagement'; import { StorageService } from 'src/app/services/storage.service'; -import { DeviceService } from 'src/app/services/device.service' import { Cy } from 'cypress/enum' import { AgendaDataRepositoryService } from 'src/app/module/agenda/data/repository/agenda-data-repository.service'; import { NotificationRepositoryService } from 'src/app/module/notification/data/notification-repository.service' +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; + @Component({ selector: 'app-login', templateUrl: './login.page.html', @@ -56,17 +51,15 @@ export class LoginPage implements OnInit { private changeProfileService: ChangeProfileService, public ThemeService: ThemeService, public p: PermissionService, - private RochetChatConnectorService: RochetChatConnectorService, - public ChatSystemService: ChatSystemService, - private ChatService: ChatService, + // public ChatSystemService: ChatSystemService, private platform: Platform, - private FirstEnterService: FirstEnterService, private storage: Storage, private storageService: StorageService, private NotificationHolderService: NotificationHolderService, - private DeviceService: DeviceService, public AgendaDataRepositoryService: AgendaDataRepositoryService, - private NotificationRepositoryService: NotificationRepositoryService + private NotificationRepositoryService: NotificationRepositoryService, + private ChatServiceService: ChatServiceService + ) { } ngOnInit() { } @@ -147,7 +140,6 @@ export class LoginPage implements OnInit { if (attempt.UserId == SessionStore.user.UserId) { await this.authService.SetSession(attempt, this.userattempt); - /* CPSession.save(data) */ this.changeProfileService.run(); if (attempt.ChatData) { @@ -155,12 +147,10 @@ export class LoginPage implements OnInit { try { await this.AgendaDataRepositoryService.getSharedCalendar() - await MessageModel.deleteAll(); - await DeleteMessageModel.deleteAll(); - this.ChatSystemService.clearChat(); + this.NotificationHolderService.clear() await this.authService.loginToChatWs(); - this.ChatService.setheader() + this.NotificationRepositoryService.init() @@ -184,29 +174,22 @@ export class LoginPage implements OnInit { await this.NotificationRepositoryService.clearData() await this.AgendaDataRepositoryService.clearSharedCalendar() - this.RochetChatConnectorService.logout(); + this.clearStoreService.clear(); - this.ChatSystemService.clearChat(); + // this.ChatSystemService.clearChat(); this.NotificationHolderService.clear() SessionStore.delete(); window.localStorage.clear(); - await MessageModel.deleteAll(); - await DeleteMessageModel.deleteAll(); - CPSession.clear(); this.storage.clear(); await this.authService.SetSession(attempt, this.userattempt); this.NotificationRepositoryService.init() /* CPSession.save(data) */ + this.changeProfileService.run(); - - - if (attempt.ChatData) { - await this.authService.loginToChatWs(); - this.ChatService.setheader(); - } this.storageService.remove("Notifications") + this.getToken(); if (!this.platform.is('desktop') && !this.platform.is('mobileweb')) { diff --git a/src/app/pages/publications/new-publication/new-publication.page.ts b/src/app/pages/publications/new-publication/new-publication.page.ts index 506c05798..fd442e9bc 100644 --- a/src/app/pages/publications/new-publication/new-publication.page.ts +++ b/src/app/pages/publications/new-publication/new-publication.page.ts @@ -19,7 +19,8 @@ import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; import { PublicationFolderService } from 'src/app/store/publication-folder.service'; import { FileService } from 'src/app/services/functions/file.service'; import { FilePicker } from '@capawesome/capacitor-file-picker'; -import { CaptureImageOptions, MediaCapture } from '@awesome-cordova-plugins/media-capture/ngx'; +import { CaptureError, CaptureImageOptions, MediaCapture, MediaFile } from '@awesome-cordova-plugins/media-capture/ngx'; +import { Media } from '@ionic-native/media/ngx'; import { checkFileTypeService } from 'src/app/services/checkFileType.service'; import { App } from '@capacitor/app'; import { NavigationExtras, Router } from '@angular/router'; @@ -117,6 +118,7 @@ export class NewPublicationPage implements OnInit { private modalController: ModalController, public photoService: PhotoService, private navParams: NavParams, + private toastService: ToastService, public ThemeService: ThemeService, private platform: Platform, public imageCompress: NgxImageCompressService, diff --git a/src/app/pipes/safe.pipe.spec.ts b/src/app/pipes/safe.pipe.spec.ts deleted file mode 100644 index 49ee0ad14..000000000 --- a/src/app/pipes/safe.pipe.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { SafePipe } from './safe.pipe'; - -describe('SafePipe', () => { - it('create an instance', () => { - const pipe = new SafePipe(); - expect(pipe).toBeTruthy(); - }); -}); diff --git a/src/app/pipes/safehtml.pipe.spec.ts b/src/app/pipes/safehtml.pipe.spec.ts deleted file mode 100644 index dbc4806e0..000000000 --- a/src/app/pipes/safehtml.pipe.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { SafehtmlPipe } from './safehtml.pipe'; - -describe('SafehtmlPipe', () => { - it('create an instance', () => { - const pipe = new SafehtmlPipe(); - expect(pipe).toBeTruthy(); - }); -}); diff --git a/src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts b/src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts index 1067c0b71..d48fdb46c 100644 --- a/src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts +++ b/src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts @@ -1,8 +1,25 @@ import { Injectable } from '@angular/core'; -import { HttpService } from 'src/app/services/http.service'; -import { UserListOutOutDTO } from '../DTO/userListOutput'; -import { ContactCombinedOutputDTO, EventListDataOutputDTOSchema } from '../DTO/contactsCombined'; import { APIReturn } from 'src/app/services/decorator/api-validate-schema.decorator'; +import { HttpService } from 'src/app/services/http.service'; +import { ContactCombinedOutputDTO, EventListDataOutputDTOSchema } from '../DTO/contactsCombined'; + +export interface UserContacts { + wxUserId: number; + wxFullName: string; + wxeMail: string | null; + userPhoto: string | null; +} + +export interface UserListResult { + total: number, + result: UserContacts[] +} + +export interface UserList { + success: boolean; + message: string; + data: UserListResult; +} @Injectable({ providedIn: 'root' @@ -14,13 +31,13 @@ export class ContactsDataSourceService { constructor(private httpService: HttpService) {} + async getUsers() { + return await this.httpService.get(`${this.baseUrl}/Users`); + } + @APIReturn(EventListDataOutputDTOSchema, '/Contacts/Combined') async getCombinedList() { return await this.httpService.get(`${this.baseUrl}/Contacts/Combined`); } - - async getUsers() { - return await this.httpService.get(`${this.baseUrl}/Users`); - } } diff --git a/src/app/services/Repositorys/type.ts b/src/app/services/Repositorys/type.ts new file mode 100644 index 000000000..0e64a9457 --- /dev/null +++ b/src/app/services/Repositorys/type.ts @@ -0,0 +1,5 @@ +import { HttpErrorResponse } from "@angular/common/http"; +import { Result } from "neverthrow"; +import { ZodError } from "zod"; + +export type DataSourceReturn = Promise> diff --git a/src/app/services/alert.service.ts b/src/app/services/alert.service.ts index e3f6895fe..08798eecd 100644 --- a/src/app/services/alert.service.ts +++ b/src/app/services/alert.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { AlertController, AnimationController } from '@ionic/angular'; -import { ChatSystemService } from './chat/chat-system.service'; +// import { ChatSystemService } from './chat/chat-system.service'; import { ToastService } from './toast.service'; @Injectable({ @@ -12,7 +12,7 @@ export class AlertService { public alertController: AlertController, private animationController: AnimationController, private toastService: ToastService, - public ChatSystemService: ChatSystemService, + // public ChatSystemService: ChatSystemService, ) { } async presentAlert(message:string) { @@ -58,9 +58,9 @@ export class AlertService { handler: () => { //const loader = this.toastService.loading(); - this.ChatSystemService.deleteMessage(msgId).then(() => { - room.deleteMessage(msgId) - }).catch((error) => console.error(error)) + // this.ChatSystemService.deleteMessage(msgId).then(() => { + // room.deleteMessage(msgId) + // }).catch((error) => console.error(error)) //this.ChatSystemService.subscribeToRoomUpdate(room._id, room); //loader.remove(); } diff --git a/src/app/services/auth.service.ts b/src/app/services/auth.service.ts index a9357580d..5b0e2b780 100644 --- a/src/app/services/auth.service.ts +++ b/src/app/services/auth.service.ts @@ -7,20 +7,19 @@ import { BehaviorSubject, of } from 'rxjs'; import { AlertController, Platform } from '@ionic/angular'; import { SessionStore } from '../store/session.service'; import { AESEncrypt } from '../services/aesencrypt.service'; -import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service'; +// import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service'; import { Router } from '@angular/router'; -import { NfService } from 'src/app/services/chat/nf.service'; -import { MessageService } from 'src/app/services/chat/message.service'; +// import { NfService } from 'src/app/services/chat/nf.service'; +//import { MessageService } from 'src/app/services/chat/message.service'; import { ProcessesService } from 'src/app/services/processes.service'; import { AttachmentsService } from 'src/app/services/attachments.service'; -import { RoomService } from './chat/room.service'; +//import { RoomService } from './chat/room.service'; import { Storage } from '@ionic/storage'; import { InitialsService } from './functions/initials.service'; import { PermissionService } from './permission.service'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; +// import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; import { captureException } from '@sentry/angular'; -import { CPSession } from '../store/documentManagement'; import { catchError, tap } from 'rxjs/operators'; @Injectable({ providedIn: 'root' @@ -40,15 +39,15 @@ export class AuthService { private storageService: StorageService, public alertController: AlertController, private aesencrypt: AESEncrypt, - private RochetChatConnectorService: RochetChatConnectorService, + // private RochetChatConnectorService: RochetChatConnectorService, private router: Router, - private NfService: NfService, + // private NfService: NfService, private processesService: ProcessesService, private AttachmentsService: AttachmentsService, private storage: Storage, private initialsService: InitialsService, public p: PermissionService, - public ChatSystemService: ChatSystemService, + // public ChatSystemService: ChatSystemService, private httpErroHandle: HttpErrorHandle, private errorHandler: ErrorHandler, private platform: Platform,) { @@ -183,110 +182,63 @@ export class AuthService { setTimeout(() => { if (SessionStore.user.ChatData?.data) { - this.RochetChatConnectorService.logout(); - this.RochetChatConnectorService.connect(); - this.RochetChatConnectorService.login().then((message: any) => { - // console.log('Chat login', message) + // this.RochetChatConnectorService.logout(); + // this.RochetChatConnectorService.connect(); + // this.RochetChatConnectorService.login().then((message: any) => { + // console.log('Chat login', message) - SessionStore.user.RochetChatUserId = message.result.id - SessionStore.save() + // SessionStore.user.RochetChatUserId = message.result.id + // SessionStore.save() - this.ChatSystemService.loadChat() - this.RochetChatConnectorService.setStatus('online') - window['RochetChatConnectorService'] = this.RochetChatConnectorService - setTimeout(() => { - this.ChatSystemService.getAllRooms(); - this.RochetChatConnectorService.setStatus('online') - }, 200); + // this.ChatSystemService.loadChat() + // this.RochetChatConnectorService.setStatus('online') + // window['RochetChatConnectorService'] = this.RochetChatConnectorService + // setTimeout(() => { + // this.ChatSystemService.getAllRooms(); + // this.RochetChatConnectorService.setStatus('online') + // }, 200); - }).catch((error) => { - console.error(SessionStore.user.ChatData, 'web socket login', error) + // }).catch((error) => { + // console.error(SessionStore.user.ChatData, 'web socket login', error) - if(window.location.pathname.includes('/home/')) { - setTimeout(() => { - this.loginToChatWs(); - }, 4000) - } + // if(window.location.pathname.includes('/home/')) { + // setTimeout(() => { + // this.loginToChatWs(); + // }, 4000) + // } - }) + // }) } // before sending a message with a attachment - this.NfService.beforeSendAttachment = async (message: MessageService, room?: RoomService) => { +8 + // this.NfService.downloadFileMsg = async (message: MessageService, room?: RoomService) => { - if (message.hasFile) { - if (message.file.type != 'application/webtrix') { - const formData = message.temporaryData + // // + // let downloadFile = ""; + // if (message.file.type == "application/img") { + // const event: any = await this.AttachmentsService.downloadFile(message.file.guid).toPromise(); - try { - let guid: any = await this.AttachmentsService.uploadFile(formData).toPromise() - message.file.guid = guid.path + // if (event.type === HttpEventType.DownloadProgress) { + // //this.downloadProgess = Math.round((100 * event.loaded) / event.total); + // return true + // } else if (event.type === HttpEventType.Response) { + // downloadFile = 'data:image/jpeg;base64,' + btoa(new Uint8Array(event.body).reduce((data, byte) => data + String.fromCharCode(byte), '')); - message.downloadFileMsg() - message.uploadingFile = false + // message.file = { + // guid: message.file.guid, + // image_url: downloadFile, + // type: message.file.type + // } - return true - } catch (e) { - window['e'] = e - console.error('BeforesendAtachment', e) - message.uploadingFile = false - this.httpErroHandle.httpStatusHandleUploadFile(e); - return false - } - - } else { - try { - const res = message.temporaryData - - let url = await this.processesService.GetDocumentUrl(res.data.selected.Id, res.data.selected.ApplicationType).toPromise(); - - let url_no_options: string = url.replace("webTRIX.Viewer", "webTRIX.Viewer.Branch1"); - message.attachments[0].title_link = url_no_options - message.attachments[0].message_link = url_no_options - - message.uploadingFile = false - - return true - } catch (e) { - window['e'] = e - console.error('BeforesendAtachment', e) - message.uploadingFile = false - this.httpErroHandle.httpStatusHandleUploadFile(e); - return false - } - } - } - - return false - } - - this.NfService.downloadFileMsg = async (message: MessageService, room?: RoomService) => { - - // - let downloadFile = ""; - if (message.file.type == "application/img") { - const event: any = await this.AttachmentsService.downloadFile(message.file.guid).toPromise(); - - if (event.type === HttpEventType.DownloadProgress) { - //this.downloadProgess = Math.round((100 * event.loaded) / event.total); - return true - } else if (event.type === HttpEventType.Response) { - downloadFile = 'data:image/jpeg;base64,' + btoa(new Uint8Array(event.body).reduce((data, byte) => data + String.fromCharCode(byte), '')); - - message.file = { - guid: message.file.guid, - image_url: downloadFile, - type: message.file.type - } - - return true - } - return false - } - }; + // return true + // } + // return false + // } + // }; }, 1) } diff --git a/src/app/services/cache-service.service.spec.ts b/src/app/services/cache-service.service.spec.ts deleted file mode 100644 index 8856eceeb..000000000 --- a/src/app/services/cache-service.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { CacheServiceService } from './cache-service.service'; - -describe('CacheServiceService', () => { - let service: CacheServiceService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(CacheServiceService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/services/chat.service.ts b/src/app/services/chat.service.ts deleted file mode 100644 index 5d8072ddb..000000000 --- a/src/app/services/chat.service.ts +++ /dev/null @@ -1,435 +0,0 @@ -import { HttpHeaders, HttpParams } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { HttpService } from './http.service'; -import { StorageService } from './storage.service'; -import { HttpClient } from '@angular/common/http'; -import { environment } from 'src/environments/environment'; -import { Storage } from '@ionic/storage'; -import { PermissionService } from './permission.service'; -import { SessionStore } from '../store/session.service'; -import { ChangeProfileService } from 'src/app/services/change-profile.service'; -import { NetworkServiceService , ConnectionStatus} from 'src/app/services/network-service.service'; -import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service'; - -@Injectable({ - providedIn: 'root' -}) -export class ChatService { - headers: HttpHeaders; - options: any; - options1: any; - X_User_Id: any; - X_Auth_Token: any; - loggedUserChat: any; - bindOnMessage: any; - - constructor( - private http: HttpClient, - private httpService: HttpService, - private storage: Storage, - private storageService: StorageService, - public p: PermissionService, - private changeProfileService: ChangeProfileService, - private NetworkServiceService: NetworkServiceService, - private RochetChatConnectorService: RochetChatConnectorService) { - - this.changeProfileService.registerCallback(() => { - this.setheader(); - }) - - } - - getDocumentDetails(url: string) { - let headersc = new HttpHeaders(); - headersc = headersc.set('X-User-Id', SessionStore.user.ChatData.data.userId); - headersc = headersc.set('X-Auth-Token', SessionStore.user.ChatData.data.authToken); - headersc = headersc.set('Sec-Fetch-Dest', 'attachment'); - headersc = headersc.set('Sec-Fetch-Mode', 'navigate'); - headersc = headersc.set('Cookie', 'rc_uid=fsMwcNdufWvdnChj7'); - headersc = headersc.set('Cookie', 'rc_token=MLbhikLQI4xo9_vL43HqheKPPbxjag7hKfwxe9AjcvY'); - // headersc = headersc.set("Host", "www.tabularium.pt"); - // headersc = headersc.set("Origin", "http://localhost:8100"); - headersc = headersc.set('Referer', 'http://localhost:8100/'); - let optionsc = { - headers: headersc, - withCredentials: true - }; - // let fullUrl = "https://www.tabularium.pt/" + url; - return this.http.get(url, optionsc).subscribe(() => { - // this.fileService.viewDocumentByUrl(url) - }); - } - - getAllChannels() { - return this.http.get(environment.apiChatUrl + 'channels.list', this.options); - } - - getAllUserChannels() { - return this.http.get(environment.apiChatUrl + 'channels.list.joined', this.options); - } - - getAllRooms() { - return this.http.get(environment.apiChatUrl + 'rooms.get', this.options); - } - - getRoomInfo(roomId: any) { - let params = new HttpParams(); - params = params.set("roomId", roomId); - let opts = { - headers: this.headers, - params: params - } - return this.http.get(environment.apiChatUrl + 'rooms.info', opts); - } - - - GetSubscriptionRoomUnreadM(roomId) { - let params = new HttpParams(); - params = params.set("roomId", roomId); - let opts = { - headers: this.headers, - params: params - } - return this.http.get(environment.apiChatUrl + 'subscriptions.getOne', opts); - } - - getChannelInfo(roomId: any) { - let params = new HttpParams(); - params = params.set("roomId", roomId); - params = params.set("unread", "true"); - let opts = { - headers: this.headers, - params: params - } - return this.http.get(environment.apiChatUrl + 'rooms.info', opts); - } - - customsRooms(params: any) { - let opts = { - headers: this.headers, - params: params - } - return this.http.get(environment.apiChatUrl + 'rooms.get', opts); - } - getAllPrivateGroups() { - return this.http.get(environment.apiChatUrl + 'groups.list', this.options); - } - - getAllUsers() { - return this.http.get(environment.apiChatUrl + 'users.list', this.options); - } - getAllConnectedUsers() { - return this.http.get(environment.apiChatUrl + 'users.presence', this.options); - } - - //Load messages from roomId - getAllDirectMessages() { - return this.http.get(environment.apiChatUrl + 'im.list', this.options); - } - //Load messages from roomId - getRoomMessages(roomId: any) { - - let params = new HttpParams(); - params = params.set("roomId", roomId); - - let opts = { - headers: this.headers, - params: params, - } - return this.http.get(environment.apiChatUrl + 'im.history', opts); - } - - sendMessage(body: any) { - let opts = { - headers: this.headers, - } - return this.http.post(environment.apiChatUrl + 'chat.sendMessage', body, opts); - } - - uploadFile(formData: any, rid: string) { - let url = environment.apiChatUrl + 'rooms.upload/' + rid; - let opts = { - headers: this.headers, - } - return this.http.post(url, formData, opts); - } - - deleteMessage(body: any) { - let opts = { - headers: this.headers, - } - return this.http.post(environment.apiChatUrl + 'chat.delete', body, opts); - } - - leaveRoom(body: any) { - let opts = { - headers: this.headers, - } - return this.http.post(environment.apiChatUrl + 'rooms.leave', body, opts); - } - //Load members from a chat - getMembers(roomId: any) { - - let params = new HttpParams(); - params = params.set("roomId", roomId); - - let opts = { - headers: this.headers, - params: params - } - return this.http.get(environment.apiChatUrl + 'im.members', opts); - } - - getMemberInfo(userId: string) { - let params = new HttpParams(); - params = params.set("userId", userId); - - let opts = { - headers: this.headers, - params: params - } - return this.http.get(environment.apiChatUrl + 'users.info', opts); - } - - setUserStatus(body: any) { - let opts = { - headers: this.headers, - } - return this.http.post(environment.apiChatUrl + 'users.setStatus', body, this.options); - } - - removeChatRoom(body: any) { - let opts = { - headers: this.headers, - } - return this.http.post(environment.apiChatUrl + 'im.delete', body, this.options); - } - - createRoom(body: any) { - return this.http.post(environment.apiChatUrl + 'im.create', body, this.options); - } - getDirectMessage(roomId: string) { - let params = new HttpParams(); - params = params.set("roomId", roomId); - - let opts = { - headers: this.headers, - params: params - } - return this.http.get(environment.apiChatUrl + 'im.messages', opts); - } - - /* GROUPS */ - addGroup(body: any) { - - return this.http.post(environment.apiChatUrl + 'groups.create', body, this.options); - } - setGroupCustomFields(body: any) { - return this.http.post(environment.apiChatUrl + 'groups.setCustomFields', body, this.options); - } - - getGroupMembers(roomId: string) { - let params = new HttpParams(); - let url = environment.apiChatUrl + 'groups.members'; - params = params.set("roomId", roomId); - - let opts = { - headers: this.headers, - params: params - } - return this.http.get(url, opts); - } - - getChannelMembers(roomId: string) { - let params = new HttpParams(); - let url = environment.apiChatUrl + 'channels.members'; - params = params.set("roomId", roomId); - - let opts = { - headers: this.headers, - params: params - } - return this.http.get(url, opts); - } - /* GROUP MESSAGES */ - getPrivateGroupMessages(roomId: any) { - - let params = new HttpParams(); - params = params.set("roomId", roomId); - - let opts = { - headers: this.headers, - params: params - } - return this.http.get(environment.apiChatUrl + 'groups.history', opts); - } - getPublicGroupMessages(roomId: any) { - let params = new HttpParams(); - params = params.set("roomId", roomId); - - let opts = { - headers: this.headers, - params: params - } - return this.http.get(environment.apiChatUrl + 'channels.history', opts); - } - closeGroup(body: any) { - return this.http.post(environment.apiChatUrl + 'groups.close', body, this.options); - } - closeChannel(body: any) { - return this.http.post(environment.apiChatUrl + 'channels.close', body, this.options); - } - leaveGroup(body: any) { - return this.http.post(environment.apiChatUrl + 'groups.leave', body, this.options); - } - leaveChannel(body: any) { - return this.http.post(environment.apiChatUrl + 'channels.leave', body, this.options); - } - removeChannelMember(body: any) { - let opts = { - headers: this.headers, - } - return this.http.post(environment.apiChatUrl + 'channels.kick', body, opts); - } - - addChannelOwner(body: any) { - return this.http.post(environment.apiChatUrl + 'channels.addOwner', body, this.options); - } - - addGroupOwner(body: any) { - return this.http.post(environment.apiChatUrl + 'groups.addOwner', body, this.options); - } - - deleteGroup(body: any) { - return this.http.post(environment.apiChatUrl + 'groups.delete', body, this.options); - } - - deleteChannel(body: any) { - return this.http.post(environment.apiChatUrl + 'channels.delete', body, this.options); - } - addUserToGroup(body: any) { - return this.http.post(environment.apiChatUrl + 'groups.invite', body, this.options); - } - getGroupInfo(roomId: any) { - let params = new HttpParams(); - params = params.set("roomId", roomId); - - let opts = { - headers: this.headers, - params: params - } - return this.http.get(environment.apiChatUrl + 'groups.info', opts); - } - renameGroup(body: any) { - return this.http.post(environment.apiChatUrl + 'groups.rename', body, this.options); - } - removeGroupMember(body: any) { - let opts = { - headers: this.headers, - } - return this.http.post(environment.apiChatUrl + 'groups.kick', body, opts); - } - - async subscribe(roomId: any) { - - let params = new HttpParams(); - params = params.set("roomId", roomId); - let opts = { - headers: this.headers, - params: params - } - - this.http.get(environment.apiChatUrl + 'im.messages', opts).subscribe(async res => { - - - if (res == 502) { - // Connection timeout - // happens when the connection was pending for too long - // let's reconnect - await this.subscribe(roomId); - } else if (res != 200) { - // Show Error - //showMessage(response.statusText); - this.getRoomMessages(roomId) - // Reconnect in one second - await new Promise(resolve => setTimeout(resolve, 1000)).catch ((error) => { - console.error(error); - }); - await this.subscribe(roomId); - } else { - // Got message - //let message = await response.text(); - this.getRoomMessages(roomId) - await this.subscribe(roomId); - } - - }) - - - } - - setheader() { - try { - - if (this.p.userPermission(this.p.permissionList.Chat.access) && SessionStore.user.ChatData) { - this.headers = new HttpHeaders();; - - if (this.p.userPermission(this.p.permissionList.Chat.access)) { - // - this.headers = this.headers.set('X-User-Id', SessionStore.user.ChatData.data.userId); - this.headers = this.headers.set('X-Auth-Token', SessionStore.user.ChatData.data.authToken); - this.options = { - headers: this.headers, - }; - - this.resetTimer(); - } - } - } catch (error) { - - } - } - - async refreshtoken() { - - } - - - lastUpdateIs10sAgo() { - const currentTime: any = new Date(); - - const diffTime = Math.abs(currentTime - this.timerEventTriggerDateLastUpdate); - - if(this.timerEventTriggerDateLastUpdate == null) { - return true - } - - if(diffTime >= 5000) { - return true - } - - return false - - } - - functionTimer = null; - timerEventTriggerDate = null - timerEventTriggerDateLastUpdate = null - - resetTimer() { - clearTimeout(this.functionTimer); - this.timerEventTriggerDate = new Date(+new Date() + 60000*15); - - this.functionTimer = setTimeout(() => { - - if(this.NetworkServiceService.getCurrentNetworkStatus() == ConnectionStatus.Online) { - this.refreshtoken(); - } else { - this.resetTimer() - } - - }, 60000 * 15); // time is in milliseconds - - } - -} diff --git a/src/app/services/chat/change-message-queue.service.spec.ts b/src/app/services/chat/change-message-queue.service.spec.ts deleted file mode 100644 index c6528866a..000000000 --- a/src/app/services/chat/change-message-queue.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { ChangeMessageQueueService } from './change-message-queue.service'; - -describe('ChangeMessageQueueService', () => { - let service: ChangeMessageQueueService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(ChangeMessageQueueService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/services/chat/chat-methods.service.spec.ts b/src/app/services/chat/chat-methods.service.spec.ts deleted file mode 100644 index 3e474e69d..000000000 --- a/src/app/services/chat/chat-methods.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { ChatMethodsService } from './chat-methods.service'; - -describe('ChatMethodsService', () => { - let service: ChatMethodsService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(ChatMethodsService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/services/chat/chat-methods.service.ts b/src/app/services/chat/chat-methods.service.ts deleted file mode 100644 index abb25e3a4..000000000 --- a/src/app/services/chat/chat-methods.service.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ChatService } from '../chat.service'; -import { v4 as uuidv4 } from 'uuid' - -@Injectable({ - providedIn: 'root' -}) -export class ChatMethodsService { - - constructor( - private chatService: ChatService) { - } - - sendMessage(roomId:string, data:any) { - - let body = { - "message": - { - "rid": roomId, - "msg":"", - "file": { - "type": "application/meeting", - "subject": data.subject, - "start_date": data.start, - "end_date": data.end, - "venue": data.venue, - "id": data.id, - "calendarId": data.calendarId - } - } - } - this.chatService.sendMessage(body).subscribe(res=> {}); - } - - send({roomId, msg, attachments = null, file = null, localReference = null}) { - - let body = { - "message": - { - rid: roomId, - localReference: localReference, - msg: msg, - attachments, - file - } - } - - return this.chatService.sendMessage(body) - } - - deleteMessage(body) { - return this.chatService.deleteMessage(body) - } - -} \ No newline at end of file diff --git a/src/app/services/chat/chat-system.service.ts b/src/app/services/chat/chat-system.service.ts deleted file mode 100644 index 06276dc92..000000000 --- a/src/app/services/chat/chat-system.service.ts +++ /dev/null @@ -1,811 +0,0 @@ -import { Injectable } from '@angular/core'; -import { RoomService } from './room.service'; -import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service'; -import { MessageService } from 'src/app/services/chat/message.service'; -import { SessionStore } from 'src/app/store/session.service'; -import { capitalizeTxt } from 'src/plugin/text'; -import { Update as room } from 'src/app/models/chatMethod'; -import { Storage } from '@ionic/storage'; -import { ModalController, NavController, Platform } from '@ionic/angular'; -import { SqliteService } from 'src/app/services/sqlite.service'; -import { ChatService } from 'src/app/services/chat.service'; -import { NativeNotificationService } from 'src/app/services/native-notification.service'; -import { SortService } from '../functions/sort.service'; -import { chatUser } from 'src/app/models/chatMethod'; -import { NfService } from 'src/app/services/chat/nf.service' -import { ChatMethodsService } from './chat-methods.service'; -import { AESEncrypt } from '../aesencrypt.service' -import { AttachmentsService } from 'src/app/services/attachments.service'; -import { NetworkServiceService } from 'src/app/services/network-service.service'; -import { ViewedMessageService } from './viewed-message.service' -import { NotificationsService } from '../notifications.service'; -import { Subscribe } from '../subcribe'; -import { Plugins } from '@capacitor/core'; - -const { App } = Plugins; - -@Injectable({ - providedIn: 'root' -}) -export class ChatSystemService { - - dm: { [key: string]: RoomService } = {} - group: { [key: string]: RoomService } = {} - - _dm: RoomService[] = [] - _group: RoomService[] = [] - - loadingWholeList = false; - - dmCount = 0; - groupCount = 0; - - currentRoom: RoomService = null - users: chatUser[] = [] - sessionStore = SessionStore - delete = [] - loadingUsers = false - - onRoomsLoad = new Subscribe({ execute: false, deleteOnExecute: true }) - private mainChangeDetector: Function = () => {} - - - constructor( - private RochetChatConnectorService: RochetChatConnectorService, - private storage: Storage, - private platform: Platform, - private sqlservice: SqliteService, - private NativeNotificationService: NativeNotificationService, - private sortService: SortService, - private ChatService: ChatService, - private NfService: NfService, - private chatService: ChatService, - private ChatMethodsService: ChatMethodsService, - private AESEncrypt: AESEncrypt, - private AttachmentsService: AttachmentsService, - private NetworkServiceService: NetworkServiceService, - private ViewedMessageService: ViewedMessageService, - private notificationService: NotificationsService, - private modalController: ModalController, - private navController: NavController - ) { - - - this.RochetChatConnectorService.registerCallback({ - type: 'reConnect', - funx: async () => { - /** - * @description when the phone is in the background for a long time it could disconnects from the socket then the socket reconnects automatically, - * when the connection is lost the subscribe is also lost, so we have to subscribe again when reconnection is establish. - */ - - this.RochetChatConnectorService.setStatus('online') - this.getUserStatus(); - await this.chatService.refreshtoken(); - this.getUser(); - this.getAllRooms(); - this.subscribeToRoom(); - // - - - if (this.currentRoom) { - this.currentRoom.loadHistory({ forceUpdate: true }) - } - - for (const id in this.dm) { - this.dm[id].hasLoadHistory = false - } - - for (const id in this.group) { - this.group[id].hasLoadHistory = false - } - - } - }) - - if (this.sessionStore.user.Inactivity) { - this.loadChat(); - } - - - if (SessionStore.user?.ChatData?.data) { - this.restoreRooms(); - } - - document.addEventListener('resume', () => { - this.RochetChatConnectorService.setStatus('online') - if (this._dm?.length == 0 && this._group?.length == 0) { - if (SessionStore.user?.ChatData?.data) { - this.getAllRooms(); - } - - } - }); - - try { - if (!this.platform.is('desktop')) { - App.addListener('appStateChange', ({ isActive }) => { - if (isActive) { - // The app is in the foreground. - console.log('App is in the foreground'); - - if (SessionStore.user?.ChatData?.data) { - this.currentRoom?.loadHistory({ forceUpdate: true }) - } - - setTimeout(() => { - if (SessionStore.user?.ChatData?.data) { - this.subscribeToRoom() - this.RochetChatConnectorService.setStatus('online') - } - }, 1000); - - /* this.reloadComponent(true) */ - } else { - // The app is in the background. - console.log('App is in the background'); - // You can perform actions specific to the background state here. - } - }); - } - } catch(error) {} - } - - loadChat() { - if (SessionStore.user?.ChatData?.data) { - this.ReLoadChat() - } - } - - private async ReLoadChat() { - - if (SessionStore.user?.ChatData?.data) { - this.getUserStatus(); - await this.chatService.refreshtoken(); - - this.restoreUsers(); - await this.getUser(); - await this.restoreRooms(); - await this.getAllRooms(); - this.subscribeToRoom(); - } - // - - } - - clearChat() { - this.dm = {} - this.group = {} - this._dm = [] - this._group = [] - - this.loadingWholeList = false; - - this.dmCount = 0; - this.groupCount = 0; - - this.currentRoom = null - this.users = [] - this.storage.remove('Users'); - } - - openRoom(roomId) { - - if (this.currentRoom) { - this.currentRoom.roomLeave() - } - - if (this.getDmRoom(roomId)) { - this.currentRoom = this.getDmRoom(roomId) - } else if (this.getGroupRoom(roomId)) { - this.currentRoom = this.getGroupRoom(roomId) - } - - this.currentRoom.open() - - } - - getRoomById(roomId) { - if (this.getDmRoom(roomId)) { - return this.getDmRoom(roomId) - } else if (this.getGroupRoom(roomId)) { - return this.getGroupRoom(roomId) - } - } - - async restoreRooms() { - - try { - const _rooms = await this.storage.get('Rooms'); - - if (_rooms) { - for (let roomData of this.sortArrayISODate(_rooms)) { - await this.prepareRoom(roomData); - } - } - } catch (e) { } - - } - - async restoreUsers() { - const users = await this.storage.get('Users'); - - if (users) { - this.users = users - - } - } - - sortArrayISODate(messages: any): any[] { - - return messages.sort((a, b) => - new Date(b._updatedAt).getTime() - - - new Date(a._updatedAt).getTime()) - } - - async getAllRooms(callback: Function = () => { }, roomIdCallback = "") { - this.loadingWholeList = true - var rooms; - - if (this.RochetChatConnectorService.isLogin) { - try { - rooms = await this.RochetChatConnectorService.getRooms(); - } catch (error) { - this.loadingWholeList = false - console.error('chatgetrooms', error) - } - try { - await this.storage.remove('Rooms'); - } catch (e) { } - } - - let index = 0 - - let _rooms = rooms?.result?.update - - if (_rooms) { - - _rooms = _rooms.map(e => { - e["_updatedAt"] = e._updatedAt || e._updatedAt['$date'] - return e - }) - - for (let roomData of this.sortArrayISODate(_rooms)) { - - const roomId = this.getRoomId(roomData); - - if (roomData.t == 'd') { - await this.prepareRoom(roomData); - } else { - if (roomData.t === 'p') { - await this.prepareRoom(roomData); - } - else { - await this.prepareRoom(roomData); - } - } - - if (roomId == roomIdCallback) { - callback() - } - - index++; - } - } - - this.loadingWholeList = false - this.sortRoomList() - await this.storage.set('Rooms', _rooms); - - this.onRoomsLoad.executor() - } - - - async getRoom(_rooms: any) { - this.loadingWholeList = true - - let index = 0 - - if (_rooms) { - - _rooms = _rooms.map(e => { - e["_updatedAt"] = e._updatedAt || e._updatedAt['$date'] - return e - }) - - for (let roomData of this.sortArrayISODate(_rooms)) { - - if (roomData.t == 'd') { - - await this.prepareRoom(roomData); - } else { - if (roomData.t === 'p') { - - await this.prepareRoom(roomData); - - } - else { - - await this.prepareRoom(roomData); - } - - } - - index++; - } - } - - this.loadingWholeList = false - this.sortRoomList() - - this.onRoomsLoad.executor() - } - - /** - * @description sort room list by last message date - */ - sortRoomList = () => { - - this._dm = this.sortService.sortDate(this._dm, '_updatedAt').reverse() - this._group = this.sortService.sortDate(this._group, '_updatedAt').reverse() - } - - /** - * @description subscribe all room - */ - subscribeToRoom() { - - if (SessionStore.user?.ChatData?.data) { - - for (const id in this.dm) { - this.defaultSubtribe(id) - } - - for (const id in this.group) { - this.defaultSubtribe(id) - } - - this.RochetChatConnectorService.streamNotifyLogged().then((subscription => { })) - - this.RochetChatConnectorService.subStreamMessageUser().then((subscription => { - console.log({subscription}) - })) - } else { - - setTimeout(() => { - throw ('No chat data'); - }, 1000) - } - - } - - /** - * @description when a new room is create, needs to subtribe in order to receive updates - * @param id - * @param roomData - */ - subscribeToRoomUpdate(id, roomData) { - - this.defaultSubtribe(id); - - this.prepareRoom(roomData); - - this.getGroupRoom(id).loadHistory({}); - - } - - - /** - * @deprecated things a room need to subscribe on - * @param id room id - */ - private defaultSubtribe(id: any) { - - const room = this.getRoomById(id); - - if (!room.subscribeAttempt) { - - try { - - room.subscribeAttempt = true; - } catch (error) { - console.log("error") - } - - - this.RochetChatConnectorService.streamRoomMessages(id).then((subscription) => { - room.status.receive.message = true; - }) - - this.RochetChatConnectorService.subStreamNotifyRoom(id, 'typing', false).then((subscription) => { - room.status.receive.typing = true; - // - }) - - this.RochetChatConnectorService.subStreamNotifyRoom(id, 'readMessage', false).then((subscription) => { - room.status.receive.readMessage = true; - }) - - this.RochetChatConnectorService.streamNotifyRoomDeleteMessage(id).then((subscription) => { - room.status.receive.deleteMessage = true; - }) - } - - } - - private fix_updatedAt(message) { - if (message.result) { - message.result._updatedAt = message.result._updatedAt['$date'] - } else if (message._updatedAt) { - if (message._updatedAt.hasOwnProperty('$date')) { - message._updatedAt = message._updatedAt['$date'] - } - } - return message - } - - /** - * @description create a representation of an room in these instance this.dm, this.group ... - * @param roomData - */ - prepareRoom(roomData) { - - - /** - * @description data used to define or create room - */ - - - roomData = this.fix_updatedAt(roomData) - const setData = { - customFields: roomData.customFields, - id: this.getRoomId(roomData), - name: this.getRoomName(roomData), - t: roomData.t, - lastMessage: this.getRoomLastMessage(roomData), - _updatedAt: new Date(roomData._updatedAt || roomData._updatedAt['$date']), - u: roomData.u || {}, - members: [], - membersExcludeMe: [] - } - - let roomId = this.getRoomId(roomData); - - let chat = false - if (roomData?.usernames) { - if (roomData?.usernames?.includes("chat.admin")) { - chat = true - } - } - - if (setData.name != 'Rocket Cat' && setData.name != 'general' && chat == false) { - // create room - if (!this.roomExist(roomId)) { - let room: RoomService = new RoomService(this.RochetChatConnectorService, new MessageService(this.NfService, this.RochetChatConnectorService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService, this, this.notificationService), this.storage, this.platform, this.sqlservice, this.NativeNotificationService, this.sortService, this.ChatService, this.NfService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService, this, this.ViewedMessageService, this.notificationService,this.modalController,this.navController) - room.setData(setData) - room.receiveMessage() - room.getAllUsers = this.getUsers - room.receiveMessageDelete(); - room.sortRoomList = this.sortRoomList - room.chatServiceDeleteRoom = this.deleteRoom - room.isGroup = !this.isIndividual(roomData) - room.info() - - - // create individual room - if (this.isIndividual(roomData)) { - - this.dm[roomId] = room - this._dm.push(room) - this.dmCount++ - - } else { - // create group room - - this.group[roomId] = room - this._group.push(room) - this.groupCount++ - - } - - this.defaultSubtribe(roomId) - } else { - // in this case room is already present, therefor it will only be necessary, - // to redefine - - if (this.dm[roomId]) { - this.dm[roomId].setData(setData) - } else if (this.group[roomId]) { - this.group[roomId].setData(setData) - } - - } - } - - } - - - deleteRoom = (roomId) => { - - this.delete.push(roomId) - delete this.group[roomId]; - this._group = this._group.filter((e) => e.id != roomId); - } - - deleteRecently(roomId) { - return this.delete.includes(roomId) - } - - roomExist(roomId) { - return this.dm[roomId]?.id || this.group[roomId]?.id - } - - getReceptorName(roomData) { - try { - return roomData.usernames.find((e) => e != SessionStore.user.UserName) - } catch (e) { - return '*' - } - } - - /** - * @description update user status. this method is called once only - * @param id user ID - */ - private getUserStatus(id?: string) { - - this.RochetChatConnectorService.getUserStatus(async (d) => { - - const userId = d.fields.args[0][0] - const username = d.fields.args[0][1] - let statusNum = d.fields.args[0][2] - - const statusText = this.statusNumberToText(statusNum) - - for (const user in this.users) { - if (this.users[user]._id == userId) { - this.users[user].status = statusText - } - } - - this.getUser() - - }) - } - - getUserByName(username) { - return this.users.find((user) => user.username == username) - } - - /** - * @description convert rocketchat statues num to readable string - * @param text - * @returns - */ - statusNumberToText(text) { - if (text == '0') { - return "offline" - } - else if (text == '1') { - return "online" - } - else if (text == '2') { - return "away" - } - else if (text == '3') { - return "busy" - } - } - - - deleteMessage(id?) { - return this.RochetChatConnectorService.deleteMessage(id); - } - - leaveRoom(id?) { - return this.RochetChatConnectorService.leaveRoom(id); - } - - async hideRoom(id) { - this._dm.forEach((md, index) => { - if (md.id == id) { - this._dm.splice(index, 1) - delete this.dm[id] - } - }); - - this._group.forEach((group, index) => { - if (group.id == id) { - this._group.splice(index, 1) - delete this.group[id] - } - }) - } - - hidingRoom(id?) { - - return this.RochetChatConnectorService.hidingRoom(id).then(() => { - // this.hideRoom(id) - }) - - } - - addRoomOwner(roomid, userId) { - return this.RochetChatConnectorService.addRoomOwner(roomid, userId); - } - - createPrivateRoom(groupName, username, customFields) { - return this.RochetChatConnectorService.createPrivateRoom(groupName, username, customFields); - } - - getDmRoom(id): RoomService { - try { - return this.dm[id] - } catch (e) { } - } - - getGroupRoom(id): RoomService { - try { - return this.group[id] - } catch (e) { } - } - - getRoomName(roomData: room): string { - if (this.isIndividual(roomData)) { - const names: String[] = roomData.usernames - - - if (roomData.t == 'd') { - - const username = roomData.usernames.find(e => e != SessionStore.user.UserName) - - try { - const firstName = capitalizeTxt(username.split('.')[0]) - const lastName = capitalizeTxt(username.split('.')[1]) - - return firstName + ' ' + lastName - } catch (error) { - const username = roomData.usernames.find(e => e != SessionStore.user.UserName) - - const firstName = capitalizeTxt(username.split('.')[0]) - return firstName - } - - } else { - if (roomData.t === 'p') { - return 'Loading' - } - else { - return 'Loading' - } - } - - } else { - return roomData.fname - } - } - - getRoomId(roomData: room) { - return roomData._id - } - - getRoomLastMessage(roomData: room): any { - return roomData.lastMessage - } - - private isIndividual(roomData: room) { - return !roomData.fname - } - - getUsers = () => { - return this.users - } - - async getUser() { - - this.loadingUsers = true - let _res - - try { - _res = await this.ChatService.getAllUsers().toPromise(); - } catch (error) { - await this.chatService.refreshtoken(); - _res = await this.ChatService.getAllUsers().toPromise(); - } - - let users: chatUser[] = _res['users'].filter(data => data.username != SessionStore.user.UserName); - - users = users.filter((data) => !(data.name == 'Rocket.Cat' || data.name == 'Administrator')) - - const userIds = this.users.map((user) => user._id) - - for (let UserUpdate of users) { - if (userIds.includes(UserUpdate._id)) { - for (var index = 0; index < this.users.length; index++) { - if (UserUpdate._id == this.users[index]._id) { - this.users[index] = UserUpdate - } - } - } else { - this.users.push(UserUpdate) - } - } - - this.users = this.users.sort((a, b) => { - if (a.name < b.name) { - return -1; - } - if (a.name > b.name) { - return 1; - } - return 0; - }); - - await this.storage.set('Users', this.users); - - this.loadingUsers = false - - } - - getUserOfRoom(roomId) { - return this.RochetChatConnectorService.getUserOfRoom(roomId); - } - - - async createGroup(name) { - const res: any = await this.createPrivateRoom(name, SessionStore.user.UserName, {}); - if (res?.result?.rid) { - try { - await this.getAllRooms(); - } catch (e) { } - return res - } else { - return res - } - } - - - async createGroup__(name, customFields = {}) { - const res: any = await this.createPrivateRoom(name, SessionStore.user.UserName, customFields); - console.log('room is created', res) - if (res?.result?.rid) { - try { - await this.getAllRooms(); - return res - } catch (e) { } - console.log('room is loaded') - return res - } else { - return res - } - } - - getGroupByName(name) { - return this._group.find(e => e.name == name) - } - - async waitRoomToCreate(rid): Promise { - return new Promise(async (resolve, reject) => { - let sub; - - sub = this.onRoomsLoad.subscribe(() => { - const room = this.getRoomById(rid) - if (room) { - resolve(room) - sub.unSubscribe() - } - }) - - try { - await this.getAllRooms(); - } catch (e) { } - - }) - } - - searchContact(name, username) { - return this.users.find(e => e.name == name || e.username == username) - } - -} diff --git a/src/app/services/chat/message.service.ts b/src/app/services/chat/message.service.ts deleted file mode 100644 index 80077e5b7..000000000 --- a/src/app/services/chat/message.service.ts +++ /dev/null @@ -1,1056 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Message } from 'src/app/models/chatMethod'; -import { SessionStore } from 'src/app/store/session.service'; -import { capitalizeTxt } from 'src/plugin/text'; -import { NfService } from 'src/app/services/chat/nf.service'; -import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service'; -import { showDateDuration } from 'src/plugin/showDateDuration'; -import { showTimeDuration } from 'src/plugin/showTimeDuration'; -import { ChatMethodsService } from './chat-methods.service'; -import { MessageModel, attachments } from '../../models/beast-orm'; -import { AESEncrypt } from '../aesencrypt.service'; -import { HttpEventType } from '@angular/common/http'; -import { AttachmentsService } from 'src/app/services/attachments.service'; -import { NetworkServiceService , ConnectionStatus} from 'src/app/services/network-service.service'; -import { ChatSystemService } from './chat-system.service'; -import { v4 as uuidv4 } from 'uuid' -import { NotificationsService } from 'src/app/services/notifications.service'; - -@Injectable({ - providedIn: 'root' -}) -export class MessageService { - - customFields - channels = [] - mentions = [] - msg = '' - rid = '' - ts = {} - - u = { - name: '', - username: '', - _id: "" - } - - t = '' - _id = '' - id = '' // table id - _updatedAt - file - attachments - displayType = '' - temporaryData: any - hasFile = false - hasSendAttachment = false - sendAttempt = 0 - uploadingFile = false - errorUploadingAttachment = false - loadHistory = false - from: 'Offline'|'History'|'stream'| 'send' - duration = '' - time= ''; - localReference = null - viewed: string[] = [] - received: string[]= [] - addToDb = false - - messageSend = false - delate = false - delateRequest = false - downloadLoader: boolean = false - downloadAttachments = false; - downloadAttachmentsTemp = 0; - UploadAttachmentsTemp = 0; - manualRetry = false - origin: 'history' | 'stream' | 'local' - - messageModelInstance: MessageModel - attachmentsModelData: any - - dateLabel = false - - - constructor( - private NfService: NfService, - private RochetChatConnectorService: RochetChatConnectorService, - private ChatMethodsService: ChatMethodsService, - private AESEncrypt: AESEncrypt, - private AttachmentsService: AttachmentsService, - private NetworkServiceService: NetworkServiceService, - private ChatSystemService: ChatSystemService, - private notificationService: NotificationsService) { - } - - setData({customFields = {}, channels, mentions, msg ,rid ,ts, u, t, _id, id, _updatedAt, file, attachments, temporaryData, localReference = 'out-'+uuidv4() , viewed = [], received = [], delate = false, delateRequest =false, from, sendAttempt = 0, origin, attachmentsModelData, hasFile = false, UploadAttachmentsTemp = 0 }:Message) { - - this.channels = channels || [] - this.mentions = mentions || [] - this.msg = msg || "" - this.rid = rid - this.ts = ts - this.u = u || { name: this.usernameToDisplayName(SessionStore.user.UserName), username: SessionStore.user.UserName, _id: ""} - this.t = t - this._id = _id || "" - this._updatedAt = _updatedAt || new Date().getTime() - this.file = file - this.temporaryData = temporaryData - this.localReference = localReference || null - this.id = id - this.delate = delate - this.delateRequest = delateRequest - this.sendAttempt = 0 - this.origin = origin - this.attachmentsModelData = attachmentsModelData - this.UploadAttachmentsTemp = UploadAttachmentsTemp - - if(this.attachments?.length >= 1 && attachments?.length >= 1) { - this.attachments[0] = Object.assign(this.attachments[0], attachments[0]) - } else { - this.attachments = attachments - } - - this.viewed = [...new Set([...viewed,...this.viewed])]; - this.received = [...new Set([...received,...this.received])]; - - if(!this.ts) { - this.messageSend = false - } else { - this.messageSend = true - } - - this.hasFile = hasFile - - if (this.instanceHasAttachment && !this.hasFile) { - this.hasFile = true - } - - if(this.hasFile) { - if(this.file.type != 'application/webtrix') { - this.displayType = this.file.type.replace('application/','').toUpperCase() - } - } - - if(!this.u.name && this.u.username) { - const user = this.ChatSystemService.users.find((u)=> u.username == this.u.username) - if(user) { - this.u.name = user.name - } else if( this.u.username == SessionStore.user.UserName) { - this.u.name = SessionStore.user.FullName - } else { - } - } - - this.calDateDuration() - this.calTime() - } - - - get offline () { - if(!this._id) { - return true - } - - if(!this.ts) { - return true - } - - return false - } - - /** - * Message is on the server - */ - get online() { - return !this.offline - } - - /** - * if Message is already saved on database - */ - get save() { - return this.id != '' - } - - - private usernameToDisplayName(username) { - - try { - const firstName = capitalizeTxt(username.split('.')[0]) - const lastName = capitalizeTxt(username.split('.')[1]) - return firstName + ' ' + lastName - } catch (error) { - return username - } - - } - - async send(): Promise { - if(this.messageSend) { - return new Promise((resolve, reject) => { - resolve('solve') - }) - } - - this.sendAttempt++; - this.manualRetry = false - - if(!this.hasFile) { - - const params = { - roomId:this.rid, - msg:this.msg, - localReference: this.localReference - } - - await this.sendRequest(params) - - } else { - - let uploadSuccessfully = await this.sendRequestAttachment() - - if(uploadSuccessfully) { - - const params = {roomId:this.rid, msg: this.msg, attachments: this.attachments, file: this.file, localReference: this.localReference} - await this.sendRequest(params) - - } else if(this.RochetChatConnectorService.isLogin == false) { - - this.RochetChatConnectorService.registerCallback({ - type: 'reConnect', - funx: async () => { - console.log('send now have login') - this.send().catch((error) =>{ - console.error(error) - }) - return true - } - }) - - console.log('no login') - - } else if (this.UploadAttachmentsTemp <= 3) { - console.log('temp'+ this.UploadAttachmentsTemp) - setTimeout(async () => { - return await this.send() - }, 4000) - } else if(this.NetworkServiceService.getCurrentNetworkStatus() == ConnectionStatus.Offline) { - - console.log('recooonect') - this.RochetChatConnectorService.registerCallback({ - type: 'reConnect', - funx: async ()=> { - - await this.send().catch((error) => { - console.error(error) - }) - return true - } - }) - } else if (this.NetworkServiceService.getCurrentNetworkStatus() == ConnectionStatus.Online) { - console.log('manual') - this.manualRetry = true - } - - } - - } - - - functionTimer = null; - functionTimer2 = null; - - async sendRequestAttachment() { - - console.log('sendRequestAttachment') - this.uploadingFile = true - - let uploadSuccessfully = false - if(!this.instanceHasAttachmentBase64 && !this.temporaryData) { - try { - await this.getFileFromDB() - } catch (error) {} - } - - if(!this.instanceHasTemporaryData) { - - await this.generateTemporaryData() - } - - console.log('send temp') - if(this.hasSendAttachment == false) { - try { - this.manualRetry = false - this.errorUploadingAttachment = false - this.UploadAttachmentsTemp++ - - uploadSuccessfully = await this.NfService.beforeSendAttachment(this) - - this.uploadingFile = false - this.hasSendAttachment = uploadSuccessfully - - if(this.hasSendAttachment) { - console.log('send uploadSuccessfully') - } else { - console.log('not send uploadSuccessfully') - } - - this.saveChanges() - } catch (error) { - this.uploadingFile = false - - console.log('send not uploadSuccessfully') - this.errorUploadingAttachment = true - - this.saveChanges() - } - - } - - return uploadSuccessfully - } - - sendToRocketChatAttemp = 0 - - async sendRequest(params) { - this.sendToRocketChatAttemp++; - - if(params?.attachments) { - if(params?.attachments[0]?.image_url) { - delete params?.attachments[0]?.image_url - delete params?.file?.image_url - // delete - } - } - - if(this.NetworkServiceService.getCurrentNetworkStatus() == ConnectionStatus.Online) { - - if(this.msg == '') { - if(this.sendAttempt >= 4) { - this.RochetChatConnectorService.send(params).then( - (ChatMessage: any) => { - ChatMessage = ChatMessage.message.result - clearTimeout(this.functionTimer); - - this.redefinedMessage(ChatMessage) - } - ).catch((error) => { - clearTimeout(this.functionTimer); - console.error(error) - }) - } - - } else { - // console.log('online') - - this.RochetChatConnectorService.send(params).then( - (ChatMessage: any) => { - ChatMessage = ChatMessage.message.result - clearTimeout(this.functionTimer); - - this.redefinedMessage(ChatMessage) - - } - ).catch((error) => { - clearTimeout(this.functionTimer); - console.error(error) - }) - } - - this.functionTimer = setTimeout(() => { - //console.log('functionTimer') - - this.RochetChatConnectorService.registerCallback({ - type:'Onmessage', - key:'ping-pong-message', - funx:(message: any) => { - - // clearTimeout(this.functionTimer2); - if(message.msg == "ping") { - this.sendRequest(params) - return true - } - - this.saveChanges() - } - }) - - // this.functionTimer2 = setTimeout(() => { - // console.log('set to callback') - // this.RochetChatConnectorService.registerCallback({ - // type: 'reConnect', - // funx: async ()=> { - // this.sendRequest(params) - - // return true - // } - // }) - // }, 4000) - - this.RochetChatConnectorService.wsSend({message:{msg:"pong"}, loginRequired: false}) - - }, 5000) - - } else { - // console.log('offline') - this.RochetChatConnectorService.registerCallback({ - type: 'reConnect', - funx: async ()=> { - this.send().catch((error) =>{ - console.error(error) - }) - return true - } - }) - } - - } - - async redefinedMessage(ChatMessage , update = true) { - ChatMessage = this.NfService.fix_updatedAt(ChatMessage) - - const message = this.getChatObj() - - this.manualRetry = false - this.messageSend = true - - ChatMessage = Object.assign(message, ChatMessage) - this.setData(ChatMessage) - - const roomObject = this.ChatSystemService.getRoomById(this.rid) - const users = roomObject.getUsersByStatus('online') - for(const user of users) { - this.addReceived(user._id) - } - - if(!roomObject.isGroup) { - var memeberTosend = this.ChatSystemService.getRoomById(this.rid).membersExcludeMe - this.notificationService.ChatSendMessageNotification(memeberTosend[0].username,ChatMessage.u.name,ChatMessage.msg || "Anexo",this.rid) - } else { - var memeberTosend = this.ChatSystemService.getRoomById(this.rid).membersExcludeMe - var usersNames = []; - for(let i = 0; i < memeberTosend.length; i++) { - usersNames.push(memeberTosend[i].username) - } - this.notificationService.ChatSendMessageNotificationGrup(usersNames,ChatMessage.u.name,ChatMessage.msg || "Anexo",this.rid) - } - - - await this.saveChanges() - } - - sendNotificaton - - downloadFileMsg() { - - this.downloadLoader = true; - let downloadFile = ""; - let downloadUrl = ""; - - this.AttachmentsService.downloadFile(this.file.guid).subscribe(async (event) => { - - console.log('download file',event) - - if (event.type === HttpEventType.DownloadProgress) { - - } else if (event.type === HttpEventType.Response) { - if (this.file.type == "application/img") { - downloadFile = 'data:image/jpeg;base64,' + btoa(new Uint8Array(event.body).reduce((data, byte) => data + String.fromCharCode(byte), '')); - } else if (this.file.type != "application/img") { - - - downloadFile = btoa(new Uint8Array(event.body).reduce((data, byte) => data + String.fromCharCode(byte), '')); - downloadUrl = event.url - console.log('downloaded file', downloadFile) - console.log('event body downloaded file', event.url) - - } - - this.attachments[0] = { - image_url: downloadFile, - name: this.attachments[0].name, - title: this.attachments[0].title, - title_link: downloadFile, - title_link_download: this.attachments[0].title_link_download, - ts: this.attachments[0].ts, - attachmentsUrl: downloadUrl - } - - // save the changes to the storage - this.saveChanges() - this.addFileToDb() - this.downloadLoader = false; - this.downloadAttachments = true - this.downloadAttachmentsTemp++; - } - }, ()=>{ - // error - this.downloadLoader = false; - this.downloadAttachments = false - this.downloadAttachmentsTemp++; - }); - - } - - private calDateDuration(date = null) { - this.duration = showDateDuration(date || this._updatedAt); - } - - private calTime(time = null) { - this.time = showTimeDuration(time || this._updatedAt); - } - - - async delateStatusFalse() { - this.delate = true - this.saveChanges() - } - - addViewed(id: string) { - if(this.messageOwner()) { - let found = this.viewed.find((UserId) => UserId == id) - - if(!found) { - this.viewed.push(id) - return true - } - } - - return false - } - - addReceived(id: string) { - if(this.messageOwner()) { - let found = this.received.find((UserId) => UserId == id) - - if(!found) { - this.received.push(id) - return true - } - } - return false - } - - async delateDB() { - - if(!this.messageModelInstance) { - this.messageModelInstance = await this.getRowInstance() - } - - await this.messageModelInstance.delete() - } - - - isSenderIsNotMe(ChatMessage) { - return SessionStore.user.ChatData.data.userId != ChatMessage.u._id - } - - messageOwner() { - return SessionStore.user.ChatData.data.userId == this.u._id - } - - getChatObj() { - return { - channels: this.channels, - mentions: this.mentions, - // msg: this.AESEncrypt.encrypt(this.msg, SessionStore.user.UserName), - sendAttempt: this.sendAttempt, - msg:this.msg, - rid: this.rid, - ts: this.ts, - u: this.u, - _id: this._id, - t: this.t, - id: this.id, - hasFile: this.hasFile, - origin: this.origin, - _updatedAt: this._updatedAt, - messageSend: this.messageSend, - offline: this.offline, - viewed: this.viewed, - received: this.received, - localReference: this.localReference, - attachments: this.attachments, - file: this.file, - delate: this.delate, - UploadAttachmentsTemp: this.UploadAttachmentsTemp - } - } - - earlySave = false - - async addMessageDB() { - if(!this.addToDb && this.save) { - this.addToDb = true - const message = this.getChatObj() - - if(this.instanceHasAttachment) { - this.hasFile = true - } - - delete message.id - const createdMessage = await MessageModel.create(message) - - if(this.instanceHasAttachment) { - this.addFileToDb() - } - - this.messageModelInstance = createdMessage - this.id = createdMessage.id - - if(this.earlySave) { - this.saveChanges(); - } - } - } - - async addFileToDb() { - - if(!this.messageModelInstance) { - this.messageModelInstance = await this.getRowInstance() - } - - - const createdMessage: any = this.messageModelInstance - try { - - let file = {} - - if(this.attachmentsModelData) { - file = {image_url: this.attachmentsModelData?.fileBase64} - } - - await attachments.create({messageId: createdMessage.id, attachments: this.attachments, file: Object.assign(this.file, file) }) - } catch (error) { - console.log(error) - } - } - - async getFileFromDB() { - - if(!this.messageModelInstance) { - this.messageModelInstance = await this.getRowInstance() - } - - - const data = await this.messageModelInstance.getAttachments() - - console.log('data', data); - - this.attachments = data.attachments - this.file = data.file - } - - async generateTemporaryData () { - const blob: any = await this.base64StringToBlob(this.file.image_url) - - const formData = new FormData(); - formData.append("blobFile", blob); - this.temporaryData = formData - } - - - get instanceHasAttachment() { - if (this.file) { - if(this.file.type) { - if(typeof(this.file.type) == 'string') { - return true - } - } - } - - return false - } - - get instanceHasAttachmentBase64() { - if (this.file) { - if(this.file.type) { - if(this.file?.image_url) { - return true - } - } - } - - return false - } - - get instanceHasTemporaryData() { - if (!this.temporaryData) { - return false - } - - return true - } - - - base64StringToBlob(base64Data) { - return new Promise((resolve, reject) => { - - fetch(base64Data) - .then(res => resolve(res.blob())) - .then(console.log) - - }) - } - - - - async getRowInstance () { - - if(this.save) { - const message = this.getChatObj() - let a - - if(!message.id) { - delete message.id - } - - if (this.localReference) { - a = await MessageModel.get({localReference: this.localReference}) - } else if (this._id) { - a = await MessageModel.get({_id: this._id}) - } else if(this.id) { - a = await MessageModel.get({id: this.id}) - } - - return a - } - - } - - async saveChanges() { - - if(!this.messageModelInstance) { - this.messageModelInstance = await this.getRowInstance() - } - - if(this.save && this.messageModelInstance) { - const message = this.getChatObj() - - if(!message.id) { - delete message.id - } - - for( const [name, value] of Object.entries(message)) { - try { - this.messageModelInstance[name] = value - } catch (error) {} - } - - await this.messageModelInstance.save() - - } else { - this.earlySave = true - } - - } - - decryptMessage() { - try { - // this.msg = this.AESEncrypt.decrypt(this.msg, SessionStore.user.UserName) - } catch (error) {} - } - - - - UIdata() { - this.incomingFromCurrentUser = this.u.username!= SessionStore.user.UserName - this.hasMessage = this.msg !='' - } - - incomingFromCurrentUser = false - hasMessage = false -} - - - - - - -export class MessageServiceDateLabel { - - customFields - channels = [] - mentions = [] - msg = '' - rid = '' - ts = {} - - u = { - name: '', - username: '', - _id: "" - } - - t = '' - _id = '' - id = '' // table id - _updatedAt - file - attachments - displayType = '' - temporaryData: any - hasFile = false - hasSendAttachment = false - sendAttempt = 0 - uploadingFile = false - errorUploadingAttachment = false - loadHistory = false - from: 'Offline'|'History'|'stream'| 'send' - duration = '' - time = '' - localReference = null - viewed: string[] = [] - received: string[]= [] - addToDb = false - - messageSend = false - delate = false - delateRequest = false - downloadLoader: boolean = false - downloadAttachments = false; - downloadAttachmentsTemp = 0; - UploadAttachmentsTemp = 0; - manualRetry = false - origin: 'history' | 'stream' | 'local' - - messageModelInstance: MessageModel - attachmentsModelData: any - ChatSystemService - dateLabel = false - - - constructor() {} - - setData({customFields = {}, channels, mentions, msg ,rid ,ts, u, t, _id, id, _updatedAt, file, attachments, temporaryData, localReference = 'out-'+uuidv4() , viewed = [], received = [], delate = false, delateRequest =false, from, sendAttempt = 0, origin, attachmentsModelData, hasFile = false, UploadAttachmentsTemp = 0 }:Message) { - - this.channels = [] - this.mentions = [] - this.rid = rid - this.ts = ts - this.u = u || { name: this.usernameToDisplayName(SessionStore.user.UserName), username: SessionStore.user.UserName, _id: ""} - this.t = t - this._id = "" - this._updatedAt = _updatedAt || new Date().getTime() - this.file = file - this.temporaryData = temporaryData - this.localReference = localReference || null - this.id = id - this.delate = delate - this.delateRequest = delateRequest - this.sendAttempt = 0 - this.origin = origin - this.attachmentsModelData = attachmentsModelData - this.UploadAttachmentsTemp = UploadAttachmentsTemp - - if(this.attachments?.length >= 1 && attachments?.length >= 1) { - this.attachments[0] = Object.assign(this.attachments[0], attachments[0]) - } else { - this.attachments = attachments - } - - this.viewed = []; - this.received = []; - - this.messageSend = true - this.hasFile = hasFile - - this.hasFile = false - - if(!this.u.name && this.u.username) { - const user = this.ChatSystemService.users.find((u)=> u.username == this.u.username) - if(user) { - this.u.name = user.name - } else if( this.u.username == SessionStore.user.UserName) { - this.u.name = SessionStore.user.FullName - } else { - } - } - - this.calDateDuration() - this.calTime(); - } - - - get offline () { - if(!this._id) { - return true - } - - if(!this.ts) { - return true - } - - return false - } - - /** - * Message is on the server - */ - get online() { - return !this.offline - } - - /** - * if Message is already saved on database - */ - get save() { - return this.id != '' - } - - - private usernameToDisplayName(username) { - - try { - const firstName = capitalizeTxt(username.split('.')[0]) - const lastName = capitalizeTxt(username.split('.')[1]) - return firstName + ' ' + lastName - } catch (error) { - return username - } - - } - - async send(): Promise { - - - } - - - functionTimer = null; - - async sendRequestAttachment() { - - } - - async sendRequest(params) { - - - } - - async redefinedMessage(ChatMessage , update = true) { - - } - - sendNotificaton - - downloadFileMsg() { - - } - - private calDateDuration(date = null) { - this.duration = showDateDuration(date || this._updatedAt); - } - - private calTime(time = null) { - this.time = showTimeDuration(time || this._updatedAt); - } - - - async delateStatusFalse() { - - } - - addViewed(id: string) { - - } - - addReceived(id: string) { - - } - - async delateDB() { - - } - - - isSenderIsNotMe(ChatMessage) { - return SessionStore.user.ChatData.data.userId != ChatMessage.u._id - } - - messageOwner() { - return SessionStore.user.ChatData.data.userId == this.u._id - } - - getChatObj() { - - } - - earlySave = false - - async addMessageDB() { - - } - - async addFileToDb() { - - - } - - async getFileFromDB() { - - } - - async generateTemporaryData () { - - } - - - get instanceHasAttachment() { - return false - } - - get instanceHasAttachmentBase64() { - if (this.file) { - if(this.file.type) { - if(this.file?.image_url) { - return true - } - } - } - - return false - } - - get instanceHasTemporaryData() { - if (!this.temporaryData) { - return false - } - - return true - } - - - base64StringToBlob(base64Data) { - - } - - - - async getRowInstance () { - - - } - - async saveChanges() { - - - } - - decryptMessage() { - try { - // this.msg = this.AESEncrypt.decrypt(this.msg, SessionStore.user.UserName) - } catch (error) {} - } - - - - UIdata() { - this.incomingFromCurrentUser = this.u.username!= SessionStore.user.UserName - this.hasMessage = this.msg !='' - } - - incomingFromCurrentUser = false - hasMessage = false -} diff --git a/src/app/services/chat/nf.service.ts b/src/app/services/chat/nf.service.ts deleted file mode 100644 index 78719b0c2..000000000 --- a/src/app/services/chat/nf.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Injectable } from '@angular/core'; -import { MessageService } from './message.service'; -import { RoomService } from './room.service'; - -@Injectable({ - providedIn: 'root' -}) -export class NfService { - - beforeSendAttachment = async (message: MessageService, room?: RoomService): Promise => new Promise ((resolve, reject)=> (resolve(true))); - downloadFileMsg = async (message: MessageService, room?: RoomService): Promise => new Promise ((resolve, reject)=> (resolve(true))); - - fix_updatedAt(message) { - if (message?.result) { - message.result._updatedAt = message.result._updatedAt['$date'] - } else if(message?._updatedAt) { - if(message._updatedAt.hasOwnProperty('$date')) { - message._updatedAt = message._updatedAt['$date'] - } - } - return message - } - - constructor() { } -} diff --git a/src/app/services/chat/rochet-chat-connector.service.spec.ts b/src/app/services/chat/rochet-chat-connector.service.spec.ts deleted file mode 100644 index 0535e9dfe..000000000 --- a/src/app/services/chat/rochet-chat-connector.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { RochetChatConnectorService } from './rochet-chat-connector.service'; - -describe('RochetChatConnectorService', () => { - let service: RochetChatConnectorService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(RochetChatConnectorService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/services/chat/rochet-chat-connector.service.ts b/src/app/services/chat/rochet-chat-connector.service.ts deleted file mode 100644 index 9993c6d53..000000000 --- a/src/app/services/chat/rochet-chat-connector.service.ts +++ /dev/null @@ -1,961 +0,0 @@ -import { Injectable } from '@angular/core'; -import { v4 as uuidv4 } from 'uuid' -import { wsCallbacksParams, msgQueue, send } from 'src/app/models/rochet-chat-cliente-service' -import { deepFind } from 'src/plugin/deep' -import { environment } from 'src/environments/environment'; -import { SessionStore } from 'src/app/store/session.service'; -import { chatHistory, Rooms } from 'src/app/models/chatMethod'; -import { BackgroundService } from '../background.service'; - -@Injectable({ - providedIn: 'root' -}) -export class RochetChatConnectorService { - - isLogin = false; - loginResponse = {} - - constructor(private backgroundservice: BackgroundService,) { - } - - reConnect() { - - } - - connect() { - // dont connect if is already connected - if (this.ws.connected == true) { - return false - } - - this.ws.connect(); - - const message = { - msg: "connect", - version: "1", - support: ["1"] - } - this.ws.send({ message, loginRequired: false, requestId: 'connectMessage' }) - this.ws.send({ message: { msg: "pong" }, loginRequired: false, requestId: 'connectPong' }) - - this.ws.registerCallback({ - type: 'Onmessage', - key: 'ping-pong', - funx: (message: any) => { - if (message.msg == "ping") { - this.ws.send({ message: { msg: "pong" }, loginRequired: false }) - } - } - }) - - } - - wsSend({ message, requestId = uuidv4(), loginRequired = true }: send) { - this.ws.send({ message: { msg: "pong" }, loginRequired: false }) - } - - login() { - // dont login if is already login - if (this.isLogin == true) { - return new Promise((resolve, reject) => { - resolve(this.loginResponse) - }) - } - - const requestId = uuidv4() - // - const message = { - msg: "method", - method: "login", - id: requestId, - params: [ - { - user: { email: SessionStore.user.Email }, - password: SessionStore.user.Password - } - ] - } - this.ws.send({ message, requestId: 'login', loginRequired: false }) - - - return new Promise((resolve, reject) => { - // - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - // - if (message.id == requestId) { // same request send - // - // - if (message.result) { - if (message.result.token) { - this.isLogin = true - this.loginResponse = message - - setTimeout(() => { - this.ws.wsMsgQueue() - }, 10) - - resolve(message) - // - } - } else { - this.isLogin = false - // - reject(message) - } - - reject(message) - - return true - } - } - }) - }); - - } - - getRooms(roomOlder = 1480377601) { - - - //const requestId = uuidv4() - const requestId = uuidv4() - const message = { - "msg": "method", - "method": "rooms/get", - "id": requestId, - "params": [{ "$date": 1480377601 }] - } - - this.ws.send({ message, requestId }) - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - } - - readMessage(roomId) { - - //const requestId = uuidv4() - const requestId = uuidv4() - - const message = { - "msg": "method", - "method": "readMessages", - "params": [roomId, []], - "id": requestId - } - - this.ws.send({ message, requestId }) - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - - } - - getUserOfRoom(roomId) { - - //const requestId = uuidv4() - const requestId = uuidv4() - - const message = { - "msg": "method", - "method": "getUsersOfRoom", - "id": requestId, - "params": [ - roomId, - false, - { - "limit": 100, - "skip": 0 - }] - } - - this.ws.send({ message, requestId }) - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - } - - logout() { - this.isLogin = false - this.ws.connected = false - this.ws.disconnect() - } - - // send message to room - send({ roomId, msg, attachments = null, file = null, localReference = null }) { - - //const requestId = uuidv4() - const requestId = uuidv4() - var message = { - msg: "method", - method: "sendMessage", - id: requestId, - params: [{ - rid: roomId, - localReference: localReference, - msg: msg, - attachments, - file - }] - } - - // - - this.ws.send({ message, requestId }); - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve({ message, requestId }) - return true - } - } - }) - }); - } - - updateMessage(messageObject) { - - //const requestId = uuidv4() - const requestId = uuidv4() - var message = { - msg: "method", - method: "updateMessage", - id: requestId, - params: [messageObject] - } - - this.ws.send({ message, requestId }); - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve({ message, requestId }) - return true - } - } - }) - }) - - } - - leaveRoom(roomId) { - - const requestId = uuidv4() - - var message = { - msg: "method", - method: "leaveRoom", - id: requestId, - params: [ - roomId, - ] - } - - this.ws.send({ message, requestId }); - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - } - - addRoomOwner(roomId, userId) { - - const requestId = uuidv4() - - var message = { - msg: "method", - method: "addRoomOwner", - id: requestId, - params: [ - roomId, - userId - ] - } - - this.ws.send({ message, requestId }); - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - } - - hidingRoom(roomId) { - - const requestId = uuidv4() - - var message = { - msg: "method", - method: "hideRoom", - id: requestId, - params: [roomId] - } - - this.ws.send({ message, requestId }); - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - // - - return true - } - } - }) - }); - } - - joinRoom() { } - - deleteMessage(msgId) { - //const requestId = uuidv4(); - const requestId = uuidv4() - var message = { - msg: "method", - method: "deleteMessage", - id: requestId, - params: [{ "_id": msgId }] - } - - this.ws.send({ message, requestId }); - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { - resolve(message) - return true - } - } - }) - }); - } - - createPrivateRoom(groupName, username, customFields) { - const requestId = uuidv4() - - var message = { - msg: "method", - method: "createPrivateGroup", - id: requestId, - params: [ - groupName, - [username], - false, - customFields, - { - "broadcast": false, - "encrypted": false - } - ] - } - - this.ws.send({ message, requestId }); - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - } - - sendStreamNotifyRoom(roomId: string, username, event: 'typing', param: any) { - - const requestId = uuidv4() - - let message = { - msg: "method", - method: "stream-notify-room", - id: requestId, - params: [ - `${roomId}/${event}`, - username, - param - ] - }; - - this.ws.send({ message, requestId }) - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - - } - - - subStreamNotifyRoom(roomId: string, event: 'typing' | 'deleteMessage' | 'readMessage', param: any) { - - const requestId = uuidv4() - - let message = { - msg: "sub", - id: requestId, - name: "stream-notify-room", - params: [ - `${roomId}/${event}`, - param - ] - } - - - this.ws.send({ message, requestId }) - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - return true - } - - if (message.id == requestId || message?.subs?.[0] == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - - } - - - subStreamNotifyUser(param?: any) { - - const requestId = uuidv4() - - let message = { - msg: "sub", - id: requestId, - name: "stream-notify-user", - params: [ - `${SessionStore.user.ChatData.data.userId}/notification`, - param - ] - } - - - this.ws.send({ message, requestId }) - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - - } - - subStreamMessageUser(param?: any) { - - const requestId = uuidv4() - try { - let message = { - msg: "sub", - id: requestId, - name: "stream-notify-user", - params: [ - `${SessionStore.user.ChatData.data.userId}/message`, - param - ] - } - - - this.ws.send({ message, requestId }) - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - } catch (error) { - throw (SessionStore) - } - } - - receiveStreamNotifyRoom(funx: Function) { - - this.ws.registerCallback({ - type: 'Onmessage', - funx: (message) => { - if (message.collection == "stream-notify-room" && message.msg == 'changed') { - funx(message) - } - } - }) - } - - - getUserStatus(funx: Function) { - this.ws.registerCallback({ - type: 'Onmessage', - funx: (message) => { - if (message.msg == 'changed' && message.collection == "stream-notify-logged") { - funx(message) - } - } - }) - } - - - loadHistory(roomId, limit: number = 50) { - - const requestId = uuidv4() - - const message = { - msg: "method", - method: "loadHistory", - id: requestId, - params: [ - roomId, - null, - limit, - { - "$date": 1480377601 - } - ] - } - - this.ws.send({ message, requestId: 'loadHistory' }) - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - // - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - } - - - loadHistoryUnread(roomId, limit: number = 50) { - - const requestId = uuidv4() - - const message = { - msg: "method", - method: "loadHistory", - id: requestId, - params: [ - roomId, - null, - limit, - { - "$date": 1480377601 - } - ] - } - - this.ws.send({ message, requestId: 'loadHistory' }) - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - // - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - } - - setStatus(status: 'online' | 'busy' | 'away' | 'offline') { - - const requestId = uuidv4() - - const message = { - - msg: "method", - method: `UserPresence:setDefaultStatus`, - id: requestId, - params: [status] - - } - - this.ws.send({ message, requestId }) - - } - - subscribeNotifyRoom(roomId: string) { - - const requestId = uuidv4() - - var message = { - "msg": "sub", - "id": requestId, - "name": "stream-notify-room", - "params": [ - `${roomId}/event`, - false - ] - } - - this.ws.send({ message, requestId }); - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.msg == 'ready' || deepFind(message, 'subs.0') == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - - } - - updateRoomEventss(roomId, collection: string, funx: Function,) { - - this.ws.registerCallback({ - type: 'Onmessage', - funx: (message) => { - // - - if (message.msg == 'changed' && message.collection == collection) { - if (message.fields.args[0].rid == roomId) { - funx(message) - } - else if (message.fields.eventName == `${roomId}/deleteMessage`) { - funx(message) - } - } - } - }) - } - - streamRoomMessages(roomId: string) { - - const requestId = "streamRoomMessages" + uuidv4() - - const message = { - "msg": "sub", - "id": requestId, - "name": "stream-room-messages", - "params": [ - `${roomId}`, - false - ] - } - - this.ws.send({ message, requestId }); - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - - - if (message.id == requestId || message?.subs?.[0] == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - } - - streamNotifyLogged() { - - const requestId = uuidv4() - - const message = { - "msg": "sub", - "id": requestId, - "name": "stream-notify-logged", - "params": [ - "user-status", - false - ] - } - - this.ws.send({ message, requestId }); - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - } - - streamNotifyRoom(roomId: string) { - - const requestId = uuidv4() - - let message = { - "msg": "method", - "method": "stream-notify-room", - "id": requestId, - "params": [ - `null/typing`, - "paulo.pinto", - true - ] - }; - - this.ws.send({ message, requestId }) - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - - } - - streamNotifyRoomDeleteMessage(roomId: string) { - - const requestId = uuidv4() - - let message = { - "msg": "sub", - "id": requestId, - "name": "stream-notify-room", - "params": [ - `${roomId}/deleteMessage`, - true - ] - }; - - this.ws.send({ message, requestId }) - - return new Promise((resolve, reject) => { - this.ws.registerCallback({ - type: 'Onmessage', funx: (message) => { - if (message.id == requestId) { // same request send - resolve(message) - return true - } - } - }) - }); - - } - - registerCallback(data: wsCallbacksParams) { - return this.ws.registerCallback(data) - } - - // socket class ================================================================== - private socket!: WebSocket; - private wsMsgQueue: { [key: string]: msgQueue } = {} - private wsCallbacks: { [key: string]: wsCallbacksParams } = {} - private wsReconnect = 0 - - private n = 0 - - ws = { - connected: false, - registerCallback: (params: wsCallbacksParams) => { - - let id = params.requestId || params.key || uuidv4() - // - this.wsCallbacks[id] = params - this.n++ - return id - }, - connect: () => { - this.socket = new WebSocket(environment.apiWsChatUrl); - // bind function - this.socket.onopen = this.ws.onopen; - this.socket.onmessage = this.ws.onmessage; - this.socket.onclose = this.ws.onclose; - this.socket.onerror = this.ws.onerror; - - }, - onopen: async () => { - - - - this.ws.connected = true - this.backgroundservice.online(); - - setTimeout(() => { - this.ws.wsMsgQueue() - }, 10) - console.log('rec conect') - - if (this.wsReconnect >= 1) { - for (const [key, value] of Object.entries(this.wsCallbacks)) { - if (value.type == 'reConnect') { - const dontRepeat = await value.funx() - - if (dontRepeat) { - this.n-- - delete this.wsCallbacks[key] - } - - } - - } - } - - this.wsReconnect++; - }, - wsMsgQueue: () => { - - for (const [key, item] of Object.entries(this.wsMsgQueue)) { - - if (item.loginRequired == true && this.isLogin == true) { - // - this.ws.send(item); - delete this.wsMsgQueue[key] - } else if (item.loginRequired == false) { - // - this.ws.send(item); - delete this.wsMsgQueue[key] - } - } - }, - send: ({ message, requestId = uuidv4(), loginRequired = true }: send) => { - - if (this.ws.connected == false || loginRequired == true && this.isLogin == false) { // save data to send when back online - // - // - - this.wsMsgQueue[requestId] = { message, requestId, loginRequired } - } else { - let messageStr = JSON.stringify(message) - this.socket.send(messageStr) - } - return requestId - }, - - onmessage: async (event: any) => { - - this.backgroundservice.online(); - - const data = JSON.parse(event.data) - - for (const [key, value] of Object.entries(this.wsCallbacks)) { - if (value.type == 'Onmessage') { - const dontRepeat = await value.funx(data) - - if (dontRepeat) { - delete this.wsCallbacks[key] - this.n-- - } - - } - - } - - }, - - onclose: async (event: any) => { - this.ws.connected = false - this.isLogin = false - - - this.connect() - this.login() - - for (const [key, value] of Object.entries(this.wsCallbacks)) { - if (value.type == 'Offline') { - const dontRepeat = await value.funx() - - if (dontRepeat) { - delete this.wsCallbacks[key] - this.n-- - } - - } - - } - - - }, - - onerror: (event: any) => { - - }, - disconnect: () => { - - if (this.socket) { - this.socket.onopen = (event: any) => { } - this.socket.onmessage = (event: any) => { } - this.socket.onclose = (event: any) => { } - this.socket.onerror = (event: any) => { } - this.socket.close() - } - } - - } -} diff --git a/src/app/services/chat/room.service.ts b/src/app/services/chat/room.service.ts deleted file mode 100644 index 711e05fc5..000000000 --- a/src/app/services/chat/room.service.ts +++ /dev/null @@ -1,1299 +0,0 @@ -import { Injectable } from '@angular/core'; -import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service'; -import { MessageService, MessageServiceDateLabel } from 'src/app/services/chat/message.service'; -import { showDateDuration } from 'src/plugin/showDateDuration'; -import { chatHistory } from 'src/app/models/chatMethod'; -import { Storage } from '@ionic/storage'; -import { ModalController, NavController, Platform } from '@ionic/angular'; -import { SqliteService } from 'src/app/services/sqlite.service'; -import { NativeNotificationService } from 'src/app/services/native-notification.service'; -import { SessionStore } from 'src/app/store/session.service'; -import { capitalizeTxt } from 'src/plugin/text' -import { SortService } from '../functions/sort.service'; -import { chatUser } from 'src/app/models/chatMethod'; -import { environment } from 'src/environments/environment'; -import { ChatService } from 'src/app/services/chat.service'; -import { NfService } from 'src/app/services/chat/nf.service'; -import { v4 as uuidv4 } from 'uuid' -import { ChatMethodsService } from './chat-methods.service'; -import { DeleteMessageModel, MessageModel } from '../../models/beast-orm'; -import { AESEncrypt } from '../aesencrypt.service'; -import { IncomingChatMessage, ChatMessageInterface, falseTypingMethod } from 'src/app/models/message.model'; -import { AttachmentsService } from 'src/app/services/attachments.service'; -import { ConnectionStatus, NetworkServiceService } from 'src/app/services/network-service.service'; -import { ChatSystemService } from './chat-system.service'; -import { ViewedMessageService } from './viewed-message.service' -import * as FIFOProcessQueue from 'fifo-process-queue'; -import { NotificationsService } from '../notifications.service'; - -@Injectable({ - providedIn: 'root' -}) -export class RoomService { - - messages: MessageService[] = [] - storageMessage: any[] = []; - lastMessage: MessageService; - messagesBeforeOfflineAPI: MessageService[] = [] - - customFields: any; - id = '' - t = '' - name = '' - _updatedAt = {} - hasLoadHistory = false - DoneLoadingHistory = false - restoreFromOffline = false - duration = '' - isTyping = false - otherUserType = false - lastTimeType = null - message = '' - lastMessageTxt = '' - userThatIsTyping = '' - messagesLocalReference: string[] = [] - members: chatUser[] = [] - membersExcludeMe: chatUser[] = [] - u - sessionStore = SessionStore - countDownTime = '' - chatOpen = false - messageUnread = false - - status = { - receive: { - message: false, - typing: false, - readMessage: false, - deleteMessage: false - } - } - - isGroup: boolean - subscribeAttempt = false - - scrollDown = () => { } - - /** - * @description get user list from ws-chat-methods.service - * @returns chatUser[] - */ - getAllUsers = (): chatUser[] => { - return [] - } - - sortRoomList = () => { } - chatServiceDeleteRoom = (roomId) => { } - - constructor( - public RochetChatConnectorService: RochetChatConnectorService, - private MessageService: MessageService, - private storage: Storage, - private platform: Platform, - private sqlservice: SqliteService, - private NativeNotificationService: NativeNotificationService, - private sortService: SortService, - private chatService: ChatService, - private NfService: NfService, - private ChatMethodsService: ChatMethodsService, - private AESEncrypt: AESEncrypt, - private AttachmentsService: AttachmentsService, - private NetworkServiceService: NetworkServiceService, - private ChatSystemService: ChatSystemService, - private ViewedMessageService: ViewedMessageService, - private notificationService: NotificationsService, - private modalController: ModalController, - private navController: NavController - ) { - /* this.NativeNotificationService.askForPermission() */ - - this.RochetChatConnectorService.getUserStatus((d) => { - - const userId = d.fields.args[0][0] - const statusNum = d.fields.args[0][2] - const statusText = this.statusNumberToText(statusNum) - - this.ViewedMessageService.request(this, userId, statusNum, statusText) - - }) - - this.RochetChatConnectorService.registerCallback({ - type: 'Offline', - funx: () => { - /** - * @description when the phone is in the background for a long time it could disconnects from the socket then the socket reconnects automatically, - * when the connection is lost the subscribe is also lost, so we have to subscribe again when reconnection is establish. - */ - this.resetStatus(); - this.hasLoadHistory = false - this.subscribeAttempt = false - } - }); - - } - - /** - * @description convert rocketchat statues num to readable string - * @param text - * @returns - */ - statusNumberToText(text) { - if (text == '0') { - return "offline" - } - else if (text == '1') { - return "online" - } - else if (text == '2') { - return "away" - } - else if (text == '3') { - return "busy" - } - } - - - resetStatus() { - this.status = { - receive: { - message: false, - typing: false, - readMessage: false, - deleteMessage: false - } - } - } - - setDataOnce = false - setData({ membersExcludeMe, members, u, customFields = {}, id, name, t, lastMessage = new MessageService(this.NfService, this.RochetChatConnectorService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService, this.ChatSystemService, this.notificationService), _updatedAt }) { - this.customFields = customFields - this.id = id - this.name = name - this.t = t - this.lastMessage = lastMessage - this._updatedAt = _updatedAt - this.u = u - this.calDateDuration(); - - - if (this.customFields?.countDownDate) { - this.countDownDate(this.customFields.countDownDate); - } - - if (this.setDataOnce == false) { - this.setDataOnce = true - this.updateContacts() - } - - } - - updateInfo() { - // this.chatService.getRoomInfo(this.id).toPromise(); - - } - - get online() { - - if (!this.isGroup) { - for (let user of this.ChatSystemService.users) { - - for (const members of this.membersExcludeMe) { - if (members._id == user._id) { - return user.status - } - } - - } - } - - return 'offline' - } - - countDownDate(date) { - let difference = new Date(date).getTime() - new Date().getTime(); - let c_day = Math.floor(difference / (1000 * 60 * 60 * 24)); - let c_hours = Math.floor((difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); - let c_minutes = Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60)); - let c_seconds = Math.floor((difference % (1000 * 60)) / 1000); - - this.countDownTime = this.addZero(c_day) + " : " + this.addZero(c_hours) + " : " + this.addZero(c_minutes) + " : " + this.addZero(c_seconds); - - if (difference < 0) { - - this.deleteRoom(); - if(this.chatOpen && window.location.pathname.includes('chat')) { - this.closeModal() - } - - } else { - setTimeout(() => { - this.countDownDate(date) - }, 1000) - } - } - - addZero(i) { - if (i < 10) { - i = "0" + i; - } - return i; - } - - deleteRoom() { - this.countDownTime = "Expired"; - let body = { "roomId": this.id } - - // this.chatService.getRoomInfo(this.id).subscribe( room =>{}); - - if (this.t === 'p') { - this.chatService.deleteGroup(body).subscribe(res => { - this.ChatSystemService.deleteRoom(this.id); - this.ChatSystemService.getAllRooms(); - this.chatServiceDeleteRoom(this.id); - }, (error)=> { - if(error.status != 0) { - this.ChatSystemService.deleteRoom(this.id); - this.ChatSystemService.getAllRooms(); - this.chatServiceDeleteRoom(this.id); - } - }); - } - else { - this.chatService.deleteChannel(body).subscribe(res => { - this.ChatSystemService.deleteRoom(this.id); - this.ChatSystemService.getAllRooms(); - this.chatServiceDeleteRoom(this.id); - }, (error)=> { - if(error.status != 0) { - this.ChatSystemService.deleteRoom(this.id); - this.ChatSystemService.getAllRooms(); - this.chatServiceDeleteRoom(this.id); - } - }); - } - } - - - isSenderIsNotMe(ChatMessage) { - return SessionStore.user.UserName != ChatMessage.u.username - } - - senderId(ChatMessage) { - return ChatMessage.u._id - } - - receiveMessage() { - - this.RochetChatConnectorService.updateRoomEventss( - this.id, - "stream-room-messages", - async (IncomingChatMessage: IncomingChatMessage) => { - - this.appendReceiveMessage.push(IncomingChatMessage) - - } - ) - - this.RochetChatConnectorService.receiveStreamNotifyRoom((message) => { - - if (message.fields.eventName == this.id + '/' + 'typing') { - - const args = message.fields.args - - if (typeof args[1] != 'object') { - this.userThatIsTyping = this.usernameToDisplayName(args[0]) - - const user = args[0] - if (SessionStore.user.UserName != user) { - this.readAllMessage() - this.isTyping = args[1] - this.otherUserType = args[1] - } - - } else if (args[0]?.method == 'viewMessage' || args[1]?.method == 'viewMessage') { - const user = args[0] - - if (SessionStore.user.UserName != user) { - this.readAllMessage() - } - - } else if (args[0]?.method == 'deleteMessage' || args[1]?.method == 'deleteMessage') { - - this.deleteMessage(args[1]?.method?._id) - - } else { - - } - - } else if (message.fields.eventName == this.id + '/' + 'deleteMessage') { } - - }) - } - - appendReceiveMessage = FIFOProcessQueue(async (IncomingChatMessage: IncomingChatMessage, done) => { - - let IncomingChatMessageArgs = IncomingChatMessage.fields.args[0] - let ChatMessage: ChatMessageInterface = this.fix_updatedAt(IncomingChatMessageArgs) - - - let found = this.findMessageBy_id(ChatMessage._id) || - this.findMessageBy_localReference(ChatMessage?.localReference) - // || await this.findMessageInDBByData({_id:ChatMessage._id, localReference:ChatMessage.localReference }) - - if (!found) { - - ChatMessage.origin = 'stream' - const message = await this.prepareCreate({ message: ChatMessage, save: false }); - this.registerSendMessage(message) - - message.from = 'stream' - message.loadHistory = this.DoneLoadingHistory - - this.lastMessage = message; - - try { - this.calDateDuration(ChatMessage._updatedAt); - } catch (error) { - console.log(error) - } - - - if (message.t == 'r') { - this.name = message.msg; - } - - //if (this.isSenderIsNotMe(ChatMessage)) { - /* this.NativeNotificationService.sendNotificationChat({ - message: message.msg, - title: this.name - }); */ - //} - - if (this.hasLoadHistory == true) { - this.messages.push(message) - message.addMessageDB() - } else { - this.messagesBeforeOfflineAPI.push(message) - } - - this.messageUnread = true - setTimeout(() => { - this.scrollDown() - }, 50) - - } - - if (ChatMessage?.t == "au" || ChatMessage?.t == "ru" || ChatMessage?.t == "ul") { - this.updateContacts() - } else if (ChatMessage?.t == "r") { - this.name = ChatMessage.msg - } - - this.sortRoomList() - // this.changeDetector() - setTimeout(() => { - done() - }, 5) - }) - - - async info() { - - // set unread messages - const response: any = await this.chatService.GetSubscriptionRoomUnreadM(this.id).toPromise() - - if(response?.subscription?.unread >= 1) { - this.messageUnread = true - } - } - - getUsersByStatus(status: 'offline' | 'online') { - - return this.getAllUsers().filter((user => { - for (const member of this.membersExcludeMe) { - if (user._id == member._id && user.status == status) { - return true - } - } - })) - - } - - getRoomMembersIds(): string[] { - try { - return this.membersExcludeMe.map((user) => user._id) - } catch (error) { - return [] - } - - } - - getAllMemberThatIsNotOffline(): string[] { - - const membersIds = this.getRoomMembersIds() - const allChatUsers = this.getAllUsers() - - const AllMemberThatIsNotOffline = [] - - for (let user of allChatUsers) { - if (membersIds.includes(user._id)) { - - if (user.status != 'offline') { - AllMemberThatIsNotOffline.push(user._id) - } - } - } - - return AllMemberThatIsNotOffline - } - - getAllMemberThatIsOffline(): string[] { - - const membersIds = this.getRoomMembersIds() - const allChatUsers = this.getAllUsers() - - const AllMemberThatIsNotOffline = [] - - for (let user of allChatUsers) { - if (membersIds.includes(user._id)) { - - if (user.status == 'offline') { - AllMemberThatIsNotOffline.push(user._id) - } - } - } - - return AllMemberThatIsNotOffline - } - - - async deleteMessageToReceive(userId) { - - const allDeleteMessages = await DeleteMessageModel.filter({ rid: this.id }).execute() - - for (let message_ of allDeleteMessages) { - - if (message_.needToReceiveBy.includes(userId)) { - - message_.needToReceiveBy = message_.needToReceiveBy.filter((e) => e != userId) - this.sendFalseTypingReadMessage('deleteMessage', { _id: message_.messageId }) - - if (message_.needToReceiveBy.length == 0) { - - const deleteMessage = await DeleteMessageModel.get({ messageId: message_.messageId }) - await deleteMessage.delete() - - } else { - await DeleteMessageModel.update(message_) - } - - } - - } - - } - - async receiveMessageDelete() { - - this.RochetChatConnectorService.updateRoomEventss( - this.id, - "stream-notify-room", - async (ChatMessage) => { - const DeletedMessageId = ChatMessage.fields.args[0]._id; - - const message = this.messages.find((e) => e._id == DeletedMessageId) - - if (message) { - if (message.delate == false) { - this.deleteMessage(DeletedMessageId) - } - } else { - const message = await MessageModel.get({ _id: DeletedMessageId }) - if (message) { - (message as MessageModel).delete() - - DeleteMessageModel.create({ - messageId: DeletedMessageId, - rid: this.id, - ts: "", - u: {}, - needToReceiveBy: [] - }) - - } - } - - - } - ) - } - - /** - * @description delete message in the view - * @param id message ID - */ - async deleteMessage(_id) { - - const id = _id - - for (let i = 0; i <= this.messages.length; i++) { - - if (this.messages[i]?._id == id) { - - - if (SessionStore.user.UserName == this.messages[i]?.u?.username) { - const allMemberThatIsOffline = this.getAllMemberThatIsOffline() - - DeleteMessageModel.create({ - messageId: this.messages[i]._id, - rid: this.messages[i].rid, - ts: this.messages[i].ts, - u: this.messages[i].u, - needToReceiveBy: allMemberThatIsOffline - }) - } - - this.messages[i]?.delateDB() - this.messages.splice(i, 1) - - //Get previous last message from room - const previousLastMessage = this.messages.slice(-1)[0]; - - if (previousLastMessage.dateLabel == false) { - if (previousLastMessage) { - this.lastMessage = previousLastMessage; - this.calDateDuration(previousLastMessage._updatedAt) - this.sortRoomList() - } - } else { - const previousLastMessage = this.messages.slice(-2)[0]; - - if (previousLastMessage) { - this.lastMessage = previousLastMessage; - this.calDateDuration(previousLastMessage._updatedAt) - this.sortRoomList() - } - - } - - - - return true - - } else { - // - } - } - - } - - - /** - * @description delete message in the view - * @param id message ID - */ - async deleteMessageFromArray(_id) { - - const id = _id - - for (let i = 0; i <= this.messages.length; i++) { - - if (this.messages[i]?._id == id) { - - this.messages.splice(i, 1) - - return true - - } else { - // - } - } - - } - - - deleteAll() { - this.messages.forEach((message) => { - if (message?._id) { - this.sendDeleteRequest(message._id) - } - }) - } - - async delateMessageToSendToOthers(userId) { - - const deleteMessage = await DeleteMessageModel.all(); - - const toSend = deleteMessage.filter((DeleteMessage: string[]) => !DeleteMessage.includes(userId)) - - } - - - async sendDeleteRequest(msgId) { - - const message = this.messages.find((e) => e._id == msgId) - await message.delateStatusFalse() - - if (this.NetworkServiceService.getCurrentNetworkStatus() == ConnectionStatus.Online) { - - this.RochetChatConnectorService.deleteMessage(msgId).then(async () => { - message.delateRequest = true - await message.saveChanges(); - this.deleteMessage(msgId); - }) - - } else { - this.RochetChatConnectorService.registerCallback({ - type: 'reConnect', - funx: async () => { - - this.sendDeleteRequest(msgId) - return true - } - }) - } - - } - - - /** - * @description sen text message - */ - async send({ file = null, attachments = null, temporaryData = {}, attachmentsModelData = {} }) { - - this.message = this.message.replace(/(\n$)/, '') - - if (file && this.message) { - this.send({}) - } - - const localReference = uuidv4(); - - let offlineChatMessage = { - rid: this.id, - msg: this.message, - attachments, - file, - temporaryData, - localReference, - origin: 'local', - attachmentsModelData - } - - - //console.log('offlineChatMessage', offlineChatMessage) - - this.message = '' - - this.hojeLabel({ ...offlineChatMessage }) - - const message: MessageService = await this.prepareCreate({ message: offlineChatMessage, save: environment.chatOffline }) - this.registerSendMessage(message) - - if (this.hasLoadHistory == true) { - await message.addMessageDB() - } - - message.send() - message.from = 'send' - message.loadHistory = this.hasLoadHistory - - if (environment.chatOffline) { - - setTimeout(() => { - this.scrollDown() - }, 150) - - this.lastMessage = message - this.calDateDuration(message._updatedAt) - this.sortRoomList() - } - } - - - /** - * Register all send message so that - * the incoming message wont be confuse to - * other user the localReference is the identifier - */ - registerSendMessage(message: MessageService) { - this.messagesLocalReference.push(message.localReference) - } - - - localReferenceExist(message: MessageService) { - for (const localReference of this.messagesLocalReference) { - if (localReference == message?.localReference) { - return true - } - } - return false - } - - sendTyping(text: string = this.message) { - - if (this.lastMessageTxt == text) { return false } - this.lastTimeType = new Date().getTime() - - const lastIsTyping = this.isTyping - if (text.length >= 1) { - this.isTyping = true - } else { - this.isTyping = false - } - - if (lastIsTyping != this.isTyping) { - this.RochetChatConnectorService.sendStreamNotifyRoom(this.id, SessionStore.user.UserName, 'typing', this.isTyping).catch((error) => console.error(error)); - } - - this.lastMessageTxt = this.message - this.typingWatch() - } - - sendFalseTypingReadMessage(method, param: object) { - this.RochetChatConnectorService.sendStreamNotifyRoom(this.id, SessionStore.user.UserName, 'typing', { method: method, params: param } as falseTypingMethod).catch((error) => console.error(error)) - this.setTypingOff() - } - - private typingWatch() { - setTimeout(() => { - const now = new Date().getTime() - - if ((now - this.lastTimeType) >= 2888) { - - if (this.isTyping == true) { - this.isTyping = false - this.RochetChatConnectorService.sendStreamNotifyRoom(this.id, SessionStore.user.UserName, 'typing', this.isTyping).catch((error) => console.error(error)) - } - } - - }, 3000) - } - - private setTypingOff() { - this.sendTyping('') - } - - roomLeave() { - this.setTypingOff() - this.chatOpen = false - } - - open() { - // this.typing(this.message) - this.chatOpen = true - this.messageUnread = false - this.sendReadMessage() - } - - - leave(rid?) { - this.RochetChatConnectorService.leaveRoom(this.id).catch((error) => console.error(error)) - } - - isJson(str) { - try { - JSON.parse(str); - } catch (e) { - return ""; - } - return JSON.parse(str); - } - - formatDateToDDMMYYYY(dateStamp) { - const date = new Date(dateStamp); - - const day = date.getDate().toString().padStart(2, '0'); - const month = (date.getMonth() + 1).toString().padStart(2, '0'); // Month is zero-based - const year = date.getFullYear(); - - return `${day}-${month}-${year}`; - } - - sortArrayISODate(messages: any): any[] { - - return messages.sort((a, b) => - new Date(b._updatedAt).getTime() - - - new Date(a._updatedAt).getTime()) - } - - restoreOnce = false - labelDates = [] - - - goshPush(ChatMessage) { - let currentDateMessage = new Date(ChatMessage._updatedAt).toLocaleDateString() - - if (currentDateMessage) { - if (!this.labelDates.find(e => e == currentDateMessage)) { - this.labelDates.push(currentDateMessage) - - const newMessage = this.fix_updatedAt({ ...ChatMessage }) - newMessage.msg = currentDateMessage - const cloneMessage = new MessageServiceDateLabel() - - cloneMessage.ChatSystemService = this.ChatSystemService - cloneMessage.setData({ ...newMessage } as any) - // - cloneMessage._id = "" - cloneMessage._updatedAt = "" - cloneMessage.duration = "" - cloneMessage.msg = currentDateMessage - cloneMessage.dateLabel = true - cloneMessage.delate = false - cloneMessage.file = undefined - cloneMessage.attachments = undefined - - if (new Date().toLocaleDateString() == currentDateMessage) { - - cloneMessage.msg = "hoje" - } else { - cloneMessage.msg = currentDateMessage - } - - this.messages.push(cloneMessage as any) - - // console.log(currentDateMessage) - } - } - } - - async deleteMessageDate(MessageService: MessageService) { - - let currentDateMessageToDelete = new Date(MessageService._updatedAt).toLocaleDateString() - - for (let i = 0; i <= this.messages.length; i++) { - - let currentDateMessage = new Date(this.messages[i]._updatedAt).toLocaleDateString() - - if (currentDateMessageToDelete == currentDateMessage) { - return - } - } - - for (let i = 0; i <= this.messages.length; i++) { - if (this.messages[i].dateLabel) { - if (this.messages[i].msg == currentDateMessageToDelete) { - this.messages.splice(i, 1) - } - } - } - - } - - - hojeLabel(offlineChatMessage: any) { - let currentDateMessage = new Date().toLocaleDateString() - if (!this.labelDates.find(e => e == currentDateMessage)) { - - this.labelDates.push(currentDateMessage) - - const cloneMessage = new MessageServiceDateLabel() - - cloneMessage.ChatSystemService = this.ChatSystemService - cloneMessage.setData({ ...offlineChatMessage } as any) - - cloneMessage.msg = "hoje" - cloneMessage._id = "" - cloneMessage._updatedAt = "" - cloneMessage.duration = "" - cloneMessage.dateLabel = true - cloneMessage.delate = false - cloneMessage.attachments = undefined - cloneMessage.file = undefined - - this.messages.push(cloneMessage as any) - } - } - - async restoreMessageFromDB() { - if (environment.chatOffline && this.restoreOnce == false) { - this.restoreOnce = true - - const messages = this.sortArrayISODate(await MessageModel.filter({ rid: this.id }).execute()).reverse() - - for (let ChatMessage of messages) { - - - this.goshPush(ChatMessage) - - - const wewMessage = await this.simplePrepareMessage(ChatMessage) - - wewMessage.from = 'Offline' - wewMessage.loadHistory = this.hasLoadHistory - wewMessage.messageModelInstance = ChatMessage - - if (wewMessage.offline == false) { - - const message = await this.prepareCreate({ message: ChatMessage }) - - - message.from = 'Offline' - message.loadHistory = this.hasLoadHistory - wewMessage.messageModelInstance = ChatMessage - message?.decryptMessage() - - } else { - - const offlineMessage = await this.prepareCreate({ message: ChatMessage }) - - offlineMessage.from = 'Offline' - offlineMessage.loadHistory = this.hasLoadHistory - wewMessage.messageModelInstance = ChatMessage - this.registerSendMessage(offlineMessage) - offlineMessage?.decryptMessage() - offlineMessage.send() - - } - - if (wewMessage.delate && !wewMessage.offline && !wewMessage.delateRequest) { - this.sendDeleteRequest(wewMessage._id) - } - } - - if (!this.lastMessage) { - this.lastMessage = messages.pop(); - } - - - setTimeout(() => { - this.scrollDown() - }, 50) - } - } - - // runs onces only - loadHistoryCount = 0 - localMessages = [] - async loadHistory({ limit = 1000, forceUpdate = false }) { - - if (forceUpdate == false) { - if (this.hasLoadHistory) { - return false - } - } - - this.hasLoadHistory = true - - await this.restoreMessageFromDB() - const chatHistory: chatHistory = await this.RochetChatConnectorService.loadHistory(this.id, limit) - - this.localMessages = this.messages.map(e => e._id) - - if (Array.isArray(chatHistory?.result?.messages)) { - - const users = this.getUsersByStatus('online') - - if(chatHistory.result.unreadNotLoaded >= 1) { - this.messageUnread = true - } - - for (let message of chatHistory.result.messages.reverse()) { - - message.origin = 'history' - message.from = 'History' - const messagesToSave = await this.prepareMessageCreateIfNotExist({ message: message }); - if (messagesToSave != null) { - - messagesToSave.received = users.map((user) => user._id) - messagesToSave.addMessageDB() - } - - } - - - for (const message of this.messagesBeforeOfflineAPI) { - const messagesToSave = await this.prepareMessageCreateIfNotExist({ message: message }); - if (messagesToSave != null) { - - messagesToSave.received = users.map((user) => user._id) - - this.addMessageDB.push(messagesToSave) - } - } - this.messagesBeforeOfflineAPI = [] - - setTimeout(() => { - this.scrollDown() - }, 50) - - } - - this.DoneLoadingHistory = true - - if (chatHistory?.result?.messages) { - - if (!this.lastMessage) { - this.lastMessage = chatHistory?.result?.messages.pop() as any - } - } - - this.deletedMessages(chatHistory) - } - - - deletedMessages(chatHistory: chatHistory) { - - const messagesToDelete = this.localMessages.filter(id => { - const found = chatHistory.result.messages.find(e => { - return e._id == id - }) - if (!found) { - return true - } - - return false - }) - - - for (const id of messagesToDelete) { - if (id != '') { - this.deleteMessage(id) - } - } - } - - addMessageDB = FIFOProcessQueue(async ({ messagesToSave }, callback) => { - - await messagesToSave.addMessageDB() - callback() - }) - - async readAllMessage() { - - this.ViewedMessageService.requestReadAll(this) - - } - - - - async ChatMessageIsPresentInTheView(ChatMessage: ChatMessageInterface) { - let foundIndex; - - const found = this.messages.find((MessageService, index) => { - if (MessageService._id == ChatMessage._id) { - foundIndex = index - return true - } else { - return false - } - }) - - if (foundIndex) { - return { found, foundIndex } - } else { - return false - } - } - - - - - async prepareCreate({ message, save = true }): Promise { - message = this.fix_updatedAt(message) - - const wewMessage = new MessageService(this.NfService, this.RochetChatConnectorService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService, this.ChatSystemService, this.notificationService) - wewMessage.setData(message) - wewMessage.loadHistory = this.hasLoadHistory - - if (save) { - this.messages.push(wewMessage) - } - - return wewMessage - } - - - simplePrepareMessage(message) { - message = this.fix_updatedAt(message) - const wewMessage = new MessageService(this.NfService, this.RochetChatConnectorService, this.ChatMethodsService, this.AESEncrypt, this.AttachmentsService, this.NetworkServiceService, this.ChatSystemService, this.notificationService) - wewMessage.setData(message) - wewMessage.loadHistory = this.hasLoadHistory - - return wewMessage - } - - - private findMessageBy_id(id) { - for (let m of this.messages) { - if (m?._id == id) { - return true - } - } - - return false - } - - private findMessageBy_localReference(localReference) { - for (let m of this.messages) { - if (m?.localReference == localReference) { - return true - } - } - - return false - } - - private async findMessageInDBByLocalReference({ localReference }) { - const a = await MessageModel.get({ localReference: localReference }) - - return typeof a.id == 'number' - } - - private async findMessageInDBByLocalId({ _id }) { - const a = await MessageModel.get({ _id: _id }) - return typeof a.id == 'number' - } - - private async findMessageInDBByData({ localReference, _id }) { - - const a = await MessageModel.filter({ localReference: localReference }).execute() - if (a.length >= 1) { - - return true - } - - const c = await MessageModel.filter({ _id: _id }).execute() - if (c.length >= 1) { - - return true - } - - - return false - } - - async prepareMessageCreateIfNotExist({ message }) { - message = this.fix_updatedAt(message) - - let found = await this.findMessageBy_id(message._id) || await this.findMessageBy_localReference(message.localReference) - // || await this.findMessageInDBByData({_id:message._id, localReference:message.localReference }) - - if (!found) { - const wewMessage = this.simplePrepareMessage(message) - this.goshPush(wewMessage) - this.messages.push(wewMessage) - return wewMessage - } else { - return null - } - } - - private calDateDuration(date = null) { - this.duration = showDateDuration(date || this._updatedAt); - this._updatedAt = date || this._updatedAt - } - - private fix_updatedAt(message): ChatMessageInterface { - if (message?.result) { - message.result._updatedAt = message.result._updatedAt['$date'] - } else if (message?._updatedAt) { - if (message._updatedAt.hasOwnProperty('$date')) { - message._updatedAt = message._updatedAt['$date'] - } - } - return message - } - - usernameToDisplayName(username) { - - try { - const firstName = capitalizeTxt(username.split('.')[0]) - const lastName = capitalizeTxt(username.split('.')[1]) - return firstName + ' ' + lastName - } catch (error) { - return username - } - - } - - sendReadMessage() { - this.RochetChatConnectorService.readMessage(this.id).catch((error) => { - console.error(error) - }) - this.sendFalseTypingReadMessage('viewMessage', {}) - this.messageUnread = false - } - - async addContacts(userId: any) { - - let body = { - "roomId": this.id, - "userId": userId, - } - - await this.chatService.addUserToGroup(body).toPromise(); - this.ChatSystemService.getGroupRoom(this.id).updateContacts() - } - - - async updateContacts() { - - let res - let error = false - - if (this.t == 'd') { - - try { - res = await this.chatService.getMembers(this.id).toPromise(); - } catch (e) { - await this.chatService.refreshtoken(); - error = true - } - - if (error) { - res = await this.chatService.getMembers(this.id).toPromise(); - } - - } else { - if (this.t === 'p') { - - try { - res = await this.chatService.getGroupMembers(this.id).toPromise() - } catch (e) { - await this.chatService.refreshtoken(); - error = true - } - - if (error) { - res = await this.chatService.getGroupMembers(this.id).toPromise() - } - - - setTimeout(() => { - // console.log("getGroupMembers", this.membersExcludeMe) - }, 500) - - } - else { - - try { - res = await this.chatService.getChannelMembers(this.id).toPromise() - - } catch (e) { - await this.chatService.refreshtoken(); - error = true - } - - if (error) { - res = await this.chatService.getChannelMembers(this.id).toPromise() - } - - setTimeout(() => { - console.log("getChannelMembers", this.membersExcludeMe) - }, 500) - } - } - - const members = res['members']; - const users = members.filter(data => data.username != this.sessionStore.user.UserName); - this.members = members - this.membersExcludeMe = users - } - - async closeModal() { - await this.modalController.dismiss(); - } -} diff --git a/src/app/services/chat/viewed-message.service.spec.ts b/src/app/services/chat/viewed-message.service.spec.ts deleted file mode 100644 index 1b74bcccf..000000000 --- a/src/app/services/chat/viewed-message.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { ViewedMessageService } from './viewed-message.service'; - -describe('ViewedMessageService', () => { - let service: ViewedMessageService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(ViewedMessageService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/services/chat/viewed-message.service.ts b/src/app/services/chat/viewed-message.service.ts deleted file mode 100644 index 9411d766d..000000000 --- a/src/app/services/chat/viewed-message.service.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { Injectable } from '@angular/core'; -import * as FIFOProcessQueue from 'fifo-process-queue'; -import { RoomService } from './room.service'; - -@Injectable({ - providedIn: 'root' -}) -export class ViewedMessageService { - - constructor() { - } - - viewQueue = FIFOProcessQueue(async ({room, userId, statusNum, statusText}, callback) => { - - if(room.membersExcludeMe?.map) { - const membersIds = room.membersExcludeMe.map((user)=> user._id) - - if(membersIds.includes(userId)) { - - if(statusText != 'offline') { - room.deleteMessageToReceive(userId) - } - - let n = 0 - for (const message of room.messages) { - if(message.online) { - for(let id of membersIds) { - if(message.addReceived(id)) { - n++ - // setTimeout(async() => { - await message.saveChanges() - // }, 100 * n) - } - } - } - } - - setTimeout(function () { - callback(); - }, 100); - } - } - - }) - - - viewReadQueue = FIFOProcessQueue(async ({room}, callback) => { - - const membersIds: string[] = room.membersExcludeMe.map((user)=> user._id) - - let n = 0 - for (const message of room.messages) { - if(message.online) { - for(let id of membersIds) { - - if(message.addViewed(id)) { - message.addReceived(id) - n++ - // setTimeout(async() => { - await message.saveChanges() - // }, 100 * n) - - } - } - } - } - - setTimeout(() => { - callback() - },100) - - }) - - request(room:RoomService, userId, statusNum, statusText) { - this.viewQueue.push({room, userId, statusNum, statusText}) - } - - requestReadAll(room:RoomService) { - this.viewReadQueue.push({room}) - } -} diff --git a/src/app/services/decorators/api-validate-schema.decorator.ts b/src/app/services/decorators/api-validate-schema.decorator.ts new file mode 100644 index 000000000..f2990a1a3 --- /dev/null +++ b/src/app/services/decorators/api-validate-schema.decorator.ts @@ -0,0 +1,47 @@ +import { HttpErrorResponse } from '@angular/common/http'; +import { Result } from 'neverthrow'; +import { z, ZodError } from 'zod'; +import * as Sentry from '@sentry/capacitor'; +import { ColoredLoggerService } from '../logger/colored/service'; + +export function APIReturn(schema: z.ZodTypeAny, context: string) { + return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { + const originalMethod = descriptor.value; + + descriptor.value = async function (...args: any[]) { + const result: Result = await originalMethod.apply(this, args); + + if(result.isOk()) { + try { + // Validate the result using the provided schema + schema.parse(result.value); + + } catch (error) { + if (error instanceof ZodError) { + // If validation fails, throw an error with the details + // + ColoredLoggerService.error(error.errors, 'API unexpected data structure '+ context) + console.error(result.value) + // Capture the Zod validation error with additional context + Sentry.withScope((scope) => { + scope.setTag('APIReturn', 'user'); + scope.setContext('data', { data: result.value }); + Sentry.captureException(error); + }); + + } else { + console.log('failed to setup the connection successful') + // Throw any other unexpected errors + throw error; + } + } + } else { + console.log() + // result.error. + } + + return result; + } + return descriptor; + } +} diff --git a/src/app/services/decorators/captureAndReraiseAsync.ts b/src/app/services/decorators/captureAndReraiseAsync.ts new file mode 100644 index 000000000..bf20b8d84 --- /dev/null +++ b/src/app/services/decorators/captureAndReraiseAsync.ts @@ -0,0 +1,20 @@ +import { err } from "neverthrow"; +import { ColoredLoggerService } from "../logger/colored/service"; + +export function captureAndReraiseAsync(taskName: string) { + return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) { + const originalMethod = descriptor.value; + descriptor.value = async function(...args: any[]) { + try { + return await originalMethod.apply(this, args); + } catch (error) { + // Log the error along with taskName + ColoredLoggerService.error('Capture error from', taskName, error) + console.error(error) + // Re-throw the same error + return err(error) ; + } + }; + return descriptor; + }; +} diff --git a/src/app/services/decorators/socket-validate-schema.decorator.ts b/src/app/services/decorators/socket-validate-schema.decorator.ts new file mode 100644 index 000000000..4ca6e1504 --- /dev/null +++ b/src/app/services/decorators/socket-validate-schema.decorator.ts @@ -0,0 +1,39 @@ +import { HttpErrorResponse } from '@angular/common/http'; +import { Result } from 'neverthrow'; +import { z, ZodError } from 'zod'; +import * as Sentry from '@sentry/capacitor'; +import { ColoredLoggerService } from '../logger/colored/service'; + +export function SocketStreamReturn(schema: z.ZodTypeAny, context: string) { + return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { + const originalMethod = descriptor.value; + + descriptor.value = async function (...args: any[]) { + const result: Result = await originalMethod.apply(this, args); + + if(result.isOk()) { + try { + // Validate the result using the provided schema + schema.parse(result.value); + + } catch (error) { + if (error instanceof ZodError) { + // If validation fails, throw an error with the details + // + ColoredLoggerService.error(error.errors, 'socket unexpected data structure '+ context, schema._def.description) + + } else { + console.log('failed to setup the SocketStreamReturn successful') + // Throw any other unexpected errors + throw error; + } + } + } else { + + } + + return result; + } + return descriptor; + } +} diff --git a/src/app/services/decorators/validate-schema.decorator.ts b/src/app/services/decorators/validate-schema.decorator.ts new file mode 100644 index 000000000..ad20db702 --- /dev/null +++ b/src/app/services/decorators/validate-schema.decorator.ts @@ -0,0 +1,151 @@ +import { err, ok } from 'neverthrow'; +import { Schema, ZodError } from 'zod'; +import { ColoredLoggerService } from '../logger/colored/service'; +import { TracingType } from '../monitoring/opentelemetry/tracer'; + +export function ValidateSchema(schema: Schema) { + return ( + target: unknown, + propertyKey: string, + descriptor: PropertyDescriptor, + ) => { + const originalMethod = descriptor.value; + descriptor.value = function (...args: unknown[]) { + try { + const model = schema.parse(args[0]); + args[0] = model; + return originalMethod.apply(this, args); + } catch (e) { + if (e instanceof ZodError) { + // If validation fails, throw an error with the details + // + ColoredLoggerService.error(e.errors, 'unexpected data structure '+ schema._def.description) + + } + return err(e) + } + }; + }; +} + +/** + * + * @param schema Zod Schema + * @param context + */ +export function SafeValidateSchema(schema: Schema, context: string) { + return ( + target: unknown, + propertyKey: string, + descriptor: PropertyDescriptor, + ) => { + const originalMethod = descriptor.value; + descriptor.value = function (...args: unknown[]) { + + const tracing: TracingType = args[args.length - 1] as any; + + try { + const model = schema.parse(args[0]); + args[0] = model; + return originalMethod.apply(this, args); + } catch (e) { + if (e instanceof ZodError) { + // If validation fails, throw an error with the details + // + // If validation fails, throw an error with the details + console.error('unexpected data structure', context) + // Capture the Zod validation error with additional context + console.error('Validation failed:', e.errors); + + tracing?.setAttribute?.('APIReturn.error', 'true') + + let i = 0; + for(const schema of e.errors) { + tracing?.setAttribute?.('map.error.schema-'+i, JSON.stringify(schema)) + } + ColoredLoggerService.error(e.errors, 'socket unexpected data structure '+ context, schema._def.description) + console.error(args[0]) + + } + return originalMethod.apply(this, args); + } + }; + }; +} + +// export function ParamsValidationSchema(schema:Schema, { either = false, context = "" }) { +// return ( +// target: unknown, +// propertyKey: string, +// descriptor: PropertyDescriptor, +// ) => { +// const originalMethod = descriptor.value; +// descriptor.value = function (...args: unknown[]) { + +// const tracing: TracingType = args[args.length - 1] as any; + +// context = context ? context : tracing?.name; + +// try { +// tracing.addEvent("Parameter Validation start") +// const model = schema.parse(args[0]); +// tracing.addEvent("Parameter Validation end") +// args[0] = model; +// return originalMethod.apply(this, args); +// } catch (e) { +// if (e instanceof ZodError) { +// // If validation fails, throw an error with the details +// // Capture the Zod validation error with additional context + +// tracing?.setAttribute?.('parameter.error', 'true') + +// let i = 0; +// for(const schema of e.errors) { +// tracing?.setAttribute?.('map.error.schema-'+i, JSON.stringify(schema)) +// } +// ColoredLoggerService.error(e.errors, 'Unexpected data structure '+ context,'..') +// console.error(args[0]) + +// tracing.addEvent("Validation parameter error") +// tracing.hasError("Invalid Parameter") +// if(either) { +// return err(e) +// } + +// } +// return originalMethod.apply(this, args); +// } +// }; +// }; +// } + + +export function ParamsValidation(schema:Schema, args, tracing: TracingType) { + try { + tracing.addEvent("Parameter Validation start") + const model = schema.parse(args); + tracing.addEvent("Parameter Validation end") + args = model; + return ok(true); + } catch (e) { + if (e instanceof ZodError) { + // If validation fails, throw an error with the details + // Capture the Zod validation error with additional context + let i = 0; + for(const schema of e.errors) { + tracing?.setAttribute?.('map.error.schema-'+i, JSON.stringify(schema)) + } + + tracing.log("zod error "+ tracing?.name, { + zodError: e + }) + ColoredLoggerService.error(e.errors, 'Unexpected data structure '+ tracing?.name,'..') + console.error(args) + + tracing.addEvent("Validation parameter error") + tracing.hasError("Invalid Parameter") + + } + return err(false) + } +} diff --git a/src/app/services/directives/input-filter.directive.spec.ts b/src/app/services/directives/input-filter.directive.spec.ts deleted file mode 100644 index ec738423a..000000000 --- a/src/app/services/directives/input-filter.directive.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { InputFilterDirective } from './input-filter.directive'; - -describe('InputFilterDirective', () => { - it('should create an instance', () => { - const directive = new InputFilterDirective(); - expect(directive).toBeTruthy(); - }); -}); diff --git a/src/app/services/directives/visibility.directive.spec.ts b/src/app/services/directives/visibility.directive.spec.ts deleted file mode 100644 index a243e0278..000000000 --- a/src/app/services/directives/visibility.directive.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { VisibilityDirective } from './visibility.directive'; - -describe('VisibilityDirective', () => { - it('should create an instance', () => { - const directive = new VisibilityDirective(); - expect(directive).toBeTruthy(); - }); -}); diff --git a/src/app/services/directives/visibility1.directive.spec.ts b/src/app/services/directives/visibility1.directive.spec.ts deleted file mode 100644 index a243e0278..000000000 --- a/src/app/services/directives/visibility1.directive.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { VisibilityDirective } from './visibility.directive'; - -describe('VisibilityDirective', () => { - it('should create an instance', () => { - const directive = new VisibilityDirective(); - expect(directive).toBeTruthy(); - }); -}); diff --git a/src/app/services/chat/message.service.spec.ts b/src/app/services/domain/chat/chat-service.service.spec.ts similarity index 51% rename from src/app/services/chat/message.service.spec.ts rename to src/app/services/domain/chat/chat-service.service.spec.ts index 1db761b5e..32c76fc1e 100644 --- a/src/app/services/chat/message.service.spec.ts +++ b/src/app/services/domain/chat/chat-service.service.spec.ts @@ -1,13 +1,13 @@ import { TestBed } from '@angular/core/testing'; -import { MessageService } from './message.service'; +import { ChatServiceService } from './chat-service.service'; -describe('MessageService', () => { - let service: MessageService; +describe('ChatServiceService', () => { + let service: ChatServiceService; beforeEach(() => { TestBed.configureTestingModule({}); - service = TestBed.inject(MessageService); + service = TestBed.inject(ChatServiceService); }); it('should be created', () => { diff --git a/src/app/services/chat/change-message-queue.service.ts b/src/app/services/domain/chat/chat-service.service.ts similarity index 58% rename from src/app/services/chat/change-message-queue.service.ts rename to src/app/services/domain/chat/chat-service.service.ts index 8c37ff81e..c026b9029 100644 --- a/src/app/services/chat/change-message-queue.service.ts +++ b/src/app/services/domain/chat/chat-service.service.ts @@ -3,6 +3,7 @@ import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) -export class ChangeMessageQueueService { - constructor() {} +export class ChatServiceService { + + constructor() { } } diff --git a/src/app/services/functions/file.service.ts b/src/app/services/functions/file.service.ts index d7295d49e..3c0952420 100644 --- a/src/app/services/functions/file.service.ts +++ b/src/app/services/functions/file.service.ts @@ -78,12 +78,12 @@ export class FileService { path: IMAGE_DIR, directory: Directory.Data, }).then(result => { - + let lastphoto = result.files[result.files.length - 1] resolve(lastphoto) }, async (err) => { - + reject('ERROR FILE DOSENT EXIST') // Folder does not yet exists! await Filesystem.mkdir({ @@ -127,7 +127,7 @@ export class FileService { //new method 4 async loadFileData(fileName: string) { - + // for (let f of fileNames) { const filePath = `${IMAGE_DIR}/${fileName}`; @@ -139,7 +139,7 @@ export class FileService { data: `data:image/jpeg;base64,${readFile.data}`, }; - + const capturedImage = image.data @@ -150,9 +150,7 @@ export class FileService { } - - - getFileFromDevice(types: typeof FileType[]) { + getFileFromDevice(types: typeof FileType[]): Promise { const input = this.fileLoaderService.createInput({ accept: types }) @@ -168,9 +166,6 @@ export class FileService { } - - - getFileFromDeviceBase64(types: typeof FileType[]) { const input = this.fileLoaderService.createInput({ accept: types @@ -199,7 +194,7 @@ export class FileService { }) } - + viewDocumentByUrl(url) { const browser = this.iab.create(url,"_parent"); @@ -254,8 +249,8 @@ export class FileService { dataURLtoFile(dataurl, filename) { var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], - bstr = atob(arr[arr.length - 1]), - n = bstr.length, + bstr = atob(arr[arr.length - 1]), + n = bstr.length, u8arr = new Uint8Array(n); while(n--){ u8arr[n] = bstr.charCodeAt(n); @@ -267,11 +262,11 @@ export class FileService { contentType = contentType || ''; const byteCharacters = atob(base64Data); const byteArray = new Uint8Array(byteCharacters.length); - + for (let i = 0; i < byteCharacters.length; i++) { byteArray[i] = byteCharacters.charCodeAt(i); } - + return new Blob([byteArray], { type: contentType }); } diff --git a/src/app/services/functions/time.service.ts b/src/app/services/functions/time.service.ts index ce2ae0fb0..ed519b8d3 100644 --- a/src/app/services/functions/time.service.ts +++ b/src/app/services/functions/time.service.ts @@ -1,6 +1,5 @@ import { Injectable } from '@angular/core'; -import { ChatService } from '../chat.service'; -import { ChatSystemService } from '../chat/chat-system.service'; +// import { ChatSystemService } from '../chat/chat-system.service'; @Injectable({ providedIn: 'root' @@ -9,8 +8,10 @@ export class TimeService { countDownTime: any; room: any; - constructor(private chatService: ChatService, - public ChatSystemService: ChatSystemService,) { } + constructor( + //private chatService: ChatService, + //public ChatSystemService: ChatSystemService, + ) { } showDateDuration(start:any) { let end; @@ -42,7 +43,7 @@ export class TimeService { } countDownDate(date:any, roomId:string){ - + let difference = new Date(date).getTime() - new Date().getTime(); let c_day = Math.floor(difference/(1000*60*60*24)); let c_hours = Math.floor((difference % (1000*60*60*24)) / (1000*60*60)); @@ -55,22 +56,22 @@ export class TimeService { this.countDownTime = "Expired"; let body = { "roomId":roomId, } - this.chatService.getRoomInfo(roomId).subscribe(room=>{ - this.room = room['room']; + // this.chatService.getRoomInfo(roomId).subscribe(room=>{ + // this.room = room['room']; - if(this.room.t === 'p'){ - this.chatService.deleteGroup(body).subscribe(res=>{ - - }); - } - else{ - this.chatService.deleteChannel(body).subscribe(res=>{ - - }); - } - }); + // if(this.room.t === 'p'){ + // this.chatService.deleteGroup(body).subscribe(res=>{ + + // }); + // } + // else{ + // this.chatService.deleteChannel(body).subscribe(res=>{ + + // }); + // } + // }); } - + return this.countDownTime; } @@ -97,7 +98,7 @@ export class TimeService { // }); // } // else{ - + // this.chatService.deleteChannel(body).subscribe(res=>{ // this.ChatSystemService.deleteRoom(roomId) // }); diff --git a/src/app/services/http-error-handle.service.ts b/src/app/services/http-error-handle.service.ts index 3d6b0e318..5aa527247 100644 --- a/src/app/services/http-error-handle.service.ts +++ b/src/app/services/http-error-handle.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ToastService } from 'src/app/services/toast.service'; import { BackgroundService } from 'src/app/services/background.service'; - +import { HttpErrorResponse } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) @@ -12,7 +12,7 @@ export class HttpErrorHandle { private backgroundService: BackgroundService ) { } - async httpStatusHandle(error) { + async httpStatusHandle(error: any) { switch (error.status ) { case 0: diff --git a/src/app/services/http/adapter.ts b/src/app/services/http/adapter.ts new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/services/http/http-service.service.spec.ts b/src/app/services/http/http-service.service.spec.ts deleted file mode 100644 index 63f333708..000000000 --- a/src/app/services/http/http-service.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { HttpServiceService } from './http-service.service'; - -describe('HttpServiceService', () => { - let service: HttpServiceService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(HttpServiceService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/services/logger/colored/date.ts b/src/app/services/logger/colored/date.ts new file mode 100644 index 000000000..8259a6655 --- /dev/null +++ b/src/app/services/logger/colored/date.ts @@ -0,0 +1,53 @@ +// import { DateTime } from 'luxon'; + +// type GetDateWithFormatFormatInput = { +// date?: Date; +// format?: string; +// }; + +// export class DateUtils { +// static getDateStringWithFormat( +// input: Partial = {}, +// ): string { +// if (!input?.date) { +// Object.assign(input, { date: DateUtils.getJSDate() }); +// } + +// if (!input?.format) { +// Object.assign(input, { format: process.env.DATE_FORMAT }); +// } + +// return DateTime.fromJSDate(input.date, { zone: 'utc' }) +// .setZone(process.env.TZ) +// .toFormat(input.format); +// } + +// static getISODateString(): string { +// return DateTime.fromJSDate(DateUtils.getJSDate(), { zone: 'utc' }) +// .setZone(process.env.TZ) +// .toJSON(); +// } + +// static getISODateJSDateObject(dateObject: Date): string { +// // Convert the JavaScript Date object to Luxon DateTime +// const luxonDateTime = DateTime.fromJSDate(dateObject, { zone: 'utc' }); + +// // Get the ISO 8601 formatted string in UTC +// const isoDateString = luxonDateTime.toISO(); + +// return isoDateString; +// } + + +// static getJSDate(): Date { +// return DateTime.fromJSDate(DateTime.now().toJSDate(), { zone: 'utc' }) +// .setZone(process.env.TZ) +// .toJSDate(); +// } + +// static getDate(): DateTime { +// return DateTime.fromJSDate(DateUtils.getJSDate(), { zone: 'utc' }).setZone( +// process.env.TZ, +// ); +// } +// } diff --git a/src/app/services/logger/colored/service.ts b/src/app/services/logger/colored/service.ts index 67c36c990..abb962614 100644 --- a/src/app/services/logger/colored/service.ts +++ b/src/app/services/logger/colored/service.ts @@ -1,64 +1,66 @@ +export type MessageType = { + message: string; + context?: string; + obj?: object; +}; +function getCurrentTime() { + const now = new Date(); + const hours = String(now.getHours()).padStart(2, '0'); + const minutes = String(now.getMinutes()).padStart(2, '0'); + const seconds = String(now.getSeconds()).padStart(2, '0'); + const milliseconds = String(now.getMilliseconds()).padStart(3, '0'); + return `${hours}:${minutes}:${seconds}.${milliseconds}`; +} -// function getCurrentTime() { -// const now = new Date(); -// const hours = String(now.getHours()).padStart(2, '0'); -// const minutes = String(now.getMinutes()).padStart(2, '0'); -// const seconds = String(now.getSeconds()).padStart(2, '0'); -// const milliseconds = String(now.getMilliseconds()).padStart(3, '0'); -// return `${hours}:${minutes}:${seconds}.${milliseconds}`; -// } +export class ColoredLoggerService { + constructor() {} -// export class Logger { -// private app!: string; + static log(message: string): void { + console.log( + `[${getCurrentTime()}] %cINFO : `, // Console Message + 'color: #00897B', // CSS Style + message + ); + } -// constructor() {} + static debug({ message, context, obj = {} }: MessageType): void { + console.info( + `[${getCurrentTime()}] %cINFO : `, // Console Message + 'color: #039BE5', // CSS Style + Object.assign(obj, { context, createdAt: getCurrentTime(), message }) + ); + } -// static log(message: string): void { -// console.log( -// `[${getCurrentTime()}] %cINFO : `, // Console Message -// 'color: #00897B', // CSS Style -// message -// ); -// } + static info({ message, context, obj = {} }: MessageType): void { + console.info( + `[${getCurrentTime()}] %cINFO : `, // Console Message + 'color: #039BE5', // CSS Style + Object.assign(obj, { context, createdAt: getCurrentTime(), message }) + ); + } -// static debug({ message, context, obj = {} }: MessageType): void { -// console.info( -// `[${getCurrentTime()}] %cINFO : `, // Console Message -// 'color: #039BE5', // CSS Style -// Object.assign(obj, { context, createdAt: DateUtils.getISODateString(), message }) -// ); -// } + static warn({ message, context, obj = {} }: MessageType): void { + console.warn( + `[${getCurrentTime()}] %cWARN : `, // Console Message + 'color: #FB8C00', // CSS Style + Object.assign(obj, { context, createdAt: getCurrentTime(), message }) + ); + } -// static info({ message, context, obj = {} }: MessageType): void { -// console.info( -// `[${getCurrentTime()}] %cINFO : `, // Console Message -// 'color: #039BE5', // CSS Style -// Object.assign(obj, { context, createdAt: DateUtils.getISODateString(), message }) -// ); -// } + static error(error: any = "", message?: string, context = ""): void { -// static warn({ message, context, obj = {} }: MessageType): void { -// console.warn( -// `[${getCurrentTime()}] %cWARN : `, // Console Message -// 'color: #FB8C00', // CSS Style -// Object.assign(obj, { context, createdAt: DateUtils.getISODateString(), message }) -// ); -// } + console.error( + `[${getCurrentTime()}] %cERROR : `, // Console Message + 'color: #E53935', // CSS Style + message+', '+ context, + '\n', + error, + '\n', + ); + } -// static error(error: any = "", message?: string, context = ""): void { - -// console.error( -// `[${getCurrentTime()}] %cERROR : `, // Console Message -// 'color: #E53935', // CSS Style -// message+', '+ context, -// '\n', -// error, -// '\n', -// ); -// } - -// fatal(error?: ErrorType, message?: string, context?: string): void {} -// } + fatal(error?: any, message?: string, context?: string): void {} +} diff --git a/src/app/services/logger/main/service.ts b/src/app/services/logger/main/service.ts new file mode 100644 index 000000000..8cf14216b --- /dev/null +++ b/src/app/services/logger/main/service.ts @@ -0,0 +1,176 @@ +// import { DateUtils } from './date'; + +import { environment } from "src/environments/environment"; +import { openTelemetryLogging } from "../../monitoring/opentelemetry/logging"; +import { SessionStore } from "src/app/store/session.service"; +import { DeviceInfo } from "@capacitor/device"; +import { Device } from '@capacitor/device'; + +export type MessageType = { + message: string; + context?: string; + obj?: object; +}; + +function getCurrentTime() { + const now = new Date(); + const hours = String(now.getHours()).padStart(2, '0'); + const minutes = String(now.getMinutes()).padStart(2, '0'); + const seconds = String(now.getSeconds()).padStart(2, '0'); + const milliseconds = String(now.getMilliseconds()).padStart(3, '0'); + return `${hours}:${minutes}:${seconds}.${milliseconds}`; +} + +let device: DeviceInfo; + +Device.getInfo().then(e => { + device = e +}); + +export class Logger { + + constructor() {} + + static log(message: string, obj = {}): void { + console.log( + `[${getCurrentTime()}] %cINFO : `, // Console Message + 'color: #00897B', // CSS Style + Object.assign(obj, { createdAt: getCurrentTime(), message }) + ); + + + if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { + openTelemetryLogging.send({ + type: 'graylog', + spanContext: null, + payload: { + message: message, + object: { + ...obj, + spanId: null, + name, + user: SessionStore?.user?.FullName, + device_name: device?.name || device?.model, + commit_date: environment.version.lastCommitTime, + } + } + }) + } + } + + static debug(message: string, obj = {}): void { + console.info( + `[${getCurrentTime()}] %cINFO : `, // Console Message + 'color: #039BE5', // CSS Style + Object.assign(obj, {createdAt: getCurrentTime(), message }) + ); + + if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { + openTelemetryLogging.send({ + type: 'graylog', + spanContext: null, + payload: { + message: message, + object: { + ...obj, + spanId: null, + name, + user: SessionStore?.user?.FullName, + device_name: device?.name || device?.model, + commit_date: environment.version.lastCommitTime, + } + } + }) + } + } + + static info(message: string, obj = {}): void { + console.info( + `[${getCurrentTime()}] %cINFO : `, // Console Message + 'color: #039BE5', // CSS Style + message+' '+ + '\n', + obj, + '\n', + ); + + if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { + openTelemetryLogging.send({ + type: 'graylog', + spanContext: null, + payload: { + message: message, + object: { + ...obj, + spanId: null, + name, + user: SessionStore?.user?.FullName, + device_name: device?.name || device?.model, + commit_date: environment.version.lastCommitTime, + } + } + }) + } + } + + static warn(message: string, obj = {}): void { + console.warn( + `[${getCurrentTime()}] %cWARN : `, // Console Message + 'color: #FB8C00', // CSS Style + message+' '+ + '\n', + obj, + '\n', + ); + + if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { + openTelemetryLogging.send({ + type: 'graylog', + spanContext: null, + payload: { + message: message, + object: { + ...obj, + spanId: null, + name, + user: SessionStore?.user?.FullName, + device_name: device?.name || device?.model, + commit_date: environment.version.lastCommitTime, + } + } + }) + } + } + + static error(message?: string, obj = {}): void { + + console.error( + `[${getCurrentTime()}] %cERROR : `, // Console Message + 'color: #E53935', // CSS Style + message+' '+ + '\n', + obj, + '\n', + ); + + if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { + openTelemetryLogging.send({ + type: 'graylog', + spanContext: null, + payload: { + message: message, + object: { + ...obj, + spanId: null, + name, + user: SessionStore?.user?.FullName, + device_name: device?.name || device?.model, + commit_date: environment.version.lastCommitTime, + } + } + }) + } + } + + fatal(error?: any, message?: string, context?: string): void {} +} diff --git a/src/app/services/monitoring/opentelemetry/logging.ts b/src/app/services/monitoring/opentelemetry/logging.ts index ed242dc0f..aa9dfdce0 100644 --- a/src/app/services/monitoring/opentelemetry/logging.ts +++ b/src/app/services/monitoring/opentelemetry/logging.ts @@ -12,18 +12,18 @@ export class OpenTelemetryLogging { constructor() { if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { - this.socket.start() + // this.socket.start() } } send(data: Object & { type: string; payload: any, spanContext:any }): void { - this.socket.send({ - type: data.type, - payload: data.payload, - requestId: uuidv4(), - spanContext: data.spanContext - }); + // this.socket.send({ + // type: data.type, + // payload: data.payload, + // requestId: uuidv4(), + // spanContext: data.spanContext + // }); } } diff --git a/src/app/services/monitoring/opentelemetry/matrix.ts b/src/app/services/monitoring/opentelemetry/matrix.ts index 8be55bcc7..120e34d36 100644 --- a/src/app/services/monitoring/opentelemetry/matrix.ts +++ b/src/app/services/monitoring/opentelemetry/matrix.ts @@ -1,4 +1,4 @@ -import { metrics } from '@opentelemetry/api'; +import { Histogram, metrics } from '@opentelemetry/api'; import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'; import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; import { Subject } from 'rxjs'; @@ -10,34 +10,22 @@ const meterProvider = new MeterProvider(); metrics.setGlobalMeterProvider(meterProvider); if (window.location.protocol !== 'https:' && environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { - const metricReader = new PeriodicExportingMetricReader({ - exporter: new OTLPMetricExporter({ - //url: 'https://5-180-182-151.cloud-xip.com:85/collector2/v1/metrics', - url: 'https://185-229-224-75.cloud-xip.com:85/collector2/v1/metrics', - //url: 'http://5-180-182-151.cloud-xip.com:4318/v1/metrics', - //url: 'http://185-229-224-75.cloud-xip.com:4318/v1/metrics' - // headers: { - // 'Authorization': 'Basic ' + btoa('tabteste@006:tabteste@006'), - // } - }), - exportIntervalMillis: 30000, - }); - - meterProvider.addMetricReader(metricReader); - - const subject = new Subject() - - subject - .pipe( - throttleTime(5000) // 5000 milliseconds = 5 seconds - ) - .subscribe(() => { - metricReader.forceFlush().then(() => { - console.log('Metrics exported'); - }); - }); + // const metricReader = new PeriodicExportingMetricReader({ + // exporter: new OTLPMetricExporter({ + // //url: 'https://5-180-182-151.cloud-xip.com:85/collector2/v1/metrics', + // url: 'https://185-229-224-75.cloud-xip.com:85/collector2/v1/metrics', + // //url: 'http://5-180-182-151.cloud-xip.com:4318/v1/metrics', + // //url: 'http://185-229-224-75.cloud-xip.com:4318/v1/metrics' + // // headers: { + // // 'Authorization': 'Basic ' + btoa('tabteste@006:tabteste@006'), + // // } + // }), + // exportIntervalMillis: 30000, + // }); + // meterProvider.addMetricReader(metricReader); } + export const meter = meterProvider.getMeter('example-exporter-collector'); export const RequestCounter = meter.createCounter('post_requests', { description: 'Example of a Counter', @@ -46,3 +34,10 @@ export const RequestCounter = meter.createCounter('post_requests', { export const UseCaseCounter = meter.createCounter('use_case', { description: 'use case counter', }); + + +// Assuming `meter` is your initialized Meter instance +export const useCaseDurationHistogram: Histogram = meter.createHistogram('use_case_duration', { + description: 'Duration of use cases', + unit: 'milliseconds', +}); diff --git a/src/app/services/monitoring/opentelemetry/opentelemetry.ts b/src/app/services/monitoring/opentelemetry/opentelemetry.ts index eab85fd4d..4e5f876dd 100644 --- a/src/app/services/monitoring/opentelemetry/opentelemetry.ts +++ b/src/app/services/monitoring/opentelemetry/opentelemetry.ts @@ -1,13 +1,9 @@ import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base'; import { WebTracerProvider } from '@opentelemetry/sdk-trace-web'; -import { ZipkinExporter } from '@opentelemetry/exporter-zipkin'; import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' import { Resource } from '@opentelemetry/resources'; -//import { OTLPTraceExporter } from '@opentelemetry/exporter-otlp-http'; import { context, trace, propagation } from '@opentelemetry/api'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; -// const { OTLPTraceExporter: OTLPTraceExporterProto } = require("@opentelemetry/exporter-trace-otlp-proto"); - function createProvider(serviceName) { const provider = new WebTracerProvider({ diff --git a/src/app/services/monitoring/opentelemetry/tracer.ts b/src/app/services/monitoring/opentelemetry/tracer.ts index 39612e4c4..6932b344f 100644 --- a/src/app/services/monitoring/opentelemetry/tracer.ts +++ b/src/app/services/monitoring/opentelemetry/tracer.ts @@ -1,20 +1,19 @@ import { v4 as uuidv4 } from 'uuid'; import { SemanticAttributes } from '@opentelemetry/semantic-conventions'; import { Tracer, Span } from '@opentelemetry/sdk-trace-base'; -import { OpentelemetryAgendaProvider, OpentelemetryInterceptorProvider, OpentelemetryLogging, OpentelemetryNotificationProvider } from './opentelemetry'; +import { OpentelemetryAgendaProvider, OpentelemetryChatProvider, OpentelemetryInterceptorProvider, OpentelemetryLogging, OpentelemetryNotificationProvider } from './opentelemetry'; import { Device, DeviceInfo } from '@capacitor/device'; import { SessionStore } from 'src/app/store/session.service'; import { environment } from 'src/environments/environment'; -import { UseCaseCounter } from './matrix'; +import { UseCaseCounter, useCaseDurationHistogram } from './matrix'; import { openTelemetryLogging } from './logging'; -// import { context, propagation } from '@opentelemetry/api'; import { SpanStatus, SpanStatusCode } from '@opentelemetry/api'; +import { Logger } from '../../logger/main/service'; const tracerInstance = OpentelemetryAgendaProvider.getTracer('example-tracer-hole', '111', {}) const tracerNotificationInstance = OpentelemetryNotificationProvider.getTracer('example-tracer-hole', '111', {}) -// const logger: ILoggerAdapter = new ColoredLoggerService() - +const tracerChat = OpentelemetryChatProvider.getTracer('OpentelemetryChatProvider','some' ,{}) let device: DeviceInfo; Device.getInfo().then(e => { @@ -40,17 +39,22 @@ function convertAttributesToString(obj) { } -const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingType => { - const requestId = uuidv4() +const createTracingInstance = ({bugPrint, name, module, autoFinish, waitNThrow = 0}): TracingType => { + const startTime = Date.now(); + const requestId = uuidv4() let _tracerInstance:Tracer if(module == 'notification') { _tracerInstance = tracerNotificationInstance + } else if (module == 'chat') { + _tracerInstance = tracerChat } else { _tracerInstance = tracerInstance } + let waitNThrowFunction: NodeJS.Timeout | undefined + const span = _tracerInstance.startSpan(name); let finish = false @@ -58,10 +62,12 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp event: {}, tags: {}, status: {} as any, - logs:[] + logs:[], + errors: [] } const returnObject = { + name, span: span as any, tracer: tracerInstance, tracerId: requestId, @@ -69,12 +75,10 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp setStatus: (status: SpanStatus) => { span.setStatus(status); }, - addEvent: (context: string, message?: any, obj?: any) => { + addEvent: (context: string, message: string = "") => { data.event[context] = message; - - const value = [JSON.stringify(message)] as any - span.addEvent(context, value); + span.addEvent(context, message as any); }, LocalLogEvent:(context: string, message: any, obj: any) => { data.tags[context] = message; @@ -84,7 +88,9 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp span.setAttribute(key, value); if(key =='outcome' && value == 'failed') { - returnObject.hasError('error') + if(data.errors.length == 0) { + returnObject.hasError('error') + } if(!autoFinish) { returnObject.finish() } @@ -129,8 +135,13 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp finish: () => { if(finish) return + if(waitNThrowFunction) { + clearTimeout(waitNThrowFunction); + } + if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { - span.end(); + span.setAttribute('error.list', data.errors.join(',')) + // span.end(); UseCaseCounter.add(1, {user: SessionStore?.user?.FullName, outcome:data.tags['outcome'] || data.status?.code , usecase: name}) } @@ -138,23 +149,36 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp console.error(name, data) } + const duration = Date.now() - (startTime as unknown as number); + useCaseDurationHistogram.record(duration, { use_case: name }); + useCaseDurationHistogram.record(duration, { use_case: name, user: SessionStore.user.UserName }); + finish = true }, - hasError:(message: string) => { - if(data.status?.code != SpanStatusCode.ERROR) { - data.status = {code: SpanStatusCode.ERROR, message} - span.setStatus({code: SpanStatusCode.ERROR, message}) - span.setAttribute('outcome','failed') - } + hasError:(message: string, obj:Object = {}) => { + const spanId = span.spanContext().spanId; + + data.errors.push(message) + data.status = {code: SpanStatusCode.ERROR, message} + span.setStatus({code: SpanStatusCode.ERROR, message}) + Logger.error(message, {...obj, spanId, name}) }, createSpan: (name, parent?: any) => { return tracerInstance.startSpan(name, { root: false }, parent) as Span; } } + + if(waitNThrow > 0) { + waitNThrowFunction = setTimeout(()=> { + returnObject.hasError('waitNThrowFunction') + returnObject.finish() + }, waitNThrow) + } + return returnObject } -export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true, daley =0 }) { +export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true, daley =0, waitNThrow = 0 }) { return ( target: unknown, propertyKey: string, @@ -164,7 +188,8 @@ export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true, descriptor.value = async function (...args: unknown[]) { - const tracing = createTracingInstance({bugPrint, name, module, autoFinish}) + + const tracing = createTracingInstance({bugPrint, name, module, autoFinish, waitNThrow}) tracing.setAttribute('User', SessionStore?.user?.FullName); tracing.setAttribute('current.page', window.location.pathname); @@ -185,6 +210,9 @@ export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true, return result } catch (e) { tracing.setAttribute('catch', 'true') + tracing.log("cath", { + error: e + }) if(autoFinish) { setTimeout(tracing.finish , daley) @@ -197,7 +225,7 @@ export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true, } -export function XTracer({ name, bugPrint, module, autoFinish = true, daley =0 }) { +export function XTracer({ name, bugPrint, module, autoFinish = true, daley =0, waitNThrow =0 }) { return ( target: unknown, propertyKey: string, @@ -206,7 +234,7 @@ export function XTracer({ name, bugPrint, module, autoFinish = true, daley =0 }) const originalMethod = descriptor.value; descriptor.value = function (...args: unknown[]) { - const tracing = createTracingInstance({bugPrint, name, module, autoFinish}) + const tracing = createTracingInstance({bugPrint, name, module, autoFinish, waitNThrow}) tracing.setAttribute('User', SessionStore?.user?.FullName); tracing.setAttribute('current.page', window.location.pathname); @@ -227,6 +255,9 @@ export function XTracer({ name, bugPrint, module, autoFinish = true, daley =0 }) } catch (e) { tracing.setAttribute('catch', 'true') + tracing.log("cath", { + error: e + }) if(autoFinish) { setTimeout(tracing.finish , daley) @@ -239,6 +270,7 @@ export function XTracer({ name, bugPrint, module, autoFinish = true, daley =0 }) } export type TracingType = { + name: string, span: Span; tracer: Tracer; tracerId: string; @@ -251,7 +283,7 @@ export type TracingType = { getAttribute: (key: string) => string; LocalLogEvent: (name: string, attributesOrStartTime: any, obj?:any) => void; finish: () => void; - hasError:(message: string) => void; + hasError:(message: string, obj?: Object) => void; createSpan:(name, parent?: any) => Span; }; diff --git a/src/app/services/monitoring/socket/socket.ts b/src/app/services/monitoring/socket/socket.ts index c252da365..f52801846 100644 --- a/src/app/services/monitoring/socket/socket.ts +++ b/src/app/services/monitoring/socket/socket.ts @@ -13,26 +13,26 @@ export class WebSocketGraylogService { connect(): void { // this.adminSocketGlobal = new WebSocket('wss://5-180-182-151.cloud-xip.com:85/ws/'); - this.adminSocketGlobal = new WebSocket('wss://185-229-224-75.cloud-xip.com:85/ws/'); + // this.adminSocketGlobal = new WebSocket('wss://185-229-224-75.cloud-xip.com:85/ws/'); - this.adminSocketGlobal.onopen = () => { - console.log('Admin WebSocket is open now.'); - this.adminSocketGlobal.send("uuid"); - this.connected = true - }; + // this.adminSocketGlobal.onopen = () => { + // console.log('Admin WebSocket is open now.'); + // this.adminSocketGlobal.send("uuid"); + // this.connected = true + // }; - this.adminSocketGlobal.onmessage = async (event: MessageEvent) => { - // Handle incoming messages here - }; + // this.adminSocketGlobal.onmessage = async (event: MessageEvent) => { + // // Handle incoming messages here + // }; - this.adminSocketGlobal.onclose = () => { - console.log('Admin WebSocket is closed now.'); - this.connect(); - }; + // this.adminSocketGlobal.onclose = () => { + // // console.log('Admin WebSocket is closed now.'); + // this.connect(); + // }; - this.adminSocketGlobal.onerror = (error: Event) => { - console.error('Admin WebSocket error:', error); - }; + // this.adminSocketGlobal.onerror = (error: Event) => { + // // console.error('Admin WebSocket error:', error); + // }; } send(data: Object & { type: string; payload: Object , requestId: string, spanContext:any }): void { @@ -43,14 +43,12 @@ export class WebSocketGraylogService { payload: data.payload, requestId: data.requestId, parentSpan: { - traceId: data.spanContext.spanContext().traceId, - spanId: data.spanContext.spanContext().spanId, + traceId: data?.spanContext?.spanContext().traceId, + spanId: data?.spanContext?.spanContext().spanId, } })); // data.spanContext.end() - } else { - console.warn('WebSocket is not open. Message not sent.'); } } diff --git a/src/app/services/notifications.service.ts b/src/app/services/notifications.service.ts index a8a64e141..46e924748 100644 --- a/src/app/services/notifications.service.ts +++ b/src/app/services/notifications.service.ts @@ -15,7 +15,6 @@ import { Capacitor } from '@capacitor/core'; import { AngularFireMessaging } from '@angular/fire/messaging'; import { NotificationHolderService } from 'src/app/store/notification-holder.service'; import { FCM } from '@capacitor-community/fcm'; -import {ChatController} from 'src/app/controller/chat' import { TracingType, XTracer, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; import { z } from 'zod'; import { NotificationRepositoryService } from 'src/app/module/notification/data/notification-repository.service' @@ -32,6 +31,9 @@ const notificationSchema = z.object({ }), }); +// import { ChatSystemService } from './chat/chat-system.service'; + + @Injectable({ providedIn: 'root' }) @@ -56,8 +58,6 @@ export class NotificationsService { notificationReceived: EventEmitter = new EventEmitter(); token = '' - ChatController = ChatController - constructor( private http: HttpClient, public modalCtrl: AlertController, diff --git a/src/app/services/processes.service.ts b/src/app/services/processes.service.ts index c6293cdaa..c51fc1042 100644 --- a/src/app/services/processes.service.ts +++ b/src/app/services/processes.service.ts @@ -10,7 +10,6 @@ import { GetTasksListType } from '../models/GetTasksListType'; import { fullTaskList } from '../models/dailyworktask.model'; import { ChangeProfileService } from './change-profile.service'; import { SessionStore } from '../store/session.service'; -import { CPSession } from '../store/documentManagement'; @Injectable({ providedIn: 'root' }) diff --git a/src/app/services/webnotifications.service.ts b/src/app/services/webnotifications.service.ts deleted file mode 100644 index 6aa22b8d0..000000000 --- a/src/app/services/webnotifications.service.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { Injectable, NgZone } from '@angular/core'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { environment } from 'src/environments/environment'; -import { StorageService } from 'src/app/services/storage.service'; -import { AuthConnstants } from 'src/app/config/auth-constants'; -import { Tokenn } from '../models/token.model'; -import { ModalController, AlertController, AnimationController, Platform } from '@ionic/angular'; -import { NavigationExtras, Router } from '@angular/router'; -import { ToastService } from './toast.service'; - -@Injectable({ - providedIn: 'root' -}) -export class WebNotificationsService { - - adding: "intervenient" | "CC" = "intervenient"; - folderId: string; - - constructor( - private http: HttpClient, - private storageService: StorageService, - private modalController: ModalController, - public modalCtrl: AlertController, - private animationController: AnimationController, - private platform: Platform, - private router: Router, - private toastService: ToastService) { } - - - webconnection() { - - var inicializeObj = { - appId: "com.gpr.gabinetedigital", - mfpContextRoot: "/mfp", - /* serverUrl: "http://gpr-dev-10.gabinetedigital.local:9080", - safariWebsitePushId: "http://gpr-dev-10.gabinetedigital.local:9080", */ - } - - - - /* MFPPush.initialize({ - appId: "com.gpr.gabinetedigital", - mfpContextRoot: "/mfp", - }); */ - - /* MFPPush.registerDevice() - .then((res) => { - - - setTimeout(()=>{ - MFPPush.registerDevice() - .then((res) => { - - }) - .catch((err) => { - - }); - }, 1000) - - - }) - .catch((err) => { - - }); */ - } - - /* getTokenByUserIdAndId(user, userID) { - const geturl = environment.apiURL + 'notifications/user/' + userID; - - return this.http.get(`${geturl}`); - } */ - - /* getAndpostToken(username) { - if (this.platform.is('desktop') || this.platform.is('mobileweb')) { - - } else { - - const geturl = environment.apiURL + 'notifications/token'; */ - /* - window['WLAuthorizationManager'].obtainAccessToken("push.mobileclient").then( - (token) => { - - - MFPPush.initialize( - function (successResponse) { - - }, - function (failureResponse) { - - } - ); - - MFPPush.registerDevice(null, (successResponse) => { - - - this.storageService.store(username, successResponse.deviceId); - this.storageService.get(username).then(value => { - - this.storageService.get(AuthConnstants.USER).then(res => { - - const headers = { 'Authorization': 'Basic cGF1bG8ucGludG9AZ2FiaW5ldGVkaWdpdGFsLmxvY2FsOnRhYnRlc3RlQDAwNg==' }; - const body = { - UserId: res.UserId, - TokenId: successResponse.deviceId, - Status: 1, - Service: 1 - }; - this.http.post(`${geturl}`, body, { headers }).subscribe(data => { - - }) - }); - - }); - }, - function (failureResponse) { - - } - ); - }, (error) => { - - - } - ); - } - - } */ - /* - async onReceviNotification() { - window['WLAuthorizationManager'].obtainAccessToken("push.mobileclient").then( - (token) => { - - - MFPPush.initialize( - function (successResponse) { - - MFPPush.registerNotificationsCallback(notificationReceived); - }, - function (failureResponse) { - - } - ); - var notificationReceived = (message) => { - - var data = JSON.parse(message.payload); - - - - - if(message.actionName){ - this.notificatinsRoutes(data); - } else { - this.toastService.notificationMessage(message.alert,this.notificatinsRoutes, data); - } - - } - }, (error) => { - - - } - ); - } */ - - /* notificatinsRoutes = (data) => { - if (data.Service === "agenda") { - this.zone.run(() => this.router.navigate(['/home/agenda', data.IdObject, 'agenda'])); - } - else if (data.Service === "gabinete-digital" && data.Object === "expediente") { - this.zone.run(() => this.router.navigate(['/home/gabinete-digital/expediente',data.IdObject,'gabinete-digital'])); - } - else if (data.Service === "gabinete-digital" && data.Object === "event-list") { - this.zone.run(() => this.router.navigate(['/home/gabinete-digital/event-list/approve-event',data.IdObject, 'gabinete-digital'])); - }else if (data.Service === "gabinete-digital" && data.Object === "despachos") { - let navigationExtras: NavigationExtras = { - queryParams: { - "serialNumber": data.IdObject, - } - }; - this.zone.run(() => this.router.navigate(['/home/gabinete-digital/despachos/despacho'], navigationExtras)); - } - else if (data.Service === "gabinete-digital" && data.Object === "parecer") { - let navigationExtras: NavigationExtras = { - queryParams: { - enterAnimation: "", - serialNumber: data.IdObject, - } - }; - this.zone.run(() => this.router.navigate(['/home/gabinete-digital/pedidos/pedido'], navigationExtras)); - } - else if (data.Service === "gabinete-digital" && data.Object === "deferimento") { - let navigationExtras: NavigationExtras = { - queryParams: { - enterAnimation: "", - serialNumber: data.IdObject, - } - }; - this.zone.run(() => this.router.navigate(['/home/gabinete-digital/pedidos/pedido'], navigationExtras)); - } - else if (data.Service === "accoes" && data.Object === "accao") { - this.zone.run(() => this.router.navigate(['/home/publications',data.IdObject])); - } - else if (data.Service === "accoes" && data.Object === "publicacao") { - this.zone.run(() => this.router.navigate(['/home/publications/view-publications',data.FolderId,data.IdObject])); - } - } - - platformVerify() { - - if (this.platform.is('cordova')) { - } else { - } - } */ - -} diff --git a/src/app/services/zod.ts b/src/app/services/zod.ts new file mode 100644 index 000000000..c4d452250 --- /dev/null +++ b/src/app/services/zod.ts @@ -0,0 +1,12 @@ +import { z, ZodSchema, ZodError } from "zod"; + +// Utility function to attach metadata +export function attachMetadata>(schema: T, metadata: Record): T { + return (schema.refine(value => true, { message: "Metadata attached", ...metadata }) as any) as T; +} + +// Function to get metadata from a Zod error +export function getMetadata>(schema: T, error: ZodError): Record | undefined { + const metadataIssue = error.errors.find(issue => issue.message === "Metadata attached"); + return metadataIssue ? metadataIssue : undefined; +} diff --git a/src/app/shared/agenda/view-event/view-event.module.ts b/src/app/shared/agenda/view-event/view-event.module.ts index c4cc69858..09d7e2b66 100644 --- a/src/app/shared/agenda/view-event/view-event.module.ts +++ b/src/app/shared/agenda/view-event/view-event.module.ts @@ -7,9 +7,6 @@ import { IonicModule } from '@ionic/angular'; import { ViewEventPageRoutingModule } from './view-event-routing.module'; import { ViewEventPage } from './view-event.page'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { ChatPopoverPage } from '../../popover/chat-popover/chat-popover.page'; - @NgModule({ imports: [ diff --git a/src/app/shared/agenda/view-event/view-event.page.ts b/src/app/shared/agenda/view-event/view-event.page.ts index 329b439c2..dd0a55fde 100644 --- a/src/app/shared/agenda/view-event/view-event.page.ts +++ b/src/app/shared/agenda/view-event/view-event.page.ts @@ -137,15 +137,15 @@ export class ViewEventPage implements OnInit { } - async openNewGroupPage() { - let roomName = this.loadedEvent.Subject - let attendees = this.loadedEvent.Attendees + // async openNewGroupPage() { + // let roomName = this.loadedEvent.Subject + // let attendees = this.loadedEvent.Attendees - const room = await EventController.createOrFindGroupFromEvent(roomName, attendees) + // const room = await EventController.createOrFindGroupFromEvent(roomName, attendees) - let navigationExtras: NavigationExtras = { queryParams: { "roomId": room.id } }; - this.router.navigate(['/home/chat'], navigationExtras); - } + // let navigationExtras: NavigationExtras = { queryParams: { "roomId": room.id } }; + // this.router.navigate(['/home/chat'], navigationExtras); + // } close() { diff --git a/src/app/shared/chat/add-user/add-user.page.html b/src/app/shared/chat/add-user/add-user.page.html deleted file mode 100644 index c4bb0ea98..000000000 --- a/src/app/shared/chat/add-user/add-user.page.html +++ /dev/null @@ -1,9 +0,0 @@ - - - addUser - - - - - - diff --git a/src/app/shared/chat/add-user/add-user.page.ts b/src/app/shared/chat/add-user/add-user.page.ts deleted file mode 100644 index e35b74795..000000000 --- a/src/app/shared/chat/add-user/add-user.page.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -@Component({ - selector: 'app-add-user', - templateUrl: './add-user.page.html', - styleUrls: ['./add-user.page.scss'], -}) -export class AddUserPage implements OnInit { - - constructor() { } - - ngOnInit() { - } - -} diff --git a/src/app/shared/chat/group-messages/group-contacts/group-contacts.page.ts b/src/app/shared/chat/group-messages/group-contacts/group-contacts.page.ts deleted file mode 100644 index c6e20fd9b..000000000 --- a/src/app/shared/chat/group-messages/group-contacts/group-contacts.page.ts +++ /dev/null @@ -1,371 +0,0 @@ -import { HttpHeaders } from '@angular/common/http'; -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { ModalController } from '@ionic/angular'; -import * as _ from 'lodash'; -import { ChatService } from 'src/app/services/chat.service'; -import { NewGroupPage } from '../../new-group/new-group.page'; -import { GroupMessagesPage } from '../group-messages.page'; -import { ThemeService } from 'src/app/services/theme.service' -import { SessionStore } from 'src/app/store/session.service'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; - -@Component({ - selector: 'app-group-contacts', - templateUrl: './group-contacts.page.html', - styleUrls: ['./group-contacts.page.scss'], -}) -export class GroupContactsPage implements OnInit { - showLoader: boolean; - loggedUser: any; - users = []; - - contact: string[] = [" Ana M.", "Andre F.", "Bruno G.", "Catarina T", "Tiago"]; - - options:any; - listContacts: any[]; - contacts: any; - textSearch:string; - room:any; - members:any; - dm:any; - isGroupCreated:boolean; - groupName:string; - selectedUserList:any; - sessionStore = SessionStore - - @Input() roomId:string; - @Output() openGroupMessage:EventEmitter = new EventEmitter(); - - - objectUserSingleStone = [] - userContainer = {} - - constructor( - private modalController: ModalController, - private chatService: ChatService, - public ThemeService: ThemeService, - public ChatSystemService: ChatSystemService - ) - { - this.loggedUser = SessionStore.user.ChatData['data']; - this.textSearch=""; - this.dm=null; - this.room=null; - } - - ngOnInit() { - // this.chatService.refreshtoken(); - //this.getRoomInfo(); - this.loadUsers(); - - this.getChatInfo(); - // - } - - getChatInfo(){ - - this.chatService.getRoomInfo(this.roomId).subscribe(room=>{ - - - this.getGroupContacts(room['room']); - }); - } - deleteMember(data:any){ - - - let body = { - "roomId": this.roomId, - "userId": data._id, - } - - this.chatService.getRoomInfo(this.roomId).subscribe(room=>{ - if(room['room'].t == "p"){ - this.chatService.removeGroupMember(body).subscribe(res=>{ - - this.getMembers(); - this.getChatInfo(); - }); - } - else if(room['room'].t == "c"){ - this.chatService.removeChannelMember(body).subscribe(res=>{ - - this.getMembers(); - this.getChatInfo(); - }); - } - }); - } - - getMembers(){ - this.chatService.getRoomInfo(this.roomId).subscribe(res=>{ - - let room = res['room']; - - if(room.t == "p"){ - this.chatService.getGroupMembers(this.roomId).subscribe(res=>{ - this.members = res['members']; - }); - } - else if(room.t == "c"){ - this.chatService.getChannelMembers(this.roomId).subscribe(res=>{ - this.members = res['members']; - }); - } - }); - } - - getGroupContacts(room:any){ - this.showLoader = true; - if(room.t === 'p'){ - this.chatService.getGroupMembers(this.roomId).subscribe(res=>{ - this.members = res['members']; - this.loadUsers1(this.members); - this.showLoader = false; - }); - } - else{ - this.chatService.getChannelMembers(this.roomId).subscribe(res=>{ - this.members = res['members']; - this.loadUsers1(this.members); - this.showLoader = false; - }); - } - } - - updateGroup(){ - this.showLoader = true; - this.addContacts(this.roomId); - this.openGroupMessage.emit(this.roomId); - this.showLoader = false; - } - openGroupMessagesPage(){ - this.showLoader = true; - this.openGroupMessage.emit(this.roomId) - this.showLoader = false; - } - - loadUsers1(members:any) { - - this.chatService.getAllUsers().subscribe((res:any)=>{ - - - - if(members){ - this.contacts = res.users.filter(f => !this.members.some(item => item._id === f._id)); - } - else{ - this.contacts = res.users.filter(data => data.username != this.sessionStore.user.UserName); - } - - this.users = this.contacts.sort((a,b) => { - if(a.name < b.name){ - return -1; - } - if(a.name > b.name){ - return 1; - } - return 0; - }); - - - this.showLoader = false; - }); - } - - loadUsers() { - - this.chatService.getAllUsers().subscribe((res:any)=>{ - - - - if(this.members){ - this.contacts = res.users.filter(f => !this.members.some(item => item._id === f._id)); - } - else{ - this.contacts = res.users.filter(data => data.username != this.sessionStore.user.UserName); - } - - this.users = this.contacts.sort((a,b) => { - if(a.name < b.name){ - return -1; - } - if(a.name > b.name){ - return 1; - } - return 0; - }); - - - for( const user of this.users) { - - const foundUser = this.objectUserSingleStone.find( e => e.name == user.name) - - if(!foundUser) { - this.objectUserSingleStone.push(user) - } else { - console.log('not found') - } - - } - - const userContainer = {} - - for(const user of this.objectUserSingleStone) { - const firstLetter = user.name.charAt(0) - - if(!userContainer[firstLetter]) { - userContainer[firstLetter] = [user] - } else { - userContainer[firstLetter].push(user) - } - } - - - this.userContainer = userContainer - - this.showLoader = false; - }); - } - - doRefresh(ev){ - ev.target.complete(); - } - - async close(){ - this.modalController.dismiss(); - if(this.isGroupCreated){ - - } - else{ - this.modalController.dismiss(); - - const modal = await this.modalController.create({ - component: NewGroupPage, - componentProps: { - name:this.groupName, - duration:'', - }, - cssClass: 'new-group modal-desktop', - backdropDismiss: false, - }); - await modal.present(); - } - } - - onChange(event) { - this.textSearch = event.detail.value; - - const users: any[] = this.contacts.filter( e => e.name.toLowerCase().includes(this.textSearch.toLowerCase())).sort((a,b) => { - if(a.name < b.name) { - return -1; - } - if(a.name > b.name) { - return 1; - } - return 0; - }); - - const selectedUsers = this.users.filter( e => e?.isChecked == true) - - users.forEach( (user, index) => { - if(user[index]) { - console.log({user, index}) - const isCheck = selectedUsers.find( e => e._id == user._id)?.isChecked - if(isCheck) { - user[index].isChecked = isCheck - } - - // if(user[index].isChecked) { - // console.log('user[index].isChecked', user[index].isChecked) - // } - } - - }) - - this.users = users - - - let a = this.objectUserSingleStone.filter( e => e.name.toLowerCase().includes(this.textSearch.toLowerCase())) - - let b = {} - for(const user of a) { - const firstLetter = user.name.charAt(0) - - if(!b[firstLetter]) { - b[firstLetter] = [user] - } else { - b[firstLetter].push(user) - } - - } - - - this.userContainer = b - - // console.log('this.users', this.users) - } - - clicked(){ - - } - - selectedContact(user:any) { - /* this.groupName = this.room.name; */ - if(user.isChecked != true ) { - user.isChecked = false - } else { - user.isChecked = true - } - - const userIndex = this.objectUserSingleStone.findIndex((e) => e._id == user._id) - this.objectUserSingleStone[userIndex].isChecked = user.isChecked - - } - - addContacts(roomId:any) { - - this.selectedUserList = this.objectUserSingleStone.filter(function(contact) { - return contact.isChecked == true; - }); - - this.selectedUserList.forEach(user=>{ - let body ={ - "roomId":roomId, - "userId":user._id, - } - this.chatService.addUserToGroup(body).subscribe(res=>{ - this.ChatSystemService.getGroupRoom(roomId).updateContacts() - }); - }); - } - - - async newGroup(){ - this.close(); - const modal = await this.modalController.create({ - component: NewGroupPage, - cssClass: 'new-group modal-desktop', - backdropDismiss: false, - }); - - modal.onDidDismiss(); - await modal.present(); - } - - async openGroupMessages(room:any){ - this.close(); - const modal = await this.modalController.create({ - component: GroupMessagesPage, - componentProps: { - room: room, - }, - cssClass: 'group-messages', - backdropDismiss: false - }); - - - modal.onDidDismiss(); - await modal.present(); - } - -} diff --git a/src/app/shared/chat/group-messages/group-messages.page.html b/src/app/shared/chat/group-messages/group-messages.page.html deleted file mode 100644 index 2b1e8cd95..000000000 --- a/src/app/shared/chat/group-messages/group-messages.page.html +++ /dev/null @@ -1,326 +0,0 @@ - - -
-
-
- {{ ChatSystemService.getGroupRoom(roomId).name.split('-').join(' ') }} -
-
- - -
-
-
-
- - -
-
- - {{member.name}}, - -
-
- -
-
-
- - - - - - - - -
-
- Esta conversa passou a grupo
- A conversa original mantêm-se como chat individual -
- -
-
-
- - - - -
-
- {{msg.u.name}} - {{msg.time}} -
-
- -
{{msg.msg}}
-
{{msg.msg}}
- - - - Enviado - - - - - Lido -
Tentar
-
- {{last ? scrollToBottom() : ''}} -
-
- -
-
-
-
- - - - -
-
- {{msg.u.name}} - {{msg.time}} -
-
-
-
-
-
- - - {{"Imagem"}} - - - - -
-
-
- - image - - - - Enviado - - - - - Lido -
Tentar
-
- -
-
-
-
-
- - - - - {{ file.title}} - - - - - -
-
- - - - - - - - {{file.title}} -
-
-
-
- - - {{"Mensagem de voz"}} - - - - -
-
- -
-
- - {{file.description}} - - - - - - Enviado - - - - - Lido -
Tentar
-
-
-
-
-
- {{last ? scrollToBottom() : ''}} -
-
-
-
- {{msg.u.name}} criou esta reunião
- - De {{showDateDuration(msg.file.start_date)}} a {{showDateDuration(msg.file.end_date)}}
- {{msg.file.venue}}
-
-
- -
- {{ msg.msg}} -
- -
- Alterou o nome do grupo para "{{msg.msg.split('-').join(' ')}}"
- {{last ? scrollToBottom() : ''}} -
-
-
-
- {{user.name}} saiu do grupo
-
-
- {{last ? scrollToBottom() : ''}} -
-
-
-
- {{user.name}} foi removido do grupo
-
-
- {{last ? scrollToBottom() : ''}} -
-
-
-
- Adicionou {{user.name}}
-
-
- {{last ? scrollToBottom() : ''}} -
- -
-
- - - - - - - -
- - - -
- - - {{ ChatSystemService.getGroupRoom(roomId).userThatIsTyping }} está a escrever... -
- -
- {{durationDisplay}} - -
- -
-
- - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
-
- -
-
- -
- - - -
-
-
- diff --git a/src/app/shared/chat/messages/contacts/contacts.page.ts b/src/app/shared/chat/messages/contacts/contacts.page.ts deleted file mode 100644 index da84e3fc6..000000000 --- a/src/app/shared/chat/messages/contacts/contacts.page.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { HttpHeaders } from '@angular/common/http'; -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { ModalController } from '@ionic/angular'; -import { ChatService } from 'src/app/services/chat.service'; -import { MessagesPage } from '../messages.page'; -import { ThemeService } from 'src/app/services/theme.service' -import { ChatSystemService } from 'src/app/services/chat/chat-system.service' -import { SessionStore } from 'src/app/store/session.service'; - - - -class UserToSelect { - -} - -@Component({ - selector: 'app-contacts', - templateUrl: './contacts.page.html', - styleUrls: ['./contacts.page.scss'], -}) -export class ContactsPage implements OnInit { - loggedUser: any; - - headers: HttpHeaders; - options:any; - textSearch:string; - room:any; - dm:any; - sessionStore = SessionStore - loading = false - @Input() roomId: string; - - @Output() openMessage:EventEmitter = new EventEmitter(); - @Output() emptyTextDescriptionOpen:EventEmitter = new EventEmitter(); - @Output() backToChat:EventEmitter = new EventEmitter(); - @Output() closeAllDesktopComponents:EventEmitter = new EventEmitter(); - - userList = this.ChatSystemService.users - - CoolList = [] - - constructor( - private modalController: ModalController, - private chatService: ChatService, - public ThemeService: ThemeService, - public ChatSystemService: ChatSystemService - ) { - this.loggedUser = SessionStore.user.ChatData['data']; - this.textSearch=""; - this.dm=null; - this.room=null; - } - - async ngOnInit() { - - this.loadUsers(); - } - - onChange(event) { - - this.textSearch = event.detail.value.toLowerCase(); - - this.userList = this.ChatSystemService.users.filter((e) => { - const username = e.name.toLowerCase() - return username.includes(this.textSearch) - }) - - - const alfa = {} - - for (let user of this.userList) { - - let firstCharacter = user.name.charAt(0); - - if(!alfa[firstCharacter]) { - alfa[firstCharacter] = [user] - } else { - alfa[firstCharacter].push(user) - } - - } - - } - - openMessagesPage(username:string) { - if( window.innerWidth < 701){ - this.createRoom(username); - } - else{ - let body = { - username: username, - } - - this.loading = true - this.chatService.createRoom(body).subscribe(res => { - this.room = res['room']; - - this.ChatSystemService.getAllRooms(() => { - this.openMessage.emit(this.room._id); - - this.loading = false - }, this.room._id); - - }, ()=> { - this.loading = false - }); - } - } - - loadUsers() { - this.ChatSystemService.getUser() - } - - separateLetter(record, recordIndex, records) { - if(recordIndex == 0) { - return record.name[0]; - } - - let first_prev = records[recordIndex - 1].name[0]; - let first_current = record.name[0]; - - if(first_prev != first_current) { - return first_current; - } - return null; - } - - doRefresh(event) { - } - - close() { - if(this.roomId) { - this.backToChat.emit({roomId: this.roomId}); - } else { - this.closeAllDesktopComponents.emit(); - } - - } - - clicked() { - - } - - createRoom(username:string){ - let body = { - username: username, - } - this.chatService.createRoom(body).subscribe(res => { - - this.room = res['room']; - this.openMessagesModal(this.room._id); - this.ChatSystemService.getAllRooms() - }); - } - - async openMessagesModal(roomId: any) { - - - - const modal = await this.modalController.create({ - component: MessagesPage, - cssClass: 'modal modal-desktop isMessagesChatOpened', - componentProps: { - roomId: roomId, - }, - }); - - modal.onDidDismiss(); - await modal.present(); - } - - async openMessages(username:string){ - /* this.close(); */ - - let dm:any; - //Create new room - this.createRoom(username); - - } - -} diff --git a/src/app/shared/chat/messages/messages.page.html b/src/app/shared/chat/messages/messages.page.html deleted file mode 100644 index fd28d70e8..000000000 --- a/src/app/shared/chat/messages/messages.page.html +++ /dev/null @@ -1,305 +0,0 @@ - - -
-
-
- {{ ChatSystemService.getDmRoom(this.roomId).name }} - - -
- -
- -
-
-
- - - - - - - -
- - - -
- -
-
- - - - - -
-
- {{msg.u.name}} - {{msg.time}} -
-
- -
{{msg.msg}}
- - Apagou a mensagem - - - - - Enviado - - - - - Lido -
Tentar
-
- {{last ? scrollToBottom() : ''}} -
-
- -
-
-
- - - - - -
-
- {{msg.u.name}} - {{msg.time}} -
-
-
-
-
-
- - - {{"Imagem"}} - - - - - - -
- image - - - - Enviado - - - - - Lido -
Tentar
-
-
-
-
-
- -
- - - - - {{ file.title}} - - - - - -
- -
- - - - - - - - - - - - - {{file.title}} -
-
-
-
- - - {{'Mensagem de voz'}} - - - - - - -
-
- -
-
- - {{file.description}} - - - - - - Enviado - - - - - Lido -
Tentar
-
-
-
-
-
- {{last ? scrollToBottom() : ''}} -
-
- -
- - Apagou a mensagem
- - - {{msg.u.name}} criou esta reunião
- - - De {{showDateDuration(msg.file.start_date)}} a - {{showDateDuration(msg.file.end_date)}} -
- - - {{msg.file.venue}} -
-
-
- - - -
- -
- -
- - - - - - - -
- - - - -
- - está a escrever... -
-
- {{durationDisplay}} -
-
-
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
-
- -
-
- -
- - - -
-
-
diff --git a/src/app/shared/chat/messages/messages.page.ts b/src/app/shared/chat/messages/messages.page.ts deleted file mode 100644 index 89d28c5c0..000000000 --- a/src/app/shared/chat/messages/messages.page.ts +++ /dev/null @@ -1,1262 +0,0 @@ -import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core'; -import { AnimationController, GestureController, IonRange, ModalController, PopoverController } from '@ionic/angular'; -import { ChatService } from 'src/app/services/chat.service'; -import { ToastService } from 'src/app/services/toast.service'; -import { ChatOptionsPopoverPage } from 'src/app/shared/popover/chat-options-popover/chat-options-popover.page'; -import { MessagesOptionsPage } from 'src/app/shared/popover/messages-options/messages-options.page'; -import { ContactsPage } from '../new-group/contacts/contacts.page'; -import { ChatOptionsFeaturesPage } from 'src/app/modals/chat-options-features/chat-options-features.page'; -import { ChatMessageStore } from 'src/app/store/chat/chat-message.service'; -import { ChatUserStorage } from 'src/app/store/chat/chat-user.service'; -import { TimeService } from 'src/app/services/functions/time.service'; -import { FileService } from 'src/app/services/functions/file.service'; -import { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page'; -import { ThemeService } from 'src/app/services/theme.service'; -import { ViewEventPage } from 'src/app/modals/view-event/view-event.page'; -import { Storage } from '@ionic/storage'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service' -import { RochetChatConnectorService } from 'src/app/services/chat/rochet-chat-connector.service' -import { MessageService } from 'src/app/services/chat/message.service'; -import { CameraService } from 'src/app/services/camera.service'; -import { FileType } from 'src/app/models/fileType'; -import { SearchPage } from 'src/app/pages/search/search.page'; -import { Camera, CameraResultType, CameraSource } from '@capacitor/camera'; -import { DocumentViewer, DocumentViewerOptions } from '@ionic-native/document-viewer'; -import { VoiceRecorder, RecordingData, GenericResponse } from 'capacitor-voice-recorder'; -import { Filesystem, Directory } from '@capacitor/filesystem'; -import { DomSanitizer } from '@angular/platform-browser'; -import { Platform } from '@ionic/angular'; -import { File } from '@awesome-cordova-plugins/file/ngx'; -import { FileOpener } from '@awesome-cordova-plugins/file-opener/ngx'; -import { SessionStore } from 'src/app/store/session.service'; -import { Howl } from 'howler'; -import { ViewMediaPage } from 'src/app/modals/view-media/view-media.page'; -import { ChatMessageDebuggingPage } from 'src/app/shared/popover/chat-message-debugging/chat-message-debugging.page'; -import { PermissionService } from 'src/app/services/permission.service'; -import { FileValidatorService } from "src/app/services/file/file-validator.service" -import { ChangeDetectorRef } from '@angular/core'; - - -const IMAGE_DIR = 'stored-images'; -@Component({ - selector: 'app-messages', - templateUrl: './messages.page.html', - styleUrls: ['./messages.page.scss'], -}) -export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy { - showLoader: boolean; - - @ViewChild('scrollMe') private myScrollContainer: ElementRef; - @ViewChild('message-item') messageContainer: ElementRef; - - messages: any; - dm: any; - userPresence = ''; - dmUsers: any; - checktimeOut: boolean; - members: any; - downloadProgess = 0; - - @Input() roomId: string; - @Input() showMessages: string; - - @Output() openNewEventPage: EventEmitter = new EventEmitter(); - @Output() getDirectMessages: EventEmitter = new EventEmitter(); - - - chatMessageStore = ChatMessageStore - chatUserStorage = ChatUserStorage - - scrollingOnce: boolean = true; - private scrollChangeCallback: () => void; - currentPosition: any; - startPosition: number; - mesageItemDropdownOptions: boolean = false; - scrollToBottomBtn = false; - longPressActive = false; - frameUrl: any; - downloadFile: string; - massages: MessageService[] = [] - - showAvatar = true; - - recording = false; - allowTyping = true; - storedFileNames = []; - lastAudioRecorded = ''; - audioRecorded: any = ""; - audioDownloaded: any = ""; - durationDisplay = ''; - duration = 0; - - audioPermissionStatus: 'granted' | 'denied' | 'prompt' | null = null - sessionStore = SessionStore - audioPlay: Howl = null; - isPlaying = false; - audioProgress = 0; - audioDuration = 0; - audioTimer: any; - @ViewChild('range', { static: false }) range: IonRange; - userName = ""; - room: any = new Array(); - roomName: any; - isAdmin = false; - roomCountDownDate: string; - - - constructor( - public popoverController: PopoverController, - private modalController: ModalController, - /* private navParams: NavParams, */ - private chatService: ChatService, - private animationController: AnimationController, - private toastService: ToastService, - private timeService: TimeService, - private fileService: FileService, - private gestureController: GestureController, - public ThemeService: ThemeService, - private storage: Storage, - public ChatSystemService: ChatSystemService, - public RochetChatConnectorService: RochetChatConnectorService, - private CameraService: CameraService, - private sanitiser: DomSanitizer, - private file: File, - private platform: Platform, - private fileOpener: FileOpener, - public p: PermissionService, - private FileValidatorService: FileValidatorService - ) { - // update - this.checkAudioPermission() - } - - ngOnChanges(changes: SimpleChanges): void { - - this.ChatSystemService.getAllRooms(); - this.ChatSystemService.getDmRoom(this.roomId).loadHistory({}) - - this.ChatSystemService.getDmRoom(this.roomId).scrollDown = this.scrollToBottomClicked - - this.ChatSystemService.openRoom(this.roomId) - - this.ChatSystemService.getDmRoom(this.roomId) - - this.showAvatar = false - - - - - setTimeout(() => { - this.scrollToBottomClicked() - this.showAvatar = true - }, 150) - - this.deleteRecording() - - // this.ChatSystemService.getDmRoom(this.roomId).deleteAll() - - } - - - async ChatMessageDebuggingPage() { - - const modal = await this.modalController.create({ - component: ChatMessageDebuggingPage, - cssClass: 'model profile-modal search-submodal', - componentProps: { - roomId: this.roomId, - } - }); - return await modal.present(); - } - - async checkAudioPermission() { - const permissionStatus = await navigator.permissions.query({ name: 'microphone' } as any) - - - - this.audioPermissionStatus = permissionStatus.state - - permissionStatus.onchange = (data: any) => { - // - // - } - - } - - ngOnInit() { - this.ChatSystemService.getAllRooms(); - // this.chatService.refreshtoken(); - this.scrollToBottom(); - this.getChatMembers(); - - this.deleteRecording(); - this.loadFiles(); - - } - - - onPressingMessage() { - const gesture = this.gestureController.create({ - el: this.messageContainer.nativeElement, - gestureName: 'long-press', - onStart: ev => { - this.longPressActive = true; - - }, - onEnd: ev => { - this.longPressActive = false; - - } - }); - } - - load = () => { - this.checktimeOut = true; - this.getChatMembers(); - } - - - doRefresh(ev: any) { - this.load(); - ev.target.complete(); - } - - scrollToBottom = () => { - try { - if (this.scrollingOnce) { - this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight; - //this.scrollingOnce = false; - } - } catch (err) { } - } - - scrollToBottomClicked = () => { - try { - this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight; - //this.scrollingOnce = false; - } catch (err) { } - } - - ngAfterViewInit() { - this.scrollChangeCallback = () => this.onContentScrolled(event); - window.addEventListener('scroll', this.scrollChangeCallback, true); - } - - onContentScrolled(e) { - this.startPosition = e.srcElement.scrollTop; - let scroll = e.srcElement.scrollTop; - let windowHeight = e.srcElement.scrollHeight; - let containerHeight = windowHeight - e.srcElement.clientHeight; - - if (scroll > this.currentPosition) { - } else { - this.scrollingOnce = false; - } - if ((containerHeight - 100) > scroll) { - this.scrollToBottomBtn = true; - } - else { - this.scrollToBottomBtn = false; - } - this.currentPosition = scroll; - } - - calculateDuration() { - if (!this.recording) { - this.duration = 0; - this.durationDisplay = ''; - return; - } - this.duration += 1; - const minutes = Math.floor(this.duration / 60); - const seconds = (this.duration % 60).toString().padStart(2, '0'); - this.durationDisplay = `${minutes}:${seconds}`; - - setTimeout(() => { - this.calculateDuration(); - }, 1000) - } - - async getFile(fileName?: any) { - const audioFile = await Filesystem.readFile({ - path: fileName, - directory: Directory.Data - }) - const base64sound = audioFile.data; - const base64Response = await fetch(`data:audio/ogg;base64,${base64sound}`); - this.audioRecorded = base64Response.url; - } - - async loadFiles() { - try { - this.storage.get('fileName').then((fileName) => { - this.lastAudioRecorded = fileName; - }) - - this.storage.get('recordData').then((recordData) => { - - if (recordData?.value?.recordDataBase64.includes('data:audio')) { - this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(recordData?.value?.recordDataBase64); - } - else if (recordData?.value?.mimeType && recordData?.value?.recordDataBase64) { - this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(`data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`); - } - }); - } catch (error) { } - - - this.storage.get('recordData').then((recordData) => { - - if (recordData?.value?.recordDataBase64?.includes('data:audio')) { - this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(recordData.value.recordDataBase64); - } - else if (recordData?.value?.mimeType && recordData?.value?.recordDataBase64) { - this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(`data:${recordData.value.mimeType};base64,${recordData.value.recordDataBase64}`); - } - }); - } - - async startRecording() { - VoiceRecorder.requestAudioRecordingPermission(); - if (await VoiceRecorder.canDeviceVoiceRecord().then((result: GenericResponse) => { return result.value })) { - if (await VoiceRecorder.requestAudioRecordingPermission().then((result: GenericResponse) => { return result.value })) { - //if(await this.hasAudioRecordingPermission()){ - if (this.recording) { - return; - } - this.recording = true; - VoiceRecorder.startRecording(); - this.calculateDuration(); - //} - } - else { - this.toastService._badRequest('Para gravar uma mensagem de voz, permita o acesso do Gabinete Digital ao seu microfone.'); - } - } - else { - this.toastService._badRequest('Este dispositivo não tem capacidade para gravação de áudio!'); - } - } - - stopRecording() { - this.deleteRecording(); - this.allowTyping = false; - - if (!this.recording) { - return; - } - this.recording = false; - VoiceRecorder.stopRecording().then(async (result: RecordingData) => { - - this.recording = false; - if (result.value && result.value.recordDataBase64) { - const recordData = result.value.recordDataBase64; - // - const fileName = new Date().getTime() + ".mp3"; - //Save file - this.storage.set('fileName', fileName); - this.storage.set('recordData', result).then(() => { - - }) - } - }) - setTimeout(async () => { - this.loadFiles(); - }, 1000); - } - - async deleteRecording() { - this.storage.remove('fileName'); - this.storage.remove('recordData'); - - this.allowTyping = true; - this.lastAudioRecorded = ''; - this.loadFiles(); - } - - ngOnDestroy() { - this.checktimeOut = false; - window.removeEventListener('scroll', this.scrollChangeCallback, true); - } - - openBookMeetingComponent() { - let data = { - roomId: this.roomId, - members: this.members - } - this.openNewEventPage.emit(data); - } - - showDateDuration(start: any) { - return this.timeService.showDateDuration(start); - } - - - sendMessage() { - this.ChatSystemService.getDmRoom(this.roomId).send({}) - } - - - async sendAudio(fileName) { - const roomId = this.roomId - let audioFile; - this.storage.get('recordData').then(async (recordData) => { - - audioFile = recordData; - - if (recordData?.value?.recordDataBase64?.includes('data:audio')) { - this.audioRecorded = recordData.value.recordDataBase64; - } - else { - this.audioRecorded = `data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`; - } - //Converting base64 to blob - const encodedData = btoa(this.audioRecorded); - const blob = this.fileService.base64toBlob(encodedData, recordData.value.mimeType) - - const formData = new FormData(); - formData.append("blobFile", blob); - - this.ChatSystemService.getDmRoom(roomId).send({ - file: { - "type": "application/audio", - "msDuration": audioFile.value.msDuration, - "mimeType": audioFile.value.mimeType, - }, - attachments: [{ - "title": fileName, - "title_link_download": true, - "type": "audio" - }], - temporaryData: formData, - attachmentsModelData: { - fileBase64: encodedData, - } - }) - - }); - this.deleteRecording(); - } - - - deleteMessage(msgId: string, msg: MessageService) { - this.ChatSystemService.getDmRoom(this.roomId).sendDeleteRequest(msgId) - } - - - async openViewDocumentModal(file: any) { - let task = { - serialNumber: '', - taskStartDate: '', - isEvent: true, - workflowInstanceDataFields: { - FolderID: '', - Subject: file.Assunto, - SourceSecFsID: file.ApplicationId, - SourceType: 'DOC', - SourceID: file.DocId, - DispatchNumber: '' - } - } - - let doc = { - "Id": "", - "ParentId": "", - "Source": 1, - "ApplicationId": file.ApplicationId, - "CreateDate": "", - "Data": null, - "Description": "", - "Link": null, - "SourceId": file.DocId, - "SourceName": file.Assunto, - "Stakeholders": "", - } - - const modal = await this.modalController.create({ - component: ViewDocumentPage, - componentProps: { - trustedUrl: '', - file: { - title: file.Assunto, - url: '', - title_link: '', - }, - Document: doc, - applicationId: file.ApplicationId, - docId: file.DocId, - folderId: '', - task: task - }, - cssClass: 'modal modal-desktop' - }); - await modal.present(); - } - - getChatMembers() { - // - - // this.showLoader = true; - // this.chatService.getMembers(this.roomId).subscribe(res => { - // this.members = res['members']; - // this.dmUsers = res['members'].filter(data => data.username != this.sessionStore.user.UserName) - // this.showLoader = false; - // }); - - this.members = this.ChatSystemService.getDmRoom(this.roomId).members - this.dmUsers = this.ChatSystemService.getDmRoom(this.roomId).membersExcludeMe - } - - async openMessagesOptions(ev: any) { - const popover = await this.popoverController.create({ - component: MessagesOptionsPage, - componentProps: { - roomId: this.dm._id, - }, - cssClass: 'messages-options', - event: ev, - translucent: true, - }); - return await popover.present(); - } - - async addContacts() { - const modal = await this.modalController.create({ - component: ContactsPage, - componentProps: {}, - cssClass: 'contacts', - backdropDismiss: false - }); - - - - modal.onDidDismiss(); - await modal.present(); - } - - openSendMessageOptions(ev?: any) { - if (window.innerWidth < 701) { - - this.openChatOptions(ev); - } - else { - - this._openChatOptions(); - } - } - - async openChatOptions(ev: any) { - const popover = await this.popoverController.create({ - component: ChatOptionsPopoverPage, - cssClass: 'chat-options-popover', - event: ev, - translucent: true - }); - return await popover.present(); - } - - - - async _openMessagesOptions() { - - const enterAnimation = (baseEl: any) => { - const backdropAnimation = this.animationController.create() - .addElement(baseEl.querySelector('ion-backdrop')!) - .fromTo('opacity', '0.01', 'var(--backdrop-opacity)'); - - const wrapperAnimation = this.animationController.create() - .addElement(baseEl.querySelector('.modal-wrapper')!) - .keyframes([ - { offset: 0, opacity: '1', right: '-100%' }, - { offset: 1, opacity: '1', right: '0px' } - ]); - - return this.animationController.create() - .addElement(baseEl) - .easing('ease-out') - .duration(500) - .addAnimation([backdropAnimation, wrapperAnimation]); - } - - const leaveAnimation = (baseEl: any) => { - return enterAnimation(baseEl).direction('reverse'); - } - - - const modal = await this.modalController.create({ - enterAnimation, - leaveAnimation, - component: MessagesOptionsPage, - cssClass: 'model profile-modal search-submodal', - componentProps: { - roomId: this.roomId, - } - }); - return await modal.present(); - } - - - dataURItoBlob(dataURI) { - // convert base64 to raw binary data held in a string - // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this - var byteString = atob(dataURI.split(',')[1]); - - // separate out the mime component - var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0] - - // write the bytes of the string to an ArrayBuffer - var ab = new ArrayBuffer(byteString.length); - - // create a view into the buffer - var ia = new Uint8Array(ab); - - // set the bytes of the buffer to the correct values - for (var i = 0; i < byteString.length; i++) { - ia[i] = byteString.charCodeAt(i); - } - - // write the ArrayBuffer to a blob, and you're done - var blob = new Blob([ab], { type: mimeString }); - return blob; - - } - - async takePictureMobile() { - - - const roomId = this.roomId - - const file = await Camera.getPhoto({ - quality: 90, - // allowEditing: true, - resultType: CameraResultType.Base64, - source: CameraSource.Camera - }); - console.log('Selected: ', file) - var base64 = 'data:image/jpeg;base64,' + file.base64String - const compressedImage = await this.compressImageBase64( - base64, - 800, // maxWidth - 800, // maxHeight - 0.9 // quality - ).then((picture) => { - - base64 = picture - }); - - - const blob = this.dataURItoBlob(base64) - - const formData = new FormData(); - formData.append("blobFile", blob); - - this.ChatSystemService.getDmRoom(roomId).send({ - file: { - "type": "application/img", - "guid": '', - }, - temporaryData: formData, - attachments: [{ - "title": file.path, - // "image_url": "", - //"image_url": 'data:image/jpeg;base64,' + file.base64String, - "text": "description", - "title_link_download": false, - }], - attachmentsModelData: { - fileBase64: base64, - } - }) - - } - - async takePicture() { - - const roomId = this.roomId - - const file = await Camera.getPhoto({ - quality: 90, - // allowEditing: true, - resultType: CameraResultType.Base64, - source: CameraSource.Camera - }); - - console.log('FILE CHAT', file) - - const imageBase64 = 'data:image/jpeg;base64,' + file.base64String - const blob = this.dataURItoBlob(imageBase64) - - console.log(imageBase64) - - const formData = new FormData(); - formData.append("blobFile", blob); - - - this.ChatSystemService.getDmRoom(roomId).send({ - file: { - "type": "application/img", - "guid": '' - }, - temporaryData: formData, - attachments: [{ - "title": "file.jpg", - "text": "description", - "title_link_download": false, - }], - attachmentsModelData: { - fileBase64: imageBase64, - } - }) - - } - - async addImage() { - this.addFileToChatMobile(['image/apng', 'image/jpeg', 'image/png']) - } - - async addFile() { - this.addFileToChat(['.doc', '.docx', '.pdf']) - } - - async addFileWebtrix() { - const modal = await this.modalController.create({ - component: SearchPage, - cssClass: 'group-messages modal-desktop search-modal search-modal-to-desktop', - componentProps: { - type: 'AccoesPresidenciais & ArquivoDespachoElect', - select: true, - showSearchInput: true, - } - }); - - modal.onDidDismiss().then(async res => { - - const data = res.data; - const roomId = this.roomId - - if (data.selected) { - - this.ChatSystemService.getDmRoom(roomId).send({ - file: { - "name": res.data.selected.Assunto, - "type": "application/webtrix", - "ApplicationId": res.data.selected.ApplicationType, - "DocId": res.data.selected.Id, - "Assunto": res.data.selected.Assunto, - }, - temporaryData: res, - attachments: [{ - "title": res.data.selected.Assunto, - "description": res.data.selected.DocTypeDesc, - "title_link_download": true, - "type": "webtrix", - "text": res.data.selected.DocTypeDesc, - "thumb_url": "https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png", - }], - }) - - - } - }); - - await modal.present(); - } - - async addFileToChatMobile(types: typeof FileType[]) { - const roomId = this.roomId - - const file = await Camera.getPhoto({ - quality: 90, - // allowEditing: true, - resultType: CameraResultType.Base64, - source: CameraSource.Photos - }); - - //const imageData = await this.fileToBase64Service.convert(file) - // - console.log('Selected: ', file) - var base64 = 'data:image/jpeg;base64,' + file.base64String - if (file.format == "jpeg" || file.format == "png" || file.format == "gif") { - - const compressedImage = await this.compressImageBase64( - base64, - 800, // maxWidth - 800, // maxHeight - 0.9 // quality - ).then((picture) => { - - base64 = picture - }); - - const response = await fetch(base64); - const blob = await response.blob(); - - console.log(base64) - - const formData = new FormData(); - formData.append("blobFile", blob); - - this.ChatSystemService.getDmRoom(roomId).send({ - file: { - "type": "application/img", - "guid": '' - }, - temporaryData: formData, - attachments: [{ - "title": file.path, - //"image_url": 'data:image/jpeg;base64,' + file.base64String, - "text": "description", - "title_link_download": false, - }], - attachmentsModelData: { - fileBase64: base64, - } - }) - } - - - } - - - - async addFileToChat(types: typeof FileType[]) { - - - const roomId = this.roomId - - const file: any = await this.fileService.getFileFromDevice(types); - - if (file.type == 'application/pdf' || file.type == 'application/doc' || file.type == 'application/docx' || - file.type == 'application/xls' || file.type == 'application/xlsx' || file.type == 'application/ppt' || - file.type == 'application/pptx' || file.type == 'application/txt') { - - console.log('FILE rigth?', file) - - const fileName = file.name - - const validation = this.FileValidatorService.fileNameValidation(fileName) - - if (validation.isOk) { - - const encodedData = btoa(JSON.stringify(await this.getBase64(file).catch((error) => { - console.error(error); - }))); - - let blob; - let formData - let fileBase64 - if (this.platform.is("tablet")) { - - blob = this.fileService.base64toBlob(encodedData, file.type) - console.log('BLOB BLOB', blob) - - formData = new FormData(); - formData.append('blobFile', file); - /* console.log('add file', fileBase64) */ - - } else { - console.log('encode data', encodedData) - blob = this.fileService.base64toBlob(encodedData, file.type) - - fileBase64 = await this._getBase64(file) - - formData = new FormData(); - formData.append('blobFile', file); - } - - - - - this.ChatSystemService.getDmRoom(roomId).send({ - file: { - "type": file.type, - "guid": '', - }, - attachments: [{ - "title": file.name, - "name": file.name, - //"image_url": res, - // "text": "description", - "title_link_download": false, - }], - temporaryData: formData, - attachmentsModelData: { - fileBase64: fileBase64, - } - }) - } else { - this.toastService._badRequest("Ficheiro inválido") - } - - } - - } - - _getBase64(file) { - return new Promise((resolve, reject) => { - var reader = new FileReader(); - reader.readAsDataURL(file); - reader.onload = function () { - resolve(reader.result) - }; - reader.onerror = function (error) { - console.log('Error: ', error); - }; - }) - } - getFileReader(): FileReader { - const fileReader = new FileReader(); - const zoneOriginalInstance = (fileReader as any)["__zone_symbol__originalInstance"]; - return zoneOriginalInstance || fileReader; - } - - getBase64(file) { - var reader = this.getFileReader(); - reader.readAsDataURL(file); - return new Promise(resolve => { - reader.onload = function () { - resolve(reader.result) - }; - reader.onerror = function (error) { - - }; - }); - - } - - - bookMeeting() { - let data = { - roomId: this.roomId, - members: this.members - } - this.openNewEventPage.emit(data); - } - - - chatsend() { - - } - - async _openChatOptions() { - const roomId = this.roomId; - - - const enterAnimation = (baseEl: any) => { - const backdropAnimation = this.animationController.create() - .addElement(baseEl.querySelector('ion-backdrop')!) - .fromTo('opacity', '0.01', 'var(--backdrop-opacity)'); - - const wrapperAnimation = this.animationController.create() - .addElement(baseEl.querySelector('.modal-wrapper')!) - .keyframes([ - { offset: 0, opacity: '1', right: '-100%' }, - { offset: 1, opacity: '1', right: '0px' } - ]); - - return this.animationController.create() - .addElement(baseEl) - .easing('ease-out') - .duration(500) - .addAnimation([backdropAnimation, wrapperAnimation]); - } - - const leaveAnimation = (baseEl: any) => { - return enterAnimation(baseEl).direction('reverse'); - } - - const modal = await this.modalController.create({ - enterAnimation, - leaveAnimation, - component: ChatOptionsFeaturesPage, - cssClass: 'model profile-modal search-submodal', - componentProps: { - roomId: this.roomId, - members: this.members, - } - }); - - modal.onDidDismiss().then(async (res) => { - - - - if (res['data'] == 'meeting') { - //this.closeAllDesktopComponents.emit(); - let data = { - roomId: this.roomId, - members: this.members - } - this.openNewEventPage.emit(data); - } - else if (res['data'] == 'take-picture') { - - this.takePictureMobile() - - } - else if (res['data'] == 'add-picture') { - - this.addImage() - - } - else if (res['data'] == 'add-document') { - - this.addFile() - - } - else if (res['data'] == 'documentoGestaoDocumental') { - - this.addFileWebtrix() - - this.showLoader = false; - } - - }); - await modal.present(); - - } - - - - - downloadFileMsg(msg: MessageService) { - msg.downloadFileMsg() - } - - pdfPreview() { - const options: DocumentViewerOptions = { - title: 'My App' - }; - DocumentViewer.viewDocument - } - - async audioPreview(msg) { - - if (!msg.attachments[0].title_link || msg.attachments[0].title_link === null || msg.attachments[0].title_link === '') { - this.downloadFileMsg(msg) - } else { } - } - - b64toBlob(b64Data, contentType) { - contentType = contentType || ''; - var sliceSize = 512; - b64Data = b64Data.replace(/^[^,]+,/, ''); - b64Data = b64Data.replace(/\s/g, ''); - var byteCharacters = window.atob(b64Data); - var byteArrays = []; - - for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) { - var slice = byteCharacters.slice(offset, offset + sliceSize); - - var byteNumbers = new Array(slice.length); - for (var i = 0; i < slice.length; i++) { - byteNumbers[i] = slice.charCodeAt(i); - } - - var byteArray = new Uint8Array(byteNumbers); - - byteArrays.push(byteArray); - } - - var blob = new Blob(byteArrays, { type: contentType }); - return blob; - } - - downloadFileFromBrowser(fileName: string, data: any): void { - - const link = document.createElement("a") - link.href = `data:${data.type}';base64,${data.image_url}`; - link.download = fileName - link.click() - - link.remove() - } - - viewDocument(file: any, url?: string) { - - if (file.type == "application/webtrix") { - this.openViewDocumentModal(file); - } - else { - let fullUrl = "https://www.tabularium.pt" + url; - this.fileService.viewDocumentByUrl(fullUrl); - } - } - - openFile(pdfString, filename, type) { - const blob = this.b64toBlob(pdfString, type) - let pathFile = '' - const fileName = filename - const contentFile = blob - if (this.platform.is('ios')) { - pathFile = this.file.documentsDirectory - } else { - pathFile = this.file.externalRootDirectory - } - - - - this.file - .writeFile(pathFile, fileName, contentFile, { replace: true }) - .then(success => { - this.fileOpener - .open(pathFile + fileName, type) - .then(() => { }) - .catch(e => console.error(e)) - }) - .catch(e => console.error(e)) - } - - async openPreview(msg) { - - - if (msg.file.type === "application/webtrix") { - this.viewDocument(msg.file, msg.attachments.image_url) - } else { - - if (!msg.attachments[0].image_url || msg.attachments[0].image_url === null || msg.attachments[0].image_url === '') { - this.downloadFileMsg(msg) - - } else { - - var str = msg.attachments[0].image_url - str = str.substring(1, ((str.length) - 1)); - - if (this.platform.is('desktop') || this.platform.is('mobileweb')) { - - if (msg.file.type == "application/img") { - const modal = await this.modalController.create({ - component: ViewMediaPage, - cssClass: 'modal modal-desktop', - componentProps: { - image: msg.attachments[0].image_url, - type: msg.file.type, - username: msg.u.name, - _updatedAt: msg._updatedAt - } - }); - modal.present(); - } else { - this.downloadFileFromBrowser(msg.attachments[0].title, msg.attachments[0],) - } - - - } else { - this.openFile(msg.attachments[0].image_url, msg.attachments[0].title, msg.file.type); - // this.downloadFileFromBrowser("file", str) - } - - } - } - - } - - start(track) { - if (this.audioPlay) { - this.audioPlay.stop(); - } - this.audioPlay = new Howl({ - src: [track.changingThisBreaksApplicationSecurity], - onplay: () => { - this.isPlaying = true; - this.updateProgress() - }, - onend: () => { - this.isPlaying = false; - clearTimeout(this.audioTimer) - this.audioProgress = 0 - - }, - }) - this.audioPlay.play(); - } - - togglePlayer(pause) { - this.isPlaying = !pause; - if (pause) { - this.audioPlay.pause(); - } else { - this.audioPlay.play(); - } - } - - seek() { - let newValue = +this.range.value; - let duration = this.audioPlay.duration(); - this.audioPlay.seek(duration * (newValue / 100)); - } - - updateProgress() { - let seek = this.audioPlay.seek(); - this.audioProgress = (seek / this.audioPlay.duration()) * 100 || 0; - this.audioTimer = setTimeout(() => { - this.updateProgress() - }, 1000) - } - - async getRoomInfo() { - let room = await this.chatService.getRoomInfo(this.roomId).toPromise(); - this.room = room['room']; - if (this.room.name) { - try { - this.roomName = this.room.name.split('-').join(' '); - } catch (error) { - this.roomName = this.room.name; - } - - } - - - if (SessionStore.user.ChatData.data.userId == this.room.u._id) { - this.isAdmin = true - } else { - this.isAdmin = false - } - - if (this.room.customFields.countDownDate) { - this.roomCountDownDate = this.room.customFields.countDownDate; - } - } - - - async compressImageBase64(base64String: string, maxWidth: number, maxHeight: number, quality: number): Promise { - return new Promise((resolve, reject) => { - const image = new (window as any).Image(); - image.src = base64String; - - image.onload = async () => { - const canvas = document.createElement('canvas'); - let newWidth = image.width; - let newHeight = image.height; - - if (newWidth > maxWidth) { - newHeight *= maxWidth / newWidth; - newWidth = maxWidth; - } - - if (newHeight > maxHeight) { - newWidth *= maxHeight / newHeight; - newHeight = maxHeight; - } - - canvas.width = newWidth; - canvas.height = newHeight; - - const context = canvas.getContext('2d'); - context?.drawImage(image, 0, 0, newWidth, newHeight); - - const compressedBase64 = canvas.toDataURL('image/jpeg', quality); - resolve(compressedBase64); - }; - - image.onerror = (error) => { - reject(error); - }; - }); - } - - -} - - - diff --git a/src/app/shared/chat/new-group/contacts/contacts.page.ts b/src/app/shared/chat/new-group/contacts/contacts.page.ts deleted file mode 100644 index 01218ebe9..000000000 --- a/src/app/shared/chat/new-group/contacts/contacts.page.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ModalController } from '@ionic/angular'; -import { GroupMessagesPage } from '../../group-messages/group-messages.page'; -import { ThemeService } from 'src/app/services/theme.service' -import { ChatSystemService } from 'src/app/services/chat/chat-system.service' - -@Component({ - selector: 'app-contacts', - templateUrl: './contacts.page.html', - styleUrls: ['./contacts.page.scss'], -}) -export class ContactsPage implements OnInit { - options:any; - - constructor( - private modalController: ModalController, - public ThemeService: ThemeService, - public ChatSystemService: ChatSystemService - ) - { - - } - - ngOnInit() { - this.loadUsers(); - - } - - loadUsers(){ - this.ChatSystemService.getUser() - } - - separateLetter(record, recordIndex, records){ - - if(recordIndex == 0){ - return record.first[0]; - } - - let first_prev = records[recordIndex - 1].first[0]; - let first_current = record.first[0]; - - if(first_prev != first_current){ - return first_current; - } - return null; - } - - doRefresh(event){ - - } - close(){ - this.modalController.dismiss(); - } - onChange(event){ - - } - clicked(){ - - - } - async groupMessages(){ - const modal = await this.modalController.create({ - component: GroupMessagesPage, - componentProps: {}, - cssClass: 'contacts', - backdropDismiss: false - }); - - modal.onDidDismiss(); - await modal.present(); - } - -} diff --git a/src/app/shared/popover/chat-popover/chat-popover.page.html b/src/app/shared/popover/chat-popover/chat-popover.page.html deleted file mode 100644 index 340f70792..000000000 --- a/src/app/shared/popover/chat-popover/chat-popover.page.html +++ /dev/null @@ -1,19 +0,0 @@ - -
- -
-
- - - -
- - -
-
\ No newline at end of file diff --git a/src/app/shared/popover/chat-popover/chat-popover.page.ts b/src/app/shared/popover/chat-popover/chat-popover.page.ts deleted file mode 100644 index 29640a531..000000000 --- a/src/app/shared/popover/chat-popover/chat-popover.page.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ModalController, NavParams, PopoverController } from '@ionic/angular'; -import { ChatService } from 'src/app/services/chat.service'; -import { ToastService } from 'src/app/services/toast.service'; -import { ThemeService } from 'src/app/services/theme.service' -import { SetRoomOwnerPage } from 'src/app/modals/set-room-owner/set-room-owner.page'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; -import { HttpErrorResponse } from '@angular/common/http'; -import { SessionStore } from 'src/app/store/session.service'; -import { GroupContactsPage } from '../../chat/group-messages/group-contacts/group-contacts.page'; - - -@Component({ - selector: 'app-chat-popover', - templateUrl: './chat-popover.page.html', - styleUrls: ['./chat-popover.page.scss'], -}) -export class ChatPopoverPage implements OnInit { - roomId:string; - room: any; - members:any; - isAdmin = false; - isGroupCreated: boolean; - - constructor( - private popoverController: PopoverController, - private modalController: ModalController, - private navParams: NavParams, - private chatService: ChatService, - private toastService: ToastService, - public ThemeService: ThemeService, - public ChatSystemService: ChatSystemService, - ) { - this.roomId = this.navParams.get('roomId'); - this.members = this.navParams.get('members'); - this.isAdmin = this.navParams.get('isAdmin'); - - console.log(this.navParams.data) - - } - - ngOnInit() { - // this.chatService.refreshtoken(); - } - - close(action:any){ - if( window.innerWidth < 701){ - this.popoverController.dismiss(action); - } - else{ - this.modalController.dismiss(action) - } - } - - //Top menu options - //Close - - async setRoomOwner(){ - let classs; - if (window.innerWidth < 701) { - classs = 'modal modal-desktop' - } else { - classs = 'centered-rounded-modal' - } - const modal = await this.modalController.create({ - component: SetRoomOwnerPage, - cssClass: classs, - backdropDismiss: true, - componentProps: { - roomId: this.roomId, - members: this.members, - isAdmin: this.isAdmin - } - }); - await modal.present(); - modal.onDidDismiss().then((res)=>{ - if(res.data == 'success'){ - this.leaveGroup(); - //this.ChatSystemService.hidingRoom(this.roomId); - } - }); - } - - async leaveGroup(){ - - let body = { "roomId":this.roomId, } - - let res:any; - try { - res = await this.ChatSystemService.leaveRoom(this.roomId); - } catch (error) { - console.error(error) - } - if(res.error){ - if(res.error.error = "error-you-are-last-owner"){ - this.toastService._badRequest("Você é o último administrador do grupo. Por favor, defina o novo administrador antes de sair da grupo."); - - this.setRoomOwner(); - } - else if(res.error.error == 'error-user-not-in-room'){ - this.toastService._badRequest("Você já não esta nesta conversa"); - } - else{ - this.toastService._badRequest("Não foi possível sair do grupo"); - } - } - else { - this.ChatSystemService.deleteRoom(this.roomId) - this.close('leave'); - } - - } - - //Delete - deleteGroup() { - let body = { "roomId":this.roomId } - this.chatService.getRoomInfo(this.roomId).subscribe(room => { - this.room = room['room']; - - if(this.room.t === 'p') { - this.chatService.deleteGroup(body).subscribe(res=>{ - this.ChatSystemService.deleteRoom(this.roomId) - }); - } - else { - this.chatService.deleteChannel(body).subscribe(res=>{ - this.ChatSystemService.deleteRoom(this.roomId) - }); - } - }); - this.close('delete'); - } - - async openChangeGroupName(){ - this.close('edit'); - } - - - async addUser() { - this.close('addUser'); - } - -} diff --git a/src/app/shared/popover/opts-expediente/opts-expediente.page.ts b/src/app/shared/popover/opts-expediente/opts-expediente.page.ts index 076c70813..37b85fb39 100644 --- a/src/app/shared/popover/opts-expediente/opts-expediente.page.ts +++ b/src/app/shared/popover/opts-expediente/opts-expediente.page.ts @@ -14,7 +14,7 @@ import { ToastService } from 'src/app/services/toast.service'; import { ExpedienteService } from 'src/app/Rules/expediente.service'; import { PermissionService } from 'src/app/services/permission.service'; import { ThemeService } from 'src/app/services/theme.service' -import { NewGroupPage } from 'src/app/pages/chat/new-group/new-group.page'; +import { NewGroupPage } from 'src/app/ui/chat/modal/new-group/new-group.page'; import { RouteService } from 'src/app/services/route.service'; import { SessionStore } from 'src/app/store/session.service'; import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; diff --git a/src/app/shared/popover/request-options/request-options.page.ts b/src/app/shared/popover/request-options/request-options.page.ts index 9a50c246a..4682c992e 100644 --- a/src/app/shared/popover/request-options/request-options.page.ts +++ b/src/app/shared/popover/request-options/request-options.page.ts @@ -10,7 +10,7 @@ import { ProcessesService } from 'src/app/services/processes.service'; import { ToastService } from 'src/app/services/toast.service'; import { PedidoService } from 'src/app/Rules/pedido.service'; import { PermissionService } from 'src/app/services/permission.service'; -import { NewGroupPage } from 'src/app/pages/chat/new-group/new-group.page'; +import { NewGroupPage } from 'src/app/ui/chat/modal/new-group/new-group.page'; import { ForwardPage } from 'src/app/modals/forward/forward.page'; import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; @@ -50,7 +50,7 @@ export class RequestOptionsPage implements OnInit { this.activatedRoute.queryParams.subscribe(params => { if(params["serialNumber"]) { this.serialNumber = params["serialNumber"]; - // + // } }); @@ -67,7 +67,7 @@ export class RequestOptionsPage implements OnInit { } ngOnInit() { - + this.profile = "mdgpr"; window.onresize = (event) => { @@ -91,7 +91,7 @@ export class RequestOptionsPage implements OnInit { sendExpedienteToPending() { const loader = this.toastService.loading() this.processes.SetTaskToPending(this.task.SerialNumber).subscribe(res=>{ - + this.httpErrorHandle.httpsSucessMessagge('Enviar para Pendentes') this.close(); loader.remove() @@ -187,9 +187,9 @@ export class RequestOptionsPage implements OnInit { }); modal.onDidDismiss().then(res=> { - + if(res['data']=='openDiscart') { - + } else { this.popoverController.dismiss('close') diff --git a/src/app/store/chat/chat-message.service.spec.ts b/src/app/store/chat/chat-message.service.spec.ts deleted file mode 100644 index 3f2176442..000000000 --- a/src/app/store/chat/chat-message.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { ChatMessageService } from './chat-message.service'; - -describe('ChatMessageService', () => { - let service: ChatMessageService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(ChatMessageService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/store/chat/chat-message.service.ts b/src/app/store/chat/chat-message.service.ts deleted file mode 100644 index 9a735b745..000000000 --- a/src/app/store/chat/chat-message.service.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Injectable } from '@angular/core'; -import { localstoreService } from '../localstore.service' -import { SHA1 } from 'crypto-js' - -@Injectable({ - providedIn: 'root' -}) -export class ChatMessageService { - - private _message = [] - // local storage keyName - private keyName: string; - - constructor() { - - this.keyName = (SHA1('chat'+"ChatMessageService")).toString() - - setTimeout(()=> { - let restore = localstoreService.get(this.keyName, {}) - this._message = restore.message || {} - }, 10) - - } - - get message() { - return this._message - } - - getMessages(roomId) { - return this._message[roomId] || [] - } - - add(roomId:string, message: any[]) { - this._message[roomId] = message - - setTimeout(()=> { - localstoreService.set(this.keyName, { - message: this._message - }) - }, 10) - } - -} - - -export const ChatMessageStore = new ChatMessageService() \ No newline at end of file diff --git a/src/app/store/chat/chat-user.service.spec.ts b/src/app/store/chat/chat-user.service.spec.ts deleted file mode 100644 index 089b979cf..000000000 --- a/src/app/store/chat/chat-user.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { ChatUserService } from './chat-user.service'; - -describe('ChatUserService', () => { - let service: ChatUserService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(ChatUserService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/store/chat/chat-user.service.ts b/src/app/store/chat/chat-user.service.ts deleted file mode 100644 index 4cc442a78..000000000 --- a/src/app/store/chat/chat-user.service.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Injectable } from '@angular/core'; -import { localstoreService } from '../localstore.service'; -import { SHA1 } from 'crypto-js'; - -@Injectable({ - providedIn: 'root' -}) -export class ChatUserService { - - // main data - private _userList = {} - // local storage keyName - private keyName: string; - - constructor() { - - this.keyName = (SHA1('chat'+"ToDayEventStorageService")).toString() - - setTimeout(()=> { - let restore = localstoreService.get(this.keyName, {}) - this._userList = restore.userList || {} - }, 10) - - } - - get userList() { - return this._userList - } - - add(roomId:string, userList: any[] = []) { - - this._userList[roomId] = userList - - this.save() - } - - private save() { - setTimeout(()=> { - localstoreService.set(this.keyName, { - userList: this._userList - }) - }, 10) - } -} - - -export const ChatUserStorage = new ChatUserService() diff --git a/src/app/store/documentManagement.ts b/src/app/store/documentManagement.ts index f7737e42d..e69de29bb 100644 --- a/src/app/store/documentManagement.ts +++ b/src/app/store/documentManagement.ts @@ -1,33 +0,0 @@ -import { models } from 'src/plugin/src'; -import { DELETE, GET, SAVE } from '../models/beast-orm-function'; -const { rewriteSave, rewriteGet, rewriteDelete } = models.core.localStorage.rewrite; - -export class CPSession extends models.LocalStorage { - static UserId: number = models.preset() - static Email: string = models.preset() - static UserName: string = models.preset() - static FullName: string = models.preset() - static RoleID: number = models.preset() - static RoleDescription: string = models.preset() - static OrganicEntityID: number = models.preset() - static OrganicEntityName: string = models.preset() - static Status: string = models.preset() - static Authorization: string = models.preset() - static AuthorizationJwt: string = models.preset() -} - -// content production -models.migrate({ - databaseName:'content-production', - type: 'localStorage', - version: 1, - models: [CPSession], -}) -// rewrite -rewriteGet.connect(GET, [CPSession]) -rewriteSave.connect(SAVE, [CPSession]) -rewriteDelete.connect(DELETE, [CPSession]) -// get function - -console.log('get') -CPSession.get() \ No newline at end of file diff --git a/src/app/store/publication-event-folder.service.spec.ts b/src/app/store/publication-event-folder.service.spec.ts deleted file mode 100644 index 61516ad83..000000000 --- a/src/app/store/publication-event-folder.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { PublicationEventFolderService } from './publication-event-folder.service'; - -describe('PublicationEventFolderService', () => { - let service: PublicationEventFolderService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(PublicationEventFolderService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/store/session.service.spec.ts b/src/app/store/session.service.spec.ts deleted file mode 100644 index 4238e142b..000000000 --- a/src/app/store/session.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { SessionService } from './session.service'; - -describe('SessionService', () => { - let service: SessionService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(SessionService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/ui/chat/chat-routing.module.ts b/src/app/ui/chat/chat-routing.module.ts new file mode 100644 index 000000000..9da4a7c8f --- /dev/null +++ b/src/app/ui/chat/chat-routing.module.ts @@ -0,0 +1,73 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { ChatPage } from './chat.page'; +const routes: Routes = [ + { + path: '', + component: ChatPage, + }, + { + path: 'new-group', + loadChildren: () => import('./modal/new-group/new-group.module').then( m => m.NewGroupPageModule) + }, + { + path: 'group-messages', + loadChildren: () => import('./modal/group-messages/group-messages.module').then( m => m.GroupMessagesPageModule) + }, + { + path: 'messages', + outlet:'message', + loadChildren: () => import('./modal/messages/messages.module').then( m => m.MessagesPageModule) + }, + { + path: 'edit-group', + loadChildren: () => import('./modal/edit-group/edit-group.module').then( m => m.EditGroupPageModule) + }, + { + path: 'chat-options-popover', + loadChildren:() => import('./modal/chat-options-popover/chat-options-popover.module').then( m => m.ChatOptionsPopoverPageModule) + }, + { + path: 'chat-debugging', + loadChildren: () => import('./modal/chat-debugging/chat-debugging.module').then( m => m.ChatDebuggingPageModule) + }, + { + path: 'chat-message-debugging', + loadChildren: () => import('./modal/chat-message-debugging/chat-message-debugging.module').then( m => m.ChatMessageDebuggingPageModule) + }, + { + path: 'empty-chat', + loadChildren: () => import('./component/empty-chat/empty-chat.module').then( m => m.EmptyChatPageModule) + }, + { + path: 'edit-group', + loadChildren: () => import('./component/edit-group/edit-group.module').then( m => m.EditGroupPageModule) + }, + { + path: 'set-room-owner', + loadChildren: () => import('./modal/set-room-owner/set-room-owner.module').then( m => m.SetRoomOwnerPageModule) + }, + { + path: 'contacts', + loadChildren: () => import('./component/contacts/contacts.module').then( m => m.ContactsPageModule) + }, + { + path: 'view-onces', + loadChildren: () => import('./modal/view-onces/view-onces.module').then( m => m.ViewOncesPageModule) + }, + { + path: 'room-info', + loadChildren: () => import('./modal/room-info/room-info.module').then( m => m.RoomInfoPageModule) + }, + { + path: 'edit-message', + loadChildren: () => import('./modal/edit-message/edit-message.module').then( m => m.EditMessagePageModule) + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class ChatPageRoutingModule {} diff --git a/src/app/pages/chat/chat.module.ts b/src/app/ui/chat/chat.module.ts similarity index 58% rename from src/app/pages/chat/chat.module.ts rename to src/app/ui/chat/chat.module.ts index bbd84cba1..b5f4c7d48 100644 --- a/src/app/pages/chat/chat.module.ts +++ b/src/app/ui/chat/chat.module.ts @@ -9,18 +9,20 @@ import { ChatPageRoutingModule } from './chat-routing.module'; import { ChatPage } from './chat.page'; import { RouterModule } from '@angular/router'; import { PipesModule } from 'src/app/pipes/pipes.module'; - -import { ContactsPageModule } from 'src/app/shared/chat/messages/contacts/contacts.module'; -import { GroupMessagesPageModule } from 'src/app/shared/chat/group-messages/group-messages.module'; -import { NewGroupPageModule } from 'src/app/shared/chat/new-group/new-group.module'; -import { EditGroupPageModule } from 'src/app/shared/chat/edit-group/edit-group.module'; -import { GroupContactsPageModule } from 'src/app/shared/chat/group-messages/group-contacts/group-contacts.module'; -import { MessagesPageModule } from 'src/app/shared/chat/messages/messages.module'; -import { EmptyChatPageModule } from 'src/app/shared/chat/empty-chat/empty-chat.module'; import { NewEventPageModule } from 'src/app/shared/agenda/new-event/new-event.module'; import { AttendeeModalPageModule } from 'src/app/shared/event/attendee-modal/attendee-modal.module'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; import { ImageCropperModule } from 'ngx-image-cropper'; +import { EmptyChatPageModule } from './component/empty-chat/empty-chat.module'; +import { EditGroupPageModule } from './component/edit-group/edit-group.module'; +import { GroupContactsPageModule } from './component/group-messages/group-contacts/group-contacts.module'; +import { GroupMessagesPageModule } from './component/group-messages/group-messages.module'; +import { MessagesPageModule } from './component/messages/messages.module'; +import { ContactsPageModule } from './component/contacts/contacts.module'; +import { NewGroupPageModule } from './component/new-group/new-group.module'; +import { ChatModule } from 'src/app/module/chat/chat.module'; +import { IBoldLocalRepository } from 'src/app/core/chat/repository/bold/bold-local-repository'; +import { BoldLocalRepository } from 'src/app/module/chat/data/repository/bold/bold-local-repository'; @NgModule({ imports: [ @@ -40,7 +42,10 @@ import { ImageCropperModule } from 'ngx-image-cropper'; EmptyChatPageModule, NewEventPageModule, ImageCropperModule, - AttendeeModalPageModule, + AttendeeModalPageModule + ], + providers: [ + ], declarations: [ ChatPage diff --git a/src/app/ui/chat/chat.page.html b/src/app/ui/chat/chat.page.html new file mode 100644 index 000000000..75cd7004e --- /dev/null +++ b/src/app/ui/chat/chat.page.html @@ -0,0 +1,191 @@ + + + + + + +
+ +
+ + +
+
+ Chat +
+
+ + + +
+
+ + + + + Conversas + + + Grupos + + + +
+
+
+
+ + + + + + + + +
+
+
+
+ + +
+
+ {{room.roomName}} +
+
+
+
+
+
+ {{ room.displayDate }} +
+
+
+ + {{ expirationDate[room.id] !== null ? expirationDate[room.id] + ' seconds left' : '' }} +
+
+ + + +
{{room.messages[0].message}}
+ + +
+ + + + audio + + + {{ room.messages[0].attachments[0].description }} +
+ + +
+
+
Mensagem foi eliminada
+
+ + + + +
+
+
+ +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
diff --git a/src/app/pages/chat/chat.page.scss b/src/app/ui/chat/chat.page.scss similarity index 98% rename from src/app/pages/chat/chat.page.scss rename to src/app/ui/chat/chat.page.scss index e1d7520f8..4c22f3e22 100644 --- a/src/app/pages/chat/chat.page.scss +++ b/src/app/ui/chat/chat.page.scss @@ -186,4 +186,8 @@ ion-content{ .block-button { pointer-events: none; opacity: 0.2; +} + +.hide-room{ + display: none !important; } \ No newline at end of file diff --git a/src/app/pages/chat/chat.page.spec.ts b/src/app/ui/chat/chat.page.spec.ts similarity index 100% rename from src/app/pages/chat/chat.page.spec.ts rename to src/app/ui/chat/chat.page.spec.ts diff --git a/src/app/ui/chat/chat.page.ts b/src/app/ui/chat/chat.page.ts new file mode 100644 index 000000000..81a06155a --- /dev/null +++ b/src/app/ui/chat/chat.page.ts @@ -0,0 +1,512 @@ +import { + Component, + OnInit, +} from '@angular/core'; +import { ModalController } from '@ionic/angular'; +import { GroupMessagesPage } from './modal/group-messages/group-messages.page'; +import { ContactsPage } from './modal/./messages/contacts/contacts.page'; +import { MessagesPage } from './modal/./messages/messages.page'; +import { NewGroupPage } from './modal/./new-group/new-group.page'; +import { Observable, Subject } from "rxjs/Rx"; +import { Router, NavigationEnd } from '@angular/router'; +import { TimeService } from 'src/app/services/functions/time.service'; +import { ThemeService } from 'src/app/services/theme.service' +import { DataService } from 'src/app/services/data.service'; +import { RouteService } from 'src/app/services/route.service'; +import { EditGroupPage } from './modal/edit-group/edit-group.page'; +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service' +import { RoomLocalRepository } from 'src/app/module/chat/data/repository/room/room-local-repository.service' +import { map, tap } from 'rxjs/operators'; +import { BehaviorSubject, interval, Subscription } from 'rxjs'; +import { RoomTable } from 'src/app/infra/database/dexie/instance/chat/schema/room'; +import { RoomType } from 'src/app/core/chat/entity/group'; +import { BoldLocalRepository } from 'src/app/module/chat/data/repository/bold/bold-local-repository' +import { BoldTable } from 'src/app/infra/database/dexie/instance/chat/schema/bold'; +import { RoomViewModel } from './store/model/room'; +import { MessageLocalDataSourceService } from 'src/app/module/chat/data/repository/message/message-local-data-source.service' +@Component({ + selector: 'app-chat', + templateUrl: './chat.page.html', + styleUrls: ['./chat.page.scss'], +}) +export class ChatPage implements OnInit { + + showLoader: boolean; + segment: RoomType = RoomType.Direct + idSelected: string; + + roomId: any; + groupRoomId: any; + showEmptyComponent = true; + showMessages = false; + showContacts = false; + showNewGroup = false; + showEditGroup = false; + showGroupMessages = false; + showGroupContacts = false; + showNewEvent = false; + showAttendees = false; + emptyTextDescription = 'Sem conversa selecionada'; + + subject: any; + public messages: Subject; + hideRefreshBtn = true; + + routerSubscription + + // count$: Observable; + //items$!: DexieObservable; + items$!: Observable; + rooms: RoomViewModel[] = []; + private subscription: Subscription; + expirationDate = {} + private intervalSubscription: Subscription; + + RoomType = RoomType + + boldTable: {[key: string]: BoldTable} = {} + private roomListSubject = new BehaviorSubject<{ id: string, name: string }[]>([]); + roomsWithLastMessages: { name: string, lastMessage: any }[] = []; + private subscription1: Subscription; + + RoomSelected!: RoomViewModel; + + constructor( + private modalController: ModalController, + private timeService: TimeService, + public ThemeService: ThemeService, + private dataService: DataService, + private router: Router, + public RouteService: RouteService, + private ChatServiceService: ChatServiceService, + private roomLocalDataSourceService: RoomLocalRepository, + private boldLocalRepository: BoldLocalRepository, + private MessageLocalDataSourceService: MessageLocalDataSourceService + ) { + + window.onresize = (event) => { + if (window.innerWidth > 701) { + this.modalController.dismiss(); + } + } + + this.showLoader = true; + + this.boldLocalRepository.listen().subscribe((data) => { + const distributionObject: {[key: string]: BoldTable} = {}; + + for (const distribution of data) { + distributionObject[distribution.roomId] = distribution; + } + + this.boldTable = distributionObject + }) + + } + + + updatemessage(sortedRooms) { + this.rooms = sortedRooms + + this.rooms.sort((a, b) => + new Date(b.messages?.[0]?.sentAt as string).getTime() - + new Date(a.messages?.[0]?.sentAt as string).getTime() + ); + + + // this.RoomSelected = this.rooms.filter(e => e.id == this.idSelected)[0] + } + ngOnInit() { + // this.subscription = this.roomListSubject.pipe( + // switchMap(roomList => + // this.MessageLocalDataSourceService.getLastMessageForRooms(roomList.map(room => room.id)) + // ) + // ).subscribe(lastMessages => { + // this.roomsWithLastMessages = this.roomListSubject.value.map(room => ({ + // name: room.name, + // lastMessage: lastMessages.find(msg => msg.roomId === room.id)?.message || null + // })); + // this.roomsWithLastMessages.sort((a, b) => + // new Date(b.lastMessage.messages?.[0]?.sentAt as unknown as string) as unknown as number - + // (new Date(a.lastMessage.messages?.[0]?.sentAt as unknown as string) as any) as unknown as number + // ) + // }); + + // // Initialize room list (can be loaded from a service, API, etc.) + // this.roomListSubject.next([ + // { id: '1135e73c-af8e-416c-a51f-1602b4770cf7', name: 'Room 1' } + // // Add more rooms as needed + // ]); + + this.roomLocalDataSourceService.getItemsLive().pipe( + map((roomList) => roomList.map((room)=> new RoomViewModel(room))), + tap((roomList) => { + + roomList.sort((a, b) => + new Date(b.messages?.[0]?.sentAt as string).getTime() - + new Date(a.messages?.[0]?.sentAt as string).getTime() + ); + + console.log('update') + + this.updatemessage(roomList) + }) + ).subscribe() + + // Create the interval observable + const interval$ = interval(1000).pipe( + tap(() => { + for (const room of this.rooms) { + this.expirationDate[room.id] = this.getSecondsLeft(room.expirationDate); + } + }) + ); + + // Subscribe to the interval observable + this.intervalSubscription = interval$.subscribe(); + + // this.ChatServiceService.getRoomList() + + this.hideRefreshButton(); + + this.router.events.forEach((event) => { + if (event instanceof NavigationEnd && event.url == '/home/chat' || + event instanceof NavigationEnd && event.url == "/home/chat?gbCreateGroup=true") { + this.checkCreateGroup(); + } + }); + + this.routerSubscription = this.router.events.subscribe((event) => { + if (event instanceof NavigationEnd && event.url.startsWith('/home/chat')) { + this.routeCheck() + // this.ChatServiceService.getRoomList() + } + }); + + } + + onSegmentChange() {} + + getSecondsLeft(expirationDate: any): number | null { + if (!expirationDate) return null; + const now = new Date().getTime(); + const expTime = new Date(expirationDate).getTime(); + return Math.max(Math.floor((expTime - now) / 1000), 0); + } + + ngOnDestroy() { + // this.setStatus('offline'); + this.routerSubscription?.unsubscribe(); + // Unsubscribe from the interval to prevent memory leaks + this.intervalSubscription?.unsubscribe(); + } + + + firstEnter = true + + routeCheck() { + const urlParams = new URLSearchParams(window.location.search); + const roomId = urlParams.get('roomId'); + + if (roomId) { + + if (this.firstEnter) { + this.firstEnter = false + + let delay = this.RouteService.liveHistory.find((item) => { + return ['/home/publications', '/home/agenda', '/home/gabinete', '/home/events'].filter(x => { + return item.includes(x) + }).length >= 1 + }) + if (!delay) { + console.log("delay") + setTimeout(() => { + this.openChat(roomId) + }, 2000) + } else { + console.log("no dalay") + this.openChat(roomId) + } + } else { + this.openChat(roomId) + } + + + } + + } + + openFailed = 0 + openChat(roomId) { + // const room = this.ChatSystemService.getRoomById(roomId); + if (roomId) { + //this.openFailed = 0 + //if (room.isGroup) { + // this.segment = 'Grupos' + // this.openGroupMessagesPage(roomId) + //} else { + // this.segment = 'Contactos' + this.openMessagesPage(roomId) + //} + } else { + if (this.openFailed <= 3) { + this.openFailed++ + + setTimeout(() => { + this.openChat(roomId) + }, 1000) + } else { + this.openFailed = 0 + } + } + + } + + checkCreateGroup() { + if (this.dataService.get("newGroup")) { + this.openNewGroupPage(); + } + else { + this.closeAllDesktopComponents(); + this.showEmptyComponent = true; + } + + } + + numSequence(n: number): Array { + return Array(n); + } + + setStatus(status: string) { + let body = { + message: '', + status: status, + } + + } + + hideRefreshButton() { + window.onresize = (event) => { + if (window.innerWidth < 701) { + this.idSelected = ''; + this.hideRefreshBtn = false; + this.closeAllDesktopComponents() + + // this.ChatSystemService.getRoomById(this.roomId)?.roomLeave() + } + else { + this.hideRefreshBtn = true; + if (this.idSelected == '') { + this.showEmptyComponent = true; + } + } + } + if (window.innerWidth < 701) { + this.idSelected = ''; + this.hideRefreshBtn = false; + } + } + + closeAllDesktopComponents() { + this.showMessages = false; + this.showContacts = false; + this.showNewGroup = false; + this.showEditGroup = false; + this.showGroupMessages = false; + this.showEmptyComponent = false; + this.showGroupContacts = false; + this.showNewEvent = false; + this.showAttendees = false; + + } + + showEmptyContainer() { + this.idSelected = ''; + this.showEmptyComponent = true; + } + openGroupContactsPage(roomId) { + this.idSelected = ''; + this.groupRoomId = roomId; + this.RoomSelected = this.rooms.filter(e => e.id == roomId)[0] + this.closeAllDesktopComponents(); + if (window.innerWidth < 701) { + + } + else { + this.showGroupContacts = true; + } + } + + + openMessagesPage(roomId) { + // this.chatService.refreshtoken(); + this.roomId = roomId; + this.RoomSelected = this.rooms.filter(e => e.id == roomId)[0] + + if (window.innerWidth < 701) { + this.openMessagesModal(roomId); + } + else { + this.idSelected = roomId; + this.closeAllDesktopComponents(); + this.showEmptyComponent = false; + this.showMessages = true; + } + + } + openContactsPage() { + this.segment = RoomType.Direct; + this.idSelected = ''; + this.closeAllDesktopComponents(); + + if (window.innerWidth < 701) { + this.selectContact(); + } + else { + this.showEmptyComponent = false; + this.showContacts = true; + } + } + openNewGroupPage() { + this.segment = RoomType.Group; + + this.idSelected = ''; + if (window.innerWidth < 701) { + this.newGroup(); + } + else { + this.closeAllDesktopComponents(); + this.showEmptyComponent = false; + this.showNewGroup = true; + } + } + + openEditGroupPage(rid) { + if (window.innerWidth < 701) { + this.editGroup(rid); + } + else { + this.closeAllDesktopComponents(); + this.showEditGroup = true; + } + } + + doRefresh(event) { + setTimeout(() => { + try { + event?.target?.complete(); + } catch (error) { } + }, 1000); + } + + + showDateDuration(start: any) { + return this.timeService.showDateDuration(start); + } + + countDownDate(date: any, roomId: string) { + return this.timeService.countDownDate(date, roomId); + } + + + + async emptyTextDescriptionOpen() { + this.closeAllDesktopComponents() + this.showEmptyComponent = true + } + + + async selectContact() { + const modal = await this.modalController.create({ + component: ContactsPage, + cssClass: 'modal modal-desktop', + }); + + modal.onDidDismiss().then((Data) => { + + // let data = Data.data + // let roomId = data.roomId + // this.openMessagesPage(roomId); + + }); + + await modal.present(); + + } + + async newGroup() { + const modal = await this.modalController.create({ + component: NewGroupPage, + cssClass: 'modal modal-desktop', + }); + await modal.present(); + modal.onDidDismiss(); + } + + async editGroup(roomId) { + const modal = await this.modalController.create({ + component: EditGroupPage, + cssClass: 'modal modal-desktop', + componentProps: { + roomId: roomId, + }, + }); + + modal.onDidDismiss().then((res) => { + + this.modalController.dismiss(res.data); + }); + + await modal.present(); + } + + async openMessagesModal(roomId: any) { + this.closeAllDesktopComponents(); + + // + + const modal = await this.modalController.create({ + component: MessagesPage, + cssClass: 'modal modal-desktop isMessagesChatOpened', + componentProps: { + roomId: roomId, + }, + }); + await modal.present(); + modal.onDidDismiss(); + } + + + backToChat({ roomId }) { + + //const room = this.ChatSystemService.getRoomById(roomId); + + //if (room.isGroup) { + // this.segment = "Grupos" + // this.openGroupMessagesPage(room.id); + //} else { + // this.segment = RoomType.Direct + this.openMessagesPage(roomId); + // } + + } + + + async openGroupMessagesModal(roomId: any) { + + const modal = await this.modalController.create({ + component: GroupMessagesPage, + cssClass: 'modal modal-desktop isGroupChatOpened', + componentProps: { + roomId: roomId, + }, + }); + + modal.onDidDismiss().then(() => { + // this.ChatSystemService.currentRoom.roomLeave() + }); + await modal.present(); + } + + +} diff --git a/src/app/pages/chat/messages/contacts/contacts-routing.module.ts b/src/app/ui/chat/component/contacts/contacts-routing.module.ts similarity index 100% rename from src/app/pages/chat/messages/contacts/contacts-routing.module.ts rename to src/app/ui/chat/component/contacts/contacts-routing.module.ts diff --git a/src/app/shared/chat/new-group/contacts/contacts.module.ts b/src/app/ui/chat/component/contacts/contacts.module.ts similarity index 91% rename from src/app/shared/chat/new-group/contacts/contacts.module.ts rename to src/app/ui/chat/component/contacts/contacts.module.ts index f84088ee3..8d087470a 100644 --- a/src/app/shared/chat/new-group/contacts/contacts.module.ts +++ b/src/app/ui/chat/component/contacts/contacts.module.ts @@ -18,6 +18,7 @@ import { BtnSeguintePageModule } from 'src/app/shared/btn-seguinte/btn-seguinte. ContactsPageRoutingModule, BtnSeguintePageModule, ], - declarations: [ContactsPage] + declarations: [ContactsPage], + exports: [ContactsPage] }) export class ContactsPageModule {} diff --git a/src/app/shared/chat/new-group/contacts/contacts.page.html b/src/app/ui/chat/component/contacts/contacts.page.html similarity index 58% rename from src/app/shared/chat/new-group/contacts/contacts.page.html rename to src/app/ui/chat/component/contacts/contacts.page.html index e6b2258b9..38f39c600 100644 --- a/src/app/shared/chat/new-group/contacts/contacts.page.html +++ b/src/app/ui/chat/component/contacts/contacts.page.html @@ -3,15 +3,15 @@
-
+ Contactos
-
@@ -23,34 +23,27 @@ + - +
+ +
- - - - -
- {{header}} +
+ {{ userContainer.key }}
-
- -

{{user.first}} {{user.last}}

- +
+ + {{user.wxFullName}} +
- - +
- diff --git a/src/app/shared/chat/new-group/contacts/contacts.page.scss b/src/app/ui/chat/component/contacts/contacts.page.scss similarity index 56% rename from src/app/shared/chat/new-group/contacts/contacts.page.scss rename to src/app/ui/chat/component/contacts/contacts.page.scss index 95255004e..992cb002d 100644 --- a/src/app/shared/chat/new-group/contacts/contacts.page.scss +++ b/src/app/ui/chat/component/contacts/contacts.page.scss @@ -76,52 +76,108 @@ } ion-content{ --background:transparent; -} +} + + + .main-content{ - width: 100%; + //width: 100%; height: 100%; font-family: Roboto; margin: 0 auto; background-color: #fff; - overflow:auto; padding: 0 0 0 0; + overflow:auto; - .item-divider{ - background: #ebebeb; - font-size: rem(15); - margin: 10px 0 10px 0; - padding:5px 0 5px 20px; - + .members{ + padding: 15px 20px 0 20px !important; + + .members-list{ + margin: 0 !important; + padding: 0 !important; } + } + + .members-label{ + //margin: 10px 20px 10px 20px !important; + /* font-size: rem(15); */ + font-weight: bold; + } + + .members-checkbox{ + display: flex; + //margin: 0px 20px 0px 20px !important; + overflow: auto; + align-items: center; + + .detele-item-icon{ + display: none; + width: rem(30); + margin-left: 15px; + } + + .detele-item-icon ion-icon{ + font-size: rem(20) !important; + } + } + + .members-checkbox:hover{ + .detele-item-icon{ + display: flex; + justify-content: flex-end; + } + } + + .item-divider{ + background: #ebebeb; + font-size: rem(15); + margin: 10px 0 10px 0; + padding:5px 0 5px 20px; + + } .item-checkbox{ display: flex; margin: 10px 20px 10px 20px !important; overflow: auto; - align-items: center; - } - .item-checkbox ion-checkbox{ - --border-color: #0d89d1; - --background-checked:#0d89d1; + .item-checkbox ion-checkbox, .members-checkbox ion-checkbox{ + --border-color: var(--title-text-color); + --background-checked:var(--title-text-color); float: left; } - .item-checkbox p{ - display: block; - margin: 0 !important; - width: 330px; + .item-checkbox ion-label, .members-checkbox p{ padding-left: 10px; font-size: rem(15); - color: #0d89d1; + color: var(--title-text-color); float: left; + flex-grow: 1; } - .item-checkbox ion-icon{ + .icon, .members-checkbox ion-icon{ font-size: rem(10); - float: left; - color:#99e47b; - margin-left: 10px; } + .online{ + color:#99e47b !important; + } + .offline{ + color:#cbced1 !important; + } + .away{ + color:#ffd21f !important; + } + .invisible{ + color:#cbced1 !important; + } + .busy{ + color:#f5455c !important; + } } +.inactive { + opacity: 0.7; + button { + display: none !important; + } +} \ No newline at end of file diff --git a/src/app/pages/chat/messages/contacts/contacts.page.spec.ts b/src/app/ui/chat/component/contacts/contacts.page.spec.ts similarity index 100% rename from src/app/pages/chat/messages/contacts/contacts.page.spec.ts rename to src/app/ui/chat/component/contacts/contacts.page.spec.ts diff --git a/src/app/ui/chat/component/contacts/contacts.page.ts b/src/app/ui/chat/component/contacts/contacts.page.ts new file mode 100644 index 000000000..85f89dee9 --- /dev/null +++ b/src/app/ui/chat/component/contacts/contacts.page.ts @@ -0,0 +1,183 @@ +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { ModalController } from '@ionic/angular'; +import { GroupMessagesPage } from '../group-messages/group-messages.page'; +import { ThemeService } from 'src/app/services/theme.service' +import { UserContacts } from 'src/app/services/Repositorys/contacts/data-source/contacts-data-source.service'; +import { ContactRepositoryService } from 'src/app/services/Repositorys/contacts/repository/contacts-repository.service'; +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; +import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; +import { ToastService } from 'src/app/services/toast.service'; +import { SessionStore } from 'src/app/store/session.service'; +import { MessageEntity } from 'src/app/core/chat/entity/message'; +// import { ChatSystemService } from 'src/app/services/chat/chat-system.service' +import { RoomType } from "src/app/core/chat/entity/group"; + +@Component({ + selector: 'app-contacts', + templateUrl: './contacts.page.html', + styleUrls: ['./contacts.page.scss'], +}) +export class ContactsPage implements OnInit { + options:any; + + loading = false + userList: UserContacts[] = [] + currentMembers:UserContacts[]; + allChatUsers: UserContacts[] = []; + userContainer: {[key: string]: ( UserContacts & {isChecked: boolean})[] } = {} + + @Output() openMessage: EventEmitter = new EventEmitter(); + @Output() emptyTextDescriptionOpen: EventEmitter = new EventEmitter(); + @Output() backToChat: EventEmitter = new EventEmitter(); + @Output() closeAllDesktopComponents: EventEmitter = new EventEmitter(); + + @Input() roomId: string; + + constructor( + private modalController: ModalController, + public ThemeService: ThemeService, + private contactsRepositoryService: ContactRepositoryService, + private httpErrorHandle: HttpErrorHandle, + private toastService: ToastService, + private chatServiceService: ChatServiceService + ) + {} + + ngOnInit() { + this.loadUsers(); + + } + + async loadUsers() { + + this.loading = true + const getallChatUsers = await this.contactsRepositoryService.getUsers() + + if(getallChatUsers.isOk()) { + + this.allChatUsers = getallChatUsers.value.data.result.sort((a,b) => { + if(a.wxFullName < b.wxFullName) { + return -1; + } + if(a.wxFullName > b.wxFullName) { + return 1; + } + return 0; + }); + + + for(const user of this.allChatUsers) { + const firstLetter = user.wxFullName.charAt(0) + + if(!this.userContainer[firstLetter]) { + user['isChecked'] = false + this.userContainer[firstLetter] = [user as any] + } else { + const userIds = this.userContainer[firstLetter].map( e => e.wxUserId) + if(!userIds.includes(user.wxUserId)) { + user['isChecked'] = false + this.userContainer[firstLetter].push(user as any) + } + } + } + + + } + else if (getallChatUsers.isErr() ) { + console.log(getallChatUsers.error) + } else { + this.toastService._badRequest("Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.") + } + + + this.loading = false; + } + + separateLetter(record, recordIndex, records){ + + if(recordIndex == 0){ + return record.first[0]; + } + + let first_prev = records[recordIndex - 1].first[0]; + let first_current = record.first[0]; + + if(first_prev != first_current){ + return first_current; + } + return null; + } + + doRefresh(event){ + + } + close(roomId) { + if (roomId) { + this.backToChat.emit({ roomId: roomId }); + } else { + this.closeAllDesktopComponents.emit(); + } + } + + onChange(event) { + const textSearch = event.detail.value; + + const filteredUserList: (UserContacts & {isChecked: boolean})[] = this.FilterUserListedByTextSearch(textSearch) as any + + const userContainer = {} + for(const user of filteredUserList) { + const firstLetter = user.wxFullName.charAt(0) + if(!userContainer[firstLetter]) { + userContainer[firstLetter] = [user] + } else { + userContainer[firstLetter].push(user) + } + } + this.userContainer = userContainer + } + + + FilterUserListedByTextSearch(textSearch: string) { + return this.allChatUsers.filter( e => e.wxFullName.toLowerCase().includes(textSearch.toLowerCase())).sort((a,b) => { + if(a.wxFullName < b.wxFullName) { + return -1; + } + if(a.wxFullName > b.wxFullName) { + return 1; + } + return 0; + }); + } + + clicked() {} + + + selectOnce = true + async select(user: UserContacts) { + + const message = new MessageEntity(); + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + + message.receiverId = user.wxUserId + message.message = 'hello' + + const result = await this.chatServiceService.sendMessage(message, RoomType.Direct) + + + console.log('result', result); + + if(result.isOk()) { + await this.chatServiceService.getRoomById(result.value.roomId) + this.close(result.value.roomId) + } else { + console.log(result.error) + } + } + +} diff --git a/src/app/pages/chat/edit-group/edit-group-routing.module.ts b/src/app/ui/chat/component/edit-group/edit-group-routing.module.ts similarity index 100% rename from src/app/pages/chat/edit-group/edit-group-routing.module.ts rename to src/app/ui/chat/component/edit-group/edit-group-routing.module.ts diff --git a/src/app/shared/chat/edit-group/edit-group.module.ts b/src/app/ui/chat/component/edit-group/edit-group.module.ts similarity index 80% rename from src/app/shared/chat/edit-group/edit-group.module.ts rename to src/app/ui/chat/component/edit-group/edit-group.module.ts index 7326f844f..c52b2527b 100644 --- a/src/app/shared/chat/edit-group/edit-group.module.ts +++ b/src/app/ui/chat/component/edit-group/edit-group.module.ts @@ -7,9 +7,7 @@ import { IonicModule } from '@ionic/angular'; import { EditGroupPageRoutingModule } from './edit-group-routing.module'; import { EditGroupPage } from './edit-group.page'; -import { SharedModule } from '../../shared.module'; - -import { BtnSeguintePageModule } from '../../btn-seguinte/btn-seguinte.module'; +import { BtnSeguintePageModule } from 'src/app/shared/btn-seguinte/btn-seguinte.module'; @NgModule({ imports: [ diff --git a/src/app/shared/chat/edit-group/edit-group.page.html b/src/app/ui/chat/component/edit-group/edit-group.page.html similarity index 91% rename from src/app/shared/chat/edit-group/edit-group.page.html rename to src/app/ui/chat/component/edit-group/edit-group.page.html index 75532b7e5..4673f1f55 100644 --- a/src/app/shared/chat/edit-group/edit-group.page.html +++ b/src/app/ui/chat/component/edit-group/edit-group.page.html @@ -12,10 +12,11 @@
Alterar assunto
- +
+ @@ -38,7 +39,6 @@ - - - + +
diff --git a/src/app/shared/chat/edit-group/edit-group.page.scss b/src/app/ui/chat/component/edit-group/edit-group.page.scss similarity index 100% rename from src/app/shared/chat/edit-group/edit-group.page.scss rename to src/app/ui/chat/component/edit-group/edit-group.page.scss diff --git a/src/app/shared/chat/edit-group/edit-group.page.spec.ts b/src/app/ui/chat/component/edit-group/edit-group.page.spec.ts similarity index 100% rename from src/app/shared/chat/edit-group/edit-group.page.spec.ts rename to src/app/ui/chat/component/edit-group/edit-group.page.spec.ts diff --git a/src/app/shared/chat/edit-group/edit-group.page.ts b/src/app/ui/chat/component/edit-group/edit-group.page.ts similarity index 73% rename from src/app/shared/chat/edit-group/edit-group.page.ts rename to src/app/ui/chat/component/edit-group/edit-group.page.ts index 1fc69451b..d36e8fb92 100644 --- a/src/app/shared/chat/edit-group/edit-group.page.ts +++ b/src/app/ui/chat/component/edit-group/edit-group.page.ts @@ -1,9 +1,15 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { ModalController, PickerController } from '@ionic/angular'; -import { ChatService } from 'src/app/services/chat.service'; import { ThemeService } from 'src/app/services/theme.service' import { SessionStore } from 'src/app/store/session.service'; +import { HttpResponse } from '@microsoft/signalr'; +import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; +import { ToastService } from 'src/app/services/toast.service'; +import { ZodError } from 'zod'; + +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; + @Component({ selector: 'app-edit-group', @@ -23,11 +29,14 @@ export class EditGroupPage implements OnInit { @Output() openGroupMessage:EventEmitter = new EventEmitter(); @Output() closeAllDesktopComponents:EventEmitter = new EventEmitter(); + constructor( private modalController: ModalController, private pickerController: PickerController, - private chatService: ChatService, - public ThemeService: ThemeService + public ThemeService: ThemeService, + private httpErrorHandle: HttpErrorHandle, + private toastService: ToastService, + private chatServiceService: ChatServiceService, ) { this.loggedUser = SessionStore.user.ChatData['data']; } @@ -38,48 +47,56 @@ export class EditGroupPage implements OnInit { } getRoomInfo(){ - this.chatService.getRoomInfo(this.roomId).subscribe(room=>{ - this.room = room['room']; - - try { - this.groupName = this.room.name.split('-').join(' '); - } catch (error) { - this.groupName = this.room.name; - } - - }); + // this.chatService.getRoomInfo(this.roomId).subscribe(room=>{ + // this.room = room['room']; + + // try { + // this.groupName = this.room.name.split('-').join(' '); + // } catch (error) { + // this.groupName = this.room.name; + // } + + // }); } - close(){ + close() { //this.modalController.dismiss(); this.closeAllDesktopComponents.emit(); this.openGroupMessage.emit(this.roomId); } - changeGroupName(){ - if(this.groupName.trim().length > 1){ - let name = this.groupName.split(' ').join('-'); - let body = { - "roomId": this.room._id, - "name": name, - } - this.chatService.renameGroup(body).subscribe(res=>{ - this.modalController.dismiss(res['group']); - }); + async changeGroupName() { + + this.showLoader = true + const result = await this.chatServiceService.updateRoomById({ + roomId: this.roomId, + roomName: this.groupName, + roomType: 0 + }) + + if(result.isOk()) { + this.openGroupMessage.emit(this.roomId); + } else if (result.error instanceof HttpResponse) { + this.httpErrorHandle.httpStatusHandle(result.error) + } else if (result.error instanceof ZodError) { + this.toastService._badRequest("Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.") + console.log(result.error.errors) + } else { + this.toastService._badRequest("Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.") + console.log(result.error) } - else{ - - } - this.updateGroup(); + + this.showLoader = false + } - updateGroup(){ + updateGroup() { this.showLoader = true; - this.chatService.getRoomInfo(this.roomId).subscribe(room=>{ - this.room = room['room']; - this.showLoader = false; - this.openGroupMessage.emit(this.room._id); - }); + // this.chatService.getRoomInfo(this.roomId).subscribe(room=>{ + // this.room = room['room']; + // this.showLoader = false; + // this.openGroupMessage.emit(this.room._id); + // }); } _ionChange(event){ @@ -96,13 +113,13 @@ export class EditGroupPage implements OnInit { text: 'Ok', cssClass: 'btn-cancel', handler:(value:any)=>{ - + this.selectedDuration = [ value.days.value, value.hours.value, value.minutes.value, ] - + if(value.days.value != null && value.hours.value != null && value.minutes.value != null){ if(value.days.value > 0){ if(value.days.value == 1){ diff --git a/src/app/shared/chat/empty-chat/empty-chat-routing.module.ts b/src/app/ui/chat/component/empty-chat/empty-chat-routing.module.ts similarity index 100% rename from src/app/shared/chat/empty-chat/empty-chat-routing.module.ts rename to src/app/ui/chat/component/empty-chat/empty-chat-routing.module.ts diff --git a/src/app/shared/chat/empty-chat/empty-chat.module.ts b/src/app/ui/chat/component/empty-chat/empty-chat.module.ts similarity index 100% rename from src/app/shared/chat/empty-chat/empty-chat.module.ts rename to src/app/ui/chat/component/empty-chat/empty-chat.module.ts diff --git a/src/app/shared/chat/empty-chat/empty-chat.page.html b/src/app/ui/chat/component/empty-chat/empty-chat.page.html similarity index 100% rename from src/app/shared/chat/empty-chat/empty-chat.page.html rename to src/app/ui/chat/component/empty-chat/empty-chat.page.html diff --git a/src/app/shared/chat/empty-chat/empty-chat.page.scss b/src/app/ui/chat/component/empty-chat/empty-chat.page.scss similarity index 100% rename from src/app/shared/chat/empty-chat/empty-chat.page.scss rename to src/app/ui/chat/component/empty-chat/empty-chat.page.scss diff --git a/src/app/shared/chat/empty-chat/empty-chat.page.spec.ts b/src/app/ui/chat/component/empty-chat/empty-chat.page.spec.ts similarity index 100% rename from src/app/shared/chat/empty-chat/empty-chat.page.spec.ts rename to src/app/ui/chat/component/empty-chat/empty-chat.page.spec.ts diff --git a/src/app/shared/chat/empty-chat/empty-chat.page.ts b/src/app/ui/chat/component/empty-chat/empty-chat.page.ts similarity index 100% rename from src/app/shared/chat/empty-chat/empty-chat.page.ts rename to src/app/ui/chat/component/empty-chat/empty-chat.page.ts diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts-routing.module.ts b/src/app/ui/chat/component/group-messages/group-contacts/group-contacts-routing.module.ts similarity index 100% rename from src/app/pages/chat/group-messages/group-contacts/group-contacts-routing.module.ts rename to src/app/ui/chat/component/group-messages/group-contacts/group-contacts-routing.module.ts diff --git a/src/app/shared/chat/group-messages/group-contacts/group-contacts.module.ts b/src/app/ui/chat/component/group-messages/group-contacts/group-contacts.module.ts similarity index 100% rename from src/app/shared/chat/group-messages/group-contacts/group-contacts.module.ts rename to src/app/ui/chat/component/group-messages/group-contacts/group-contacts.module.ts diff --git a/src/app/shared/chat/group-messages/group-contacts/group-contacts.page.html b/src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.html similarity index 77% rename from src/app/shared/chat/group-messages/group-contacts/group-contacts.page.html rename to src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.html index e4fefa8e3..fafe6169d 100644 --- a/src/app/shared/chat/group-messages/group-contacts/group-contacts.page.html +++ b/src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.html @@ -35,13 +35,13 @@
-
+
Contactos selecção: - -
+ +
-

{{user.name }}

- +

{{user.wxFullName }}

+ @@ -55,10 +55,10 @@ {{ userContainer.key }}
-
- - {{user.name}} -
+
+ + {{user.wxFullName}} +
diff --git a/src/app/shared/chat/group-messages/group-contacts/group-contacts.page.scss b/src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.scss similarity index 100% rename from src/app/shared/chat/group-messages/group-contacts/group-contacts.page.scss rename to src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.scss diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.spec.ts b/src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.spec.ts similarity index 100% rename from src/app/pages/chat/group-messages/group-contacts/group-contacts.page.spec.ts rename to src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.spec.ts diff --git a/src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.ts b/src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.ts new file mode 100644 index 000000000..8fe3d4da8 --- /dev/null +++ b/src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.ts @@ -0,0 +1,226 @@ +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { ThemeService } from 'src/app/services/theme.service' +import { ContactRepositoryService } from 'src/app/services/Repositorys/contacts/repository/contacts-repository.service'; +import { UserContacts } from 'src/app/services/Repositorys/contacts/data-source/contacts-data-source.service'; +import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; +import { SessionStore } from 'src/app/store/session.service'; +import { HttpRequest } from '@angular/common/http'; +import { ZodError } from 'zod'; +import { HttpResponse } from '@microsoft/signalr'; +import { ToastService } from 'src/app/services/toast.service'; +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member/member-list-local-repository.service' + +@Component({ + selector: 'app-group-contacts', + templateUrl: './group-contacts.page.html', + styleUrls: ['./group-contacts.page.scss'], +}) +export class GroupContactsPage implements OnInit { + + showLoader: boolean; + textSearch:string; + + @Input() roomId:string; + @Output() openGroupMessage:EventEmitter = new EventEmitter(); + @Output() openGroupContacts:EventEmitter = new EventEmitter(); + + currentMembers:UserContacts[]; + allChatUsers: UserContacts[] = []; + userContainer: {[key: string]: ( UserContacts & {isChecked: boolean})[] } = {} + + selectedUsers: number[] =[] + SessionStore = SessionStore + + constructor( + public ThemeService: ThemeService, + private contactsRepositoryService: ContactRepositoryService, + private httpErrorHandle: HttpErrorHandle, + private toastService: ToastService, + private chatServiceService: ChatServiceService, + private MemberListLocalRepository: MemberListLocalRepository, + ){} + + ngOnInit(): void { + this.loadUsers() + } + + get hasMemberToUpload() { + return this.selectedUsers.length >= 1 + } + + async updateGroup() { + + if(this.hasMemberToUpload) { + this.showLoader = true; + const addMembers = await this.chatServiceService.addMemberToRoom({ + id: this.roomId, + members: this.selectedUsers + }) + + + if(addMembers.isOk()) { + // this.addContacts(this.roomId); + this.openGroupMessage.emit(this.roomId); + this.chatServiceService.getRoomById(this.roomId); + } else if(addMembers.error instanceof HttpRequest) { + this.httpErrorHandle.httpStatusHandle(addMembers.error) + } + } else { + this.openGroupMessage.emit(this.roomId); + } + + this.showLoader = false; + } + + openGroupMessagesPage() { + this.openGroupMessage.emit(this.roomId) + } + + async loadUsers() { + + const getallChatUsers = await this.contactsRepositoryService.getUsers() + const getRoomById = await this.chatServiceService.getRoomById(this.roomId) + + console.log({getallChatUsers, getRoomById}) + + if(getallChatUsers.isOk() && getRoomById.isOk()) { + + this.allChatUsers = getallChatUsers.value.data.result.sort((a,b) => { + if(a.wxFullName < b.wxFullName) { + return -1; + } + if(a.wxFullName > b.wxFullName) { + return 1; + } + return 0; + }); + + const currentMemberToMap = await this.MemberListLocalRepository.getRoomMemberById(this.roomId) + + console.log({currentMemberToMap}) + + this.currentMembers = currentMemberToMap.map((e)=> ({ + userPhoto: e.userPhoto, + wxeMail: e.wxeMail, + wxFullName: e.wxFullName, + wxUserId: e.wxUserId + })) + + + const currentMemberIds = this.currentMembers.map(e => e.wxUserId) + + const allSelectableUsers = this.allChatUsers.filter(e => !currentMemberIds.includes(e.wxUserId)) + + for(const user of allSelectableUsers) { + const firstLetter = user.wxFullName.charAt(0) + + if(!this.userContainer[firstLetter]) { + user['isChecked'] = false + this.userContainer[firstLetter] = [user as any] + } else { + const userIds = this.userContainer[firstLetter].map( e => e.wxUserId) + if(!userIds.includes(user.wxUserId)) { + user['isChecked'] = false + this.userContainer[firstLetter].push(user as any) + } + } + } + + + } + else if (getRoomById.isErr() && getRoomById.error instanceof HttpResponse) { + this.httpErrorHandle.httpStatusHandle(getRoomById.error) + } else if (getallChatUsers.isErr() && getallChatUsers.error instanceof HttpResponse) { + this.httpErrorHandle.httpStatusHandle(getallChatUsers.error) + } else if (getRoomById.isErr() ) { + console.log(getRoomById.error) + } else if (getallChatUsers.isErr() ) { + console.log(getallChatUsers.error) + } else { + this.toastService._badRequest("Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.") + } + + + this.showLoader = false; + } + + doRefresh(ev) { + ev.target.complete(); + } + + FilterUserListedByTextSearch() { + return this.allChatUsers.filter( e => e.wxFullName.toLowerCase().includes(this.textSearch.toLowerCase())).sort((a,b) => { + if(a.wxFullName < b.wxFullName) { + return -1; + } + if(a.wxFullName > b.wxFullName) { + return 1; + } + return 0; + }); + } + + + onChangeCheckBox(user: UserContacts & {isChecked: boolean}) { + if(user.isChecked) { + this.selectedUsers.push(user.wxUserId) + } else { + this.selectedUsers = this.selectedUsers.filter(e => e!= user.wxUserId) + } + } + + onChange(event) { + this.textSearch = event.detail.value; + + const filteredUserList: (UserContacts & {isChecked: boolean})[] = this.FilterUserListedByTextSearch() as any + + const userContainer = {} + for(const user of filteredUserList) { + const firstLetter = user.wxFullName.charAt(0) + + if(!userContainer[firstLetter]) { + user.isChecked = this.selectedUsers.includes(user.wxUserId) + userContainer[firstLetter] = [user] + } else { + user.isChecked = this.selectedUsers.includes(user.wxUserId) + userContainer[firstLetter].push(user) + } + + } + this.userContainer = userContainer + } + + + async deleteMember(user: UserContacts) { + this.showLoader = true; + + const result = await this.chatServiceService.removeMemberToRoom({ + id: this.roomId, + members: [ user.wxUserId] + }) + + if(result.isOk()) { + this.currentMembers = this.currentMembers.filter( e => e.wxUserId != user.wxUserId) + + const firstLetter = user.wxFullName.charAt(0) + + if(!this.userContainer[firstLetter]) { + user['isChecked'] = false + this.userContainer[firstLetter] = [user as any] + } else { + user['isChecked'] = false + this.userContainer[firstLetter].push(user as any) + } + + } else if(result.error instanceof HttpRequest) { + this.httpErrorHandle.httpStatusHandle(result.error) + } else if(result.error instanceof ZodError) { + console.log(result.error.issues) + } + + this.showLoader = false; + + } + +} diff --git a/src/app/pages/chat/group-messages/group-messages-routing.module.ts b/src/app/ui/chat/component/group-messages/group-messages-routing.module.ts similarity index 100% rename from src/app/pages/chat/group-messages/group-messages-routing.module.ts rename to src/app/ui/chat/component/group-messages/group-messages-routing.module.ts diff --git a/src/app/shared/chat/group-messages/group-messages.module.ts b/src/app/ui/chat/component/group-messages/group-messages.module.ts similarity index 83% rename from src/app/shared/chat/group-messages/group-messages.module.ts rename to src/app/ui/chat/component/group-messages/group-messages.module.ts index 929170a0d..f611624d6 100644 --- a/src/app/shared/chat/group-messages/group-messages.module.ts +++ b/src/app/ui/chat/component/group-messages/group-messages.module.ts @@ -9,13 +9,12 @@ import { GroupMessagesPageRoutingModule } from './group-messages-routing.module' import { GroupMessagesPage } from './group-messages.page'; import { SharedModule } from 'src/app/shared/shared.module'; -import { ChatPopoverPageModule } from '../../popover/chat-popover/chat-popover.module'; -import { NewEventPageModule } from '../../agenda/new-event/new-event.module'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; import {MatMenuModule} from '@angular/material/menu'; import { LettersAvatarModule } from "ngx-letters-avatar"; import { PipesModule } from 'src/app/pipes/pipes.module'; import { SafehtmlPipe } from 'src/app/pipes/safehtml.pipe'; +import { ChatPopoverPageModule } from '../../modal/chat-popover/chat-popover.module'; @NgModule({ imports: [ @@ -34,4 +33,4 @@ import { SafehtmlPipe } from 'src/app/pipes/safehtml.pipe'; schemas: [CUSTOM_ELEMENTS_SCHEMA], declarations: [GroupMessagesPage] }) -export class GroupMessagesPageModule {} \ No newline at end of file +export class GroupMessagesPageModule {} diff --git a/src/app/ui/chat/component/group-messages/group-messages.page.html b/src/app/ui/chat/component/group-messages/group-messages.page.html new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/shared/chat/group-messages/group-messages.page.scss b/src/app/ui/chat/component/group-messages/group-messages.page.scss similarity index 100% rename from src/app/shared/chat/group-messages/group-messages.page.scss rename to src/app/ui/chat/component/group-messages/group-messages.page.scss diff --git a/src/app/pages/chat/group-messages/group-messages.page.spec.ts b/src/app/ui/chat/component/group-messages/group-messages.page.spec.ts similarity index 100% rename from src/app/pages/chat/group-messages/group-messages.page.spec.ts rename to src/app/ui/chat/component/group-messages/group-messages.page.spec.ts diff --git a/src/app/shared/chat/group-messages/group-messages.page.ts b/src/app/ui/chat/component/group-messages/group-messages.page.ts similarity index 84% rename from src/app/shared/chat/group-messages/group-messages.page.ts rename to src/app/ui/chat/component/group-messages/group-messages.page.ts index 04843c6e6..882f4e8b1 100644 --- a/src/app/shared/chat/group-messages/group-messages.page.ts +++ b/src/app/ui/chat/component/group-messages/group-messages.page.ts @@ -1,10 +1,7 @@ import { Component, OnChanges, OnInit, Input, SimpleChanges, Output, EventEmitter, ViewChild, ElementRef, AfterViewInit, OnDestroy } from '@angular/core'; import { AnimationController, ModalController, PopoverController, Platform } from '@ionic/angular'; import { AlertService } from 'src/app/services/alert.service'; -import { ChatService } from 'src/app/services/chat.service'; -import { ChatPopoverPage } from 'src/app/shared/popover/chat-popover/chat-popover.page'; import { GroupContactsPage } from './group-contacts/group-contacts.page'; -import { ChatOptionsPopoverPage } from '../../popover/chat-options-popover/chat-options-popover.page'; import { ChatOptionsFeaturesPage } from 'src/app/modals/chat-options-features/chat-options-features.page'; import { TimeService } from 'src/app/services/functions/time.service'; import { SearchPage } from 'src/app/pages/search/search.page'; @@ -13,8 +10,8 @@ import { FileService } from 'src/app/services/functions/file.service'; import { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page'; import { ThemeService } from 'src/app/services/theme.service' import { Storage } from '@ionic/storage'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; -import { MessageService } from 'src/app/services/chat/message.service'; +// import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; +// simport { MessageService } from 'src/app/services/chat/message.service'; import { CameraService } from 'src/app/services/camera.service'; import { FileType } from 'src/app/models/fileType'; @@ -29,6 +26,8 @@ import { SessionStore } from 'src/app/store/session.service'; import { ViewMediaPage } from 'src/app/modals/view-media/view-media.page'; import { PermissionService } from 'src/app/services/permission.service'; import { FileValidatorService } from "src/app/services/file/file-validator.service" +import { ChatOptionsPopoverPage } from '../../modal/chat-options-popover/chat-options-popover.page'; +import { ChatPopoverPage } from '../../modal/chat-popover/chat-popover.page'; @Component({ selector: 'app-group-messages', templateUrl: './group-messages.page.html', @@ -83,10 +82,9 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe groupNameFormart = ""; constructor( - public ChatSystemService: ChatSystemService, + // public ChatSystemService: ChatSystemService, private modalController: ModalController, public popoverController: PopoverController, - private chatService: ChatService, private animationController: AnimationController, private alertService: AlertService, private timeService: TimeService, @@ -103,7 +101,7 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe private FileValidatorService: FileValidatorService ) { - this.ChatSystemService.getUser() + // this.ChatSystemService.getUser() this.loggedUserChat = SessionStore.user.ChatData['data']; this.isGroupCreated = true; @@ -112,11 +110,11 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe ngOnChanges(changes: SimpleChanges): void { this.getRoomInfo(); - this.ChatSystemService.getGroupRoom(this.roomId).loadHistory({}); - // - this.ChatSystemService.openRoom(this.roomId) - this.ChatSystemService.getGroupRoom(this.roomId).scrollDown = this.scrollToBottomClicked - this.groupNameFormart = this.ChatSystemService.getGroupRoom(this.roomId).name.split('-').join(' ') + // this.ChatSystemService.getGroupRoom(this.roomId).loadHistory({}); + // // + // this.ChatSystemService.openRoom(this.roomId) + // this.ChatSystemService.getGroupRoom(this.roomId).scrollDown = this.scrollToBottomClicked + // this.groupNameFormart = this.ChatSystemService.getGroupRoom(this.roomId).name.split('-').join(' ') this.showAvatar = false setTimeout(() => { @@ -127,11 +125,11 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe this.deleteRecording(); - if (SessionStore.user.ChatData.data.userId == this.ChatSystemService.getGroupRoom(this.roomId).u._id) { - this.isAdmin = true - } else { - this.isAdmin = false - } + // if (SessionStore.user.ChatData.data.userId == this.ChatSystemService.getGroupRoom(this.roomId).u._id) { + // this.isAdmin = true + // } else { + // this.isAdmin = false + // } } @@ -155,9 +153,6 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe message: '', status: status, } - this.chatService.setUserStatus(body).subscribe(res => { - // - }) } scrollToBottom(): void { @@ -317,9 +312,9 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe // }); - if(this.ChatSystemService.users.length == 0) { - this.ChatSystemService.getUser() - } + // if(this.ChatSystemService.users.length == 0) { + // this.ChatSystemService.getUser() + // } } @@ -352,9 +347,9 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe async getRoomInfo() { - if(this.ChatSystemService.getGroupRoom(this.roomId)) { - this.ChatSystemService.getGroupRoom(this.roomId).loadHistory({}); - } + // if(this.ChatSystemService.getGroupRoom(this.roomId)) { + // this.ChatSystemService.getGroupRoom(this.roomId).loadHistory({}); + // } this.getGroupContacts(this.room); } @@ -378,11 +373,11 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe // }); // } - this.members = this.ChatSystemService.getGroupRoom(this.roomId).members + // this.members = this.ChatSystemService.getGroupRoom(this.roomId).members } sendMessage() { - this.ChatSystemService.getGroupRoom(this.roomId).send({}) + // this.ChatSystemService.getGroupRoom(this.roomId).send({}) } @@ -406,30 +401,30 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe const formData = new FormData(); formData.append("blobFile", blob); - this.ChatSystemService.getGroupRoom(roomId).send({ - file: { - "type": "application/audio", - "msDuration": audioFile.value.msDuration, - "mimeType": audioFile.value.mimeType, - }, - attachments: [{ - "title": fileName, - "title_link_download": true, - "type": "audio" - }], - temporaryData: formData, - attachmentsModelData: { - fileBase64: encodedData, - } - }) + // this.ChatSystemService.getGroupRoom(roomId).send({ + // file: { + // "type": "application/audio", + // "msDuration": audioFile.value.msDuration, + // "mimeType": audioFile.value.mimeType, + // }, + // attachments: [{ + // "title": fileName, + // "title_link_download": true, + // "type": "audio" + // }], + // temporaryData: formData, + // attachmentsModelData: { + // fileBase64: encodedData, + // } + // }) }); this.deleteRecording(); } deleteMessage(msgId: string) { - const room = this.ChatSystemService.getGroupRoom(this.roomId) - this.alertService.confirmDeleteMessage(msgId, room); + // const room = this.ChatSystemService.getGroupRoom(this.roomId) + // this.alertService.confirmDeleteMessage(msgId, room); } async openGroupMessagesOptions() { @@ -474,7 +469,7 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe this.getRoomInfo(); this.closeAllDesktopComponents.emit(); this.showEmptyContainer.emit(); - this.ChatSystemService.hidingRoom(this.roomId).catch((error) => console.error(error)); + // this.ChatSystemService.hidingRoom(this.roomId).catch((error) => console.error(error)); } else if (res.data == 'delete') { this.closeAllDesktopComponents.emit(); @@ -498,7 +493,6 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe }); - } openSendGroupMessageOptions(ev?: any) { @@ -515,7 +509,7 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe async openOptions(ev: any) { - console.trace(this.room) + // console.trace(this.room) const popover = await this.popoverController.create({ component: ChatPopoverPage, @@ -689,22 +683,22 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe const formData = new FormData(); formData.append("blobFile", blob); - this.ChatSystemService.getGroupRoom(roomId).send({ - file: { - "type": "application/img", - "guid": '', - }, - temporaryData: formData, - attachments: [{ - "title": file.path, - "image_url": 'data:image/jpeg;base64,' + file.base64String, - "text": "description", - "title_link_download": false, - }], - attachmentsModelData: { - fileBase64: base64, - } - }) + // this.ChatSystemService.getGroupRoom(roomId).send({ + // file: { + // "type": "application/img", + // "guid": '', + // }, + // temporaryData: formData, + // attachments: [{ + // "title": file.path, + // "image_url": 'data:image/jpeg;base64,' + file.base64String, + // "text": "description", + // "title_link_download": false, + // }], + // attachmentsModelData: { + // fileBase64: base64, + // } + // }) } @@ -738,21 +732,21 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe const formData = new FormData(); formData.append("blobFile", blob); - this.ChatSystemService.getGroupRoom(roomId).send({ - file: { - "type": "application/img", - "guid": '' - }, - attachments: [{ - "title": 'file.jpg', - "text": "description", - "title_link_download": false, - }], - temporaryData: formData, - attachmentsModelData: { - fileBase64: imageBase64, - } - }) + // this.ChatSystemService.getGroupRoom(roomId).send({ + // file: { + // "type": "application/img", + // "guid": '' + // }, + // attachments: [{ + // "title": 'file.jpg', + // "text": "description", + // "title_link_download": false, + // }], + // temporaryData: formData, + // attachmentsModelData: { + // fileBase64: imageBase64, + // } + // }) } @@ -782,28 +776,28 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe if (data.selected) { - this.ChatSystemService.getGroupRoom(roomId).send({ - file: { - "name": res.data.selected.Assunto, - "type": "application/webtrix", - "ApplicationId": res.data.selected.ApplicationType, - "DocId": res.data.selected.Id, - "Assunto": res.data.selected.Assunto, - }, - attachments: [{ - "title": res.data.selected.Assunto, - "description": res.data.selected.DocTypeDesc, - // "title_link": url_no_options, - "title_link_download": true, - //"thumb_url": "assets/images/webtrix-logo.png", - // "message_link": url_no_options, - "type": "webtrix", - //"thumb_url": "assets/images/webtrix-logo.png", - "text": res.data.selected.DocTypeDesc, - "thumb_url": "https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png", - }], - temporaryData: res - }) + // this.ChatSystemService.getGroupRoom(roomId).send({ + // file: { + // "name": res.data.selected.Assunto, + // "type": "application/webtrix", + // "ApplicationId": res.data.selected.ApplicationType, + // "DocId": res.data.selected.Id, + // "Assunto": res.data.selected.Assunto, + // }, + // attachments: [{ + // "title": res.data.selected.Assunto, + // "description": res.data.selected.DocTypeDesc, + // // "title_link": url_no_options, + // "title_link_download": true, + // //"thumb_url": "assets/images/webtrix-logo.png", + // // "message_link": url_no_options, + // "type": "webtrix", + // //"thumb_url": "assets/images/webtrix-logo.png", + // "text": res.data.selected.DocTypeDesc, + // "thumb_url": "https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png", + // }], + // temporaryData: res + // }) } @@ -829,22 +823,22 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe const formData = new FormData(); formData.append("blobFile", blob); - this.ChatSystemService.getGroupRoom(roomId).send({ - file: { - "type": "application/img", - "guid": '' - }, - temporaryData: formData, - attachments: [{ - "title": file.path, - "image_url": 'data:image/jpeg;base64,' + file.base64String, - "text": "description", - "title_link_download": false, - }], - attachmentsModelData: { - fileBase64: imageBase64, - } - }) + // this.ChatSystemService.getGroupRoom(roomId).send({ + // file: { + // "type": "application/img", + // "guid": '' + // }, + // temporaryData: formData, + // attachments: [{ + // "title": file.path, + // "image_url": 'data:image/jpeg;base64,' + file.base64String, + // "text": "description", + // "title_link_download": false, + // }], + // attachmentsModelData: { + // fileBase64: imageBase64, + // } + // }) } @@ -885,23 +879,23 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe formData.append('blobFile', file); } - this.ChatSystemService.getGroupRoom(roomId).send({ - file: { - "type": file.type, - "guid": '', - }, - attachments: [{ - "title": file.name, - "name": file.name, - //"image_url": res, - // "text": "description", - "title_link_download": false, - }], - temporaryData: formData, - attachmentsModelData: { - fileBase64: fileBase64, - } - }) + // this.ChatSystemService.getGroupRoom(roomId).send({ + // file: { + // "type": file.type, + // "guid": '', + // }, + // attachments: [{ + // "title": file.name, + // "name": file.name, + // //"image_url": res, + // // "text": "description", + // "title_link_download": false, + // }], + // temporaryData: formData, + // attachmentsModelData: { + // fileBase64: fileBase64, + // } + // }) } else { this.toastService._badRequest("Ficheiro inválido") } @@ -1011,7 +1005,7 @@ export class GroupMessagesPage implements OnInit, OnChanges, AfterViewInit, OnDe } - downloadFileMsg(msg: MessageService) { + downloadFileMsg(msg: any) { msg.downloadFileMsg() } diff --git a/src/app/pages/chat/new-group/contacts/contacts-routing.module.ts b/src/app/ui/chat/component/messages/contacts/contacts-routing.module.ts similarity index 100% rename from src/app/pages/chat/new-group/contacts/contacts-routing.module.ts rename to src/app/ui/chat/component/messages/contacts/contacts-routing.module.ts diff --git a/src/app/shared/chat/messages/contacts/contacts.module.ts b/src/app/ui/chat/component/messages/contacts/contacts.module.ts similarity index 100% rename from src/app/shared/chat/messages/contacts/contacts.module.ts rename to src/app/ui/chat/component/messages/contacts/contacts.module.ts diff --git a/src/app/shared/chat/messages/contacts/contacts.page.html b/src/app/ui/chat/component/messages/contacts/contacts.page.html similarity index 86% rename from src/app/shared/chat/messages/contacts/contacts.page.html rename to src/app/ui/chat/component/messages/contacts/contacts.page.html index d43a49411..5c15d7303 100644 --- a/src/app/shared/chat/messages/contacts/contacts.page.html +++ b/src/app/ui/chat/component/messages/contacts/contacts.page.html @@ -33,17 +33,17 @@
- {{header}} + {{ header }}
-
-

{{user.name}}

+
+

{{ user.wxFullName }}

- +
-
+ diff --git a/src/app/shared/chat/messages/contacts/contacts.page.scss b/src/app/ui/chat/component/messages/contacts/contacts.page.scss similarity index 100% rename from src/app/shared/chat/messages/contacts/contacts.page.scss rename to src/app/ui/chat/component/messages/contacts/contacts.page.scss diff --git a/src/app/pages/chat/new-group/contacts/contacts.page.spec.ts b/src/app/ui/chat/component/messages/contacts/contacts.page.spec.ts similarity index 100% rename from src/app/pages/chat/new-group/contacts/contacts.page.spec.ts rename to src/app/ui/chat/component/messages/contacts/contacts.page.spec.ts diff --git a/src/app/ui/chat/component/messages/contacts/contacts.page.ts b/src/app/ui/chat/component/messages/contacts/contacts.page.ts new file mode 100644 index 000000000..609e5abdc --- /dev/null +++ b/src/app/ui/chat/component/messages/contacts/contacts.page.ts @@ -0,0 +1,203 @@ +import { HttpHeaders } from '@angular/common/http'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { ModalController } from '@ionic/angular'; +import { MessagesPage } from '../messages.page'; +import { ThemeService } from 'src/app/services/theme.service' +// import { ChatSystemService } from 'src/app/services/chat/chat-system.service' +import { SessionStore } from 'src/app/store/session.service'; +import { ContactRepositoryService } from 'src/app/services/Repositorys/contacts/repository/contacts-repository.service'; +import { UserContacts } from 'src/app/services/Repositorys/contacts/data-source/contacts-data-source.service'; + +import { HttpErrorResponse } from '@angular/common/http'; +import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; +import { ToastService } from 'src/app/services/toast.service'; +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service' + + +class UserToSelect { + +} + +@Component({ + selector: 'app-contacts', + templateUrl: './contacts.page.html', + styleUrls: ['./contacts.page.scss'], +}) +export class ContactsPage implements OnInit { + loggedUser: any; + + headers: HttpHeaders; + options: any; + textSearch: string; + room: any; + dm: any; + sessionStore = SessionStore + loading = false + @Input() roomId: string; + + @Output() openMessage: EventEmitter = new EventEmitter(); + @Output() emptyTextDescriptionOpen: EventEmitter = new EventEmitter(); + @Output() backToChat: EventEmitter = new EventEmitter(); + @Output() closeAllDesktopComponents: EventEmitter = new EventEmitter(); + + userList: UserContacts[]; + originalUserList: any[] = []; + + CoolList = [] + + constructor( + private modalController: ModalController, + public ThemeService: ThemeService, + // public ChatSystemService: ChatSystemService, + private contactsRepositoryService: ContactRepositoryService, + private httpErrorHandle: HttpErrorHandle, + private toastService: ToastService, + private ChatServiceService: ChatServiceService + ) { + this.loggedUser = SessionStore.user.ChatData['data']; + this.textSearch = ""; + this.dm = null; + this.room = null; + } + + async ngOnInit() { + + this.loadUsers(); + } + + onChange(event) { + this.textSearch = event.detail.value.toLowerCase(); + this.userList = this.originalUserList.filter((e) => { + const username = e.wxFullName.toLowerCase(); + return username.includes(this.textSearch); + }); + + this.userList.sort((a, b) => a.wxFullName.toLowerCase().localeCompare(b.wxFullName.toLowerCase())); + } + + openMessagesPage(username: string, wxUserId: number) { + this.createRoom(username, wxUserId); + /* if (window.innerWidth < 701) { + this.createRoom(username); + } + else { + let body = { + username: username, + } + + this.loading = true + this.chatService.createRoom(body).subscribe(res => { + this.room = res['room']; + + this.ChatSystemService.getAllRooms(() => { + this.openMessage.emit(this.room._id); + + this.loading = false + }, this.room._id); + + }, () => { + this.loading = false + }); + }*/ + } + + async loadUsers() { + try { + let users = await this.contactsRepositoryService.getUsers(); + if (users.isOk()) { + const userData = users.value.data.result; + console.log(userData) + this.originalUserList = userData; + this.userList = [...this.originalUserList]; + this.userList.sort((a, b) => a.wxFullName.toLowerCase().localeCompare(b.wxFullName.toLowerCase())); + console.log('User data loaded successfully:', this.originalUserList); + } else { + console.error('Failed to fetch users:', users.error); + } + this.loading = false; + } catch (error) { + console.error('Error loading users', error); + this.loading = false; + } + } + + separateLetter(record, recordIndex, records) { + const normalize = (str) => str.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); + + if (recordIndex == 0) { + return normalize(record.wxFullName[0]).toUpperCase(); + } + + let firstPrev = normalize(records[recordIndex - 1].wxFullName[0]).toUpperCase(); + let firstCurrent = normalize(record.wxFullName[0]).toUpperCase(); + + if (firstPrev !== firstCurrent) { + return firstCurrent; + } + return null; + } + + doRefresh(event) { + } + + close() { + if (this.roomId) { + this.backToChat.emit({ roomId: this.roomId }); + } else { + this.closeAllDesktopComponents.emit(); + } + + } + + clicked() { + + } + + async createRoom(username: string, wxUserId: number) { + const result = await this.ChatServiceService.createRoom({ + roomName: username, + createdBy: SessionStore.user.UserId, + roomType: 0, + expirationDate: null, + members: [wxUserId] + }) + + + console.log(result) + + if(result.isOk()) { + await this.ChatServiceService.getRoomById(result.value.id); + this.openMessage.emit(result.value.id); + + } else if(result.error instanceof HttpErrorResponse) { + this.httpErrorHandle.httpStatusHandle(result.error) + } else { + this.toastService._badRequest("Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.") + console.log(result.error) + } + /* this.chatService.createRoom(body).subscribe(res => { + + this.room = res['room']; + this.openMessagesModal(this.room._id); + this.ChatSystemService.getAllRooms() + }); */ + } + + async openMessagesModal(roomId: any) { + + + + const modal = await this.modalController.create({ + component: MessagesPage, + cssClass: 'modal modal-desktop isMessagesChatOpened', + componentProps: { + roomId: roomId, + }, + }); + + modal.onDidDismiss(); + await modal.present(); + } + + +} diff --git a/src/app/pages/chat/messages/messages-routing.module.ts b/src/app/ui/chat/component/messages/messages-routing.module.ts similarity index 100% rename from src/app/pages/chat/messages/messages-routing.module.ts rename to src/app/ui/chat/component/messages/messages-routing.module.ts diff --git a/src/app/shared/chat/messages/messages.module.ts b/src/app/ui/chat/component/messages/messages.module.ts similarity index 92% rename from src/app/shared/chat/messages/messages.module.ts rename to src/app/ui/chat/component/messages/messages.module.ts index 6cec6a4e2..f7d6b2d09 100644 --- a/src/app/shared/chat/messages/messages.module.ts +++ b/src/app/ui/chat/component/messages/messages.module.ts @@ -14,6 +14,7 @@ import {MatMenuModule} from '@angular/material/menu'; import { LettersAvatarModule } from "ngx-letters-avatar"; import { PipesModule } from 'src/app/pipes/pipes.module'; import { SafehtmlPipe } from 'src/app/pipes/safehtml.pipe'; +import { ScrollingModule } from '@angular/cdk/scrolling'; @NgModule({ imports: [ @@ -26,6 +27,7 @@ import { SafehtmlPipe } from 'src/app/pipes/safehtml.pipe'; MatMenuModule, LettersAvatarModule, PipesModule, + ScrollingModule, ], exports: [MessagesPage], declarations: [MessagesPage] diff --git a/src/app/ui/chat/component/messages/messages.page.html b/src/app/ui/chat/component/messages/messages.page.html new file mode 100644 index 000000000..6eb533d74 --- /dev/null +++ b/src/app/ui/chat/component/messages/messages.page.html @@ -0,0 +1,262 @@ + + +
+
+
+ + {{ roomData.roomName }} + + +
+
+ +
+
+
+
+ + +
+ + + + {{ user.wxFullName }}, + + + + +
+
+ + + + + +
+
+ + + +
+ +
+ +
+ + {{ emoji }} + +
+ +
+
+
+
+ {{ message.message }} +
+ +
+
+ + + + + +
+ +
+ + + + +
+ Mandou uma mensagen com visualização única +
+ +
+ +
+ Abrir a visualização única +
+
+ +
+ +
+ +
+ +
+ + + + + + + + + + + {{ attachment?.fileName || attachment?.description }} +
+
+ +
+ +
+
+ + + + + + +
+ +
+ +
+
+ +
+ + + + +
+
+ +
+
+ Mensagem foi eliminada +
+
+ {{ message.message }} +
+
+ {{ message.message }} +
+
+ + {{ reaction.reaction }} + +
+
+ + +
+ + + + +
+ +
+
+ +
+ + + + + + +
+ {{durationDisplay}} +
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +
+
+ + +
+ + + +
+ +
+
diff --git a/src/app/shared/chat/messages/messages.page.scss b/src/app/ui/chat/component/messages/messages.page.scss similarity index 67% rename from src/app/shared/chat/messages/messages.page.scss rename to src/app/ui/chat/component/messages/messages.page.scss index d26566c29..518cdb28f 100644 --- a/src/app/shared/chat/messages/messages.page.scss +++ b/src/app/ui/chat/component/messages/messages.page.scss @@ -47,18 +47,15 @@ .header-bottom-icon { width: rem(30); font-size: rem(25); - float: left; padding: 2px; } .header-bottom-contacts { - width: 275px; font-size: rem(15); color: #797979; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - float: left; padding: 5px; margin: 1px; } @@ -140,44 +137,78 @@ ion-content { } } + .info-ballon { + text-align: center; + font-size: rem(13); + color: #262420; + padding: 10px; + margin: 10px auto; + line-height: 2.2rem; + border-radius: 8px; + .ballon { + background: var(--chat-alert-msg-color); + padding: 0px 10px; + border-radius: 8px; + } + } + .messages { font-size: rem(13); font-family: Roboto; overflow: auto; //set scroll do bottom - position: absolute; - top: 0; - left: 0; - overflow-x: hidden; - overflow-y: auto; - width: 100%; - height: 100%; - word-wrap: break-word; - -webkit-overflow-scrolling: touch; + // position: absolute; + // top: 0; + // left: 0; + // overflow-x: hidden; + // overflow-y: auto; + // width: 100%; + // height: 100%; + // word-wrap: break-word; + // -webkit-overflow-scrolling: touch; - .container-width-100 { - width: 100%; - overflow: auto; + .other-message, + .my-message { + + .message-container { + padding: 15px 20px; + margin: 10px 20px 10px 75px; + background: var(--chat-incoming-msg-color); + border-radius: 10px; + } } - .incoming-true, - .incoming-false { - padding: 15px 20px; - border-radius: 10px; - } - - .incoming-true { - margin: 10px 75px 10px 20px; - background: #ebebeb; - float: left; + .other-message { + display: flex; + /* justify-content: flex-end; */ + align-items: start; + flex-direction: column; + // float: left; + // Styles for incoming messages from other users + justify-content: flex-start; + .message-container { + padding: 15px 20px; + margin: 10px 75px 10px 20px; + background: #ebebeb; + border-radius: 10px; + } } } - .incoming-false { - margin: 10px 20px 10px 75px; - background: var(--chat-incoming-msg-color); - float: right; + .my-message { + + display: flex; + /* justify-content: flex-end; */ + align-items: end; + flex-direction: column; + } + + .message-bubble { + // Styles for the message bubble + background-color: #e2e2e2; // Example background color + padding: 10px; // Adjust as needed + border-radius: 10px; // Adjust as needed } .title { @@ -412,3 +443,105 @@ ion-footer { width: 111px !important; text-align: center; } + + +.message-item-options { + //display: none !important; /* Hide the options by default */ + opacity: 0 !important; +} + +.message-container:hover .message-item-options { + //display: block !important; /* Show the options on hover */ + opacity: 1 !important; +} + + + +.message-item-options { + position: relative; +} + +.emoji-picker { + display: flex; + flex-wrap: wrap; + background: white; + border: 1px solid #ccc; + padding: 5px; + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; +} + +.emoji-icon { + font-size: 20px; + cursor: pointer; + margin: 2px; +} + + + +.modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.5); +} + +.modal img { + max-width: 90%; + max-height: 90%; +} + +.modal button { + margin-top: 10px; +} + + +.view-file { + span {} + + img {} + +} + + +// .rotate-div { +// transform: rotate(180deg); +// -webkit-transform: rotate(180deg); +// -moz-transform: rotate(180deg); +// -ms-transform: rotate(180deg); +// -o-transform: rotate(180deg); +// } +.emoji-container{ + padding: 0px 20px; + /* margin-bottom: -10px; */ + position: relative; + top: -10px; + margin-bottom: -15px; +} + + +.emoji-picker { + display: flex; + flex-wrap: wrap; + margin-top: 10px; +} + +.emoji-picker button { + background: none; + border: none; + font-size: 24px; + margin: 5px; + cursor: pointer; +} + +.emoji-picker button:hover { + transform: scale(1.1); +} diff --git a/src/app/pages/chat/messages/messages.page.spec.ts b/src/app/ui/chat/component/messages/messages.page.spec.ts similarity index 100% rename from src/app/pages/chat/messages/messages.page.spec.ts rename to src/app/ui/chat/component/messages/messages.page.spec.ts diff --git a/src/app/ui/chat/component/messages/messages.page.ts b/src/app/ui/chat/component/messages/messages.page.ts new file mode 100644 index 000000000..1fd2f1e20 --- /dev/null +++ b/src/app/ui/chat/component/messages/messages.page.ts @@ -0,0 +1,1536 @@ +import { AfterViewInit, Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, QueryList, SimpleChanges, TemplateRef, ViewChild, ViewChildren } from '@angular/core'; +import { AnimationController, GestureController, IonRange, ModalController, PopoverController } from '@ionic/angular'; +import { ToastService } from 'src/app/services/toast.service'; +import { ContactsPage } from '../contacts/contacts.page'; +import { ChatOptionsFeaturesPage } from 'src/app/modals/chat-options-features/chat-options-features.page'; +import { TimeService } from 'src/app/services/functions/time.service'; +import { FileService } from 'src/app/services/functions/file.service'; +import { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page'; +import { ThemeService } from 'src/app/services/theme.service'; +import { ViewEventPage } from 'src/app/modals/view-event/view-event.page'; +import { FileType } from 'src/app/models/fileType'; +import { SearchPage } from 'src/app/pages/search/search.page'; +import { CameraResultType } from '@capacitor/camera'; +import { RecordingData } from 'capacitor-voice-recorder'; +import { DomSanitizer } from '@angular/platform-browser'; +import { Platform } from '@ionic/angular'; +import { File } from '@awesome-cordova-plugins/file/ngx'; +import { FileOpener } from '@awesome-cordova-plugins/file-opener/ngx'; +import { SessionStore } from 'src/app/store/session.service'; +import { Howl } from 'howler'; +import { ViewMediaPage } from 'src/app/modals/view-media/view-media.page'; +import { PermissionService } from 'src/app/services/permission.service'; +import { Observable as DexieObservable } from 'Dexie'; +import { Observable, Subscription } from 'rxjs'; +import { RoomLocalRepository } from 'src/app/module/chat/data/repository/room/room-local-repository.service' +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member/member-list-local-repository.service' +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; +import { EditMessagePage } from 'src/app/ui/chat/modal/edit-message/edit-message.page'; +import { IMessageType, MessageAttachmentFileType, MessageAttachmentSource } from 'src/app/core/chat/entity/message'; +import { JSFileToDataUrl } from 'src/app/utils/ToBase64'; +import { CameraService } from 'src/app/infra/camera/camera.service' +import { FilePickerWebService } from 'src/app/infra/file-picker/web/file-picker-web.service' +import { FilePickerService } from 'src/app/infra/file-picker/file-picker.service' +import { allowedDocExtension } from 'src/app/utils/allowedDocExtension'; +import { SpeakerService, StartRecordingResultError, StopRecordingResultError } from 'src/app/infra/speaker/speaker.service' +import { compressImageBase64 } from 'src/app/utils/imageCompressore'; +import { ChatPopoverPage } from '../../modal/chat-popover/chat-popover.page'; +import { LastMessage } from '../../utils/lastMessage'; +import { UserTypingLocalRepository } from 'src/app/module/chat/data/repository/typing/user-typing-local-data-source.service'; +import { UserTypingRemoteRepositoryService } from 'src/app/module/chat/data/repository/typing/user-typing-live-data-source.service'; +import { MessageLocalDataSourceService } from 'src/app/module/chat/data/repository/message/message-local-data-source.service'; +import { RoomType } from "src/app/core/chat/entity/group"; +import { Logger } from 'src/app/services/logger/main/service'; +import { tap } from 'rxjs/operators'; +import { AlertController } from '@ionic/angular'; +import { ViewOncesImagePage, ViewOncesImagePageInput } from '../../modal/view-onces/view-onces.page'; +import { MemberTable } from 'src/app/infra/database/dexie/instance/chat/schema/members'; +import { MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; +import { RoomTable } from 'src/app/infra/database/dexie/instance/chat/schema/room'; +import { TypingTable } from 'src/app/infra/database/dexie/instance/chat/schema/typing'; +import { HttpClient } from '@angular/common/http'; +import { RoomViewModel } from '../../store/model/room'; +import { MessageViewModal } from '../../store/model/message'; +import { XBallon } from '../../utils/messageBallon'; +import { whatsappDate } from 'src/app/ui/shared/utils/whatappdate'; +@Component({ + selector: 'app-messages', + templateUrl: './messages.page.html', + styleUrls: ['./messages.page.scss'], +}) +export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy { + showLoader: boolean; + + @ViewChild('scrollMe') private myScrollContainer: ElementRef; + @ViewChild('message-item') messageContainer: ElementRef; + + dm: any; + userPresence = ''; + dmUsers: any; + downloadProgess = 0; + + roomType!: RoomType + RoomTypeEnum = RoomType + + @Input() room!: RoomViewModel + @Input() roomId: string; + @Input() showMessages: string; + + @Output() openNewEventPage: EventEmitter = new EventEmitter(); + @Output() getDirectMessages: EventEmitter = new EventEmitter(); + @Output() closeAllDesktopComponents: EventEmitter = new EventEmitter(); + @Output() showEmptyContainer: EventEmitter = new EventEmitter(); + @Output() openGroupContacts: EventEmitter = new EventEmitter(); + @Output() openEditGroupPage: EventEmitter = new EventEmitter(); + @Output() getGroups: EventEmitter = new EventEmitter(); + + + scrollingOnce: boolean = true; + private scrollChangeCallback: () => void; + currentPosition: any; + startPosition: number; + mesageItemDropdownOptions: boolean = false; + scrollToBottomBtn = false; + longPressActive = false; + downloadFile: string; + showAvatar = true; + + recording = false; + allowTyping = true; + lastAudioRecorded = ''; + audioRecordedSafe: any = ""; + audioRecordedDataUrl: any = ""; + audioDownloaded: any = ""; + durationDisplay = ''; + duration = 0; + + audioPermissionStatus: 'granted' | 'denied' | 'prompt' | null = null + SessionStore = SessionStore + audioPlay: Howl = null; + isPlaying = false; + audioProgress = 0; + audioDuration = 0; + audioTimer: any; + @ViewChild('range', { static: false }) range: IonRange; + @ViewChild('array') myInputRef!: ElementRef; + + userName = ""; + roomName: any; + isAdmin = true; + roomCountDownDate: string; + audioMimeType = '' + + textField = '' + + roomData$: Observable + roomStatus$: DexieObservable + roomMessage$: DexieObservable + roomMembers$: Observable + userTyping$: TypingTable[] | undefined + newMessagesStream!: Subscription + + selectedMessage: any = null; + emojis: string[] = ['😊', '😂', '❤️', '👍', '😢']; // Add more emojis as needed + totalMessage = 0 + recordData:RecordingData + + messages: MessageViewModal[] = [] + + messageReceiveSubject: Subscription + messageDeleteSubject: Subscription + messageUpdateSubject: Subscription + messageSendSubject: Subscription + messageTypingSubject: Subscription + messageOnReconnectSubject: Subscription + + messages1: {[key: string]: MessageViewModal[]} = {} + MessageAttachmentFileType = MessageAttachmentFileType + MessageAttachmentFileSource = MessageAttachmentSource + IMessageType = IMessageType + + @ViewChild('imageModal') imageModal: TemplateRef; + totalMembers = 0 + members: MemberTable[] = [] + + private worker: SharedWorker; + private port: MessagePort; + + date: {[key: string]: Object} = {} + handleClickActive = true + + constructor( + public popoverController: PopoverController, + private modalController: ModalController, + private animationController: AnimationController, + private toastService: ToastService, + private timeService: TimeService, + private fileService: FileService, + private gestureController: GestureController, + public ThemeService: ThemeService, + private sanitiser: DomSanitizer, + private file: File, + private platform: Platform, + private fileOpener: FileOpener, + public p: PermissionService, + private MemberListLocalRepository: MemberListLocalRepository, + private chatServiceService: ChatServiceService, + private CameraService: CameraService, + private FilePickerWebService: FilePickerWebService, + private FilePickerService: FilePickerService, + private SpeakerService: SpeakerService, + private RoomLocalRepository: RoomLocalRepository, + private userTypingLocalRepository: UserTypingLocalRepository, + private UserTypingRemoteRepositoryService: UserTypingRemoteRepositoryService, + private messageLocalDataSourceService: MessageLocalDataSourceService, + private alertController: AlertController, + private http: HttpClient + ) { + // update + this.checkAudioPermission() + } + + + ngOnChanges(changes: SimpleChanges): void { + + this.roomData$ = this.RoomLocalRepository.getRoomByIdLive(this.roomId) + + this.roomData$.subscribe(e => { + if(e) { + this.roomType = e.roomType + } + }) + + this.getMessages(); + this.listenToIncomingMessage(); + this.listenToDeleteMessage(); + this.listenToUpdateMessage(); + this.listenToSendMessage(); + + this.roomMembers$ = this.MemberListLocalRepository.getRoomMemberByIdLive(this.roomId).pipe( + tap((members) => { + this.totalMembers = members.length + this.members = members + for(const member of members) { + if(member.wxUserId == SessionStore.user.UserId) { + this.isAdmin = member.isAdmin + } + } + }) + ) + + this.roomStatus$ = this.MemberListLocalRepository.allMemberOnline(this.roomId) + + this.messageTypingSubject?.unsubscribe() + this.messageTypingSubject = this.userTypingLocalRepository.getUserTypingLiveByRoomId(this.roomId).subscribe((e) => { + const arrayNames = e.filter((b)=> b.userId != SessionStore.user.UserId).map(e => e.userName) + this.userTyping$ = e as any + + const uniqueArray = [...new Set(arrayNames)]; + + if(uniqueArray.length >= 1) { + (this.myInputRef.nativeElement as HTMLDivElement).innerHTML = uniqueArray + '...' + } else { + (this.myInputRef.nativeElement as HTMLDivElement).innerHTML = '' + } + + }) as any + + + this.chatServiceService.removeBoldFromRoom({roomId: this.roomId}) + this.chatServiceService.getRoomById(this.roomId) + } + + + @HostListener('document:click', ['$event']) + handleClickOutside(event: Event) { + if (!this.handleClickActive) return; + + const clickedInside = (event.target as HTMLElement).closest('.mat-menu-content'); + if (!clickedInside) { + this.selectedMessage = null; + } + } + + messageStatus(message: MessageViewModal) { + if(this.allViewed(message)) { + return 'allViewed' + } else if(this.allReceived(message)) { + return 'allReceived' + } else if (message.messageStatus == 'send') { + return 'enviado' + } else { + return 'enviar' + } + } + allReceived(message: MessageViewModal) { + return message.info.filter(e => typeof e.deliverAt == 'string').length == this.totalMembers + } + + allViewed(message: MessageViewModal) { + const totalMembers = this.members.filter((e) => message.sender.wxUserId != e.wxUserId ).length + return message.info.filter(e => typeof e.readAt == 'string' && message.sender.wxUserId != e.memberId ).length == totalMembers + } + + async getMessages() { + + // dont remove this line + this.messages1[this.roomId] = [] + let messages = await this.messageLocalDataSourceService.getItems(this.roomId) + + this.messages1[this.roomId] = [] + this.date = {} + const allMessage = []; + + // let ids = {} + // messages = messages.filter((message: any) => { + // if (message.$createAt) { + // if (!ids[message.$createAt]) { + // ids[message.$createAt] = true; + // return true; // Keep this message + // } else { + // console.log('delete'); + // return false; // Remove this message + // } + // } + // return true; // Keep messages without an id + // }); + console.time("mappingTime"); + for(const message of messages) { + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + allMessage.push(Ballon) + } + + allMessage.push(new MessageViewModal(message)) + } + console.timeEnd("mappingTime"); + + + this.messages1[this.roomId] = allMessage + + + + // if(messages.length >= 1) { + // this.messages1[this.roomId].push(LastMessage) + // } + + this.loadAttachment() + setTimeout(() => { + this.sendReadMessage() + }, 1000) + + this.messageOnReconnectSubject?.unsubscribe() + this.messageOnReconnectSubject = this.chatServiceService.listenToMessageLoadHistory({roomId: this.roomId}).subscribe((messages) => { + + for(const message of messages.data) { + const found = this.messages1[this.roomId].find((e) => e.id == message.id) + + if(!found) { + const msg = new MessageViewModal(message as any) + Object.assign(msg, message) + this.messages1[this.roomId].push(msg) + } + } + + + this.messages1[this.roomId].sort((a, b) => { + return new Date(a.sentAt).getTime() - new Date(b.sentAt).getTime() + }) + }) + + } + + async loadAttachment() { + for(const message of this.messages1[this.roomId]) { + if(message.hasAttachment && message.attachments[0].source != MessageAttachmentSource.Webtrix) { + + this.chatServiceService.getMessageAttachmentByMessageId(message).then((result)=> { + if(result.isOk()) { + message.attachments[0].safeFile = result.value + + if(result.value.startsWith('blob:http')) { + message.attachments[0].blobURl = true + } + } + }) + + } + } + } + + async onImageLoad(message: MessageViewModal, index:number) { + if(message.attachments[0].fileName == LastMessage.attachments[0].fileName) { + + this.scrollToBottom() + setTimeout(() => { + this.scrollToBottom(); + }, 100) + + this.messages1[this.roomId].splice(index, 1); + } + } + + async onImageError() {} + + async viewOnce(event: Event, message: MessageViewModal, index:number) { + const params: ViewOncesImagePageInput = { + imageDataUrl: message.attachments[index].safeFile as any, + } + const modal = await this.modalController.create({ + component: ViewOncesImagePage, + cssClass: '', + componentProps: params + }); + + modal.present() + + return modal.onDidDismiss().then((res) => { + this.messageDelete(message) + }); + } + + sendReadMessage() { + + for(const message of this.messages1[this.roomId]) { + + if(!message.meSender()) { + const me = message.haveSeen(message.info) + + if(!me) { + Logger.info('send read at, sender '+ message.sender.wxFullName+ ' '+ message.message +'message id'+ message.id) + + this.chatServiceService.sendReadAt({ + memberId: SessionStore.user.UserId, + messageId: message.id, + requestId: '', + roomId: this.roomId + }) + } + } + } + + } + + listenToIncomingMessage() { + this.messageReceiveSubject?.unsubscribe(); + this.messageReceiveSubject = this.chatServiceService.listenToIncomingMessage(this.roomId).subscribe(async (_message) => { + + const date = whatsappDate(_message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(_message) + this.messages1[this.roomId].push(Ballon) + } + + const message = new MessageViewModal(_message) + this.messages1[this.roomId].push(new MessageViewModal(message)) + + if(message.hasAttachment) { + + const result = await this.chatServiceService.downloadMessageAttachmentByMessageId({ + $messageId: message.id, + id: message.attachments[0].id + }) + + if(result.isOk()) { + message.attachments[0].safeFile = result.value + if((result.value as unknown as string).startsWith('blob:http')) { + message.attachments[0].blobURl = true + } else { + message.attachments[0].blobURl = false + } + } + } + + setTimeout(() => { + this.scrollToBottomClicked() + }, 100) + + + setTimeout(() => { + this.chatServiceService.removeBoldFromRoom({roomId: this.roomId}) + }, 1000) + }); + + } + + listenToDeleteMessage() { + this.messageDeleteSubject?.unsubscribe(); + + this.messageDeleteSubject = this.chatServiceService.listenToDeleteMessage(this.roomId).subscribe((deleteMessage) => { + console.log('delete class', deleteMessage); + + const index = this.messages1[this.roomId].findIndex(e => + typeof e?.id == 'string' && e?.id === deleteMessage.id || + typeof e?.requestId == 'string' && e?.requestId == deleteMessage.requestId); + + try { + console.log(this.messages1[this.roomId][index]) + this.messages1[this.roomId][index].delete() + } catch (e) { + console.log('delete', e) + } + + // if (index !== -1) { // Check if the item was found + // console.log('delete ==') + // this.messages1[this.roomId].splice(index, 1); + // // console.log('removed index', index); + // } else { + // // console.log('message not found'); + // } + }); + } + + listenToUpdateMessage() { + this.messageUpdateSubject?.unsubscribe(); + + this.messageUpdateSubject = this.chatServiceService.listenToUpdateMessage(this.roomId).subscribe((updateMessage) => { + + const index = this.messages1[this.roomId].findIndex(e => e?.id === updateMessage.id); // Use triple equals for comparison + + if (index !== -1) { // Check if the item was found + this.messages1[this.roomId][index].info = updateMessage.info + this.messages1[this.roomId][index].message = updateMessage.message + this.messages1[this.roomId][index].reactions = updateMessage.reactions + } else { + // console.log('message not found'); + } + }); + } + + + listenToSendMessage() { + this.messageSendSubject?.unsubscribe(); + + this.messageSendSubject = this.chatServiceService.listenToSendMessage(this.roomId).subscribe((updateMessage) => { + + const index = this.messages1[this.roomId].findIndex(e => e?.requestId === updateMessage.requestId); // Use triple equals for comparison + + if (index !== -1) { // Check if the item was found + + this.messages1[this.roomId][index].id = updateMessage.id + this.messages1[this.roomId][index].info = updateMessage.info + + let attachmentIndex = 0; + + for(const message of updateMessage.attachments) { + + this.messages1[this.roomId][index].attachments[attachmentIndex].id = message.id + attachmentIndex++; + } + + } else { + console.log('not found message to update ui'); + } + }); + } + + onDisConnect() {} + + toggleEmojiPicker(message: MessageViewModal) { + if (this.selectedMessage === message) { + this.selectedMessage = null; // Close the picker if it's already open + } else { + this.selectedMessage = message; // Open the picker for the selected message + } + } + + addReaction(message: MessageViewModal, emoji: string) { + // Logic to add reaction to the message + console.log(`Reacting to message ${message.id} with emoji ${emoji.codePointAt(0).toString(16)}`); + this.selectedMessage = null; // Close the picker after adding reaction + + this.chatServiceService.reactToMessage({ + memberId: SessionStore.user.UserId, + messageId: message.id, + roomId: this.roomId, + reaction: emoji, + requestId: '' + }) + + } + + + sendReadAt() { + // this.chatServiceService.messageMarkAsRead({roomId: this.roomId}).then((e) => { + // console.log(e) + // }) + } + + sendTyping() { + this.UserTypingRemoteRepositoryService.sendTyping(this.roomId) + } + + async editMessage(message: MessageViewModal) { + + const modal = await this.popoverController.create({ + component: EditMessagePage, + cssClass: 'edit-message', + componentProps: { + message: message.message, + roomId: this.roomId, + } + }); + + modal.present() + + return modal.onDidDismiss().then((res) => { + + if(res.data) { + this.chatServiceService.updateMessage({ + memberId: SessionStore.user.UserId, + message: res.data.message, + messageId: message.id, + requestId: '', + roomId: this.roomId + }) + } + + }); + } + + async checkAudioPermission() { + const permissionStatus = await navigator.permissions.query({ name: 'microphone' } as any) + + + + this.audioPermissionStatus = permissionStatus.state + + permissionStatus.onchange = (data: any) => { + // + // + } + + } + + ngOnInit() { + this.scrollToBottom(); + this.getChatMembers(); + + this.deleteRecording(); + } + + + onPressingMessage() { + const gesture = this.gestureController.create({ + el: this.messageContainer.nativeElement, + gestureName: 'long-press', + onStart: ev => { + this.longPressActive = true; + + }, + onEnd: ev => { + this.longPressActive = false; + + } + }); + } + + load = () => { + this.getChatMembers(); + } + + + doRefresh(ev: any) { + this.load(); + ev.target.complete(); + } + + scrollToBottom = () => { + try { + if (this.scrollingOnce) { + this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight; + //this.scrollingOnce = false; + } + } catch (err) { } + } + + scrollToBottomClicked = () => { + try { + this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight; + //this.scrollingOnce = false; + } catch (err) { } + } + + + ngAfterViewInit() { + // this.scrollChangeCallback = () => this.onContentScrolled(event); + // window.addEventListener('scroll', this.scrollChangeCallback, true); + } + ngOnDestroy() { + window.removeEventListener('scroll', this.scrollChangeCallback, true); + this.handleClickActive = false; // Disable the listener before component destruction + } + + onContentScrolled(e) { + this.startPosition = e.srcElement.scrollTop; + let scroll = e.srcElement.scrollTop; + let windowHeight = e.srcElement.scrollHeight; + let containerHeight = windowHeight - e.srcElement.clientHeight; + + if (scroll > this.currentPosition) { + } else { + this.scrollingOnce = false; + } + if ((containerHeight - 100) > scroll) { + this.scrollToBottomBtn = true; + } + else { + this.scrollToBottomBtn = false; + } + this.currentPosition = scroll; + } + + calculateDuration() { + if (!this.recording) { + this.duration = 0; + this.durationDisplay = ''; + return; + } + this.duration += 1; + const minutes = Math.floor(this.duration / 60); + const seconds = (this.duration % 60).toString().padStart(2, '0'); + this.durationDisplay = `${minutes}:${seconds}`; + + setTimeout(() => { + this.calculateDuration(); + }, 1000) + } + + async startRecording() { + + const start = await this.SpeakerService.startRecording() + + if(start.isOk()) { + this.recording = true; + this.calculateDuration(); + } else if(start.error == StartRecordingResultError.NoSpeaker) { + this.toastService._badRequest('Este dispositivo não tem capacidade para gravação de áudio!'); + } else if (start.error == StartRecordingResultError.NeedPermission) { + this.toastService._badRequest('Para gravar uma mensagem de voz, permita o acesso do Gabinete Digital ao seu microfone.'); + } else if(start.error == StartRecordingResultError.alreadyRecording) { + + } + + } + + async stopRecording() { + this.deleteRecording(); + this.allowTyping = false; + + const stop = await this.SpeakerService.stopRecording() + + if(stop.isOk()) { + this.lastAudioRecorded = 'audio' + this.recording = false; + const recordData = stop.value + this.recordData = recordData + this.audioMimeType = recordData.value.mimeType + if (recordData.value.recordDataBase64.includes('data:audio')) { + console.log({recordData}) + this.audioRecordedDataUrl = recordData.value.recordDataBase64 + this.audioRecordedSafe = this.sanitiser.bypassSecurityTrustResourceUrl(recordData.value.recordDataBase64); + } + else if (recordData.value.mimeType && recordData?.value?.recordDataBase64) { + console.log({recordData}) + + this.audioRecordedDataUrl = `data:${recordData.value.mimeType};base64,${recordData.value.recordDataBase64}` + this.audioRecordedSafe = this.sanitiser.bypassSecurityTrustResourceUrl(this.audioRecordedDataUrl); + + } + + } else if (stop.error == StopRecordingResultError.haventStartYet) { + return + } + + } + + async sendAudio(fileName) { + const roomId = this.roomId + //Converting base64 to blob + const encodedData = this.audioRecordedDataUrl; + + const message = new MessageViewModal(); + message.roomId = this.roomId + + message.sentAt = new Date().toISOString() + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + + message.attachments = [{ + file: encodedData.split(',')[1], + fileName: "audio", + source: MessageAttachmentSource.Device, + fileType: MessageAttachmentFileType.Audio, + mimeType: this.audioMimeType, // 'audio/webm', + safeFile: this.sanitiser.bypassSecurityTrustResourceUrl(this.audioRecordedDataUrl) + }] + + message.sentAt = new Date().toISOString() + + + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + this.messages1[this.roomId].push(Ballon) + } + + this.messages1[this.roomId].push(message) + this.chatServiceService.sendMessage(message, this.roomType) + + setTimeout(() => { + this.scrollToBottomClicked() + }, 100) + + this.deleteRecording(); + } + + async deleteRecording() { + this.allowTyping = true; + this.lastAudioRecorded = ''; + this.audioRecordedSafe = '' + this.audioRecordedDataUrl = '' + } + + showDateDuration(start: any) { + return this.timeService.showDateDuration(start); + } + + async goToEvent(event: any) { + let classs; + if (window.innerWidth < 701) { + classs = 'modal modal-desktop' + } else { + classs = 'modal modal-desktop showAsideOptions' + } + const modal = await this.modalController.create({ + component: ViewEventPage, + componentProps: { + eventId: event.id, + CalendarId: event.calendarId + }, + cssClass: classs, + }); + + modal.onDidDismiss().then((res) => { + + }); + await modal.present(); + } + + async sendMessage() { + + const message = new MessageViewModal(); + message.message = this.textField + message.roomId = this.roomId + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + message.sentAt = new Date().toISOString() + + this.textField = '' + + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + this.messages1[this.roomId].push(Ballon) + } + + this.messages1[this.roomId].push(message) + setTimeout(() => { + this.scrollToBottomClicked() + }, 100) + const data = await this.chatServiceService.sendMessage(message, this.roomType) + + } + + + + + async openViewDocumentModal(msg: MessageViewModal) { + + console.log('passing', msg) + let task = { + serialNumber: '', + taskStartDate: '', + isEvent: true, + workflowInstanceDataFields: { + FolderID: '', + Subject: msg.attachments[0].description, + SourceSecFsID: msg.attachments[0].applicationId, + SourceType: 'DOC', + SourceID: msg.attachments[0].docId, + DispatchNumber: '' + } + } + + let doc = { + "Id": "", + "ParentId": "", + "Source": 1, + "ApplicationId": msg.attachments[0].applicationId, + "CreateDate": "", + "Data": null, + "Description": "", + "Link": null, + "SourceId": msg.attachments[0].docId, + "SourceName": msg.attachments[0].description, + "Stakeholders": "", + } + + const modal = await this.modalController.create({ + component: ViewDocumentPage, + componentProps: { + trustedUrl: '', + file: { + title: msg.attachments[0].description, + url: '', + title_link: '', + }, + Document: doc, + applicationId: msg.attachments[0].applicationId, + docId: msg.attachments[0].docId, + folderId: '', + task: task + }, + cssClass: 'modal modal-desktop' + }); + await modal.present(); + } + + getChatMembers() {} + + + async addContacts() { + const modal = await this.modalController.create({ + component: ContactsPage, + componentProps: {}, + cssClass: 'contacts', + backdropDismiss: false + }); + + modal.onDidDismiss(); + await modal.present(); + } + + async _openMessagesOptions() { + const enterAnimation = (baseEl: any) => { + const backdropAnimation = this.animationController.create() + .addElement(baseEl.querySelector('ion-backdrop')!) + .fromTo('opacity', '0.01', 'var(--backdrop-opacity)'); + + const wrapperAnimation = this.animationController.create() + .addElement(baseEl.querySelector('.modal-wrapper')!) + .keyframes([ + { offset: 0, opacity: '1', right: '-100%' }, + { offset: 1, opacity: '1', right: '0px' } + ]); + + return this.animationController.create() + .addElement(baseEl) + .easing('ease-out') + .duration(500) + .addAnimation([backdropAnimation, wrapperAnimation]); + } + + const leaveAnimation = (baseEl: any) => { + return enterAnimation(baseEl).direction('reverse'); + } + + const modal = await this.modalController.create({ + enterAnimation, + leaveAnimation, + component: ChatPopoverPage, + cssClass: 'model search-submodal chat-option-aside', + componentProps: { + roomId: this.roomId, + members: [], + isAdmin: this.isAdmin, + roomType: this.roomType + } + }); + await modal.present(); + modal.onDidDismiss().then(res => { + + if (res.data == 'leave') { + // this.getRoomInfo(); + this.closeAllDesktopComponents.emit(); + this.showEmptyContainer.emit(); + // this.ChatSystemService.hidingRoom(this.roomId).catch((error) => console.error(error)); + } + else if (res.data == 'delete') { + this.closeAllDesktopComponents.emit(); + this.showEmptyContainer.emit(); + } + else if (res.data == 'cancel') { + + } + else if (res.data == 'edit') { + + //this.closeAllDesktopComponents.emit(); + this.openEditGroupPage.emit(this.roomId); + } else if (res.data == 'addUser') { + + this.openGroupContactsPage(); + } + else {} + + }); + } + + openGroupContactsPage() { + this.openGroupContacts.emit(this.roomId); + } + + async takePictureMobile() { + + const oneShot = await this.askIfOneShot() + + const picture = await this.CameraService.takePicture({ + cameraResultType: CameraResultType.DataUrl, + quality: 90 + }) + + if(picture.isOk()) { + const file = picture.value + + const compressedImage = await compressImageBase64( + file.dataUrl, + 800, // maxWidth + 800, // maxHeight + 0.9 // quality + ) + + if(compressedImage.isOk()) { + + const message = new MessageViewModal(); + message.roomId = this.roomId + message.oneShot = oneShot + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + + message.sentAt = new Date().toISOString() + + message.attachments = [{ + file: compressedImage.value.split(',')[1], + fileName: "foto", + source: MessageAttachmentSource.Device, + fileType: MessageAttachmentFileType.Image, + mimeType: 'image/'+picture.value.format + }] + + + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + this.messages1[this.roomId].push(Ballon) + } + + setTimeout(() => { + this.scrollToBottomClicked() + }, 100) + this.chatServiceService.sendMessage(message, this.roomType) + + } + + } + + } + + async addFile() { + this.addFileToChat(['.doc', '.docx', '.pdf'], MessageAttachmentFileType.Doc) + } + + async addFileWebtrix() { + const modal = await this.modalController.create({ + component: SearchPage, + cssClass: 'group-messages modal-desktop search-modal search-modal-to-desktop', + componentProps: { + type: 'AccoesPresidenciais & ArquivoDespachoElect', + select: true, + showSearchInput: true, + } + }); + + modal.onDidDismiss().then(async res => { + + const data = res.data; + + console.log(data) + + if (data.selected) { + + // "title": res.data.selected.Assunto, + // "description": res.data.selected.DocTypeDesc, + + const message = new MessageViewModal(); + message.message = this.textField + message.roomId = this.roomId + + message.sentAt = new Date().toISOString() + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + message.attachments = [{ + fileName: res.data.selected.Assunto, + source: MessageAttachmentSource.Webtrix, + fileType: MessageAttachmentFileType.Doc, + applicationId: res.data.selected.ApplicationType, + docId: parseInt(res.data.selected.Id) , + description: res.data.selected.Assunto + }] + + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + this.messages1[this.roomId].push(Ballon) + } + + this.messages1[this.roomId].push(message) + setTimeout(() => { + this.scrollToBottomClicked() + }, 100) + this.chatServiceService.sendMessage(message, this.roomType) + this.textField = '' + + } + }); + + await modal.present(); + } + + + + askIfOneShot(): Promise { + return new Promise(async (resolve, reject) => { + const alert = await this.alertController.create({ + header: 'Confirm', + message: 'Visualização unica?', + buttons: [ + { + text: 'não', + role: 'cancel', + handler: () => { + resolve(false) + console.log('User clicked No'); + // Handle No action here + } + }, + { + text: 'Sim', + handler: () => { + console.log('User clicked Yes'); + resolve(true) + // Handle Yes action here + } + } + ] + }); + + + await alert.present(); + }) + } + + async pickPicture() { + + const oneShot = await this.askIfOneShot() + + const file = await this.FilePickerService.getPicture({ + cameraResultType: CameraResultType.Base64 + }) + + if(file.isOk()) { + + var base64 = 'data:image/jpeg;base64,' + file.value.base64String + if (file.value.format == "jpeg" || file.value.format == "png" || file.value.format == "gif") { + + const compressedImage = await compressImageBase64( + base64, + 800, // maxWidth + 800, // maxHeight + 0.9 // quality + ) + + if(compressedImage.isOk()) { + + const message = new MessageViewModal(); + message.roomId = this.roomId + + message.sentAt = new Date().toISOString() + message.oneShot = oneShot + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + + message.attachments = [{ + file: file.value.base64String, + fileName: "foto", + source: MessageAttachmentSource.Device, + fileType: MessageAttachmentFileType.Image, + mimeType: 'image/'+file.value.format, + description: '' + }] + + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + this.messages1[this.roomId].push(Ballon) + } + + this.messages1[this.roomId].push(message) + setTimeout(() => { + this.scrollToBottomClicked() + }, 100) + this.chatServiceService.sendMessage(message, this.roomType) + } + } + + } + + } + + + messageDelete(message: MessageViewModal) { + // this.messageRepositoryService.sendMessageDelete() + this.chatServiceService.messageDelete({ + messageId: message.id, + roomId: this.roomId, + }) + } + + async addFileToChat(types: typeof FileType[], attachmentFileType:MessageAttachmentFileType) { + + const file = await this.FilePickerWebService.getFileFromDevice(types); + if(file.isOk()) { + + const fileExtension = await allowedDocExtension(file.value.type) + + if(fileExtension.isOk()) { + + console.log('FILE rigth?', file) + + let fileBase64 = await JSFileToDataUrl(file.value); + + if(fileBase64.isOk()) { + + const message = new MessageViewModal(); + message.roomId = this.roomId + + message.sentAt = new Date().toISOString() + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + + message.attachments = [{ + file: fileBase64.value.split(',')[1], + fileName: file.value.name, + source: MessageAttachmentSource.Device, + fileType: MessageAttachmentFileType.Doc, + mimeType: file.value.type, + description: file.value.name + }] + + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + this.messages1[this.roomId].push(Ballon) + } + + this.messages1[this.roomId].push(message) + setTimeout(() => { + this.scrollToBottomClicked() + }, 100) + this.chatServiceService.sendMessage(message, this.roomType) + } + + } else { + this.toastService._badRequest("Ficheiro inválido") + } + } + } + + + async _openChatOptions() { + const roomId = this.roomId; + + + const enterAnimation = (baseEl: any) => { + const backdropAnimation = this.animationController.create() + .addElement(baseEl.querySelector('ion-backdrop')!) + .fromTo('opacity', '0.01', 'var(--backdrop-opacity)'); + + const wrapperAnimation = this.animationController.create() + .addElement(baseEl.querySelector('.modal-wrapper')!) + .keyframes([ + { offset: 0, opacity: '1', right: '-100%' }, + { offset: 1, opacity: '1', right: '0px' } + ]); + + return this.animationController.create() + .addElement(baseEl) + .easing('ease-out') + .duration(500) + .addAnimation([backdropAnimation, wrapperAnimation]); + } + + const leaveAnimation = (baseEl: any) => { + return enterAnimation(baseEl).direction('reverse'); + } + + const modal = await this.modalController.create({ + enterAnimation, + leaveAnimation, + component: ChatOptionsFeaturesPage, + cssClass: 'model profile-modal search-submodal', + componentProps: { + roomId: this.roomId, + members: [], + } + }); + + modal.onDidDismiss().then(async (res) => { + + + + if (res['data'] == 'meeting') { + //this.closeAllDesktopComponents.emit(); + let data = { + roomId: this.roomId, + members: [] + } + this.openNewEventPage.emit(data); + } + else if (res['data'] == 'take-picture') { + + this.takePictureMobile() + + } + else if (res['data'] == 'add-picture') { + + this.pickPicture() + + } + else if (res['data'] == 'add-document') { + + this.addFile() + + } + else if (res['data'] == 'documentoGestaoDocumental') { + + this.addFileWebtrix() + + this.showLoader = false; + } + + }); + await modal.present(); + + } + + async audioPreview(msg) { + + if (!msg.attachments[0].title_link || msg.attachments[0].title_link === null || msg.attachments[0].title_link === '') { + // this.downloadFileMsg(msg) + } else { } + } + + b64toBlob(b64Data, contentType) { + contentType = contentType || ''; + var sliceSize = 512; + b64Data = b64Data.replace(/^[^,]+,/, ''); + b64Data = b64Data.replace(/\s/g, ''); + var byteCharacters = window.atob(b64Data); + var byteArrays = []; + + for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) { + var slice = byteCharacters.slice(offset, offset + sliceSize); + + var byteNumbers = new Array(slice.length); + for (var i = 0; i < slice.length; i++) { + byteNumbers[i] = slice.charCodeAt(i); + } + + var byteArray = new Uint8Array(byteNumbers); + + byteArrays.push(byteArray); + } + + var blob = new Blob(byteArrays, { type: contentType }); + return blob; + } + + downloadFileFromBrowser(fileName: string, msg: MessageViewModal): void { + + if(msg.attachments[0]?.blobURl) { + // Create a temporary URL for the Blob + const url = msg.attachments[0].safeFile; + + // Create an element with the download attribute + const a = document.createElement('a'); + a.href = url; + a.download = fileName; // Set the desired file name + + a.click(); + } else { + const link = document.createElement("a") + link.href = `data:${msg.attachments[0].mimeType}';base64,${msg.attachments[0].safeFile}`; + link.download = fileName + link.click() + + link.remove() + } + + } + + viewDocument(msg: MessageViewModal) { + this.openViewDocumentModal(msg); + } + + openFile(blob: Blob, filename, type) { + let pathFile = '' + const fileName = filename + const contentFile = blob + if (this.platform.is('ios')) { + pathFile = this.file.documentsDirectory + } else { + pathFile = this.file.externalRootDirectory + } + + this.file + .writeFile(pathFile, fileName, contentFile, { replace: true }) + .then(success => { + this.fileOpener + .open(pathFile + fileName, type) + .then(() => { }) + .catch(e => console.error(e)) + }) + .catch(e => console.error(e)) + } + + async openPreview(msg: MessageViewModal) { + + + console.log(msg) + if (msg.attachments[0].source === MessageAttachmentSource.Webtrix) { + this.viewDocument(msg) + } else { + + if (!msg.attachments[0].safeFile || msg.attachments[0].safeFile === null || msg.attachments[0].safeFile === '') { + // this.downloadFileMsg(msg) + + } else { + + var str = msg.attachments[0].safeFile + + if (this.platform.is('desktop') || this.platform.is('mobileweb')) { + + if (msg.attachments[0].mimeType.includes('image')) { + const modal = await this.modalController.create({ + component: ViewMediaPage, + cssClass: 'modal modal-desktop', + componentProps: { + image: msg.attachments[0].safeFile, + type: msg.attachments[0].mimeType, + username: msg.attachments[0].description, + _updatedAt: msg.sentAt + } + }); + modal.present(); + } else { + this.downloadFileFromBrowser(msg.attachments[0].description, msg) + } + + + } + + } + } + + } + + start(track) { + if (this.audioPlay) { + this.audioPlay.stop(); + } + this.audioPlay = new Howl({ + src: [track.changingThisBreaksApplicationSecurity], + onplay: () => { + this.isPlaying = true; + this.updateProgress() + }, + onend: () => { + this.isPlaying = false; + clearTimeout(this.audioTimer) + this.audioProgress = 0 + + }, + }) + this.audioPlay.play(); + } + + togglePlayer(pause) { + this.isPlaying = !pause; + if (pause) { + this.audioPlay.pause(); + } else { + this.audioPlay.play(); + } + } + + seek() { + let newValue = +this.range.value; + let duration = this.audioPlay.duration(); + this.audioPlay.seek(duration * (newValue / 100)); + } + + updateProgress() { + let seek = this.audioPlay.seek(); + this.audioProgress = (seek / this.audioPlay.duration()) * 100 || 0; + this.audioTimer = setTimeout(() => { + this.updateProgress() + }, 1000) + } + + + closeModal(a: any) { + + } +} + + + diff --git a/src/app/shared/chat/new-group/new-group-routing.module.ts b/src/app/ui/chat/component/new-group/new-group-routing.module.ts similarity index 74% rename from src/app/shared/chat/new-group/new-group-routing.module.ts rename to src/app/ui/chat/component/new-group/new-group-routing.module.ts index 7800e505c..0fcb08f07 100644 --- a/src/app/shared/chat/new-group/new-group-routing.module.ts +++ b/src/app/ui/chat/component/new-group/new-group-routing.module.ts @@ -7,10 +7,6 @@ const routes: Routes = [ { path: '', component: NewGroupPage - }, - { - path: 'contacts', - loadChildren: () => import('./contacts/contacts.module').then( m => m.ContactsPageModule) } ]; diff --git a/src/app/shared/chat/new-group/new-group.module.ts b/src/app/ui/chat/component/new-group/new-group.module.ts similarity index 100% rename from src/app/shared/chat/new-group/new-group.module.ts rename to src/app/ui/chat/component/new-group/new-group.module.ts diff --git a/src/app/shared/chat/new-group/new-group.page.html b/src/app/ui/chat/component/new-group/new-group.page.html similarity index 87% rename from src/app/shared/chat/new-group/new-group.page.html rename to src/app/ui/chat/component/new-group/new-group.page.html index 7535a5970..e57f90979 100644 --- a/src/app/shared/chat/new-group/new-group.page.html +++ b/src/app/ui/chat/component/new-group/new-group.page.html @@ -12,8 +12,8 @@ Novo Grupo
-
@@ -28,7 +28,7 @@
- + Grupo Ultra-secreto
diff --git a/src/app/shared/chat/new-group/new-group.page.scss b/src/app/ui/chat/component/new-group/new-group.page.scss similarity index 100% rename from src/app/shared/chat/new-group/new-group.page.scss rename to src/app/ui/chat/component/new-group/new-group.page.scss diff --git a/src/app/pages/chat/new-group/new-group.page.spec.ts b/src/app/ui/chat/component/new-group/new-group.page.spec.ts similarity index 100% rename from src/app/pages/chat/new-group/new-group.page.spec.ts rename to src/app/ui/chat/component/new-group/new-group.page.spec.ts diff --git a/src/app/shared/chat/new-group/new-group.page.ts b/src/app/ui/chat/component/new-group/new-group.page.ts similarity index 66% rename from src/app/shared/chat/new-group/new-group.page.ts rename to src/app/ui/chat/component/new-group/new-group.page.ts index ff091b870..0b89437e5 100644 --- a/src/app/shared/chat/new-group/new-group.page.ts +++ b/src/app/ui/chat/component/new-group/new-group.page.ts @@ -1,13 +1,18 @@ import { Component, EventEmitter, Input, OnInit, Output,ViewContainerRef } from '@angular/core'; -import { ModalController, PickerController, PopoverController } from '@ionic/angular'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; +import { PickerController, PopoverController } from '@ionic/angular'; +// import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; import { DataService } from 'src/app/services/data.service'; import { GroupDurationPage } from 'src/app/shared/popover/group-duration/group-duration.page'; import { SessionStore } from 'src/app/store/session.service'; -import { GroupContactsPage } from '../group-messages/group-contacts/group-contacts.page'; -import { ToastService } from 'src/app/services/toast.service'; import { ThemeService } from 'src/app/services/theme.service'; import { RouteService } from 'src/app/services/route.service'; +import { HttpErrorResponse } from '@angular/common/http'; + +import { HttpErrorHandle } from 'src/app/services/http-error-handle.service' +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service' +import { UDate } from 'src/app/utils/date'; +import { ToastService } from 'src/app/services/toast.service'; + @Component({ selector: 'app-new-group', templateUrl: './new-group.page.html', @@ -18,7 +23,7 @@ export class NewGroupPage implements OnInit{ showLoader: boolean; displayDuration: any; showDuration: boolean; - thedate:any; + expirationDate:Date = null; _day:any; selectedDuration = ['','','']; countDownTime:any; @@ -43,13 +48,14 @@ export class NewGroupPage implements OnInit{ constructor( private pickerController: PickerController, private popoverController: PopoverController, - private modalController: ModalController, private dataService:DataService, - public ChatSystemService: ChatSystemService, - private toastService: ToastService, + // public ChatSystemService: ChatSystemService, public ThemeService: ThemeService, private RouteService: RouteService, - private viewContainerRef: ViewContainerRef + private viewContainerRef: ViewContainerRef, + private httpErrorHandle: HttpErrorHandle, + private ChatServiceService: ChatServiceService, + private toastService: ToastService, ) { this.loggedUserChat = SessionStore.user.ChatData['data']; @@ -83,15 +89,15 @@ export class NewGroupPage implements OnInit{ } - _ionChange(event) { + onDateExpirationChange(event) { this.showDuration = event.detail.checked; if(event.detail.checked) { - this.thedate = new Date(); + this.expirationDate = new Date(); } else { - this.thedate = ''; + this.expirationDate = null; } } @@ -113,130 +119,80 @@ export class NewGroupPage implements OnInit{ } async createGroup() { + this.createGroup1() + } - let name = this.groupName.split(' ').join('-'); - //Take out all special characters in string - name = name.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); - - let customFields = {} - let res:any; - - - const loader = this.toastService.loading(); - - if(this.thedate) { - let customFields = { - "countDownDate":this.thedate - } - res = await this.ChatSystemService.createPrivateRoom(name, SessionStore.user.UserName, customFields); - } - else { - res = await this.ChatSystemService.createPrivateRoom(name, SessionStore.user.UserName, customFields); - } - - - loader.remove(); - - // FsId - // DocId - - if(res?.result?.rid) { - this.addGroupMessage.emit(res.result.rid); - - this.ChatSystemService.getAllRooms(() => { - if(!this.ChatSystemService.getGroupRoom(res.result.rid)) { - this.createGroupWithAttachmentsCath(res) - } else { - setTimeout(()=> { - - this.createGroupWithAttachments(res) - - }, 500) - } - }, res.result.rid); - - - - } else { - - this.toastService._badRequest('Existe um grupo com este nome!'); + async createGroup1() { + const result = await this.ChatServiceService.createRoom({ + roomName: this.groupName, + createdBy: SessionStore.user.UserId, + roomType: 0, + expirationDate: this.expirationDate?.toISOString() ? UDate.GetDateWithTimeZone(this.expirationDate) : null, + members: [] + }) + if(result.isOk()) { + await this.ChatServiceService.getRoomById(result.value.id) + this.addGroupMessage.emit(result.value.id); + } else if(result.error instanceof HttpErrorResponse) { + this.httpErrorHandle.httpStatusHandle(result.error) + } else { + this.toastService._badRequest('Por favor, contacta um administrador.'); } } createGroupWithAttachmentsCath(res: any) { - if(!this.ChatSystemService.getGroupRoom(res.result.rid)) { - setTimeout(()=>{ - this.createGroupWithAttachmentsCath(res) - }, 1500) - } else { - this.createGroupWithAttachments(res) - } + // if(!this.ChatSystemService.getGroupRoom(res.result.rid)) { + // setTimeout(() => { + // this.createGroupWithAttachmentsCath(res) + // }, 1500) + // } else { + // this.createGroupWithAttachments(res) + // } } createGroupWithAttachments(res: any) { - this.ChatSystemService.getGroupRoom(res.result.rid).hasLoadHistory = true; + // this.ChatSystemService.getGroupRoom(res.result.rid).hasLoadHistory = true; - if(this.documents) { - this.documents.forEach(element => { - this.ChatSystemService.getGroupRoom(res.result.rid).send({ - file: { - "name": element.Assunto, - "type": "application/webtrix", - "ApplicationId": element.ApplicationId, - "DocId": element.DocId, - "Assunto": element.Assunto, - }, - temporaryData: { - data: { - selected: { - Id: element.DocId, - ApplicationType: element.ApplicationId - } - } - }, - attachments: [{ - "title": element.Assunto, - "description": element.Assunto, - "title_link_download": true, - "type": "webtrix", - "text": element.Assunto, - "thumb_url": "https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png", - }], - }) - }); - } + // if(this.documents) { + // this.documents.forEach(element => { + // this.ChatSystemService.getGroupRoom(res.result.rid).send({ + // file: { + // "name": element.Assunto, + // "type": "application/webtrix", + // "ApplicationId": element.ApplicationId, + // "DocId": element.DocId, + // "Assunto": element.Assunto, + // }, + // temporaryData: { + // data: { + // selected: { + // Id: element.DocId, + // ApplicationType: element.ApplicationId + // } + // } + // }, + // attachments: [{ + // "title": element.Assunto, + // "description": element.Assunto, + // "title_link_download": true, + // "type": "webtrix", + // "text": element.Assunto, + // "thumb_url": "https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png", + // }], + // }) + // }); + // } - this.ChatSystemService.getAllRooms(); + // this.ChatSystemService.getAllRooms(); - setTimeout(() => { - this.groupName = "" - }, 150); + // setTimeout(() => { + // this.groupName = "" + // }, 150); } - async addContacts() { - this.close(); - - let name = this.groupName.split(' ').join('-'); - - - const modal = await this.modalController.create({ - component: GroupContactsPage, - componentProps: { - isCreated:this.isGroupCreated, - name: name, - duration:'', - }, - cssClass: 'contacts', - backdropDismiss: false - }); - - - modal.onDidDismiss(); - await modal.present(); - } async setDuration(ev: any) { const popover = await this.popoverController.create({ @@ -261,7 +217,7 @@ export class NewGroupPage implements OnInit{ handler:(value:any)=>{ let now = new Date(); - this.thedate = new Date(now.getFullYear(), now.getMonth(), now.getDate() + value.days.value, now.getHours() + value.hours.value, now.getMinutes() + value.minutes.value, now.getSeconds(), now.getMilliseconds()); + this.expirationDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() + value.days.value, now.getHours() + value.hours.value, now.getMinutes() + value.minutes.value, now.getSeconds(), now.getMilliseconds()) this.selectedDuration = [ value.days.value, diff --git a/src/app/shared/popover/chat-debugging/chat-debugging-routing.module.ts b/src/app/ui/chat/modal/chat-debugging/chat-debugging-routing.module.ts similarity index 100% rename from src/app/shared/popover/chat-debugging/chat-debugging-routing.module.ts rename to src/app/ui/chat/modal/chat-debugging/chat-debugging-routing.module.ts diff --git a/src/app/shared/popover/chat-debugging/chat-debugging.module.ts b/src/app/ui/chat/modal/chat-debugging/chat-debugging.module.ts similarity index 100% rename from src/app/shared/popover/chat-debugging/chat-debugging.module.ts rename to src/app/ui/chat/modal/chat-debugging/chat-debugging.module.ts diff --git a/src/app/shared/popover/chat-debugging/chat-debugging.page.html b/src/app/ui/chat/modal/chat-debugging/chat-debugging.page.html similarity index 86% rename from src/app/shared/popover/chat-debugging/chat-debugging.page.html rename to src/app/ui/chat/modal/chat-debugging/chat-debugging.page.html index 2ec64ebdc..d3c05e42c 100644 --- a/src/app/shared/popover/chat-debugging/chat-debugging.page.html +++ b/src/app/ui/chat/modal/chat-debugging/chat-debugging.page.html @@ -1,4 +1,4 @@ - + diff --git a/src/app/ui/chat/modal/chat-debugging/chat-debugging.page.scss b/src/app/ui/chat/modal/chat-debugging/chat-debugging.page.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/shared/popover/chat-debugging/chat-debugging.page.spec.ts b/src/app/ui/chat/modal/chat-debugging/chat-debugging.page.spec.ts similarity index 100% rename from src/app/shared/popover/chat-debugging/chat-debugging.page.spec.ts rename to src/app/ui/chat/modal/chat-debugging/chat-debugging.page.spec.ts diff --git a/src/app/shared/popover/chat-debugging/chat-debugging.page.ts b/src/app/ui/chat/modal/chat-debugging/chat-debugging.page.ts similarity index 68% rename from src/app/shared/popover/chat-debugging/chat-debugging.page.ts rename to src/app/ui/chat/modal/chat-debugging/chat-debugging.page.ts index 5f7f81a04..bac830151 100644 --- a/src/app/shared/popover/chat-debugging/chat-debugging.page.ts +++ b/src/app/ui/chat/modal/chat-debugging/chat-debugging.page.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; +// import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; @Component({ selector: 'app-chat-debugging', @@ -9,7 +9,7 @@ import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; export class ChatDebuggingPage implements OnInit { constructor( - public ChatSystemService: ChatSystemService + // public ChatSystemService: ChatSystemService ) { } ngOnInit() {} diff --git a/src/app/shared/popover/chat-message-debugging/chat-message-debugging-routing.module.ts b/src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging-routing.module.ts similarity index 100% rename from src/app/shared/popover/chat-message-debugging/chat-message-debugging-routing.module.ts rename to src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging-routing.module.ts diff --git a/src/app/shared/popover/chat-message-debugging/chat-message-debugging.module.ts b/src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.module.ts similarity index 100% rename from src/app/shared/popover/chat-message-debugging/chat-message-debugging.module.ts rename to src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.module.ts diff --git a/src/app/shared/popover/chat-message-debugging/chat-message-debugging.page.html b/src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.page.html similarity index 100% rename from src/app/shared/popover/chat-message-debugging/chat-message-debugging.page.html rename to src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.page.html diff --git a/src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.page.scss b/src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.page.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/shared/popover/chat-message-debugging/chat-message-debugging.page.spec.ts b/src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.page.spec.ts similarity index 100% rename from src/app/shared/popover/chat-message-debugging/chat-message-debugging.page.spec.ts rename to src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.page.spec.ts diff --git a/src/app/shared/popover/chat-message-debugging/chat-message-debugging.page.ts b/src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.page.ts similarity index 70% rename from src/app/shared/popover/chat-message-debugging/chat-message-debugging.page.ts rename to src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.page.ts index 64c46c02e..1fac0421f 100644 --- a/src/app/shared/popover/chat-message-debugging/chat-message-debugging.page.ts +++ b/src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.page.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { NavParams } from '@ionic/angular'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; +// import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; @Component({ selector: 'app-chat-message-debugging', @@ -12,18 +12,18 @@ export class ChatMessageDebuggingPage implements OnInit { roomId: string constructor( - public ChatSystemService: ChatSystemService, + // public ChatSystemService: ChatSystemService, private navParams: NavParams ) { } ngOnInit() { this.roomId = this.navParams.get('roomId') - + } loadHistory() { - this.ChatSystemService.getDmRoom(this.roomId).loadHistory({}); + // this.ChatSystemService.getDmRoom(this.roomId).loadHistory({}); } } diff --git a/src/app/shared/popover/chat-options-popover/chat-options-popover-routing.module.ts b/src/app/ui/chat/modal/chat-options-popover/chat-options-popover-routing.module.ts similarity index 100% rename from src/app/shared/popover/chat-options-popover/chat-options-popover-routing.module.ts rename to src/app/ui/chat/modal/chat-options-popover/chat-options-popover-routing.module.ts diff --git a/src/app/shared/popover/chat-options-popover/chat-options-popover.module.ts b/src/app/ui/chat/modal/chat-options-popover/chat-options-popover.module.ts similarity index 100% rename from src/app/shared/popover/chat-options-popover/chat-options-popover.module.ts rename to src/app/ui/chat/modal/chat-options-popover/chat-options-popover.module.ts diff --git a/src/app/shared/popover/chat-options-popover/chat-options-popover.page.html b/src/app/ui/chat/modal/chat-options-popover/chat-options-popover.page.html similarity index 100% rename from src/app/shared/popover/chat-options-popover/chat-options-popover.page.html rename to src/app/ui/chat/modal/chat-options-popover/chat-options-popover.page.html diff --git a/src/app/shared/popover/chat-options-popover/chat-options-popover.page.scss b/src/app/ui/chat/modal/chat-options-popover/chat-options-popover.page.scss similarity index 100% rename from src/app/shared/popover/chat-options-popover/chat-options-popover.page.scss rename to src/app/ui/chat/modal/chat-options-popover/chat-options-popover.page.scss diff --git a/src/app/shared/popover/chat-options-popover/chat-options-popover.page.spec.ts b/src/app/ui/chat/modal/chat-options-popover/chat-options-popover.page.spec.ts similarity index 100% rename from src/app/shared/popover/chat-options-popover/chat-options-popover.page.spec.ts rename to src/app/ui/chat/modal/chat-options-popover/chat-options-popover.page.spec.ts diff --git a/src/app/shared/popover/chat-options-popover/chat-options-popover.page.ts b/src/app/ui/chat/modal/chat-options-popover/chat-options-popover.page.ts similarity index 100% rename from src/app/shared/popover/chat-options-popover/chat-options-popover.page.ts rename to src/app/ui/chat/modal/chat-options-popover/chat-options-popover.page.ts diff --git a/src/app/shared/popover/chat-popover/chat-popover-routing.module.ts b/src/app/ui/chat/modal/chat-popover/chat-popover-routing.module.ts similarity index 100% rename from src/app/shared/popover/chat-popover/chat-popover-routing.module.ts rename to src/app/ui/chat/modal/chat-popover/chat-popover-routing.module.ts diff --git a/src/app/shared/popover/chat-popover/chat-popover.module.ts b/src/app/ui/chat/modal/chat-popover/chat-popover.module.ts similarity index 100% rename from src/app/shared/popover/chat-popover/chat-popover.module.ts rename to src/app/ui/chat/modal/chat-popover/chat-popover.module.ts diff --git a/src/app/ui/chat/modal/chat-popover/chat-popover.page.html b/src/app/ui/chat/modal/chat-popover/chat-popover.page.html new file mode 100644 index 000000000..7fa1d9003 --- /dev/null +++ b/src/app/ui/chat/modal/chat-popover/chat-popover.page.html @@ -0,0 +1,32 @@ + +
+ +
+
+ + + +
+ + + + + +
+ + +
+
diff --git a/src/app/shared/popover/chat-popover/chat-popover.page.scss b/src/app/ui/chat/modal/chat-popover/chat-popover.page.scss similarity index 100% rename from src/app/shared/popover/chat-popover/chat-popover.page.scss rename to src/app/ui/chat/modal/chat-popover/chat-popover.page.scss diff --git a/src/app/shared/popover/chat-popover/chat-popover.page.spec.ts b/src/app/ui/chat/modal/chat-popover/chat-popover.page.spec.ts similarity index 100% rename from src/app/shared/popover/chat-popover/chat-popover.page.spec.ts rename to src/app/ui/chat/modal/chat-popover/chat-popover.page.spec.ts diff --git a/src/app/ui/chat/modal/chat-popover/chat-popover.page.ts b/src/app/ui/chat/modal/chat-popover/chat-popover.page.ts new file mode 100644 index 000000000..db71eaa2a --- /dev/null +++ b/src/app/ui/chat/modal/chat-popover/chat-popover.page.ts @@ -0,0 +1,171 @@ +import { Component, OnInit } from '@angular/core'; +import { ModalController, NavParams, PopoverController } from '@ionic/angular'; +import { ToastService } from 'src/app/services/toast.service'; +import { ThemeService } from 'src/app/services/theme.service' +import { SetRoomOwnerPage } from 'src/app/ui/chat/modal/set-room-owner/set-room-owner.page'; +import { SessionStore } from 'src/app/store/session.service'; +import { ZodError } from 'zod'; + +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service' +import { RoomInfoPage } from '../room-info/room-info.page'; +import { RoomType } from 'src/app/core/chat/entity/group'; +import { isHttpResponse } from 'src/app/infra/http/http.service'; + +@Component({ + selector: 'app-chat-popover', + templateUrl: './chat-popover.page.html', + styleUrls: ['./chat-popover.page.scss'], +}) +export class ChatPopoverPage implements OnInit { + roomId:string; + room: any; + isAdmin = false; + isGroupCreated: boolean; + showLoader = false + EnumRoomType = RoomType + roomType!: RoomType + + constructor( + private popoverController: PopoverController, + private modalController: ModalController, + private navParams: NavParams, + private toastService: ToastService, + public ThemeService: ThemeService, + private ChatServiceService: ChatServiceService + ) { + this.roomId = this.navParams.get('roomId'); + this.isAdmin = this.navParams.get('isAdmin'); + this.roomType = this.navParams.get('roomType'); + + } + + ngOnInit() { + // this.chatService.refreshtoken(); + } + + close(action:any){ + if( window.innerWidth < 701){ + this.popoverController.dismiss(action); + } + else{ + this.modalController.dismiss(action) + } + } + + //Top menu options + //Close + + async setRoomOwner() { + let classs; + if (window.innerWidth < 701) { + classs = 'modal modal-desktop' + } else { + classs = 'centered-rounded-modal' + } + const modal = await this.modalController.create({ + component: SetRoomOwnerPage, + cssClass: classs, + backdropDismiss: true, + componentProps: { + roomId: this.roomId, + isAdmin: this.isAdmin + } + }); + await modal.present(); + modal.onDidDismiss().then((res)=>{ + if(res.data == 'success'){ + this.leaveGroup(); + //this.ChatSystemService.hidingRoom(this.roomId); + } + }); + } + + + setAdmin() { + this.setRoomOwner(); + } + + async leaveGroup() { + + //this.setRoomOwner(); + this.showLoader = true + const result = await this.ChatServiceService.leaveRoom({ + id: this.roomId, + members: [SessionStore.user.UserId] + }) + + + if(result.isOk()) { + this.close('leave'); + // this.openGroupMessage.emit(this.roomId); + } else if (isHttpResponse(result.error)) { + if(result.error.status == 404) { + this.close('leave'); + } + // this.httpErrorHandle.httpStatusHandle(result.error) + } else if (result.error instanceof ZodError) { + this.toastService._badRequest("Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.") + console.log(result.error.errors) + } else { + this.toastService._badRequest("Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.") + console.log(result.error) + } + + this.showLoader = false + } + + //Delete + async deleteGroup() { + this.showLoader = true + + const result = await this.ChatServiceService.deleteRoomById(this.roomId) + + + if(result.isOk()) { + this.close('delete'); + // this.openGroupMessage.emit(this.roomId); + } else if (isHttpResponse(result.error)) { + if(result.error.status == 404) { + this.close('close'); + } + } else if (result.error instanceof ZodError) { + this.toastService._badRequest("Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.") + console.log(result.error.errors) + } else { + this.toastService._badRequest("Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.") + console.log(result.error) + } + + this.showLoader = false + + } + + async openChangeGroupName(){ + this.close('edit'); + } + + + async addUser() { + this.close('addUser'); + } + + + async details() { + const modal = await this.modalController.create({ + component: RoomInfoPage, + cssClass: 'modal-aside', + backdropDismiss: true, + componentProps: { + roomId: this.roomId + } + }); + await modal.present(); + modal.onDidDismiss().then((res)=>{ + if(res.data == 'success') { + this.leaveGroup(); + //this.ChatSystemService.hidingRoom(this.roomId); + } + }); + } + +} diff --git a/src/app/shared/chat/edit-group/edit-group-routing.module.ts b/src/app/ui/chat/modal/edit-group/edit-group-routing.module.ts similarity index 100% rename from src/app/shared/chat/edit-group/edit-group-routing.module.ts rename to src/app/ui/chat/modal/edit-group/edit-group-routing.module.ts diff --git a/src/app/pages/chat/edit-group/edit-group.module.ts b/src/app/ui/chat/modal/edit-group/edit-group.module.ts similarity index 100% rename from src/app/pages/chat/edit-group/edit-group.module.ts rename to src/app/ui/chat/modal/edit-group/edit-group.module.ts diff --git a/src/app/pages/chat/edit-group/edit-group.page.html b/src/app/ui/chat/modal/edit-group/edit-group.page.html similarity index 100% rename from src/app/pages/chat/edit-group/edit-group.page.html rename to src/app/ui/chat/modal/edit-group/edit-group.page.html diff --git a/src/app/pages/chat/edit-group/edit-group.page.scss b/src/app/ui/chat/modal/edit-group/edit-group.page.scss similarity index 100% rename from src/app/pages/chat/edit-group/edit-group.page.scss rename to src/app/ui/chat/modal/edit-group/edit-group.page.scss diff --git a/src/app/pages/chat/edit-group/edit-group.page.spec.ts b/src/app/ui/chat/modal/edit-group/edit-group.page.spec.ts similarity index 100% rename from src/app/pages/chat/edit-group/edit-group.page.spec.ts rename to src/app/ui/chat/modal/edit-group/edit-group.page.spec.ts diff --git a/src/app/pages/chat/edit-group/edit-group.page.ts b/src/app/ui/chat/modal/edit-group/edit-group.page.ts similarity index 87% rename from src/app/pages/chat/edit-group/edit-group.page.ts rename to src/app/ui/chat/modal/edit-group/edit-group.page.ts index bd2bd94b0..5ac98c026 100644 --- a/src/app/pages/chat/edit-group/edit-group.page.ts +++ b/src/app/ui/chat/modal/edit-group/edit-group.page.ts @@ -1,7 +1,6 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; import { ModalController, NavParams, PickerController } from '@ionic/angular'; -import { ChatService } from 'src/app/services/chat.service'; import { ThemeService } from 'src/app/services/theme.service' @Component({ @@ -21,7 +20,6 @@ export class EditGroupPage implements OnInit { constructor( private modalController: ModalController, private pickerController: PickerController, - private chatService: ChatService, private navParams: NavParams, public ThemeService: ThemeService ) { @@ -34,16 +32,7 @@ export class EditGroupPage implements OnInit { } getRoomInfo(){ - this.chatService.getRoomInfo(this.roomId).subscribe(room=>{ - this.room = room['room']; - - try { - this.groupName = this.room.name.split('-').join(' '); - } catch(error) { - this.groupName = this.room.name; - } - - }); + } close(){ @@ -57,13 +46,10 @@ export class EditGroupPage implements OnInit { "roomId": this.room._id, "name": name, } - this.chatService.renameGroup(body).subscribe(res=>{ - this.modalController.dismiss(res['group']); - }); } else{ - - } + + } } _ionChange(event){ this.showDuration = event.detail.checked; @@ -72,42 +58,42 @@ export class EditGroupPage implements OnInit { const picker = await this.pickerController.create({ cssClass: '', buttons: [ - { + { text: 'Cancelar', role: 'cancel', cssClass: 'btn-cancel' }, - { - text: 'Ok', + { + text: 'Ok', cssClass: 'btn-cancel', handler:(value:any)=>{ - + this.selectedDuration = [ value.days.value, value.hours.value, value.minutes.value, ] - + if(value.days.value != null && value.hours.value != null && value.minutes.value != null){ if(value.days.value > 0){ if(value.days.value == 1){ if(value.hours.value == 1){ - this.displayDuration = value.days.value + " day " + + this.displayDuration = value.days.value + " day " + value.hours.value + " hora " + value.minutes.value + " minutos"; } else{ - this.displayDuration = value.days.value + " days " + + this.displayDuration = value.days.value + " days " + value.hours.value + " horas " + value.minutes.value + " minutos"; } } else{ if(value.hours.value == 1){ - this.displayDuration = value.days.value + " days " + + this.displayDuration = value.days.value + " days " + value.hours.value + " hora " + value.minutes.value + " minutos"; } else{ - this.displayDuration = value.days.value + " days " + + this.displayDuration = value.days.value + " days " + value.hours.value + " horas " + value.minutes.value + " minutos"; } @@ -123,7 +109,7 @@ export class EditGroupPage implements OnInit { value.minutes.value + " minutos"; } } - } + } }, }, ], @@ -176,7 +162,7 @@ export class EditGroupPage implements OnInit { await picker.present(); picker.onDidDismiss().then(async data =>{ let day = await picker.getColumn('days'); - let hour = await picker.getColumn('hours'); + let hour = await picker.getColumn('hours'); let minutes = await picker.getColumn('minutes'); }); diff --git a/src/app/ui/chat/modal/edit-message/edit-message-routing.module.ts b/src/app/ui/chat/modal/edit-message/edit-message-routing.module.ts new file mode 100644 index 000000000..8f45acece --- /dev/null +++ b/src/app/ui/chat/modal/edit-message/edit-message-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { EditMessagePage } from './edit-message.page'; + +const routes: Routes = [ + { + path: '', + component: EditMessagePage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class EditMessagePageRoutingModule {} diff --git a/src/app/ui/chat/modal/edit-message/edit-message.module.ts b/src/app/ui/chat/modal/edit-message/edit-message.module.ts new file mode 100644 index 000000000..57304095e --- /dev/null +++ b/src/app/ui/chat/modal/edit-message/edit-message.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { EditMessagePageRoutingModule } from './edit-message-routing.module'; + +import { EditMessagePage } from './edit-message.page'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + EditMessagePageRoutingModule + ], + declarations: [EditMessagePage] +}) +export class EditMessagePageModule {} diff --git a/src/app/ui/chat/modal/edit-message/edit-message.page.html b/src/app/ui/chat/modal/edit-message/edit-message.page.html new file mode 100644 index 000000000..90bb8f2e8 --- /dev/null +++ b/src/app/ui/chat/modal/edit-message/edit-message.page.html @@ -0,0 +1,49 @@ + + +
+
+
+ +
+
+ Editar Mensagem +
+
+
+
+
+ + +
+ +
+
{{ oldMessage }}
+
+ + +
+
+ +
+ +
+ +
+ + diff --git a/src/app/ui/chat/modal/edit-message/edit-message.page.scss b/src/app/ui/chat/modal/edit-message/edit-message.page.scss new file mode 100644 index 000000000..5abb22ff7 --- /dev/null +++ b/src/app/ui/chat/modal/edit-message/edit-message.page.scss @@ -0,0 +1,89 @@ +@import '~src/function.scss'; + +.header-toolbar{ + --background:transparent; + --opacity: 1; + + .main-header{ + width: 100%; /* 400px */ + height: 100%; + font-family: Roboto; + border-top-left-radius: 25px; + border-top-right-radius: 25px; + background-color: #fff; + overflow:hidden; + padding: 30px 20px 0px 20px; + color:#000; + transform: translate3d(0, 1px, 0); + + .div-icon{ + width: rem(40); + float: right; + font-size: rem(35); + overflow: auto; + padding: 1px; + } + .div-icon ion-icon{ + float: right; + padding-left: 20px; + } + .title-content{ + margin: 0px auto; + overflow: auto; + padding: 0 !important; + } + + .back-icon{ + width: 37px; + float: left; + font-size: rem(35); + overflow: auto; + + } + .div-title{ + width: calc(100% - 45px); + padding: 0!important; + float: left; + margin: 2.5px 0 0 5px; + } + .title{ + font-size: rem(25); + } + } + } + + ion-content{ + --background:transparent; + } + .main-content{ + width: 100%; + height: 100%; + font-family: Roboto; + margin: 0 auto; + background-color: #fff; + overflow:auto; + padding: 0 0 0 0; + + + } + + .type-message { + display: flex; + border: 1px solid #ebebeb; + border-radius: 25px; + align-items: center; + overflow: auto; + } + +.old-message-container { + padding: 40px; +} +.old-message { + font-size: rem(13); + font-family: Roboto; + overflow: auto; + background: var(--chat-incoming-msg-color); + border-radius: 10px; + display: inline; + padding: 10px 20px; +} diff --git a/src/app/shared/popover/deploma-options/deploma-options.page.spec.ts b/src/app/ui/chat/modal/edit-message/edit-message.page.spec.ts similarity index 59% rename from src/app/shared/popover/deploma-options/deploma-options.page.spec.ts rename to src/app/ui/chat/modal/edit-message/edit-message.page.spec.ts index 46b0d3958..3b2497001 100644 --- a/src/app/shared/popover/deploma-options/deploma-options.page.spec.ts +++ b/src/app/ui/chat/modal/edit-message/edit-message.page.spec.ts @@ -1,19 +1,19 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { IonicModule } from '@ionic/angular'; -import { DeplomaOptionsPage } from './deploma-options.page'; +import { EditMessagePage } from './edit-message.page'; -describe('DeplomaOptionsPage', () => { - let component: DeplomaOptionsPage; - let fixture: ComponentFixture; +describe('EditMessagePage', () => { + let component: EditMessagePage; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ DeplomaOptionsPage ], + declarations: [ EditMessagePage ], imports: [IonicModule.forRoot()] }).compileComponents(); - fixture = TestBed.createComponent(DeplomaOptionsPage); + fixture = TestBed.createComponent(EditMessagePage); component = fixture.componentInstance; fixture.detectChanges(); })); diff --git a/src/app/ui/chat/modal/edit-message/edit-message.page.ts b/src/app/ui/chat/modal/edit-message/edit-message.page.ts new file mode 100644 index 000000000..bf894bb8c --- /dev/null +++ b/src/app/ui/chat/modal/edit-message/edit-message.page.ts @@ -0,0 +1,41 @@ +import { Component, OnInit, Input, ViewChild, ElementRef } from '@angular/core'; +import { ModalController, PopoverController } from '@ionic/angular'; +import { ThemeService } from 'src/app/services/theme.service' + +@Component({ + selector: 'app-edit-message', + templateUrl: './edit-message.page.html', + styleUrls: ['./edit-message.page.scss'], +}) +export class EditMessagePage implements OnInit { + + @ViewChild('messageInput', { static: false }) messageInput!: ElementRef; + @Input() message: string; + @Input() roomId: any; + + oldMessage: string + + constructor( + public popoverController: PopoverController, + public ThemeService: ThemeService, + ) {} + + ngOnInit() { + this.oldMessage = this.message + } + ngAfterViewInit() { + // Focus the textarea once the view has been initialized + // this.messageInput.nativeElement.focus(); + } + + dismiss() { + this.popoverController.dismiss(); + } + + save() { + this.popoverController.dismiss({ + 'message': this.message + }); + } + +} diff --git a/src/app/ui/chat/modal/group-duration/group-duration-routing.module.ts b/src/app/ui/chat/modal/group-duration/group-duration-routing.module.ts new file mode 100644 index 000000000..fe80d4118 --- /dev/null +++ b/src/app/ui/chat/modal/group-duration/group-duration-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { GroupDurationPage } from './group-duration.page'; + +const routes: Routes = [ + { + path: '', + component: GroupDurationPage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class GroupDurationPageRoutingModule {} diff --git a/src/app/ui/chat/modal/group-duration/group-duration.module.ts b/src/app/ui/chat/modal/group-duration/group-duration.module.ts new file mode 100644 index 000000000..eb4dd1468 --- /dev/null +++ b/src/app/ui/chat/modal/group-duration/group-duration.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { GroupDurationPageRoutingModule } from './group-duration-routing.module'; + +import { GroupDurationPage } from './group-duration.page'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + GroupDurationPageRoutingModule + ], + declarations: [GroupDurationPage] +}) +export class GroupDurationPageModule {} diff --git a/src/app/ui/chat/modal/group-duration/group-duration.page.html b/src/app/ui/chat/modal/group-duration/group-duration.page.html new file mode 100644 index 000000000..768a33230 --- /dev/null +++ b/src/app/ui/chat/modal/group-duration/group-duration.page.html @@ -0,0 +1,19 @@ + +
+

Duração

+
+
+ +
+
+ + + + + + + + +
+ +
diff --git a/src/app/ui/chat/modal/group-duration/group-duration.page.scss b/src/app/ui/chat/modal/group-duration/group-duration.page.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/ui/chat/modal/group-duration/group-duration.page.spec.ts b/src/app/ui/chat/modal/group-duration/group-duration.page.spec.ts new file mode 100644 index 000000000..ba52f3ffa --- /dev/null +++ b/src/app/ui/chat/modal/group-duration/group-duration.page.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { GroupDurationPage } from './group-duration.page'; + +describe('GroupDurationPage', () => { + let component: GroupDurationPage; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ GroupDurationPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(GroupDurationPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/ui/chat/modal/group-duration/group-duration.page.ts b/src/app/ui/chat/modal/group-duration/group-duration.page.ts new file mode 100644 index 000000000..7e095ff05 --- /dev/null +++ b/src/app/ui/chat/modal/group-duration/group-duration.page.ts @@ -0,0 +1,21 @@ +import { Component, OnInit } from '@angular/core'; +import { PopoverController } from '@ionic/angular'; + +@Component({ + selector: 'app-group-duration', + templateUrl: './group-duration.page.html', + styleUrls: ['./group-duration.page.scss'], +}) +export class GroupDurationPage implements OnInit { + + constructor( + public popoverController: PopoverController, + ) { } + + ngOnInit() { + } + close(){ + this.popoverController.dismiss(); + } + +} diff --git a/src/app/shared/chat/group-messages/group-contacts/group-contacts-routing.module.ts b/src/app/ui/chat/modal/group-messages/group-contacts/group-contacts-routing.module.ts similarity index 100% rename from src/app/shared/chat/group-messages/group-contacts/group-contacts-routing.module.ts rename to src/app/ui/chat/modal/group-messages/group-contacts/group-contacts-routing.module.ts diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.module.ts b/src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.module.ts similarity index 100% rename from src/app/pages/chat/group-messages/group-contacts/group-contacts.module.ts rename to src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.module.ts diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.html b/src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.page.html similarity index 100% rename from src/app/pages/chat/group-messages/group-contacts/group-contacts.page.html rename to src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.page.html diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.scss b/src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.page.scss similarity index 100% rename from src/app/pages/chat/group-messages/group-contacts/group-contacts.page.scss rename to src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.page.scss diff --git a/src/app/shared/chat/group-messages/group-contacts/group-contacts.page.spec.ts b/src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.page.spec.ts similarity index 100% rename from src/app/shared/chat/group-messages/group-contacts/group-contacts.page.spec.ts rename to src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.page.spec.ts diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.ts b/src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.page.ts similarity index 61% rename from src/app/pages/chat/group-messages/group-contacts/group-contacts.page.ts rename to src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.page.ts index eaeb0de34..9f8082330 100644 --- a/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.ts +++ b/src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.page.ts @@ -3,11 +3,10 @@ import { Component, OnInit } from '@angular/core'; import { ModalController, NavParams } from '@ionic/angular'; import * as _ from 'lodash'; import { AuthService } from 'src/app/services/auth.service'; -import { ChatService } from 'src/app/services/chat.service'; import { GroupMessagesPage } from '../group-messages.page'; import { ThemeService } from 'src/app/services/theme.service' import { SessionStore } from 'src/app/store/session.service'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; +// import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; @Component({ selector: 'app-group-contacts', @@ -39,22 +38,18 @@ export class GroupContactsPage implements OnInit { constructor( private modalController: ModalController, - private http: HttpClient, - private chatService: ChatService, - private authService: AuthService, - private navParams: NavParams, public ThemeService: ThemeService, - public ChatSystemService: ChatSystemService, + // public ChatSystemService: ChatSystemService, ) { - this.textSearch=""; - this.dm=null; - this.room=null; - this.isGroupCreated = this.navParams.get('isCreated'); - this.groupName = this.navParams.get('name'); - this.room = this.navParams.get('room'); - this.members = this.navParams.get('members'); + // this.textSearch=""; + // this.dm=null; + // this.room=null; + // this.isGroupCreated = this.navParams.get('isCreated'); + // this.groupName = this.navParams.get('name'); + // this.room = this.navParams.get('room'); + // this.members = this.navParams.get('members'); } ngOnInit() { @@ -66,74 +61,63 @@ export class GroupContactsPage implements OnInit { } loadUsers(){ - this.options = { - headers: this.headers, - }; - this.chatService.getAllUsers().subscribe((res:any)=>{ - if(this.members) { - this.contacts = res.users.filter(f => !this.members.some(item => item._id === f._id)); - } - else{ - this.contacts = res.users.filter(data => data.username != this.sessionStore.user.UserName); - } - this.users = this.contacts.sort((a,b) => { - if(a.name < b.name){ - return -1; - } - if(a.name > b.name){ - return 1; - } - return 0; - }); + // this.options = { + // headers: this.headers, + // }; + // this.chatService.getAllUsers().subscribe((res:any)=>{ + // if(this.members) { + // this.contacts = res.users.filter(f => !this.members.some(item => item._id === f._id)); + // } + // else{ + // this.contacts = res.users.filter(data => data.username != this.sessionStore.user.UserName); + // } + // this.users = this.contacts.sort((a,b) => { + // if(a.name < b.name){ + // return -1; + // } + // if(a.name > b.name){ + // return 1; + // } + // return 0; + // }); - for( const user of this.users) { + // for( const user of this.users) { - const foundUser = this.objectUserSingleStone.find( e => e.name == user.name) + // const foundUser = this.objectUserSingleStone.find( e => e.name == user.name) - if(!foundUser) { - this.objectUserSingleStone.push(user) - } else { - 'not found' - } + // if(!foundUser) { + // this.objectUserSingleStone.push(user) + // } else { + // 'not found' + // } - } + // } - const userContainer = {} - for(const user of this.objectUserSingleStone) { - const firstLetter = user.name.charAt(0) + // const userContainer = {} + // for(const user of this.objectUserSingleStone) { + // const firstLetter = user.name.charAt(0) - if(!userContainer[firstLetter]) { - userContainer[firstLetter] = [user] - } else { - userContainer[firstLetter].push(user) - } + // if(!userContainer[firstLetter]) { + // userContainer[firstLetter] = [user] + // } else { + // userContainer[firstLetter].push(user) + // } - } + // } - this.userContainer = userContainer + // this.userContainer = userContainer - this.showLoader = false; - }); + // this.showLoader = false; + // }); } getMembers(){ - if(this.room.t == "p"){ - this.chatService.getGroupMembers(this.room._id).subscribe(res=>{ - this.members = res['members']; - this.loadUsers(); - }); - } - else if(this.room.t == "c"){ - this.chatService.getChannelMembers(this.room._id).subscribe(res=>{ - this.members = res['members']; - this.loadUsers(); - }); - } + } separateLetter(record, recordIndex, records){ @@ -157,16 +141,10 @@ export class GroupContactsPage implements OnInit { } if(this.room.t == "p"){ - this.chatService.removeGroupMember(body).subscribe(res=>{ - this.getMembers(); - }); } else if(this.room.t == "c"){ - this.chatService.removeChannelMember(body).subscribe(res=>{ - this.getMembers(); - }); } } @@ -262,9 +240,7 @@ export class GroupContactsPage implements OnInit { "userId":user._id, } - this.chatService.addUserToGroup(body).subscribe(res=>{ - }); }); } @@ -277,14 +253,7 @@ export class GroupContactsPage implements OnInit { this.loading = true console.log('this.room', this.room) - this.chatService.getRoomInfo(this.room._id).subscribe(room=>{ - this.room = room['room']; - this.addContacts(this.room); - this.openGroupMessages(room['room']._id); - this.loading = false - }, ()=> { - this.loading = false - }); + } async openGroupMessages(roomId:any){ diff --git a/src/app/shared/chat/group-messages/group-messages-routing.module.ts b/src/app/ui/chat/modal/group-messages/group-messages-routing.module.ts similarity index 100% rename from src/app/shared/chat/group-messages/group-messages-routing.module.ts rename to src/app/ui/chat/modal/group-messages/group-messages-routing.module.ts diff --git a/src/app/pages/chat/group-messages/group-messages.module.ts b/src/app/ui/chat/modal/group-messages/group-messages.module.ts similarity index 91% rename from src/app/pages/chat/group-messages/group-messages.module.ts rename to src/app/ui/chat/modal/group-messages/group-messages.module.ts index e101f8bb2..727bdf276 100644 --- a/src/app/pages/chat/group-messages/group-messages.module.ts +++ b/src/app/ui/chat/modal/group-messages/group-messages.module.ts @@ -9,12 +9,12 @@ import { GroupMessagesPageRoutingModule } from './group-messages-routing.module' import { GroupMessagesPage } from './group-messages.page'; -import { ChatPopoverPageModule } from 'src/app/shared/popover/chat-popover/chat-popover.module'; import { BtnModalDismissPageModule } from 'src/app/shared/btn-modal-dismiss/btn-modal-dismiss.module'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; import { LettersAvatarModule } from "ngx-letters-avatar"; import { PipesModule } from 'src/app/pipes/pipes.module'; +import { ChatPopoverPageModule } from '../chat-popover/chat-popover.module'; @NgModule({ imports: [ diff --git a/src/app/ui/chat/modal/group-messages/group-messages.page.html b/src/app/ui/chat/modal/group-messages/group-messages.page.html new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/pages/chat/group-messages/group-messages.page.scss b/src/app/ui/chat/modal/group-messages/group-messages.page.scss similarity index 100% rename from src/app/pages/chat/group-messages/group-messages.page.scss rename to src/app/ui/chat/modal/group-messages/group-messages.page.scss diff --git a/src/app/shared/chat/group-messages/group-messages.page.spec.ts b/src/app/ui/chat/modal/group-messages/group-messages.page.spec.ts similarity index 100% rename from src/app/shared/chat/group-messages/group-messages.page.spec.ts rename to src/app/ui/chat/modal/group-messages/group-messages.page.spec.ts diff --git a/src/app/pages/chat/group-messages/group-messages.page.ts b/src/app/ui/chat/modal/group-messages/group-messages.page.ts similarity index 78% rename from src/app/pages/chat/group-messages/group-messages.page.ts rename to src/app/ui/chat/modal/group-messages/group-messages.page.ts index d71e5ff79..9501c8c7d 100644 --- a/src/app/pages/chat/group-messages/group-messages.page.ts +++ b/src/app/ui/chat/modal/group-messages/group-messages.page.ts @@ -1,9 +1,6 @@ import { Component, ElementRef, OnInit, ViewChild, AfterViewInit, OnDestroy, ChangeDetectorRef, } from '@angular/core'; import { ModalController, NavParams, PopoverController, Platform } from '@ionic/angular'; import { AlertService } from 'src/app/services/alert.service'; -import { ChatService } from 'src/app/services/chat.service'; -import { ChatOptionsPopoverPage } from 'src/app/shared/popover/chat-options-popover/chat-options-popover.page'; -import { ChatPopoverPage } from 'src/app/shared/popover/chat-popover/chat-popover.page'; import { GroupContactsPage } from './group-contacts/group-contacts.page'; import { Router } from '@angular/router' import { EditGroupPage } from '../edit-group/edit-group.page'; @@ -11,12 +8,11 @@ import { TimeService } from 'src/app/services/functions/time.service'; import { FileService } from 'src/app/services/functions/file.service'; import { ToastService } from 'src/app/services/toast.service'; import { environment } from 'src/environments/environment'; -import { NewEventPage } from '../../agenda/new-event/new-event.page'; import { EventPerson } from 'src/app/models/eventperson.model'; import { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page'; import { ThemeService } from 'src/app/services/theme.service' // import { ViewEventPage } from 'src/app/modals/view-event/view-event.page'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; +import { ViewEventPage } from 'src/app/modals/view-event/view-event.page'; import { FileType } from 'src/app/models/fileType'; import { Storage } from '@ionic/storage'; @@ -25,7 +21,7 @@ import { SearchPage } from 'src/app/pages/search/search.page'; import { VoiceRecorder, RecordingData, GenericResponse } from 'capacitor-voice-recorder'; import { Filesystem, Directory } from '@capacitor/filesystem'; import { DomSanitizer } from '@angular/platform-browser'; -import { MessageService } from 'src/app/services/chat/message.service'; +// import { MessageService } from 'src/app/services/chat/message.service'; import { File } from '@awesome-cordova-plugins/file/ngx'; import { FileOpener } from '@awesome-cordova-plugins/file-opener/ngx'; import { SessionStore } from 'src/app/store/session.service'; @@ -35,7 +31,9 @@ import { RouteService } from 'src/app/services/route.service'; import { FileValidatorService } from "src/app/services/file/file-validator.service" import { sanitize } from "sanitize-filename-ts"; import { FilePicker } from '@capawesome/capacitor-file-picker'; -import { ViewDocumentSecondOptionsPage } from 'src/app/modals/view-document-second-options/view-document-second-options.page'; +import { NewEventPage } from 'src/app/pages/agenda/new-event/new-event.page'; +import { ChatPopoverPage } from '../chat-popover/chat-popover.page'; +import { ChatOptionsPopoverPage } from '../chat-options-popover/chat-options-popover.page'; @Component({ selector: 'app-group-messages', @@ -91,79 +89,74 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { constructor( private modalController: ModalController, public popoverController: PopoverController, - private chatService: ChatService, - private navParams: NavParams, - private alertService: AlertService, - private route: Router, private timeService: TimeService, private fileService: FileService, private toastService: ToastService, public ThemeService: ThemeService, private changeDetectorRef: ChangeDetectorRef, private platform: Platform, - public ChatSystemService: ChatSystemService, + //public ChatSystemService: ChatSystemService, private storage: Storage, - private CameraService: CameraService, private sanitiser: DomSanitizer, private file: File, private fileOpener: FileOpener, public RouteService: RouteService, private FileValidatorService: FileValidatorService, ) { - this.ChatSystemService.getUser() + // this.ChatSystemService.getUser() - this.loggedUserChat = SessionStore.user.ChatData['data']; - this.isGroupCreated = true; - this.roomId = this.navParams.get('roomId'); - window.onresize = (event) => { - if (window.innerWidth > 701) { - this.modalController.dismiss(); - } - }; + // this.loggedUserChat = SessionStore.user.ChatData['data']; + // this.isGroupCreated = true; + // this.roomId = this.navParams.get('roomId'); + // window.onresize = (event) => { + // if (window.innerWidth > 701) { + // this.modalController.dismiss(); + // } + // }; - this.open(); + // this.open(); - setTimeout(() => { - this.scrollToBottomClicked() - }, 50) + // setTimeout(() => { + // this.scrollToBottomClicked() + // }, 50) - this.showAvatar = false + // this.showAvatar = false - setTimeout(() => { - this.scrollToBottomClicked() - this.showAvatar = true - }, 150) + // setTimeout(() => { + // this.scrollToBottomClicked() + // this.showAvatar = true + // }, 150) } open() { - try { - this.ChatSystemService.getGroupRoom(this.roomId).loadHistory({}); - this.ChatSystemService.getGroupRoom(this.roomId).scrollDown = this.scrollToBottomClicked; - this.ChatSystemService.openRoom(this.roomId) - this.groupNameFormart = this.ChatSystemService.getGroupRoom(this.roomId).name.split('-').join(' ') - } catch (error) { - setTimeout(() => { - this.open() - }, 3000) - } + // try { + // this.ChatSystemService.getGroupRoom(this.roomId).loadHistory({}); + // this.ChatSystemService.getGroupRoom(this.roomId).scrollDown = this.scrollToBottomClicked; + // this.ChatSystemService.openRoom(this.roomId) + // this.groupNameFormart = this.ChatSystemService.getGroupRoom(this.roomId).name.split('-').join(' ') + // } catch (error) { + // setTimeout(() => { + // this.open() + // }, 3000) + // } } ngOnInit() { - this.loggedUser = this.loggedUserChat; - this.getRoomInfo(); - this.scrollToBottom(); - this.serverLongPull(); - this.setStatus('online'); - this.getChatMembers(); + // this.loggedUser = this.loggedUserChat; + // this.getRoomInfo(); + // this.scrollToBottom(); + // this.serverLongPull(); + // this.setStatus('online'); + // this.getChatMembers(); - // this.getRoomMessageDB(this.roomId); - this.getGroupContacts({}); + // // this.getRoomMessageDB(this.roomId); + // this.getGroupContacts({}); } @@ -178,8 +171,8 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { } deleteMessage(msgId: string) { - const room = this.ChatSystemService.getGroupRoom(this.roomId) - this.alertService.confirmDeleteMessage(msgId, room); + // const room = this.ChatSystemService.getGroupRoom(this.roomId) + // this.alertService.confirmDeleteMessage(msgId, room); } ngAfterViewInit() { @@ -371,35 +364,35 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { // this.getGroupContacts(this.room); // this.showLoader = false; // }); - this.ChatSystemService.getGroupRoom(this.roomId).loadHistory({}); - let room = await this.chatService.getRoomInfo(this.roomId).toPromise(); - // console.log('ROOM',room) - this.room = room['room']; - if (this.room.name) { - try { - this.roomName = this.room.name.split('-').join(' '); - } catch (error) { - this.roomName = this.room.name; - } + // this.ChatSystemService.getGroupRoom(this.roomId).loadHistory({}); + // let room = await this.chatService.getRoomInfo(this.roomId).toPromise(); + // // console.log('ROOM',room) + // this.room = room['room']; + // if (this.room.name) { + // try { + // this.roomName = this.room.name.split('-').join(' '); + // } catch (error) { + // this.roomName = this.room.name; + // } - } + // } - if (SessionStore.user.ChatData.data.userId == this.room.u._id) { - this.isAdmin = true - } else { - this.isAdmin = false - } + // if (SessionStore.user.ChatData.data.userId == this.room.u._id) { + // this.isAdmin = true + // } else { + // this.isAdmin = false + // } - if (this.room.customFields.countDownDate) { - this.roomCountDownDate = this.room.customFields.countDownDate; - } + // if (this.room.customFields.countDownDate) { + // this.roomCountDownDate = this.room.customFields.countDownDate; + // } } async getChatMembers() { - if(this.ChatSystemService.users.length == 0) { - this.ChatSystemService.getUser() - } + // if(this.ChatSystemService.users.length == 0) { + // this.ChatSystemService.getUser() + // } } /* load(){ @@ -436,7 +429,7 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { // }); // } - this.members = this.ChatSystemService.getGroupRoom(this.roomId).members + // this.members = this.ChatSystemService.getGroupRoom(this.roomId).members } @@ -456,7 +449,7 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { } sendMessage() { - this.ChatSystemService.getGroupRoom(this.roomId).send({}) + // this.ChatSystemService.getGroupRoom(this.roomId).send({}) } @@ -481,22 +474,22 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { const formData = new FormData(); formData.append("blobFile", blob); - this.ChatSystemService.getGroupRoom(roomId).send({ - file: { - "type": "application/audio", - "msDuration": audioFile.value.msDuration, - "mimeType": audioFile.value.mimeType, - }, - attachments: [{ - "title": sanitize(fileName), - "title_link_download": true, - "type": "audio" - }], - temporaryData: formData, - attachmentsModelData: { - fileBase64: encodedData, - } - }) + // this.ChatSystemService.getGroupRoom(roomId).send({ + // file: { + // "type": "application/audio", + // "msDuration": audioFile.value.msDuration, + // "mimeType": audioFile.value.mimeType, + // }, + // attachments: [{ + // "title": sanitize(fileName), + // "title_link_download": true, + // "type": "audio" + // }], + // temporaryData: formData, + // attachmentsModelData: { + // fileBase64: encodedData, + // } + // }) }); this.deleteRecording(); @@ -520,7 +513,7 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { modal.onDidDismiss().then(res => { if (res.data == 'leave') { this.close() - this.ChatSystemService.deleteRoom(this.roomId) + // this.ChatSystemService.deleteRoom(this.roomId) //this.ChatSystemService.subscribeToRoomUpdate(this.roomId, this.room); } else if (res.data == 'cancel') { @@ -533,7 +526,7 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { this.addContacts(); } else if (res.data == 'delete') { this.close() - this.ChatSystemService.deleteRoom(this.roomId) + // this.ChatSystemService.deleteRoom(this.roomId) } }); } @@ -662,21 +655,21 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { const formData = new FormData(); formData.append("blobFile", blob); - this.ChatSystemService.getGroupRoom(roomId).send({ - file: { - "type": "application/img", - "guid": '' - }, - attachments: [{ - "title": "file.jpg", - "text": "description", - "title_link_download": false, - }], - temporaryData: formData, - attachmentsModelData: { - fileBase64: imageBase64, - } - }) + // this.ChatSystemService.getGroupRoom(roomId).send({ + // file: { + // "type": "application/img", + // "guid": '' + // }, + // attachments: [{ + // "title": "file.jpg", + // "text": "description", + // "title_link_download": false, + // }], + // temporaryData: formData, + // attachmentsModelData: { + // fileBase64: imageBase64, + // } + // }) } @@ -727,21 +720,21 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { const formData = new FormData(); formData.append("blobFile", blob); - this.ChatSystemService.getGroupRoom(roomId).send({ - file: { - "type": "application/img", - "guid": '' - }, - temporaryData: formData, - attachments: [{ - "title": file.path, - "text": "description", - "title_link_download": false, - }], - attachmentsModelData: { - fileBase64: imageBase64, - } - }) + // this.ChatSystemService.getGroupRoom(roomId).send({ + // file: { + // "type": "application/img", + // "guid": '' + // }, + // temporaryData: formData, + // attachments: [{ + // "title": file.path, + // "text": "description", + // "title_link_download": false, + // }], + // attachmentsModelData: { + // fileBase64: imageBase64, + // } + // }) } @@ -761,28 +754,28 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { if (data.selected) { - this.ChatSystemService.getGroupRoom(this.roomId).send({ - file: { - "name": res.data.selected.Assunto, - "type": "application/webtrix", - "ApplicationId": res.data.selected.ApplicationType, - "DocId": res.data.selected.Id, - "Assunto": res.data.selected.Assunto, - }, - temporaryData: res, - attachments: [{ - "title": res.data.selected.Assunto, - "description": res.data.selected.DocTypeDesc, - // "title_link": url_no_options, - "title_link_download": true, - //"thumb_url": "assets/images/webtrix-logo.png", - // "message_link": url_no_options, - "type": "webtrix", - //"thumb_url": "assets/images/webtrix-logo.png", - "text": res.data.selected.DocTypeDesc, - "thumb_url": "https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png", - }] - }) + // this.ChatSystemService.getGroupRoom(this.roomId).send({ + // file: { + // "name": res.data.selected.Assunto, + // "type": "application/webtrix", + // "ApplicationId": res.data.selected.ApplicationType, + // "DocId": res.data.selected.Id, + // "Assunto": res.data.selected.Assunto, + // }, + // temporaryData: res, + // attachments: [{ + // "title": res.data.selected.Assunto, + // "description": res.data.selected.DocTypeDesc, + // // "title_link": url_no_options, + // "title_link_download": true, + // //"thumb_url": "assets/images/webtrix-logo.png", + // // "message_link": url_no_options, + // "type": "webtrix", + // //"thumb_url": "assets/images/webtrix-logo.png", + // "text": res.data.selected.DocTypeDesc, + // "thumb_url": "https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png", + // }] + // }) } }); @@ -825,22 +818,22 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { formDataa.append('blobFile', blobb); /* console.log('add file', fileBase64) */ - this.ChatSystemService.getGroupRoom(roomId).send({ - file: { - "type": resultt.files[0].mimeType, - "guid": '', - }, - attachments: [{ - "title": sanitize(resultt.files[0].name), - "name": sanitize(resultt.files[0].name), - // "text": "description", - "title_link_download": false, - }], - temporaryData: formDataa, - attachmentsModelData: { - fileBase64: '', - } - }) + // this.ChatSystemService.getGroupRoom(roomId).send({ + // file: { + // "type": resultt.files[0].mimeType, + // "guid": '', + // }, + // attachments: [{ + // "title": sanitize(resultt.files[0].name), + // "name": sanitize(resultt.files[0].name), + // // "text": "description", + // "title_link_download": false, + // }], + // temporaryData: formDataa, + // attachmentsModelData: { + // fileBase64: '', + // } + // }) return } @@ -865,22 +858,22 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { formData.append('blobFile', blob); - this.ChatSystemService.getGroupRoom(roomId).send({ - file: { - "type": file.type, - "guid": '', - }, - attachments: [{ - "title": sanitize(fileName), - "name": sanitize(fileName), - // "text": "description", - "title_link_download": false, - }], - temporaryData: formData, - attachmentsModelData: { - fileBase64: encodedData - } - }); + // this.ChatSystemService.getGroupRoom(roomId).send({ + // file: { + // "type": file.type, + // "guid": '', + // }, + // attachments: [{ + // "title": sanitize(fileName), + // "name": sanitize(fileName), + // // "text": "description", + // "title_link_download": false, + // }], + // temporaryData: formData, + // attachmentsModelData: { + // fileBase64: encodedData + // } + // }); } else { @@ -957,7 +950,8 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { componentProps: { isCreated: this.isGroupCreated, room: this.room, - members: this.ChatSystemService.getGroupRoom(this.roomId).members, + //members: this.ChatSystemService.getGroupRoom(this.roomId).members, + members: [], name: this.room.name, }, cssClass: 'contacts', @@ -1030,43 +1024,7 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { } async serverLongPull() { - this.chatService.getPrivateGroupMessages(this.roomId).subscribe(async res => { - if (res == 502) { - // Connection timeout - // happens when the connection was pending for too long - // let's reconnect - await this.serverLongPull(); - } else if (res != 200) { - // Show Error - //showMessage(response.statusText); - //this.loadMessages() - let msgOnly = res['messages'].filter(data => data.t != 'au'); - //this.messages = msgOnly.reverse(); - // - this.transformDataMSG(msgOnly.reverse()); - // this.getRoomMessageDB(this.roomId); - // Reconnect in one second - if (this.route.url != "/home/chat") { - - } else { - //Check if modal is opened - if (document.querySelector('.isGroupChatOpened')) { - await new Promise(resolve => setTimeout(resolve, 5000)).catch((error) => { - console.error(error); - }); - await this.serverLongPull(); - - } - } - - } else { - // Got message - //let message = await response.text(); - //this.loadMessages() - await this.serverLongPull(); - } - }); } sliderOpts = { @@ -1162,7 +1120,7 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { }); } - downloadFileMsg(msg: MessageService) { + downloadFileMsg(msg: any) { msg.downloadFileMsg() } @@ -1174,7 +1132,7 @@ export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy { downloadLink.click(); } - async openPreview(msg: MessageService) { + async openPreview(msg: any) { if (msg?.file?.type === "application/webtrix") { this.viewDocument(msg.file, msg.attachments.image_url) diff --git a/src/app/shared/popover/messages-options/messages-options-routing.module.ts b/src/app/ui/chat/modal/messages-options/messages-options-routing.module.ts similarity index 100% rename from src/app/shared/popover/messages-options/messages-options-routing.module.ts rename to src/app/ui/chat/modal/messages-options/messages-options-routing.module.ts diff --git a/src/app/shared/popover/messages-options/messages-options.module.ts b/src/app/ui/chat/modal/messages-options/messages-options.module.ts similarity index 100% rename from src/app/shared/popover/messages-options/messages-options.module.ts rename to src/app/ui/chat/modal/messages-options/messages-options.module.ts diff --git a/src/app/shared/popover/messages-options/messages-options.page.html b/src/app/ui/chat/modal/messages-options/messages-options.page.html similarity index 100% rename from src/app/shared/popover/messages-options/messages-options.page.html rename to src/app/ui/chat/modal/messages-options/messages-options.page.html diff --git a/src/app/shared/popover/messages-options/messages-options.page.scss b/src/app/ui/chat/modal/messages-options/messages-options.page.scss similarity index 100% rename from src/app/shared/popover/messages-options/messages-options.page.scss rename to src/app/ui/chat/modal/messages-options/messages-options.page.scss diff --git a/src/app/shared/popover/messages-options/messages-options.page.spec.ts b/src/app/ui/chat/modal/messages-options/messages-options.page.spec.ts similarity index 100% rename from src/app/shared/popover/messages-options/messages-options.page.spec.ts rename to src/app/ui/chat/modal/messages-options/messages-options.page.spec.ts diff --git a/src/app/shared/popover/messages-options/messages-options.page.ts b/src/app/ui/chat/modal/messages-options/messages-options.page.ts similarity index 85% rename from src/app/shared/popover/messages-options/messages-options.page.ts rename to src/app/ui/chat/modal/messages-options/messages-options.page.ts index bcd0b7861..e51dc99a3 100644 --- a/src/app/shared/popover/messages-options/messages-options.page.ts +++ b/src/app/ui/chat/modal/messages-options/messages-options.page.ts @@ -1,6 +1,5 @@ import { Component, OnInit } from '@angular/core'; import { ModalController, NavParams, PopoverController } from '@ionic/angular'; -import { ChatService } from 'src/app/services/chat.service'; import { ThemeService } from 'src/app/services/theme.service'; @Component({ @@ -15,7 +14,6 @@ export class MessagesOptionsPage implements OnInit { constructor( private popoverController: PopoverController, private modalController: ModalController, - private chatService: ChatService, private navParams: NavParams, public ThemeService: ThemeService, ) @@ -40,9 +38,6 @@ export class MessagesOptionsPage implements OnInit { closeChatRoom(){ let body = { "roomId": this.roomId } - this.chatService.removeChatRoom(body).subscribe(res=>{ - - }); this.close(); } diff --git a/src/app/shared/chat/messages/contacts/contacts-routing.module.ts b/src/app/ui/chat/modal/messages/contacts/contacts-routing.module.ts similarity index 100% rename from src/app/shared/chat/messages/contacts/contacts-routing.module.ts rename to src/app/ui/chat/modal/messages/contacts/contacts-routing.module.ts diff --git a/src/app/pages/chat/messages/contacts/contacts.module.ts b/src/app/ui/chat/modal/messages/contacts/contacts.module.ts similarity index 100% rename from src/app/pages/chat/messages/contacts/contacts.module.ts rename to src/app/ui/chat/modal/messages/contacts/contacts.module.ts diff --git a/src/app/pages/chat/messages/contacts/contacts.page.html b/src/app/ui/chat/modal/messages/contacts/contacts.page.html similarity index 67% rename from src/app/pages/chat/messages/contacts/contacts.page.html rename to src/app/ui/chat/modal/messages/contacts/contacts.page.html index 9f6f6a645..3a5a6ab14 100644 --- a/src/app/pages/chat/messages/contacts/contacts.page.html +++ b/src/app/ui/chat/modal/messages/contacts/contacts.page.html @@ -11,7 +11,7 @@
- Nova Conversa + Nova Conversa ..
@@ -24,29 +24,25 @@ - + - +
- - -
- {{header}} +
+ +
+ {{ userContainer.key }}
-
-

{{user.name}}

- - - - +
+ {{user.wxFullName}} +
- - +
diff --git a/src/app/pages/chat/messages/contacts/contacts.page.scss b/src/app/ui/chat/modal/messages/contacts/contacts.page.scss similarity index 100% rename from src/app/pages/chat/messages/contacts/contacts.page.scss rename to src/app/ui/chat/modal/messages/contacts/contacts.page.scss diff --git a/src/app/shared/chat/messages/contacts/contacts.page.spec.ts b/src/app/ui/chat/modal/messages/contacts/contacts.page.spec.ts similarity index 100% rename from src/app/shared/chat/messages/contacts/contacts.page.spec.ts rename to src/app/ui/chat/modal/messages/contacts/contacts.page.spec.ts diff --git a/src/app/ui/chat/modal/messages/contacts/contacts.page.ts b/src/app/ui/chat/modal/messages/contacts/contacts.page.ts new file mode 100644 index 000000000..fdcc0ccbf --- /dev/null +++ b/src/app/ui/chat/modal/messages/contacts/contacts.page.ts @@ -0,0 +1,184 @@ +import { Component, OnInit } from '@angular/core'; +import { ModalController } from '@ionic/angular'; +import { ThemeService } from 'src/app/services/theme.service' +import { SessionStore } from 'src/app/store/session.service'; +import { ContactRepositoryService } from 'src/app/services/Repositorys/contacts/repository/contacts-repository.service'; +import { UserContacts } from 'src/app/services/Repositorys/contacts/data-source/contacts-data-source.service'; +import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; +import { ToastService } from 'src/app/services/toast.service'; +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service' +import { MessageEntity } from 'src/app/core/chat/entity/message'; +import { RoomType } from "src/app/core/chat/entity/group"; + +@Component({ + selector: 'app-contacts', + templateUrl: './contacts.page.html', + styleUrls: ['./contacts.page.scss'], +}) +export class ContactsPage implements OnInit { + loading: boolean; + loggedUser: any; + users = []; + + contacts:any; + textSearch:string; + room:any; + dm:any; + sessionStore = SessionStore + userList: UserContacts[] = [] + + currentMembers:UserContacts[]; + allChatUsers: UserContacts[] = []; + userContainer: {[key: string]: ( UserContacts & {isChecked: boolean})[] } = {} + + selectedUsers: number[] =[] + SessionStore = SessionStore + + constructor( + private modalController: ModalController, + public ThemeService: ThemeService, + private contactsRepositoryService: ContactRepositoryService, + private httpErrorHandle: HttpErrorHandle, + private toastService: ToastService, + private chatServiceService: ChatServiceService + ) + { + this.loggedUser = SessionStore.user.ChatData['data']; + + this.textSearch=""; + this.dm=null; + this.room=null; + } + + ngOnInit(): void { + this.loadUsers() + } + + get hasMemberToUpload() { + return this.selectedUsers.length >= 1 + } + + async updateGroup() { + + } + + openGroupMessagesPage() { + // this.openGroupMessage.emit(this.roomId) + } + + async loadUsers() { + + this.loading = true + const getallChatUsers = await this.contactsRepositoryService.getUsers() + + + if(getallChatUsers.isOk()) { + + this.allChatUsers = getallChatUsers.value.data.result.sort((a,b) => { + if(a.wxFullName < b.wxFullName) { + return -1; + } + if(a.wxFullName > b.wxFullName) { + return 1; + } + return 0; + }); + + + for(const user of this.allChatUsers) { + const firstLetter = user.wxFullName.charAt(0) + + if(!this.userContainer[firstLetter]) { + user['isChecked'] = false + this.userContainer[firstLetter] = [user as any] + } else { + const userIds = this.userContainer[firstLetter].map( e => e.wxUserId) + if(!userIds.includes(user.wxUserId)) { + user['isChecked'] = false + this.userContainer[firstLetter].push(user as any) + } + } + } + + + } + else if (getallChatUsers.isErr() ) { + console.log(getallChatUsers.error) + } else { + this.toastService._badRequest("Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.") + } + + + this.loading = false; + } + + doRefresh(ev) { + ev.target.complete(); + } + + FilterUserListedByTextSearch() { + return this.allChatUsers.filter( e => e.wxFullName.toLowerCase().includes(this.textSearch.toLowerCase())).sort((a,b) => { + if(a.wxFullName < b.wxFullName) { + return -1; + } + if(a.wxFullName > b.wxFullName) { + return 1; + } + return 0; + }); + } + + + onChangeCheckBox(user: UserContacts & {isChecked: boolean}) { + if(user.isChecked) { + this.selectedUsers.push(user.wxUserId) + } else { + this.selectedUsers = this.selectedUsers.filter(e => e!= user.wxUserId) + } + } + + onChange(event) { + this.textSearch = event.detail.value; + + const filteredUserList: (UserContacts & {isChecked: boolean})[] = this.FilterUserListedByTextSearch() as any + + const userContainer = {} + for(const user of filteredUserList) { + const firstLetter = user.wxFullName.charAt(0) + + if(!userContainer[firstLetter]) { + user.isChecked = this.selectedUsers.includes(user.wxUserId) + userContainer[firstLetter] = [user] + } else { + user.isChecked = this.selectedUsers.includes(user.wxUserId) + userContainer[firstLetter].push(user) + } + + } + this.userContainer = userContainer + } + + + close() { + this.modalController.dismiss({}); + } + + select(user: UserContacts) { + + const message = new MessageEntity(); + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + + message.receiverId = user.wxUserId + + message.message = 'hello' + + this.chatServiceService.sendMessage(message, RoomType.Group) + + } +} diff --git a/src/app/shared/chat/messages/messages-routing.module.ts b/src/app/ui/chat/modal/messages/messages-routing.module.ts similarity index 100% rename from src/app/shared/chat/messages/messages-routing.module.ts rename to src/app/ui/chat/modal/messages/messages-routing.module.ts diff --git a/src/app/pages/chat/messages/messages.module.ts b/src/app/ui/chat/modal/messages/messages.module.ts similarity index 100% rename from src/app/pages/chat/messages/messages.module.ts rename to src/app/ui/chat/modal/messages/messages.module.ts diff --git a/src/app/ui/chat/modal/messages/messages.page.html b/src/app/ui/chat/modal/messages/messages.page.html new file mode 100644 index 000000000..80150f7d8 --- /dev/null +++ b/src/app/ui/chat/modal/messages/messages.page.html @@ -0,0 +1,271 @@ + + +
+
+
+ +
+
+
+ {{ roomData.roomName }} + +
+
+ + +
+ + +
+
+ +
+
+
+
+ + +
+ + + + {{ user.wxFullName }}, + + +
+ +
+
+
+ + + +
+ +
+ + +
+ + {{ emoji }} + +
+ +
+
+
+
+ {{ message.message }} +
+ +
+
+ + + + + +
+ +
+ + + + +
+ Mandou uma mensagen com visualização única +
+ +
+ +
+ Abrir a visualização única +
+
+ +
+ +
+ +
+ +
+ + + + + + + + + + + {{ attachment?.fileName || attachment?.description }} +
+
+ +
+ +
+
+ + + + + + +
+ +
+ +
+
+ +
+ + + + +
+
+
+ +
+ Mensagem foi eliminada +
+
+ {{ message.message }} +
+
+ {{ message.message }} +
+ + +
+ + {{ reaction.reaction }} + +
+
+ + + + + + +
+ +
+
+ + + + + +
+
+ + + + +
+ {{durationDisplay}} + +
+ +
+
+ + +
+
+
+ +
+
+ +
+
+
+ + + +
+
+ +
diff --git a/src/app/pages/chat/messages/messages.page.scss b/src/app/ui/chat/modal/messages/messages.page.scss similarity index 78% rename from src/app/pages/chat/messages/messages.page.scss rename to src/app/ui/chat/modal/messages/messages.page.scss index 3a2ac64b1..f504c5395 100644 --- a/src/app/pages/chat/messages/messages.page.scss +++ b/src/app/ui/chat/modal/messages/messages.page.scss @@ -56,7 +56,6 @@ } .middle-container { - overflow: auto; height: auto; .middle { @@ -91,7 +90,6 @@ } .header-bottom { - width: 310px; overflow: auto; margin: 0 auto; @@ -416,3 +414,113 @@ button::-moz-focus-inner { width: 111px !important; text-align: center; } + + +.message-item-options { + position: relative; +} + +.emoji-picker { + display: flex; + flex-wrap: wrap; + background: white; + border: 1px solid #ccc; + padding: 5px; + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; +} + +.emoji-icon { + font-size: 20px; + cursor: pointer; + margin: 2px; +} + + + +.messages { + font-size: rem(13); + font-family: Roboto; + overflow: auto; + + //set scroll do bottom + // position: absolute; + // top: 0; + // left: 0; + // overflow-x: hidden; + // overflow-y: auto; + // width: 100%; + // height: 100%; + // word-wrap: break-word; + // -webkit-overflow-scrolling: touch; + + .other-message, + .my-message { + + .message-container { + padding: 15px 20px; + margin: 10px 20px 10px 75px; + background: var(--chat-incoming-msg-color); + border-radius: 10px; + } + } + + .other-message { + display: flex; + /* justify-content: flex-end; */ + align-items: start; + flex-direction: column; + // float: left; + // Styles for incoming messages from other users + justify-content: flex-start; + .message-container { + padding: 15px 20px; + margin: 10px 75px 10px 20px; + background: #ebebeb; + border-radius: 10px; + } + } +} + +.my-message { + + display: flex; + /* justify-content: flex-end; */ + align-items: end; + flex-direction: column; +} + + +.info-ballon { + text-align: center; + font-size: rem(13); + color: #262420; + padding: 10px; + margin: 10px auto; + line-height: 2.2rem; + border-radius: 8px; + .ballon { + background: var(--chat-alert-msg-color); + padding: 0px 10px; + border-radius: 8px; + } +} + +.emoji-container{ + padding: 0px 20px; + /* margin-bottom: -10px; */ + position: relative; + top: -10px; + margin-bottom: -15px; +} + +.right { + padding: 0 !important; + float: right; + font-size: rem(25); + color: #0782c9; + margin: 5px 0 0 0; +} diff --git a/src/app/shared/chat/messages/messages.page.spec.ts b/src/app/ui/chat/modal/messages/messages.page.spec.ts similarity index 100% rename from src/app/shared/chat/messages/messages.page.spec.ts rename to src/app/ui/chat/modal/messages/messages.page.spec.ts diff --git a/src/app/ui/chat/modal/messages/messages.page.ts b/src/app/ui/chat/modal/messages/messages.page.ts new file mode 100644 index 000000000..a5ac6922e --- /dev/null +++ b/src/app/ui/chat/modal/messages/messages.page.ts @@ -0,0 +1,1574 @@ +import { AfterViewInit, Component, ElementRef, HostListener, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { GestureController, ModalController, NavParams, PopoverController, Platform } from '@ionic/angular'; +import { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page'; +import { ExpedientTaskModalPageNavParamsTask } from 'src/app/models/ExpedientTaskModalPage'; +import { ContactsPage } from 'src/app/ui/chat/modal/messages/contacts/contacts.page'; +import { AlertService } from 'src/app/services/alert.service'; +import { FileService } from 'src/app/services/functions/file.service'; +import { ToastService } from 'src/app/services/toast.service'; +import { ThemeService } from 'src/app/services/theme.service' + +import { VoiceRecorder, GenericResponse } from 'capacitor-voice-recorder'; +import { Haptics, ImpactStyle } from '@capacitor/haptics'; +import { ViewEventPage } from 'src/app/modals/view-event/view-event.page'; +import { SearchPage } from 'src/app/pages/search/search.page'; +import { Storage } from '@ionic/storage'; +import { CameraResultType } from '@capacitor/camera'; +import { DomSanitizer } from '@angular/platform-browser'; +import { SessionStore } from 'src/app/store/session.service'; +import { ViewMediaPage } from 'src/app/modals/view-media/view-media.page'; + +//====== +import { Observable as DexieObservable } from 'Dexie'; +import { Observable, Subscription } from 'rxjs'; +import { MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; +import { EditMessagePage } from 'src/app/ui/chat/modal/edit-message/edit-message.page'; +import { IMessageType, MessageAttachmentFileType, MessageAttachmentSource, MessageEntity } from 'src/app/core/chat/entity/message'; +import { MemberTable } from 'src/app/infra/database/dexie/instance/chat/schema/members'; +import { TypingTable } from 'src/app/infra/database/dexie/instance/chat/schema/typing'; +import { compressImageBase64 } from 'src/app/utils/imageCompressore'; +import { FilePickerService } from 'src/app/infra/file-picker/file-picker.service' +import { RecordingData } from 'capacitor-voice-recorder'; +import { Logger } from 'src/app/services/logger/main/service'; +import { MessagesOptionsPage } from '../messages-options/messages-options.page'; +import { ChatOptionsPopoverPage } from '../chat-options-popover/chat-options-popover.page'; +import { CameraService } from 'src/app/infra/camera/camera.service' +import { FilePickerMobileService } from 'src/app/infra/file-picker/mobile/file-picker-mobile.service' +import { FilePickerWebService } from 'src/app/infra/file-picker/web/file-picker-web.service' +import { allowedDocExtension } from 'src/app/utils/allowedDocExtension'; +import { JSFileToDataUrl } from 'src/app/utils/ToBase64'; +import { RoomLocalRepository } from 'src/app/module/chat/data/repository/room/room-local-repository.service' +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member/member-list-local-repository.service' +import { UserTypingLocalRepository } from 'src/app/module/chat/data/repository/typing/user-typing-local-data-source.service'; +import { UserTypingRemoteRepositoryService } from 'src/app/module/chat/data/repository/typing/user-typing-live-data-source.service'; +import { MessageLocalDataSourceService } from 'src/app/module/chat/data/repository/message/message-local-data-source.service'; +import { RoomType } from "src/app/core/chat/entity/group"; +import { RoomTable } from 'src/app/infra/database/dexie/instance/chat/schema/room'; +import { whatsappDate } from 'src/app/ui/shared/utils/whatappdate'; +import { MessageViewModal } from '../../store/model/message'; +import { XBallon } from '../../utils/messageBallon'; +import { tap } from 'rxjs/operators'; +import { ChatPopoverPage } from '../chat-popover/chat-popover.page'; +import { ViewOncesImagePageInput, ViewOncesImagePage } from '../view-onces/view-onces.page'; +import { LastMessage } from '../../utils/lastMessage'; +import { File } from '@awesome-cordova-plugins/file/ngx'; +import { Filesystem, Directory } from '@capacitor/filesystem'; +import { FileOpener } from '@awesome-cordova-plugins/file-opener/ngx'; +import { FileSystemMobileService } from 'src/app/infra/file-system/mobile/file-system-mobile.service'; + + +const IMAGE_DIR = 'stored-images'; + +@Component({ + selector: 'app-messages', + templateUrl: './messages.page.html', + styleUrls: ['./messages.page.scss'], +}) +export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { + showLoader: boolean; + + @ViewChild('scrollMe') private myScrollContainer: ElementRef; + @ViewChild('rectangle') private rectangle: ElementRef; + + canvas: any + ctx: any + loggedUser: any; + userPresence = ''; + dmUsers: any; + roomId: string; + el: any; + members: any; + scrollingOnce: boolean = true; + + private scrollChangeCallback: () => void; + currentPosition: any; + startPosition: number; + scrollToBottomBtn = false; + showMessageOptions = false; + selectedMsgId: string; + + dicIndex = 0; + task: ExpedientTaskModalPageNavParamsTask; + LoadedDocument: any = null; + + recording = false; + allowTyping = true; + storedFileNames = []; + lastAudioRecorded = ''; + audioRecorded: any = ""; + audioDownloaded: any = ""; + durationDisplay = ''; + duration = 0; + @ViewChild('recordbtn', { read: ElementRef }) recordBtn: ElementRef; + myAudio: any; + downloadfile: any; + downloadFile: any; + files: any[] = []; + @ViewChild('filechooser') fileChooserElementRef: ElementRef; + @ViewChild('array') myInputRef!: ElementRef; + + //items: File[] = []; + fileSelected?: Blob; + pdfUrl?: string; + base64File: string; + downloadProgess: number; + downloadLoader: boolean; + + audioPermissionStatus: 'granted' | 'denied' | 'prompt' | null = null + sessionStore = SessionStore + SessionStore = SessionStore + + roomData$: Observable + roomStatus$: DexieObservable + roomMessage$: DexieObservable + roomMembers$: Observable + //userTyping$: DexieObservable + userTyping$: TypingTable[] | undefined + newMessagesStream!: Subscription + + selectedMessage: any = null; + emojis: string[] = ['😊', '😂', '❤️', '👍', '😢']; // Add more emojis as needed + textField = '' + roomType!: RoomType + + messageReceiveSubject: Subscription + messageDeleteSubject: Subscription + messageUpdateSubject: Subscription + messageSendSubject: Subscription + messages1: {[key: string]: MessageViewModal[]} = {} + + MessageAttachmentFileType = MessageAttachmentFileType + MessageAttachmentFileSource = MessageAttachmentSource + messageOnReconnectSubject: Subscription + + date: {[key: string]: Object} = {} + totalMembers = 0 + isAdmin = true + RoomTypeEnum = RoomType + IMessageType = IMessageType + handleClickActive = false + + constructor( + public popoverController: PopoverController, + private modalController: ModalController, + private navParams: NavParams, + private alertService: AlertService, + private toastService: ToastService, + private fileService: FileService, + private gestureController: GestureController, + public ThemeService: ThemeService, + private platform: Platform, + private storage: Storage, + private sanitiser: DomSanitizer, + private chatServiceService: ChatServiceService, + private FilePickerService: FilePickerService, + private CameraService: CameraService, + private FilePickerMobileService: FilePickerMobileService, + private FilePickerWebService: FilePickerWebService, + private RoomLocalRepository: RoomLocalRepository, + private MemberListLocalRepository: MemberListLocalRepository, + private userTypingLocalRepository: UserTypingLocalRepository, + private UserTypingRemoteRepositoryService: UserTypingRemoteRepositoryService, + private messageLocalDataSourceService: MessageLocalDataSourceService, + private file: File, + private fileOpener: FileOpener, + private fileSystemMobileService: FileSystemMobileService + ) { + + + this.roomId = this.navParams.get('roomId'); + + + this.roomData$ = this.RoomLocalRepository.getRoomByIdLive(this.roomId) + + this.roomData$.subscribe(e => { + // console.log(e) + if(e) { + this.roomType = e.roomType + } + + }) + + this.getMessages(); + this.listenToIncomingMessage(); + this.listenToDeleteMessage(); + this.listenToUpdateMessage(); + this.listenToSendMessage(); + + + // this.roomMessage$ = this.messageRepositoryService.getItemsLive(this.roomId) + this.roomMembers$ = this.MemberListLocalRepository.getRoomMemberByIdLive(this.roomId).pipe( + tap((members) => { + this.totalMembers = members.length + this.members = members + for(const member of members) { + if(member.wxUserId == SessionStore.user.UserId) { + this.isAdmin = member.isAdmin + } + } + }) + ) + this.roomStatus$ = this.MemberListLocalRepository.allMemberOnline(this.roomId) + // this.roomRepositoryService.getRoomById(this.roomId) + + this.userTypingLocalRepository.getUserTypingLive().subscribe((e) => { + const arrayNames = e.map(e => e.userName) + this.userTyping$ = e as any + + const uniqueArray = [...new Set(arrayNames)]; + + (this.myInputRef.nativeElement as HTMLDivElement).innerHTML = '::'+ uniqueArray + }) + + this.chatServiceService.removeBoldFromRoom({roomId: this.roomId}) + this.chatServiceService.getRoomById(this.roomId) + } + + @HostListener('document:click', ['$event']) + handleClickOutside(event: Event) { + if (!this.handleClickActive) return; + this.handleClickActive = false + const clickedInside = (event.target as HTMLElement).closest('.mat-menu-content'); + if (!clickedInside) { + this.selectedMessage = null; + } + } + + + async getMessages() { + + + // dont remove this line + this.messages1[this.roomId] = [] + let messages = await this.messageLocalDataSourceService.getItems(this.roomId) + + this.messages1[this.roomId] = [] + this.date = {} + const allMessage = []; + + // let ids = {} + // messages = messages.filter((message: any) => { + // if (message.$createAt) { + // if (!ids[message.$createAt]) { + // ids[message.$createAt] = true; + // return true; // Keep this message + // } else { + // console.log('delete'); + // return false; // Remove this message + // } + // } + // return true; // Keep messages without an id + // }); + console.time("mappingTime"); + for(const message of messages) { + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + allMessage.push(Ballon) + } + + allMessage.push(new MessageViewModal(message)) + } + console.timeEnd("mappingTime"); + + + this.messages1[this.roomId] = allMessage + + this.loadAttachment() + setTimeout(() => { + this.sendReadMessage() + }, 1000) + + this.messageOnReconnectSubject?.unsubscribe() + this.messageOnReconnectSubject = this.chatServiceService.listenToMessageLoadHistory({roomId: this.roomId}).subscribe((messages) => { + + for(const message of messages.data) { + const found = this.messages1[this.roomId].find((e) => e.id == message.id) + + if(!found) { + const msg = new MessageViewModal(message as any) + Object.assign(msg, message) + this.messages1[this.roomId].push(msg) + } + } + }) + + } + + sendReadMessage() { + + for(const message of this.messages1[this.roomId]) { + + if(!message.meSender()) { + const me = message.haveSeen(message.info) + + if(!me) { + Logger.info('send read at, sender '+ message.sender.wxFullName+ ' '+ message.message +'message id'+ message.id) + + this.chatServiceService.sendReadAt({ + memberId: SessionStore.user.UserId, + messageId: message.id, + requestId: '', + roomId: this.roomId + }) + } + } + } + + } + + async loadAttachment() { + for(const message of this.messages1[this.roomId]) { + if(message.hasAttachment && message.attachments[0].source != MessageAttachmentSource.Webtrix) { + + this.chatServiceService.getMessageAttachmentByMessageId(message).then((result)=> { + if(result.isOk()) { + message.attachments[0].safeFile = result.value + + if(result.value.startsWith('blob:http')) { + message.attachments[0].blobURl = true + } + } + }) + + } + } + } + + messageStatus(message: MessageViewModal) { + if(this.allViewed(message)) { + return 'allViewed' + } else if(this.allReceived(message)) { + return 'allReceived' + } else if (message.messageStatus == 'send') { + return 'enviado' + } else { + return 'enviar' + } + } + allReceived(message: MessageViewModal) { + return message.info.filter(e => typeof e.deliverAt == 'string').length == this.totalMembers + } + + allViewed(message: MessageViewModal) { + const totalMembers = this.members.filter((e) => message.sender.wxUserId != e.wxUserId ).length + return message.info.filter(e => typeof e.readAt == 'string' && message.sender.wxUserId != e.memberId ).length == totalMembers + } + ngOnInit() {} + + + ngAfterViewInit() { + this.scrollChangeCallback = () => this.onContentScrolled(event); + window.addEventListener('scroll', this.scrollChangeCallback, true); + + const longpress = this.gestureController.create({ + el: this.recordBtn.nativeElement, + threshold: 0, + gestureName: 'long-press', + onStart: ev => { + Haptics.impact({ style: ImpactStyle.Light }) + this.startRecording(); + //this.calculateDuration(); + }, + onEnd: ev => { + Haptics.impact({ style: ImpactStyle.Light }) + this.stopRecording(); + } + }, true); + longpress.enable(); + } + + onDragOver(e?) { } + onDragLeave(e?) { } + + calculateDuration() { + if (!this.recording) { + this.duration = 0; + this.durationDisplay = ''; + return; + } + this.duration += 1; + const minutes = Math.floor(this.duration / 60); + const seconds = (this.duration % 60).toString().padStart(2, '0'); + this.durationDisplay = `${minutes}:${seconds}`; + + setTimeout(() => { + this.calculateDuration(); + }, 1000) + } + + + + listenToIncomingMessage() { + this.messageReceiveSubject?.unsubscribe(); + this.messageReceiveSubject = this.chatServiceService.listenToIncomingMessage(this.roomId).subscribe(async (_message) => { + + const date = whatsappDate(_message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(_message) + this.messages1[this.roomId].push(Ballon) + } + + const message = new MessageViewModal(_message) + this.messages1[this.roomId].push(new MessageViewModal(message)) + + if(message.hasAttachment) { + + const result = await this.chatServiceService.downloadMessageAttachmentByMessageId({ + $messageId: message.id, + id: message.attachments[0].id + }) + + if(result.isOk()) { + message.attachments[0].safeFile = result.value + if((result.value as unknown as string).startsWith('blob:http')) { + message.attachments[0].blobURl = true + } else { + message.attachments[0].blobURl = false + } + } + } + + setTimeout(() => { + this.scrollToBottomClicked() + }, 100) + + + setTimeout(() => { + this.chatServiceService.removeBoldFromRoom({roomId: this.roomId}) + }, 1000) + }); + + } + + listenToDeleteMessage() { + this.messageDeleteSubject?.unsubscribe(); + + this.messageDeleteSubject = this.chatServiceService.listenToDeleteMessage(this.roomId).subscribe((deleteMessage) => { + console.log('delete class', deleteMessage); + + const index = this.messages1[this.roomId].findIndex(e => e?.id === deleteMessage.id); // Use triple equals for comparison + this.messages1[this.roomId][index].delete() + // if (index !== -1) { // Check if the item was found + // console.log('delete ==') + // this.messages1[this.roomId].splice(index, 1); + // // console.log('removed index', index); + // } else { + // // console.log('message not found'); + // } + }); + } + + listenToUpdateMessage() { + this.messageUpdateSubject?.unsubscribe(); + + this.messageUpdateSubject = this.chatServiceService.listenToUpdateMessage(this.roomId).subscribe((updateMessage) => { + + const index = this.messages1[this.roomId].findIndex(e => e?.id === updateMessage.id); // Use triple equals for comparison + + if (index !== -1) { // Check if the item was found + this.messages1[this.roomId][index].message = updateMessage.message + this.messages1[this.roomId][index].reactions = updateMessage.reactions + this.messages1[this.roomId][index].reactions = updateMessage.reactions + } else { + // console.log('message not found'); + } + }); + } + + + listenToSendMessage() { + this.messageSendSubject?.unsubscribe(); + + this.messageSendSubject = this.chatServiceService.listenToSendMessage(this.roomId).subscribe((updateMessage) => { + + const index = this.messages1[this.roomId].findIndex(e => e?.requestId === updateMessage.requestId); // Use triple equals for comparison + + if (index !== -1) { // Check if the item was found + + this.messages1[this.roomId][index].id = updateMessage.id + this.messages1[this.roomId][index].info = updateMessage.info + + let attachmentIndex = 0; + + for(const attachment of updateMessage.attachments) { + + this.messages1[this.roomId][index].attachments[attachmentIndex].id = attachment.id + attachmentIndex++; + } + + } else { + // console.log('message not found'); + } + }); + } + + async loadFiles() { + + this.storage.get('fileName').then((fileName) => { + this.lastAudioRecorded = fileName; + }) + + try { + this.storage.get('recordData').then((recordData) => { + + if (recordData?.value?.recordDataBase64.includes('data:audio')) { + this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(recordData?.value?.recordDataBase64); + } + else if (recordData?.value?.mimeType && recordData?.value?.recordDataBase64) { + this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(`data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`); + } + }); + } catch (error) { } + + + } + + async startRecording() { + VoiceRecorder.requestAudioRecordingPermission(); + if (await VoiceRecorder.canDeviceVoiceRecord().then((result: GenericResponse) => { return result.value })) { + if (await VoiceRecorder.requestAudioRecordingPermission().then((result: GenericResponse) => { return result.value })) { + //if(await this.hasAudioRecordingPermission()){ + if (this.recording) { + return; + } + this.recording = true; + VoiceRecorder.startRecording(); + this.calculateDuration(); + //} + } + else { + this.toastService._badRequest('Para gravar uma mensagem de voz, permita o acesso do Gabinete Digital ao seu microfone.'); + } + } + else { + this.toastService._badRequest('Este dispositivo não tem capacidade para gravação de áudio!'); + } + } + + stopRecording() { + this.deleteRecording(); + this.allowTyping = false; + + if (!this.recording) { + return; + } + this.recording = false; + VoiceRecorder.stopRecording().then(async (result: RecordingData) => { + + this.recording = false; + if (result.value && result.value.recordDataBase64) { + const recordData = result.value.recordDataBase64; + // + const fileName = new Date().getTime() + ".mp3"; + //Save file + this.storage.set('fileName', fileName); + this.storage.set('recordData', result).then(() => { + + }) + } + }) + setTimeout(async () => { + this.loadFiles(); + }, 1000); + } + + async deleteRecording() { + this.storage.remove('fileName'); + this.storage.remove('recordData'); + + this.allowTyping = true; + this.lastAudioRecorded = ''; + this.loadFiles(); + } + + + + handlePress(id?: string) { + this.selectedMsgId = id; + this.showMessageOptions = true; + } + + handleClick() { + this.showMessageOptions = false; + this.selectedMsgId = ""; + } + + deleteMessage(msgId: string) {} + + + notImplemented() { + this.alertService.presentAlert('Funcionalidade em desenvolvimento'); + } + + close() { + this.modalController.dismiss(); + this.deleteRecording(); + } + + load() { + this.getChatMembers(); + } + + doRefresh(ev: any) { + this.load(); + ev.target.complete(); + } + + scrollToBottom(): void { + try { + if (this.scrollingOnce) { + this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight; + //this.scrollingOnce = false; + } + } catch (err) { } + } + + scrollToBottomClicked = () => { + try { + this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight; + } catch (err) { } + } + + async goToEvent(event: any) { + + let classs; + if (window.innerWidth < 701) { + classs = 'modal modal-desktop' + } else { + classs = 'modal modal-desktop showAsideOptions' + } + const modal = await this.modalController.create({ + component: ViewEventPage, + componentProps: { + eventId: event.id, + CalendarId: event.calendarId + }, + cssClass: classs, + }); + await modal.present(); + modal.onDidDismiss().then((res) => { + + }); + } + + onContentScrolled(e) { + this.startPosition = e.srcElement.scrollTop; + let scroll = e.srcElement.scrollTop; + let windowHeight = e.srcElement.scrollHeight; + let containerHeight = windowHeight - e.srcElement.clientHeight; + + if (scroll > this.currentPosition) { + } else { + this.scrollingOnce = false; + } + if ((containerHeight - 100) > scroll) { + this.scrollToBottomBtn = true; + } + else { + this.scrollToBottomBtn = false; + } + this.currentPosition = scroll; + + } + + ngOnDestroy() { + window.removeEventListener('scroll', this.scrollChangeCallback, true); + this.handleClickActive = false; // Disable the listener before component destruction + } + + async sendMessage() { + + const message = new MessageViewModal(); + message.message = this.textField + message.roomId = this.roomId + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + message.sentAt = new Date().toISOString() + + this.textField = '' + + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + this.messages1[this.roomId].push(Ballon) + } + + this.messages1[this.roomId].push(message) + setTimeout(() => { + this.scrollToBottomClicked() + }, 100) + const data = await this.chatServiceService.sendMessage(message, this.roomType) + + } + + async sendAudio(fileName) { + const roomId = this.roomId + let audioFile; + this.storage.get('recordData').then(async (recordData:RecordingData) => { + + audioFile = recordData; + if (recordData?.value?.recordDataBase64.includes('data:audio')) { + this.audioRecorded = recordData?.value?.recordDataBase64; + } + else if (recordData?.value?.mimeType && recordData?.value?.recordDataBase64) { + this.audioRecorded = `data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`; + } + + const audioMimeType: string = recordData.value.mimeType + const encodedData = btoa(this.audioRecorded); + + const message = new MessageViewModal(); + message.roomId = this.roomId + + message.sentAt = new Date().toISOString() + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + + message.attachments = [{ + file: this.audioRecorded.split(',')[1], + fileName: "audio", + source: MessageAttachmentSource.Device, + fileType: MessageAttachmentFileType.Audio, + mimeType: audioMimeType, // 'audio/webm', + safeFile: this.sanitiser.bypassSecurityTrustResourceUrl(this.audioRecorded) + }] + + message.sentAt = new Date().toISOString() + + + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + this.messages1[this.roomId].push(Ballon) + } + + this.messages1[this.roomId].push(message) + this.chatServiceService.sendMessage(message, this.roomType) + + setTimeout(() => { + this.scrollToBottomClicked() + }, 100) + + this.deleteRecording(); + + }); + this.deleteRecording(); + } + + viewDocument(file: any, url?: string) { + + if (file.type == "application/webtrix") { + this.openViewDocumentModal(file); + } + else { + let fullUrl = "https://www.tabularium.pt" + url; + this.fileService.viewDocumentByUrl(fullUrl); + } + } + + + docIndex(index: number) { + this.dicIndex = index + } + + async openViewDocumentModal(file: any) { + + let task = { + serialNumber: '', + taskStartDate: '', + isEvent: true, + workflowInstanceDataFields: { + FolderID: '', + Subject: file.Assunto, + SourceSecFsID: file.ApplicationId, + SourceType: 'PDF', + SourceID: file.DocId, + DispatchNumber: '' + } + } + + let doc = { + "Id": "", + "ParentId": "", + "Source": 1, + "ApplicationId": file.ApplicationId, + "CreateDate": "", + "Data": null, + "Description": "", + "Link": null, + "SourceId": file.DocId, + "SourceName": file.Assunto, + "Stakeholders": "", + } + + const modal = await this.modalController.create({ + component: ViewDocumentPage, + componentProps: { + trustedUrl: '', + file: { + title: file.Assunto, + url: '', + title_link: '', + }, + Document: doc, + applicationId: file.ApplicationId, + docId: file.DocId, + folderId: '', + task: task + }, + cssClass: 'modal modal-desktop' + }); + await modal.present(); + } + + getChatMembers() {} + + showDateDuration(start: any) { + let end; + end = new Date(); + start = new Date(start); + let customizedDate; + + const totalSeconds = Math.floor((end - (start)) / 1000);; + const totalMinutes = Math.floor(totalSeconds / 60); + const totalHours = Math.floor(totalMinutes / 60); + const totalDays = Math.floor(totalHours / 24); + + const hours = totalHours - (totalDays * 24); + const minutes = totalMinutes - (totalDays * 24 * 60) - (hours * 60); + const seconds = totalSeconds - (totalDays * 24 * 60 * 60) - (hours * 60 * 60) - (minutes * 60); + + if (totalDays == 0) { + if (start.getDate() == new Date().getDate()) { + let time = start.getHours() + ":" + this.addZero(start.getUTCMinutes()); + return time; + } + else { + return 'Ontem'; + } + } + else { + let date = start.getDate() + "/" + (start.getMonth() + 1) + "/" + start.getFullYear(); + return date; + } + } + + addZero(i) { + if (i < 10) { + i = "0" + i; + } + return i; + } + + async openMessagesOptions(ev?: any) { + const popover = await this.popoverController.create({ + component: ChatPopoverPage, + componentProps: { + roomId: this.roomId, + members: [], + isAdmin: this.isAdmin, + roomType: this.roomType + }, + cssClass: 'messages-options', + event: ev, + translucent: true, + }); + return await popover.present(); + } + + async addContacts() { + const modal = await this.modalController.create({ + component: ContactsPage, + componentProps: {}, + cssClass: 'contacts', + backdropDismiss: false + }); + + + + modal.onDidDismiss(); + await modal.present(); + } + + + async onImageError() {} + async onImageLoad(message: MessageViewModal, index:number) { + if(message.attachments[0].fileName == LastMessage.attachments[0].fileName) { + + this.scrollToBottom() + setTimeout(() => { + this.scrollToBottom(); + }, 100) + + this.messages1[this.roomId].splice(index, 1); + } + } + + + async takePictureMobile() { + + const picture = await this.CameraService.takePicture({ + cameraResultType: CameraResultType.DataUrl, + quality: 90 + }) + + if(picture.isOk()) { + const file = picture.value + + const compressedImage = await compressImageBase64( + file.dataUrl, + 800, // maxWidth + 800, // maxHeight + 0.9 // quality + ) + + if(compressedImage.isOk()) { + + const message = new MessageViewModal(); + message.roomId = this.roomId + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + + message.attachments = [{ + file: compressedImage.value.split(',')[1], + fileName: "foto", + source: MessageAttachmentSource.Device, + fileType: MessageAttachmentFileType.Image, + mimeType: 'image/'+picture.value.format + }] + + + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + this.messages1[this.roomId].push(Ballon) + } + + this.messages1[this.roomId].push(message) + this.chatServiceService.sendMessage(message, this.roomType) + + } + + } + + + } + + + async addFile() { + this.addFileToChat(['.doc', '.docx', '.pdf']) + } + + async addFileWebtrix() { + const modal = await this.modalController.create({ + component: SearchPage, + cssClass: 'group-messages modal-desktop search-modal search-modal-to-desktop', + componentProps: { + type: 'AccoesPresidenciais & ArquivoDespachoElect', + select: true, + showSearchInput: true, + } + }); + await modal.present(); + modal.onDidDismiss().then(async res => { + const data = res.data; + const roomId = this.roomId + + if (data.selected) { + + const message = new MessageViewModal(); + message.message = this.textField + message.roomId = this.roomId + + message.sentAt = new Date().toISOString() + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + message.attachments = [{ + fileName: res.data.selected.Assunto, + source: MessageAttachmentSource.Webtrix, + fileType: MessageAttachmentFileType.Doc, + applicationId: res.data.selected.ApplicationType, + docId: parseInt(res.data.selected.Id), + description: res.data.selected.Assunto + }] + + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + this.messages1[this.roomId].push(Ballon) + } + + this.messages1[this.roomId].push(message) + setTimeout(() => { + this.scrollToBottomClicked() + }, 100) + this.chatServiceService.sendMessage(message, this.roomType) + this.textField = '' + + } + }); + } + + async pickPicture() { + + const file = await this.FilePickerService.getPicture({ + cameraResultType: CameraResultType.Base64 + }) + + if(file.isOk()) { + + var base64 = 'data:image/jpeg;base64,' + file.value.base64String + if (file.value.format == "jpeg" || file.value.format == "png" || file.value.format == "gif") { + + const compressedImage = await compressImageBase64( + base64, + 800, // maxWidth + 800, // maxHeight + 0.9 // quality + ) + + if(compressedImage.isOk()) { + + const message = new MessageViewModal(); + message.roomId = this.roomId + message.sentAt = new Date().toISOString() + // message.oneShot = oneShot + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + + message.attachments = [{ + file: compressedImage.value, + fileName: "foto", + source: MessageAttachmentSource.Device, + fileType: MessageAttachmentFileType.Image, + mimeType: 'image/'+file.value.format + }] + + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + this.messages1[this.roomId].push(Ballon) + } + + this.messages1[this.roomId].push(message) + this.chatServiceService.sendMessage(message, this.roomType) + } + } + + } else { + if(file.error.type == 'PERMISSION_DENIED') { + this.toastService._badRequest("Sem acesso a camera") + } + Logger.error('failed to pick picture from the device', { + error: file.error + }) + } + + } + + async viewOnce(event: Event, message: MessageViewModal, index:number) { + const params: ViewOncesImagePageInput = { + imageDataUrl: message.attachments[index].safeFile as any, + } + const modal = await this.modalController.create({ + component: ViewOncesImagePage, + cssClass: '', + componentProps: params + }); + + modal.present() + + return modal.onDidDismiss().then((res) => { + this.messageDelete(message) + }); + } + + async addFileToChat(types) { + console.log('add file ') + const roomId = this.roomId + + if (this.platform.is('ios')) { + console.log('ios add file ') + + const result = await this.FilePickerMobileService.getFile({ + types: ['application/pdf', 'application/doc', 'application/docx','application/xls', 'application/xlsx', 'application/ppt', + 'application/pptx', 'application/txt'], + multiple: false, + readData: true, + }) + + if(result.isOk()) { + console.log('RESULT', result.value.files[0].data) + + const message = new MessageViewModal(); + message.roomId = this.roomId + message.sentAt = new Date().toISOString() + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + + message.attachments = [{ + file: result.value.files[0].data, + fileName: result.value.files[0].name, + source: MessageAttachmentSource.Device, + fileType: MessageAttachmentFileType.Doc, + description: result.value.files[0].name + }] + + this.messages1[this.roomId].push(message) + this.chatServiceService.sendMessage(message, this.roomType) + + return + } + + + } + + const file = await this.FilePickerWebService.getFileFromDevice(types) + + if(file.isOk()) { + + console.log(file) + + + const fileName = file.value.name + + const validation = await allowedDocExtension(fileName) + + if (validation.isOk()) { + + let fileBase64 = await JSFileToDataUrl(file.value); + + if(fileBase64.isOk()) { + + const message = new MessageViewModal(); + message.roomId = this.roomId + message.sentAt = new Date().toISOString() + + message.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + + message.attachments = [{ + file: fileBase64.value.split(',')[1], + fileName: file.value.name, + source: MessageAttachmentSource.Device, + fileType: MessageAttachmentFileType.Doc, + mimeType: file.value.type + }] + + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + this.messages1[this.roomId].push(Ballon) + } + + + this.messages1[this.roomId].push(message) + setTimeout(() => { + this.scrollToBottomClicked() + }, 100) + this.chatServiceService.sendMessage(message, this.roomType) + + } + + + } else { + this.toastService._badRequest("Ficheiro inválido") + } + } + + } + + async openChatOptions(ev?: any) { + const roomId = this.roomId + + + const popover = await this.popoverController.create({ + component: ChatOptionsPopoverPage, + cssClass: 'chat-options-popover', + event: ev, + componentProps: { + room: this.roomId, + members: this.members, + eventSelectedDate: new Date(), + }, + translucent: true + }); + await popover.present(); + popover.onDidDismiss().then(async (res) => { + + if (res['data'] == 'take-picture') { + this.takePictureMobile() + } + else if (res['data'] == 'add-picture') { + console.log('add-picture') + this.pickPicture() + } + else if (res['data'] == 'add-document') { + this.addFile() + } + else if (res['data'] == 'documentoGestaoDocumental') { + + this.addFileWebtrix() + } + + + }); + } + + isJson(str) { + try { + JSON.parse(str); + } catch (e) { + return ""; + } + return JSON.parse(str); + } + + +// async openFile(pdfString, filename, type) { + +// console.log('url while open ',pdfString) + +// /* const modal = await this.modalController.create({ +// component: ViewDocumentSecondOptionsPage, +// componentProps: { +// fileUrl: pdfString, +// filename: filename +// }, +// cssClass: 'modal modal-desktop' +// }); +// await modal.present(); +// /* +// await modal.present(); */ + +// // var blob = new Blob([pdfString], { type: 'application/pdf' }); + + +// let pathFile = '' +// const fileName = filename +// if (this.platform.is('ios')) { +// pathFile = this.file.documentsDirectory +// } else { +// pathFile = this.file.externalRootDirectory +// } + +// console.log('file data', pdfString) +// console.log(pathFile) + +// let removePre = this.removeTextBeforeSlash(pdfString,',') +// console.log('file data remove ', removePre) + +// await Filesystem.writeFile({ +// path: fileName, +// data: removePre, +// directory: Directory.Cache, +// }).then((dir) => { +// console.log('DIR ', dir) +// this.fileOpener +// .open(dir.uri, type) +// .then(() => console.log()) +// .catch(e => console.error(e)) +// }).catch((error) => { +// console.log('error writing the file', error) +// }); +// } + + async fetchBlobFromURL(blobUrl: string): Promise { + try { + const response = await fetch(blobUrl); + if (!response.ok) { + throw new Error(`Failed to fetch blob: ${response.statusText}`); + } + return await response.blob(); + } catch (error) { + console.error('Error fetching blob from URL:', error); + throw error; + } + } + + convertBlobToDataURL(blob: Blob): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onloadend = () => { + if (reader.result) { + resolve(reader.result as string); + } else { + reject('Conversion failed'); + } + }; + reader.onerror = (error) => reject(error); + reader.readAsDataURL(blob); + }); + } + + // async openFile(blobUrl:string, filename, fileType) { + // console.log(blobUrl, filename, fileType) + // let pathFile: string; + + // if (this.platform.is('ios')) { + // pathFile = this.file.documentsDirectory + // } else { + // pathFile = this.file.externalRootDirectory + // } + + // let a = await this.fetchBlobFromURL(blobUrl) + + // console.log({e:await this.convertBlobToDataURL(a)}) + // let removePre = this.removeTextBeforeSlash(await this.convertBlobToDataURL(a),',') + + // Filesystem.writeFile({ + // path: filename, + // data: removePre, + // directory: Directory.Cache, + + // }).then(dir => { + // console.log('DIR ', dir) + // this.fileOpener + // .open(dir.uri, fileType) + // .then(() => console.log()) + // .catch(e => console.error(e)) + // }) + // .catch(e => console.log('Error writing file', e)) + // } + + async openFile(blobUrl:string, filename, fileType) { + + let pathFile = '' + const fileName = filename + const contentFile = await this.fetchBlobFromURL(blobUrl) + if (this.platform.is('ios')) { + pathFile = this.file.documentsDirectory + } else { + pathFile = this.file.cacheDirectory + } + console.log(pathFile) + console.log(contentFile) + const writeResult = await this.fileSystemMobileService.writeFile(pathFile, fileName, contentFile, { replace: true }) + + if(writeResult.isOk()) { + const openResult = await this.fileSystemMobileService.fileOpener(pathFile + fileName, fileType) + } + } + + removeTextBeforeSlash(inputString, controlString) { + if (inputString.includes(controlString)) { + const parts = inputString.split(controlString); + return parts.length > 1 ? parts[1] : inputString; + } else { + return inputString; + } + } + + downloadFileFromBrowser(fileName: string, msg: MessageViewModal): void { + if(msg.attachments[0]?.blobURl) { + // Create a temporary URL for the Blob + const url = msg.attachments[0].safeFile; + + // Create an
element with the download attribute + const a = document.createElement('a'); + a.href = url; + a.download = fileName; // Set the desired file name + + a.click(); + } else { + const link = document.createElement("a") + link.href = `data:${msg.attachments[0].mimeType}';base64,${msg.attachments[0].safeFile}`; + link.download = fileName + link.click() + + link.remove() + } + } + + + async openPreview(msg: MessageViewModal) { + + if (msg.attachments[0].source === MessageAttachmentSource.Webtrix) { + this.viewDocument(msg) + } else { + + if (!msg.attachments[0].safeFile || msg.attachments[0].safeFile === null || msg.attachments[0].safeFile === '') { + + + } else { + + if (this.platform.is('desktop') || this.platform.is('mobileweb')) { + + if (msg.attachments[0].mimeType.includes('image')) { + const modal = await this.modalController.create({ + component: ViewMediaPage, + cssClass: 'modal modal-desktop', + componentProps: { + image: msg.attachments[0].safeFile, + type: msg.attachments[0].mimeType, + username: msg.attachments[0].description, + _updatedAt: msg.sentAt + } + }); + modal.present(); + } else { + + this.downloadFileFromBrowser(msg.attachments[0].description, msg) + } + + } else { + if (msg.attachments[0].mimeType.includes('image')) { + const modal = await this.modalController.create({ + component: ViewMediaPage, + cssClass: 'modal modal-desktop', + componentProps: { + image: msg.attachments[0].safeFile, + type: msg.attachments[0].mimeType, + username: msg.attachments[0].description, + _updatedAt: msg.sentAt + } + }); + modal.present(); + } else { + this.openFile(msg.attachments[0].safeFile, msg.attachments[0].description, msg.attachments[0].mimeType); + } + } + + } + } + + } + + imageSize(img) { + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + canvas.width = 300 + canvas.height = 234 + ctx.drawImage(img.attachments[0].image_url, 0, 0, 300, 234); + document.body.appendChild(canvas); + } + + getPicture(img) { + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + canvas.width = 300 + canvas.height = 234 + ctx.drawImage(img.attachments[0].image_url, 0, 0, 300, 234); + document.body.appendChild(canvas); + + } + + // dataURItoBlobIso(dataURI: any) { + // const byteString = window.atob(dataURI); + // const arrayBuffer = new ArrayBuffer(byteString.length); + // const int8Array = new Uint8Array(arrayBuffer); + // for (let i = 0; i < byteString.length; i++) { + // int8Array[i] = byteString.charCodeAt(i); + // } + // const blob = new Blob([int8Array], { type: 'application/pdf' }); + // return blob; + // } + + + messageDelete(message: MessageViewModal) { + this.chatServiceService.messageDelete({ + messageId: message.id, + roomId: this.roomId, + }) + } + + async editMessage(message: any) { + + const modal = await this.popoverController.create({ + component: EditMessagePage, + cssClass: 'edit-message', + componentProps: { + message: message.message, + roomId: this.roomId, + } + }); + + modal.present() + + return modal.onDidDismiss().then((res) => { + + if(res.data) { + this.chatServiceService.updateMessage({ + memberId: SessionStore.user.UserId, + message: res.data.message, + messageId: message.id, + requestId: '', + roomId: this.roomId + }) + } + + }); + } + + toggleEmojiPicker(message: MessageViewModal) { + if (this.selectedMessage === message) { + this.selectedMessage = null; // Close the picker if it's already open + } else { + this.handleClickActive = true + this.selectedMessage = message; // Open the picker for the selected message + } + } + + addReaction(message: any, emoji: string) { + // Logic to add reaction to the message + console.log(`Reacting to message ${message.id} with emoji ${emoji.codePointAt(0).toString(16)}`); + this.selectedMessage = null; // Close the picker after adding reaction + + this.chatServiceService.reactToMessage({ + memberId: SessionStore.user.UserId, + messageId: message.id, + roomId: this.roomId, + reaction: emoji, + requestId: '' + }) + + } + + sendTyping() { + this.UserTypingRemoteRepositoryService.sendTyping(this.roomId) + } +} diff --git a/src/app/shared/chat/new-group/contacts/contacts-routing.module.ts b/src/app/ui/chat/modal/new-group/contacts/contacts-routing.module.ts similarity index 100% rename from src/app/shared/chat/new-group/contacts/contacts-routing.module.ts rename to src/app/ui/chat/modal/new-group/contacts/contacts-routing.module.ts diff --git a/src/app/pages/chat/new-group/contacts/contacts.module.ts b/src/app/ui/chat/modal/new-group/contacts/contacts.module.ts similarity index 100% rename from src/app/pages/chat/new-group/contacts/contacts.module.ts rename to src/app/ui/chat/modal/new-group/contacts/contacts.module.ts diff --git a/src/app/pages/chat/new-group/contacts/contacts.page.html b/src/app/ui/chat/modal/new-group/contacts/contacts.page.html similarity index 100% rename from src/app/pages/chat/new-group/contacts/contacts.page.html rename to src/app/ui/chat/modal/new-group/contacts/contacts.page.html diff --git a/src/app/pages/chat/new-group/contacts/contacts.page.scss b/src/app/ui/chat/modal/new-group/contacts/contacts.page.scss similarity index 100% rename from src/app/pages/chat/new-group/contacts/contacts.page.scss rename to src/app/ui/chat/modal/new-group/contacts/contacts.page.scss diff --git a/src/app/shared/chat/new-group/contacts/contacts.page.spec.ts b/src/app/ui/chat/modal/new-group/contacts/contacts.page.spec.ts similarity index 100% rename from src/app/shared/chat/new-group/contacts/contacts.page.spec.ts rename to src/app/ui/chat/modal/new-group/contacts/contacts.page.spec.ts diff --git a/src/app/pages/chat/new-group/contacts/contacts.page.ts b/src/app/ui/chat/modal/new-group/contacts/contacts.page.ts similarity index 100% rename from src/app/pages/chat/new-group/contacts/contacts.page.ts rename to src/app/ui/chat/modal/new-group/contacts/contacts.page.ts diff --git a/src/app/pages/chat/new-group/new-group-routing.module.ts b/src/app/ui/chat/modal/new-group/new-group-routing.module.ts similarity index 100% rename from src/app/pages/chat/new-group/new-group-routing.module.ts rename to src/app/ui/chat/modal/new-group/new-group-routing.module.ts diff --git a/src/app/pages/chat/new-group/new-group.module.ts b/src/app/ui/chat/modal/new-group/new-group.module.ts similarity index 100% rename from src/app/pages/chat/new-group/new-group.module.ts rename to src/app/ui/chat/modal/new-group/new-group.module.ts diff --git a/src/app/pages/chat/new-group/new-group.page.html b/src/app/ui/chat/modal/new-group/new-group.page.html similarity index 100% rename from src/app/pages/chat/new-group/new-group.page.html rename to src/app/ui/chat/modal/new-group/new-group.page.html diff --git a/src/app/pages/chat/new-group/new-group.page.scss b/src/app/ui/chat/modal/new-group/new-group.page.scss similarity index 100% rename from src/app/pages/chat/new-group/new-group.page.scss rename to src/app/ui/chat/modal/new-group/new-group.page.scss diff --git a/src/app/shared/chat/new-group/new-group.page.spec.ts b/src/app/ui/chat/modal/new-group/new-group.page.spec.ts similarity index 100% rename from src/app/shared/chat/new-group/new-group.page.spec.ts rename to src/app/ui/chat/modal/new-group/new-group.page.spec.ts diff --git a/src/app/pages/chat/new-group/new-group.page.ts b/src/app/ui/chat/modal/new-group/new-group.page.ts similarity index 63% rename from src/app/pages/chat/new-group/new-group.page.ts rename to src/app/ui/chat/modal/new-group/new-group.page.ts index b31738dac..74e81adc6 100644 --- a/src/app/pages/chat/new-group/new-group.page.ts +++ b/src/app/ui/chat/modal/new-group/new-group.page.ts @@ -3,7 +3,6 @@ import { ModalController, NavParams, PickerController, PopoverController } from import { GroupDurationPage } from 'src/app/shared/popover/group-duration/group-duration.page'; import { GroupContactsPage } from '../group-messages/group-contacts/group-contacts.page'; import { ThemeService } from 'src/app/services/theme.service'; -import { ChatSystemService } from 'src/app/services/chat/chat-system.service'; import { SessionStore } from 'src/app/store/session.service'; import { ToastService } from 'src/app/services/toast.service'; import { catchError } from 'rxjs/operators'; @@ -30,7 +29,7 @@ export class NewGroupPage implements OnInit { private modalController: ModalController, private navParams: NavParams, public ThemeService: ThemeService, - public ChatSystemService: ChatSystemService, + // public ChatSystemService: ChatSystemService, private toastService: ToastService, ) { this.loggedUserChat = SessionStore.user.ChatData['data']; @@ -60,133 +59,133 @@ export class NewGroupPage implements OnInit { async createGroup() { - let name = this.groupName.split(' ').join('-'); - //Take out all special characters in string - name = name.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); + // let name = this.groupName.split(' ').join('-'); + // //Take out all special characters in string + // name = name.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); - let customFields = {} - let res: any; + // let customFields = {} + // let res: any; - if(!SessionStore.user?.ChatData?.data) { - this.toastService._successMessage("Chat temporariamente indisponível") - } + // if(!SessionStore.user?.ChatData?.data) { + // this.toastService._successMessage("Chat temporariamente indisponível") + // } - try { + // try { - if (this.thedate) { - let customFields = { - "countDownDate": this.thedate - } - res = await this.ChatSystemService.createPrivateRoom(name, SessionStore.user.UserName, customFields); - } - else { - res = await this.ChatSystemService.createPrivateRoom(name, SessionStore.user.UserName, customFields); - } + // if (this.thedate) { + // let customFields = { + // "countDownDate": this.thedate + // } + // res = await this.ChatSystemService.createPrivateRoom(name, SessionStore.user.UserName, customFields); + // } + // else { + // res = await this.ChatSystemService.createPrivateRoom(name, SessionStore.user.UserName, customFields); + // } - try { - this.isGroupCreated = true; - this.addContacts(res.result); - this.ChatSystemService.getRoom([res.result]); + // try { + // this.isGroupCreated = true; + // this.addContacts(res.result); + // this.ChatSystemService.getRoom([res.result]); - setTimeout(() => { - this.ChatSystemService.subscribeToRoomUpdate(res.result.rid, res.result); - }, 10) + // setTimeout(() => { + // this.ChatSystemService.subscribeToRoomUpdate(res.result.rid, res.result); + // }, 10) - } catch (error) { - await this.ChatSystemService.getUser(); - await this.ChatSystemService.getAllRooms(); - await this.ChatSystemService.subscribeToRoom(); + // } catch (error) { + // await this.ChatSystemService.getUser(); + // await this.ChatSystemService.getAllRooms(); + // await this.ChatSystemService.subscribeToRoom(); - this.isGroupCreated = true; - this.addContacts(res.result); - this.ChatSystemService.getRoom([res.result]); + // this.isGroupCreated = true; + // this.addContacts(res.result); + // this.ChatSystemService.getRoom([res.result]); - setTimeout(() => { - this.ChatSystemService.subscribeToRoomUpdate(res.result.rid, res.result); - }, 10) + // setTimeout(() => { + // this.ChatSystemService.subscribeToRoomUpdate(res.result.rid, res.result); + // }, 10) - } + // } - if (res?.result?.rid) { + // if (res?.result?.rid) { - this.ChatSystemService.getAllRooms(() => { - if (!this.ChatSystemService.getGroupRoom(res.result.rid)) { - this.createGroupWithAttachmentsCath(res) - } else { - setTimeout(() => { + // this.ChatSystemService.getAllRooms(() => { + // if (!this.ChatSystemService.getGroupRoom(res.result.rid)) { + // this.createGroupWithAttachmentsCath(res) + // } else { + // setTimeout(() => { - this.createGroupWithAttachments(res) + // this.createGroupWithAttachments(res) - }, 500) - } - }, res.result.rid); + // }, 500) + // } + // }, res.result.rid); - } else { + // } else { - this.toastService._badRequest('Existe um grupo com este nome!'); + // this.toastService._badRequest('Existe um grupo com este nome!'); - } + // } - } catch(error) { - this.toastService._successMessage("Chat temporariamente indisponível") - } + // } catch(error) { + // this.toastService._successMessage("Chat temporariamente indisponível") + // } } createGroupWithAttachmentsCath(res: any) { - if (!this.ChatSystemService.getGroupRoom(res.result.rid)) { - setTimeout(() => { - this.createGroupWithAttachmentsCath(res) - }, 1500) - } else { - this.createGroupWithAttachments(res) - } + // if (!this.ChatSystemService.getGroupRoom(res.result.rid)) { + // setTimeout(() => { + // this.createGroupWithAttachmentsCath(res) + // }, 1500) + // } else { + // this.createGroupWithAttachments(res) + // } } createGroupWithAttachments(res: any) { - this.ChatSystemService.getGroupRoom(res.result.rid).hasLoadHistory = true; + // this.ChatSystemService.getGroupRoom(res.result.rid).hasLoadHistory = true; - if (this.documents) { - this.documents.forEach(element => { - this.ChatSystemService.getGroupRoom(res.result.rid).send({ - file: { - "name": element.Assunto, - "type": "application/webtrix", - "ApplicationId": element.ApplicationId, - "DocId": element.DocId, - "Assunto": element.Assunto, - }, - temporaryData: { - data: { - selected: { - Id: element.DocId, - ApplicationType: element.ApplicationId - } - } - }, - attachments: [{ - "title": element.Assunto, - "description": element.Assunto, - "title_link_download": true, - "type": "webtrix", - "text": element.Assunto, - "thumb_url": "https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png", - }], - }) - }); - } + // if (this.documents) { + // this.documents.forEach(element => { + // this.ChatSystemService.getGroupRoom(res.result.rid).send({ + // file: { + // "name": element.Assunto, + // "type": "application/webtrix", + // "ApplicationId": element.ApplicationId, + // "DocId": element.DocId, + // "Assunto": element.Assunto, + // }, + // temporaryData: { + // data: { + // selected: { + // Id: element.DocId, + // ApplicationType: element.ApplicationId + // } + // } + // }, + // attachments: [{ + // "title": element.Assunto, + // "description": element.Assunto, + // "title_link_download": true, + // "type": "webtrix", + // "text": element.Assunto, + // "thumb_url": "https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png", + // }], + // }) + // }); + // } - this.ChatSystemService.getAllRooms(); + // this.ChatSystemService.getAllRooms(); - setTimeout(() => { - this.groupName = "" - }, 150); + // setTimeout(() => { + // this.groupName = "" + // }, 150); } async addContacts(room) { diff --git a/src/app/shared/chat/add-user/add-user-routing.module.ts b/src/app/ui/chat/modal/room-info/room-info-routing.module.ts similarity index 66% rename from src/app/shared/chat/add-user/add-user-routing.module.ts rename to src/app/ui/chat/modal/room-info/room-info-routing.module.ts index 49bc8b4fe..e3e0b05ed 100644 --- a/src/app/shared/chat/add-user/add-user-routing.module.ts +++ b/src/app/ui/chat/modal/room-info/room-info-routing.module.ts @@ -1,12 +1,12 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; -import { AddUserPage } from './add-user.page'; +import { RoomInfoPage } from './room-info.page'; const routes: Routes = [ { path: '', - component: AddUserPage + component: RoomInfoPage } ]; @@ -14,4 +14,4 @@ const routes: Routes = [ imports: [RouterModule.forChild(routes)], exports: [RouterModule], }) -export class AddUserPageRoutingModule {} +export class RoomInfoPageRoutingModule {} diff --git a/src/app/shared/chat/add-user/add-user.module.ts b/src/app/ui/chat/modal/room-info/room-info.module.ts similarity index 55% rename from src/app/shared/chat/add-user/add-user.module.ts rename to src/app/ui/chat/modal/room-info/room-info.module.ts index 78b0aaeca..0ed13b22b 100644 --- a/src/app/shared/chat/add-user/add-user.module.ts +++ b/src/app/ui/chat/modal/room-info/room-info.module.ts @@ -4,17 +4,17 @@ import { FormsModule } from '@angular/forms'; import { IonicModule } from '@ionic/angular'; -import { AddUserPageRoutingModule } from './add-user-routing.module'; +import { RoomInfoPageRoutingModule } from './room-info-routing.module'; -import { AddUserPage } from './add-user.page'; +import { RoomInfoPage } from './room-info.page'; @NgModule({ imports: [ CommonModule, FormsModule, IonicModule, - AddUserPageRoutingModule + RoomInfoPageRoutingModule ], - declarations: [AddUserPage] + declarations: [RoomInfoPage] }) -export class AddUserPageModule {} +export class RoomInfoPageModule {} diff --git a/src/app/ui/chat/modal/room-info/room-info.page.html b/src/app/ui/chat/modal/room-info/room-info.page.html new file mode 100644 index 000000000..9d01b7a15 --- /dev/null +++ b/src/app/ui/chat/modal/room-info/room-info.page.html @@ -0,0 +1,22 @@ + + + {{ roomData.roomName }} + + + + + +
Membros
+ + +
+
+
+ +
+ + {{ user.wxFullName }} (admin do group) +
+
+
+
diff --git a/src/app/ui/chat/modal/room-info/room-info.page.scss b/src/app/ui/chat/modal/room-info/room-info.page.scss new file mode 100644 index 000000000..af32e9a90 --- /dev/null +++ b/src/app/ui/chat/modal/room-info/room-info.page.scss @@ -0,0 +1,22 @@ +img { + background-color: gray; + border-radius: 20px; + -webkit-border-radius: 20px; + -moz-border-radius: 20px; + -ms-border-radius: 20px; + -o-border-radius: 20px; + height: 35px; + width: 35px; + object-fit: cover; +} + +.image-container { + height: 35px; + width: 35px; + background-color: gray; + border-radius: 20px; +} + +.admin { + color: gray; +} diff --git a/src/app/shared/chat/add-user/add-user.page.spec.ts b/src/app/ui/chat/modal/room-info/room-info.page.spec.ts similarity index 62% rename from src/app/shared/chat/add-user/add-user.page.spec.ts rename to src/app/ui/chat/modal/room-info/room-info.page.spec.ts index 382032742..2957a2c6a 100644 --- a/src/app/shared/chat/add-user/add-user.page.spec.ts +++ b/src/app/ui/chat/modal/room-info/room-info.page.spec.ts @@ -1,19 +1,19 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { IonicModule } from '@ionic/angular'; -import { AddUserPage } from './add-user.page'; +import { RoomInfoPage } from './room-info.page'; -describe('AddUserPage', () => { - let component: AddUserPage; - let fixture: ComponentFixture; +describe('RoomInfoPage', () => { + let component: RoomInfoPage; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ AddUserPage ], + declarations: [ RoomInfoPage ], imports: [IonicModule.forRoot()] }).compileComponents(); - fixture = TestBed.createComponent(AddUserPage); + fixture = TestBed.createComponent(RoomInfoPage); component = fixture.componentInstance; fixture.detectChanges(); })); diff --git a/src/app/ui/chat/modal/room-info/room-info.page.ts b/src/app/ui/chat/modal/room-info/room-info.page.ts new file mode 100644 index 000000000..7c261a76f --- /dev/null +++ b/src/app/ui/chat/modal/room-info/room-info.page.ts @@ -0,0 +1,56 @@ +import { Component, OnInit } from '@angular/core'; +import { NavParams } from '@ionic/angular'; +import { Observable } from 'rxjs'; +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member/member-list-local-repository.service' +import { RoomLocalRepository } from 'src/app/module/chat/data/repository/room/room-local-repository.service' +import { RoomTable } from 'src/app/infra/database/dexie/instance/chat/schema/room'; +import { map, tap } from 'rxjs/operators'; +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service' +import { MemberEntity } from 'src/app/core/chat/entity/member'; +@Component({ + selector: 'app-room-info', + templateUrl: './room-info.page.html', + styleUrls: ['./room-info.page.scss'], +}) +export class RoomInfoPage implements OnInit { + + roomId:string; + roomMembers$: Observable + roomData$: Observable + ObjectURL : {[key: string]: string} = {}; + + constructor( + private navParams: NavParams, + private MemberListLocalRepository: MemberListLocalRepository, + private RoomLocalRepository: RoomLocalRepository, + private ChatServiceService: ChatServiceService + ) { + this.roomId = this.navParams.get('roomId'); + } + + ngOnInit() { + + // this.roomMessage$ = this.messageRepositoryService.getItemsLive(this.roomId) + this.roomMembers$ = this.MemberListLocalRepository.getRoomMemberByIdLive(this.roomId).pipe( + map((memberList) => memberList.map(e => Object.assign(new MemberEntity(), e))), + tap((members) => { + for(let member of members) { + + if(!this.ObjectURL[member.wxUserId] && member.hasPhoto()) { + this.ChatServiceService.getUserPhoto({wxUserId: member.wxUserId, attachmentId: member.userPhoto}).then((result)=> { + + if(result.isOk()) { + console.log('get photo', result.value) + this.ObjectURL[member.wxUserId] = 'data:image/jpeg;base64,'+result.value + } + }) + } + } + }), + + ) + + this.roomData$ = this.RoomLocalRepository.getRoomByIdLive(this.roomId) + } + +} diff --git a/src/app/modals/set-room-owner/set-room-owner-routing.module.ts b/src/app/ui/chat/modal/set-room-owner/set-room-owner-routing.module.ts similarity index 100% rename from src/app/modals/set-room-owner/set-room-owner-routing.module.ts rename to src/app/ui/chat/modal/set-room-owner/set-room-owner-routing.module.ts diff --git a/src/app/modals/set-room-owner/set-room-owner.module.ts b/src/app/ui/chat/modal/set-room-owner/set-room-owner.module.ts similarity index 100% rename from src/app/modals/set-room-owner/set-room-owner.module.ts rename to src/app/ui/chat/modal/set-room-owner/set-room-owner.module.ts diff --git a/src/app/modals/set-room-owner/set-room-owner.page.html b/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.html similarity index 87% rename from src/app/modals/set-room-owner/set-room-owner.page.html rename to src/app/ui/chat/modal/set-room-owner/set-room-owner.page.html index b7c598e85..4235c2393 100644 --- a/src/app/modals/set-room-owner/set-room-owner.page.html +++ b/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.html @@ -24,9 +24,8 @@ -
- - +
+
{{header}} @@ -34,7 +33,7 @@
-

{{user.name}}

+

{{user.wxFullName}}

diff --git a/src/app/modals/set-room-owner/set-room-owner.page.scss b/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.scss similarity index 100% rename from src/app/modals/set-room-owner/set-room-owner.page.scss rename to src/app/ui/chat/modal/set-room-owner/set-room-owner.page.scss diff --git a/src/app/modals/set-room-owner/set-room-owner.page.spec.ts b/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.spec.ts similarity index 100% rename from src/app/modals/set-room-owner/set-room-owner.page.spec.ts rename to src/app/ui/chat/modal/set-room-owner/set-room-owner.page.spec.ts diff --git a/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.ts b/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.ts new file mode 100644 index 000000000..bf70e4708 --- /dev/null +++ b/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.ts @@ -0,0 +1,79 @@ + +import { Component, OnInit } from '@angular/core'; +import { ModalController, NavParams } from '@ionic/angular'; +; +import { ThemeService } from 'src/app/services/theme.service' +import { ToastService } from 'src/app/services/toast.service'; +import { Observable as DexieObservable } from 'Dexie'; +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member/member-list-local-repository.service' +import { MemberTable } from 'src/app/infra/database/dexie/instance/chat/schema/members'; + +@Component({ + selector: 'app-set-room-owner', + templateUrl: './set-room-owner.page.html', + styleUrls: ['./set-room-owner.page.scss'], +}) +export class SetRoomOwnerPage implements OnInit { + + textSearch:string = ""; + roomId:any; + members:any; + roomMembers$!: DexieObservable + + constructor( + private modalController: ModalController, + private navParams: NavParams, + public ThemeService: ThemeService, + private toastService: ToastService, + private chatServiceService: ChatServiceService, + private MemberListLocalRepository: MemberListLocalRepository + ) { + this.roomId = this.navParams.get('roomId'); + this.members = this.navParams.get('members'); + } + + ngOnInit() { + // this.chatService.refreshtoken(); + this.roomMembers$ = this.MemberListLocalRepository.getRoomMemberNoneAdminByIdLive(this.roomId) as any + } + + async close() { + this.modalController.dismiss(); + } + + onChange(event: any) { + this.textSearch = event.detail.value; + } + + separateLetter(record:MemberTable, recordIndex: number, records:MemberTable[]) { + if(recordIndex == 0){ + return record.wxFullName[0]; + } + + let first_prev = records[recordIndex - 1].wxFullName[0]; + let first_current = record.wxFullName[0]; + + if(first_prev != first_current){ + return first_current; + } + return null; + } + + async setRoomOwner(user:MemberTable) { + + const result = await this.chatServiceService.setAdmin({ + roomId: user.roomId, + memberId: user.wxUserId.toString() + }); + + if(result.isOk()) { + this.chatServiceService.getRoomById(this.roomId); + // this.modalController.dismiss('success'); + } else { + this.toastService._badRequest('Não foi possível completar a ação, por favor tente novamente.'); + } + + } + +} diff --git a/src/app/ui/chat/modal/view-onces/view-onces-routing.module.ts b/src/app/ui/chat/modal/view-onces/view-onces-routing.module.ts new file mode 100644 index 000000000..fb1fad422 --- /dev/null +++ b/src/app/ui/chat/modal/view-onces/view-onces-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { ViewOncesImagePage } from './view-onces.page'; + +const routes: Routes = [ + { + path: '', + component: ViewOncesImagePage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class ViewOncesPageRoutingModule {} diff --git a/src/app/ui/chat/modal/view-onces/view-onces.module.ts b/src/app/ui/chat/modal/view-onces/view-onces.module.ts new file mode 100644 index 000000000..1d3a6125c --- /dev/null +++ b/src/app/ui/chat/modal/view-onces/view-onces.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { ViewOncesPageRoutingModule } from './view-onces-routing.module'; + +import { ViewOncesImagePage } from './view-onces.page'; +import { PipesModule } from 'src/app/pipes/pipes.module'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + ViewOncesPageRoutingModule, + PipesModule + ], + declarations: [ViewOncesImagePage] +}) +export class ViewOncesPageModule {} diff --git a/src/app/ui/chat/modal/view-onces/view-onces.page.html b/src/app/ui/chat/modal/view-onces/view-onces.page.html new file mode 100644 index 000000000..0e651658b --- /dev/null +++ b/src/app/ui/chat/modal/view-onces/view-onces.page.html @@ -0,0 +1,24 @@ + + + Vizualização única + + + + + + + + + +
+ + + +
+
diff --git a/src/app/ui/chat/modal/view-onces/view-onces.page.scss b/src/app/ui/chat/modal/view-onces/view-onces.page.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/ui/chat/modal/view-onces/view-onces.page.spec.ts b/src/app/ui/chat/modal/view-onces/view-onces.page.spec.ts new file mode 100644 index 000000000..e58600e4b --- /dev/null +++ b/src/app/ui/chat/modal/view-onces/view-onces.page.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { ViewOncesPage } from './view-onces.page'; + +describe('ViewOncesPage', () => { + let component: ViewOncesPage; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ ViewOncesPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(ViewOncesPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/ui/chat/modal/view-onces/view-onces.page.ts b/src/app/ui/chat/modal/view-onces/view-onces.page.ts new file mode 100644 index 000000000..21bd372c9 --- /dev/null +++ b/src/app/ui/chat/modal/view-onces/view-onces.page.ts @@ -0,0 +1,43 @@ +import { Component, OnInit } from '@angular/core'; +import { NavParams, ModalController } from '@ionic/angular'; +import { z } from 'zod'; + + +const ViewOncesImagePageInputSchema = z.object({ + // messageId: z.string(), + // attachmentIndex: z.number(), + imageDataUrl: z.string() +}) + +export type ViewOncesImagePageInput = z.infer + +@Component({ + selector: 'app-view-onces', + templateUrl: './view-onces.page.html', + styleUrls: ['./view-onces.page.scss'], +}) +export class ViewOncesImagePage implements OnInit { + + params: ViewOncesImagePageInput + blobURl: Boolean; + + constructor( + private navParams: NavParams, + public modalController: ModalController, + ) { + this.params = this.navParams.data + + } + + ngOnInit() { + if(this.params.imageDataUrl.startsWith('blob:http')) { + this.blobURl = true + } else { + this.blobURl = false + } + } + + closePage() { + this.modalController.dismiss({}) + } +} diff --git a/src/app/ui/chat/requirements.readme.md b/src/app/ui/chat/requirements.readme.md new file mode 100644 index 000000000..eb491636c --- /dev/null +++ b/src/app/ui/chat/requirements.readme.md @@ -0,0 +1,31 @@ +# Gabinete Digital Chat + +## Descrição + +Este modulo que permite aos utilizadores criar grupos, enviar mensagens em tempo real e visualizar detalhes do grupo. O administrador do grupo é destacado na lista de membros, proporcionando uma forma clara e eficaz de gerir a comunicação em grupos. + +## Funcionalidades + + +- **Exibição de Detalhes do Grupo**: Visualização de informações como nome do grupo, lista de membros e destaque do administrador. + +## Requisitos + +### Requisitos Funcionais + +- Exibição de detalhes do grupo e destaque do administrador. + +### Requisitos Não Funcionais + +- **Usabilidade** + - A interface do utilizador deve ser intuitiva e fácil de navegar. + - Os detalhes do grupo e a identificação do administrador devem ser claramente visíveis e de fácil acesso. + + +## Utilização + + +- **Gestão de Grupos**: O administrador do grupo pode adicionar ou remover membros e alterar os detalhes do grupo. \ No newline at end of file diff --git a/src/app/ui/chat/store/model/message.ts b/src/app/ui/chat/store/model/message.ts new file mode 100644 index 000000000..a44719177 --- /dev/null +++ b/src/app/ui/chat/store/model/message.ts @@ -0,0 +1,107 @@ +import { MessageEntity, MessageEntitySchema, IMessageType, IMessage, MessageEntityAttachmentSchema } from "src/app/core/chat/entity/message"; +import { SessionStore } from "src/app/store/session.service"; +import { z } from "zod"; + + +const MessageViewModalSchema = MessageEntitySchema.pick({ + $id: true, + canEdit: true, + editedAt: true, + id: true, + info: true, + isDeleted: true, + message: true, + messageType: true, + oneShot: true, + origin: true, + reactions: true, + receiverId: true, + requestId: true, + requireUnlock: true, + roomId: true, + sendAttemp: true, + sender: true, + sending: true, + sentAt: true +}).extend({ + attachments: MessageEntityAttachmentSchema.extend({ + blobURl: z.boolean() + }).array().optional() +}) + +export type i = z.infer +export class MessageViewModal { + + $id?: string + id?: string + roomId?: string + receiverId?: number + message?: string + canEdit: boolean = false + oneShot: boolean = false + sentAt?: string + requireUnlock: boolean = false + info: typeof MessageViewModalSchema._type.info = [] + sender!: typeof MessageViewModalSchema._type.sender + sending: boolean = false + sendAttemp = 0 + messageType = IMessageType.normal + attachments: typeof MessageViewModalSchema._type.attachments = [] + reactions: typeof MessageViewModalSchema._type.reactions = [] + requestId: string + isDeleted: typeof MessageViewModalSchema._type.isDeleted = false + + status!: 'allViewed' | 'allReceived'| 'enviado'| 'enviar' + messageUiType!: 'info-meeting'| 'my-message'| 'other-message' + showReaction = false + showMessage = false + ballon = false + + constructor(model?: IMessage) { + if(model) { + Object.assign(this, model) + } + this.setMessageUIType() + + if(this.isDeleted != true && this.messageType != IMessageType.information) { + this.showReaction = true + } + if(this.isDeleted == false && this.messageType == IMessageType.normal) { + this.showMessage = true + } + } + + setMessageUIType() { + if(this.messageType == IMessageType.information) { + this.messageUiType = 'info-meeting' + } else if (this.sender?.wxUserId === SessionStore.user.UserId) { + this.messageUiType = 'my-message' + } else { + this.messageUiType = 'other-message' + } + } + + delete() { + this.showMessage = false + this.isDeleted = true + } + + + get messageStatus() { + if(this.id) { + return 'send' + } + } + + get hasAttachment() { + return this.attachments.length >= 1 + } + + haveSeen(info: typeof MessageEntitySchema._type.info) { + return info.filter(e => typeof e.readAt == 'string' && e.memberId == SessionStore.user.UserId).length == 1 + } + + meSender() { + return this.sender.wxUserId == SessionStore.user.UserId + } +} diff --git a/src/app/ui/chat/store/model/room.ts b/src/app/ui/chat/store/model/room.ts new file mode 100644 index 000000000..b145d6c82 --- /dev/null +++ b/src/app/ui/chat/store/model/room.ts @@ -0,0 +1,76 @@ +import { IRoom, RoomEntitySchema } from "src/app/core/chat/entity/group"; +import { MessageAttachmentSource } from "src/app/core/chat/entity/message"; +import { isDocument } from "src/app/utils/document-mimetype"; + +export class RoomViewModel implements IRoom { + + id: typeof RoomEntitySchema._input.id + roomName: typeof RoomEntitySchema._input.roomName + createdBy: typeof RoomEntitySchema._input.createdBy + createdAt: typeof RoomEntitySchema._input.createdAt + expirationDate: typeof RoomEntitySchema._input.expirationDate + roomType: typeof RoomEntitySchema._input.roomType + members: typeof RoomEntitySchema._input.members + messages: typeof RoomEntitySchema._input.messages + displayDate = '' + lastMessageImage = false + lastMessageDocument = false + + constructor(model: IRoom) { + Object.assign(this, model) + this.formatarData() + + this.check() + } + + check() { + if(this.messages?.[0]?.attachments[0]?.mimeType?.startsWith('image/') ) { + this.lastMessageImage = true + } else if (this.messages?.[0]?.attachments[0]?.mimeType && isDocument({mimeType: this.messages?.[0]?.attachments[0]?.mimeType})) { + this.lastMessageDocument = true + } else if (this.messages?.[0]?.attachments[0]?.source == MessageAttachmentSource.Webtrix) { + this.lastMessageDocument = true + } + } + + formatarData() { + if(this.messages?.[0]?.sentAt) { + + const dataMensagem = new Date(this.messages[0].sentAt); + const agora = new Date(); + + const hoje = new Date(agora.getFullYear(), agora.getMonth(), agora.getDate()); + const ontem = new Date(hoje); + ontem.setDate(hoje.getDate() - 1); + + const diasDaSemana = ["Domingo", "Segunda-feira", "Terça-feira", "Quarta-feira", "Quinta-feira", "Sexta-feira", "Sábado"]; + + // Verifica se a mensagem foi enviada hoje + if (dataMensagem >= hoje) { + this.displayDate = dataMensagem.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false }); + return + } + + // Verifica se a mensagem foi enviada ontem + if (dataMensagem >= ontem && dataMensagem < hoje) { + this.displayDate = "Ontem"; + return + } + + // Verifica se a mensagem foi enviada nesta semana + const inicioDaSemana = new Date(hoje); + inicioDaSemana.setDate(hoje.getDate() - hoje.getDay()); + + if (dataMensagem >= inicioDaSemana) { + this.displayDate = diasDaSemana[dataMensagem.getDay()]; + return + } + + // Se a mensagem foi enviada antes desta semana + this.displayDate = dataMensagem.toLocaleDateString("pt-BR"); // Formato: DD/MM/AAAA + return + } + } + + +} diff --git a/src/app/ui/chat/store/roomStore.ts b/src/app/ui/chat/store/roomStore.ts new file mode 100644 index 000000000..7cda3c435 --- /dev/null +++ b/src/app/ui/chat/store/roomStore.ts @@ -0,0 +1,53 @@ +import { Injectable } from '@angular/core'; +import { MessageViewModal } from './model/message'; +import { MessageLocalDataSourceService } from 'src/app/module/chat/data/repository/message/message-local-data-source.service'; +import { whatsappDate } from '../../shared/utils/whatappdate'; +import { XBallon } from '../utils/messageBallon'; + +@Injectable({ + providedIn: 'root' +}) +export class RoomStore { + + roomId: string; + date: {[key: string]: Object} = {} + + constructor( + private messageLocalDataSourceService: MessageLocalDataSourceService, + ) {} + + openRoom() { + + } + messages1: {[key: string]: MessageViewModal[]} = {} + + async getMessages() { + + // dont remove this line + this.messages1[this.roomId] = [] + let messages = await this.messageLocalDataSourceService.getItems(this.roomId) + + this.messages1[this.roomId] = [] + this.date = {} + const allMessage = []; + + console.time("mappingTime"); + for(const message of messages) { + const date = whatsappDate(message.sentAt, false) + if(!this.date[date]) { + this.date[date] = true + const Ballon = XBallon(message) + allMessage.push(Ballon) + } + + allMessage.push(new MessageViewModal(message)) + } + console.timeEnd("mappingTime"); + + this.messages1[this.roomId] = allMessage + + // if(messages.length >= 1) { + // this.messages1[this.roomId].push(LastMessage) + // } + } +} diff --git a/src/app/ui/chat/utils/lastMessage.ts b/src/app/ui/chat/utils/lastMessage.ts new file mode 100644 index 000000000..a394a688f --- /dev/null +++ b/src/app/ui/chat/utils/lastMessage.ts @@ -0,0 +1,22 @@ +import { MessageAttachmentFileType, MessageAttachmentSource, MessageEntity } from "src/app/core/chat/entity/message"; +import { SessionStore } from "src/app/store/session.service"; + +export const LastMessage = new MessageEntity() + +LastMessage.sentAt = new Date().toISOString() + +LastMessage.message = 'last' +LastMessage.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId +} + +LastMessage.attachments = [{ + safeFile: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/wcAAwAB/BO5RfQAAAAASUVORK5CYII=', + fileName: "lastMessageUUID", + source: MessageAttachmentSource.Device, + fileType: MessageAttachmentFileType.Image, + mimeType: 'image/png', +}] diff --git a/src/app/ui/chat/utils/messageBallon.ts b/src/app/ui/chat/utils/messageBallon.ts new file mode 100644 index 000000000..224ee9cbd --- /dev/null +++ b/src/app/ui/chat/utils/messageBallon.ts @@ -0,0 +1,25 @@ +import { SessionStore } from "src/app/store/session.service"; +import { MessageViewModal } from "../store/model/message"; +import { whatsappDate } from "../../shared/utils/whatappdate"; +import { IMessageType } from "src/app/core/chat/entity/message"; + +export function XBallon(message: any) { + const MessageBallon = new MessageViewModal(message as any) + MessageBallon.$id = '' + MessageBallon.id = '' + MessageBallon.isDeleted = false + MessageBallon.sentAt = message.sentAt + MessageBallon.message = whatsappDate(message.sentAt, false) + MessageBallon.messageType == IMessageType.information + MessageBallon.ballon = true + MessageBallon.sender = { + userPhoto: '', + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId + } + + MessageBallon.showMessage = false + MessageBallon.attachments = []; + return MessageBallon +} diff --git a/src/app/ui/shared/utils/whatappdate.ts b/src/app/ui/shared/utils/whatappdate.ts new file mode 100644 index 000000000..5558f2c35 --- /dev/null +++ b/src/app/ui/shared/utils/whatappdate.ts @@ -0,0 +1,37 @@ +export function whatsappDate(newDate: string, showTodayHours = true) { + + const dataMensagem = new Date(newDate); + const agora = new Date(); + + const hoje = new Date(agora.getFullYear(), agora.getMonth(), agora.getDate()); + const ontem = new Date(hoje); + ontem.setDate(hoje.getDate() - 1); + + const diasDaSemana = ["Domingo", "Segunda-feira", "Terça-feira", "Quarta-feira", "Quinta-feira", "Sexta-feira", "Sábado"]; + + // Verifica se a mensagem foi enviada hoje + if (dataMensagem >= hoje) { + if(showTodayHours) { + return dataMensagem.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false }); + } else { + return 'Hoje'; + } + + } + + // Verifica se a mensagem foi enviada ontem + if (dataMensagem >= ontem && dataMensagem < hoje) { + return "Ontem"; + } + + // Verifica se a mensagem foi enviada nesta semana + const inicioDaSemana = new Date(hoje); + inicioDaSemana.setDate(hoje.getDate() - hoje.getDay()); + + if (dataMensagem >= inicioDaSemana) { + return diasDaSemana[dataMensagem.getDay()]; + } + + // Se a mensagem foi enviada antes desta semana + return dataMensagem.toLocaleDateString("pt-BR"); // Formato: DD/MM/AAAA +} diff --git a/src/app/utils/ToBase64.ts b/src/app/utils/ToBase64.ts new file mode 100644 index 000000000..b01524461 --- /dev/null +++ b/src/app/utils/ToBase64.ts @@ -0,0 +1,162 @@ +import { err, ok, Result } from "neverthrow"; +import { defer, from } from "rxjs"; +import { catchError, timeout } from "rxjs/operators"; + +/** + * Retrieves a `FileReader` instance, accounting for potential Zone.js modifications. + * @returns {FileReader} The original `FileReader` instance or a modified one if applicable. + */ +function getFileReader(): FileReader { + const fileReader = new FileReader(); + const zoneOriginalInstance = (fileReader as any)["__zone_symbol__originalInstance"]; + return zoneOriginalInstance || fileReader; +} + +/** + * Converts a `File` object to a data url encoded string. + * @param {File} file - The file to be converted. + * @returns {Promise>} A promise that resolves with a `Result` object containing either the Base64 encoded string or an error. + */ +export function JSFileToDataUrl(file: File): Promise> { + return new Promise((resolve, reject) => { + var reader = getFileReader(); + reader.readAsDataURL(file); + reader.onload = function () { + resolve(ok(reader.result as string)); + }; + reader.onerror = function (error) { + console.log('Error: ', error); + resolve(err(error)); + }; + }); +} + + + +/** + * Creates a Data URL from a base64-encoded string and MIME type. + * + * @param base64String - The base64-encoded data as a string. This should not include the `data:[mime-type];base64,` prefix. + * @param mimeType - The MIME type of the data (e.g., `image/png`, `application/pdf`). + * + * @returns A Data URL formatted string. + * + * @example + * ```typescript + * const base64String = 'iVBORw0KGgoAAAANSUhEUgAAAAU...'; // Your base64 string + * const mimeType = 'image/png'; // Your MIME type + * + * const dataURL = createDataURL(base64String, mimeType); + * console.log(dataURL); + * ``` + */ +export function createDataURL(base64String: string, mimeType: string): string { + // Make sure the base64 string doesn't have the data URL scheme or extra padding + const cleanedBase64String = base64String.replace(/^data:[a-z]+\/[a-z]+;base64,/, ''); + return `data:${mimeType};base64,${cleanedBase64String}`; +} + + + +export function createBlobFromBase64(base64String: string, mimeType: string): Blob { + // Make sure the base64 string doesn't have the data URL scheme or extra padding + const cleanedBase64String = base64String.replace(/^data:[a-z]+\/[a-z]+;base64,/, ''); + + // Decode the base64 string + const binaryString = atob(cleanedBase64String); + + // Convert binary string to Uint8Array + const bytes = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + + // Create and return the Blob object + return new Blob([bytes], { type: mimeType }); +} + + + + + + + + + +/** + * Converts a `Blob` to a Data URL. + * @param {Blob} blob - The `Blob` to be converted. + * @returns {Promise} A promise that resolves with the Data URL representation of the `Blob`. + * @example const result = 'data:audio/aac;base64,ZGF0YTphdWRpby9hYWM7YmFzZTY0…RnNRQmxmL0FGQUl' + */ +export function convertBlobToDataURL(blob: Blob): Promise { + return new Promise((resolve, reject) => { + const reader = getFileReader(); + + reader.onloadend = () => { + // Resolve the promise with the Data URL + resolve(reader.result as string); + }; + + reader.onerror = () => { + // Reject the promise on error + reject(new Error('Failed to convert Blob to Data URL')); + }; + + // Read the Blob as a Data URL + reader.readAsDataURL(blob); + }); +} + +// export function convertBlobToDataURLWithTimeoutNoThrow(blob: Blob): Promise> { +// const convert = () => new Promise>((resolve, reject) => { +// const reader = new FileReader(); +// reader.onloadend = () => resolve(ok(reader.result as string)); +// reader.onerror = () => resolve(err(new Error('Failed to convert Blob to Data URL'))); +// reader.readAsDataURL(blob); +// }); + +// return defer(() => from(convert())) +// .pipe( +// timeout(15000), +// catchError(error => { +// console.error('Warning: Operation took too long, but continuing:', error); +// return from(convert()); // Continue with the original operation +// }) +// ) +// .toPromise(); +// } + +// export function convertBlobToDataURLWithTimeout(blob: Blob): Promise> { +// return from(new Promise>((resolve, reject) => { +// const reader = getFileReader(); + +// reader.onloadend = () => resolve(ok(reader.result as string)); +// reader.onerror = () => resolve(err(new Error('Failed to convert Blob to Data URL'))); +// reader.readAsDataURL(blob); +// })) +// .pipe( +// timeout(15000), +// catchError(error => { +// console.error('Error: Operation took too long or failed:', error); +// return Promise.resolve(err('timeout')); +// }) +// ) +// .toPromise(); +// } + + +/** + * Converts a `Blob` to a Data URL. + * @param {Blob} blob - The `Blob` to be converted. + * @returns {Promise} A promise that resolves with the Data URL representation of the `Blob`. + * @example result.value = 'data:audio/aac;base64,ZGF0YTphdWRpby9hYWM7YmFzZTY0…RnNRQmxmL0FGQUl' + */ +export function createBlobUrl(blob: Blob): Result { + try { + return ok(URL.createObjectURL(blob)); + } catch (error) { + return err('error '+ error); + } + +} \ No newline at end of file diff --git a/src/app/utils/allowedDocExtension.ts b/src/app/utils/allowedDocExtension.ts new file mode 100644 index 000000000..914de8f1f --- /dev/null +++ b/src/app/utils/allowedDocExtension.ts @@ -0,0 +1,12 @@ +import { err, ok } from "neverthrow" + +export function allowedDocExtension(type: string) { + if (type == 'application/pdf' || type == 'application/doc' || type == 'application/docx' || + type == 'application/xls' || type == 'application/xlsx' || type == 'application/ppt' || + type == 'application/pptx' || type == 'application/txt') { + + return ok(true) + } else { + return err(false) + } +} diff --git a/src/app/utils/date.ts b/src/app/utils/date.ts new file mode 100644 index 000000000..0669eb877 --- /dev/null +++ b/src/app/utils/date.ts @@ -0,0 +1,18 @@ +export class UDate { + static GetDateWithTimeZone(Date: Date) { + let date = Date; + + const tzOffset = -date.getTimezoneOffset(); // in minutes + const diff = tzOffset >= 0 ? '+' : '-'; + const pad = (n: number) => (n < 10 ? '0' : '') + n; + + return date.getFullYear() + + '-' + pad(date.getMonth() + 1) + + '-' + pad(date.getDate()) + + 'T' + pad(date.getHours()) + + ':' + pad(date.getMinutes()) + + ':' + pad(date.getSeconds()) + + diff + pad(Math.floor(Math.abs(tzOffset) / 60)) + + ':' + pad(Math.abs(tzOffset) % 60); + } +} diff --git a/src/app/utils/document-mimetype.ts b/src/app/utils/document-mimetype.ts new file mode 100644 index 000000000..27c1c0794 --- /dev/null +++ b/src/app/utils/document-mimetype.ts @@ -0,0 +1,14 @@ +export function isDocument({mimeType}) { + const documentMimeTypes = [ + 'application/pdf', + 'application/msword', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/vnd.ms-excel', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'application/vnd.ms-powerpoint', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'text/plain' + ]; + + return documentMimeTypes.includes(mimeType); +} diff --git a/src/app/utils/entity.ts b/src/app/utils/entity.ts new file mode 100644 index 000000000..330a43e85 --- /dev/null +++ b/src/app/utils/entity.ts @@ -0,0 +1,34 @@ +import { v4 as uuidv4 } from 'uuid'; +import { ZodSchema, ZodType } from 'zod'; + + + +// export interface IEntity { +// id: string; + +// createdAt: Date; + +// updatedAt: Date; + +// deletedAt?: Date; +// } + +export const BaseEntity = (schema: ZodSchema) => { + abstract class Entity { + readonly id: string; + + readonly createdAt: Date; + + readonly updatedAt: Date; + + deletedAt?: Date; + + static nameOf = (name: keyof T) => name; + + validate(entity: T): ZodType { + return schema.parse(entity); + } + } + + return Entity; +}; diff --git a/src/app/utils/imageCompressore.ts b/src/app/utils/imageCompressore.ts new file mode 100644 index 000000000..eac58129e --- /dev/null +++ b/src/app/utils/imageCompressore.ts @@ -0,0 +1,72 @@ +import { err, ok, Result } from "neverthrow"; + +/** + * Compresses an image represented as a Base64 string. + * + * This function resizes the image to fit within the specified maximum width and height while maintaining the aspect ratio. + * The image is then compressed to a JPEG format with the given quality level. + * + * @param base64String - The Base64 string of the image to be compressed. + * @param maxWidth - The maximum width of the compressed image. The aspect ratio is preserved. + * @param maxHeight - The maximum height of the compressed image. The aspect ratio is preserved. + * @param quality - The quality of the compressed image, ranging from 0 to 1, where 1 is the best quality. + * + * @returns A Promise that resolves to a `Result` containing either: + * - `ok` with the compressed image as a Base64 string, or + * - `err` with an error if the image fails to load or compress. + * + * @example + * ```typescript + * compressImageBase64('data:image/png;base64,...', 800, 600, 0.8) + * .then(result => { + * if (result.isOk()) { + * console.log('Compressed image:', result.value); + * } else { + * console.error('Error compressing image:', result.error); + * } + * }); + * ``` + */ +export function compressImageBase64(base64String: string, maxWidth: number, maxHeight: number, quality: number): Promise> { + return new Promise((resolve, reject) => { + const image = new Image(); + image.src = base64String; + + image.onload = async () => { + const canvas = document.createElement('canvas'); + let newWidth = image.width; + let newHeight = image.height; + + if (newWidth > maxWidth) { + newHeight *= maxWidth / newWidth; + newWidth = maxWidth; + } + + if (newHeight > maxHeight) { + newWidth *= maxHeight / newHeight; + newHeight = maxHeight; + } + + canvas.width = newWidth; + canvas.height = newHeight; + + const context = canvas.getContext('2d'); + context?.drawImage(image, 0, 0, newWidth, newHeight); + + const compressedBase64 = canvas.toDataURL('image/jpeg', quality); + + // Calculate the compression percentage + const originalSize = base64String.length; + const compressedSize = compressedBase64.length; + const compressionPercentage = ((originalSize - compressedSize) / originalSize) * 100; + + console.log(`Compression achieved: ${compressionPercentage.toFixed(2)}%`); + + resolve(ok(compressedBase64)); + }; + + image.onerror = (error) => { + resolve(err(error)); + }; + }); +} diff --git a/src/app/utils/sentryErrorInterface.ts b/src/app/utils/sentryErrorInterface.ts new file mode 100644 index 000000000..8afde7df2 --- /dev/null +++ b/src/app/utils/sentryErrorInterface.ts @@ -0,0 +1 @@ +import { Event } from '@sentry/types/types/event'; diff --git a/src/app/utils/stackTrace.ts b/src/app/utils/stackTrace.ts new file mode 100644 index 000000000..400393f54 --- /dev/null +++ b/src/app/utils/stackTrace.ts @@ -0,0 +1,4 @@ +export function getStackTrace() { + const error = new Error('trace'); + return error.stack; +} diff --git a/src/app/utils/task-scheduler.ts b/src/app/utils/task-scheduler.ts new file mode 100644 index 000000000..ed2e62d4f --- /dev/null +++ b/src/app/utils/task-scheduler.ts @@ -0,0 +1,108 @@ +import { Injectable } from '@angular/core'; +import { timer, Subscription } from 'rxjs'; + +/** + * Interface representing a cron job. + */ +interface CronJob { + name: string; + timeExecute: Date; + callbackFunction: () => void; + subscription: Subscription; +} + +/** + * Service to manage cron jobs using RxJS. Allows scheduling, replacing, and + * removing jobs that execute a callback function at a specified time. + */ +@Injectable({ + providedIn: 'root', +}) +export class CronJobService { + /** + * A map to store cron jobs with a key composed of the job name and execution time. + */ + private jobs: Map = new Map(); + + /** + * Generates a unique key for a cron job based on its name and execution time. + * @param name - The name of the cron job. + * @param timeExecute - The time when the job should execute. + * @returns A string key combining the name and timeExecute. + */ + private generateJobKey(name: string, timeExecute: Date): string { + return `${name}_${timeExecute.getTime()}`; + } + + /** + * Creates a new cron job or replaces an existing one if the job with the same + * name and execution time already exists. The job will execute the provided + * callback function at the specified time. + * + * @param name - The name of the cron job. + * @param timeExecute - The time when the job should execute. + * @param callbackFunction - The function to be called when the job executes. + */ + createCronJob(name: string, timeExecute: Date, callbackFunction: () => void) { + const now = new Date(); + const delay = timeExecute.getTime() - now.getTime(); + + if (delay < 0) { + console.error('Time to execute is in the past!'); + return; + } + + const jobKey = this.generateJobKey(name, timeExecute); + + // If the job already exists, replace it + if (this.jobs.has(jobKey)) { + this.removeCronJob(name, timeExecute); + } + + // Create a new timer and store the subscription + const subscription = timer(delay).subscribe(() => { + callbackFunction(); + this.removeCronJob(name, timeExecute); + }); + + this.jobs.set(jobKey, { name, timeExecute, callbackFunction, subscription }); + } + + /** + * Removes a cron job by its name and execution time. + * + * @param name - The name of the cron job. + * @param timeExecute - The time when the job was supposed to execute. + */ + removeCronJob(name: string, timeExecute: Date) { + const jobKey = this.generateJobKey(name, timeExecute); + const job = this.jobs.get(jobKey); + if (job) { + job.subscription.unsubscribe(); + this.jobs.delete(jobKey); + } + } + + /** + * Retrieves all currently scheduled cron jobs. + * + * @returns An array of all scheduled cron jobs. + */ + getCronJobs(): CronJob[] { + return Array.from(this.jobs.values()); + } + + /** + * Removes all cron jobs with the specified name, regardless of their execution time. + * + * @param name - The name of the cron jobs to remove. + */ + removeAllJobsByName(name: string) { + for (const [key, job] of this.jobs) { + if (job.name === name) { + job.subscription.unsubscribe(); + this.jobs.delete(key); + } + } + } +} diff --git a/src/app/utils/use-case-interface.ts b/src/app/utils/use-case-interface.ts new file mode 100644 index 000000000..f8e4fd4c3 --- /dev/null +++ b/src/app/utils/use-case-interface.ts @@ -0,0 +1,8 @@ +// Define a generic UseCase interface +export interface UseCase { + execute(input: Input): Promise; +} + +export interface UseCaseObservable { + execute(input: Input): Promise; +} diff --git a/src/app/utils/zod.ts b/src/app/utils/zod.ts new file mode 100644 index 000000000..6f269ed30 --- /dev/null +++ b/src/app/utils/zod.ts @@ -0,0 +1,54 @@ +import { z } from 'zod'; + + +/** + * Zod schema for validating data URLs. + * This schema ensures that the input string matches the format of a data URL. + * + * @example + * const result = dataUrlSchema.safeParse('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDCAAAAC0BEMAAW9R3AAAAAElFTkSuQmCC'); + * if (result.success) { + * console.log('Valid data URL:', result.data); + * } else { + * console.error('Validation error:', result.error.errors); + * } + */ +export const zodDataUrlSchema = z.string().refine(value => value.startsWith('data:'), { + message: 'Invalid data URL', +}); + + +//=============================================================================== +/** + * A schema for validating Base64 encoded strings. + * + * This schema checks if the string is valid Base64 and ensures that the first 20 characters + * do not contain a comma. + * + * @example + * ```typescript + * const validString = 'SGVsbG8sIHdvcmxkIQ=='; // Base64 for "Hello, world!" + * const invalidString = 'SGVsbG8sIHdvcmxkIQ,,=='; // Invalid due to commas + * + * console.log(base64Schema.safeParse(validString).success); // true + * console.log(base64Schema.safeParse(invalidString).success); // false + * ``` + */ +export const base64Schema = z.string().refine(value => { + return !value.slice(0, 20).includes(','); +}, { + message: 'Invalid Base64 string or comma found in the first 20 characters' +}); + +/** + * Validates a given string against the Base64 schema. + * + * @param input - The string to validate. + * @returns `true` if the input is valid according to the schema, `false` otherwise. + * + * @example + * ```typescript + * console.log(validateInput('SGVsbG8sIHdvcmxkIQ==')); // true + * console.log(validateInput('SGVsbG8sIHdvcmxkIQ,,==')); // false + * ``` + */ diff --git a/src/app/utils/zodValidation.ts b/src/app/utils/zodValidation.ts new file mode 100644 index 000000000..bd36275bc --- /dev/null +++ b/src/app/utils/zodValidation.ts @@ -0,0 +1,11 @@ +import { err, ok } from 'neverthrow'; +import { ZodError, ZodSchema, z } from 'zod'; +export function zodSafeValidation(schema: ZodSchema, data: unknown) { + const validation = (schema as ZodSchema).safeParse(data) + + if(validation.success) { + return ok(validation.data) + } else { + return err((validation.error)) + } +} diff --git a/src/assets/dexie/CODE_OF_CONDUCT.md b/src/assets/dexie/CODE_OF_CONDUCT.md deleted file mode 100644 index 0af794b87..000000000 --- a/src/assets/dexie/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at code@dexie.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/src/assets/dexie/CONTRIBUTING.md b/src/assets/dexie/CONTRIBUTING.md deleted file mode 100644 index 68f0fcb16..000000000 --- a/src/assets/dexie/CONTRIBUTING.md +++ /dev/null @@ -1,65 +0,0 @@ -HOW TO CONTRIBUTE -================= - -We appreciate contributions in forms of: - -* issues -* help answering questions in [issues](https://github.com/dexie/Dexie.js/issues) and on [stackoverflow](https://stackexchange.com/filters/233583/dexie-stackoverflow) -* fixing bugs via pull-requests -* developing addons or other [derived work](https://dexie.org/docs/DerivedWork) -* promoting Dexie.js -* sharing ideas - -Contribute while developing your own app -======================================== - -Dexie uses pnpm package manager. Refer to [pnpm.io/installation](https://pnpm.io/installation) for how to install pnpm. - -Here is a little cheat-sheet for how to symlink your app's `node_modules/dexie` to a place where you can edit the source, version control your changes and create pull requests back to Dexie. Assuming you've already ran `npm install dexie` for the app your are developing. - -1. Fork Dexie.js from the web gui on github -2. Clone your fork locally by launching a shell/command window and cd to a neutral place (like `~repos/`, `c:\repos` or whatever) -3. Run the following commands: - - ``` - git clone https://github.com/YOUR-USERNAME/Dexie.js.git dexie - cd dexie - pnpm install - pnpm run build - npm link # Or yarn link or pnpm link --global depending on what package manager you are using. - ``` -3. cd to your app directory and write: - ``` - npm link dexie # Or yarn link dexie / pnpm link dexie depending on your package manager. - ``` - -Your app's `node_modules/dexie/` is now sym-linked to the Dexie.js clone on your hard drive so any change you do there will propagate to your app. Build dexie.js using `pnpm run build` or `pnpm run watch`. The latter will react on any source file change and rebuild the dist files. - -That's it. Now you're up and running to test and commit changes to files under dexie/src/* or dexie/test/* and the changes will instantly affect the app you are developing. - -If you're on yarn or pnpm, do the same procedures using yarn link / pnpm link. - -Pull requests are more than welcome. Some advices are: - -* Run pnpm test before making a pull request. -* If you find an issue, a unit test that reproduces it is lovely ;). If you don't know where to put it, put it in `test/tests-misc.js`. We use qunit. Just look at existing tests in `tests-misc.js` to see how they should be written. Tests are transpiled in the build script so you can use ES6 if you like. - -Build ------ -``` -# To install pnpm, see https://pnpm.io/installation -pnpm install -pnpm run build -``` - -Test ----- -``` -pnpm test -``` - -Watch ------ -``` -pnpm run watch -``` diff --git a/src/assets/dexie/LICENSE b/src/assets/dexie/LICENSE deleted file mode 100644 index e06d20818..000000000 --- a/src/assets/dexie/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/src/assets/dexie/NOTICE b/src/assets/dexie/NOTICE deleted file mode 100644 index 9de226815..000000000 --- a/src/assets/dexie/NOTICE +++ /dev/null @@ -1,15 +0,0 @@ -Dexie.js - -Copyright (c) 2014-2017 David Fahlander - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/src/assets/dexie/README.md b/src/assets/dexie/README.md deleted file mode 100644 index 13b619b4f..000000000 --- a/src/assets/dexie/README.md +++ /dev/null @@ -1,292 +0,0 @@ -# Dexie.js - -[![NPM Version][npm-image]][npm-url] ![Build Status](https://github.com/dexie/Dexie.js/actions/workflows/main.yml/badge.svg) - -Dexie.js is a wrapper library for indexedDB - the standard database in the browser. https://dexie.org. - -#### Why Dexie.js? - -IndexedDB is the portable database for all browser engines. Dexie.js makes it fun and easy to work with. - -But also: - -* Dexie.js is widely used by 100,000 of web sites, apps and other projects and supports all browsers, Electron for Desktop apps, Capacitor for iOS / Android apps and of course pure PWAs. -* Dexie.js works around bugs in the IndexedDB implementations, giving a more stable user experience. -* It's an easy step to [make it sync](https://dexie.org/#sync). - -#### Hello World - -```html - - - - - - - -``` - -Yes, it's that simple. Read [the docs](https://dexie.org/docs/) to get into the details. - -#### Hello World (for modern browsers) - -All modern browsers support ES modules and top-level awaits. No transipler needed. Here's the previous example in a modern flavour: - -```html - - - - - - -``` - -#### Hello World (React + Typescript) - -Real-world apps are often built using components in various frameworks. Here's a version of Hello World written for React and Typescript. There are also links below this sample to more tutorials for different frameworks... - -```tsx -import React from 'react'; -import { Dexie, type EntityTable } from 'dexie'; -import { useLiveQuery } from 'dexie-react-hooks'; - -// Typing for your entities (hint is to move this to its own module) -export interface Friend { - id: number; - name: string; - age: number; -} - -// Database declaration (move this to its own module also) -export const db = new Dexie('FriendDatabase') as Dexie & { - friends: EntityTable; -}; -db.version(1).stores({ - friends: '++id, age', -}); - -// Component: -export function MyDexieReactComponent() { - const youngFriends = useLiveQuery(() => - db.friends - .where('age') - .below(30) - .toArray() - ); - - return ( - <> -

My young friends

-
    - {youngFriends?.map((f) => ( -
  • - Name: {f.name}, Age: {f.age} -
  • - ))} -
- - - ); -} -``` - -[Tutorials for React, Svelte, Vue, Angular and vanilla JS](https://dexie.org/docs/Tutorial/Getting-started) - -[API Reference](https://dexie.org/docs/API-Reference) - -[Samples](https://dexie.org/docs/Samples) - -### Performance - -Dexie has kick-ass performance. Its [bulk methods]() take advantage of a lesser-known feature in IndexedDB that makes it possible to store stuff without listening to every onsuccess event. This speeds up the performance to a maximum. - -#### Supported operations - -```js -above(key): Collection; -aboveOrEqual(key): Collection; -add(item, key?): Promise; -and(filter: (x) => boolean): Collection; -anyOf(keys[]): Collection; -anyOfIgnoreCase(keys: string[]): Collection; -below(key): Collection; -belowOrEqual(key): Collection; -between(lower, upper, includeLower?, includeUpper?): Collection; -bulkAdd(items: Array): Promise; -bulkDelete(keys: Array): Promise; -bulkPut(items: Array): Promise; -clear(): Promise; -count(): Promise; -delete(key): Promise; -distinct(): Collection; -each(callback: (obj) => any): Promise; -eachKey(callback: (key) => any): Promise; -eachPrimaryKey(callback: (key) => any): Promise; -eachUniqueKey(callback: (key) => any): Promise; -equals(key): Collection; -equalsIgnoreCase(key): Collection; -filter(fn: (obj) => boolean): Collection; -first(): Promise; -get(key): Promise; -inAnyRange(ranges): Collection; -keys(): Promise; -last(): Promise; -limit(n: number): Collection; -modify(changeCallback: (obj: T, ctx:{value: T}) => void): Promise; -modify(changes: { [keyPath: string]: any } ): Promise; -noneOf(keys: Array): Collection; -notEqual(key): Collection; -offset(n: number): Collection; -or(indexOrPrimayKey: string): WhereClause; -orderBy(index: string): Collection; -primaryKeys(): Promise; -put(item: T, key?: Key): Promise; -reverse(): Collection; -sortBy(keyPath: string): Promise; -startsWith(key: string): Collection; -startsWithAnyOf(prefixes: string[]): Collection; -startsWithAnyOfIgnoreCase(prefixes: string[]): Collection; -startsWithIgnoreCase(key: string): Collection; -toArray(): Promise; -toCollection(): Collection; -uniqueKeys(): Promise; -until(filter: (value) => boolean, includeStopEntry?: boolean): Collection; -update(key: Key, changes: { [keyPath: string]: any }): Promise; -``` - -This is a mix of methods from [WhereClause](https://dexie.org/docs/WhereClause/WhereClause), [Table](https://dexie.org/docs/Table/Table) and [Collection](https://dexie.org/docs/Collection/Collection). Dive into the [API reference](https://dexie.org/docs/API-Reference) to see the details. - -## Dexie Cloud - -[Dexie Cloud](https://dexie.org/cloud/) is a commercial offering that can be used as an add-on to Dexie.js. It syncs a Dexie database with a server and enables developers to build apps without having to care about backend or database layer else than the frontend code with Dexie.js as the sole database layer. - -Source for a sample Dexie Cloud app: [Dexie Cloud To-do app](https://github.com/dexie/Dexie.js/tree/master/samples/dexie-cloud-todo-app) - -See the sample Dexie Cloud app in action: https://dexie.github.io/Dexie.js/dexie-cloud-todo-app/ - -## Samples - -https://dexie.org/docs/Samples - -https://github.com/dexie/Dexie.js/tree/master/samples - -## Knowledge Base - -[https://dexie.org/docs/Questions-and-Answers](https://dexie.org/docs/Questions-and-Answers) - -## Website - -[https://dexie.org](https://dexie.org) - -## Install via npm - -``` -npm install dexie -``` - -## Download - -For those who don't like package managers, here's the download links: - -### UMD (for legacy script includes as well as commonjs require): - -https://unpkg.com/dexie@latest/dist/dexie.min.js - -https://unpkg.com/dexie@latest/dist/dexie.min.js.map - -### Modern (ES module): - -https://unpkg.com/dexie@latest/dist/modern/dexie.min.mjs - -https://unpkg.com/dexie@latest/dist/modern/dexie.min.mjs.map - -### Typings: - -https://unpkg.com/dexie@latest/dist/dexie.d.ts - -# Contributing - -See [CONTRIBUTING.md](CONTRIBUTING.md) - -## Build - -``` -pnpm install -pnpm run build -``` - -## Test - -``` -pnpm test -``` - -## Watch - -``` -pnpm run watch -``` - -
- -[![Browser testing via LAMDBATEST](https://dexie.org/assets/images/lambdatest2.png)](https://www.lambdatest.com/) - -[npm-image]: https://img.shields.io/npm/v/dexie.svg?style=flat -[npm-url]: https://npmjs.org/package/dexie diff --git a/src/assets/dexie/SECURITY.md b/src/assets/dexie/SECURITY.md deleted file mode 100644 index d3c09d562..000000000 --- a/src/assets/dexie/SECURITY.md +++ /dev/null @@ -1,26 +0,0 @@ -# Security Policy - -## Supported Versions - -| Version | Supported | Branch -| ------- | ------------------ | -------- -| 4.x | :white_check_mark: | master -| 3.x | :white_check_mark: | master-3 -| 2.0.x | :x: | master-2 -| 1.5.x | :x: | master-1 -| < 1.5.1 | :x: | - -## Reporting a Vulnerability - -To report a security vulnerability in Dexie.js, please send an email to code@dexie.org describing the vulnerability and how to reproduce it. - -If we find an issue to be regarded as a security vulnerability, we will patch and release a new version in all the supported versions as soon as possible. -Keep in mind though that this is an uncommercial open source project which means that sometimes you might have to be the one that -*fixes* the issue and not just report it. - -## Fixing a Vulnerability - -Fix the issue in the corresponding branch for the major version according to the table above where it applies and -create pull requests. Make sure that you have the words "security" or "vulnerability" in the title of the Pull Request -in order to get the correct attention for it to be merged and released as soon as possible. - diff --git a/src/assets/dexie/dist/dexie.d.ts b/src/assets/dexie/dist/dexie.d.ts deleted file mode 100644 index 130ee26a6..000000000 --- a/src/assets/dexie/dist/dexie.d.ts +++ /dev/null @@ -1,1174 +0,0 @@ -/* - * Dexie.js - a minimalistic wrapper for IndexedDB - * =============================================== - * - * By David Fahlander, david.fahlander@gmail.com - * - * Version 4.0.7, Sun May 26 2024 - * - * https://dexie.org - * - * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/ - */ - // Generated by dts-bundle-generator v5.9.0 - -export interface IndexSpec { - name: string; - keyPath: string | Array | undefined; - unique: boolean | undefined; - multi: boolean | undefined; - auto: boolean | undefined; - compound: boolean | undefined; - src: string; -} -export interface TableSchema { - name: string; - primKey: IndexSpec; - indexes: IndexSpec[]; - mappedClass: Function; - idxByName: { - [name: string]: IndexSpec; - }; - readHook?: (x: any) => any; -} -export type IndexableTypePart = string | number | Date | ArrayBuffer | ArrayBufferView | DataView | Array>; -export type IndexableTypeArray = Array; -export type IndexableTypeArrayReadonly = ReadonlyArray; -export type IndexableType = IndexableTypePart | IndexableTypeArrayReadonly; -export interface DexieEvent { - subscribers: Function[]; - fire(...args: any[]): any; - subscribe(fn: (...args: any[]) => any): void; - unsubscribe(fn: (...args: any[]) => any): void; -} -export interface DexieEventSet { - (eventName: string): DexieEvent; // To be able to unsubscribe. - addEventType(eventName: string, chainFunction?: (f1: Function, f2: Function) => Function, defaultFunction?: Function): DexieEvent; - addEventType(events: { - [eventName: string]: ("asap" | [ - (f1: Function, f2: Function) => Function, - Function - ]); - }): DexieEvent; -} -export interface TransactionEvents extends DexieEventSet { - (eventName: "complete", subscriber: () => any): void; - (eventName: "abort", subscriber: () => any): void; - (eventName: "error", subscriber: (error: any) => any): void; - complete: DexieEvent; - abort: DexieEvent; - error: DexieEvent; -} -export interface Transaction { - db: Dexie; - active: boolean; - mode: IDBTransactionMode; - idbtrans: IDBTransaction; - //tables: { [type: string]: Table }; Deprecated since 2.0. Obsolete from v3.0. - storeNames: Array; - explicit?: boolean; - parent?: Transaction; - on: TransactionEvents; - abort(): void; - table(tableName: string): Table; - table(tableName: string): Table; - table(tableName: string): Table; - table(tableName: string): Table; -} -export interface CreatingHookContext { - onsuccess?: (primKey: Key) => void; - onerror?: (err: any) => void; -} -export interface UpdatingHookContext { - onsuccess?: (updatedObj: T) => void; - onerror?: (err: any) => void; -} -export interface DeletingHookContext { - onsuccess?: () => void; - onerror?: (err: any) => void; -} -export interface TableHooks extends DexieEventSet { - (eventName: "creating", subscriber: (this: CreatingHookContext, primKey: TKey, obj: T, transaction: Transaction) => void | undefined | TKey): void; - (eventName: "reading", subscriber: (obj: T) => T | any): void; - (eventName: "updating", subscriber: (this: UpdatingHookContext, modifications: Object, primKey: TKey, obj: T, transaction: Transaction) => any): void; - (eventName: "deleting", subscriber: (this: DeletingHookContext, primKey: TKey, obj: T, transaction: Transaction) => any): void; - creating: DexieEvent; - reading: DexieEvent; - updating: DexieEvent; - deleting: DexieEvent; -} -export type ThenShortcut = (value: T) => TResult | PromiseLike; -export interface WhereClause { - above(key: any): Collection; - aboveOrEqual(key: any): Collection; - anyOf(keys: ReadonlyArray): Collection; - anyOf(...keys: Array): Collection; - anyOfIgnoreCase(keys: string[]): Collection; - anyOfIgnoreCase(...keys: string[]): Collection; - below(key: any): Collection; - belowOrEqual(key: any): Collection; - between(lower: any, upper: any, includeLower?: boolean, includeUpper?: boolean): Collection; - equals(key: IndexableType): Collection; - equalsIgnoreCase(key: string): Collection; - inAnyRange(ranges: ReadonlyArray<{ - 0: any; - 1: any; - }>, options?: { - includeLowers?: boolean; - includeUppers?: boolean; - }): Collection; - startsWith(key: string): Collection; - startsWithAnyOf(prefixes: string[]): Collection; - startsWithAnyOf(...prefixes: string[]): Collection; - startsWithIgnoreCase(key: string): Collection; - startsWithAnyOfIgnoreCase(prefixes: string[]): Collection; - startsWithAnyOfIgnoreCase(...prefixes: string[]): Collection; - noneOf(keys: ReadonlyArray): Collection; - notEqual(key: IndexableType): Collection; -} -export interface PromiseExtendedConstructor extends PromiseConstructor { - readonly prototype: PromiseExtended; - new (executor: (resolve: (value?: T | PromiseLike) => void, reject: (reason?: any) => void) => void): PromiseExtended; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike, - T8 | PromiseLike, - T9 | PromiseLike, - T10 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4, - T5, - T6, - T7, - T8, - T9, - T10 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike, - T8 | PromiseLike, - T9 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4, - T5, - T6, - T7, - T8, - T9 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike, - T8 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4, - T5, - T6, - T7, - T8 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4, - T5, - T6, - T7 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4, - T5, - T6 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4, - T5 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike - ]): PromiseExtended<[ - T1, - T2 - ]>; - all(values: (T | PromiseLike)[]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike, - T8 | PromiseLike, - T9 | PromiseLike, - T10 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike, - T8 | PromiseLike, - T9 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike, - T8 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike - ]): PromiseExtended; - race(values: (T | PromiseLike)[]): PromiseExtended; - reject(reason: any): PromiseExtended; - reject(reason: any): PromiseExtended; - resolve(value: T | PromiseLike): PromiseExtended; - resolve(): PromiseExtended; -} -/** The interface of Dexie.Promise, which basically extends standard Promise with methods: - * - * finally() - also subject for standardization - * timeout() - set a completion timeout - * catch(ErrorClass, handler) - java style error catching - * catch(errorName, handler) - cross-domain safe type error catching (checking error.name instead of instanceof) - * - */ -export interface PromiseExtended extends Promise { - then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): PromiseExtended; - catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): PromiseExtended; - catch(ErrorConstructor: Function, onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): PromiseExtended; - catch(errorName: string, onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): PromiseExtended; - finally(onFinally?: () => U | PromiseLike): PromiseExtended; - timeout(ms: number, msg?: string): PromiseExtended; -} -export type KeyPaths = { - [P in keyof T]: P extends string ? T[P] extends Array ? K extends object // only drill into the array element if it's an object - ? P | `${P}.${number}` | `${P}.${number}.${KeyPaths}` : P | `${P}.${number}` : T[P] extends (...args: any[]) => any // Method - ? never : T[P] extends object ? P | `${P}.${KeyPaths}` : P : never; -}[keyof T]; -export type KeyPathValue = PATH extends `${infer R}.${infer S}` ? R extends keyof T ? KeyPathValue : T extends any[] ? PATH extends `${number}.${infer S}` ? KeyPathValue : void : void : PATH extends `${number}` ? T extends any[] ? T[number] : void : PATH extends keyof T ? T[PATH] : void; -export declare const PropModSymbol: unique symbol; -export type PropModSpec = { - replacePrefix?: [ - string, - string - ]; - add?: number | BigInt | Array; - remove?: number | BigInt | Array; -}; -export class PropModification implements PropModSpec { - [PropModSymbol]?: true; - replacePrefix?: [ - string, - string - ]; - add?: number | BigInt | Array; - remove?: number | BigInt | Array; - execute(value: T): T; - constructor(spec: PropModSpec); -} -export type UpdateSpec = { - [KP in KeyPaths]?: KeyPathValue | PropModification; -}; -export interface Collection { - db: Dexie; - and(filter: (x: T) => boolean): Collection; - clone(props?: Object): Collection; - count(): PromiseExtended; - count(thenShortcut: ThenShortcut): PromiseExtended; - distinct(): Collection; - each(callback: (obj: T, cursor: { - key: IndexableType; - primaryKey: TKey; - }) => any): PromiseExtended; - eachKey(callback: (key: IndexableType, cursor: { - key: IndexableType; - primaryKey: TKey; - }) => any): PromiseExtended; - eachPrimaryKey(callback: (key: TKey, cursor: { - key: IndexableType; - primaryKey: TKey; - }) => any): PromiseExtended; - eachUniqueKey(callback: (key: IndexableType, cursor: { - key: IndexableType; - primaryKey: TKey; - }) => any): PromiseExtended; - filter(filter: (x: T) => x is S): Collection; - filter(filter: (x: T) => boolean): Collection; - first(): PromiseExtended; - first(thenShortcut: ThenShortcut): PromiseExtended; - keys(): PromiseExtended; - keys(thenShortcut: ThenShortcut): PromiseExtended; - primaryKeys(): PromiseExtended; - primaryKeys(thenShortcut: ThenShortcut): PromiseExtended; - last(): PromiseExtended; - last(thenShortcut: ThenShortcut): PromiseExtended; - limit(n: number): Collection; - offset(n: number): Collection; - or(indexOrPrimayKey: string): WhereClause; - raw(): Collection; - reverse(): Collection; - sortBy(keyPath: string): PromiseExtended; - sortBy(keyPath: string, thenShortcut: ThenShortcut): PromiseExtended; - toArray(): PromiseExtended>; - toArray(thenShortcut: ThenShortcut): PromiseExtended; - uniqueKeys(): PromiseExtended; - uniqueKeys(thenShortcut: ThenShortcut): PromiseExtended; - until(filter: (value: T) => boolean, includeStopEntry?: boolean): Collection; - // Mutating methods - delete(): PromiseExtended; - modify(changeCallback: (obj: T, ctx: { - value: TInsertType; - }) => void | boolean): PromiseExtended; - modify(changes: UpdateSpec): PromiseExtended; -} -export type IntervalTree = IntervalTreeNode | EmptyRange; -export interface IntervalTreeNode { - from: IndexableType; // lower bound - to: IndexableType; // upper bound - l: IntervalTreeNode | null; // left - r: IntervalTreeNode | null; // right - d: number; // depth -} -export interface EmptyRange { - d: 0; -} -export interface DexieOnReadyEvent { - subscribe(fn: (vipDb: Dexie) => any, bSticky: boolean): void; - unsubscribe(fn: (vipDb: Dexie) => any): void; - fire(vipDb: Dexie): any; -} -export interface DexieVersionChangeEvent { - subscribe(fn: (event: IDBVersionChangeEvent) => any): void; - unsubscribe(fn: (event: IDBVersionChangeEvent) => any): void; - fire(event: IDBVersionChangeEvent): any; -} -export interface DexiePopulateEvent { - subscribe(fn: (trans: Transaction) => any): void; - unsubscribe(fn: (trans: Transaction) => any): void; - fire(trans: Transaction): any; -} -export interface DexieCloseEvent { - subscribe(fn: (event: Event) => any): void; - unsubscribe(fn: (event: Event) => any): void; - fire(event: Event): any; -} -export interface DbEvents extends DexieEventSet { - (eventName: "ready", subscriber: (vipDb: Dexie) => any, bSticky?: boolean): void; - (eventName: "populate", subscriber: (trans: Transaction) => any): void; - (eventName: "blocked", subscriber: (event: IDBVersionChangeEvent) => any): void; - (eventName: "versionchange", subscriber: (event: IDBVersionChangeEvent) => any): void; - (eventName: "close", subscriber: (event: Event) => any): void; - ready: DexieOnReadyEvent; - populate: DexiePopulateEvent; - blocked: DexieEvent; - versionchange: DexieVersionChangeEvent; - close: DexieCloseEvent; -} -/** Set of mutated parts of the database - */ -export type ObservabilitySet = { - /** Database part having been mutated. - * - * This structure is produced in observability-middleware.ts - * and consumed in live-query.ts. - * - * Format of 'part': - * - * `idb://${dbName}/${tableName}/${indexName}` - * - * * dbName is the database name - * * tableName is the table name - * * indexName is any of: - * 1. An empty string - represents the primary keys of the affected objs - * 2. ":dels" - represents primary keys of deleted objects in the table - * 3. The keyPath of an index, such as "name", "age" or "address.city" - - * represents indexes that, if used in a query, might affect the - * result of that query. - * - * IntervalTree - * * See definition of IntervalTree type in rangeset.d.ts - * * See rangesOverlap() in rangeset.ts that can be used to compare two - * IntervalTrees and detect collissions. - * * See RangeSet class that can be used to create an IntervalTree and add - * ranges to it. - */ - [part: string]: IntervalTree; -}; -export interface DexieOnStorageMutatedEvent { - subscribe(fn: (parts: ObservabilitySet) => any): void; - unsubscribe(fn: (parts: ObservabilitySet) => any): void; - fire(parts: ObservabilitySet): any; -} -export interface GlobalDexieEvents extends DexieEventSet { - (eventName: "storagemutated", subscriber: (parts: ObservabilitySet) => any): void; - storagemutated: DexieOnStorageMutatedEvent; -} -export const enum DBCoreRangeType { - Equal = 1, - Range = 2, - Any = 3, - Never = 4 -} -export interface DBCoreKeyRange { - readonly type: DBCoreRangeType; - readonly lower: any; - readonly lowerOpen?: boolean; - readonly upper: any; - readonly upperOpen?: boolean; -} -export interface DBCoreTransaction { - abort(): void; -} -export interface DbCoreTransactionOptions { - durability: ChromeTransactionDurability; -} -export type DBCoreMutateRequest = DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest | DBCoreDeleteRangeRequest; -export interface DBCoreMutateResponse { - numFailures: number; - failures: { - [operationNumber: number]: Error; - }; - lastResult: any; - results?: any[]; // Present on AddRequest and PutRequest. -} -export interface DBCoreAddRequest { - type: "add"; - trans: DBCoreTransaction; - values: readonly any[]; - keys?: any[]; - mutatedParts?: ObservabilitySet; - /** @deprecated Will always get results since 3.1.0-alpha.5 */ - wantResults?: boolean; -} -export interface DBCorePutRequest { - type: "put"; - trans: DBCoreTransaction; - values: readonly any[]; - keys?: any[]; - mutatedParts?: ObservabilitySet; - criteria?: { - index: string | null; - range: DBCoreKeyRange; - }; - changeSpec?: { - [keyPath: string]: any; - }; // Common changeSpec for each key - isAdditionalChunk?: boolean; - updates?: { - keys: any[]; - changeSpecs: { - [keyPath: string]: any; - }[]; // changeSpec per key. - }; - /** @deprecated Will always get results since 3.1.0-alpha.5 */ - wantResults?: boolean; -} -export interface DBCoreDeleteRequest { - type: "delete"; - trans: DBCoreTransaction; - keys: any[]; - mutatedParts?: ObservabilitySet; - criteria?: { - index: string | null; - range: DBCoreKeyRange; - }; - isAdditionalChunk?: boolean; -} -export interface DBCoreDeleteRangeRequest { - type: "deleteRange"; - trans: DBCoreTransaction; - range: DBCoreKeyRange; - mutatedParts?: ObservabilitySet; -} -export interface DBCoreGetManyRequest { - trans: DBCoreTransaction; - keys: any[]; - cache?: "immutable" | "clone"; - obsSet?: ObservabilitySet; -} -export interface DBCoreGetRequest { - trans: DBCoreTransaction; - key: any; - obsSet?: ObservabilitySet; -} -export interface DBCoreQuery { - index: DBCoreIndex; //keyPath: null | string | string[]; // null represents primary key. string a property, string[] several properties. - range: DBCoreKeyRange; -} -export interface DBCoreQueryRequest { - trans: DBCoreTransaction; - values?: boolean; - limit?: number; - query: DBCoreQuery; - obsSet?: ObservabilitySet; -} -export interface DBCoreQueryResponse { - result: any[]; -} -export interface DBCoreOpenCursorRequest { - trans: DBCoreTransaction; - values?: boolean; - unique?: boolean; - reverse?: boolean; - query: DBCoreQuery; - obsSet?: ObservabilitySet; -} -export interface DBCoreCountRequest { - trans: DBCoreTransaction; - query: DBCoreQuery; - obsSet?: ObservabilitySet; -} -export interface DBCoreCursor { - readonly trans: DBCoreTransaction; - readonly key: any; - readonly primaryKey: any; - readonly value?: any; - readonly done?: boolean; - continue(key?: any): void; - continuePrimaryKey(key: any, primaryKey: any): void; - advance(count: number): void; - start(onNext: () => void): Promise; - stop(value?: any | Promise): void; - next(): Promise; - fail(error: Error): void; -} -export interface DBCoreSchema { - name: string; - tables: DBCoreTableSchema[]; -} -export interface DBCoreTableSchema { - readonly name: string; - readonly primaryKey: DBCoreIndex; - readonly indexes: DBCoreIndex[]; - readonly getIndexByKeyPath: (keyPath: null | string | string[]) => DBCoreIndex | undefined; -} -export interface DBCoreIndex { - /** Name of the index, or null for primary key */ - readonly name: string | null; - /** True if this index represents the primary key */ - readonly isPrimaryKey?: boolean; - /** True if this index represents the primary key and is not inbound (https://dexie.org/docs/inbound) */ - readonly outbound?: boolean; - /** True if and only if keyPath is an array (https://dexie.org/docs/Compound-Index) */ - readonly compound?: boolean; - /** keyPath, null for primary key, string for single-property indexes, Array for compound indexes */ - readonly keyPath: null | string | string[]; - /** Auto-generated primary key (does not apply to secondary indexes) */ - readonly autoIncrement?: boolean; - /** Whether index is unique. Also true if index is primary key. */ - readonly unique?: boolean; - /** Whether index is multiEntry. */ - readonly multiEntry?: boolean; - /** Extract (using keyPath) a key from given value (object). Null for outbound primary keys */ - readonly extractKey: ((value: any) => any) | null; - /** If this index is a virtual index, lowLevelIndex represents the actual IndexedDB index behind it */ - readonly lowLevelIndex?: DBCoreIndex; -} -export interface DBCore { - stack: "dbcore"; - // Transaction and Object Store - transaction(stores: string[], mode: "readonly" | "readwrite", options?: DbCoreTransactionOptions): DBCoreTransaction; - // Utility methods - readonly MIN_KEY: any; - readonly MAX_KEY: any; - readonly schema: DBCoreSchema; - table(name: string): DBCoreTable; -} -export interface DBCoreTable { - readonly name: string; - readonly schema: DBCoreTableSchema; - mutate(req: DBCoreMutateRequest): Promise; - get(req: DBCoreGetRequest): Promise; - getMany(req: DBCoreGetManyRequest): Promise; - query(req: DBCoreQueryRequest): Promise; - openCursor(req: DBCoreOpenCursorRequest): Promise; - count(req: DBCoreCountRequest): Promise; -} -export interface Table { - db: Dexie; - name: string; - schema: TableSchema; - hook: TableHooks; - core: DBCoreTable; - get(key: TKey): PromiseExtended; - get(key: TKey, thenShortcut: ThenShortcut): PromiseExtended; - get(equalityCriterias: { - [key: string]: any; - }): PromiseExtended; - get(equalityCriterias: { - [key: string]: any; - }, thenShortcut: ThenShortcut): PromiseExtended; - where(index: string | string[]): WhereClause; - where(equalityCriterias: { - [key: string]: any; - }): Collection; - filter(fn: (obj: T) => boolean): Collection; - count(): PromiseExtended; - count(thenShortcut: ThenShortcut): PromiseExtended; - offset(n: number): Collection; - limit(n: number): Collection; - each(callback: (obj: T, cursor: { - key: any; - primaryKey: TKey; - }) => any): PromiseExtended; - toArray(): PromiseExtended>; - toArray(thenShortcut: ThenShortcut): PromiseExtended; - toCollection(): Collection; - orderBy(index: string | string[]): Collection; - reverse(): Collection; - mapToClass(constructor: Function): Function; - add(item: TInsertType, key?: TKey): PromiseExtended; - update(key: TKey | T, changes: UpdateSpec | ((obj: T, ctx: { - value: any; - primKey: IndexableType; - }) => void | boolean)): PromiseExtended; - put(item: TInsertType, key?: TKey): PromiseExtended; - delete(key: TKey): PromiseExtended; - clear(): PromiseExtended; - bulkGet(keys: TKey[]): PromiseExtended<(T | undefined)[]>; - bulkAdd(items: readonly TInsertType[], keys: IndexableTypeArrayReadonly, options: { - allKeys: B; - }): PromiseExtended; - bulkAdd(items: readonly TInsertType[], options: { - allKeys: B; - }): PromiseExtended; - bulkAdd(items: readonly TInsertType[], keys?: IndexableTypeArrayReadonly, options?: { - allKeys: boolean; - }): PromiseExtended; - bulkPut(items: readonly TInsertType[], keys: IndexableTypeArrayReadonly, options: { - allKeys: B; - }): PromiseExtended; - bulkPut(items: readonly TInsertType[], options: { - allKeys: B; - }): PromiseExtended; - bulkPut(items: readonly TInsertType[], keys?: IndexableTypeArrayReadonly, options?: { - allKeys: boolean; - }): PromiseExtended; - bulkUpdate(keysAndChanges: ReadonlyArray<{ - key: TKey; - changes: UpdateSpec; - }>): PromiseExtended; - bulkDelete(keys: TKey[]): PromiseExtended; -} -export interface Version { - stores(schema: { - [tableName: string]: string | null; - }): Version; - upgrade(fn: (trans: Transaction) => PromiseLike | void): Version; -} -export type TransactionMode = "readonly" | "readwrite" | "r" | "r!" | "r?" | "rw" | "rw!" | "rw?"; -export type DbSchema = { - [tableName: string]: TableSchema; -}; -export interface Middleware { - stack: TStack["stack"]; - create: (down: TStack) => Partial; - level?: number; - name?: string; -} -export interface DexieStacks { - dbcore: DBCore; -} -export type TableProp = { - [K in keyof DX]: DX[K] extends { - schema: any; - get: any; - put: any; - add: any; - where: any; - } ? K : never; -}[keyof DX] & string; -export type TXWithTables = Dexie extends DX ? Transaction // If not subclassed, just expect a Transaction without table props - : Transaction & { - [P in TableProp]: DX[P]; -}; -export interface Dexie { - readonly name: string; - readonly tables: Table[]; - readonly verno: number; - readonly vip: Dexie; - readonly _allTables: { - [name: string]: Table; - }; - readonly core: DBCore; - _createTransaction: (this: Dexie, mode: IDBTransactionMode, storeNames: ArrayLike, dbschema: DbSchema, parentTransaction?: Transaction | null) => Transaction; - readonly _novip: Dexie; - _dbSchema: DbSchema; - version(versionNumber: number): Version; - on: DbEvents; - open(): PromiseExtended; - table(tableName: string): Table; - transaction(mode: TransactionMode, tables: readonly (string | Table)[], scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; - transaction(mode: TransactionMode, table: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; - transaction(mode: TransactionMode, table: string | Table, table2: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; - transaction(mode: TransactionMode, table: string | Table, table2: string | Table, table3: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; - transaction(mode: TransactionMode, table: string | Table, table2: string | Table, table3: string | Table, table4: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; - transaction(mode: TransactionMode, table: string | Table, table2: string | Table, table3: string | Table, table5: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; - close(closeOptions?: { - disableAutoOpen: boolean; - }): void; - delete(closeOptions?: { - disableAutoOpen: boolean; - }): PromiseExtended; - isOpen(): boolean; - hasBeenClosed(): boolean; - hasFailed(): boolean; - dynamicallyOpened(): boolean; - backendDB(): IDBDatabase; - use(middleware: Middleware): this; - // Add more supported stacks here... : use(middleware: Middleware): this; - unuse({ stack, create }: Middleware<{ - stack: keyof DexieStacks; - }>): this; - unuse({ stack, name }: { - stack: keyof DexieStacks; - name: string; - }): this; - // Make it possible to touch physical class constructors where they reside - as properties on db instance. - // For example, checking if (x instanceof db.Table). Can't do (x instanceof Dexie.Table because it's just a virtual interface) - Table: { - prototype: Table; - }; - WhereClause: { - prototype: WhereClause; - }; - Version: { - prototype: Version; - }; - Transaction: { - prototype: Transaction; - }; - Collection: { - prototype: Collection; - }; -} -/** DexieError - * - * Common base class for all errors originating from Dexie.js except TypeError, - * SyntaxError and RangeError. - * - * https://dexie.org/docs/DexieErrors/DexieError - * - */ -export interface DexieError extends Error { - name: string; - message: string; - stack: string; - inner: any; - toString(): string; -} -/** - * List of the names of auto-generated error classes that extends DexieError - * and shares the interface of DexieError. - * - * Each error should be documented at https://dexie.org/docs/DexieErrors/Dexie. - * - * The generic type DexieExceptionClasses is a map of full error name to - * error constructor. The DexieExceptionClasses is mixed in into Dexie, - * so that it is always possible to throw or catch certain errors via - * Dexie.ErrorName. Example: - * - * try { - * throw new Dexie.InvalidTableError("Invalid table foo", innerError?); - * } catch (err) { - * if (err instanceof Dexie.InvalidTableError) { - * // Could also have check for err.name === "InvalidTableError", or - * // err.name === Dexie.errnames.InvalidTableError. - * console.log("Seems to be an invalid table here..."); - * } else { - * throw err; - * } - * } - */ -export type DexieErrors = { - // https://dexie.org/docs/DexieErrors/Dexie.OpenFailedError - OpenFailed: "OpenFailedError"; - // https://dexie.org/docs/DexieErrors/Dexie.VersionChangeError - VersionChange: "VersionChangeError"; - // https://dexie.org/docs/DexieErrors/Dexie.SchemaError - Schema: "SchemaError"; - // https://dexie.org/docs/DexieErrors/Dexie.UpgradeError - Upgrade: "UpgradeError"; - // https://dexie.org/docs/DexieErrors/Dexie.InvalidTableError - InvalidTable: "InvalidTableError"; - // https://dexie.org/docs/DexieErrors/Dexie.MissingAPIError - MissingAPI: "MissingAPIError"; - // https://dexie.org/docs/DexieErrors/Dexie.NoSuchDatabaseError - NoSuchDatabase: "NoSuchDatabaseError"; - // https://dexie.org/docs/DexieErrors/Dexie.InvalidArgumentError - InvalidArgument: "InvalidArgumentError"; - // https://dexie.org/docs/DexieErrors/Dexie.SubTransactionError - SubTransaction: "SubTransactionError"; - // https://dexie.org/docs/DexieErrors/Dexie.UnsupportedError - Unsupported: "UnsupportedError"; - // https://dexie.org/docs/DexieErrors/Dexie.InternalError - Internal: "InternalError"; - // https://dexie.org/docs/DexieErrors/Dexie.DatabaseClosedError - DatabaseClosed: "DatabaseClosedError"; - // https://dexie.org/docs/DexieErrors/Dexie.PrematureCommitError - PrematureCommit: "PrematureCommitError"; - // https://dexie.org/docs/DexieErrors/Dexie.ForeignAwaitError - ForeignAwait: "ForeignAwaitError"; - // https://dexie.org/docs/DexieErrors/Dexie.UnknownError - Unknown: "UnknownError"; - // https://dexie.org/docs/DexieErrors/Dexie.ConstraintError - Constraint: "ConstraintError"; - // https://dexie.org/docs/DexieErrors/Dexie.DataError - Data: "DataError"; - // https://dexie.org/docs/DexieErrors/Dexie.TransactionInactiveError - TransactionInactive: "TransactionInactiveError"; - // https://dexie.org/docs/DexieErrors/Dexie.ReadOnlyError - ReadOnly: "ReadOnlyError"; - // https://dexie.org/docs/DexieErrors/Dexie.VersionError - Version: "VersionError"; - // https://dexie.org/docs/DexieErrors/Dexie.NotFoundError - NotFound: "NotFoundError"; - // https://dexie.org/docs/DexieErrors/Dexie.InvalidStateError - InvalidState: "InvalidStateError"; - // https://dexie.org/docs/DexieErrors/Dexie.InvalidAccessError - InvalidAccess: "InvalidAccessError"; - // https://dexie.org/docs/DexieErrors/Dexie.AbortError - Abort: "AbortError"; - // https://dexie.org/docs/DexieErrors/Dexie.TimeoutError - Timeout: "TimeoutError"; - // https://dexie.org/docs/DexieErrors/Dexie.QuotaExceededError - QuotaExceeded: "QuotaExceededError"; - // https://dexie.org/docs/DexieErrors/Dexie.DataCloneError - DataClone: "DataCloneError"; -}; -/** ModifyError - * - * https://dexie.org/docs/DexieErrors/Dexie.ModifyError - */ -export interface ModifyError extends DexieError { - failures: Array; - failedKeys: IndexableTypeArrayReadonly; - successCount: number; -} -/** BulkError - * - * https://dexie.org/docs/DexieErrors/Dexie.BulkError - */ -export interface BulkError extends DexieError { - failures: Error[]; - failuresByPos: { - [operationNumber: number]: Error; - }; -} -export interface DexieErrorConstructor { - new (msg?: string, inner?: Object): DexieError; - new (inner: Object): DexieError; - prototype: DexieError; -} -export interface ModifyErrorConstructor { - new (msg?: string, failures?: any[], successCount?: number, failedKeys?: IndexableTypeArrayReadonly): ModifyError; - prototype: ModifyError; -} -export interface BulkErrorConstructor { - new (msg?: string, failures?: { - [operationNumber: number]: Error; - }): BulkError; - prototype: BulkError; -} -export type ExceptionSet = { - [P in DexieErrors[keyof DexieErrors]]: DexieErrorConstructor; -}; -export type DexieExceptionClasses = ExceptionSet & { - DexieError: DexieErrorConstructor; - ModifyError: ModifyErrorConstructor; - BulkError: BulkErrorConstructor; -}; -export interface DexieDOMDependencies { - indexedDB: IDBFactory; - IDBKeyRange: typeof IDBKeyRange; -} -declare global { - interface SymbolConstructor { - readonly observable: symbol; - } -} -export interface Subscribable { - subscribe(observer: Partial>): Unsubscribable; -} -export interface Unsubscribable { - unsubscribe(): void; -} -export interface Observable { - subscribe(observerOrNext?: Observer | ((value: T) => void)): Subscription; - subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription; - getValue?(): T; - hasValue?(): boolean; - [Symbol.observable]: () => Subscribable; -} -export interface Subscription { - unsubscribe(): void; - readonly closed: boolean; -} -export interface Observer { - start?: (subscription: Subscription) => void; - next?: (value: T) => void; - error?: (error: any) => void; - complete?: () => void; -} -export type GlobalQueryCache = { - // TODO: Change to parts: {[part: string]: TblQueryCache} - // och unsignaledParts: ObservabilitySet; - [part: string]: TblQueryCache; // part is `idb://${dbName}/${tableName}` -}; -export interface TblQueryCache { - queries: { - query: { - [indexName: string]: CacheEntry[]; - }; - count: { - [indexName: string]: CacheEntry[]; - }; - }; - objs: Map; - optimisticOps: DBCoreMutateRequest[]; - unsignaledParts: ObservabilitySet; -} -export interface CacheEntryCommon { - subscribers: Set<() => void>; - obsSet: ObservabilitySet; - //txObsSet: ObservabilitySet; - promise: Promise; - dirty: boolean; -} -export type CacheEntry = CacheEntryCommon & ({ - type: "query"; - req: DBCoreQueryRequest; - res?: readonly any[]; -} | { - type: "count"; - req: DBCoreCountRequest; - res?: number; -}); -export type ChromeTransactionDurability = "default" | "strict" | "relaxed"; -export interface DexieOptions { - addons?: Array<(db: Dexie) => void>; - autoOpen?: boolean; - indexedDB?: { - open: Function; - }; - IDBKeyRange?: { - bound: Function; - lowerBound: Function; - upperBound: Function; - }; - allowEmptyDB?: boolean; - modifyChunkSize?: number; - chromeTransactionDurability?: ChromeTransactionDurability; - cache?: "immutable" | "cloned" | "disabled"; -} -export interface DexieConstructor extends DexieExceptionClasses { - new (databaseName: string, options?: DexieOptions): Dexie; - prototype: Dexie; - addons: Array<(db: Dexie) => void>; - version: number; - semVer: string; - currentTransaction: Transaction; - waitFor(promise: PromiseLike | T, timeoutMilliseconds?: number): Promise; - getDatabaseNames(): Promise; - getDatabaseNames(thenShortcut: ThenShortcut): Promise; - vip(scopeFunction: () => U): U; - ignoreTransaction(fn: () => U): U; - disableBfCache?: boolean; - liveQuery(fn: () => T | Promise): Observable; - extendObservabilitySet(target: ObservabilitySet, newSet: ObservabilitySet): ObservabilitySet; - override(origFunc: F, overridedFactory: (fn: any) => any): F; // ? - getByKeyPath(obj: Object, keyPath: string | string[]): any; - setByKeyPath(obj: Object, keyPath: string | string[], value: any): void; - delByKeyPath(obj: Object, keyPath: string | string[]): void; - shallowClone(obj: T): T; - deepClone(obj: T): T; - asap(fn: Function): void; //? - maxKey: Array> | string; - minKey: number; - exists(dbName: string): Promise; - delete(dbName: string): Promise; - dependencies: DexieDOMDependencies; - default: Dexie; // Work-around for different build tools handling default imports differently. - cache: GlobalQueryCache; - debug: false | true | "dexie"; - Promise: PromiseExtendedConstructor; - //TableSchema: {}; // Deprecate! - //IndexSpec: {new():IndexSpec}; //? Deprecate - Events: (ctx?: any) => DexieEventSet; - on: GlobalDexieEvents; - errnames: DexieErrors; -} -export class Entity { - protected constructor(); - protected readonly db: TDexieSubClass; - table(): TableProp; -} -export type IsStrictlyAny = (T extends never ? true : false) extends false ? false : true; -/** Extract the union of literal method names in T - */ -export type MethodProps = { - [P in keyof T]: IsStrictlyAny extends true ? never // Plain property of type any (not method) - : T[P] extends (...args: any[]) => any ? P // a function (method) - : never; -}[keyof T]; -/** Default insert type of T is a subset of T where: - * * given optional props (such as an auto-generated primary key) are made optional - * * methods are omitted - */ -export type InsertType = Omit> & { - [P in OptionalProps]?: T[P]; -}; -/** IDType extract the actual type of the primary key: - * * If TKey is a literal type that names a property of T, extract the type using T[TKey] - * * Else, use TKey as is. - */ -export type IDType = IsStrictlyAny extends true ? TKeyPropNameOrKeyType : TKeyPropNameOrKeyType extends string ? TKeyPropNameOrKeyType extends keyof T ? T[TKeyPropNameOrKeyType] : TKeyPropNameOrKeyType : TKeyPropNameOrKeyType; -export type EntityTable> = Table, TInsertType>; -export declare var Dexie: DexieConstructor; -export interface _Table extends Table { -} -export interface _Collection extends Collection { -} -export declare module Dexie { - // The "Dexie.Promise" type. - type Promise = PromiseExtended; // Because many samples have been Dexie.Promise. - // The "Dexie.Table" interface. Same as named exported interface Table. - interface Table extends _Table { - } // Because all samples have been Dexie.Table<...> - // The "Dexie.Collection" interface. Same as named exported interface Collection. - interface Collection extends _Collection { - } // Because app-code may declare it. -} -export function liveQuery(querier: () => T | Promise): Observable; -export function mergeRanges(target: IntervalTree, newSet: IntervalTree): void; -export function rangesOverlap(rangeSet1: IntervalTree, rangeSet2: IntervalTree): boolean; -export function cmp(a: any, b: any): number; -export function replacePrefix(a: string, b: string): PropModification; -export function add(num: number | bigint | any[]): PropModification; -export function remove(num: number | bigint | any[]): PropModification; -/** Exporting 'Dexie' as the default export. - **/ -export default Dexie; - -export {}; diff --git a/src/assets/dexie/dist/dexie.js b/src/assets/dexie/dist/dexie.js deleted file mode 100644 index afafcc381..000000000 --- a/src/assets/dexie/dist/dexie.js +++ /dev/null @@ -1,5898 +0,0 @@ -/* - * Dexie.js - a minimalistic wrapper for IndexedDB - * =============================================== - * - * By David Fahlander, david.fahlander@gmail.com - * - * Version 4.0.7, Sun May 26 2024 - * - * https://dexie.org - * - * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/ - */ - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dexie = factory()); -})(this, (function () { 'use strict'; - - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } - var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - function __spreadArray(to, from, pack) { - if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; - } - } - return to.concat(ar || Array.prototype.slice.call(from)); - } - - var _global = typeof globalThis !== 'undefined' ? globalThis : - typeof self !== 'undefined' ? self : - typeof window !== 'undefined' ? window : - global; - - var keys = Object.keys; - var isArray = Array.isArray; - if (typeof Promise !== 'undefined' && !_global.Promise) { - _global.Promise = Promise; - } - function extend(obj, extension) { - if (typeof extension !== 'object') - return obj; - keys(extension).forEach(function (key) { - obj[key] = extension[key]; - }); - return obj; - } - var getProto = Object.getPrototypeOf; - var _hasOwn = {}.hasOwnProperty; - function hasOwn(obj, prop) { - return _hasOwn.call(obj, prop); - } - function props(proto, extension) { - if (typeof extension === 'function') - extension = extension(getProto(proto)); - (typeof Reflect === "undefined" ? keys : Reflect.ownKeys)(extension).forEach(function (key) { - setProp(proto, key, extension[key]); - }); - } - var defineProperty = Object.defineProperty; - function setProp(obj, prop, functionOrGetSet, options) { - defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, "get") && typeof functionOrGetSet.get === 'function' ? - { get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true } : - { value: functionOrGetSet, configurable: true, writable: true }, options)); - } - function derive(Child) { - return { - from: function (Parent) { - Child.prototype = Object.create(Parent.prototype); - setProp(Child.prototype, "constructor", Child); - return { - extend: props.bind(null, Child.prototype) - }; - } - }; - } - var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - function getPropertyDescriptor(obj, prop) { - var pd = getOwnPropertyDescriptor(obj, prop); - var proto; - return pd || (proto = getProto(obj)) && getPropertyDescriptor(proto, prop); - } - var _slice = [].slice; - function slice(args, start, end) { - return _slice.call(args, start, end); - } - function override(origFunc, overridedFactory) { - return overridedFactory(origFunc); - } - function assert(b) { - if (!b) - throw new Error("Assertion Failed"); - } - function asap$1(fn) { - if (_global.setImmediate) - setImmediate(fn); - else - setTimeout(fn, 0); - } - function arrayToObject(array, extractor) { - return array.reduce(function (result, item, i) { - var nameAndValue = extractor(item, i); - if (nameAndValue) - result[nameAndValue[0]] = nameAndValue[1]; - return result; - }, {}); - } - function getByKeyPath(obj, keyPath) { - if (typeof keyPath === 'string' && hasOwn(obj, keyPath)) - return obj[keyPath]; - if (!keyPath) - return obj; - if (typeof keyPath !== 'string') { - var rv = []; - for (var i = 0, l = keyPath.length; i < l; ++i) { - var val = getByKeyPath(obj, keyPath[i]); - rv.push(val); - } - return rv; - } - var period = keyPath.indexOf('.'); - if (period !== -1) { - var innerObj = obj[keyPath.substr(0, period)]; - return innerObj == null ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1)); - } - return undefined; - } - function setByKeyPath(obj, keyPath, value) { - if (!obj || keyPath === undefined) - return; - if ('isFrozen' in Object && Object.isFrozen(obj)) - return; - if (typeof keyPath !== 'string' && 'length' in keyPath) { - assert(typeof value !== 'string' && 'length' in value); - for (var i = 0, l = keyPath.length; i < l; ++i) { - setByKeyPath(obj, keyPath[i], value[i]); - } - } - else { - var period = keyPath.indexOf('.'); - if (period !== -1) { - var currentKeyPath = keyPath.substr(0, period); - var remainingKeyPath = keyPath.substr(period + 1); - if (remainingKeyPath === "") - if (value === undefined) { - if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) - obj.splice(currentKeyPath, 1); - else - delete obj[currentKeyPath]; - } - else - obj[currentKeyPath] = value; - else { - var innerObj = obj[currentKeyPath]; - if (!innerObj || !hasOwn(obj, currentKeyPath)) - innerObj = (obj[currentKeyPath] = {}); - setByKeyPath(innerObj, remainingKeyPath, value); - } - } - else { - if (value === undefined) { - if (isArray(obj) && !isNaN(parseInt(keyPath))) - obj.splice(keyPath, 1); - else - delete obj[keyPath]; - } - else - obj[keyPath] = value; - } - } - } - function delByKeyPath(obj, keyPath) { - if (typeof keyPath === 'string') - setByKeyPath(obj, keyPath, undefined); - else if ('length' in keyPath) - [].map.call(keyPath, function (kp) { - setByKeyPath(obj, kp, undefined); - }); - } - function shallowClone(obj) { - var rv = {}; - for (var m in obj) { - if (hasOwn(obj, m)) - rv[m] = obj[m]; - } - return rv; - } - var concat = [].concat; - function flatten(a) { - return concat.apply([], a); - } - var intrinsicTypeNames = "BigUint64Array,BigInt64Array,Array,Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,FileSystemDirectoryHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey" - .split(',').concat(flatten([8, 16, 32, 64].map(function (num) { return ["Int", "Uint", "Float"].map(function (t) { return t + num + "Array"; }); }))).filter(function (t) { return _global[t]; }); - var intrinsicTypes = new Set(intrinsicTypeNames.map(function (t) { return _global[t]; })); - function cloneSimpleObjectTree(o) { - var rv = {}; - for (var k in o) - if (hasOwn(o, k)) { - var v = o[k]; - rv[k] = !v || typeof v !== 'object' || intrinsicTypes.has(v.constructor) ? v : cloneSimpleObjectTree(v); - } - return rv; - } - function objectIsEmpty(o) { - for (var k in o) - if (hasOwn(o, k)) - return false; - return true; - } - var circularRefs = null; - function deepClone(any) { - circularRefs = new WeakMap(); - var rv = innerDeepClone(any); - circularRefs = null; - return rv; - } - function innerDeepClone(x) { - if (!x || typeof x !== 'object') - return x; - var rv = circularRefs.get(x); - if (rv) - return rv; - if (isArray(x)) { - rv = []; - circularRefs.set(x, rv); - for (var i = 0, l = x.length; i < l; ++i) { - rv.push(innerDeepClone(x[i])); - } - } - else if (intrinsicTypes.has(x.constructor)) { - rv = x; - } - else { - var proto = getProto(x); - rv = proto === Object.prototype ? {} : Object.create(proto); - circularRefs.set(x, rv); - for (var prop in x) { - if (hasOwn(x, prop)) { - rv[prop] = innerDeepClone(x[prop]); - } - } - } - return rv; - } - var toString = {}.toString; - function toStringTag(o) { - return toString.call(o).slice(8, -1); - } - var iteratorSymbol = typeof Symbol !== 'undefined' ? - Symbol.iterator : - '@@iterator'; - var getIteratorOf = typeof iteratorSymbol === "symbol" ? function (x) { - var i; - return x != null && (i = x[iteratorSymbol]) && i.apply(x); - } : function () { return null; }; - function delArrayItem(a, x) { - var i = a.indexOf(x); - if (i >= 0) - a.splice(i, 1); - return i >= 0; - } - var NO_CHAR_ARRAY = {}; - function getArrayOf(arrayLike) { - var i, a, x, it; - if (arguments.length === 1) { - if (isArray(arrayLike)) - return arrayLike.slice(); - if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') - return [arrayLike]; - if ((it = getIteratorOf(arrayLike))) { - a = []; - while ((x = it.next()), !x.done) - a.push(x.value); - return a; - } - if (arrayLike == null) - return [arrayLike]; - i = arrayLike.length; - if (typeof i === 'number') { - a = new Array(i); - while (i--) - a[i] = arrayLike[i]; - return a; - } - return [arrayLike]; - } - i = arguments.length; - a = new Array(i); - while (i--) - a[i] = arguments[i]; - return a; - } - var isAsyncFunction = typeof Symbol !== 'undefined' - ? function (fn) { return fn[Symbol.toStringTag] === 'AsyncFunction'; } - : function () { return false; }; - - var dexieErrorNames = [ - 'Modify', - 'Bulk', - 'OpenFailed', - 'VersionChange', - 'Schema', - 'Upgrade', - 'InvalidTable', - 'MissingAPI', - 'NoSuchDatabase', - 'InvalidArgument', - 'SubTransaction', - 'Unsupported', - 'Internal', - 'DatabaseClosed', - 'PrematureCommit', - 'ForeignAwait' - ]; - var idbDomErrorNames = [ - 'Unknown', - 'Constraint', - 'Data', - 'TransactionInactive', - 'ReadOnly', - 'Version', - 'NotFound', - 'InvalidState', - 'InvalidAccess', - 'Abort', - 'Timeout', - 'QuotaExceeded', - 'Syntax', - 'DataClone' - ]; - var errorList = dexieErrorNames.concat(idbDomErrorNames); - var defaultTexts = { - VersionChanged: "Database version changed by other database connection", - DatabaseClosed: "Database has been closed", - Abort: "Transaction aborted", - TransactionInactive: "Transaction has already completed or failed", - MissingAPI: "IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb" - }; - function DexieError(name, msg) { - this.name = name; - this.message = msg; - } - derive(DexieError).from(Error).extend({ - toString: function () { return this.name + ": " + this.message; } - }); - function getMultiErrorMessage(msg, failures) { - return msg + ". Errors: " + Object.keys(failures) - .map(function (key) { return failures[key].toString(); }) - .filter(function (v, i, s) { return s.indexOf(v) === i; }) - .join('\n'); - } - function ModifyError(msg, failures, successCount, failedKeys) { - this.failures = failures; - this.failedKeys = failedKeys; - this.successCount = successCount; - this.message = getMultiErrorMessage(msg, failures); - } - derive(ModifyError).from(DexieError); - function BulkError(msg, failures) { - this.name = "BulkError"; - this.failures = Object.keys(failures).map(function (pos) { return failures[pos]; }); - this.failuresByPos = failures; - this.message = getMultiErrorMessage(msg, this.failures); - } - derive(BulkError).from(DexieError); - var errnames = errorList.reduce(function (obj, name) { return (obj[name] = name + "Error", obj); }, {}); - var BaseException = DexieError; - var exceptions = errorList.reduce(function (obj, name) { - var fullName = name + "Error"; - function DexieError(msgOrInner, inner) { - this.name = fullName; - if (!msgOrInner) { - this.message = defaultTexts[name] || fullName; - this.inner = null; - } - else if (typeof msgOrInner === 'string') { - this.message = "".concat(msgOrInner).concat(!inner ? '' : '\n ' + inner); - this.inner = inner || null; - } - else if (typeof msgOrInner === 'object') { - this.message = "".concat(msgOrInner.name, " ").concat(msgOrInner.message); - this.inner = msgOrInner; - } - } - derive(DexieError).from(BaseException); - obj[name] = DexieError; - return obj; - }, {}); - exceptions.Syntax = SyntaxError; - exceptions.Type = TypeError; - exceptions.Range = RangeError; - var exceptionMap = idbDomErrorNames.reduce(function (obj, name) { - obj[name + "Error"] = exceptions[name]; - return obj; - }, {}); - function mapError(domError, message) { - if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name]) - return domError; - var rv = new exceptionMap[domError.name](message || domError.message, domError); - if ("stack" in domError) { - setProp(rv, "stack", { get: function () { - return this.inner.stack; - } }); - } - return rv; - } - var fullNameExceptions = errorList.reduce(function (obj, name) { - if (["Syntax", "Type", "Range"].indexOf(name) === -1) - obj[name + "Error"] = exceptions[name]; - return obj; - }, {}); - fullNameExceptions.ModifyError = ModifyError; - fullNameExceptions.DexieError = DexieError; - fullNameExceptions.BulkError = BulkError; - - function nop() { } - function mirror(val) { return val; } - function pureFunctionChain(f1, f2) { - if (f1 == null || f1 === mirror) - return f2; - return function (val) { - return f2(f1(val)); - }; - } - function callBoth(on1, on2) { - return function () { - on1.apply(this, arguments); - on2.apply(this, arguments); - }; - } - function hookCreatingChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - var res = f1.apply(this, arguments); - if (res !== undefined) - arguments[0] = res; - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = null; - this.onerror = null; - var res2 = f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - return res2 !== undefined ? res2 : res; - }; - } - function hookDeletingChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - f1.apply(this, arguments); - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = this.onerror = null; - f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - }; - } - function hookUpdatingChain(f1, f2) { - if (f1 === nop) - return f2; - return function (modifications) { - var res = f1.apply(this, arguments); - extend(modifications, res); - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = null; - this.onerror = null; - var res2 = f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - return res === undefined ? - (res2 === undefined ? undefined : res2) : - (extend(res, res2)); - }; - } - function reverseStoppableEventChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - if (f2.apply(this, arguments) === false) - return false; - return f1.apply(this, arguments); - }; - } - function promisableChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - var res = f1.apply(this, arguments); - if (res && typeof res.then === 'function') { - var thiz = this, i = arguments.length, args = new Array(i); - while (i--) - args[i] = arguments[i]; - return res.then(function () { - return f2.apply(thiz, args); - }); - } - return f2.apply(this, arguments); - }; - } - - var debug = typeof location !== 'undefined' && - /^(http|https):\/\/(localhost|127\.0\.0\.1)/.test(location.href); - function setDebug(value, filter) { - debug = value; - } - - var INTERNAL = {}; - var ZONE_ECHO_LIMIT = 100, _a$1 = typeof Promise === 'undefined' ? - [] : - (function () { - var globalP = Promise.resolve(); - if (typeof crypto === 'undefined' || !crypto.subtle) - return [globalP, getProto(globalP), globalP]; - var nativeP = crypto.subtle.digest("SHA-512", new Uint8Array([0])); - return [ - nativeP, - getProto(nativeP), - globalP - ]; - })(), resolvedNativePromise = _a$1[0], nativePromiseProto = _a$1[1], resolvedGlobalPromise = _a$1[2], nativePromiseThen = nativePromiseProto && nativePromiseProto.then; - var NativePromise = resolvedNativePromise && resolvedNativePromise.constructor; - var patchGlobalPromise = !!resolvedGlobalPromise; - function schedulePhysicalTick() { - queueMicrotask(physicalTick); - } - var asap = function (callback, args) { - microtickQueue.push([callback, args]); - if (needsNewPhysicalTick) { - schedulePhysicalTick(); - needsNewPhysicalTick = false; - } - }; - var isOutsideMicroTick = true, - needsNewPhysicalTick = true, - unhandledErrors = [], - rejectingErrors = [], - rejectionMapper = mirror; - var globalPSD = { - id: 'global', - global: true, - ref: 0, - unhandleds: [], - onunhandled: nop, - pgp: false, - env: {}, - finalize: nop - }; - var PSD = globalPSD; - var microtickQueue = []; - var numScheduledCalls = 0; - var tickFinalizers = []; - function DexiePromise(fn) { - if (typeof this !== 'object') - throw new TypeError('Promises must be constructed via new'); - this._listeners = []; - this._lib = false; - var psd = (this._PSD = PSD); - if (typeof fn !== 'function') { - if (fn !== INTERNAL) - throw new TypeError('Not a function'); - this._state = arguments[1]; - this._value = arguments[2]; - if (this._state === false) - handleRejection(this, this._value); - return; - } - this._state = null; - this._value = null; - ++psd.ref; - executePromiseTask(this, fn); - } - var thenProp = { - get: function () { - var psd = PSD, microTaskId = totalEchoes; - function then(onFulfilled, onRejected) { - var _this = this; - var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes); - var cleanup = possibleAwait && !decrementExpectedAwaits(); - var rv = new DexiePromise(function (resolve, reject) { - propagateToListener(_this, new Listener(nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup), nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup), resolve, reject, psd)); - }); - if (this._consoleTask) - rv._consoleTask = this._consoleTask; - return rv; - } - then.prototype = INTERNAL; - return then; - }, - set: function (value) { - setProp(this, 'then', value && value.prototype === INTERNAL ? - thenProp : - { - get: function () { - return value; - }, - set: thenProp.set - }); - } - }; - props(DexiePromise.prototype, { - then: thenProp, - _then: function (onFulfilled, onRejected) { - propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); - }, - catch: function (onRejected) { - if (arguments.length === 1) - return this.then(null, onRejected); - var type = arguments[0], handler = arguments[1]; - return typeof type === 'function' ? this.then(null, function (err) { - return err instanceof type ? handler(err) : PromiseReject(err); - }) - : this.then(null, function (err) { - return err && err.name === type ? handler(err) : PromiseReject(err); - }); - }, - finally: function (onFinally) { - return this.then(function (value) { - return DexiePromise.resolve(onFinally()).then(function () { return value; }); - }, function (err) { - return DexiePromise.resolve(onFinally()).then(function () { return PromiseReject(err); }); - }); - }, - timeout: function (ms, msg) { - var _this = this; - return ms < Infinity ? - new DexiePromise(function (resolve, reject) { - var handle = setTimeout(function () { return reject(new exceptions.Timeout(msg)); }, ms); - _this.then(resolve, reject).finally(clearTimeout.bind(null, handle)); - }) : this; - } - }); - if (typeof Symbol !== 'undefined' && Symbol.toStringTag) - setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise'); - globalPSD.env = snapShot(); - function Listener(onFulfilled, onRejected, resolve, reject, zone) { - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; - this.onRejected = typeof onRejected === 'function' ? onRejected : null; - this.resolve = resolve; - this.reject = reject; - this.psd = zone; - } - props(DexiePromise, { - all: function () { - var values = getArrayOf.apply(null, arguments) - .map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - if (values.length === 0) - resolve([]); - var remaining = values.length; - values.forEach(function (a, i) { return DexiePromise.resolve(a).then(function (x) { - values[i] = x; - if (!--remaining) - resolve(values); - }, reject); }); - }); - }, - resolve: function (value) { - if (value instanceof DexiePromise) - return value; - if (value && typeof value.then === 'function') - return new DexiePromise(function (resolve, reject) { - value.then(resolve, reject); - }); - var rv = new DexiePromise(INTERNAL, true, value); - return rv; - }, - reject: PromiseReject, - race: function () { - var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - values.map(function (value) { return DexiePromise.resolve(value).then(resolve, reject); }); - }); - }, - PSD: { - get: function () { return PSD; }, - set: function (value) { return PSD = value; } - }, - totalEchoes: { get: function () { return totalEchoes; } }, - newPSD: newScope, - usePSD: usePSD, - scheduler: { - get: function () { return asap; }, - set: function (value) { asap = value; } - }, - rejectionMapper: { - get: function () { return rejectionMapper; }, - set: function (value) { rejectionMapper = value; } - }, - follow: function (fn, zoneProps) { - return new DexiePromise(function (resolve, reject) { - return newScope(function (resolve, reject) { - var psd = PSD; - psd.unhandleds = []; - psd.onunhandled = reject; - psd.finalize = callBoth(function () { - var _this = this; - run_at_end_of_this_or_next_physical_tick(function () { - _this.unhandleds.length === 0 ? resolve() : reject(_this.unhandleds[0]); - }); - }, psd.finalize); - fn(); - }, zoneProps, resolve, reject); - }); - } - }); - if (NativePromise) { - if (NativePromise.allSettled) - setProp(DexiePromise, "allSettled", function () { - var possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(function (resolve) { - if (possiblePromises.length === 0) - resolve([]); - var remaining = possiblePromises.length; - var results = new Array(remaining); - possiblePromises.forEach(function (p, i) { return DexiePromise.resolve(p).then(function (value) { return results[i] = { status: "fulfilled", value: value }; }, function (reason) { return results[i] = { status: "rejected", reason: reason }; }) - .then(function () { return --remaining || resolve(results); }); }); - }); - }); - if (NativePromise.any && typeof AggregateError !== 'undefined') - setProp(DexiePromise, "any", function () { - var possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - if (possiblePromises.length === 0) - reject(new AggregateError([])); - var remaining = possiblePromises.length; - var failures = new Array(remaining); - possiblePromises.forEach(function (p, i) { return DexiePromise.resolve(p).then(function (value) { return resolve(value); }, function (failure) { - failures[i] = failure; - if (!--remaining) - reject(new AggregateError(failures)); - }); }); - }); - }); - } - function executePromiseTask(promise, fn) { - try { - fn(function (value) { - if (promise._state !== null) - return; - if (value === promise) - throw new TypeError('A promise cannot be resolved with itself.'); - var shouldExecuteTick = promise._lib && beginMicroTickScope(); - if (value && typeof value.then === 'function') { - executePromiseTask(promise, function (resolve, reject) { - value instanceof DexiePromise ? - value._then(resolve, reject) : - value.then(resolve, reject); - }); - } - else { - promise._state = true; - promise._value = value; - propagateAllListeners(promise); - } - if (shouldExecuteTick) - endMicroTickScope(); - }, handleRejection.bind(null, promise)); - } - catch (ex) { - handleRejection(promise, ex); - } - } - function handleRejection(promise, reason) { - rejectingErrors.push(reason); - if (promise._state !== null) - return; - var shouldExecuteTick = promise._lib && beginMicroTickScope(); - reason = rejectionMapper(reason); - promise._state = false; - promise._value = reason; - addPossiblyUnhandledError(promise); - propagateAllListeners(promise); - if (shouldExecuteTick) - endMicroTickScope(); - } - function propagateAllListeners(promise) { - var listeners = promise._listeners; - promise._listeners = []; - for (var i = 0, len = listeners.length; i < len; ++i) { - propagateToListener(promise, listeners[i]); - } - var psd = promise._PSD; - --psd.ref || psd.finalize(); - if (numScheduledCalls === 0) { - ++numScheduledCalls; - asap(function () { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - }, []); - } - } - function propagateToListener(promise, listener) { - if (promise._state === null) { - promise._listeners.push(listener); - return; - } - var cb = promise._state ? listener.onFulfilled : listener.onRejected; - if (cb === null) { - return (promise._state ? listener.resolve : listener.reject)(promise._value); - } - ++listener.psd.ref; - ++numScheduledCalls; - asap(callListener, [cb, promise, listener]); - } - function callListener(cb, promise, listener) { - try { - var ret, value = promise._value; - if (!promise._state && rejectingErrors.length) - rejectingErrors = []; - ret = debug && promise._consoleTask ? promise._consoleTask.run(function () { return cb(value); }) : cb(value); - if (!promise._state && rejectingErrors.indexOf(value) === -1) { - markErrorAsHandled(promise); - } - listener.resolve(ret); - } - catch (e) { - listener.reject(e); - } - finally { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - --listener.psd.ref || listener.psd.finalize(); - } - } - function physicalTick() { - usePSD(globalPSD, function () { - beginMicroTickScope() && endMicroTickScope(); - }); - } - function beginMicroTickScope() { - var wasRootExec = isOutsideMicroTick; - isOutsideMicroTick = false; - needsNewPhysicalTick = false; - return wasRootExec; - } - function endMicroTickScope() { - var callbacks, i, l; - do { - while (microtickQueue.length > 0) { - callbacks = microtickQueue; - microtickQueue = []; - l = callbacks.length; - for (i = 0; i < l; ++i) { - var item = callbacks[i]; - item[0].apply(null, item[1]); - } - } - } while (microtickQueue.length > 0); - isOutsideMicroTick = true; - needsNewPhysicalTick = true; - } - function finalizePhysicalTick() { - var unhandledErrs = unhandledErrors; - unhandledErrors = []; - unhandledErrs.forEach(function (p) { - p._PSD.onunhandled.call(null, p._value, p); - }); - var finalizers = tickFinalizers.slice(0); - var i = finalizers.length; - while (i) - finalizers[--i](); - } - function run_at_end_of_this_or_next_physical_tick(fn) { - function finalizer() { - fn(); - tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1); - } - tickFinalizers.push(finalizer); - ++numScheduledCalls; - asap(function () { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - }, []); - } - function addPossiblyUnhandledError(promise) { - if (!unhandledErrors.some(function (p) { return p._value === promise._value; })) - unhandledErrors.push(promise); - } - function markErrorAsHandled(promise) { - var i = unhandledErrors.length; - while (i) - if (unhandledErrors[--i]._value === promise._value) { - unhandledErrors.splice(i, 1); - return; - } - } - function PromiseReject(reason) { - return new DexiePromise(INTERNAL, false, reason); - } - function wrap(fn, errorCatcher) { - var psd = PSD; - return function () { - var wasRootExec = beginMicroTickScope(), outerScope = PSD; - try { - switchToZone(psd, true); - return fn.apply(this, arguments); - } - catch (e) { - errorCatcher && errorCatcher(e); - } - finally { - switchToZone(outerScope, false); - if (wasRootExec) - endMicroTickScope(); - } - }; - } - var task = { awaits: 0, echoes: 0, id: 0 }; - var taskCounter = 0; - var zoneStack = []; - var zoneEchoes = 0; - var totalEchoes = 0; - var zone_id_counter = 0; - function newScope(fn, props, a1, a2) { - var parent = PSD, psd = Object.create(parent); - psd.parent = parent; - psd.ref = 0; - psd.global = false; - psd.id = ++zone_id_counter; - globalPSD.env; - psd.env = patchGlobalPromise ? { - Promise: DexiePromise, - PromiseProp: { value: DexiePromise, configurable: true, writable: true }, - all: DexiePromise.all, - race: DexiePromise.race, - allSettled: DexiePromise.allSettled, - any: DexiePromise.any, - resolve: DexiePromise.resolve, - reject: DexiePromise.reject, - } : {}; - if (props) - extend(psd, props); - ++parent.ref; - psd.finalize = function () { - --this.parent.ref || this.parent.finalize(); - }; - var rv = usePSD(psd, fn, a1, a2); - if (psd.ref === 0) - psd.finalize(); - return rv; - } - function incrementExpectedAwaits() { - if (!task.id) - task.id = ++taskCounter; - ++task.awaits; - task.echoes += ZONE_ECHO_LIMIT; - return task.id; - } - function decrementExpectedAwaits() { - if (!task.awaits) - return false; - if (--task.awaits === 0) - task.id = 0; - task.echoes = task.awaits * ZONE_ECHO_LIMIT; - return true; - } - if (('' + nativePromiseThen).indexOf('[native code]') === -1) { - incrementExpectedAwaits = decrementExpectedAwaits = nop; - } - function onPossibleParallellAsync(possiblePromise) { - if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) { - incrementExpectedAwaits(); - return possiblePromise.then(function (x) { - decrementExpectedAwaits(); - return x; - }, function (e) { - decrementExpectedAwaits(); - return rejection(e); - }); - } - return possiblePromise; - } - function zoneEnterEcho(targetZone) { - ++totalEchoes; - if (!task.echoes || --task.echoes === 0) { - task.echoes = task.awaits = task.id = 0; - } - zoneStack.push(PSD); - switchToZone(targetZone, true); - } - function zoneLeaveEcho() { - var zone = zoneStack[zoneStack.length - 1]; - zoneStack.pop(); - switchToZone(zone, false); - } - function switchToZone(targetZone, bEnteringZone) { - var currentZone = PSD; - if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) { - queueMicrotask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho); - } - if (targetZone === PSD) - return; - PSD = targetZone; - if (currentZone === globalPSD) - globalPSD.env = snapShot(); - if (patchGlobalPromise) { - var GlobalPromise = globalPSD.env.Promise; - var targetEnv = targetZone.env; - if (currentZone.global || targetZone.global) { - Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp); - GlobalPromise.all = targetEnv.all; - GlobalPromise.race = targetEnv.race; - GlobalPromise.resolve = targetEnv.resolve; - GlobalPromise.reject = targetEnv.reject; - if (targetEnv.allSettled) - GlobalPromise.allSettled = targetEnv.allSettled; - if (targetEnv.any) - GlobalPromise.any = targetEnv.any; - } - } - } - function snapShot() { - var GlobalPromise = _global.Promise; - return patchGlobalPromise ? { - Promise: GlobalPromise, - PromiseProp: Object.getOwnPropertyDescriptor(_global, "Promise"), - all: GlobalPromise.all, - race: GlobalPromise.race, - allSettled: GlobalPromise.allSettled, - any: GlobalPromise.any, - resolve: GlobalPromise.resolve, - reject: GlobalPromise.reject, - } : {}; - } - function usePSD(psd, fn, a1, a2, a3) { - var outerScope = PSD; - try { - switchToZone(psd, true); - return fn(a1, a2, a3); - } - finally { - switchToZone(outerScope, false); - } - } - function nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) { - return typeof fn !== 'function' ? fn : function () { - var outerZone = PSD; - if (possibleAwait) - incrementExpectedAwaits(); - switchToZone(zone, true); - try { - return fn.apply(this, arguments); - } - finally { - switchToZone(outerZone, false); - if (cleanup) - queueMicrotask(decrementExpectedAwaits); - } - }; - } - function execInGlobalContext(cb) { - if (Promise === NativePromise && task.echoes === 0) { - if (zoneEchoes === 0) { - cb(); - } - else { - enqueueNativeMicroTask(cb); - } - } - else { - setTimeout(cb, 0); - } - } - var rejection = DexiePromise.reject; - - function tempTransaction(db, mode, storeNames, fn) { - if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) { - if (db._state.openComplete) { - return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError)); - } - if (!db._state.isBeingOpened) { - if (!db._state.autoOpen) - return rejection(new exceptions.DatabaseClosed()); - db.open().catch(nop); - } - return db._state.dbReadyPromise.then(function () { return tempTransaction(db, mode, storeNames, fn); }); - } - else { - var trans = db._createTransaction(mode, storeNames, db._dbSchema); - try { - trans.create(); - db._state.PR1398_maxLoop = 3; - } - catch (ex) { - if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { - console.warn('Dexie: Need to reopen db'); - db.close({ disableAutoOpen: false }); - return db.open().then(function () { return tempTransaction(db, mode, storeNames, fn); }); - } - return rejection(ex); - } - return trans._promise(mode, function (resolve, reject) { - return newScope(function () { - PSD.trans = trans; - return fn(resolve, reject, trans); - }); - }).then(function (result) { - if (mode === 'readwrite') - try { - trans.idbtrans.commit(); - } - catch (_a) { } - return mode === 'readonly' ? result : trans._completion.then(function () { return result; }); - }); - } - } - - var DEXIE_VERSION = '4.0.7'; - var maxString = String.fromCharCode(65535); - var minKey = -Infinity; - var INVALID_KEY_ARGUMENT = "Invalid key provided. Keys must be of type string, number, Date or Array."; - var STRING_EXPECTED = "String expected."; - var connections = []; - var DBNAMES_DB = '__dbnames'; - var READONLY = 'readonly'; - var READWRITE = 'readwrite'; - - function combine(filter1, filter2) { - return filter1 ? - filter2 ? - function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } : - filter1 : - filter2; - } - - var AnyRange = { - type: 3 , - lower: -Infinity, - lowerOpen: false, - upper: [[]], - upperOpen: false - }; - - function workaroundForUndefinedPrimKey(keyPath) { - return typeof keyPath === "string" && !/\./.test(keyPath) - ? function (obj) { - if (obj[keyPath] === undefined && (keyPath in obj)) { - obj = deepClone(obj); - delete obj[keyPath]; - } - return obj; - } - : function (obj) { return obj; }; - } - - function Entity() { - throw exceptions.Type(); - } - - function cmp(a, b) { - try { - var ta = type(a); - var tb = type(b); - if (ta !== tb) { - if (ta === 'Array') - return 1; - if (tb === 'Array') - return -1; - if (ta === 'binary') - return 1; - if (tb === 'binary') - return -1; - if (ta === 'string') - return 1; - if (tb === 'string') - return -1; - if (ta === 'Date') - return 1; - if (tb !== 'Date') - return NaN; - return -1; - } - switch (ta) { - case 'number': - case 'Date': - case 'string': - return a > b ? 1 : a < b ? -1 : 0; - case 'binary': { - return compareUint8Arrays(getUint8Array(a), getUint8Array(b)); - } - case 'Array': - return compareArrays(a, b); - } - } - catch (_a) { } - return NaN; - } - function compareArrays(a, b) { - var al = a.length; - var bl = b.length; - var l = al < bl ? al : bl; - for (var i = 0; i < l; ++i) { - var res = cmp(a[i], b[i]); - if (res !== 0) - return res; - } - return al === bl ? 0 : al < bl ? -1 : 1; - } - function compareUint8Arrays(a, b) { - var al = a.length; - var bl = b.length; - var l = al < bl ? al : bl; - for (var i = 0; i < l; ++i) { - if (a[i] !== b[i]) - return a[i] < b[i] ? -1 : 1; - } - return al === bl ? 0 : al < bl ? -1 : 1; - } - function type(x) { - var t = typeof x; - if (t !== 'object') - return t; - if (ArrayBuffer.isView(x)) - return 'binary'; - var tsTag = toStringTag(x); - return tsTag === 'ArrayBuffer' ? 'binary' : tsTag; - } - function getUint8Array(a) { - if (a instanceof Uint8Array) - return a; - if (ArrayBuffer.isView(a)) - return new Uint8Array(a.buffer, a.byteOffset, a.byteLength); - return new Uint8Array(a); - } - - var Table = (function () { - function Table() { - } - Table.prototype._trans = function (mode, fn, writeLocked) { - var trans = this._tx || PSD.trans; - var tableName = this.name; - var task = debug && typeof console !== 'undefined' && console.createTask && console.createTask("Dexie: ".concat(mode === 'readonly' ? 'read' : 'write', " ").concat(this.name)); - function checkTableInTransaction(resolve, reject, trans) { - if (!trans.schema[tableName]) - throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); - return fn(trans.idbtrans, trans); - } - var wasRootExec = beginMicroTickScope(); - try { - var p = trans && trans.db._novip === this.db._novip ? - trans === PSD.trans ? - trans._promise(mode, checkTableInTransaction, writeLocked) : - newScope(function () { return trans._promise(mode, checkTableInTransaction, writeLocked); }, { trans: trans, transless: PSD.transless || PSD }) : - tempTransaction(this.db, mode, [this.name], checkTableInTransaction); - if (task) { - p._consoleTask = task; - p = p.catch(function (err) { - console.trace(err); - return rejection(err); - }); - } - return p; - } - finally { - if (wasRootExec) - endMicroTickScope(); - } - }; - Table.prototype.get = function (keyOrCrit, cb) { - var _this = this; - if (keyOrCrit && keyOrCrit.constructor === Object) - return this.where(keyOrCrit).first(cb); - if (keyOrCrit == null) - return rejection(new exceptions.Type("Invalid argument to Table.get()")); - return this._trans('readonly', function (trans) { - return _this.core.get({ trans: trans, key: keyOrCrit }) - .then(function (res) { return _this.hook.reading.fire(res); }); - }).then(cb); - }; - Table.prototype.where = function (indexOrCrit) { - if (typeof indexOrCrit === 'string') - return new this.db.WhereClause(this, indexOrCrit); - if (isArray(indexOrCrit)) - return new this.db.WhereClause(this, "[".concat(indexOrCrit.join('+'), "]")); - var keyPaths = keys(indexOrCrit); - if (keyPaths.length === 1) - return this - .where(keyPaths[0]) - .equals(indexOrCrit[keyPaths[0]]); - var compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(function (ix) { - if (ix.compound && - keyPaths.every(function (keyPath) { return ix.keyPath.indexOf(keyPath) >= 0; })) { - for (var i = 0; i < keyPaths.length; ++i) { - if (keyPaths.indexOf(ix.keyPath[i]) === -1) - return false; - } - return true; - } - return false; - }).sort(function (a, b) { return a.keyPath.length - b.keyPath.length; })[0]; - if (compoundIndex && this.db._maxKey !== maxString) { - var keyPathsInValidOrder = compoundIndex.keyPath.slice(0, keyPaths.length); - return this - .where(keyPathsInValidOrder) - .equals(keyPathsInValidOrder.map(function (kp) { return indexOrCrit[kp]; })); - } - if (!compoundIndex && debug) - console.warn("The query ".concat(JSON.stringify(indexOrCrit), " on ").concat(this.name, " would benefit from a ") + - "compound index [".concat(keyPaths.join('+'), "]")); - var idxByName = this.schema.idxByName; - var idb = this.db._deps.indexedDB; - function equals(a, b) { - return idb.cmp(a, b) === 0; - } - var _a = keyPaths.reduce(function (_a, keyPath) { - var prevIndex = _a[0], prevFilterFn = _a[1]; - var index = idxByName[keyPath]; - var value = indexOrCrit[keyPath]; - return [ - prevIndex || index, - prevIndex || !index ? - combine(prevFilterFn, index && index.multi ? - function (x) { - var prop = getByKeyPath(x, keyPath); - return isArray(prop) && prop.some(function (item) { return equals(value, item); }); - } : function (x) { return equals(value, getByKeyPath(x, keyPath)); }) - : prevFilterFn - ]; - }, [null, null]), idx = _a[0], filterFunction = _a[1]; - return idx ? - this.where(idx.name).equals(indexOrCrit[idx.keyPath]) - .filter(filterFunction) : - compoundIndex ? - this.filter(filterFunction) : - this.where(keyPaths).equals(''); - }; - Table.prototype.filter = function (filterFunction) { - return this.toCollection().and(filterFunction); - }; - Table.prototype.count = function (thenShortcut) { - return this.toCollection().count(thenShortcut); - }; - Table.prototype.offset = function (offset) { - return this.toCollection().offset(offset); - }; - Table.prototype.limit = function (numRows) { - return this.toCollection().limit(numRows); - }; - Table.prototype.each = function (callback) { - return this.toCollection().each(callback); - }; - Table.prototype.toArray = function (thenShortcut) { - return this.toCollection().toArray(thenShortcut); - }; - Table.prototype.toCollection = function () { - return new this.db.Collection(new this.db.WhereClause(this)); - }; - Table.prototype.orderBy = function (index) { - return new this.db.Collection(new this.db.WhereClause(this, isArray(index) ? - "[".concat(index.join('+'), "]") : - index)); - }; - Table.prototype.reverse = function () { - return this.toCollection().reverse(); - }; - Table.prototype.mapToClass = function (constructor) { - var _a = this, db = _a.db, tableName = _a.name; - this.schema.mappedClass = constructor; - if (constructor.prototype instanceof Entity) { - constructor = (function (_super) { - __extends(class_1, _super); - function class_1() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(class_1.prototype, "db", { - get: function () { return db; }, - enumerable: false, - configurable: true - }); - class_1.prototype.table = function () { return tableName; }; - return class_1; - }(constructor)); - } - var inheritedProps = new Set(); - for (var proto = constructor.prototype; proto; proto = getProto(proto)) { - Object.getOwnPropertyNames(proto).forEach(function (propName) { return inheritedProps.add(propName); }); - } - var readHook = function (obj) { - if (!obj) - return obj; - var res = Object.create(constructor.prototype); - for (var m in obj) - if (!inheritedProps.has(m)) - try { - res[m] = obj[m]; - } - catch (_) { } - return res; - }; - if (this.schema.readHook) { - this.hook.reading.unsubscribe(this.schema.readHook); - } - this.schema.readHook = readHook; - this.hook("reading", readHook); - return constructor; - }; - Table.prototype.defineClass = function () { - function Class(content) { - extend(this, content); - } - return this.mapToClass(Class); - }; - Table.prototype.add = function (obj, key) { - var _this = this; - var _a = this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - var objToAdd = obj; - if (keyPath && auto) { - objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); - } - return this._trans('readwrite', function (trans) { - return _this.core.mutate({ trans: trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd] }); - }).then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult; }) - .then(function (lastResult) { - if (keyPath) { - try { - setByKeyPath(obj, keyPath, lastResult); - } - catch (_) { } - } - return lastResult; - }); - }; - Table.prototype.update = function (keyOrObject, modifications) { - if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) { - var key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath); - if (key === undefined) - return rejection(new exceptions.InvalidArgument("Given object does not contain its primary key")); - return this.where(":id").equals(key).modify(modifications); - } - else { - return this.where(":id").equals(keyOrObject).modify(modifications); - } - }; - Table.prototype.put = function (obj, key) { - var _this = this; - var _a = this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - var objToAdd = obj; - if (keyPath && auto) { - objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); - } - return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null }); }) - .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult; }) - .then(function (lastResult) { - if (keyPath) { - try { - setByKeyPath(obj, keyPath, lastResult); - } - catch (_) { } - } - return lastResult; - }); - }; - Table.prototype.delete = function (key) { - var _this = this; - return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'delete', keys: [key] }); }) - .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined; }); - }; - Table.prototype.clear = function () { - var _this = this; - return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'deleteRange', range: AnyRange }); }) - .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined; }); - }; - Table.prototype.bulkGet = function (keys) { - var _this = this; - return this._trans('readonly', function (trans) { - return _this.core.getMany({ - keys: keys, - trans: trans - }).then(function (result) { return result.map(function (res) { return _this.hook.reading.fire(res); }); }); - }); - }; - Table.prototype.bulkAdd = function (objects, keysOrOptions, options) { - var _this = this; - var keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; - options = options || (keys ? undefined : keysOrOptions); - var wantResults = options ? options.allKeys : undefined; - return this._trans('readwrite', function (trans) { - var _a = _this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - if (keyPath && keys) - throw new exceptions.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys"); - if (keys && keys.length !== objects.length) - throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); - var numObjects = objects.length; - var objectsToAdd = keyPath && auto ? - objects.map(workaroundForUndefinedPrimKey(keyPath)) : - objects; - return _this.core.mutate({ trans: trans, type: 'add', keys: keys, values: objectsToAdd, wantResults: wantResults }) - .then(function (_a) { - var numFailures = _a.numFailures, results = _a.results, lastResult = _a.lastResult, failures = _a.failures; - var result = wantResults ? results : lastResult; - if (numFailures === 0) - return result; - throw new BulkError("".concat(_this.name, ".bulkAdd(): ").concat(numFailures, " of ").concat(numObjects, " operations failed"), failures); - }); - }); - }; - Table.prototype.bulkPut = function (objects, keysOrOptions, options) { - var _this = this; - var keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; - options = options || (keys ? undefined : keysOrOptions); - var wantResults = options ? options.allKeys : undefined; - return this._trans('readwrite', function (trans) { - var _a = _this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - if (keyPath && keys) - throw new exceptions.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys"); - if (keys && keys.length !== objects.length) - throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); - var numObjects = objects.length; - var objectsToPut = keyPath && auto ? - objects.map(workaroundForUndefinedPrimKey(keyPath)) : - objects; - return _this.core.mutate({ trans: trans, type: 'put', keys: keys, values: objectsToPut, wantResults: wantResults }) - .then(function (_a) { - var numFailures = _a.numFailures, results = _a.results, lastResult = _a.lastResult, failures = _a.failures; - var result = wantResults ? results : lastResult; - if (numFailures === 0) - return result; - throw new BulkError("".concat(_this.name, ".bulkPut(): ").concat(numFailures, " of ").concat(numObjects, " operations failed"), failures); - }); - }); - }; - Table.prototype.bulkUpdate = function (keysAndChanges) { - var _this = this; - var coreTable = this.core; - var keys = keysAndChanges.map(function (entry) { return entry.key; }); - var changeSpecs = keysAndChanges.map(function (entry) { return entry.changes; }); - var offsetMap = []; - return this._trans('readwrite', function (trans) { - return coreTable.getMany({ trans: trans, keys: keys, cache: 'clone' }).then(function (objs) { - var resultKeys = []; - var resultObjs = []; - keysAndChanges.forEach(function (_a, idx) { - var key = _a.key, changes = _a.changes; - var obj = objs[idx]; - if (obj) { - for (var _i = 0, _b = Object.keys(changes); _i < _b.length; _i++) { - var keyPath = _b[_i]; - var value = changes[keyPath]; - if (keyPath === _this.schema.primKey.keyPath) { - if (cmp(value, key) !== 0) { - throw new exceptions.Constraint("Cannot update primary key in bulkUpdate()"); - } - } - else { - setByKeyPath(obj, keyPath, value); - } - } - offsetMap.push(idx); - resultKeys.push(key); - resultObjs.push(obj); - } - }); - var numEntries = resultKeys.length; - return coreTable - .mutate({ - trans: trans, - type: 'put', - keys: resultKeys, - values: resultObjs, - updates: { - keys: keys, - changeSpecs: changeSpecs - } - }) - .then(function (_a) { - var numFailures = _a.numFailures, failures = _a.failures; - if (numFailures === 0) - return numEntries; - for (var _i = 0, _b = Object.keys(failures); _i < _b.length; _i++) { - var offset = _b[_i]; - var mappedOffset = offsetMap[Number(offset)]; - if (mappedOffset != null) { - var failure = failures[offset]; - delete failures[offset]; - failures[mappedOffset] = failure; - } - } - throw new BulkError("".concat(_this.name, ".bulkUpdate(): ").concat(numFailures, " of ").concat(numEntries, " operations failed"), failures); - }); - }); - }); - }; - Table.prototype.bulkDelete = function (keys) { - var _this = this; - var numKeys = keys.length; - return this._trans('readwrite', function (trans) { - return _this.core.mutate({ trans: trans, type: 'delete', keys: keys }); - }).then(function (_a) { - var numFailures = _a.numFailures, lastResult = _a.lastResult, failures = _a.failures; - if (numFailures === 0) - return lastResult; - throw new BulkError("".concat(_this.name, ".bulkDelete(): ").concat(numFailures, " of ").concat(numKeys, " operations failed"), failures); - }); - }; - return Table; - }()); - - function Events(ctx) { - var evs = {}; - var rv = function (eventName, subscriber) { - if (subscriber) { - var i = arguments.length, args = new Array(i - 1); - while (--i) - args[i - 1] = arguments[i]; - evs[eventName].subscribe.apply(null, args); - return ctx; - } - else if (typeof (eventName) === 'string') { - return evs[eventName]; - } - }; - rv.addEventType = add; - for (var i = 1, l = arguments.length; i < l; ++i) { - add(arguments[i]); - } - return rv; - function add(eventName, chainFunction, defaultFunction) { - if (typeof eventName === 'object') - return addConfiguredEvents(eventName); - if (!chainFunction) - chainFunction = reverseStoppableEventChain; - if (!defaultFunction) - defaultFunction = nop; - var context = { - subscribers: [], - fire: defaultFunction, - subscribe: function (cb) { - if (context.subscribers.indexOf(cb) === -1) { - context.subscribers.push(cb); - context.fire = chainFunction(context.fire, cb); - } - }, - unsubscribe: function (cb) { - context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; }); - context.fire = context.subscribers.reduce(chainFunction, defaultFunction); - } - }; - evs[eventName] = rv[eventName] = context; - return context; - } - function addConfiguredEvents(cfg) { - keys(cfg).forEach(function (eventName) { - var args = cfg[eventName]; - if (isArray(args)) { - add(eventName, cfg[eventName][0], cfg[eventName][1]); - } - else if (args === 'asap') { - var context = add(eventName, mirror, function fire() { - var i = arguments.length, args = new Array(i); - while (i--) - args[i] = arguments[i]; - context.subscribers.forEach(function (fn) { - asap$1(function fireEvent() { - fn.apply(null, args); - }); - }); - }); - } - else - throw new exceptions.InvalidArgument("Invalid event config"); - }); - } - } - - function makeClassConstructor(prototype, constructor) { - derive(constructor).from({ prototype: prototype }); - return constructor; - } - - function createTableConstructor(db) { - return makeClassConstructor(Table.prototype, function Table(name, tableSchema, trans) { - this.db = db; - this._tx = trans; - this.name = name; - this.schema = tableSchema; - this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, { - "creating": [hookCreatingChain, nop], - "reading": [pureFunctionChain, mirror], - "updating": [hookUpdatingChain, nop], - "deleting": [hookDeletingChain, nop] - }); - }); - } - - function isPlainKeyRange(ctx, ignoreLimitFilter) { - return !(ctx.filter || ctx.algorithm || ctx.or) && - (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter); - } - function addFilter(ctx, fn) { - ctx.filter = combine(ctx.filter, fn); - } - function addReplayFilter(ctx, factory, isLimitFilter) { - var curr = ctx.replayFilter; - ctx.replayFilter = curr ? function () { return combine(curr(), factory()); } : factory; - ctx.justLimit = isLimitFilter && !curr; - } - function addMatchFilter(ctx, fn) { - ctx.isMatch = combine(ctx.isMatch, fn); - } - function getIndexOrStore(ctx, coreSchema) { - if (ctx.isPrimKey) - return coreSchema.primaryKey; - var index = coreSchema.getIndexByKeyPath(ctx.index); - if (!index) - throw new exceptions.Schema("KeyPath " + ctx.index + " on object store " + coreSchema.name + " is not indexed"); - return index; - } - function openCursor(ctx, coreTable, trans) { - var index = getIndexOrStore(ctx, coreTable.schema); - return coreTable.openCursor({ - trans: trans, - values: !ctx.keysOnly, - reverse: ctx.dir === 'prev', - unique: !!ctx.unique, - query: { - index: index, - range: ctx.range - } - }); - } - function iter(ctx, fn, coreTrans, coreTable) { - var filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter; - if (!ctx.or) { - return iterate(openCursor(ctx, coreTable, coreTrans), combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper); - } - else { - var set_1 = {}; - var union = function (item, cursor, advance) { - if (!filter || filter(cursor, advance, function (result) { return cursor.stop(result); }, function (err) { return cursor.fail(err); })) { - var primaryKey = cursor.primaryKey; - var key = '' + primaryKey; - if (key === '[object ArrayBuffer]') - key = '' + new Uint8Array(primaryKey); - if (!hasOwn(set_1, key)) { - set_1[key] = true; - fn(item, cursor, advance); - } - } - }; - return Promise.all([ - ctx.or._iterate(union, coreTrans), - iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper) - ]); - } - } - function iterate(cursorPromise, filter, fn, valueMapper) { - var mappedFn = valueMapper ? function (x, c, a) { return fn(valueMapper(x), c, a); } : fn; - var wrappedFn = wrap(mappedFn); - return cursorPromise.then(function (cursor) { - if (cursor) { - return cursor.start(function () { - var c = function () { return cursor.continue(); }; - if (!filter || filter(cursor, function (advancer) { return c = advancer; }, function (val) { cursor.stop(val); c = nop; }, function (e) { cursor.fail(e); c = nop; })) - wrappedFn(cursor.value, cursor, function (advancer) { return c = advancer; }); - c(); - }); - } - }); - } - - var PropModSymbol = Symbol(); - var PropModification = (function () { - function PropModification(spec) { - Object.assign(this, spec); - } - PropModification.prototype.execute = function (value) { - var _a; - if (this.add !== undefined) { - var term = this.add; - if (isArray(term)) { - return __spreadArray(__spreadArray([], (isArray(value) ? value : []), true), term, true).sort(); - } - if (typeof term === 'number') - return (Number(value) || 0) + term; - if (typeof term === 'bigint') { - try { - return BigInt(value) + term; - } - catch (_b) { - return BigInt(0) + term; - } - } - throw new TypeError("Invalid term ".concat(term)); - } - if (this.remove !== undefined) { - var subtrahend_1 = this.remove; - if (isArray(subtrahend_1)) { - return isArray(value) ? value.filter(function (item) { return !subtrahend_1.includes(item); }).sort() : []; - } - if (typeof subtrahend_1 === 'number') - return Number(value) - subtrahend_1; - if (typeof subtrahend_1 === 'bigint') { - try { - return BigInt(value) - subtrahend_1; - } - catch (_c) { - return BigInt(0) - subtrahend_1; - } - } - throw new TypeError("Invalid subtrahend ".concat(subtrahend_1)); - } - var prefixToReplace = (_a = this.replacePrefix) === null || _a === void 0 ? void 0 : _a[0]; - if (prefixToReplace && typeof value === 'string' && value.startsWith(prefixToReplace)) { - return this.replacePrefix[1] + value.substring(prefixToReplace.length); - } - return value; - }; - return PropModification; - }()); - - var Collection = (function () { - function Collection() { - } - Collection.prototype._read = function (fn, cb) { - var ctx = this._ctx; - return ctx.error ? - ctx.table._trans(null, rejection.bind(null, ctx.error)) : - ctx.table._trans('readonly', fn).then(cb); - }; - Collection.prototype._write = function (fn) { - var ctx = this._ctx; - return ctx.error ? - ctx.table._trans(null, rejection.bind(null, ctx.error)) : - ctx.table._trans('readwrite', fn, "locked"); - }; - Collection.prototype._addAlgorithm = function (fn) { - var ctx = this._ctx; - ctx.algorithm = combine(ctx.algorithm, fn); - }; - Collection.prototype._iterate = function (fn, coreTrans) { - return iter(this._ctx, fn, coreTrans, this._ctx.table.core); - }; - Collection.prototype.clone = function (props) { - var rv = Object.create(this.constructor.prototype), ctx = Object.create(this._ctx); - if (props) - extend(ctx, props); - rv._ctx = ctx; - return rv; - }; - Collection.prototype.raw = function () { - this._ctx.valueMapper = null; - return this; - }; - Collection.prototype.each = function (fn) { - var ctx = this._ctx; - return this._read(function (trans) { return iter(ctx, fn, trans, ctx.table.core); }); - }; - Collection.prototype.count = function (cb) { - var _this = this; - return this._read(function (trans) { - var ctx = _this._ctx; - var coreTable = ctx.table.core; - if (isPlainKeyRange(ctx, true)) { - return coreTable.count({ - trans: trans, - query: { - index: getIndexOrStore(ctx, coreTable.schema), - range: ctx.range - } - }).then(function (count) { return Math.min(count, ctx.limit); }); - } - else { - var count = 0; - return iter(ctx, function () { ++count; return false; }, trans, coreTable) - .then(function () { return count; }); - } - }).then(cb); - }; - Collection.prototype.sortBy = function (keyPath, cb) { - var parts = keyPath.split('.').reverse(), lastPart = parts[0], lastIndex = parts.length - 1; - function getval(obj, i) { - if (i) - return getval(obj[parts[i]], i - 1); - return obj[lastPart]; - } - var order = this._ctx.dir === "next" ? 1 : -1; - function sorter(a, b) { - var aVal = getval(a, lastIndex), bVal = getval(b, lastIndex); - return aVal < bVal ? -order : aVal > bVal ? order : 0; - } - return this.toArray(function (a) { - return a.sort(sorter); - }).then(cb); - }; - Collection.prototype.toArray = function (cb) { - var _this = this; - return this._read(function (trans) { - var ctx = _this._ctx; - if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { - var valueMapper_1 = ctx.valueMapper; - var index = getIndexOrStore(ctx, ctx.table.core.schema); - return ctx.table.core.query({ - trans: trans, - limit: ctx.limit, - values: true, - query: { - index: index, - range: ctx.range - } - }).then(function (_a) { - var result = _a.result; - return valueMapper_1 ? result.map(valueMapper_1) : result; - }); - } - else { - var a_1 = []; - return iter(ctx, function (item) { return a_1.push(item); }, trans, ctx.table.core).then(function () { return a_1; }); - } - }, cb); - }; - Collection.prototype.offset = function (offset) { - var ctx = this._ctx; - if (offset <= 0) - return this; - ctx.offset += offset; - if (isPlainKeyRange(ctx)) { - addReplayFilter(ctx, function () { - var offsetLeft = offset; - return function (cursor, advance) { - if (offsetLeft === 0) - return true; - if (offsetLeft === 1) { - --offsetLeft; - return false; - } - advance(function () { - cursor.advance(offsetLeft); - offsetLeft = 0; - }); - return false; - }; - }); - } - else { - addReplayFilter(ctx, function () { - var offsetLeft = offset; - return function () { return (--offsetLeft < 0); }; - }); - } - return this; - }; - Collection.prototype.limit = function (numRows) { - this._ctx.limit = Math.min(this._ctx.limit, numRows); - addReplayFilter(this._ctx, function () { - var rowsLeft = numRows; - return function (cursor, advance, resolve) { - if (--rowsLeft <= 0) - advance(resolve); - return rowsLeft >= 0; - }; - }, true); - return this; - }; - Collection.prototype.until = function (filterFunction, bIncludeStopEntry) { - addFilter(this._ctx, function (cursor, advance, resolve) { - if (filterFunction(cursor.value)) { - advance(resolve); - return bIncludeStopEntry; - } - else { - return true; - } - }); - return this; - }; - Collection.prototype.first = function (cb) { - return this.limit(1).toArray(function (a) { return a[0]; }).then(cb); - }; - Collection.prototype.last = function (cb) { - return this.reverse().first(cb); - }; - Collection.prototype.filter = function (filterFunction) { - addFilter(this._ctx, function (cursor) { - return filterFunction(cursor.value); - }); - addMatchFilter(this._ctx, filterFunction); - return this; - }; - Collection.prototype.and = function (filter) { - return this.filter(filter); - }; - Collection.prototype.or = function (indexName) { - return new this.db.WhereClause(this._ctx.table, indexName, this); - }; - Collection.prototype.reverse = function () { - this._ctx.dir = (this._ctx.dir === "prev" ? "next" : "prev"); - if (this._ondirectionchange) - this._ondirectionchange(this._ctx.dir); - return this; - }; - Collection.prototype.desc = function () { - return this.reverse(); - }; - Collection.prototype.eachKey = function (cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - return this.each(function (val, cursor) { cb(cursor.key, cursor); }); - }; - Collection.prototype.eachUniqueKey = function (cb) { - this._ctx.unique = "unique"; - return this.eachKey(cb); - }; - Collection.prototype.eachPrimaryKey = function (cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); }); - }; - Collection.prototype.keys = function (cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - var a = []; - return this.each(function (item, cursor) { - a.push(cursor.key); - }).then(function () { - return a; - }).then(cb); - }; - Collection.prototype.primaryKeys = function (cb) { - var ctx = this._ctx; - if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { - return this._read(function (trans) { - var index = getIndexOrStore(ctx, ctx.table.core.schema); - return ctx.table.core.query({ - trans: trans, - values: false, - limit: ctx.limit, - query: { - index: index, - range: ctx.range - } - }); - }).then(function (_a) { - var result = _a.result; - return result; - }).then(cb); - } - ctx.keysOnly = !ctx.isMatch; - var a = []; - return this.each(function (item, cursor) { - a.push(cursor.primaryKey); - }).then(function () { - return a; - }).then(cb); - }; - Collection.prototype.uniqueKeys = function (cb) { - this._ctx.unique = "unique"; - return this.keys(cb); - }; - Collection.prototype.firstKey = function (cb) { - return this.limit(1).keys(function (a) { return a[0]; }).then(cb); - }; - Collection.prototype.lastKey = function (cb) { - return this.reverse().firstKey(cb); - }; - Collection.prototype.distinct = function () { - var ctx = this._ctx, idx = ctx.index && ctx.table.schema.idxByName[ctx.index]; - if (!idx || !idx.multi) - return this; - var set = {}; - addFilter(this._ctx, function (cursor) { - var strKey = cursor.primaryKey.toString(); - var found = hasOwn(set, strKey); - set[strKey] = true; - return !found; - }); - return this; - }; - Collection.prototype.modify = function (changes) { - var _this = this; - var ctx = this._ctx; - return this._write(function (trans) { - var modifyer; - if (typeof changes === 'function') { - modifyer = changes; - } - else { - var keyPaths = keys(changes); - var numKeys = keyPaths.length; - modifyer = function (item) { - var anythingModified = false; - for (var i = 0; i < numKeys; ++i) { - var keyPath = keyPaths[i]; - var val = changes[keyPath]; - var origVal = getByKeyPath(item, keyPath); - if (val instanceof PropModification) { - setByKeyPath(item, keyPath, val.execute(origVal)); - anythingModified = true; - } - else if (origVal !== val) { - setByKeyPath(item, keyPath, val); - anythingModified = true; - } - } - return anythingModified; - }; - } - var coreTable = ctx.table.core; - var _a = coreTable.schema.primaryKey, outbound = _a.outbound, extractKey = _a.extractKey; - var limit = _this.db._options.modifyChunkSize || 200; - var totalFailures = []; - var successCount = 0; - var failedKeys = []; - var applyMutateResult = function (expectedCount, res) { - var failures = res.failures, numFailures = res.numFailures; - successCount += expectedCount - numFailures; - for (var _i = 0, _a = keys(failures); _i < _a.length; _i++) { - var pos = _a[_i]; - totalFailures.push(failures[pos]); - } - }; - return _this.clone().primaryKeys().then(function (keys) { - var criteria = isPlainKeyRange(ctx) && - ctx.limit === Infinity && - (typeof changes !== 'function' || changes === deleteCallback) && { - index: ctx.index, - range: ctx.range - }; - var nextChunk = function (offset) { - var count = Math.min(limit, keys.length - offset); - return coreTable.getMany({ - trans: trans, - keys: keys.slice(offset, offset + count), - cache: "immutable" - }).then(function (values) { - var addValues = []; - var putValues = []; - var putKeys = outbound ? [] : null; - var deleteKeys = []; - for (var i = 0; i < count; ++i) { - var origValue = values[i]; - var ctx_1 = { - value: deepClone(origValue), - primKey: keys[offset + i] - }; - if (modifyer.call(ctx_1, ctx_1.value, ctx_1) !== false) { - if (ctx_1.value == null) { - deleteKeys.push(keys[offset + i]); - } - else if (!outbound && cmp(extractKey(origValue), extractKey(ctx_1.value)) !== 0) { - deleteKeys.push(keys[offset + i]); - addValues.push(ctx_1.value); - } - else { - putValues.push(ctx_1.value); - if (outbound) - putKeys.push(keys[offset + i]); - } - } - } - return Promise.resolve(addValues.length > 0 && - coreTable.mutate({ trans: trans, type: 'add', values: addValues }) - .then(function (res) { - for (var pos in res.failures) { - deleteKeys.splice(parseInt(pos), 1); - } - applyMutateResult(addValues.length, res); - })).then(function () { return (putValues.length > 0 || (criteria && typeof changes === 'object')) && - coreTable.mutate({ - trans: trans, - type: 'put', - keys: putKeys, - values: putValues, - criteria: criteria, - changeSpec: typeof changes !== 'function' - && changes, - isAdditionalChunk: offset > 0 - }).then(function (res) { return applyMutateResult(putValues.length, res); }); }).then(function () { return (deleteKeys.length > 0 || (criteria && changes === deleteCallback)) && - coreTable.mutate({ - trans: trans, - type: 'delete', - keys: deleteKeys, - criteria: criteria, - isAdditionalChunk: offset > 0 - }).then(function (res) { return applyMutateResult(deleteKeys.length, res); }); }).then(function () { - return keys.length > offset + count && nextChunk(offset + limit); - }); - }); - }; - return nextChunk(0).then(function () { - if (totalFailures.length > 0) - throw new ModifyError("Error modifying one or more objects", totalFailures, successCount, failedKeys); - return keys.length; - }); - }); - }); - }; - Collection.prototype.delete = function () { - var ctx = this._ctx, range = ctx.range; - if (isPlainKeyRange(ctx) && - (ctx.isPrimKey || range.type === 3 )) - { - return this._write(function (trans) { - var primaryKey = ctx.table.core.schema.primaryKey; - var coreRange = range; - return ctx.table.core.count({ trans: trans, query: { index: primaryKey, range: coreRange } }).then(function (count) { - return ctx.table.core.mutate({ trans: trans, type: 'deleteRange', range: coreRange }) - .then(function (_a) { - var failures = _a.failures; _a.lastResult; _a.results; var numFailures = _a.numFailures; - if (numFailures) - throw new ModifyError("Could not delete some values", Object.keys(failures).map(function (pos) { return failures[pos]; }), count - numFailures); - return count - numFailures; - }); - }); - }); - } - return this.modify(deleteCallback); - }; - return Collection; - }()); - var deleteCallback = function (value, ctx) { return ctx.value = null; }; - - function createCollectionConstructor(db) { - return makeClassConstructor(Collection.prototype, function Collection(whereClause, keyRangeGenerator) { - this.db = db; - var keyRange = AnyRange, error = null; - if (keyRangeGenerator) - try { - keyRange = keyRangeGenerator(); - } - catch (ex) { - error = ex; - } - var whereCtx = whereClause._ctx; - var table = whereCtx.table; - var readingHook = table.hook.reading.fire; - this._ctx = { - table: table, - index: whereCtx.index, - isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)), - range: keyRange, - keysOnly: false, - dir: "next", - unique: "", - algorithm: null, - filter: null, - replayFilter: null, - justLimit: true, - isMatch: null, - offset: 0, - limit: Infinity, - error: error, - or: whereCtx.or, - valueMapper: readingHook !== mirror ? readingHook : null - }; - }); - } - - function simpleCompare(a, b) { - return a < b ? -1 : a === b ? 0 : 1; - } - function simpleCompareReverse(a, b) { - return a > b ? -1 : a === b ? 0 : 1; - } - - function fail(collectionOrWhereClause, err, T) { - var collection = collectionOrWhereClause instanceof WhereClause ? - new collectionOrWhereClause.Collection(collectionOrWhereClause) : - collectionOrWhereClause; - collection._ctx.error = T ? new T(err) : new TypeError(err); - return collection; - } - function emptyCollection(whereClause) { - return new whereClause.Collection(whereClause, function () { return rangeEqual(""); }).limit(0); - } - function upperFactory(dir) { - return dir === "next" ? - function (s) { return s.toUpperCase(); } : - function (s) { return s.toLowerCase(); }; - } - function lowerFactory(dir) { - return dir === "next" ? - function (s) { return s.toLowerCase(); } : - function (s) { return s.toUpperCase(); }; - } - function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) { - var length = Math.min(key.length, lowerNeedle.length); - var llp = -1; - for (var i = 0; i < length; ++i) { - var lwrKeyChar = lowerKey[i]; - if (lwrKeyChar !== lowerNeedle[i]) { - if (cmp(key[i], upperNeedle[i]) < 0) - return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1); - if (cmp(key[i], lowerNeedle[i]) < 0) - return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1); - if (llp >= 0) - return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1); - return null; - } - if (cmp(key[i], lwrKeyChar) < 0) - llp = i; - } - if (length < lowerNeedle.length && dir === "next") - return key + upperNeedle.substr(key.length); - if (length < key.length && dir === "prev") - return key.substr(0, upperNeedle.length); - return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1)); - } - function addIgnoreCaseAlgorithm(whereClause, match, needles, suffix) { - var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix, needlesLen = needles.length; - if (!needles.every(function (s) { return typeof s === 'string'; })) { - return fail(whereClause, STRING_EXPECTED); - } - function initDirection(dir) { - upper = upperFactory(dir); - lower = lowerFactory(dir); - compare = (dir === "next" ? simpleCompare : simpleCompareReverse); - var needleBounds = needles.map(function (needle) { - return { lower: lower(needle), upper: upper(needle) }; - }).sort(function (a, b) { - return compare(a.lower, b.lower); - }); - upperNeedles = needleBounds.map(function (nb) { return nb.upper; }); - lowerNeedles = needleBounds.map(function (nb) { return nb.lower; }); - direction = dir; - nextKeySuffix = (dir === "next" ? "" : suffix); - } - initDirection("next"); - var c = new whereClause.Collection(whereClause, function () { return createRange(upperNeedles[0], lowerNeedles[needlesLen - 1] + suffix); }); - c._ondirectionchange = function (direction) { - initDirection(direction); - }; - var firstPossibleNeedle = 0; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - if (typeof key !== 'string') - return false; - var lowerKey = lower(key); - if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) { - return true; - } - else { - var lowestPossibleCasing = null; - for (var i = firstPossibleNeedle; i < needlesLen; ++i) { - var casing = nextCasing(key, lowerKey, upperNeedles[i], lowerNeedles[i], compare, direction); - if (casing === null && lowestPossibleCasing === null) - firstPossibleNeedle = i + 1; - else if (lowestPossibleCasing === null || compare(lowestPossibleCasing, casing) > 0) { - lowestPossibleCasing = casing; - } - } - if (lowestPossibleCasing !== null) { - advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); }); - } - else { - advance(resolve); - } - return false; - } - }); - return c; - } - function createRange(lower, upper, lowerOpen, upperOpen) { - return { - type: 2 , - lower: lower, - upper: upper, - lowerOpen: lowerOpen, - upperOpen: upperOpen - }; - } - function rangeEqual(value) { - return { - type: 1 , - lower: value, - upper: value - }; - } - - var WhereClause = (function () { - function WhereClause() { - } - Object.defineProperty(WhereClause.prototype, "Collection", { - get: function () { - return this._ctx.table.db.Collection; - }, - enumerable: false, - configurable: true - }); - WhereClause.prototype.between = function (lower, upper, includeLower, includeUpper) { - includeLower = includeLower !== false; - includeUpper = includeUpper === true; - try { - if ((this._cmp(lower, upper) > 0) || - (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper))) - return emptyCollection(this); - return new this.Collection(this, function () { return createRange(lower, upper, !includeLower, !includeUpper); }); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - }; - WhereClause.prototype.equals = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return rangeEqual(value); }); - }; - WhereClause.prototype.above = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(value, undefined, true); }); - }; - WhereClause.prototype.aboveOrEqual = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(value, undefined, false); }); - }; - WhereClause.prototype.below = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(undefined, value, false, true); }); - }; - WhereClause.prototype.belowOrEqual = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(undefined, value); }); - }; - WhereClause.prototype.startsWith = function (str) { - if (typeof str !== 'string') - return fail(this, STRING_EXPECTED); - return this.between(str, str + maxString, true, true); - }; - WhereClause.prototype.startsWithIgnoreCase = function (str) { - if (str === "") - return this.startsWith(str); - return addIgnoreCaseAlgorithm(this, function (x, a) { return x.indexOf(a[0]) === 0; }, [str], maxString); - }; - WhereClause.prototype.equalsIgnoreCase = function (str) { - return addIgnoreCaseAlgorithm(this, function (x, a) { return x === a[0]; }, [str], ""); - }; - WhereClause.prototype.anyOfIgnoreCase = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return emptyCollection(this); - return addIgnoreCaseAlgorithm(this, function (x, a) { return a.indexOf(x) !== -1; }, set, ""); - }; - WhereClause.prototype.startsWithAnyOfIgnoreCase = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return emptyCollection(this); - return addIgnoreCaseAlgorithm(this, function (x, a) { return a.some(function (n) { return x.indexOf(n) === 0; }); }, set, maxString); - }; - WhereClause.prototype.anyOf = function () { - var _this = this; - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - var compare = this._cmp; - try { - set.sort(compare); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - if (set.length === 0) - return emptyCollection(this); - var c = new this.Collection(this, function () { return createRange(set[0], set[set.length - 1]); }); - c._ondirectionchange = function (direction) { - compare = (direction === "next" ? - _this._ascending : - _this._descending); - set.sort(compare); - }; - var i = 0; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - while (compare(key, set[i]) > 0) { - ++i; - if (i === set.length) { - advance(resolve); - return false; - } - } - if (compare(key, set[i]) === 0) { - return true; - } - else { - advance(function () { cursor.continue(set[i]); }); - return false; - } - }); - return c; - }; - WhereClause.prototype.notEqual = function (value) { - return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false }); - }; - WhereClause.prototype.noneOf = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return new this.Collection(this); - try { - set.sort(this._ascending); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - var ranges = set.reduce(function (res, val) { return res ? - res.concat([[res[res.length - 1][1], val]]) : - [[minKey, val]]; }, null); - ranges.push([set[set.length - 1], this.db._maxKey]); - return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false }); - }; - WhereClause.prototype.inAnyRange = function (ranges, options) { - var _this = this; - var cmp = this._cmp, ascending = this._ascending, descending = this._descending, min = this._min, max = this._max; - if (ranges.length === 0) - return emptyCollection(this); - if (!ranges.every(function (range) { - return range[0] !== undefined && - range[1] !== undefined && - ascending(range[0], range[1]) <= 0; - })) { - return fail(this, "First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower", exceptions.InvalidArgument); - } - var includeLowers = !options || options.includeLowers !== false; - var includeUppers = options && options.includeUppers === true; - function addRange(ranges, newRange) { - var i = 0, l = ranges.length; - for (; i < l; ++i) { - var range = ranges[i]; - if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) { - range[0] = min(range[0], newRange[0]); - range[1] = max(range[1], newRange[1]); - break; - } - } - if (i === l) - ranges.push(newRange); - return ranges; - } - var sortDirection = ascending; - function rangeSorter(a, b) { return sortDirection(a[0], b[0]); } - var set; - try { - set = ranges.reduce(addRange, []); - set.sort(rangeSorter); - } - catch (ex) { - return fail(this, INVALID_KEY_ARGUMENT); - } - var rangePos = 0; - var keyIsBeyondCurrentEntry = includeUppers ? - function (key) { return ascending(key, set[rangePos][1]) > 0; } : - function (key) { return ascending(key, set[rangePos][1]) >= 0; }; - var keyIsBeforeCurrentEntry = includeLowers ? - function (key) { return descending(key, set[rangePos][0]) > 0; } : - function (key) { return descending(key, set[rangePos][0]) >= 0; }; - function keyWithinCurrentRange(key) { - return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key); - } - var checkKey = keyIsBeyondCurrentEntry; - var c = new this.Collection(this, function () { return createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers); }); - c._ondirectionchange = function (direction) { - if (direction === "next") { - checkKey = keyIsBeyondCurrentEntry; - sortDirection = ascending; - } - else { - checkKey = keyIsBeforeCurrentEntry; - sortDirection = descending; - } - set.sort(rangeSorter); - }; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - while (checkKey(key)) { - ++rangePos; - if (rangePos === set.length) { - advance(resolve); - return false; - } - } - if (keyWithinCurrentRange(key)) { - return true; - } - else if (_this._cmp(key, set[rangePos][1]) === 0 || _this._cmp(key, set[rangePos][0]) === 0) { - return false; - } - else { - advance(function () { - if (sortDirection === ascending) - cursor.continue(set[rangePos][0]); - else - cursor.continue(set[rangePos][1]); - }); - return false; - } - }); - return c; - }; - WhereClause.prototype.startsWithAnyOf = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (!set.every(function (s) { return typeof s === 'string'; })) { - return fail(this, "startsWithAnyOf() only works with strings"); - } - if (set.length === 0) - return emptyCollection(this); - return this.inAnyRange(set.map(function (str) { return [str, str + maxString]; })); - }; - return WhereClause; - }()); - - function createWhereClauseConstructor(db) { - return makeClassConstructor(WhereClause.prototype, function WhereClause(table, index, orCollection) { - this.db = db; - this._ctx = { - table: table, - index: index === ":id" ? null : index, - or: orCollection - }; - this._cmp = this._ascending = cmp; - this._descending = function (a, b) { return cmp(b, a); }; - this._max = function (a, b) { return cmp(a, b) > 0 ? a : b; }; - this._min = function (a, b) { return cmp(a, b) < 0 ? a : b; }; - this._IDBKeyRange = db._deps.IDBKeyRange; - if (!this._IDBKeyRange) - throw new exceptions.MissingAPI(); - }); - } - - function eventRejectHandler(reject) { - return wrap(function (event) { - preventDefault(event); - reject(event.target.error); - return false; - }); - } - function preventDefault(event) { - if (event.stopPropagation) - event.stopPropagation(); - if (event.preventDefault) - event.preventDefault(); - } - - var DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated'; - var STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1'; - var globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME); - - var Transaction = (function () { - function Transaction() { - } - Transaction.prototype._lock = function () { - assert(!PSD.global); - ++this._reculock; - if (this._reculock === 1 && !PSD.global) - PSD.lockOwnerFor = this; - return this; - }; - Transaction.prototype._unlock = function () { - assert(!PSD.global); - if (--this._reculock === 0) { - if (!PSD.global) - PSD.lockOwnerFor = null; - while (this._blockedFuncs.length > 0 && !this._locked()) { - var fnAndPSD = this._blockedFuncs.shift(); - try { - usePSD(fnAndPSD[1], fnAndPSD[0]); - } - catch (e) { } - } - } - return this; - }; - Transaction.prototype._locked = function () { - return this._reculock && PSD.lockOwnerFor !== this; - }; - Transaction.prototype.create = function (idbtrans) { - var _this = this; - if (!this.mode) - return this; - var idbdb = this.db.idbdb; - var dbOpenError = this.db._state.dbOpenError; - assert(!this.idbtrans); - if (!idbtrans && !idbdb) { - switch (dbOpenError && dbOpenError.name) { - case "DatabaseClosedError": - throw new exceptions.DatabaseClosed(dbOpenError); - case "MissingAPIError": - throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError); - default: - throw new exceptions.OpenFailed(dbOpenError); - } - } - if (!this.active) - throw new exceptions.TransactionInactive(); - assert(this._completion._state === null); - idbtrans = this.idbtrans = idbtrans || - (this.db.core - ? this.db.core.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability }) - : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })); - idbtrans.onerror = wrap(function (ev) { - preventDefault(ev); - _this._reject(idbtrans.error); - }); - idbtrans.onabort = wrap(function (ev) { - preventDefault(ev); - _this.active && _this._reject(new exceptions.Abort(idbtrans.error)); - _this.active = false; - _this.on("abort").fire(ev); - }); - idbtrans.oncomplete = wrap(function () { - _this.active = false; - _this._resolve(); - if ('mutatedParts' in idbtrans) { - globalEvents.storagemutated.fire(idbtrans["mutatedParts"]); - } - }); - return this; - }; - Transaction.prototype._promise = function (mode, fn, bWriteLock) { - var _this = this; - if (mode === 'readwrite' && this.mode !== 'readwrite') - return rejection(new exceptions.ReadOnly("Transaction is readonly")); - if (!this.active) - return rejection(new exceptions.TransactionInactive()); - if (this._locked()) { - return new DexiePromise(function (resolve, reject) { - _this._blockedFuncs.push([function () { - _this._promise(mode, fn, bWriteLock).then(resolve, reject); - }, PSD]); - }); - } - else if (bWriteLock) { - return newScope(function () { - var p = new DexiePromise(function (resolve, reject) { - _this._lock(); - var rv = fn(resolve, reject, _this); - if (rv && rv.then) - rv.then(resolve, reject); - }); - p.finally(function () { return _this._unlock(); }); - p._lib = true; - return p; - }); - } - else { - var p = new DexiePromise(function (resolve, reject) { - var rv = fn(resolve, reject, _this); - if (rv && rv.then) - rv.then(resolve, reject); - }); - p._lib = true; - return p; - } - }; - Transaction.prototype._root = function () { - return this.parent ? this.parent._root() : this; - }; - Transaction.prototype.waitFor = function (promiseLike) { - var root = this._root(); - var promise = DexiePromise.resolve(promiseLike); - if (root._waitingFor) { - root._waitingFor = root._waitingFor.then(function () { return promise; }); - } - else { - root._waitingFor = promise; - root._waitingQueue = []; - var store = root.idbtrans.objectStore(root.storeNames[0]); - (function spin() { - ++root._spinCount; - while (root._waitingQueue.length) - (root._waitingQueue.shift())(); - if (root._waitingFor) - store.get(-Infinity).onsuccess = spin; - }()); - } - var currentWaitPromise = root._waitingFor; - return new DexiePromise(function (resolve, reject) { - promise.then(function (res) { return root._waitingQueue.push(wrap(resolve.bind(null, res))); }, function (err) { return root._waitingQueue.push(wrap(reject.bind(null, err))); }).finally(function () { - if (root._waitingFor === currentWaitPromise) { - root._waitingFor = null; - } - }); - }); - }; - Transaction.prototype.abort = function () { - if (this.active) { - this.active = false; - if (this.idbtrans) - this.idbtrans.abort(); - this._reject(new exceptions.Abort()); - } - }; - Transaction.prototype.table = function (tableName) { - var memoizedTables = (this._memoizedTables || (this._memoizedTables = {})); - if (hasOwn(memoizedTables, tableName)) - return memoizedTables[tableName]; - var tableSchema = this.schema[tableName]; - if (!tableSchema) { - throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); - } - var transactionBoundTable = new this.db.Table(tableName, tableSchema, this); - transactionBoundTable.core = this.db.core.table(tableName); - memoizedTables[tableName] = transactionBoundTable; - return transactionBoundTable; - }; - return Transaction; - }()); - - function createTransactionConstructor(db) { - return makeClassConstructor(Transaction.prototype, function Transaction(mode, storeNames, dbschema, chromeTransactionDurability, parent) { - var _this = this; - this.db = db; - this.mode = mode; - this.storeNames = storeNames; - this.schema = dbschema; - this.chromeTransactionDurability = chromeTransactionDurability; - this.idbtrans = null; - this.on = Events(this, "complete", "error", "abort"); - this.parent = parent || null; - this.active = true; - this._reculock = 0; - this._blockedFuncs = []; - this._resolve = null; - this._reject = null; - this._waitingFor = null; - this._waitingQueue = null; - this._spinCount = 0; - this._completion = new DexiePromise(function (resolve, reject) { - _this._resolve = resolve; - _this._reject = reject; - }); - this._completion.then(function () { - _this.active = false; - _this.on.complete.fire(); - }, function (e) { - var wasActive = _this.active; - _this.active = false; - _this.on.error.fire(e); - _this.parent ? - _this.parent._reject(e) : - wasActive && _this.idbtrans && _this.idbtrans.abort(); - return rejection(e); - }); - }); - } - - function createIndexSpec(name, keyPath, unique, multi, auto, compound, isPrimKey) { - return { - name: name, - keyPath: keyPath, - unique: unique, - multi: multi, - auto: auto, - compound: compound, - src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? "++" : "") + nameFromKeyPath(keyPath) - }; - } - function nameFromKeyPath(keyPath) { - return typeof keyPath === 'string' ? - keyPath : - keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : ""; - } - - function createTableSchema(name, primKey, indexes) { - return { - name: name, - primKey: primKey, - indexes: indexes, - mappedClass: null, - idxByName: arrayToObject(indexes, function (index) { return [index.name, index]; }) - }; - } - - function safariMultiStoreFix(storeNames) { - return storeNames.length === 1 ? storeNames[0] : storeNames; - } - var getMaxKey = function (IdbKeyRange) { - try { - IdbKeyRange.only([[]]); - getMaxKey = function () { return [[]]; }; - return [[]]; - } - catch (e) { - getMaxKey = function () { return maxString; }; - return maxString; - } - }; - - function getKeyExtractor(keyPath) { - if (keyPath == null) { - return function () { return undefined; }; - } - else if (typeof keyPath === 'string') { - return getSinglePathKeyExtractor(keyPath); - } - else { - return function (obj) { return getByKeyPath(obj, keyPath); }; - } - } - function getSinglePathKeyExtractor(keyPath) { - var split = keyPath.split('.'); - if (split.length === 1) { - return function (obj) { return obj[keyPath]; }; - } - else { - return function (obj) { return getByKeyPath(obj, keyPath); }; - } - } - - function arrayify(arrayLike) { - return [].slice.call(arrayLike); - } - var _id_counter = 0; - function getKeyPathAlias(keyPath) { - return keyPath == null ? - ":id" : - typeof keyPath === 'string' ? - keyPath : - "[".concat(keyPath.join('+'), "]"); - } - function createDBCore(db, IdbKeyRange, tmpTrans) { - function extractSchema(db, trans) { - var tables = arrayify(db.objectStoreNames); - return { - schema: { - name: db.name, - tables: tables.map(function (table) { return trans.objectStore(table); }).map(function (store) { - var keyPath = store.keyPath, autoIncrement = store.autoIncrement; - var compound = isArray(keyPath); - var outbound = keyPath == null; - var indexByKeyPath = {}; - var result = { - name: store.name, - primaryKey: { - name: null, - isPrimaryKey: true, - outbound: outbound, - compound: compound, - keyPath: keyPath, - autoIncrement: autoIncrement, - unique: true, - extractKey: getKeyExtractor(keyPath) - }, - indexes: arrayify(store.indexNames).map(function (indexName) { return store.index(indexName); }) - .map(function (index) { - var name = index.name, unique = index.unique, multiEntry = index.multiEntry, keyPath = index.keyPath; - var compound = isArray(keyPath); - var result = { - name: name, - compound: compound, - keyPath: keyPath, - unique: unique, - multiEntry: multiEntry, - extractKey: getKeyExtractor(keyPath) - }; - indexByKeyPath[getKeyPathAlias(keyPath)] = result; - return result; - }), - getIndexByKeyPath: function (keyPath) { return indexByKeyPath[getKeyPathAlias(keyPath)]; } - }; - indexByKeyPath[":id"] = result.primaryKey; - if (keyPath != null) { - indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey; - } - return result; - }) - }, - hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) && - !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && - !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && - [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) - }; - } - function makeIDBKeyRange(range) { - if (range.type === 3 ) - return null; - if (range.type === 4 ) - throw new Error("Cannot convert never type to IDBKeyRange"); - var lower = range.lower, upper = range.upper, lowerOpen = range.lowerOpen, upperOpen = range.upperOpen; - var idbRange = lower === undefined ? - upper === undefined ? - null : - IdbKeyRange.upperBound(upper, !!upperOpen) : - upper === undefined ? - IdbKeyRange.lowerBound(lower, !!lowerOpen) : - IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen); - return idbRange; - } - function createDbCoreTable(tableSchema) { - var tableName = tableSchema.name; - function mutate(_a) { - var trans = _a.trans, type = _a.type, keys = _a.keys, values = _a.values, range = _a.range; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var store = trans.objectStore(tableName); - var outbound = store.keyPath == null; - var isAddOrPut = type === "put" || type === "add"; - if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange') - throw new Error("Invalid operation type: " + type); - var length = (keys || values || { length: 1 }).length; - if (keys && values && keys.length !== values.length) { - throw new Error("Given keys array must have same length as given values array."); - } - if (length === 0) - return resolve({ numFailures: 0, failures: {}, results: [], lastResult: undefined }); - var req; - var reqs = []; - var failures = []; - var numFailures = 0; - var errorHandler = function (event) { - ++numFailures; - preventDefault(event); - }; - if (type === 'deleteRange') { - if (range.type === 4 ) - return resolve({ numFailures: numFailures, failures: failures, results: [], lastResult: undefined }); - if (range.type === 3 ) - reqs.push(req = store.clear()); - else - reqs.push(req = store.delete(makeIDBKeyRange(range))); - } - else { - var _a = isAddOrPut ? - outbound ? - [values, keys] : - [values, null] : - [keys, null], args1 = _a[0], args2 = _a[1]; - if (isAddOrPut) { - for (var i = 0; i < length; ++i) { - reqs.push(req = (args2 && args2[i] !== undefined ? - store[type](args1[i], args2[i]) : - store[type](args1[i]))); - req.onerror = errorHandler; - } - } - else { - for (var i = 0; i < length; ++i) { - reqs.push(req = store[type](args1[i])); - req.onerror = errorHandler; - } - } - } - var done = function (event) { - var lastResult = event.target.result; - reqs.forEach(function (req, i) { return req.error != null && (failures[i] = req.error); }); - resolve({ - numFailures: numFailures, - failures: failures, - results: type === "delete" ? keys : reqs.map(function (req) { return req.result; }), - lastResult: lastResult - }); - }; - req.onerror = function (event) { - errorHandler(event); - done(event); - }; - req.onsuccess = done; - }); - } - function openCursor(_a) { - var trans = _a.trans, values = _a.values, query = _a.query, reverse = _a.reverse, unique = _a.unique; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var index = query.index, range = query.range; - var store = trans.objectStore(tableName); - var source = index.isPrimaryKey ? - store : - store.index(index.name); - var direction = reverse ? - unique ? - "prevunique" : - "prev" : - unique ? - "nextunique" : - "next"; - var req = values || !('openKeyCursor' in source) ? - source.openCursor(makeIDBKeyRange(range), direction) : - source.openKeyCursor(makeIDBKeyRange(range), direction); - req.onerror = eventRejectHandler(reject); - req.onsuccess = wrap(function (ev) { - var cursor = req.result; - if (!cursor) { - resolve(null); - return; - } - cursor.___id = ++_id_counter; - cursor.done = false; - var _cursorContinue = cursor.continue.bind(cursor); - var _cursorContinuePrimaryKey = cursor.continuePrimaryKey; - if (_cursorContinuePrimaryKey) - _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor); - var _cursorAdvance = cursor.advance.bind(cursor); - var doThrowCursorIsNotStarted = function () { throw new Error("Cursor not started"); }; - var doThrowCursorIsStopped = function () { throw new Error("Cursor not stopped"); }; - cursor.trans = trans; - cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted; - cursor.fail = wrap(reject); - cursor.next = function () { - var _this = this; - var gotOne = 1; - return this.start(function () { return gotOne-- ? _this.continue() : _this.stop(); }).then(function () { return _this; }); - }; - cursor.start = function (callback) { - var iterationPromise = new Promise(function (resolveIteration, rejectIteration) { - resolveIteration = wrap(resolveIteration); - req.onerror = eventRejectHandler(rejectIteration); - cursor.fail = rejectIteration; - cursor.stop = function (value) { - cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped; - resolveIteration(value); - }; - }); - var guardedCallback = function () { - if (req.result) { - try { - callback(); - } - catch (err) { - cursor.fail(err); - } - } - else { - cursor.done = true; - cursor.start = function () { throw new Error("Cursor behind last entry"); }; - cursor.stop(); - } - }; - req.onsuccess = wrap(function (ev) { - req.onsuccess = guardedCallback; - guardedCallback(); - }); - cursor.continue = _cursorContinue; - cursor.continuePrimaryKey = _cursorContinuePrimaryKey; - cursor.advance = _cursorAdvance; - guardedCallback(); - return iterationPromise; - }; - resolve(cursor); - }, reject); - }); - } - function query(hasGetAll) { - return function (request) { - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var trans = request.trans, values = request.values, limit = request.limit, query = request.query; - var nonInfinitLimit = limit === Infinity ? undefined : limit; - var index = query.index, range = query.range; - var store = trans.objectStore(tableName); - var source = index.isPrimaryKey ? store : store.index(index.name); - var idbKeyRange = makeIDBKeyRange(range); - if (limit === 0) - return resolve({ result: [] }); - if (hasGetAll) { - var req = values ? - source.getAll(idbKeyRange, nonInfinitLimit) : - source.getAllKeys(idbKeyRange, nonInfinitLimit); - req.onsuccess = function (event) { return resolve({ result: event.target.result }); }; - req.onerror = eventRejectHandler(reject); - } - else { - var count_1 = 0; - var req_1 = values || !('openKeyCursor' in source) ? - source.openCursor(idbKeyRange) : - source.openKeyCursor(idbKeyRange); - var result_1 = []; - req_1.onsuccess = function (event) { - var cursor = req_1.result; - if (!cursor) - return resolve({ result: result_1 }); - result_1.push(values ? cursor.value : cursor.primaryKey); - if (++count_1 === limit) - return resolve({ result: result_1 }); - cursor.continue(); - }; - req_1.onerror = eventRejectHandler(reject); - } - }); - }; - } - return { - name: tableName, - schema: tableSchema, - mutate: mutate, - getMany: function (_a) { - var trans = _a.trans, keys = _a.keys; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var store = trans.objectStore(tableName); - var length = keys.length; - var result = new Array(length); - var keyCount = 0; - var callbackCount = 0; - var req; - var successHandler = function (event) { - var req = event.target; - if ((result[req._pos] = req.result) != null) - ; - if (++callbackCount === keyCount) - resolve(result); - }; - var errorHandler = eventRejectHandler(reject); - for (var i = 0; i < length; ++i) { - var key = keys[i]; - if (key != null) { - req = store.get(keys[i]); - req._pos = i; - req.onsuccess = successHandler; - req.onerror = errorHandler; - ++keyCount; - } - } - if (keyCount === 0) - resolve(result); - }); - }, - get: function (_a) { - var trans = _a.trans, key = _a.key; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var store = trans.objectStore(tableName); - var req = store.get(key); - req.onsuccess = function (event) { return resolve(event.target.result); }; - req.onerror = eventRejectHandler(reject); - }); - }, - query: query(hasGetAll), - openCursor: openCursor, - count: function (_a) { - var query = _a.query, trans = _a.trans; - var index = query.index, range = query.range; - return new Promise(function (resolve, reject) { - var store = trans.objectStore(tableName); - var source = index.isPrimaryKey ? store : store.index(index.name); - var idbKeyRange = makeIDBKeyRange(range); - var req = idbKeyRange ? source.count(idbKeyRange) : source.count(); - req.onsuccess = wrap(function (ev) { return resolve(ev.target.result); }); - req.onerror = eventRejectHandler(reject); - }); - } - }; - } - var _a = extractSchema(db, tmpTrans), schema = _a.schema, hasGetAll = _a.hasGetAll; - var tables = schema.tables.map(function (tableSchema) { return createDbCoreTable(tableSchema); }); - var tableMap = {}; - tables.forEach(function (table) { return tableMap[table.name] = table; }); - return { - stack: "dbcore", - transaction: db.transaction.bind(db), - table: function (name) { - var result = tableMap[name]; - if (!result) - throw new Error("Table '".concat(name, "' not found")); - return tableMap[name]; - }, - MIN_KEY: -Infinity, - MAX_KEY: getMaxKey(IdbKeyRange), - schema: schema - }; - } - - function createMiddlewareStack(stackImpl, middlewares) { - return middlewares.reduce(function (down, _a) { - var create = _a.create; - return (__assign(__assign({}, down), create(down))); - }, stackImpl); - } - function createMiddlewareStacks(middlewares, idbdb, _a, tmpTrans) { - var IDBKeyRange = _a.IDBKeyRange; _a.indexedDB; - var dbcore = createMiddlewareStack(createDBCore(idbdb, IDBKeyRange, tmpTrans), middlewares.dbcore); - return { - dbcore: dbcore - }; - } - function generateMiddlewareStacks(db, tmpTrans) { - var idbdb = tmpTrans.db; - var stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans); - db.core = stacks.dbcore; - db.tables.forEach(function (table) { - var tableName = table.name; - if (db.core.schema.tables.some(function (tbl) { return tbl.name === tableName; })) { - table.core = db.core.table(tableName); - if (db[tableName] instanceof db.Table) { - db[tableName].core = table.core; - } - } - }); - } - - function setApiOnPlace(db, objs, tableNames, dbschema) { - tableNames.forEach(function (tableName) { - var schema = dbschema[tableName]; - objs.forEach(function (obj) { - var propDesc = getPropertyDescriptor(obj, tableName); - if (!propDesc || ("value" in propDesc && propDesc.value === undefined)) { - if (obj === db.Transaction.prototype || obj instanceof db.Transaction) { - setProp(obj, tableName, { - get: function () { return this.table(tableName); }, - set: function (value) { - defineProperty(this, tableName, { value: value, writable: true, configurable: true, enumerable: true }); - } - }); - } - else { - obj[tableName] = new db.Table(tableName, schema); - } - } - }); - }); - } - function removeTablesApi(db, objs) { - objs.forEach(function (obj) { - for (var key in obj) { - if (obj[key] instanceof db.Table) - delete obj[key]; - } - }); - } - function lowerVersionFirst(a, b) { - return a._cfg.version - b._cfg.version; - } - function runUpgraders(db, oldVersion, idbUpgradeTrans, reject) { - var globalSchema = db._dbSchema; - if (idbUpgradeTrans.objectStoreNames.contains('$meta') && !globalSchema.$meta) { - globalSchema.$meta = createTableSchema("$meta", parseIndexSyntax("")[0], []); - db._storeNames.push('$meta'); - } - var trans = db._createTransaction('readwrite', db._storeNames, globalSchema); - trans.create(idbUpgradeTrans); - trans._completion.catch(reject); - var rejectTransaction = trans._reject.bind(trans); - var transless = PSD.transless || PSD; - newScope(function () { - PSD.trans = trans; - PSD.transless = transless; - if (oldVersion === 0) { - keys(globalSchema).forEach(function (tableName) { - createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes); - }); - generateMiddlewareStacks(db, idbUpgradeTrans); - DexiePromise.follow(function () { return db.on.populate.fire(trans); }).catch(rejectTransaction); - } - else { - generateMiddlewareStacks(db, idbUpgradeTrans); - return getExistingVersion(db, trans, oldVersion) - .then(function (oldVersion) { return updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans); }) - .catch(rejectTransaction); - } - }); - } - function patchCurrentVersion(db, idbUpgradeTrans) { - createMissingTables(db._dbSchema, idbUpgradeTrans); - if (idbUpgradeTrans.db.version % 10 === 0 && !idbUpgradeTrans.objectStoreNames.contains('$meta')) { - idbUpgradeTrans.db.createObjectStore('$meta').add(Math.ceil((idbUpgradeTrans.db.version / 10) - 1), 'version'); - } - var globalSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); - adjustToExistingIndexNames(db, db._dbSchema, idbUpgradeTrans); - var diff = getSchemaDiff(globalSchema, db._dbSchema); - var _loop_1 = function (tableChange) { - if (tableChange.change.length || tableChange.recreate) { - console.warn("Unable to patch indexes of table ".concat(tableChange.name, " because it has changes on the type of index or primary key.")); - return { value: void 0 }; - } - var store = idbUpgradeTrans.objectStore(tableChange.name); - tableChange.add.forEach(function (idx) { - if (debug) - console.debug("Dexie upgrade patch: Creating missing index ".concat(tableChange.name, ".").concat(idx.src)); - addIndex(store, idx); - }); - }; - for (var _i = 0, _a = diff.change; _i < _a.length; _i++) { - var tableChange = _a[_i]; - var state_1 = _loop_1(tableChange); - if (typeof state_1 === "object") - return state_1.value; - } - } - function getExistingVersion(db, trans, oldVersion) { - if (trans.storeNames.includes('$meta')) { - return trans.table('$meta').get('version').then(function (metaVersion) { - return metaVersion != null ? metaVersion : oldVersion; - }); - } - else { - return DexiePromise.resolve(oldVersion); - } - } - function updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans) { - var queue = []; - var versions = db._versions; - var globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); - var versToRun = versions.filter(function (v) { return v._cfg.version >= oldVersion; }); - if (versToRun.length === 0) { - return DexiePromise.resolve(); - } - versToRun.forEach(function (version) { - queue.push(function () { - var oldSchema = globalSchema; - var newSchema = version._cfg.dbschema; - adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans); - adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans); - globalSchema = db._dbSchema = newSchema; - var diff = getSchemaDiff(oldSchema, newSchema); - diff.add.forEach(function (tuple) { - createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes); - }); - diff.change.forEach(function (change) { - if (change.recreate) { - throw new exceptions.Upgrade("Not yet support for changing primary key"); - } - else { - var store_1 = idbUpgradeTrans.objectStore(change.name); - change.add.forEach(function (idx) { return addIndex(store_1, idx); }); - change.change.forEach(function (idx) { - store_1.deleteIndex(idx.name); - addIndex(store_1, idx); - }); - change.del.forEach(function (idxName) { return store_1.deleteIndex(idxName); }); - } - }); - var contentUpgrade = version._cfg.contentUpgrade; - if (contentUpgrade && version._cfg.version > oldVersion) { - generateMiddlewareStacks(db, idbUpgradeTrans); - trans._memoizedTables = {}; - var upgradeSchema_1 = shallowClone(newSchema); - diff.del.forEach(function (table) { - upgradeSchema_1[table] = oldSchema[table]; - }); - removeTablesApi(db, [db.Transaction.prototype]); - setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema_1), upgradeSchema_1); - trans.schema = upgradeSchema_1; - var contentUpgradeIsAsync_1 = isAsyncFunction(contentUpgrade); - if (contentUpgradeIsAsync_1) { - incrementExpectedAwaits(); - } - var returnValue_1; - var promiseFollowed = DexiePromise.follow(function () { - returnValue_1 = contentUpgrade(trans); - if (returnValue_1) { - if (contentUpgradeIsAsync_1) { - var decrementor = decrementExpectedAwaits.bind(null, null); - returnValue_1.then(decrementor, decrementor); - } - } - }); - return (returnValue_1 && typeof returnValue_1.then === 'function' ? - DexiePromise.resolve(returnValue_1) : promiseFollowed.then(function () { return returnValue_1; })); - } - }); - queue.push(function (idbtrans) { - var newSchema = version._cfg.dbschema; - deleteRemovedTables(newSchema, idbtrans); - removeTablesApi(db, [db.Transaction.prototype]); - setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema); - trans.schema = db._dbSchema; - }); - queue.push(function (idbtrans) { - if (db.idbdb.objectStoreNames.contains('$meta')) { - if (Math.ceil(db.idbdb.version / 10) === version._cfg.version) { - db.idbdb.deleteObjectStore('$meta'); - delete db._dbSchema.$meta; - db._storeNames = db._storeNames.filter(function (name) { return name !== '$meta'; }); - } - else { - idbtrans.objectStore('$meta').put(version._cfg.version, 'version'); - } - } - }); - }); - function runQueue() { - return queue.length ? DexiePromise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) : - DexiePromise.resolve(); - } - return runQueue().then(function () { - createMissingTables(globalSchema, idbUpgradeTrans); - }); - } - function getSchemaDiff(oldSchema, newSchema) { - var diff = { - del: [], - add: [], - change: [] - }; - var table; - for (table in oldSchema) { - if (!newSchema[table]) - diff.del.push(table); - } - for (table in newSchema) { - var oldDef = oldSchema[table], newDef = newSchema[table]; - if (!oldDef) { - diff.add.push([table, newDef]); - } - else { - var change = { - name: table, - def: newDef, - recreate: false, - del: [], - add: [], - change: [] - }; - if (( - '' + (oldDef.primKey.keyPath || '')) !== ('' + (newDef.primKey.keyPath || '')) || - (oldDef.primKey.auto !== newDef.primKey.auto)) { - change.recreate = true; - diff.change.push(change); - } - else { - var oldIndexes = oldDef.idxByName; - var newIndexes = newDef.idxByName; - var idxName = void 0; - for (idxName in oldIndexes) { - if (!newIndexes[idxName]) - change.del.push(idxName); - } - for (idxName in newIndexes) { - var oldIdx = oldIndexes[idxName], newIdx = newIndexes[idxName]; - if (!oldIdx) - change.add.push(newIdx); - else if (oldIdx.src !== newIdx.src) - change.change.push(newIdx); - } - if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) { - diff.change.push(change); - } - } - } - } - return diff; - } - function createTable(idbtrans, tableName, primKey, indexes) { - var store = idbtrans.db.createObjectStore(tableName, primKey.keyPath ? - { keyPath: primKey.keyPath, autoIncrement: primKey.auto } : - { autoIncrement: primKey.auto }); - indexes.forEach(function (idx) { return addIndex(store, idx); }); - return store; - } - function createMissingTables(newSchema, idbtrans) { - keys(newSchema).forEach(function (tableName) { - if (!idbtrans.db.objectStoreNames.contains(tableName)) { - if (debug) - console.debug('Dexie: Creating missing table', tableName); - createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes); - } - }); - } - function deleteRemovedTables(newSchema, idbtrans) { - [].slice.call(idbtrans.db.objectStoreNames).forEach(function (storeName) { - return newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName); - }); - } - function addIndex(store, idx) { - store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi }); - } - function buildGlobalSchema(db, idbdb, tmpTrans) { - var globalSchema = {}; - var dbStoreNames = slice(idbdb.objectStoreNames, 0); - dbStoreNames.forEach(function (storeName) { - var store = tmpTrans.objectStore(storeName); - var keyPath = store.keyPath; - var primKey = createIndexSpec(nameFromKeyPath(keyPath), keyPath || "", true, false, !!store.autoIncrement, keyPath && typeof keyPath !== "string", true); - var indexes = []; - for (var j = 0; j < store.indexNames.length; ++j) { - var idbindex = store.index(store.indexNames[j]); - keyPath = idbindex.keyPath; - var index = createIndexSpec(idbindex.name, keyPath, !!idbindex.unique, !!idbindex.multiEntry, false, keyPath && typeof keyPath !== "string", false); - indexes.push(index); - } - globalSchema[storeName] = createTableSchema(storeName, primKey, indexes); - }); - return globalSchema; - } - function readGlobalSchema(db, idbdb, tmpTrans) { - db.verno = idbdb.version / 10; - var globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans); - db._storeNames = slice(idbdb.objectStoreNames, 0); - setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema); - } - function verifyInstalledSchema(db, tmpTrans) { - var installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans); - var diff = getSchemaDiff(installedSchema, db._dbSchema); - return !(diff.add.length || diff.change.some(function (ch) { return ch.add.length || ch.change.length; })); - } - function adjustToExistingIndexNames(db, schema, idbtrans) { - var storeNames = idbtrans.db.objectStoreNames; - for (var i = 0; i < storeNames.length; ++i) { - var storeName = storeNames[i]; - var store = idbtrans.objectStore(storeName); - db._hasGetAll = 'getAll' in store; - for (var j = 0; j < store.indexNames.length; ++j) { - var indexName = store.indexNames[j]; - var keyPath = store.index(indexName).keyPath; - var dexieName = typeof keyPath === 'string' ? keyPath : "[" + slice(keyPath).join('+') + "]"; - if (schema[storeName]) { - var indexSpec = schema[storeName].idxByName[dexieName]; - if (indexSpec) { - indexSpec.name = indexName; - delete schema[storeName].idxByName[dexieName]; - schema[storeName].idxByName[indexName] = indexSpec; - } - } - } - } - if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && - !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && - _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope && - [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) { - db._hasGetAll = false; - } - } - function parseIndexSyntax(primKeyAndIndexes) { - return primKeyAndIndexes.split(',').map(function (index, indexNum) { - index = index.trim(); - var name = index.replace(/([&*]|\+\+)/g, ""); - var keyPath = /^\[/.test(name) ? name.match(/^\[(.*)\]$/)[1].split('+') : name; - return createIndexSpec(name, keyPath || null, /\&/.test(index), /\*/.test(index), /\+\+/.test(index), isArray(keyPath), indexNum === 0); - }); - } - - var Version = (function () { - function Version() { - } - Version.prototype._parseStoresSpec = function (stores, outSchema) { - keys(stores).forEach(function (tableName) { - if (stores[tableName] !== null) { - var indexes = parseIndexSyntax(stores[tableName]); - var primKey = indexes.shift(); - primKey.unique = true; - if (primKey.multi) - throw new exceptions.Schema("Primary key cannot be multi-valued"); - indexes.forEach(function (idx) { - if (idx.auto) - throw new exceptions.Schema("Only primary key can be marked as autoIncrement (++)"); - if (!idx.keyPath) - throw new exceptions.Schema("Index must have a name and cannot be an empty string"); - }); - outSchema[tableName] = createTableSchema(tableName, primKey, indexes); - } - }); - }; - Version.prototype.stores = function (stores) { - var db = this.db; - this._cfg.storesSource = this._cfg.storesSource ? - extend(this._cfg.storesSource, stores) : - stores; - var versions = db._versions; - var storesSpec = {}; - var dbschema = {}; - versions.forEach(function (version) { - extend(storesSpec, version._cfg.storesSource); - dbschema = (version._cfg.dbschema = {}); - version._parseStoresSpec(storesSpec, dbschema); - }); - db._dbSchema = dbschema; - removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]); - setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema); - db._storeNames = keys(dbschema); - return this; - }; - Version.prototype.upgrade = function (upgradeFunction) { - this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction); - return this; - }; - return Version; - }()); - - function createVersionConstructor(db) { - return makeClassConstructor(Version.prototype, function Version(versionNumber) { - this.db = db; - this._cfg = { - version: versionNumber, - storesSource: null, - dbschema: {}, - tables: {}, - contentUpgrade: null - }; - }); - } - - function getDbNamesTable(indexedDB, IDBKeyRange) { - var dbNamesDB = indexedDB["_dbNamesDB"]; - if (!dbNamesDB) { - dbNamesDB = indexedDB["_dbNamesDB"] = new Dexie$1(DBNAMES_DB, { - addons: [], - indexedDB: indexedDB, - IDBKeyRange: IDBKeyRange, - }); - dbNamesDB.version(1).stores({ dbnames: "name" }); - } - return dbNamesDB.table("dbnames"); - } - function hasDatabasesNative(indexedDB) { - return indexedDB && typeof indexedDB.databases === "function"; - } - function getDatabaseNames(_a) { - var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; - return hasDatabasesNative(indexedDB) - ? Promise.resolve(indexedDB.databases()).then(function (infos) { - return infos - .map(function (info) { return info.name; }) - .filter(function (name) { return name !== DBNAMES_DB; }); - }) - : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys(); - } - function _onDatabaseCreated(_a, name) { - var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; - !hasDatabasesNative(indexedDB) && - name !== DBNAMES_DB && - getDbNamesTable(indexedDB, IDBKeyRange).put({ name: name }).catch(nop); - } - function _onDatabaseDeleted(_a, name) { - var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; - !hasDatabasesNative(indexedDB) && - name !== DBNAMES_DB && - getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop); - } - - function vip(fn) { - return newScope(function () { - PSD.letThrough = true; - return fn(); - }); - } - - function idbReady() { - var isSafari = !navigator.userAgentData && - /Safari\//.test(navigator.userAgent) && - !/Chrom(e|ium)\//.test(navigator.userAgent); - if (!isSafari || !indexedDB.databases) - return Promise.resolve(); - var intervalId; - return new Promise(function (resolve) { - var tryIdb = function () { return indexedDB.databases().finally(resolve); }; - intervalId = setInterval(tryIdb, 100); - tryIdb(); - }).finally(function () { return clearInterval(intervalId); }); - } - - var _a; - function isEmptyRange(node) { - return !("from" in node); - } - var RangeSet = function (fromOrTree, to) { - if (this) { - extend(this, arguments.length ? { d: 1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree } : { d: 0 }); - } - else { - var rv = new RangeSet(); - if (fromOrTree && ("d" in fromOrTree)) { - extend(rv, fromOrTree); - } - return rv; - } - }; - props(RangeSet.prototype, (_a = { - add: function (rangeSet) { - mergeRanges(this, rangeSet); - return this; - }, - addKey: function (key) { - addRange(this, key, key); - return this; - }, - addKeys: function (keys) { - var _this = this; - keys.forEach(function (key) { return addRange(_this, key, key); }); - return this; - } - }, - _a[iteratorSymbol] = function () { - return getRangeSetIterator(this); - }, - _a)); - function addRange(target, from, to) { - var diff = cmp(from, to); - if (isNaN(diff)) - return; - if (diff > 0) - throw RangeError(); - if (isEmptyRange(target)) - return extend(target, { from: from, to: to, d: 1 }); - var left = target.l; - var right = target.r; - if (cmp(to, target.from) < 0) { - left - ? addRange(left, from, to) - : (target.l = { from: from, to: to, d: 1, l: null, r: null }); - return rebalance(target); - } - if (cmp(from, target.to) > 0) { - right - ? addRange(right, from, to) - : (target.r = { from: from, to: to, d: 1, l: null, r: null }); - return rebalance(target); - } - if (cmp(from, target.from) < 0) { - target.from = from; - target.l = null; - target.d = right ? right.d + 1 : 1; - } - if (cmp(to, target.to) > 0) { - target.to = to; - target.r = null; - target.d = target.l ? target.l.d + 1 : 1; - } - var rightWasCutOff = !target.r; - if (left && !target.l) { - mergeRanges(target, left); - } - if (right && rightWasCutOff) { - mergeRanges(target, right); - } - } - function mergeRanges(target, newSet) { - function _addRangeSet(target, _a) { - var from = _a.from, to = _a.to, l = _a.l, r = _a.r; - addRange(target, from, to); - if (l) - _addRangeSet(target, l); - if (r) - _addRangeSet(target, r); - } - if (!isEmptyRange(newSet)) - _addRangeSet(target, newSet); - } - function rangesOverlap(rangeSet1, rangeSet2) { - var i1 = getRangeSetIterator(rangeSet2); - var nextResult1 = i1.next(); - if (nextResult1.done) - return false; - var a = nextResult1.value; - var i2 = getRangeSetIterator(rangeSet1); - var nextResult2 = i2.next(a.from); - var b = nextResult2.value; - while (!nextResult1.done && !nextResult2.done) { - if (cmp(b.from, a.to) <= 0 && cmp(b.to, a.from) >= 0) - return true; - cmp(a.from, b.from) < 0 - ? (a = (nextResult1 = i1.next(b.from)).value) - : (b = (nextResult2 = i2.next(a.from)).value); - } - return false; - } - function getRangeSetIterator(node) { - var state = isEmptyRange(node) ? null : { s: 0, n: node }; - return { - next: function (key) { - var keyProvided = arguments.length > 0; - while (state) { - switch (state.s) { - case 0: - state.s = 1; - if (keyProvided) { - while (state.n.l && cmp(key, state.n.from) < 0) - state = { up: state, n: state.n.l, s: 1 }; - } - else { - while (state.n.l) - state = { up: state, n: state.n.l, s: 1 }; - } - case 1: - state.s = 2; - if (!keyProvided || cmp(key, state.n.to) <= 0) - return { value: state.n, done: false }; - case 2: - if (state.n.r) { - state.s = 3; - state = { up: state, n: state.n.r, s: 0 }; - continue; - } - case 3: - state = state.up; - } - } - return { done: true }; - }, - }; - } - function rebalance(target) { - var _a, _b; - var diff = (((_a = target.r) === null || _a === void 0 ? void 0 : _a.d) || 0) - (((_b = target.l) === null || _b === void 0 ? void 0 : _b.d) || 0); - var r = diff > 1 ? "r" : diff < -1 ? "l" : ""; - if (r) { - var l = r === "r" ? "l" : "r"; - var rootClone = __assign({}, target); - var oldRootRight = target[r]; - target.from = oldRootRight.from; - target.to = oldRootRight.to; - target[r] = oldRootRight[r]; - rootClone[r] = oldRootRight[l]; - target[l] = rootClone; - rootClone.d = computeDepth(rootClone); - } - target.d = computeDepth(target); - } - function computeDepth(_a) { - var r = _a.r, l = _a.l; - return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1; - } - - function extendObservabilitySet(target, newSet) { - keys(newSet).forEach(function (part) { - if (target[part]) - mergeRanges(target[part], newSet[part]); - else - target[part] = cloneSimpleObjectTree(newSet[part]); - }); - return target; - } - - function obsSetsOverlap(os1, os2) { - return os1.all || os2.all || Object.keys(os1).some(function (key) { return os2[key] && rangesOverlap(os2[key], os1[key]); }); - } - - var cache = {}; - - var unsignaledParts = {}; - var isTaskEnqueued = false; - function signalSubscribersLazily(part, optimistic) { - extendObservabilitySet(unsignaledParts, part); - if (!isTaskEnqueued) { - isTaskEnqueued = true; - setTimeout(function () { - isTaskEnqueued = false; - var parts = unsignaledParts; - unsignaledParts = {}; - signalSubscribersNow(parts, false); - }, 0); - } - } - function signalSubscribersNow(updatedParts, deleteAffectedCacheEntries) { - if (deleteAffectedCacheEntries === void 0) { deleteAffectedCacheEntries = false; } - var queriesToSignal = new Set(); - if (updatedParts.all) { - for (var _i = 0, _a = Object.values(cache); _i < _a.length; _i++) { - var tblCache = _a[_i]; - collectTableSubscribers(tblCache, updatedParts, queriesToSignal, deleteAffectedCacheEntries); - } - } - else { - for (var key in updatedParts) { - var parts = /^idb\:\/\/(.*)\/(.*)\//.exec(key); - if (parts) { - var dbName = parts[1], tableName = parts[2]; - var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)]; - if (tblCache) - collectTableSubscribers(tblCache, updatedParts, queriesToSignal, deleteAffectedCacheEntries); - } - } - } - queriesToSignal.forEach(function (requery) { return requery(); }); - } - function collectTableSubscribers(tblCache, updatedParts, outQueriesToSignal, deleteAffectedCacheEntries) { - var updatedEntryLists = []; - for (var _i = 0, _a = Object.entries(tblCache.queries.query); _i < _a.length; _i++) { - var _b = _a[_i], indexName = _b[0], entries = _b[1]; - var filteredEntries = []; - for (var _c = 0, entries_1 = entries; _c < entries_1.length; _c++) { - var entry = entries_1[_c]; - if (obsSetsOverlap(updatedParts, entry.obsSet)) { - entry.subscribers.forEach(function (requery) { return outQueriesToSignal.add(requery); }); - } - else if (deleteAffectedCacheEntries) { - filteredEntries.push(entry); - } - } - if (deleteAffectedCacheEntries) - updatedEntryLists.push([indexName, filteredEntries]); - } - if (deleteAffectedCacheEntries) { - for (var _d = 0, updatedEntryLists_1 = updatedEntryLists; _d < updatedEntryLists_1.length; _d++) { - var _e = updatedEntryLists_1[_d], indexName = _e[0], filteredEntries = _e[1]; - tblCache.queries.query[indexName] = filteredEntries; - } - } - } - - function dexieOpen(db) { - var state = db._state; - var indexedDB = db._deps.indexedDB; - if (state.isBeingOpened || db.idbdb) - return state.dbReadyPromise.then(function () { return state.dbOpenError ? - rejection(state.dbOpenError) : - db; }); - state.isBeingOpened = true; - state.dbOpenError = null; - state.openComplete = false; - var openCanceller = state.openCanceller; - var nativeVerToOpen = Math.round(db.verno * 10); - var schemaPatchMode = false; - function throwIfCancelled() { - if (state.openCanceller !== openCanceller) - throw new exceptions.DatabaseClosed('db.open() was cancelled'); - } - var resolveDbReady = state.dbReadyResolve, - upgradeTransaction = null, wasCreated = false; - var tryOpenDB = function () { return new DexiePromise(function (resolve, reject) { - throwIfCancelled(); - if (!indexedDB) - throw new exceptions.MissingAPI(); - var dbName = db.name; - var req = state.autoSchema || !nativeVerToOpen ? - indexedDB.open(dbName) : - indexedDB.open(dbName, nativeVerToOpen); - if (!req) - throw new exceptions.MissingAPI(); - req.onerror = eventRejectHandler(reject); - req.onblocked = wrap(db._fireOnBlocked); - req.onupgradeneeded = wrap(function (e) { - upgradeTransaction = req.transaction; - if (state.autoSchema && !db._options.allowEmptyDB) { - req.onerror = preventDefault; - upgradeTransaction.abort(); - req.result.close(); - var delreq = indexedDB.deleteDatabase(dbName); - delreq.onsuccess = delreq.onerror = wrap(function () { - reject(new exceptions.NoSuchDatabase("Database ".concat(dbName, " doesnt exist"))); - }); - } - else { - upgradeTransaction.onerror = eventRejectHandler(reject); - var oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; - wasCreated = oldVer < 1; - db.idbdb = req.result; - if (schemaPatchMode) { - patchCurrentVersion(db, upgradeTransaction); - } - runUpgraders(db, oldVer / 10, upgradeTransaction, reject); - } - }, reject); - req.onsuccess = wrap(function () { - upgradeTransaction = null; - var idbdb = db.idbdb = req.result; - var objectStoreNames = slice(idbdb.objectStoreNames); - if (objectStoreNames.length > 0) - try { - var tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly'); - if (state.autoSchema) - readGlobalSchema(db, idbdb, tmpTrans); - else { - adjustToExistingIndexNames(db, db._dbSchema, tmpTrans); - if (!verifyInstalledSchema(db, tmpTrans) && !schemaPatchMode) { - console.warn("Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this."); - idbdb.close(); - nativeVerToOpen = idbdb.version + 1; - schemaPatchMode = true; - return resolve(tryOpenDB()); - } - } - generateMiddlewareStacks(db, tmpTrans); - } - catch (e) { - } - connections.push(db); - idbdb.onversionchange = wrap(function (ev) { - state.vcFired = true; - db.on("versionchange").fire(ev); - }); - idbdb.onclose = wrap(function (ev) { - db.on("close").fire(ev); - }); - if (wasCreated) - _onDatabaseCreated(db._deps, dbName); - resolve(); - }, reject); - }).catch(function (err) { - switch (err === null || err === void 0 ? void 0 : err.name) { - case "UnknownError": - if (state.PR1398_maxLoop > 0) { - state.PR1398_maxLoop--; - console.warn('Dexie: Workaround for Chrome UnknownError on open()'); - return tryOpenDB(); - } - break; - case "VersionError": - if (nativeVerToOpen > 0) { - nativeVerToOpen = 0; - return tryOpenDB(); - } - break; - } - return DexiePromise.reject(err); - }); }; - return DexiePromise.race([ - openCanceller, - (typeof navigator === 'undefined' ? DexiePromise.resolve() : idbReady()).then(tryOpenDB) - ]).then(function () { - throwIfCancelled(); - state.onReadyBeingFired = []; - return DexiePromise.resolve(vip(function () { return db.on.ready.fire(db.vip); })).then(function fireRemainders() { - if (state.onReadyBeingFired.length > 0) { - var remainders_1 = state.onReadyBeingFired.reduce(promisableChain, nop); - state.onReadyBeingFired = []; - return DexiePromise.resolve(vip(function () { return remainders_1(db.vip); })).then(fireRemainders); - } - }); - }).finally(function () { - if (state.openCanceller === openCanceller) { - state.onReadyBeingFired = null; - state.isBeingOpened = false; - } - }).catch(function (err) { - state.dbOpenError = err; - try { - upgradeTransaction && upgradeTransaction.abort(); - } - catch (_a) { } - if (openCanceller === state.openCanceller) { - db._close(); - } - return rejection(err); - }).finally(function () { - state.openComplete = true; - resolveDbReady(); - }).then(function () { - if (wasCreated) { - var everything_1 = {}; - db.tables.forEach(function (table) { - table.schema.indexes.forEach(function (idx) { - if (idx.name) - everything_1["idb://".concat(db.name, "/").concat(table.name, "/").concat(idx.name)] = new RangeSet(-Infinity, [[[]]]); - }); - everything_1["idb://".concat(db.name, "/").concat(table.name, "/")] = everything_1["idb://".concat(db.name, "/").concat(table.name, "/:dels")] = new RangeSet(-Infinity, [[[]]]); - }); - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME).fire(everything_1); - signalSubscribersNow(everything_1, true); - } - return db; - }); - } - - function awaitIterator(iterator) { - var callNext = function (result) { return iterator.next(result); }, doThrow = function (error) { return iterator.throw(error); }, onSuccess = step(callNext), onError = step(doThrow); - function step(getNext) { - return function (val) { - var next = getNext(val), value = next.value; - return next.done ? value : - (!value || typeof value.then !== 'function' ? - isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) : - value.then(onSuccess, onError)); - }; - } - return step(callNext)(); - } - - function extractTransactionArgs(mode, _tableArgs_, scopeFunc) { - var i = arguments.length; - if (i < 2) - throw new exceptions.InvalidArgument("Too few arguments"); - var args = new Array(i - 1); - while (--i) - args[i - 1] = arguments[i]; - scopeFunc = args.pop(); - var tables = flatten(args); - return [mode, tables, scopeFunc]; - } - function enterTransactionScope(db, mode, storeNames, parentTransaction, scopeFunc) { - return DexiePromise.resolve().then(function () { - var transless = PSD.transless || PSD; - var trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction); - trans.explicit = true; - var zoneProps = { - trans: trans, - transless: transless - }; - if (parentTransaction) { - trans.idbtrans = parentTransaction.idbtrans; - } - else { - try { - trans.create(); - trans.idbtrans._explicit = true; - db._state.PR1398_maxLoop = 3; - } - catch (ex) { - if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { - console.warn('Dexie: Need to reopen db'); - db.close({ disableAutoOpen: false }); - return db.open().then(function () { return enterTransactionScope(db, mode, storeNames, null, scopeFunc); }); - } - return rejection(ex); - } - } - var scopeFuncIsAsync = isAsyncFunction(scopeFunc); - if (scopeFuncIsAsync) { - incrementExpectedAwaits(); - } - var returnValue; - var promiseFollowed = DexiePromise.follow(function () { - returnValue = scopeFunc.call(trans, trans); - if (returnValue) { - if (scopeFuncIsAsync) { - var decrementor = decrementExpectedAwaits.bind(null, null); - returnValue.then(decrementor, decrementor); - } - else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') { - returnValue = awaitIterator(returnValue); - } - } - }, zoneProps); - return (returnValue && typeof returnValue.then === 'function' ? - DexiePromise.resolve(returnValue).then(function (x) { return trans.active ? - x - : rejection(new exceptions.PrematureCommit("Transaction committed too early. See http://bit.ly/2kdckMn")); }) - : promiseFollowed.then(function () { return returnValue; })).then(function (x) { - if (parentTransaction) - trans._resolve(); - return trans._completion.then(function () { return x; }); - }).catch(function (e) { - trans._reject(e); - return rejection(e); - }); - }); - } - - function pad(a, value, count) { - var result = isArray(a) ? a.slice() : [a]; - for (var i = 0; i < count; ++i) - result.push(value); - return result; - } - function createVirtualIndexMiddleware(down) { - return __assign(__assign({}, down), { table: function (tableName) { - var table = down.table(tableName); - var schema = table.schema; - var indexLookup = {}; - var allVirtualIndexes = []; - function addVirtualIndexes(keyPath, keyTail, lowLevelIndex) { - var keyPathAlias = getKeyPathAlias(keyPath); - var indexList = (indexLookup[keyPathAlias] = indexLookup[keyPathAlias] || []); - var keyLength = keyPath == null ? 0 : typeof keyPath === 'string' ? 1 : keyPath.length; - var isVirtual = keyTail > 0; - var virtualIndex = __assign(__assign({}, lowLevelIndex), { name: isVirtual - ? "".concat(keyPathAlias, "(virtual-from:").concat(lowLevelIndex.name, ")") - : lowLevelIndex.name, lowLevelIndex: lowLevelIndex, isVirtual: isVirtual, keyTail: keyTail, keyLength: keyLength, extractKey: getKeyExtractor(keyPath), unique: !isVirtual && lowLevelIndex.unique }); - indexList.push(virtualIndex); - if (!virtualIndex.isPrimaryKey) { - allVirtualIndexes.push(virtualIndex); - } - if (keyLength > 1) { - var virtualKeyPath = keyLength === 2 ? - keyPath[0] : - keyPath.slice(0, keyLength - 1); - addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex); - } - indexList.sort(function (a, b) { return a.keyTail - b.keyTail; }); - return virtualIndex; - } - var primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey); - indexLookup[":id"] = [primaryKey]; - for (var _i = 0, _a = schema.indexes; _i < _a.length; _i++) { - var index = _a[_i]; - addVirtualIndexes(index.keyPath, 0, index); - } - function findBestIndex(keyPath) { - var result = indexLookup[getKeyPathAlias(keyPath)]; - return result && result[0]; - } - function translateRange(range, keyTail) { - return { - type: range.type === 1 ? - 2 : - range.type, - lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail), - lowerOpen: true, - upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail), - upperOpen: true - }; - } - function translateRequest(req) { - var index = req.query.index; - return index.isVirtual ? __assign(__assign({}, req), { query: { - index: index.lowLevelIndex, - range: translateRange(req.query.range, index.keyTail) - } }) : req; - } - var result = __assign(__assign({}, table), { schema: __assign(__assign({}, schema), { primaryKey: primaryKey, indexes: allVirtualIndexes, getIndexByKeyPath: findBestIndex }), count: function (req) { - return table.count(translateRequest(req)); - }, query: function (req) { - return table.query(translateRequest(req)); - }, openCursor: function (req) { - var _a = req.query.index, keyTail = _a.keyTail, isVirtual = _a.isVirtual, keyLength = _a.keyLength; - if (!isVirtual) - return table.openCursor(req); - function createVirtualCursor(cursor) { - function _continue(key) { - key != null ? - cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) : - req.unique ? - cursor.continue(cursor.key.slice(0, keyLength) - .concat(req.reverse - ? down.MIN_KEY - : down.MAX_KEY, keyTail)) : - cursor.continue(); - } - var virtualCursor = Object.create(cursor, { - continue: { value: _continue }, - continuePrimaryKey: { - value: function (key, primaryKey) { - cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey); - } - }, - primaryKey: { - get: function () { - return cursor.primaryKey; - } - }, - key: { - get: function () { - var key = cursor.key; - return keyLength === 1 ? - key[0] : - key.slice(0, keyLength); - } - }, - value: { - get: function () { - return cursor.value; - } - } - }); - return virtualCursor; - } - return table.openCursor(translateRequest(req)) - .then(function (cursor) { return cursor && createVirtualCursor(cursor); }); - } }); - return result; - } }); - } - var virtualIndexMiddleware = { - stack: "dbcore", - name: "VirtualIndexMiddleware", - level: 1, - create: createVirtualIndexMiddleware - }; - - function getObjectDiff(a, b, rv, prfx) { - rv = rv || {}; - prfx = prfx || ''; - keys(a).forEach(function (prop) { - if (!hasOwn(b, prop)) { - rv[prfx + prop] = undefined; - } - else { - var ap = a[prop], bp = b[prop]; - if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) { - var apTypeName = toStringTag(ap); - var bpTypeName = toStringTag(bp); - if (apTypeName !== bpTypeName) { - rv[prfx + prop] = b[prop]; - } - else if (apTypeName === 'Object') { - getObjectDiff(ap, bp, rv, prfx + prop + '.'); - } - else if (ap !== bp) { - rv[prfx + prop] = b[prop]; - } - } - else if (ap !== bp) - rv[prfx + prop] = b[prop]; - } - }); - keys(b).forEach(function (prop) { - if (!hasOwn(a, prop)) { - rv[prfx + prop] = b[prop]; - } - }); - return rv; - } - - function getEffectiveKeys(primaryKey, req) { - if (req.type === 'delete') - return req.keys; - return req.keys || req.values.map(primaryKey.extractKey); - } - - var hooksMiddleware = { - stack: "dbcore", - name: "HooksMiddleware", - level: 2, - create: function (downCore) { return (__assign(__assign({}, downCore), { table: function (tableName) { - var downTable = downCore.table(tableName); - var primaryKey = downTable.schema.primaryKey; - var tableMiddleware = __assign(__assign({}, downTable), { mutate: function (req) { - var dxTrans = PSD.trans; - var _a = dxTrans.table(tableName).hook, deleting = _a.deleting, creating = _a.creating, updating = _a.updating; - switch (req.type) { - case 'add': - if (creating.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); - case 'put': - if (creating.fire === nop && updating.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); - case 'delete': - if (deleting.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); - case 'deleteRange': - if (deleting.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return deleteRange(req); }, true); - } - return downTable.mutate(req); - function addPutOrDelete(req) { - var dxTrans = PSD.trans; - var keys = req.keys || getEffectiveKeys(primaryKey, req); - if (!keys) - throw new Error("Keys missing"); - req = req.type === 'add' || req.type === 'put' ? __assign(__assign({}, req), { keys: keys }) : __assign({}, req); - if (req.type !== 'delete') - req.values = __spreadArray([], req.values, true); - if (req.keys) - req.keys = __spreadArray([], req.keys, true); - return getExistingValues(downTable, req, keys).then(function (existingValues) { - var contexts = keys.map(function (key, i) { - var existingValue = existingValues[i]; - var ctx = { onerror: null, onsuccess: null }; - if (req.type === 'delete') { - deleting.fire.call(ctx, key, existingValue, dxTrans); - } - else if (req.type === 'add' || existingValue === undefined) { - var generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans); - if (key == null && generatedPrimaryKey != null) { - key = generatedPrimaryKey; - req.keys[i] = key; - if (!primaryKey.outbound) { - setByKeyPath(req.values[i], primaryKey.keyPath, key); - } - } - } - else { - var objectDiff = getObjectDiff(existingValue, req.values[i]); - var additionalChanges_1 = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans); - if (additionalChanges_1) { - var requestedValue_1 = req.values[i]; - Object.keys(additionalChanges_1).forEach(function (keyPath) { - if (hasOwn(requestedValue_1, keyPath)) { - requestedValue_1[keyPath] = additionalChanges_1[keyPath]; - } - else { - setByKeyPath(requestedValue_1, keyPath, additionalChanges_1[keyPath]); - } - }); - } - } - return ctx; - }); - return downTable.mutate(req).then(function (_a) { - var failures = _a.failures, results = _a.results, numFailures = _a.numFailures, lastResult = _a.lastResult; - for (var i = 0; i < keys.length; ++i) { - var primKey = results ? results[i] : keys[i]; - var ctx = contexts[i]; - if (primKey == null) { - ctx.onerror && ctx.onerror(failures[i]); - } - else { - ctx.onsuccess && ctx.onsuccess(req.type === 'put' && existingValues[i] ? - req.values[i] : - primKey - ); - } - } - return { failures: failures, results: results, numFailures: numFailures, lastResult: lastResult }; - }).catch(function (error) { - contexts.forEach(function (ctx) { return ctx.onerror && ctx.onerror(error); }); - return Promise.reject(error); - }); - }); - } - function deleteRange(req) { - return deleteNextChunk(req.trans, req.range, 10000); - } - function deleteNextChunk(trans, range, limit) { - return downTable.query({ trans: trans, values: false, query: { index: primaryKey, range: range }, limit: limit }) - .then(function (_a) { - var result = _a.result; - return addPutOrDelete({ type: 'delete', keys: result, trans: trans }).then(function (res) { - if (res.numFailures > 0) - return Promise.reject(res.failures[0]); - if (result.length < limit) { - return { failures: [], numFailures: 0, lastResult: undefined }; - } - else { - return deleteNextChunk(trans, __assign(__assign({}, range), { lower: result[result.length - 1], lowerOpen: true }), limit); - } - }); - }); - } - } }); - return tableMiddleware; - } })); } - }; - function getExistingValues(table, req, effectiveKeys) { - return req.type === "add" - ? Promise.resolve([]) - : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: "immutable" }); - } - - function getFromTransactionCache(keys, cache, clone) { - try { - if (!cache) - return null; - if (cache.keys.length < keys.length) - return null; - var result = []; - for (var i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) { - if (cmp(cache.keys[i], keys[j]) !== 0) - continue; - result.push(clone ? deepClone(cache.values[i]) : cache.values[i]); - ++j; - } - return result.length === keys.length ? result : null; - } - catch (_a) { - return null; - } - } - var cacheExistingValuesMiddleware = { - stack: "dbcore", - level: -1, - create: function (core) { - return { - table: function (tableName) { - var table = core.table(tableName); - return __assign(__assign({}, table), { getMany: function (req) { - if (!req.cache) { - return table.getMany(req); - } - var cachedResult = getFromTransactionCache(req.keys, req.trans["_cache"], req.cache === "clone"); - if (cachedResult) { - return DexiePromise.resolve(cachedResult); - } - return table.getMany(req).then(function (res) { - req.trans["_cache"] = { - keys: req.keys, - values: req.cache === "clone" ? deepClone(res) : res, - }; - return res; - }); - }, mutate: function (req) { - if (req.type !== "add") - req.trans["_cache"] = null; - return table.mutate(req); - } }); - }, - }; - }, - }; - - function isCachableContext(ctx, table) { - return (ctx.trans.mode === 'readonly' && - !!ctx.subscr && - !ctx.trans.explicit && - ctx.trans.db._options.cache !== 'disabled' && - !table.schema.primaryKey.outbound); - } - - function isCachableRequest(type, req) { - switch (type) { - case 'query': - return req.values && !req.unique; - case 'get': - return false; - case 'getMany': - return false; - case 'count': - return false; - case 'openCursor': - return false; - } - } - - var observabilityMiddleware = { - stack: "dbcore", - level: 0, - name: "Observability", - create: function (core) { - var dbName = core.schema.name; - var FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY); - return __assign(__assign({}, core), { transaction: function (stores, mode, options) { - if (PSD.subscr && mode !== 'readonly') { - throw new exceptions.ReadOnly("Readwrite transaction in liveQuery context. Querier source: ".concat(PSD.querier)); - } - return core.transaction(stores, mode, options); - }, table: function (tableName) { - var table = core.table(tableName); - var schema = table.schema; - var primaryKey = schema.primaryKey, indexes = schema.indexes; - var extractKey = primaryKey.extractKey, outbound = primaryKey.outbound; - var indexesWithAutoIncPK = primaryKey.autoIncrement && indexes.filter(function (index) { return index.compound && index.keyPath.includes(primaryKey.keyPath); }); - var tableClone = __assign(__assign({}, table), { mutate: function (req) { - var trans = req.trans; - var mutatedParts = req.mutatedParts || (req.mutatedParts = {}); - var getRangeSet = function (indexName) { - var part = "idb://".concat(dbName, "/").concat(tableName, "/").concat(indexName); - return (mutatedParts[part] || - (mutatedParts[part] = new RangeSet())); - }; - var pkRangeSet = getRangeSet(""); - var delsRangeSet = getRangeSet(":dels"); - var type = req.type; - var _a = req.type === "deleteRange" - ? [req.range] - : req.type === "delete" - ? [req.keys] - : req.values.length < 50 - ? [getEffectiveKeys(primaryKey, req).filter(function (id) { return id; }), req.values] - : [], keys = _a[0], newObjs = _a[1]; - var oldCache = req.trans["_cache"]; - if (isArray(keys)) { - pkRangeSet.addKeys(keys); - var oldObjs = type === 'delete' || keys.length === newObjs.length ? getFromTransactionCache(keys, oldCache) : null; - if (!oldObjs) { - delsRangeSet.addKeys(keys); - } - if (oldObjs || newObjs) { - trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs); - } - } - else if (keys) { - var range = { from: keys.lower, to: keys.upper }; - delsRangeSet.add(range); - pkRangeSet.add(range); - } - else { - pkRangeSet.add(FULL_RANGE); - delsRangeSet.add(FULL_RANGE); - schema.indexes.forEach(function (idx) { return getRangeSet(idx.name).add(FULL_RANGE); }); - } - return table.mutate(req).then(function (res) { - if (keys && (req.type === 'add' || req.type === 'put')) { - pkRangeSet.addKeys(res.results); - if (indexesWithAutoIncPK) { - indexesWithAutoIncPK.forEach(function (idx) { - var idxVals = req.values.map(function (v) { return idx.extractKey(v); }); - var pkPos = idx.keyPath.findIndex(function (prop) { return prop === primaryKey.keyPath; }); - res.results.forEach(function (pk) { return idxVals[pkPos] = pk; }); - getRangeSet(idx.name).addKeys(idxVals); - }); - } - } - trans.mutatedParts = extendObservabilitySet(trans.mutatedParts || {}, mutatedParts); - return res; - }); - } }); - var getRange = function (_a) { - var _b, _c; - var _d = _a.query, index = _d.index, range = _d.range; - return [ - index, - new RangeSet((_b = range.lower) !== null && _b !== void 0 ? _b : core.MIN_KEY, (_c = range.upper) !== null && _c !== void 0 ? _c : core.MAX_KEY), - ]; - }; - var readSubscribers = { - get: function (req) { return [primaryKey, new RangeSet(req.key)]; }, - getMany: function (req) { return [primaryKey, new RangeSet().addKeys(req.keys)]; }, - count: getRange, - query: getRange, - openCursor: getRange, - }; - keys(readSubscribers).forEach(function (method) { - tableClone[method] = function (req) { - var subscr = PSD.subscr; - var isLiveQuery = !!subscr; - var cachable = isCachableContext(PSD, table) && isCachableRequest(method, req); - var obsSet = cachable - ? req.obsSet = {} - : subscr; - if (isLiveQuery) { - var getRangeSet = function (indexName) { - var part = "idb://".concat(dbName, "/").concat(tableName, "/").concat(indexName); - return (obsSet[part] || - (obsSet[part] = new RangeSet())); - }; - var pkRangeSet_1 = getRangeSet(""); - var delsRangeSet_1 = getRangeSet(":dels"); - var _a = readSubscribers[method](req), queriedIndex = _a[0], queriedRanges = _a[1]; - if (method === 'query' && queriedIndex.isPrimaryKey && !req.values) { - delsRangeSet_1.add(queriedRanges); - } - else { - getRangeSet(queriedIndex.name || "").add(queriedRanges); - } - if (!queriedIndex.isPrimaryKey) { - if (method === "count") { - delsRangeSet_1.add(FULL_RANGE); - } - else { - var keysPromise_1 = method === "query" && - outbound && - req.values && - table.query(__assign(__assign({}, req), { values: false })); - return table[method].apply(this, arguments).then(function (res) { - if (method === "query") { - if (outbound && req.values) { - return keysPromise_1.then(function (_a) { - var resultingKeys = _a.result; - pkRangeSet_1.addKeys(resultingKeys); - return res; - }); - } - var pKeys = req.values - ? res.result.map(extractKey) - : res.result; - if (req.values) { - pkRangeSet_1.addKeys(pKeys); - } - else { - delsRangeSet_1.addKeys(pKeys); - } - } - else if (method === "openCursor") { - var cursor_1 = res; - var wantValues_1 = req.values; - return (cursor_1 && - Object.create(cursor_1, { - key: { - get: function () { - delsRangeSet_1.addKey(cursor_1.primaryKey); - return cursor_1.key; - }, - }, - primaryKey: { - get: function () { - var pkey = cursor_1.primaryKey; - delsRangeSet_1.addKey(pkey); - return pkey; - }, - }, - value: { - get: function () { - wantValues_1 && pkRangeSet_1.addKey(cursor_1.primaryKey); - return cursor_1.value; - }, - }, - })); - } - return res; - }); - } - } - } - return table[method].apply(this, arguments); - }; - }); - return tableClone; - } }); - }, - }; - function trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs) { - function addAffectedIndex(ix) { - var rangeSet = getRangeSet(ix.name || ""); - function extractKey(obj) { - return obj != null ? ix.extractKey(obj) : null; - } - var addKeyOrKeys = function (key) { return ix.multiEntry && isArray(key) - ? key.forEach(function (key) { return rangeSet.addKey(key); }) - : rangeSet.addKey(key); }; - (oldObjs || newObjs).forEach(function (_, i) { - var oldKey = oldObjs && extractKey(oldObjs[i]); - var newKey = newObjs && extractKey(newObjs[i]); - if (cmp(oldKey, newKey) !== 0) { - if (oldKey != null) - addKeyOrKeys(oldKey); - if (newKey != null) - addKeyOrKeys(newKey); - } - }); - } - schema.indexes.forEach(addAffectedIndex); - } - - function adjustOptimisticFromFailures(tblCache, req, res) { - if (res.numFailures === 0) - return req; - if (req.type === 'deleteRange') { - return null; - } - var numBulkOps = req.keys - ? req.keys.length - : 'values' in req && req.values - ? req.values.length - : 1; - if (res.numFailures === numBulkOps) { - return null; - } - var clone = __assign({}, req); - if (isArray(clone.keys)) { - clone.keys = clone.keys.filter(function (_, i) { return !(i in res.failures); }); - } - if ('values' in clone && isArray(clone.values)) { - clone.values = clone.values.filter(function (_, i) { return !(i in res.failures); }); - } - return clone; - } - - function isAboveLower(key, range) { - return range.lower === undefined - ? true - : range.lowerOpen - ? cmp(key, range.lower) > 0 - : cmp(key, range.lower) >= 0; - } - function isBelowUpper(key, range) { - return range.upper === undefined - ? true - : range.upperOpen - ? cmp(key, range.upper) < 0 - : cmp(key, range.upper) <= 0; - } - function isWithinRange(key, range) { - return isAboveLower(key, range) && isBelowUpper(key, range); - } - - function applyOptimisticOps(result, req, ops, table, cacheEntry, immutable) { - if (!ops || ops.length === 0) - return result; - var index = req.query.index; - var multiEntry = index.multiEntry; - var queryRange = req.query.range; - var primaryKey = table.schema.primaryKey; - var extractPrimKey = primaryKey.extractKey; - var extractIndex = index.extractKey; - var extractLowLevelIndex = (index.lowLevelIndex || index).extractKey; - var finalResult = ops.reduce(function (result, op) { - var modifedResult = result; - var includedValues = op.type === 'add' || op.type === 'put' - ? op.values.filter(function (v) { - var key = extractIndex(v); - return multiEntry && isArray(key) - ? key.some(function (k) { return isWithinRange(k, queryRange); }) - : isWithinRange(key, queryRange); - }).map(function (v) { - v = deepClone(v); - if (immutable) - Object.freeze(v); - return v; - }) - : []; - switch (op.type) { - case 'add': - modifedResult = result.concat(req.values - ? includedValues - : includedValues.map(function (v) { return extractPrimKey(v); })); - break; - case 'put': - var keySet_1 = new RangeSet().addKeys(op.values.map(function (v) { return extractPrimKey(v); })); - modifedResult = result - .filter(function (item) { - var key = req.values ? extractPrimKey(item) : item; - return !rangesOverlap(new RangeSet(key), keySet_1); - }) - .concat(req.values - ? includedValues - : includedValues.map(function (v) { return extractPrimKey(v); })); - break; - case 'delete': - var keysToDelete_1 = new RangeSet().addKeys(op.keys); - modifedResult = result.filter(function (item) { - var key = req.values ? extractPrimKey(item) : item; - return !rangesOverlap(new RangeSet(key), keysToDelete_1); - }); - break; - case 'deleteRange': - var range_1 = op.range; - modifedResult = result.filter(function (item) { return !isWithinRange(extractPrimKey(item), range_1); }); - break; - } - return modifedResult; - }, result); - if (finalResult === result) - return result; - finalResult.sort(function (a, b) { - return cmp(extractLowLevelIndex(a), extractLowLevelIndex(b)) || - cmp(extractPrimKey(a), extractPrimKey(b)); - }); - if (req.limit && req.limit < Infinity) { - if (finalResult.length > req.limit) { - finalResult.length = req.limit; - } - else if (result.length === req.limit && finalResult.length < req.limit) { - cacheEntry.dirty = true; - } - } - return immutable ? Object.freeze(finalResult) : finalResult; - } - - function areRangesEqual(r1, r2) { - return (cmp(r1.lower, r2.lower) === 0 && - cmp(r1.upper, r2.upper) === 0 && - !!r1.lowerOpen === !!r2.lowerOpen && - !!r1.upperOpen === !!r2.upperOpen); - } - - function compareLowers(lower1, lower2, lowerOpen1, lowerOpen2) { - if (lower1 === undefined) - return lower2 !== undefined ? -1 : 0; - if (lower2 === undefined) - return 1; - var c = cmp(lower1, lower2); - if (c === 0) { - if (lowerOpen1 && lowerOpen2) - return 0; - if (lowerOpen1) - return 1; - if (lowerOpen2) - return -1; - } - return c; - } - function compareUppers(upper1, upper2, upperOpen1, upperOpen2) { - if (upper1 === undefined) - return upper2 !== undefined ? 1 : 0; - if (upper2 === undefined) - return -1; - var c = cmp(upper1, upper2); - if (c === 0) { - if (upperOpen1 && upperOpen2) - return 0; - if (upperOpen1) - return -1; - if (upperOpen2) - return 1; - } - return c; - } - function isSuperRange(r1, r2) { - return (compareLowers(r1.lower, r2.lower, r1.lowerOpen, r2.lowerOpen) <= 0 && - compareUppers(r1.upper, r2.upper, r1.upperOpen, r2.upperOpen) >= 0); - } - - function findCompatibleQuery(dbName, tableName, type, req) { - var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)]; - if (!tblCache) - return []; - var queries = tblCache.queries[type]; - if (!queries) - return [null, false, tblCache, null]; - var indexName = req.query ? req.query.index.name : null; - var entries = queries[indexName || '']; - if (!entries) - return [null, false, tblCache, null]; - switch (type) { - case 'query': - var equalEntry = entries.find(function (entry) { - return entry.req.limit === req.limit && - entry.req.values === req.values && - areRangesEqual(entry.req.query.range, req.query.range); - }); - if (equalEntry) - return [ - equalEntry, - true, - tblCache, - entries, - ]; - var superEntry = entries.find(function (entry) { - var limit = 'limit' in entry.req ? entry.req.limit : Infinity; - return (limit >= req.limit && - (req.values ? entry.req.values : true) && - isSuperRange(entry.req.query.range, req.query.range)); - }); - return [superEntry, false, tblCache, entries]; - case 'count': - var countQuery = entries.find(function (entry) { - return areRangesEqual(entry.req.query.range, req.query.range); - }); - return [countQuery, !!countQuery, tblCache, entries]; - } - } - - function subscribeToCacheEntry(cacheEntry, container, requery, signal) { - cacheEntry.subscribers.add(requery); - signal.addEventListener("abort", function () { - cacheEntry.subscribers.delete(requery); - if (cacheEntry.subscribers.size === 0) { - enqueForDeletion(cacheEntry, container); - } - }); - } - function enqueForDeletion(cacheEntry, container) { - setTimeout(function () { - if (cacheEntry.subscribers.size === 0) { - delArrayItem(container, cacheEntry); - } - }, 3000); - } - - var cacheMiddleware = { - stack: 'dbcore', - level: 0, - name: 'Cache', - create: function (core) { - var dbName = core.schema.name; - var coreMW = __assign(__assign({}, core), { transaction: function (stores, mode, options) { - var idbtrans = core.transaction(stores, mode, options); - if (mode === 'readwrite') { - var ac_1 = new AbortController(); - var signal = ac_1.signal; - var endTransaction = function (wasCommitted) { return function () { - ac_1.abort(); - if (mode === 'readwrite') { - var affectedSubscribers_1 = new Set(); - for (var _i = 0, stores_1 = stores; _i < stores_1.length; _i++) { - var storeName = stores_1[_i]; - var tblCache = cache["idb://".concat(dbName, "/").concat(storeName)]; - if (tblCache) { - var table = core.table(storeName); - var ops = tblCache.optimisticOps.filter(function (op) { return op.trans === idbtrans; }); - if (idbtrans._explicit && wasCommitted && idbtrans.mutatedParts) { - for (var _a = 0, _b = Object.values(tblCache.queries.query); _a < _b.length; _a++) { - var entries = _b[_a]; - for (var _c = 0, _d = entries.slice(); _c < _d.length; _c++) { - var entry = _d[_c]; - if (obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)) { - delArrayItem(entries, entry); - entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); }); - } - } - } - } - else if (ops.length > 0) { - tblCache.optimisticOps = tblCache.optimisticOps.filter(function (op) { return op.trans !== idbtrans; }); - for (var _e = 0, _f = Object.values(tblCache.queries.query); _e < _f.length; _e++) { - var entries = _f[_e]; - for (var _g = 0, _h = entries.slice(); _g < _h.length; _g++) { - var entry = _h[_g]; - if (entry.res != null && - idbtrans.mutatedParts - ) { - if (wasCommitted && !entry.dirty) { - var freezeResults = Object.isFrozen(entry.res); - var modRes = applyOptimisticOps(entry.res, entry.req, ops, table, entry, freezeResults); - if (entry.dirty) { - delArrayItem(entries, entry); - entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); }); - } - else if (modRes !== entry.res) { - entry.res = modRes; - entry.promise = DexiePromise.resolve({ result: modRes }); - } - } - else { - if (entry.dirty) { - delArrayItem(entries, entry); - } - entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); }); - } - } - } - } - } - } - } - affectedSubscribers_1.forEach(function (requery) { return requery(); }); - } - }; }; - idbtrans.addEventListener('abort', endTransaction(false), { - signal: signal, - }); - idbtrans.addEventListener('error', endTransaction(false), { - signal: signal, - }); - idbtrans.addEventListener('complete', endTransaction(true), { - signal: signal, - }); - } - return idbtrans; - }, table: function (tableName) { - var downTable = core.table(tableName); - var primKey = downTable.schema.primaryKey; - var tableMW = __assign(__assign({}, downTable), { mutate: function (req) { - var trans = PSD.trans; - if (primKey.outbound || - trans.db._options.cache === 'disabled' || - trans.explicit - ) { - return downTable.mutate(req); - } - var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)]; - if (!tblCache) - return downTable.mutate(req); - var promise = downTable.mutate(req); - if ((req.type === 'add' || req.type === 'put') && (req.values.length >= 50 || getEffectiveKeys(primKey, req).some(function (key) { return key == null; }))) { - promise.then(function (res) { - var reqWithResolvedKeys = __assign(__assign({}, req), { values: req.values.map(function (value, i) { - var _a; - var valueWithKey = ((_a = primKey.keyPath) === null || _a === void 0 ? void 0 : _a.includes('.')) - ? deepClone(value) - : __assign({}, value); - setByKeyPath(valueWithKey, primKey.keyPath, res.results[i]); - return valueWithKey; - }) }); - var adjustedReq = adjustOptimisticFromFailures(tblCache, reqWithResolvedKeys, res); - tblCache.optimisticOps.push(adjustedReq); - queueMicrotask(function () { return req.mutatedParts && signalSubscribersLazily(req.mutatedParts); }); - }); - } - else { - tblCache.optimisticOps.push(req); - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - promise.then(function (res) { - if (res.numFailures > 0) { - delArrayItem(tblCache.optimisticOps, req); - var adjustedReq = adjustOptimisticFromFailures(tblCache, req, res); - if (adjustedReq) { - tblCache.optimisticOps.push(adjustedReq); - } - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - } - }); - promise.catch(function () { - delArrayItem(tblCache.optimisticOps, req); - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - }); - } - return promise; - }, query: function (req) { - var _a; - if (!isCachableContext(PSD, downTable) || !isCachableRequest("query", req)) - return downTable.query(req); - var freezeResults = ((_a = PSD.trans) === null || _a === void 0 ? void 0 : _a.db._options.cache) === 'immutable'; - var _b = PSD, requery = _b.requery, signal = _b.signal; - var _c = findCompatibleQuery(dbName, tableName, 'query', req), cacheEntry = _c[0], exactMatch = _c[1], tblCache = _c[2], container = _c[3]; - if (cacheEntry && exactMatch) { - cacheEntry.obsSet = req.obsSet; - } - else { - var promise = downTable.query(req).then(function (res) { - var result = res.result; - if (cacheEntry) - cacheEntry.res = result; - if (freezeResults) { - for (var i = 0, l = result.length; i < l; ++i) { - Object.freeze(result[i]); - } - Object.freeze(result); - } - else { - res.result = deepClone(result); - } - return res; - }).catch(function (error) { - if (container && cacheEntry) - delArrayItem(container, cacheEntry); - return Promise.reject(error); - }); - cacheEntry = { - obsSet: req.obsSet, - promise: promise, - subscribers: new Set(), - type: 'query', - req: req, - dirty: false, - }; - if (container) { - container.push(cacheEntry); - } - else { - container = [cacheEntry]; - if (!tblCache) { - tblCache = cache["idb://".concat(dbName, "/").concat(tableName)] = { - queries: { - query: {}, - count: {}, - }, - objs: new Map(), - optimisticOps: [], - unsignaledParts: {} - }; - } - tblCache.queries.query[req.query.index.name || ''] = container; - } - } - subscribeToCacheEntry(cacheEntry, container, requery, signal); - return cacheEntry.promise.then(function (res) { - return { - result: applyOptimisticOps(res.result, req, tblCache === null || tblCache === void 0 ? void 0 : tblCache.optimisticOps, downTable, cacheEntry, freezeResults), - }; - }); - } }); - return tableMW; - } }); - return coreMW; - }, - }; - - function vipify(target, vipDb) { - return new Proxy(target, { - get: function (target, prop, receiver) { - if (prop === 'db') - return vipDb; - return Reflect.get(target, prop, receiver); - } - }); - } - - var Dexie$1 = (function () { - function Dexie(name, options) { - var _this = this; - this._middlewares = {}; - this.verno = 0; - var deps = Dexie.dependencies; - this._options = options = __assign({ - addons: Dexie.addons, autoOpen: true, - indexedDB: deps.indexedDB, IDBKeyRange: deps.IDBKeyRange, cache: 'cloned' }, options); - this._deps = { - indexedDB: options.indexedDB, - IDBKeyRange: options.IDBKeyRange - }; - var addons = options.addons; - this._dbSchema = {}; - this._versions = []; - this._storeNames = []; - this._allTables = {}; - this.idbdb = null; - this._novip = this; - var state = { - dbOpenError: null, - isBeingOpened: false, - onReadyBeingFired: null, - openComplete: false, - dbReadyResolve: nop, - dbReadyPromise: null, - cancelOpen: nop, - openCanceller: null, - autoSchema: true, - PR1398_maxLoop: 3, - autoOpen: options.autoOpen, - }; - state.dbReadyPromise = new DexiePromise(function (resolve) { - state.dbReadyResolve = resolve; - }); - state.openCanceller = new DexiePromise(function (_, reject) { - state.cancelOpen = reject; - }); - this._state = state; - this.name = name; - this.on = Events(this, "populate", "blocked", "versionchange", "close", { ready: [promisableChain, nop] }); - this.on.ready.subscribe = override(this.on.ready.subscribe, function (subscribe) { - return function (subscriber, bSticky) { - Dexie.vip(function () { - var state = _this._state; - if (state.openComplete) { - if (!state.dbOpenError) - DexiePromise.resolve().then(subscriber); - if (bSticky) - subscribe(subscriber); - } - else if (state.onReadyBeingFired) { - state.onReadyBeingFired.push(subscriber); - if (bSticky) - subscribe(subscriber); - } - else { - subscribe(subscriber); - var db_1 = _this; - if (!bSticky) - subscribe(function unsubscribe() { - db_1.on.ready.unsubscribe(subscriber); - db_1.on.ready.unsubscribe(unsubscribe); - }); - } - }); - }; - }); - this.Collection = createCollectionConstructor(this); - this.Table = createTableConstructor(this); - this.Transaction = createTransactionConstructor(this); - this.Version = createVersionConstructor(this); - this.WhereClause = createWhereClauseConstructor(this); - this.on("versionchange", function (ev) { - if (ev.newVersion > 0) - console.warn("Another connection wants to upgrade database '".concat(_this.name, "'. Closing db now to resume the upgrade.")); - else - console.warn("Another connection wants to delete database '".concat(_this.name, "'. Closing db now to resume the delete request.")); - _this.close({ disableAutoOpen: false }); - }); - this.on("blocked", function (ev) { - if (!ev.newVersion || ev.newVersion < ev.oldVersion) - console.warn("Dexie.delete('".concat(_this.name, "') was blocked")); - else - console.warn("Upgrade '".concat(_this.name, "' blocked by other connection holding version ").concat(ev.oldVersion / 10)); - }); - this._maxKey = getMaxKey(options.IDBKeyRange); - this._createTransaction = function (mode, storeNames, dbschema, parentTransaction) { return new _this.Transaction(mode, storeNames, dbschema, _this._options.chromeTransactionDurability, parentTransaction); }; - this._fireOnBlocked = function (ev) { - _this.on("blocked").fire(ev); - connections - .filter(function (c) { return c.name === _this.name && c !== _this && !c._state.vcFired; }) - .map(function (c) { return c.on("versionchange").fire(ev); }); - }; - this.use(cacheExistingValuesMiddleware); - this.use(cacheMiddleware); - this.use(observabilityMiddleware); - this.use(virtualIndexMiddleware); - this.use(hooksMiddleware); - var vipDB = new Proxy(this, { - get: function (_, prop, receiver) { - if (prop === '_vip') - return true; - if (prop === 'table') - return function (tableName) { return vipify(_this.table(tableName), vipDB); }; - var rv = Reflect.get(_, prop, receiver); - if (rv instanceof Table) - return vipify(rv, vipDB); - if (prop === 'tables') - return rv.map(function (t) { return vipify(t, vipDB); }); - if (prop === '_createTransaction') - return function () { - var tx = rv.apply(this, arguments); - return vipify(tx, vipDB); - }; - return rv; - } - }); - this.vip = vipDB; - addons.forEach(function (addon) { return addon(_this); }); - } - Dexie.prototype.version = function (versionNumber) { - if (isNaN(versionNumber) || versionNumber < 0.1) - throw new exceptions.Type("Given version is not a positive number"); - versionNumber = Math.round(versionNumber * 10) / 10; - if (this.idbdb || this._state.isBeingOpened) - throw new exceptions.Schema("Cannot add version when database is open"); - this.verno = Math.max(this.verno, versionNumber); - var versions = this._versions; - var versionInstance = versions.filter(function (v) { return v._cfg.version === versionNumber; })[0]; - if (versionInstance) - return versionInstance; - versionInstance = new this.Version(versionNumber); - versions.push(versionInstance); - versions.sort(lowerVersionFirst); - versionInstance.stores({}); - this._state.autoSchema = false; - return versionInstance; - }; - Dexie.prototype._whenReady = function (fn) { - var _this = this; - return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new DexiePromise(function (resolve, reject) { - if (_this._state.openComplete) { - return reject(new exceptions.DatabaseClosed(_this._state.dbOpenError)); - } - if (!_this._state.isBeingOpened) { - if (!_this._state.autoOpen) { - reject(new exceptions.DatabaseClosed()); - return; - } - _this.open().catch(nop); - } - _this._state.dbReadyPromise.then(resolve, reject); - }).then(fn); - }; - Dexie.prototype.use = function (_a) { - var stack = _a.stack, create = _a.create, level = _a.level, name = _a.name; - if (name) - this.unuse({ stack: stack, name: name }); - var middlewares = this._middlewares[stack] || (this._middlewares[stack] = []); - middlewares.push({ stack: stack, create: create, level: level == null ? 10 : level, name: name }); - middlewares.sort(function (a, b) { return a.level - b.level; }); - return this; - }; - Dexie.prototype.unuse = function (_a) { - var stack = _a.stack, name = _a.name, create = _a.create; - if (stack && this._middlewares[stack]) { - this._middlewares[stack] = this._middlewares[stack].filter(function (mw) { - return create ? mw.create !== create : - name ? mw.name !== name : - false; - }); - } - return this; - }; - Dexie.prototype.open = function () { - var _this = this; - return usePSD(globalPSD, - function () { return dexieOpen(_this); }); - }; - Dexie.prototype._close = function () { - var state = this._state; - var idx = connections.indexOf(this); - if (idx >= 0) - connections.splice(idx, 1); - if (this.idbdb) { - try { - this.idbdb.close(); - } - catch (e) { } - this.idbdb = null; - } - if (!state.isBeingOpened) { - state.dbReadyPromise = new DexiePromise(function (resolve) { - state.dbReadyResolve = resolve; - }); - state.openCanceller = new DexiePromise(function (_, reject) { - state.cancelOpen = reject; - }); - } - }; - Dexie.prototype.close = function (_a) { - var _b = _a === void 0 ? { disableAutoOpen: true } : _a, disableAutoOpen = _b.disableAutoOpen; - var state = this._state; - if (disableAutoOpen) { - if (state.isBeingOpened) { - state.cancelOpen(new exceptions.DatabaseClosed()); - } - this._close(); - state.autoOpen = false; - state.dbOpenError = new exceptions.DatabaseClosed(); - } - else { - this._close(); - state.autoOpen = this._options.autoOpen || - state.isBeingOpened; - state.openComplete = false; - state.dbOpenError = null; - } - }; - Dexie.prototype.delete = function (closeOptions) { - var _this = this; - if (closeOptions === void 0) { closeOptions = { disableAutoOpen: true }; } - var hasInvalidArguments = arguments.length > 0 && typeof arguments[0] !== 'object'; - var state = this._state; - return new DexiePromise(function (resolve, reject) { - var doDelete = function () { - _this.close(closeOptions); - var req = _this._deps.indexedDB.deleteDatabase(_this.name); - req.onsuccess = wrap(function () { - _onDatabaseDeleted(_this._deps, _this.name); - resolve(); - }); - req.onerror = eventRejectHandler(reject); - req.onblocked = _this._fireOnBlocked; - }; - if (hasInvalidArguments) - throw new exceptions.InvalidArgument("Invalid closeOptions argument to db.delete()"); - if (state.isBeingOpened) { - state.dbReadyPromise.then(doDelete); - } - else { - doDelete(); - } - }); - }; - Dexie.prototype.backendDB = function () { - return this.idbdb; - }; - Dexie.prototype.isOpen = function () { - return this.idbdb !== null; - }; - Dexie.prototype.hasBeenClosed = function () { - var dbOpenError = this._state.dbOpenError; - return dbOpenError && (dbOpenError.name === 'DatabaseClosed'); - }; - Dexie.prototype.hasFailed = function () { - return this._state.dbOpenError !== null; - }; - Dexie.prototype.dynamicallyOpened = function () { - return this._state.autoSchema; - }; - Object.defineProperty(Dexie.prototype, "tables", { - get: function () { - var _this = this; - return keys(this._allTables).map(function (name) { return _this._allTables[name]; }); - }, - enumerable: false, - configurable: true - }); - Dexie.prototype.transaction = function () { - var args = extractTransactionArgs.apply(this, arguments); - return this._transaction.apply(this, args); - }; - Dexie.prototype._transaction = function (mode, tables, scopeFunc) { - var _this = this; - var parentTransaction = PSD.trans; - if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) - parentTransaction = null; - var onlyIfCompatible = mode.indexOf('?') !== -1; - mode = mode.replace('!', '').replace('?', ''); - var idbMode, storeNames; - try { - storeNames = tables.map(function (table) { - var storeName = table instanceof _this.Table ? table.name : table; - if (typeof storeName !== 'string') - throw new TypeError("Invalid table argument to Dexie.transaction(). Only Table or String are allowed"); - return storeName; - }); - if (mode == "r" || mode === READONLY) - idbMode = READONLY; - else if (mode == "rw" || mode == READWRITE) - idbMode = READWRITE; - else - throw new exceptions.InvalidArgument("Invalid transaction mode: " + mode); - if (parentTransaction) { - if (parentTransaction.mode === READONLY && idbMode === READWRITE) { - if (onlyIfCompatible) { - parentTransaction = null; - } - else - throw new exceptions.SubTransaction("Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY"); - } - if (parentTransaction) { - storeNames.forEach(function (storeName) { - if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) { - if (onlyIfCompatible) { - parentTransaction = null; - } - else - throw new exceptions.SubTransaction("Table " + storeName + - " not included in parent transaction."); - } - }); - } - if (onlyIfCompatible && parentTransaction && !parentTransaction.active) { - parentTransaction = null; - } - } - } - catch (e) { - return parentTransaction ? - parentTransaction._promise(null, function (_, reject) { reject(e); }) : - rejection(e); - } - var enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc); - return (parentTransaction ? - parentTransaction._promise(idbMode, enterTransaction, "lock") : - PSD.trans ? - usePSD(PSD.transless, function () { return _this._whenReady(enterTransaction); }) : - this._whenReady(enterTransaction)); - }; - Dexie.prototype.table = function (tableName) { - if (!hasOwn(this._allTables, tableName)) { - throw new exceptions.InvalidTable("Table ".concat(tableName, " does not exist")); - } - return this._allTables[tableName]; - }; - return Dexie; - }()); - - var symbolObservable = typeof Symbol !== "undefined" && "observable" in Symbol - ? Symbol.observable - : "@@observable"; - var Observable = (function () { - function Observable(subscribe) { - this._subscribe = subscribe; - } - Observable.prototype.subscribe = function (x, error, complete) { - return this._subscribe(!x || typeof x === "function" ? { next: x, error: error, complete: complete } : x); - }; - Observable.prototype[symbolObservable] = function () { - return this; - }; - return Observable; - }()); - - var domDeps; - try { - domDeps = { - indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB, - IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange - }; - } - catch (e) { - domDeps = { indexedDB: null, IDBKeyRange: null }; - } - - function liveQuery(querier) { - var hasValue = false; - var currentValue; - var observable = new Observable(function (observer) { - var scopeFuncIsAsync = isAsyncFunction(querier); - function execute(ctx) { - var wasRootExec = beginMicroTickScope(); - try { - if (scopeFuncIsAsync) { - incrementExpectedAwaits(); - } - var rv = newScope(querier, ctx); - if (scopeFuncIsAsync) { - rv = rv.finally(decrementExpectedAwaits); - } - return rv; - } - finally { - wasRootExec && endMicroTickScope(); - } - } - var closed = false; - var abortController; - var accumMuts = {}; - var currentObs = {}; - var subscription = { - get closed() { - return closed; - }, - unsubscribe: function () { - if (closed) - return; - closed = true; - if (abortController) - abortController.abort(); - if (startedListening) - globalEvents.storagemutated.unsubscribe(mutationListener); - }, - }; - observer.start && observer.start(subscription); - var startedListening = false; - var doQuery = function () { return execInGlobalContext(_doQuery); }; - function shouldNotify() { - return obsSetsOverlap(currentObs, accumMuts); - } - var mutationListener = function (parts) { - extendObservabilitySet(accumMuts, parts); - if (shouldNotify()) { - doQuery(); - } - }; - var _doQuery = function () { - if (closed || - !domDeps.indexedDB) - { - return; - } - accumMuts = {}; - var subscr = {}; - if (abortController) - abortController.abort(); - abortController = new AbortController(); - var ctx = { - subscr: subscr, - signal: abortController.signal, - requery: doQuery, - querier: querier, - trans: null - }; - var ret = execute(ctx); - Promise.resolve(ret).then(function (result) { - hasValue = true; - currentValue = result; - if (closed || ctx.signal.aborted) { - return; - } - accumMuts = {}; - currentObs = subscr; - if (!objectIsEmpty(currentObs) && !startedListening) { - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener); - startedListening = true; - } - execInGlobalContext(function () { return !closed && observer.next && observer.next(result); }); - }, function (err) { - hasValue = false; - if (!['DatabaseClosedError', 'AbortError'].includes(err === null || err === void 0 ? void 0 : err.name)) { - if (!closed) - execInGlobalContext(function () { - if (closed) - return; - observer.error && observer.error(err); - }); - } - }); - }; - setTimeout(doQuery, 0); - return subscription; - }); - observable.hasValue = function () { return hasValue; }; - observable.getValue = function () { return currentValue; }; - return observable; - } - - var Dexie = Dexie$1; - props(Dexie, __assign(__assign({}, fullNameExceptions), { - delete: function (databaseName) { - var db = new Dexie(databaseName, { addons: [] }); - return db.delete(); - }, - exists: function (name) { - return new Dexie(name, { addons: [] }).open().then(function (db) { - db.close(); - return true; - }).catch('NoSuchDatabaseError', function () { return false; }); - }, - getDatabaseNames: function (cb) { - try { - return getDatabaseNames(Dexie.dependencies).then(cb); - } - catch (_a) { - return rejection(new exceptions.MissingAPI()); - } - }, - defineClass: function () { - function Class(content) { - extend(this, content); - } - return Class; - }, ignoreTransaction: function (scopeFunc) { - return PSD.trans ? - usePSD(PSD.transless, scopeFunc) : - scopeFunc(); - }, vip: vip, async: function (generatorFn) { - return function () { - try { - var rv = awaitIterator(generatorFn.apply(this, arguments)); - if (!rv || typeof rv.then !== 'function') - return DexiePromise.resolve(rv); - return rv; - } - catch (e) { - return rejection(e); - } - }; - }, spawn: function (generatorFn, args, thiz) { - try { - var rv = awaitIterator(generatorFn.apply(thiz, args || [])); - if (!rv || typeof rv.then !== 'function') - return DexiePromise.resolve(rv); - return rv; - } - catch (e) { - return rejection(e); - } - }, - currentTransaction: { - get: function () { return PSD.trans || null; } - }, waitFor: function (promiseOrFunction, optionalTimeout) { - var promise = DexiePromise.resolve(typeof promiseOrFunction === 'function' ? - Dexie.ignoreTransaction(promiseOrFunction) : - promiseOrFunction) - .timeout(optionalTimeout || 60000); - return PSD.trans ? - PSD.trans.waitFor(promise) : - promise; - }, - Promise: DexiePromise, - debug: { - get: function () { return debug; }, - set: function (value) { - setDebug(value); - } - }, - derive: derive, extend: extend, props: props, override: override, - Events: Events, on: globalEvents, liveQuery: liveQuery, extendObservabilitySet: extendObservabilitySet, - getByKeyPath: getByKeyPath, setByKeyPath: setByKeyPath, delByKeyPath: delByKeyPath, shallowClone: shallowClone, deepClone: deepClone, getObjectDiff: getObjectDiff, cmp: cmp, asap: asap$1, - minKey: minKey, - addons: [], - connections: connections, - errnames: errnames, - dependencies: domDeps, cache: cache, - semVer: DEXIE_VERSION, version: DEXIE_VERSION.split('.') - .map(function (n) { return parseInt(n); }) - .reduce(function (p, c, i) { return p + (c / Math.pow(10, i * 2)); }) })); - Dexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange); - - if (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') { - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (updatedParts) { - if (!propagatingLocally) { - var event_1; - event_1 = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, { - detail: updatedParts - }); - propagatingLocally = true; - dispatchEvent(event_1); - propagatingLocally = false; - } - }); - addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, function (_a) { - var detail = _a.detail; - if (!propagatingLocally) { - propagateLocally(detail); - } - }); - } - function propagateLocally(updateParts) { - var wasMe = propagatingLocally; - try { - propagatingLocally = true; - globalEvents.storagemutated.fire(updateParts); - signalSubscribersNow(updateParts, true); - } - finally { - propagatingLocally = wasMe; - } - } - var propagatingLocally = false; - - var bc; - var createBC = function () { }; - if (typeof BroadcastChannel !== 'undefined') { - createBC = function () { - bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME); - bc.onmessage = function (ev) { return ev.data && propagateLocally(ev.data); }; - }; - createBC(); - if (typeof bc.unref === 'function') { - bc.unref(); - } - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (changedParts) { - if (!propagatingLocally) { - bc.postMessage(changedParts); - } - }); - } - - if (typeof addEventListener !== 'undefined') { - addEventListener('pagehide', function (event) { - if (!Dexie$1.disableBfCache && event.persisted) { - if (debug) - console.debug('Dexie: handling persisted pagehide'); - bc === null || bc === void 0 ? void 0 : bc.close(); - for (var _i = 0, connections_1 = connections; _i < connections_1.length; _i++) { - var db = connections_1[_i]; - db.close({ disableAutoOpen: false }); - } - } - }); - addEventListener('pageshow', function (event) { - if (!Dexie$1.disableBfCache && event.persisted) { - if (debug) - console.debug('Dexie: handling persisted pageshow'); - createBC(); - propagateLocally({ all: new RangeSet(-Infinity, [[]]) }); - } - }); - } - - function add(value) { - return new PropModification({ add: value }); - } - - function remove(value) { - return new PropModification({ remove: value }); - } - - function replacePrefix(a, b) { - return new PropModification({ replacePrefix: [a, b] }); - } - - DexiePromise.rejectionMapper = mapError; - setDebug(debug); - - var namedExports = /*#__PURE__*/Object.freeze({ - __proto__: null, - Dexie: Dexie$1, - liveQuery: liveQuery, - Entity: Entity, - cmp: cmp, - PropModSymbol: PropModSymbol, - PropModification: PropModification, - replacePrefix: replacePrefix, - add: add, - remove: remove, - 'default': Dexie$1, - RangeSet: RangeSet, - mergeRanges: mergeRanges, - rangesOverlap: rangesOverlap - }); - - __assign(Dexie$1, namedExports, { default: Dexie$1 }); - - return Dexie$1; - -})); -//# sourceMappingURL=dexie.js.map diff --git a/src/assets/dexie/dist/dexie.js.map b/src/assets/dexie/dist/dexie.js.map deleted file mode 100644 index 29172da0a..000000000 --- a/src/assets/dexie/dist/dexie.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dexie.js","sources":["../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.es6.js","../src/globals/global.ts","../src/functions/utils.ts","../src/errors/errors.js","../src/functions/chaining-functions.js","../src/helpers/debug.ts","../src/helpers/promise.js","../src/functions/temp-transaction.ts","../src/globals/constants.ts","../src/functions/combine.ts","../src/dbcore/keyrange.ts","../src/functions/workaround-undefined-primkey.ts","../src/classes/entity/Entity.ts","../src/functions/cmp.ts","../src/classes/table/table.ts","../src/helpers/Events.js","../src/functions/make-class-constructor.ts","../src/classes/table/table-constructor.ts","../src/classes/collection/collection-helpers.ts","../src/helpers/prop-modification.ts","../src/classes/collection/collection.ts","../src/classes/collection/collection-constructor.ts","../src/functions/compare-functions.ts","../src/classes/where-clause/where-clause-helpers.ts","../src/classes/where-clause/where-clause.ts","../src/classes/where-clause/where-clause-constructor.ts","../src/functions/event-wrappers.ts","../src/globals/global-events.ts","../src/classes/transaction/transaction.ts","../src/classes/transaction/transaction-constructor.ts","../src/helpers/index-spec.ts","../src/helpers/table-schema.ts","../src/functions/quirks.ts","../src/dbcore/get-key-extractor.ts","../src/dbcore/dbcore-indexeddb.ts","../src/classes/dexie/generate-middleware-stacks.ts","../src/classes/version/schema-helpers.ts","../src/classes/version/version.ts","../src/classes/version/version-constructor.ts","../src/helpers/database-enumerator.ts","../src/classes/dexie/vip.ts","../node_modules/.pnpm/safari-14-idb-fix@3.0.0/node_modules/safari-14-idb-fix/dist/index.js","../src/helpers/rangeset.ts","../src/live-query/extend-observability-set.ts","../src/live-query/obs-sets-overlap.ts","../src/live-query/cache/cache.ts","../src/live-query/cache/signalSubscribers.ts","../src/classes/dexie/dexie-open.ts","../src/helpers/yield-support.ts","../src/classes/dexie/transaction-helpers.ts","../src/dbcore/virtual-index-middleware.ts","../src/functions/get-object-diff.ts","../src/dbcore/get-effective-keys.ts","../src/hooks/hooks-middleware.ts","../src/dbcore/cache-existing-values-middleware.ts","../src/live-query/cache/is-cachable-context.ts","../src/live-query/cache/is-cachable-request.ts","../src/live-query/observability-middleware.ts","../src/live-query/cache/adjust-optimistic-request-from-failures.ts","../src/live-query/cache/is-within-range.ts","../src/live-query/cache/apply-optimistic-ops.ts","../src/live-query/cache/are-ranges-equal.ts","../src/live-query/cache/is-super-range.ts","../src/live-query/cache/find-compatible-query.ts","../src/live-query/cache/subscribe-cachentry.ts","../src/live-query/cache/cache-middleware.ts","../src/helpers/vipify.ts","../src/classes/dexie/dexie.ts","../src/classes/observable/observable.ts","../src/classes/dexie/dexie-dom-dependencies.ts","../src/live-query/live-query.ts","../src/classes/dexie/dexie-static-props.ts","../src/live-query/propagate-locally.ts","../src/live-query/enable-broadcast.ts","../src/support-bfcache.ts","../src/functions/propmods/add.ts","../src/functions/propmods/remove.ts","../src/functions/propmods/replace-prefix.ts","../src/index.ts","../src/index-umd.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","declare var global;\nexport const _global: any =\n typeof globalThis !== 'undefined' ? globalThis :\n typeof self !== 'undefined' ? self :\n typeof window !== 'undefined' ? window :\n global;\n","import { _global } from \"../globals/global\";\nexport const keys = Object.keys;\nexport const isArray = Array.isArray;\nif (typeof Promise !== 'undefined' && !_global.Promise){\n // In jsdom, this it can be the case that Promise is not put on the global object.\n // If so, we need to patch the global object for the rest of the code to work as expected.\n // Other dexie code expects Promise to be on the global object (like normal browser environments)\n _global.Promise = Promise;\n}\nexport { _global }\n\nexport function extend(obj: T, extension: X): T & X {\n if (typeof extension !== 'object') return obj as T & X;\n keys(extension).forEach(function (key) {\n obj[key] = extension[key];\n });\n return obj as T & X;\n}\n\nexport const getProto = Object.getPrototypeOf;\nexport const _hasOwn = {}.hasOwnProperty;\nexport function hasOwn(obj, prop) {\n return _hasOwn.call(obj, prop);\n}\n\nexport function props (proto, extension) {\n if (typeof extension === 'function') extension = extension(getProto(proto));\n (typeof Reflect === \"undefined\" ? keys : Reflect.ownKeys)(extension).forEach(key => {\n setProp(proto, key, extension[key]);\n });\n}\n\nexport const defineProperty = Object.defineProperty;\n\nexport function setProp(obj, prop, functionOrGetSet, options?) {\n defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, \"get\") && typeof functionOrGetSet.get === 'function' ?\n {get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true} :\n {value: functionOrGetSet, configurable: true, writable: true}, options));\n}\n\nexport function derive(Child) {\n return {\n from: function (Parent) {\n Child.prototype = Object.create(Parent.prototype);\n setProp(Child.prototype, \"constructor\", Child);\n return {\n extend: props.bind(null, Child.prototype)\n };\n }\n };\n}\n\nexport const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nexport function getPropertyDescriptor(obj, prop) {\n const pd = getOwnPropertyDescriptor(obj, prop);\n let proto;\n return pd || (proto = getProto(obj)) && getPropertyDescriptor (proto, prop);\n}\n\nconst _slice = [].slice;\nexport function slice(args, start?, end?) {\n return _slice.call(args, start, end);\n}\n\nexport function override(origFunc, overridedFactory) {\n return overridedFactory(origFunc);\n}\n\nexport function assert (b) {\n if (!b) throw new Error(\"Assertion Failed\");\n}\n\nexport function asap(fn) {\n // @ts-ignore\n if (_global.setImmediate) setImmediate(fn); else setTimeout(fn, 0);\n}\n\nexport function getUniqueArray(a) {\n return a.filter((value, index, self) => self.indexOf(value) === index);\n}\n\n/** Generate an object (hash map) based on given array.\n * @param extractor Function taking an array item and its index and returning an array of 2 items ([key, value]) to\n * instert on the resulting object for each item in the array. If this function returns a falsy value, the\n * current item wont affect the resulting object.\n */\nexport function arrayToObject (array: T[], extractor: (x:T, idx: number)=>[string, R]): {[name: string]: R} {\n return array.reduce((result, item, i) => {\n var nameAndValue = extractor(item, i);\n if (nameAndValue) result[nameAndValue[0]] = nameAndValue[1];\n return result;\n }, {});\n}\n\nexport function trycatcher(fn, reject) {\n return function () {\n try {\n fn.apply(this, arguments);\n } catch (e) {\n reject(e);\n }\n };\n}\n\nexport function tryCatch(fn: (...args: any[])=>void, onerror, args?) : void {\n try {\n fn.apply(null, args);\n } catch (ex) {\n onerror && onerror(ex);\n }\n}\n\nexport function getByKeyPath(obj, keyPath) {\n // http://www.w3.org/TR/IndexedDB/#steps-for-extracting-a-key-from-a-value-using-a-key-path\n if (typeof keyPath === 'string' && hasOwn(obj, keyPath)) return obj[keyPath]; // This line is moved from last to first for optimization purpose.\n if (!keyPath) return obj;\n if (typeof keyPath !== 'string') {\n var rv = [];\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n var val = getByKeyPath(obj, keyPath[i]);\n rv.push(val);\n }\n return rv;\n }\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var innerObj = obj[keyPath.substr(0, period)];\n return innerObj == null ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1));\n }\n return undefined;\n}\n\nexport function setByKeyPath(obj, keyPath, value) {\n if (!obj || keyPath === undefined) return;\n if ('isFrozen' in Object && Object.isFrozen(obj)) return;\n if (typeof keyPath !== 'string' && 'length' in keyPath) {\n assert(typeof value !== 'string' && 'length' in value);\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n setByKeyPath(obj, keyPath[i], value[i]);\n }\n } else {\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var currentKeyPath = keyPath.substr(0, period);\n var remainingKeyPath = keyPath.substr(period + 1);\n if (remainingKeyPath === \"\")\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) obj.splice(currentKeyPath, 1);\n else delete obj[currentKeyPath];\n } else obj[currentKeyPath] = value;\n else {\n var innerObj = obj[currentKeyPath];\n if (!innerObj || !hasOwn(obj, currentKeyPath)) innerObj = (obj[currentKeyPath] = {});\n setByKeyPath(innerObj, remainingKeyPath, value);\n }\n } else {\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(keyPath))) obj.splice(keyPath, 1);\n else delete obj[keyPath];\n } else obj[keyPath] = value;\n }\n }\n}\n\nexport function delByKeyPath(obj, keyPath) {\n if (typeof keyPath === 'string')\n setByKeyPath(obj, keyPath, undefined);\n else if ('length' in keyPath)\n [].map.call(keyPath, function(kp) {\n setByKeyPath(obj, kp, undefined);\n });\n}\n\nexport function shallowClone(obj) {\n var rv = {};\n for (var m in obj) {\n if (hasOwn(obj, m)) rv[m] = obj[m];\n }\n return rv;\n}\n\nconst concat = [].concat;\nexport function flatten (a: (T | T[])[]) : T[] {\n return concat.apply([], a);\n}\n\n//https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm\nconst intrinsicTypeNames =\n \"BigUint64Array,BigInt64Array,Array,Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,FileSystemDirectoryHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey\"\n .split(',').concat(\n flatten([8,16,32,64].map(num=>[\"Int\",\"Uint\",\"Float\"].map(t=>t+num+\"Array\")))\n ).filter(t=>_global[t]);\nconst intrinsicTypes = new Set(intrinsicTypeNames.map(t=>_global[t]));\n\n/** Deep clone a simple object tree.\n * \n * Copies object tree deeply, but does not deep-copy arrays,\n * typed arrays, Dates or other intrinsic types.\n * \n * Does not check for cyclic references.\n * \n * This function is 6 times faster than structuredClone() on chromium 111.\n * \n * This function can safely be used for cloning ObservabilitySets and RangeSets.\n * \n * @param o Object to clone\n * @returns Cloned object\n */\nexport function cloneSimpleObjectTree(o: T): T {\n const rv = {} as T;\n for (const k in o) if (hasOwn(o, k)) {\n const v = o[k];\n rv[k] = !v || typeof v !== 'object' || intrinsicTypes.has(v.constructor) ? v : cloneSimpleObjectTree(v);\n }\n return rv;\n}\n\nexport function objectIsEmpty(o: object) {\n for (const k in o) if (hasOwn(o, k)) return false;\n return true;\n}\n\nlet circularRefs: null | WeakMap = null;\n\n/** Deep clone an object or array.\n * \n * \n * @param any \n * @returns \n */\nexport function deepClone(any: T): T {\n circularRefs = new WeakMap();\n const rv = innerDeepClone(any);\n circularRefs = null;\n return rv;\n}\n\nfunction innerDeepClone(x: T): T {\n if (!x || typeof x !== 'object') return x;\n let rv = circularRefs.get(x); // Resolve circular references\n if (rv) return rv;\n if (isArray(x)) {\n rv = [];\n circularRefs.set(x, rv);\n for (var i = 0, l = x.length; i < l; ++i) {\n rv.push(innerDeepClone(x[i]));\n }\n } else if (intrinsicTypes.has(x.constructor)) {\n // For performance, we're less strict than structuredClone - we're only\n // cloning arrays and custom objects.\n // Typed arrays, Dates etc are not cloned.\n rv = x;\n } else {\n // We're nicer to custom classes than what structuredClone() is -\n // we preserve the proto of each object.\n const proto = getProto(x);\n rv = proto === Object.prototype ? {} : Object.create(proto);\n circularRefs.set(x, rv);\n for (var prop in x) {\n if (hasOwn(x, prop)) {\n rv[prop] = innerDeepClone(x[prop]);\n }\n }\n }\n return rv;\n}\n\nconst {toString} = {};\nexport function toStringTag(o: Object) {\n return toString.call(o).slice(8, -1);\n}\n\n// If first argument is iterable or array-like, return it as an array\nexport const iteratorSymbol = typeof Symbol !== 'undefined' ?\n Symbol.iterator :\n '@@iterator';\nexport const getIteratorOf = typeof iteratorSymbol === \"symbol\" ? function(x) {\n var i;\n return x != null && (i = x[iteratorSymbol]) && i.apply(x);\n} : function () { return null; };\nexport const asyncIteratorSymbol = typeof Symbol !== 'undefined'\n ? Symbol.asyncIterator || Symbol.for(\"Symbol.asyncIterator\")\n : '@asyncIterator';\n\nexport function delArrayItem(a: any[], x: any) {\n const i = a.indexOf(x);\n if (i >= 0) a.splice(i, 1);\n return i >= 0;\n}\n\nexport const NO_CHAR_ARRAY = {};\n// Takes one or several arguments and returns an array based on the following criteras:\n// * If several arguments provided, return arguments converted to an array in a way that\n// still allows javascript engine to optimize the code.\n// * If single argument is an array, return a clone of it.\n// * If this-pointer equals NO_CHAR_ARRAY, don't accept strings as valid iterables as a special\n// case to the two bullets below.\n// * If single argument is an iterable, convert it to an array and return the resulting array.\n// * If single argument is array-like (has length of type number), convert it to an array.\nexport function getArrayOf (arrayLike) {\n var i, a, x, it;\n if (arguments.length === 1) {\n if (isArray(arrayLike)) return arrayLike.slice();\n if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') return [arrayLike];\n if ((it = getIteratorOf(arrayLike))) {\n a = [];\n while ((x = it.next()), !x.done) a.push(x.value);\n return a;\n }\n if (arrayLike == null) return [arrayLike];\n i = arrayLike.length;\n if (typeof i === 'number') {\n a = new Array(i);\n while (i--) a[i] = arrayLike[i];\n return a;\n }\n return [arrayLike];\n }\n i = arguments.length;\n a = new Array(i);\n while (i--) a[i] = arguments[i];\n return a;\n}\nexport const isAsyncFunction = typeof Symbol !== 'undefined'\n ? (fn: Function) => fn[Symbol.toStringTag] === 'AsyncFunction'\n : ()=>false;\n","import { derive, setProp } from '../functions/utils';\n\nvar dexieErrorNames = [\n 'Modify',\n 'Bulk',\n 'OpenFailed',\n 'VersionChange',\n 'Schema',\n 'Upgrade',\n 'InvalidTable',\n 'MissingAPI',\n 'NoSuchDatabase',\n 'InvalidArgument',\n 'SubTransaction',\n 'Unsupported',\n 'Internal',\n 'DatabaseClosed',\n 'PrematureCommit',\n 'ForeignAwait'\n];\n\nvar idbDomErrorNames = [\n 'Unknown',\n 'Constraint',\n 'Data',\n 'TransactionInactive',\n 'ReadOnly',\n 'Version',\n 'NotFound',\n 'InvalidState',\n 'InvalidAccess',\n 'Abort',\n 'Timeout',\n 'QuotaExceeded',\n 'Syntax',\n 'DataClone'\n];\n\nvar errorList = dexieErrorNames.concat(idbDomErrorNames);\n\nvar defaultTexts = {\n VersionChanged: \"Database version changed by other database connection\",\n DatabaseClosed: \"Database has been closed\",\n Abort: \"Transaction aborted\",\n TransactionInactive: \"Transaction has already completed or failed\",\n MissingAPI: \"IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb\"\n};\n\n//\n// DexieError - base class of all out exceptions.\n//\nexport function DexieError (name, msg) {\n // Reason we don't use ES6 classes is because:\n // 1. It bloats transpiled code and increases size of minified code.\n // 2. It doesn't give us much in this case.\n // 3. It would require sub classes to call super(), which\n // is not needed when deriving from Error.\n this.name = name;\n this.message = msg;\n}\n\nderive(DexieError).from(Error).extend({\n toString: function(){ return this.name + \": \" + this.message; }\n});\n\nfunction getMultiErrorMessage (msg, failures) {\n return msg + \". Errors: \" + Object.keys(failures)\n .map(key=>failures[key].toString())\n .filter((v,i,s)=>s.indexOf(v) === i) // Only unique error strings\n .join('\\n');\n}\n\n//\n// ModifyError - thrown in Collection.modify()\n// Specific constructor because it contains members failures and failedKeys.\n//\nexport function ModifyError (msg, failures, successCount, failedKeys) {\n this.failures = failures;\n this.failedKeys = failedKeys;\n this.successCount = successCount;\n this.message = getMultiErrorMessage(msg, failures);\n}\nderive(ModifyError).from(DexieError);\n\nexport function BulkError (msg, failures) {\n this.name = \"BulkError\";\n this.failures = Object.keys(failures).map(pos => failures[pos]);\n this.failuresByPos = failures;\n this.message = getMultiErrorMessage(msg, this.failures);\n}\nderive(BulkError).from(DexieError);\n\n//\n//\n// Dynamically generate error names and exception classes based\n// on the names in errorList.\n//\n//\n\n// Map of {ErrorName -> ErrorName + \"Error\"}\nexport var errnames = errorList.reduce((obj,name)=>(obj[name]=name+\"Error\",obj),{});\n\n// Need an alias for DexieError because we're gonna create subclasses with the same name.\nconst BaseException = DexieError;\n// Map of {ErrorName -> exception constructor}\nexport var exceptions = errorList.reduce((obj,name)=>{\n // Let the name be \"DexieError\" because this name may\n // be shown in call stack and when debugging. DexieError is\n // the most true name because it derives from DexieError,\n // and we cannot change Function.name programatically without\n // dynamically create a Function object, which would be considered\n // 'eval-evil'.\n var fullName = name + \"Error\";\n function DexieError (msgOrInner, inner){\n this.name = fullName;\n if (!msgOrInner) {\n this.message = defaultTexts[name] || fullName;\n this.inner = null;\n } else if (typeof msgOrInner === 'string') {\n this.message = `${msgOrInner}${!inner ? '' : '\\n ' + inner}`;\n this.inner = inner || null;\n } else if (typeof msgOrInner === 'object') {\n this.message = `${msgOrInner.name} ${msgOrInner.message}`;\n this.inner = msgOrInner;\n }\n }\n derive(DexieError).from(BaseException);\n obj[name]=DexieError;\n return obj;\n},{});\n\n// Use ECMASCRIPT standard exceptions where applicable:\nexceptions.Syntax = SyntaxError;\nexceptions.Type = TypeError;\nexceptions.Range = RangeError;\n\nexport var exceptionMap = idbDomErrorNames.reduce((obj, name)=>{\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nexport function mapError (domError, message) {\n if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name])\n return domError;\n var rv = new exceptionMap[domError.name](message || domError.message, domError);\n if (\"stack\" in domError) {\n // Derive stack from inner exception if it has a stack\n setProp(rv, \"stack\", {get: function(){\n return this.inner.stack;\n }});\n }\n return rv;\n}\n\nexport var fullNameExceptions = errorList.reduce((obj, name)=>{\n if ([\"Syntax\",\"Type\",\"Range\"].indexOf(name) === -1)\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nfullNameExceptions.ModifyError = ModifyError;\nfullNameExceptions.DexieError = DexieError;\nfullNameExceptions.BulkError = BulkError;\n","import {extend} from './utils';\n\nexport function nop() { }\nexport function mirror(val) { return val; }\nexport function pureFunctionChain(f1, f2) {\n // Enables chained events that takes ONE argument and returns it to the next function in chain.\n // This pattern is used in the hook(\"reading\") event.\n if (f1 == null || f1 === mirror) return f2;\n return function (val) {\n return f2(f1(val));\n };\n}\n\nexport function callBoth(on1, on2) {\n return function () {\n on1.apply(this, arguments);\n on2.apply(this, arguments);\n };\n}\n\nexport function hookCreatingChain(f1, f2) {\n // Enables chained events that takes several arguments and may modify first argument by making a modification and then returning the same instance.\n // This pattern is used in the hook(\"creating\") event.\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res !== undefined) arguments[0] = res;\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res2 !== undefined ? res2 : res;\n };\n}\n\nexport function hookDeletingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = this.onerror = null;\n f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n };\n}\n\nexport function hookUpdatingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function (modifications) {\n var res = f1.apply(this, arguments);\n extend(modifications, res); // If f1 returns new modifications, extend caller's modifications with the result before calling next in chain.\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res === undefined ?\n (res2 === undefined ? undefined : res2) :\n (extend(res, res2));\n };\n}\n\nexport function reverseStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n if (f2.apply(this, arguments) === false) return false;\n return f1.apply(this, arguments);\n };\n}\n\nexport function nonStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n f2.apply(this, arguments);\n };\n}\n\nexport function promisableChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res && typeof res.then === 'function') {\n var thiz = this,\n i = arguments.length,\n args = new Array(i);\n while (i--) args[i] = arguments[i];\n return res.then(function () {\n return f2.apply(thiz, args);\n });\n }\n return f2.apply(this, arguments);\n };\n}\n","// By default, debug will be true only if platform is a web platform and its page is served from localhost.\n// When debug = true, error's stacks will contain asyncronic long stacks.\nexport var debug = typeof location !== 'undefined' &&\n // By default, use debug mode if served from localhost.\n /^(http|https):\\/\\/(localhost|127\\.0\\.0\\.1)/.test(location.href);\n\nexport function setDebug(value, filter) {\n debug = value;\n}\n\nexport function deprecated (what: string, fn: (...args)=>T) {\n return function () {\n console.warn(`${what} is deprecated. See https://dexie.org/docs/Deprecations}`);\n return fn.apply(this, arguments);\n } as (...args)=>T\n}\n","/*\n * Copyright (c) 2014-2017 David Fahlander\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/LICENSE-2.0\n */\nimport { _global } from '../globals/global';\nimport {tryCatch, props, setProp,\n getPropertyDescriptor, getArrayOf, extend, getProto} from '../functions/utils';\nimport {nop, callBoth, mirror} from '../functions/chaining-functions';\nimport {debug} from './debug';\nimport {exceptions} from '../errors';\n\n//\n// Promise and Zone (PSD) for Dexie library\n//\n// I started out writing this Promise class by copying promise-light (https://github.com/taylorhakes/promise-light) by\n// https://github.com/taylorhakes - an A+ and ECMASCRIPT 6 compliant Promise implementation.\n//\n// In previous versions this was fixed by not calling setTimeout when knowing that the resolve() or reject() came from another\n// tick. In Dexie v1.4.0, I've rewritten the Promise class entirely. Just some fragments of promise-light is left. I use\n// another strategy now that simplifies everything a lot: to always execute callbacks in a new micro-task, but have an own micro-task\n// engine that is indexedDB compliant across all browsers.\n// Promise class has also been optimized a lot with inspiration from bluebird - to avoid closures as much as possible.\n//\n// Specific non-standard features of this Promise class:\n// * Custom zone support (a.k.a. PSD) with ability to keep zones also when using native promises as well as\n// native async / await.\n// * Promise.follow() method built upon the custom zone engine, that allows user to track all promises created from current stack frame\n// and below + all promises that those promises creates or awaits.\n// * Detect any unhandled promise in a PSD-scope (PSD.onunhandled). \n//\n// David Fahlander, https://github.com/dfahlander\n//\n\n// Just a pointer that only this module knows about.\n// Used in Promise constructor to emulate a private constructor.\nvar INTERNAL = {};\n\nconst\n ZONE_ECHO_LIMIT = 100,\n [resolvedNativePromise, nativePromiseProto, resolvedGlobalPromise] = typeof Promise === 'undefined' ?\n [] :\n (()=>{\n let globalP = Promise.resolve();\n if (typeof crypto === 'undefined' || !crypto.subtle)\n return [globalP, getProto(globalP), globalP];\n // Generate a native promise (as window.Promise may have been patched)\n const nativeP = crypto.subtle.digest(\"SHA-512\", new Uint8Array([0]));\n return [\n nativeP,\n getProto(nativeP),\n globalP\n ];\n })(),\n nativePromiseThen = nativePromiseProto && nativePromiseProto.then;\n\nexport const NativePromise = resolvedNativePromise && resolvedNativePromise.constructor;\nconst patchGlobalPromise = !!resolvedGlobalPromise;\n\n/* The default function used only for the very first promise in a promise chain.\n As soon as then promise is resolved or rejected, all next tasks will be executed in micro ticks\n emulated in this module. For indexedDB compatibility, this means that every method needs to \n execute at least one promise before doing an indexedDB operation. Dexie will always call \n db.ready().then() for every operation to make sure the indexedDB event is started in an\n indexedDB-compatible emulated micro task loop.\n*/\nfunction schedulePhysicalTick() {\n queueMicrotask(physicalTick);\n}\n\n// Configurable through Promise.scheduler.\n// Don't export because it would be unsafe to let unknown\n// code call it unless they do try..catch within their callback.\n// This function can be retrieved through getter of Promise.scheduler though,\n// but users must not do Promise.scheduler = myFuncThatThrowsException\nvar asap = function (callback, args) {\n microtickQueue.push([callback, args]);\n if (needsNewPhysicalTick) {\n schedulePhysicalTick();\n needsNewPhysicalTick = false;\n }\n};\n\nvar isOutsideMicroTick = true, // True when NOT in a virtual microTick.\n needsNewPhysicalTick = true, // True when a push to microtickQueue must also schedulePhysicalTick()\n unhandledErrors = [], // Rejected promises that has occured. Used for triggering 'unhandledrejection'.\n rejectingErrors = [], // Tracks if errors are being re-rejected during onRejected callback.\n rejectionMapper = mirror; // Remove in next major when removing error mapping of DOMErrors and DOMExceptions\n \nexport var globalPSD = {\n id: 'global',\n global: true,\n ref: 0,\n unhandleds: [],\n onunhandled: nop,\n pgp: false,\n env: {},\n finalize: nop\n};\n\nexport var PSD = globalPSD;\n\nexport var microtickQueue = []; // Callbacks to call in this or next physical tick.\nexport var numScheduledCalls = 0; // Number of listener-calls left to do in this physical tick.\nexport var tickFinalizers = []; // Finalizers to call when there are no more async calls scheduled within current physical tick.\n\nexport default function DexiePromise(fn) {\n if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); \n this._listeners = [];\n \n // A library may set `promise._lib = true;` after promise is created to make resolve() or reject()\n // execute the microtask engine implicitely within the call to resolve() or reject().\n // To remain A+ compliant, a library must only set `_lib=true` if it can guarantee that the stack\n // only contains library code when calling resolve() or reject().\n // RULE OF THUMB: ONLY set _lib = true for promises explicitely resolving/rejecting directly from\n // global scope (event handler, timer etc)!\n this._lib = false;\n // Current async scope\n var psd = (this._PSD = PSD);\n \n if (typeof fn !== 'function') {\n if (fn !== INTERNAL) throw new TypeError('Not a function');\n // Private constructor (INTERNAL, state, value).\n // Used internally by Promise.resolve() and Promise.reject().\n this._state = arguments[1];\n this._value = arguments[2];\n if (this._state === false)\n handleRejection(this, this._value); // Map error, set stack and addPossiblyUnhandledError().\n return;\n }\n \n this._state = null; // null (=pending), false (=rejected) or true (=resolved)\n this._value = null; // error or result\n ++psd.ref; // Refcounting current scope\n executePromiseTask(this, fn);\n}\n\n// Prepare a property descriptor to put onto Promise.prototype.then\nconst thenProp = {\n get: function() {\n var psd = PSD, microTaskId = totalEchoes;\n\n function then (onFulfilled, onRejected) {\n var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes);\n const cleanup = possibleAwait && !decrementExpectedAwaits();\n var rv = new DexiePromise((resolve, reject) => {\n propagateToListener(this, new Listener(\n nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup),\n nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup),\n resolve,\n reject,\n psd));\n });\n if (this._consoleTask) rv._consoleTask = this._consoleTask;\n return rv;\n }\n\n then.prototype = INTERNAL; // For idempotense, see setter below.\n\n return then;\n },\n // Be idempotent and allow another framework (such as zone.js or another instance of a Dexie.Promise module) to replace Promise.prototype.then\n // and when that framework wants to restore the original property, we must identify that and restore the original property descriptor.\n set: function (value) {\n setProp (this, 'then', value && value.prototype === INTERNAL ?\n thenProp : // Restore to original property descriptor.\n {\n get: function(){\n return value; // Getter returning provided value (behaves like value is just changed)\n },\n set: thenProp.set // Keep a setter that is prepared to restore original.\n }\n );\n }\n};\n\nprops(DexiePromise.prototype, {\n then: thenProp, // Defined above.\n _then: function (onFulfilled, onRejected) {\n // A little tinier version of then() that don't have to create a resulting promise.\n propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); \n },\n\n catch: function (onRejected) {\n if (arguments.length === 1) return this.then(null, onRejected);\n // First argument is the Error type to catch\n var type = arguments[0],\n handler = arguments[1];\n return typeof type === 'function' ? this.then(null, err =>\n // Catching errors by its constructor type (similar to java / c++ / c#)\n // Sample: promise.catch(TypeError, function (e) { ... });\n err instanceof type ? handler(err) : PromiseReject(err))\n : this.then(null, err =>\n // Catching errors by the error.name property. Makes sense for indexedDB where error type\n // is always DOMError but where e.name tells the actual error type.\n // Sample: promise.catch('ConstraintError', function (e) { ... });\n err && err.name === type ? handler(err) : PromiseReject(err));\n },\n\n finally: function (onFinally) {\n return this.then(value => {\n return DexiePromise.resolve(onFinally()).then(()=>value);\n }, err => {\n return DexiePromise.resolve(onFinally()).then(()=>PromiseReject(err));\n });\n },\n \n timeout: function (ms, msg) {\n return ms < Infinity ?\n new DexiePromise((resolve, reject) => {\n var handle = setTimeout(() => reject(new exceptions.Timeout(msg)), ms);\n this.then(resolve, reject).finally(clearTimeout.bind(null, handle));\n }) : this;\n }\n});\n\nif (typeof Symbol !== 'undefined' && Symbol.toStringTag)\n setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise');\n\n// Now that Promise.prototype is defined, we have all it takes to set globalPSD.env.\n// Environment globals snapshotted on leaving global zone\nglobalPSD.env = snapShot();\n\nfunction Listener(onFulfilled, onRejected, resolve, reject, zone) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.resolve = resolve;\n this.reject = reject;\n this.psd = zone;\n}\n\n// Promise Static Properties\nprops (DexiePromise, {\n all: function () {\n var values = getArrayOf.apply(null, arguments) // Supports iterables, implicit arguments and array-like.\n .map(onPossibleParallellAsync); // Handle parallell async/awaits \n return new DexiePromise(function (resolve, reject) {\n if (values.length === 0) resolve([]);\n var remaining = values.length;\n values.forEach((a,i) => DexiePromise.resolve(a).then(x => {\n values[i] = x;\n if (!--remaining) resolve(values);\n }, reject));\n });\n },\n \n resolve: value => {\n if (value instanceof DexiePromise) return value;\n if (value && typeof value.then === 'function') return new DexiePromise((resolve, reject)=>{\n value.then(resolve, reject);\n });\n var rv = new DexiePromise(INTERNAL, true, value);\n return rv;\n },\n \n reject: PromiseReject,\n \n race: function () {\n var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n values.map(value => DexiePromise.resolve(value).then(resolve, reject));\n });\n },\n\n PSD: {\n get: ()=>PSD,\n set: value => PSD = value\n },\n\n totalEchoes: {get: ()=>totalEchoes},\n\n //task: {get: ()=>task},\n \n newPSD: newScope,\n \n usePSD: usePSD,\n \n scheduler: {\n get: () => asap,\n set: value => {asap = value}\n },\n \n rejectionMapper: {\n get: () => rejectionMapper,\n set: value => {rejectionMapper = value;} // Map reject failures\n },\n \n follow: (fn, zoneProps) => {\n return new DexiePromise((resolve, reject) => {\n return newScope((resolve, reject) => {\n var psd = PSD;\n psd.unhandleds = []; // For unhandled standard- or 3rd party Promises. Checked at psd.finalize()\n psd.onunhandled = reject; // Triggered directly on unhandled promises of this library.\n psd.finalize = callBoth(function () {\n // Unhandled standard or 3rd part promises are put in PSD.unhandleds and\n // examined upon scope completion while unhandled rejections in this Promise\n // will trigger directly through psd.onunhandled\n run_at_end_of_this_or_next_physical_tick(()=>{\n this.unhandleds.length === 0 ? resolve() : reject(this.unhandleds[0]);\n });\n }, psd.finalize);\n fn();\n }, zoneProps, resolve, reject);\n });\n }\n});\n\nif (NativePromise) {\n if (NativePromise.allSettled) setProp (DexiePromise, \"allSettled\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise(resolve => {\n if (possiblePromises.length === 0) resolve([]);\n let remaining = possiblePromises.length;\n const results = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => results[i] = {status: \"fulfilled\", value},\n reason => results[i] = {status: \"rejected\", reason})\n .then(()=>--remaining || resolve(results)));\n });\n });\n if (NativePromise.any && typeof AggregateError !== 'undefined') setProp(DexiePromise, \"any\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n if (possiblePromises.length === 0) reject(new AggregateError([]));\n let remaining = possiblePromises.length;\n const failures = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => resolve(value),\n failure => {\n failures[i] = failure;\n if (!--remaining) reject(new AggregateError(failures));\n }));\n });\n });\n}\n\n/**\n* Take a potentially misbehaving resolver function and make sure\n* onFulfilled and onRejected are only called once.\n*\n* Makes no guarantees about asynchrony.\n*/\nfunction executePromiseTask (promise, fn) {\n // Promise Resolution Procedure:\n // https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n try {\n fn(value => {\n if (promise._state !== null) return; // Already settled\n if (value === promise) throw new TypeError('A promise cannot be resolved with itself.');\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n if (value && typeof value.then === 'function') {\n executePromiseTask(promise, (resolve, reject) => {\n value instanceof DexiePromise ?\n value._then(resolve, reject) :\n value.then(resolve, reject);\n });\n } else {\n promise._state = true;\n promise._value = value;\n propagateAllListeners(promise);\n }\n if (shouldExecuteTick) endMicroTickScope();\n }, handleRejection.bind(null, promise)); // If Function.bind is not supported. Exception is handled in catch below\n } catch (ex) {\n handleRejection(promise, ex);\n }\n}\n\nfunction handleRejection (promise, reason) {\n rejectingErrors.push(reason);\n if (promise._state !== null) return;\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n reason = rejectionMapper(reason);\n promise._state = false;\n promise._value = reason;\n // Add the failure to a list of possibly uncaught errors\n addPossiblyUnhandledError(promise);\n propagateAllListeners(promise);\n if (shouldExecuteTick) endMicroTickScope();\n}\n\nfunction propagateAllListeners (promise) {\n //debug && linkToPreviousPromise(promise);\n var listeners = promise._listeners;\n promise._listeners = [];\n for (var i = 0, len = listeners.length; i < len; ++i) {\n propagateToListener(promise, listeners[i]);\n }\n var psd = promise._PSD;\n --psd.ref || psd.finalize(); // if psd.ref reaches zero, call psd.finalize();\n if (numScheduledCalls === 0) {\n // If numScheduledCalls is 0, it means that our stack is not in a callback of a scheduled call,\n // and that no deferreds where listening to this rejection or success.\n // Since there is a risk that our stack can contain application code that may\n // do stuff after this code is finished that may generate new calls, we cannot\n // call finalizers here.\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick(); // Will detect unhandled errors\n }, []);\n }\n}\n\nfunction propagateToListener(promise, listener) {\n if (promise._state === null) {\n promise._listeners.push(listener);\n return;\n }\n\n var cb = promise._state ? listener.onFulfilled : listener.onRejected;\n if (cb === null) {\n // This Listener doesnt have a listener for the event being triggered (onFulfilled or onReject) so lets forward the event to any eventual listeners on the Promise instance returned by then() or catch()\n return (promise._state ? listener.resolve : listener.reject) (promise._value);\n }\n ++listener.psd.ref;\n ++numScheduledCalls;\n asap (callListener, [cb, promise, listener]);\n}\n\nfunction callListener (cb, promise, listener) {\n try {\n // Call callback and resolve our listener with it's return value.\n var ret, value = promise._value;\n \n if (!promise._state && rejectingErrors.length) rejectingErrors = [];\n // cb is onResolved\n ret = debug && promise._consoleTask ? promise._consoleTask.run(()=>cb (value)) : cb (value);\n if (!promise._state && rejectingErrors.indexOf(value) === -1) {\n markErrorAsHandled(promise); // Callback didnt do Promise.reject(err) nor reject(err) onto another promise.\n }\n listener.resolve(ret);\n } catch (e) {\n // Exception thrown in callback. Reject our listener.\n listener.reject(e);\n } finally {\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n --listener.psd.ref || listener.psd.finalize();\n }\n}\n\n/* The callback to schedule with queueMicrotask().\n It runs a virtual microtick and executes any callback registered in microtickQueue.\n */\nfunction physicalTick() {\n usePSD(globalPSD, ()=>{\n // Make sure to reset the async context to globalPSD before\n // executing any of the microtick subscribers.\n beginMicroTickScope() && endMicroTickScope();\n });\n}\n\nexport function beginMicroTickScope() {\n var wasRootExec = isOutsideMicroTick;\n isOutsideMicroTick = false;\n needsNewPhysicalTick = false;\n return wasRootExec;\n}\n\n/* Executes micro-ticks without doing try..catch.\n This can be possible because we only use this internally and\n the registered functions are exception-safe (they do try..catch\n internally before calling any external method). If registering\n functions in the microtickQueue that are not exception-safe, this\n would destroy the framework and make it instable. So we don't export\n our asap method.\n*/\nexport function endMicroTickScope() {\n var callbacks, i, l;\n do {\n while (microtickQueue.length > 0) {\n callbacks = microtickQueue;\n microtickQueue = [];\n l = callbacks.length;\n for (i = 0; i < l; ++i) {\n var item = callbacks[i];\n item[0].apply(null, item[1]);\n }\n }\n } while (microtickQueue.length > 0);\n isOutsideMicroTick = true;\n needsNewPhysicalTick = true;\n}\n\nfunction finalizePhysicalTick() {\n var unhandledErrs = unhandledErrors;\n unhandledErrors = [];\n unhandledErrs.forEach(p => {\n p._PSD.onunhandled.call(null, p._value, p);\n });\n var finalizers = tickFinalizers.slice(0); // Clone first because finalizer may remove itself from list.\n var i = finalizers.length;\n while (i) finalizers[--i](); \n}\n\nfunction run_at_end_of_this_or_next_physical_tick (fn) {\n function finalizer() {\n fn();\n tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1);\n }\n tickFinalizers.push(finalizer);\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n }, []);\n}\n\nfunction addPossiblyUnhandledError(promise) {\n // Only add to unhandledErrors if not already there. The first one to add to this list\n // will be upon the first rejection so that the root cause (first promise in the\n // rejection chain) is the one listed.\n if (!unhandledErrors.some(p => p._value === promise._value))\n unhandledErrors.push(promise);\n}\n\nfunction markErrorAsHandled(promise) {\n // Called when a reject handled is actually being called.\n // Search in unhandledErrors for any promise whos _value is this promise_value (list\n // contains only rejected promises, and only one item per error)\n var i = unhandledErrors.length;\n while (i) if (unhandledErrors[--i]._value === promise._value) {\n // Found a promise that failed with this same error object pointer,\n // Remove that since there is a listener that actually takes care of it.\n unhandledErrors.splice(i, 1);\n return;\n }\n}\n\nfunction PromiseReject (reason) {\n return new DexiePromise(INTERNAL, false, reason);\n}\n\nexport function wrap (fn, errorCatcher) {\n var psd = PSD;\n return function() {\n var wasRootExec = beginMicroTickScope(),\n outerScope = PSD;\n\n try {\n switchToZone(psd, true);\n return fn.apply(this, arguments);\n } catch (e) {\n errorCatcher && errorCatcher(e);\n } finally {\n switchToZone(outerScope, false);\n if (wasRootExec) endMicroTickScope();\n }\n };\n}\n\n\n//\n// variables used for native await support\n//\nconst task = { awaits: 0, echoes: 0, id: 0}; // The ongoing macro-task when using zone-echoing.\nvar taskCounter = 0; // ID counter for macro tasks.\nvar zoneStack = []; // Stack of left zones to restore asynchronically.\nvar zoneEchoes = 0; // When > 0, zoneLeaveEcho is queued. When 0 and task.echoes is also 0, nothing is queued.\nvar totalEchoes = 0; // ID counter for micro-tasks. Used to detect possible native await in our Promise.prototype.then.\n\n\nvar zone_id_counter = 0;\nexport function newScope (fn, props, a1, a2) {\n var parent = PSD,\n psd = Object.create(parent);\n psd.parent = parent;\n psd.ref = 0;\n psd.global = false;\n psd.id = ++zone_id_counter;\n // Prepare for promise patching (done in usePSD):\n var globalEnv = globalPSD.env;\n psd.env = patchGlobalPromise ? {\n Promise: DexiePromise, // Changing window.Promise could be omitted for Chrome and Edge, where IDB+Promise plays well!\n PromiseProp: {value: DexiePromise, configurable: true, writable: true},\n all: DexiePromise.all,\n race: DexiePromise.race,\n allSettled: DexiePromise.allSettled,\n any: DexiePromise.any,\n resolve: DexiePromise.resolve,\n reject: DexiePromise.reject,\n } : {};\n if (props) extend(psd, props);\n \n // unhandleds and onunhandled should not be specifically set here.\n // Leave them on parent prototype.\n // unhandleds.push(err) will push to parent's prototype\n // onunhandled() will call parents onunhandled (with this scope's this-pointer though!)\n ++parent.ref;\n psd.finalize = function () {\n --this.parent.ref || this.parent.finalize();\n }\n var rv = usePSD (psd, fn, a1, a2);\n if (psd.ref === 0) psd.finalize();\n return rv;\n}\n\n// Function to call if scopeFunc returns NativePromise\n// Also for each NativePromise in the arguments to Promise.all()\nexport function incrementExpectedAwaits() {\n if (!task.id) task.id = ++taskCounter;\n ++task.awaits;\n task.echoes += ZONE_ECHO_LIMIT;\n return task.id;\n}\n\n// Function to call when 'then' calls back on a native promise where onAwaitExpected() had been called.\n// Also call this when a native await calls then method on a promise. In that case, don't supply\n// sourceTaskId because we already know it refers to current task.\nexport function decrementExpectedAwaits() {\n if (!task.awaits) return false;\n if (--task.awaits === 0) task.id = 0;\n task.echoes = task.awaits * ZONE_ECHO_LIMIT; // Will reset echoes to 0 if awaits is 0.\n return true;\n}\n\nif ((''+nativePromiseThen).indexOf('[native code]') === -1) {\n // If the native promise' prototype is patched, we cannot rely on zone echoing.\n // Disable that here:\n incrementExpectedAwaits = decrementExpectedAwaits = nop;\n}\n\n// Call from Promise.all() and Promise.race()\nexport function onPossibleParallellAsync (possiblePromise) {\n if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) {\n incrementExpectedAwaits(); \n return possiblePromise.then(x => {\n decrementExpectedAwaits();\n return x;\n }, e => {\n decrementExpectedAwaits();\n return rejection(e);\n });\n }\n return possiblePromise;\n}\n\nfunction zoneEnterEcho(targetZone) {\n ++totalEchoes;\n //console.log(\"Total echoes \", totalEchoes);\n //if (task.echoes === 1) console.warn(\"Cancelling echoing of async context.\");\n if (!task.echoes || --task.echoes === 0) {\n task.echoes = task.awaits = task.id = 0; // Cancel echoing.\n }\n\n zoneStack.push(PSD);\n switchToZone(targetZone, true);\n}\n\nfunction zoneLeaveEcho() {\n var zone = zoneStack[zoneStack.length-1];\n zoneStack.pop();\n switchToZone(zone, false);\n}\n\nfunction switchToZone (targetZone, bEnteringZone) {\n var currentZone = PSD;\n if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) {\n // Enter or leave zone asynchronically as well, so that tasks initiated during current tick\n // will be surrounded by the zone when they are invoked.\n queueMicrotask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho);\n }\n if (targetZone === PSD) return;\n\n PSD = targetZone; // The actual zone switch occurs at this line.\n\n // Snapshot on every leave from global zone.\n if (currentZone === globalPSD) globalPSD.env = snapShot();\n\n if (patchGlobalPromise) {\n // Let's patch the global and native Promises (may be same or may be different)\n var GlobalPromise = globalPSD.env.Promise;\n // Swich environments (may be PSD-zone or the global zone. Both apply.)\n var targetEnv = targetZone.env;\n\n if (currentZone.global || targetZone.global) {\n // Leaving or entering global zone. It's time to patch / restore global Promise.\n\n // Set this Promise to window.Promise so that transiled async functions will work on Firefox, Safari and IE, as well as with Zonejs and angular.\n Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp);\n\n // Support Promise.all() etc to work indexedDB-safe also when people are including es6-promise as a module (they might\n // not be accessing global.Promise but a local reference to it)\n GlobalPromise.all = targetEnv.all;\n GlobalPromise.race = targetEnv.race;\n GlobalPromise.resolve = targetEnv.resolve;\n GlobalPromise.reject = targetEnv.reject;\n if (targetEnv.allSettled) GlobalPromise.allSettled = targetEnv.allSettled;\n if (targetEnv.any) GlobalPromise.any = targetEnv.any;\n }\n }\n}\n\nfunction snapShot () {\n var GlobalPromise = _global.Promise;\n return patchGlobalPromise ? {\n Promise: GlobalPromise,\n PromiseProp: Object.getOwnPropertyDescriptor(_global, \"Promise\"),\n all: GlobalPromise.all,\n race: GlobalPromise.race,\n allSettled: GlobalPromise.allSettled,\n any: GlobalPromise.any,\n resolve: GlobalPromise.resolve,\n reject: GlobalPromise.reject,\n } : {};\n}\n\nexport function usePSD (psd, fn, a1, a2, a3) {\n var outerScope = PSD;\n try {\n switchToZone(psd, true);\n return fn(a1, a2, a3);\n } finally {\n switchToZone(outerScope, false);\n }\n}\n\nfunction nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) {\n return typeof fn !== 'function' ? fn : function () {\n var outerZone = PSD;\n if (possibleAwait) incrementExpectedAwaits();\n switchToZone(zone, true);\n try {\n return fn.apply(this, arguments);\n } finally {\n switchToZone(outerZone, false);\n if (cleanup) queueMicrotask(decrementExpectedAwaits);\n }\n };\n}\n\n/** Execute callback in global context */\nexport function execInGlobalContext(cb) {\n if (Promise === NativePromise && task.echoes === 0) {\n if (zoneEchoes === 0) {\n cb();\n } else {\n enqueueNativeMicroTask(cb);\n }\n } else {\n setTimeout(cb, 0);\n }\n}\n\nexport var rejection = DexiePromise.reject;\n\nexport {DexiePromise};\n","import { PSD, rejection, newScope } from \"../helpers/promise\";\nimport { DexieOptions } from \"../public/types/dexie-constructor\";\nimport { errnames, exceptions } from \"../errors\";\nimport { nop } from \"./chaining-functions\";\nimport { Transaction } from \"../classes/transaction\";\nimport { Dexie } from '../classes/dexie';\n\n/* Generate a temporary transaction when db operations are done outside a transaction scope.\n*/\nexport function tempTransaction (\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n fn: (resolve, reject, trans: Transaction) => any)\n // Last argument is \"writeLocked\". But this doesnt apply to oneshot direct db operations, so we ignore it.\n{\n if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) {\n if (db._state.openComplete) {\n // db.idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError));\n }\n if (!db._state.isBeingOpened) {\n if (!db._state.autoOpen)\n return rejection(new exceptions.DatabaseClosed());\n db.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n return db._state.dbReadyPromise.then(() => tempTransaction(db, mode, storeNames, fn));\n } else {\n var trans = db._createTransaction(mode, storeNames, db._dbSchema);\n try {\n trans.create();\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db.close({disableAutoOpen: false});\n return db.open().then(()=>tempTransaction(db, mode, storeNames, fn));\n }\n return rejection(ex);\n }\n return trans._promise(mode, (resolve, reject) => {\n return newScope(() => { // OPTIMIZATION POSSIBLE? newScope() not needed because it's already done in _promise.\n PSD.trans = trans;\n return fn(resolve, reject, trans);\n });\n }).then(result => {\n // Instead of resolving value directly, wait with resolving it until transaction has completed.\n // Otherwise the data would not be in the DB if requesting it in the then() operation.\n // Specifically, to ensure that the following expression will work:\n //\n // db.friends.put({name: \"Arne\"}).then(function () {\n // db.friends.where(\"name\").equals(\"Arne\").count(function(count) {\n // assert (count === 1);\n // });\n // });\n //\n if (mode === 'readwrite') try {trans.idbtrans.commit();} catch {}\n return mode === 'readonly' ? result : trans._completion.then(() => result);\n });/*.catch(err => { // Don't do this as of now. If would affect bulk- and modify methods in a way that could be more intuitive. But wait! Maybe change in next major.\n trans._reject(err);\n return rejection(err);\n });*/\n }\n}\n","import { Dexie } from \"../classes/dexie\";\n\nexport const DEXIE_VERSION = '{version}'; // Replaced by build-script.\nexport const maxString = String.fromCharCode(65535);\nexport const minKey = -Infinity; // minKey can be constant. maxKey must be a prop of Dexie (_maxKey)\nexport const INVALID_KEY_ARGUMENT =\n \"Invalid key provided. Keys must be of type string, number, Date or Array.\";\nexport const STRING_EXPECTED = \"String expected.\";\nexport const connections: Dexie[] = [];\nexport const dexieStackFrameFilter = frame => !/(dexie\\.js|dexie\\.min\\.js)/.test(frame);\nexport const DBNAMES_DB = '__dbnames';\nexport const READONLY = 'readonly';\nexport const READWRITE = 'readwrite';\n","export function combine(filter1, filter2) {\n return filter1 ?\n filter2 ?\n function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } :\n filter1 :\n filter2;\n}\n","import { DBCoreKeyRange, DBCoreRangeType } from '../public/types/dbcore';\n\nexport const AnyRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Any,\n lower: -Infinity,\n lowerOpen: false,\n upper: [[]],\n upperOpen: false\n}\n\nexport const NeverRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Never,\n lower: -Infinity,\n lowerOpen: true,\n upper: -Infinity,\n upperOpen: true\n}\n","import { deepClone, delByKeyPath, getByKeyPath } from './utils';\n\n// This workaround is needed since obj could be a custom-class instance with an\n// uninitialized keyPath. See the following comment for more context:\n// https://github.com/dfahlander/Dexie.js/issues/1280#issuecomment-823557881\nexport function workaroundForUndefinedPrimKey(keyPath: string | ArrayLike) {\n // Workaround only needed for plain non-dotted keyPaths\n return typeof keyPath === \"string\" && !/\\./.test(keyPath) \n ? (obj: object) => {\n if (obj[keyPath] === undefined && (keyPath in obj)) {\n // property exists but is undefined. This will not be liked by Indexeddb.\n // Need to remove the property before adding it but we need to clone it before\n // doing that to not be intrusive.\n obj = deepClone(obj);\n delete obj[keyPath];\n }\n return obj;\n }\n : (obj: object) => obj;\n}","import { exceptions } from \"../../errors\";\n\nexport function Entity(){\n throw exceptions.Type();\n}\n","// Implementation of https://www.w3.org/TR/IndexedDB-3/#compare-two-keys\n\nimport { toStringTag } from './utils';\n\n// ... with the adjustment to return NaN instead of throwing.\nexport function cmp(a: any, b: any): number {\n try {\n const ta = type(a);\n const tb = type(b);\n if (ta !== tb) {\n if (ta === 'Array') return 1;\n if (tb === 'Array') return -1;\n if (ta === 'binary') return 1;\n if (tb === 'binary') return -1;\n if (ta === 'string') return 1;\n if (tb === 'string') return -1;\n if (ta === 'Date') return 1;\n if (tb !== 'Date') return NaN;\n return -1;\n }\n switch (ta) {\n case 'number':\n case 'Date':\n case 'string':\n return a > b ? 1 : a < b ? -1 : 0;\n case 'binary': {\n return compareUint8Arrays(getUint8Array(a), getUint8Array(b));\n }\n case 'Array':\n return compareArrays(a, b);\n }\n } catch {}\n return NaN; // Return value if any given args are valid keys.\n}\n\nexport function compareArrays(a: any[], b: any[]): number {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n const res = cmp(a[i], b[i]);\n if (res !== 0) return res;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\nexport function compareUint8Arrays(\n a: Uint8Array,\n b: Uint8Array\n) {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n if (a[i] !== b[i]) return a[i] < b[i] ? -1 : 1;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\n// Implementation of https://www.w3.org/TR/IndexedDB-3/#key-type\nfunction type(x: any) {\n const t = typeof x;\n if (t !== 'object') return t;\n if (ArrayBuffer.isView(x)) return 'binary';\n const tsTag = toStringTag(x); // Cannot use instanceof in Safari\n return tsTag === 'ArrayBuffer' ? 'binary' : (tsTag as 'Array' | 'Date');\n}\n\ntype BinaryType =\n | ArrayBuffer\n | DataView\n | Uint8ClampedArray\n | ArrayBufferView\n | Uint8Array\n | Int8Array\n | Uint16Array\n | Int16Array\n | Uint32Array\n | Int32Array\n | Float32Array\n | Float64Array\n | BigInt64Array \n | BigUint64Array;\n\nfunction getUint8Array(a: BinaryType): Uint8Array {\n if (a instanceof Uint8Array) return a;\n if (ArrayBuffer.isView(a))\n // TypedArray or DataView\n return new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n return new Uint8Array(a); // ArrayBuffer\n}\n","import { BulkError, exceptions } from '../../errors';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { DexiePromise as Promise, PSD, newScope, rejection, beginMicroTickScope, endMicroTickScope } from '../../helpers/promise';\nimport { Transaction } from '../transaction';\nimport { Dexie } from '../dexie';\nimport { tempTransaction } from '../../functions/temp-transaction';\nimport { Collection } from '../collection';\nimport { isArray, keys, getByKeyPath, setByKeyPath, extend, getProto } from '../../functions/utils';\nimport { maxString } from '../../globals/constants';\nimport { combine } from '../../functions/combine';\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { IndexableType } from '../../public/types/indexable-type';\nimport { debug } from '../../helpers/debug';\nimport { DBCoreTable } from '../../public/types/dbcore';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { workaroundForUndefinedPrimKey } from '../../functions/workaround-undefined-primkey';\nimport { Entity } from '../entity/Entity';\nimport { UpdateSpec } from '../../public';\nimport { cmp } from '../../functions/cmp';\n\n/** class Table\n * \n * https://dexie.org/docs/Table/Table\n */\nexport class Table implements ITable {\n db: Dexie;\n _tx?: Transaction;\n name: string;\n schema: TableSchema;\n hook: TableHooks;\n core: DBCoreTable;\n\n _trans(\n mode: IDBTransactionMode,\n fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike | void,\n writeLocked?: boolean | string) : PromiseExtended\n {\n const trans: Transaction = this._tx || PSD.trans;\n const tableName = this.name;\n // @ts-ignore: Use Chrome's Async Stack Tagging API to allow tracing and simplify debugging for dexie users.\n const task = debug && typeof console !== 'undefined' && console.createTask && console.createTask(`Dexie: ${mode === 'readonly' ? 'read' : 'write' } ${this.name}`);\n \n function checkTableInTransaction(resolve, reject, trans: Transaction) {\n if (!trans.schema[tableName])\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\");\n return fn(trans.idbtrans, trans) as Promise;\n }\n // Surround all in a microtick scope.\n // Reason: Browsers (modern Safari + older others)\n // still as of 2018-10-10 has problems keeping a transaction\n // alive between micro ticks. Safari because if transaction\n // is created but not used in same microtick, it will go\n // away. That specific issue could be solved in DBCore\n // by opening the transaction just before using it instead.\n // But older Firefoxes and IE11 (with Promise polyfills)\n // will still have probs.\n // The beginMicrotickScope()/endMicrotickScope() works\n // in cooperation with Dexie.Promise to orchestrate\n // the micro-ticks in endMicrotickScope() rather than\n // in native engine.\n const wasRootExec = beginMicroTickScope();\n try {\n let p = trans && trans.db._novip === this.db._novip ?\n trans === PSD.trans ?\n trans._promise(mode, checkTableInTransaction, writeLocked) :\n newScope(() => trans._promise(mode, checkTableInTransaction, writeLocked), { trans: trans, transless: PSD.transless || PSD }) :\n tempTransaction(this.db, mode, [this.name], checkTableInTransaction);\n if (task) { // Dexie.debug = true so we trace errors\n p._consoleTask = task;\n p = p.catch(err => {\n console.trace(err);\n return rejection(err);\n });\n }\n return p; \n } finally {\n if (wasRootExec) endMicroTickScope();\n }\n }\n\n /** Table.get()\n * \n * https://dexie.org/docs/Table/Table.get()\n * \n **/\n get(keyOrCrit, cb?) {\n if (keyOrCrit && keyOrCrit.constructor === Object)\n return this.where(keyOrCrit as { [key: string]: IndexableType }).first(cb);\n if (keyOrCrit == null) return rejection(new exceptions.Type(`Invalid argument to Table.get()`));\n\n return this._trans('readonly', (trans) => {\n return this.core.get({trans, key: keyOrCrit})\n .then(res => this.hook.reading.fire(res));\n }).then(cb);\n }\n\n /** Table.where()\n * \n * https://dexie.org/docs/Table/Table.where()\n * \n **/\n where(indexOrCrit: string | string[] | { [key: string]: IndexableType }) {\n if (typeof indexOrCrit === 'string')\n return new this.db.WhereClause(this, indexOrCrit);\n if (isArray(indexOrCrit))\n return new this.db.WhereClause(this, `[${indexOrCrit.join('+')}]`);\n // indexOrCrit is an object map of {[keyPath]:value} \n const keyPaths = keys(indexOrCrit);\n if (keyPaths.length === 1)\n // Only one critera. This was the easy case:\n return this\n .where(keyPaths[0])\n .equals(indexOrCrit[keyPaths[0]]);\n\n // Multiple criterias.\n // Let's try finding a compound index that matches all keyPaths in\n // arbritary order:\n const compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(ix => {\n if (\n ix.compound &&\n keyPaths.every(keyPath => ix.keyPath.indexOf(keyPath) >= 0)) {\n for (let i=0; i a.keyPath.length - b.keyPath.length)[0];\n \n if (compoundIndex && this.db._maxKey !== maxString) {\n // Cool! We found such compound index\n // and this browser supports compound indexes (maxKey !== maxString)!\n const keyPathsInValidOrder = (compoundIndex.keyPath as string[]).slice(0, keyPaths.length);\n return this\n .where(keyPathsInValidOrder)\n .equals(keyPathsInValidOrder.map(kp => indexOrCrit[kp]));\n }\n\n if (!compoundIndex && debug) console.warn(\n `The query ${JSON.stringify(indexOrCrit)} on ${this.name} would benefit from a ` +\n `compound index [${keyPaths.join('+')}]`);\n\n // Ok, now let's fallback to finding at least one matching index\n // and filter the rest.\n const { idxByName } = this.schema;\n const idb = this.db._deps.indexedDB;\n\n function equals (a, b) {\n return idb.cmp(a,b) === 0; // Works with all indexable types including binary keys.\n }\n\n const [idx, filterFunction] = keyPaths.reduce(([prevIndex, prevFilterFn], keyPath) => {\n const index = idxByName[keyPath];\n const value = indexOrCrit[keyPath];\n return [\n prevIndex || index, // idx::=Pick index of first matching keypath\n prevIndex || !index ? // filter::=null if not needed, otherwise combine function filter\n combine(\n prevFilterFn,\n index && index.multi ?\n x => {\n const prop = getByKeyPath(x, keyPath);\n return isArray(prop) && prop.some(item => equals(value, item));\n } : x => equals(value, getByKeyPath(x, keyPath)))\n : prevFilterFn\n ];\n }, [null, null]);\n\n return idx ?\n this.where(idx.name).equals(indexOrCrit[idx.keyPath])\n .filter(filterFunction) :\n compoundIndex ?\n this.filter(filterFunction) : // Has compound but browser bad. Allow filter.\n this.where(keyPaths).equals(''); // No index at all. Fail lazily with \"[a+b+c] is not indexed\"\n }\n\n /** Table.filter()\n * \n * https://dexie.org/docs/Table/Table.filter()\n * \n **/\n filter(filterFunction: (obj: any) => boolean) {\n return this.toCollection().and(filterFunction);\n }\n\n /** Table.count()\n * \n * https://dexie.org/docs/Table/Table.count()\n * \n **/\n count(thenShortcut?: any) {\n return this.toCollection().count(thenShortcut);\n }\n\n /** Table.offset()\n * \n * https://dexie.org/docs/Table/Table.offset()\n * \n **/\n offset(offset: number) {\n return this.toCollection().offset(offset);\n }\n\n /** Table.limit()\n * \n * https://dexie.org/docs/Table/Table.limit()\n * \n **/\n limit(numRows: number) {\n return this.toCollection().limit(numRows);\n }\n\n /** Table.each()\n * \n * https://dexie.org/docs/Table/Table.each()\n * \n **/\n each(callback: (obj: any, cursor: { key: IndexableType, primaryKey: IndexableType }) => any) {\n return this.toCollection().each(callback);\n }\n\n /** Table.toArray()\n * \n * https://dexie.org/docs/Table/Table.toArray()\n * \n **/\n toArray(thenShortcut?: any) {\n return this.toCollection().toArray(thenShortcut);\n }\n\n /** Table.toCollection()\n * \n * https://dexie.org/docs/Table/Table.toCollection()\n * \n **/\n toCollection() {\n return new this.db.Collection(new this.db.WhereClause(this));\n }\n\n /** Table.orderBy()\n * \n * https://dexie.org/docs/Table/Table.orderBy()\n * \n **/\n orderBy(index: string | string[]) {\n return new this.db.Collection(\n new this.db.WhereClause(this, isArray(index) ?\n `[${index.join('+')}]` :\n index));\n }\n\n /** Table.reverse()\n * \n * https://dexie.org/docs/Table/Table.reverse()\n * \n **/\n reverse(): Collection {\n return this.toCollection().reverse();\n }\n\n /** Table.mapToClass()\n * \n * https://dexie.org/docs/Table/Table.mapToClass()\n * \n **/\n mapToClass(constructor: Function) {\n const {db, name: tableName} = this;\n this.schema.mappedClass = constructor;\n if (constructor.prototype instanceof Entity) {\n constructor = class extends (constructor as any) {\n get db () { return db; }\n table() { return tableName; }\n }\n }\n // Collect all inherited property names (including method names) by\n // walking the prototype chain. This is to avoid overwriting them from\n // database data - so application code can rely on inherited props never\n // becoming shadowed by database object props.\n const inheritedProps = new Set();\n for (let proto = constructor.prototype; proto; proto = getProto(proto)) {\n Object.getOwnPropertyNames(proto).forEach(propName => inheritedProps.add(propName));\n }\n \n // Now, subscribe to the when(\"reading\") event to make all objects that come out from this table inherit from given class\n // no matter which method to use for reading (Table.get() or Table.where(...)... )\n const readHook = (obj: Object) => {\n if (!obj) return obj; // No valid object. (Value is null or undefined). Return as is.\n // Create a new object that derives from constructor:\n const res = Object.create(constructor.prototype);\n // Clone members (but never those that collide with a property in the prototype\n // hierchary (MUST BE ABLE TO RELY ON Entity methods and props!)):\n for (let m in obj) if (!inheritedProps.has(m)) try { res[m] = obj[m]; } catch (_) { }\n return res;\n };\n\n if (this.schema.readHook) {\n this.hook.reading.unsubscribe(this.schema.readHook);\n }\n this.schema.readHook = readHook;\n this.hook(\"reading\", readHook);\n return constructor;\n }\n\n /** @deprecated */\n defineClass() {\n function Class (content){\n extend(this, content);\n };\n return this.mapToClass(Class);\n }\n\n /** Table.add()\n * \n * https://dexie.org/docs/Table/Table.add()\n * \n **/\n add(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd]});\n }).then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.update()\n * \n * https://dexie.org/docs/Table/Table.update()\n * \n **/\n update(keyOrObject, modifications: { [keyPath: string]: any; } | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) {\n const key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath);\n if (key === undefined) return rejection(new exceptions.InvalidArgument(\n \"Given object does not contain its primary key\"));\n /*// object to modify. Also modify given object with the modifications:\n // This part should be here for backward compatibility.\n // If ever feeling too bad about mutating given object, please wait to a new major before removing it,\n // and document the change thoroughly. TODO: Document this change!\n if (!Object.isFrozen(keyOrObject)) try {\n if (typeof modifications !== \"function\") {\n keys(modifications).forEach(keyPath => {\n setByKeyPath(keyOrObject, keyPath, modifications[keyPath]);\n });\n } else {\n // Now since we support function argument, we should have a similar behavior here as well\n // (as long as we do this mutability stuff on the given object)\n modifications(keyOrObject, {value: keyOrObject, primKey: key});\n }\n } catch {\n // Maybe given object was frozen.\n // This part is not essential. Just move on as nothing happened...\n }*/\n return this.where(\":id\").equals(key).modify(modifications);\n } else {\n // key to modify\n return this.where(\":id\").equals(keyOrObject).modify(modifications);\n }\n }\n\n /** Table.put()\n * \n * https://dexie.org/docs/Table/Table.put()\n * \n **/\n put(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans(\n 'readwrite',\n trans => this.core.mutate({trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.delete()\n * \n * https://dexie.org/docs/Table/Table.delete()\n * \n **/\n delete(key: IndexableType): PromiseExtended {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'delete', keys: [key]}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.clear()\n * \n * https://dexie.org/docs/Table/Table.clear()\n * \n **/\n clear() {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'deleteRange', range: AnyRange}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.bulkGet()\n * \n * https://dexie.org/docs/Table/Table.bulkGet()\n * \n * @param keys \n */\n bulkGet(keys: IndexableType[]) {\n return this._trans('readonly', trans => {\n return this.core.getMany({\n keys,\n trans\n }).then(result => result.map(res => this.hook.reading.fire(res)));\n });\n }\n\n /** Table.bulkAdd()\n * \n * https://dexie.org/docs/Table/Table.bulkAdd()\n * \n **/\n bulkAdd(\n objects: readonly any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkAdd(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToAdd = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n return this.core.mutate(\n {trans, type: 'add', keys: keys as IndexableType[], values: objectsToAdd, wantResults}\n )\n .then(({numFailures, results,lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkAdd(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkPut()\n * \n * https://dexie.org/docs/Table/Table.bulkPut()\n * \n **/\n bulkPut(\n objects: readonly any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkPut(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToPut = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n\n return this.core.mutate(\n {trans, type: 'put', keys: keys as IndexableType[], values: objectsToPut, wantResults}\n )\n .then(({numFailures, results, lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkPut(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkUpdate()\n *\n * https://dexie.org/docs/Table.Table.bulkUpdate()\n */\n bulkUpdate(\n keysAndChanges: readonly { key: any; changes: UpdateSpec }[]\n ): PromiseExtended {\n const coreTable = this.core;\n const keys = keysAndChanges.map((entry) => entry.key);\n const changeSpecs = keysAndChanges.map((entry) => entry.changes);\n const offsetMap: number[] = [];\n return this._trans('readwrite', (trans) => {\n return coreTable.getMany({ trans, keys, cache: 'clone' }).then((objs) => {\n const resultKeys: any[] = [];\n const resultObjs: any[] = [];\n keysAndChanges.forEach(({ key, changes }, idx) => {\n const obj = objs[idx];\n if (obj) {\n for (const keyPath of Object.keys(changes)) {\n const value = changes[keyPath];\n if (keyPath === this.schema.primKey.keyPath) {\n if (cmp(value, key) !== 0) {\n throw new exceptions.Constraint(\n `Cannot update primary key in bulkUpdate()`\n );\n }\n } else {\n setByKeyPath(obj, keyPath, value);\n }\n }\n offsetMap.push(idx);\n resultKeys.push(key);\n resultObjs.push(obj);\n }\n });\n const numEntries = resultKeys.length;\n return coreTable\n .mutate({\n trans,\n type: 'put',\n keys: resultKeys,\n values: resultObjs,\n updates: {\n keys,\n changeSpecs\n }\n })\n .then(({ numFailures, failures }) => {\n if (numFailures === 0) return numEntries;\n // Failure. bulkPut() may have a subset of keys\n // so we must translate returned 'failutes' into the offsets of given argument:\n for (const offset of Object.keys(failures)) {\n const mappedOffset = offsetMap[Number(offset)];\n if (mappedOffset != null) {\n const failure = failures[offset];\n delete failures[offset];\n failures[mappedOffset] = failure;\n }\n }\n throw new BulkError(\n `${this.name}.bulkUpdate(): ${numFailures} of ${numEntries} operations failed`,\n failures\n );\n });\n });\n });\n }\n\n /** Table.bulkDelete()\n * \n * https://dexie.org/docs/Table/Table.bulkDelete()\n * \n **/\n bulkDelete(keys: ReadonlyArray): PromiseExtended {\n const numKeys = keys.length;\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'delete', keys: keys as IndexableType[]});\n }).then(({numFailures, lastResult, failures}) => {\n if (numFailures === 0) return lastResult;\n throw new BulkError(\n `${this.name}.bulkDelete(): ${numFailures} of ${numKeys} operations failed`, failures);\n });\n }\n}\n","import {keys, isArray, asap} from '../functions/utils';\nimport {nop, mirror, reverseStoppableEventChain} from '../functions/chaining-functions';\nimport {exceptions} from '../errors';\n\nexport default function Events(ctx) {\n var evs = {};\n var rv = function (eventName, subscriber) {\n if (subscriber) {\n // Subscribe. If additional arguments than just the subscriber was provided, forward them as well.\n var i = arguments.length, args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n evs[eventName].subscribe.apply(null, args);\n return ctx;\n } else if (typeof (eventName) === 'string') {\n // Return interface allowing to fire or unsubscribe from event\n return evs[eventName];\n }\n };\n rv.addEventType = add;\n \n for (var i = 1, l = arguments.length; i < l; ++i) {\n add(arguments[i]);\n }\n \n return rv;\n\n function add(eventName, chainFunction, defaultFunction) {\n if (typeof eventName === 'object') return addConfiguredEvents(eventName);\n if (!chainFunction) chainFunction = reverseStoppableEventChain;\n if (!defaultFunction) defaultFunction = nop;\n\n var context = {\n subscribers: [],\n fire: defaultFunction,\n subscribe: function (cb) {\n if (context.subscribers.indexOf(cb) === -1) {\n context.subscribers.push(cb);\n context.fire = chainFunction(context.fire, cb);\n }\n },\n unsubscribe: function (cb) {\n context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; });\n context.fire = context.subscribers.reduce(chainFunction, defaultFunction);\n }\n };\n evs[eventName] = rv[eventName] = context;\n return context;\n }\n\n function addConfiguredEvents(cfg) {\n // events(this, {reading: [functionChain, nop]});\n keys(cfg).forEach(function (eventName) {\n var args = cfg[eventName];\n if (isArray(args)) {\n add(eventName, cfg[eventName][0], cfg[eventName][1]);\n } else if (args === 'asap') {\n // Rather than approaching event subscription using a functional approach, we here do it in a for-loop where subscriber is executed in its own stack\n // enabling that any exception that occur wont disturb the initiator and also not nescessary be catched and forgotten.\n var context = add(eventName, mirror, function fire() {\n // Optimazation-safe cloning of arguments into args.\n var i = arguments.length, args = new Array(i);\n while (i--) args[i] = arguments[i];\n // All each subscriber:\n context.subscribers.forEach(function (fn) {\n asap(function fireEvent() {\n fn.apply(null, args);\n });\n });\n });\n } else throw new exceptions.InvalidArgument(\"Invalid event config\");\n });\n }\n}\n","import { arrayToObject, derive } from './utils';\n\n\nexport function makeClassConstructor (prototype: Object, constructor: Function) {\n /*const propertyDescriptorMap = arrayToObject(\n Object.getOwnPropertyNames(prototype),\n propKey => [propKey, Object.getOwnPropertyDescriptor(prototype, propKey)]);\n\n // Both derive and clone the prototype.\n // derive: So that x instanceof T returns true when T is the class template.\n // clone: Optimizes method access a bit (but actually not nescessary)\n const derivedPrototypeClone = Object.create(prototype, propertyDescriptorMap);\n derivedPrototypeClone.constructor = constructor;\n constructor.prototype = derivedPrototypeClone;\n return constructor as any as TConstructor;*/\n\n // Keep the above code in case we want to clone AND derive the parent prototype.\n // Reason would be optimization of property access.\n // The code below will only create a prototypal inheritance from given constructor function\n // to given prototype.\n derive(constructor).from({prototype});\n return constructor as any as TConstructor; \n}\n","import { Dexie } from '../dexie';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { Transaction } from '../transaction/transaction';\nimport { hookCreatingChain, pureFunctionChain, nop, mirror, hookUpdatingChain, hookDeletingChain } from '../../functions/chaining-functions';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { Table } from './table';\nimport Events from '../../helpers/Events';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\n\nexport interface TableConstructor {\n new (name: string, tableSchema: TableSchema, optionalTrans?: Transaction) : Table;\n prototype: Table;\n}\n\n/** Generates a Table constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTableConstructor (db: Dexie) {\n return makeClassConstructor(\n Table.prototype,\n\n function Table (this: Table, name: string, tableSchema: TableSchema, trans?: Transaction) {\n this.db = db;\n this._tx = trans;\n this.name = name;\n this.schema = tableSchema;\n this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, {\n \"creating\": [hookCreatingChain, nop],\n \"reading\": [pureFunctionChain, mirror],\n \"updating\": [hookUpdatingChain, nop],\n \"deleting\": [hookDeletingChain, nop]\n }) as TableHooks;\n }\n\n );\n}\n","import { combine } from \"../../functions/combine\";\nimport { exceptions } from \"../../errors\";\nimport { hasOwn } from \"../../functions/utils\";\nimport { wrap } from \"../../helpers/promise\";\nimport { Collection } from './';\nimport { DBCoreCursor, DBCoreTable, DBCoreTransaction, DBCoreTableSchema, DBCoreRangeType } from '../../public/types/dbcore';\nimport { nop } from '../../functions/chaining-functions';\n\ntype CollectionContext = Collection[\"_ctx\"];\n\nexport function isPlainKeyRange (ctx: CollectionContext, ignoreLimitFilter?: boolean) {\n return !(ctx.filter || ctx.algorithm || ctx.or) &&\n (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter);\n} \n\nexport function addFilter(ctx: CollectionContext, fn: Function) {\n ctx.filter = combine(ctx.filter, fn);\n}\n\nexport function addReplayFilter (ctx: CollectionContext, factory, isLimitFilter?) {\n var curr = ctx.replayFilter;\n ctx.replayFilter = curr ? ()=>combine(curr(), factory()) : factory;\n ctx.justLimit = isLimitFilter && !curr;\n}\n\nexport function addMatchFilter(ctx: CollectionContext, fn) {\n ctx.isMatch = combine(ctx.isMatch, fn);\n}\n\nexport function getIndexOrStore(ctx: CollectionContext, coreSchema: DBCoreTableSchema) {\n // TODO: Rewrite this. No need to know ctx.isPrimKey. ctx.index should hold the keypath.\n // Still, throw if not found!\n if (ctx.isPrimKey) return coreSchema.primaryKey;\n const index = coreSchema.getIndexByKeyPath(ctx.index);\n if (!index) throw new exceptions.Schema(\"KeyPath \" + ctx.index + \" on object store \" + coreSchema.name + \" is not indexed\");\n return index;\n}\n\nexport function openCursor(ctx: CollectionContext, coreTable: DBCoreTable, trans: DBCoreTransaction) {\n const index = getIndexOrStore(ctx, coreTable.schema);\n return coreTable.openCursor({\n trans,\n values: !ctx.keysOnly,\n reverse: ctx.dir === 'prev',\n unique: !!ctx.unique,\n query: {\n index, \n range: ctx.range\n }\n });\n}\n\nexport function iter (\n ctx: CollectionContext, \n fn: (item, cursor: DBCoreCursor, advance: Function)=>void,\n coreTrans: DBCoreTransaction,\n coreTable: DBCoreTable): Promise\n{\n const filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter;\n if (!ctx.or) {\n return iterate(\n openCursor(ctx, coreTable, coreTrans),\n combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper);\n } else {\n const set = {};\n\n const union = (item: any, cursor: DBCoreCursor, advance) => {\n if (!filter || filter(cursor, advance, result=>cursor.stop(result), err => cursor.fail(err))) {\n var primaryKey = cursor.primaryKey;\n var key = '' + primaryKey;\n if (key === '[object ArrayBuffer]') key = '' + new Uint8Array(primaryKey);\n if (!hasOwn(set, key)) {\n set[key] = true;\n fn(item, cursor, advance);\n }\n }\n }\n\n return Promise.all([\n ctx.or._iterate(union, coreTrans),\n iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper)\n ]);\n }\n}\n\nfunction iterate(cursorPromise: Promise, filter, fn, valueMapper): Promise {\n \n // Apply valueMapper (hook('reading') or mappped class)\n var mappedFn = valueMapper ? (x,c,a) => fn(valueMapper(x),c,a) : fn;\n // Wrap fn with PSD and microtick stuff from Promise.\n var wrappedFn = wrap(mappedFn);\n \n return cursorPromise.then(cursor => {\n if (cursor) {\n return cursor.start(()=>{\n var c = ()=>cursor.continue();\n if (!filter || filter(cursor, advancer => c = advancer, val=>{cursor.stop(val);c=nop}, e => {cursor.fail(e);c = nop;}))\n wrappedFn(cursor.value, cursor, advancer => c = advancer);\n c();\n });\n }\n });\n}\n","import { isArray } from \"../functions/utils\";\nimport { PropModSpec } from \"../public/types/prop-modification\";\n\nexport const PropModSymbol: unique symbol = Symbol();\n\n/** Consistent change propagation across offline synced data.\n * \n * This class is executed client- and server side on sync, making\n * an operation consistent across sync for full consistency and accuracy.\n * \n * Example: An object represents a bank account with a balance.\n * One offline user adds $ 1.00 to the balance.\n * Another user (online) adds $ 2.00 to the balance.\n * When first user syncs, the balance becomes the sum of every operation (3.00).\n * \n * -- initial: balance is 0\n * 1. db.bankAccounts.update(1, { balance: new ProdModification({add: 100})}) // user 1 (offline)\n * 2. db.bankAccounts.update(1, { balance: new ProdModification({add: 200})}) // user 2 (online)\n * -- before user 1 syncs, balance is 200 (representing money with integers * 100 to avoid rounding issues)\n * \n * -- balance is 300\n * \n * When new operations are added, they need to be added to:\n * 1. PropModSpec interface\n * 2. Here in PropModification with the logic they represent\n * 3. (Optionally) a sugar function for it, such as const mathAdd = (amount: number | BigInt) => new PropModification({mathAdd: amount})\n */\nexport class PropModification implements PropModSpec {\n [PropModSymbol]?: true;\n replacePrefix?: [string, string];\n add?: number | BigInt | Array;\n remove?: number | BigInt | Array;\n\n execute(value: any): any {\n // add (mathematical or set-wise)\n if (this.add !== undefined) {\n const term = this.add;\n // Set-addition on array representing a set of primitive types (strings, numbers)\n if (isArray(term)) {\n return [...(isArray(value) ? value : []), ...term].sort();\n }\n // Mathematical addition:\n if (typeof term === 'number') return (Number(value) || 0) + term; // if value is not convertible to number, return 0 + term\n if (typeof term === 'bigint') {\n try {\n return BigInt(value) + term;\n } catch {\n return BigInt(0) + term; // Unlike Number(value) that can return NaN, BigInt(value) throws if value is not BigInt, Number or numeric string\n }\n }\n throw new TypeError(`Invalid term ${term}`);\n }\n\n // remove (mathematical or set-wise)\n if (this.remove !== undefined) {\n const subtrahend = this.remove;\n // Set-addition on array representing a set of primitive types (strings, numbers)\n if (isArray(subtrahend)) {\n return isArray(value) ? value.filter(item => !subtrahend.includes(item)).sort() : [];\n } \n // Mathematical addition:\n if (typeof subtrahend === 'number') return Number(value) - subtrahend;\n if (typeof subtrahend === 'bigint') {\n try {\n return BigInt(value) - subtrahend;\n } catch {\n return BigInt(0) - subtrahend; // Unlike Number(value) that can return NaN, BigInt(value) throws if value is not BigInt, Number or numeric string\n }\n }\n throw new TypeError(`Invalid subtrahend ${subtrahend}`);\n }\n\n // Replace a prefix:\n const prefixToReplace = this.replacePrefix?.[0];\n if (prefixToReplace && typeof value === 'string' && value.startsWith(prefixToReplace)) {\n return this.replacePrefix[1] + value.substring(prefixToReplace.length);\n }\n return value;\n }\n\n constructor(spec: PropModSpec) {\n Object.assign(this, spec);\n }\n}\n","import { Collection as ICollection } from \"../../public/types/collection\";\nimport { Dexie } from \"../dexie\";\nimport { Table } from \"../table\";\nimport { IndexableType, IndexableTypeArrayReadonly } from \"../../public/types/indexable-type\";\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { iter, isPlainKeyRange, getIndexOrStore, addReplayFilter, addFilter, addMatchFilter } from \"./collection-helpers\";\nimport { rejection } from \"../../helpers/promise\";\nimport { combine } from \"../../functions/combine\";\nimport { extend, hasOwn, deepClone, keys, setByKeyPath, getByKeyPath } from \"../../functions/utils\";\nimport { ModifyError } from \"../../errors\";\nimport { ThenShortcut } from \"../../public/types/then-shortcut\";\nimport { Transaction } from '../transaction';\nimport { DBCoreCursor, DBCoreTransaction, DBCoreRangeType, DBCoreMutateResponse, DBCoreKeyRange } from '../../public/types/dbcore';\nimport { cmp } from \"../../functions/cmp\";\nimport { PropModification } from \"../../helpers/prop-modification\";\nimport { UpdateSpec } from \"../../public/types/update-spec\";\n\n/** class Collection\n * \n * https://dexie.org/docs/Collection/Collection\n */\nexport class Collection implements ICollection {\n db: Dexie;\n _ctx: {\n table: Table;\n index?: string | null;\n isPrimKey?: boolean;\n range: DBCoreKeyRange;\n keysOnly: boolean;\n dir: \"next\" | \"prev\";\n unique: \"\" | \"unique\";\n algorithm?: Function | null;\n filter?: Function | null;\n replayFilter: Function | null;\n justLimit: boolean; // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: Function | null;\n offset: number,\n limit: number,\n error: any, // If set, any promise must be rejected with this error\n or: Collection,\n valueMapper: (any) => any\n }\n \n _ondirectionchange?: Function;\n\n _read(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike, cb?): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readonly', fn).then(cb);\n }\n\n _write(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readwrite', fn, \"locked\"); // When doing write operations on collections, always lock the operation so that upcoming operations gets queued.\n }\n\n _addAlgorithm(fn) {\n var ctx = this._ctx;\n ctx.algorithm = combine(ctx.algorithm, fn);\n }\n\n _iterate(\n fn: (item, cursor: DBCoreCursor, advance: Function) => void,\n coreTrans: DBCoreTransaction) : Promise\n {\n return iter(this._ctx, fn, coreTrans, this._ctx.table.core);\n }\n\n /** Collection.clone()\n * \n * https://dexie.org/docs/Collection/Collection.clone()\n * \n **/\n clone(props?): this {\n var rv = Object.create(this.constructor.prototype),\n ctx = Object.create(this._ctx);\n if (props) extend(ctx, props);\n rv._ctx = ctx;\n return rv;\n }\n\n /** Collection.raw()\n * \n * https://dexie.org/docs/Collection/Collection.raw()\n * \n **/\n raw(): this {\n this._ctx.valueMapper = null;\n return this;\n }\n\n /** Collection.each()\n * \n * https://dexie.org/docs/Collection/Collection.each()\n * \n **/\n each(fn: (obj, cursor: DBCoreCursor) => any): PromiseExtended {\n var ctx = this._ctx;\n\n return this._read(trans => iter(ctx, fn, trans, ctx.table.core));\n }\n\n /** Collection.count()\n * \n * https://dexie.org/docs/Collection/Collection.count()\n * \n **/\n count(cb?) {\n return this._read(trans => {\n const ctx = this._ctx;\n const coreTable = ctx.table.core;\n if (isPlainKeyRange(ctx, true)) {\n // This is a plain key range. We can use the count() method if the index.\n return coreTable.count({\n trans,\n query: {\n index: getIndexOrStore(ctx, coreTable.schema),\n range: ctx.range\n }\n }).then(count => Math.min(count, ctx.limit));\n } else {\n // Algorithms, filters or expressions are applied. Need to count manually.\n var count = 0;\n return iter(ctx, () => { ++count; return false; }, trans, coreTable)\n .then(()=>count);\n }\n }).then(cb);\n }\n\n /** Collection.sortBy()\n * \n * https://dexie.org/docs/Collection/Collection.sortBy()\n * \n **/\n sortBy(keyPath: string): PromiseExtended;\n sortBy(keyPath: string, thenShortcut: ThenShortcut) : PromiseExtended;\n sortBy(keyPath: string, cb?: ThenShortcut) {\n const parts = keyPath.split('.').reverse(),\n lastPart = parts[0],\n lastIndex = parts.length - 1;\n function getval(obj, i) {\n if (i) return getval(obj[parts[i]], i - 1);\n return obj[lastPart];\n }\n var order = this._ctx.dir === \"next\" ? 1 : -1;\n\n function sorter(a, b) {\n var aVal = getval(a, lastIndex),\n bVal = getval(b, lastIndex);\n return aVal < bVal ? -order : aVal > bVal ? order : 0;\n }\n return this.toArray(function (a) {\n return a.sort(sorter);\n }).then(cb);\n }\n\n /** Collection.toArray()\n * \n * https://dexie.org/docs/Collection/Collection.toArray()\n * \n **/\n toArray(cb?): PromiseExtended {\n return this._read(trans => {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAll() or\n // IDBKeyRange.getAll():\n const {valueMapper} = ctx;\n const index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n limit: ctx.limit,\n values: true,\n query: {\n index,\n range: ctx.range\n }\n }).then(({result}) => valueMapper ? result.map(valueMapper) : result);\n } else {\n // Getting array through a cursor.\n const a = [];\n return iter(ctx, item => a.push(item), trans, ctx.table.core).then(()=>a);\n }\n }, cb);\n }\n\n /** Collection.offset()\n * \n * https://dexie.org/docs/Collection/Collection.offset()\n * \n **/\n offset(offset: number) : Collection{\n var ctx = this._ctx;\n if (offset <= 0) return this;\n ctx.offset += offset; // For count()\n if (isPlainKeyRange(ctx)) {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return (cursor, advance) => {\n if (offsetLeft === 0) return true;\n if (offsetLeft === 1) { --offsetLeft; return false; }\n advance(() => {\n cursor.advance(offsetLeft);\n offsetLeft = 0;\n });\n return false;\n };\n });\n } else {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return () => (--offsetLeft < 0);\n });\n }\n return this;\n }\n\n /** Collection.limit()\n * \n * https://dexie.org/docs/Collection/Collection.limit()\n * \n **/\n limit(numRows: number) : Collection {\n this._ctx.limit = Math.min(this._ctx.limit, numRows); // For count()\n addReplayFilter(this._ctx, () => {\n var rowsLeft = numRows;\n return function (cursor, advance, resolve) {\n if (--rowsLeft <= 0) advance(resolve); // Stop after this item has been included\n return rowsLeft >= 0; // If numRows is already below 0, return false because then 0 was passed to numRows initially. Otherwise we wouldnt come here.\n };\n }, true);\n return this;\n }\n\n /** Collection.until()\n * \n * https://dexie.org/docs/Collection/Collection.until()\n * \n **/\n until(filterFunction: (x) => boolean, bIncludeStopEntry?) {\n addFilter(this._ctx, function (cursor, advance, resolve) {\n if (filterFunction(cursor.value)) {\n advance(resolve);\n return bIncludeStopEntry;\n } else {\n return true;\n }\n });\n return this;\n }\n\n /** Collection.first()\n * \n * https://dexie.org/docs/Collection/Collection.first()\n * \n **/\n first(cb?) {\n return this.limit(1).toArray(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.last()\n * \n * https://dexie.org/docs/Collection/Collection.last()\n * \n **/\n last(cb?) {\n return this.reverse().first(cb);\n }\n\n /** Collection.filter()\n * \n * https://dexie.org/docs/Collection/Collection.filter()\n * \n **/\n filter(filterFunction: (x) => boolean): Collection {\n /// function(val){return true/false}\n addFilter(this._ctx, function (cursor) {\n return filterFunction(cursor.value);\n });\n // match filters not used in Dexie.js but can be used by 3rd part libraries to test a\n // collection for a match without querying DB. Used by Dexie.Observable.\n addMatchFilter(this._ctx, filterFunction);\n return this;\n }\n\n /** Collection.and()\n * \n * https://dexie.org/docs/Collection/Collection.and()\n * \n **/\n and(filter: (x) => boolean) {\n return this.filter(filter);\n }\n\n /** Collection.or()\n * \n * https://dexie.org/docs/Collection/Collection.or()\n * \n **/\n or(indexName: string) {\n return new this.db.WhereClause(this._ctx.table, indexName, this);\n }\n\n /** Collection.reverse()\n * \n * https://dexie.org/docs/Collection/Collection.reverse()\n * \n **/\n reverse() {\n this._ctx.dir = (this._ctx.dir === \"prev\" ? \"next\" : \"prev\");\n if (this._ondirectionchange) this._ondirectionchange(this._ctx.dir);\n return this;\n }\n\n /** Collection.desc()\n * \n * https://dexie.org/docs/Collection/Collection.desc()\n * \n **/\n desc() {\n return this.reverse();\n }\n\n /** Collection.eachKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachKey()\n * \n **/\n eachKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.key, cursor); });\n }\n\n /** Collection.eachUniqueKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachUniqueKey()\n * \n **/\n eachUniqueKey(cb?) {\n this._ctx.unique = \"unique\";\n return this.eachKey(cb);\n }\n\n /** Collection.eachPrimaryKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachPrimaryKey()\n * \n **/\n eachPrimaryKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); });\n }\n\n /** Collection.keys()\n * \n * https://dexie.org/docs/Collection/Collection.keys()\n * \n **/\n keys(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.key);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.primaryKeys()\n * \n * https://dexie.org/docs/Collection/Collection.primaryKeys()\n * \n **/\n primaryKeys(cb?) : PromiseExtended {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAllKeys() or\n // IDBKeyRange.getAllKeys():\n return this._read(trans => {\n var index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n values: false,\n limit: ctx.limit,\n query: {\n index,\n range: ctx.range\n }});\n }).then(({result})=>result).then(cb);\n }\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.primaryKey);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.uniqueKeys()\n * \n * https://dexie.org/docs/Collection/Collection.uniqueKeys()\n * \n **/\n uniqueKeys(cb?) {\n this._ctx.unique = \"unique\";\n return this.keys(cb);\n }\n\n /** Collection.firstKey()\n * \n * https://dexie.org/docs/Collection/Collection.firstKey()\n * \n **/\n firstKey(cb?) {\n return this.limit(1).keys(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.lastKey()\n * \n * https://dexie.org/docs/Collection/Collection.lastKey()\n * \n **/\n lastKey(cb?) {\n return this.reverse().firstKey(cb);\n }\n\n /** Collection.distinct()\n * \n * https://dexie.org/docs/Collection/Collection.distinct()\n * \n **/\n distinct() {\n var ctx = this._ctx,\n idx = ctx.index && ctx.table.schema.idxByName[ctx.index];\n if (!idx || !idx.multi) return this; // distinct() only makes differencies on multiEntry indexes.\n var set = {};\n addFilter(this._ctx, function (cursor: DBCoreCursor) {\n var strKey = cursor.primaryKey.toString(); // Converts any Date to String, String to String, Number to String and Array to comma-separated string\n var found = hasOwn(set, strKey);\n set[strKey] = true;\n return !found;\n });\n return this;\n }\n\n //\n // Methods that mutate storage\n //\n\n /** Collection.modify()\n * \n * https://dexie.org/docs/Collection/Collection.modify()\n * \n **/\n modify(changes: UpdateSpec | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n var ctx = this._ctx;\n return this._write(trans => {\n var modifyer: (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean\n if (typeof changes === 'function') {\n // Changes is a function that may update, add or delete propterties or even require a deletion the object itself (delete this.item)\n modifyer = changes as (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean;\n } else {\n // changes is a set of {keyPath: value} and no one is listening to the updating hook.\n var keyPaths = keys(changes);\n var numKeys = keyPaths.length;\n modifyer = function (item) {\n let anythingModified = false;\n for (let i = 0; i < numKeys; ++i) {\n let keyPath = keyPaths[i];\n let val = changes[keyPath];\n let origVal = getByKeyPath(item, keyPath);\n\n if (val instanceof PropModification) {\n setByKeyPath(item, keyPath, val.execute(origVal));\n anythingModified = true;\n } else if (origVal !== val) {\n setByKeyPath(item, keyPath, val); // Adding {keyPath: undefined} means that the keyPath should be deleted. Handled by setByKeyPath\n anythingModified = true;\n }\n }\n return anythingModified;\n };\n }\n\n const coreTable = ctx.table.core;\n const {outbound, extractKey} = coreTable.schema.primaryKey;\n const limit = this.db._options.modifyChunkSize || 200;\n const totalFailures = [];\n let successCount = 0;\n const failedKeys: IndexableType[] = [];\n const applyMutateResult = (expectedCount: number, res: DBCoreMutateResponse) => {\n const {failures, numFailures} = res;\n successCount += expectedCount - numFailures;\n for (let pos of keys(failures)) {\n totalFailures.push(failures[pos]);\n }\n }\n return this.clone().primaryKeys().then(keys => {\n const criteria = isPlainKeyRange(ctx) &&\n ctx.limit === Infinity &&\n (typeof changes !== 'function' || changes === deleteCallback) && {\n index: ctx.index,\n range: ctx.range\n };\n\n const nextChunk = (offset: number) => {\n const count = Math.min(limit, keys.length - offset);\n return coreTable.getMany({\n trans,\n keys: keys.slice(offset, offset + count),\n cache: \"immutable\" // Optimize for 2 things:\n // 1) observability-middleware can track changes better.\n // 2) hooks middleware don't have to query the existing values again when tracking changes.\n // We can use \"immutable\" because we promise to not touch the values we retrieve here!\n }).then(values => {\n const addValues = [];\n const putValues = [];\n const putKeys = outbound ? [] : null;\n const deleteKeys = [];\n for (let i=0; i 0 &&\n coreTable.mutate({trans, type: 'add', values: addValues})\n .then(res => {\n for (let pos in res.failures) {\n // Remove from deleteKeys the key of the object that failed to change its primary key\n deleteKeys.splice(parseInt(pos), 1);\n }\n applyMutateResult(addValues.length, res);\n })\n ).then(()=>(putValues.length > 0 || (criteria && typeof changes === 'object')) &&\n coreTable.mutate({\n trans,\n type: 'put',\n keys: putKeys,\n values: putValues,\n criteria,\n changeSpec: typeof changes !== 'function'\n && changes,\n isAdditionalChunk: offset > 0\n }).then(res=>applyMutateResult(putValues.length, res))\n ).then(()=>(deleteKeys.length > 0 || (criteria && changes === deleteCallback)) &&\n coreTable.mutate({\n trans,\n type: 'delete',\n keys: deleteKeys,\n criteria,\n isAdditionalChunk: offset > 0\n }).then(res=>applyMutateResult(deleteKeys.length, res))\n ).then(()=>{\n return keys.length > offset + count && nextChunk(offset + limit);\n });\n });\n }\n\n return nextChunk(0).then(()=>{\n if (totalFailures.length > 0)\n throw new ModifyError(\"Error modifying one or more objects\", totalFailures, successCount, failedKeys as IndexableTypeArrayReadonly);\n\n return keys.length;\n });\n });\n\n });\n }\n\n /** Collection.delete()\n * \n * https://dexie.org/docs/Collection/Collection.delete()\n * \n **/\n delete() : PromiseExtended {\n var ctx = this._ctx,\n range = ctx.range;\n //deletingHook = ctx.table.hook.deleting.fire,\n //hasDeleteHook = deletingHook !== nop;\n if (isPlainKeyRange(ctx) &&\n (ctx.isPrimKey || range.type === DBCoreRangeType.Any)) // if no range, we'll use clear().\n {\n // May use IDBObjectStore.delete(IDBKeyRange) in this case (Issue #208)\n // For chromium, this is the way most optimized version.\n // For IE/Edge, this could hang the indexedDB engine and make operating system instable\n // (https://gist.github.com/dfahlander/5a39328f029de18222cf2125d56c38f7)\n return this._write(trans => {\n // Our API contract is to return a count of deleted items, so we have to count() before delete().\n const {primaryKey} = ctx.table.core.schema;\n const coreRange = range;\n return ctx.table.core.count({trans, query: {index: primaryKey, range: coreRange}}).then(count => {\n return ctx.table.core.mutate({trans, type: 'deleteRange', range: coreRange})\n .then(({failures, lastResult, results, numFailures}) => {\n if (numFailures) throw new ModifyError(\"Could not delete some values\",\n Object.keys(failures).map(pos => failures[pos]),\n count - numFailures);\n return count - numFailures;\n });\n });\n });\n }\n\n return this.modify(deleteCallback);\n }\n}\n\nconst deleteCallback = (value, ctx) => ctx.value = null;\n","import { Dexie } from '../../classes/dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Collection } from './collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\nimport { mirror } from '../../functions/chaining-functions';\n\n/** Constructs a Collection instance. */\nexport interface CollectionConstructor {\n new(whereClause?: WhereClause | null, keyRangeGenerator?: () => DBCoreKeyRange): Collection;\n prototype: Collection;\n}\n\n/** Generates a Collection constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createCollectionConstructor(db: Dexie) {\n return makeClassConstructor(\n Collection.prototype,\n\n function Collection(\n this: Collection,\n whereClause?: WhereClause | null,\n keyRangeGenerator?: () => DBCoreKeyRange)\n {\n this.db = db;\n let keyRange = AnyRange, error = null;\n if (keyRangeGenerator) try {\n keyRange = keyRangeGenerator();\n } catch (ex) {\n error = ex;\n }\n\n const whereCtx = whereClause._ctx;\n const table = whereCtx.table;\n const readingHook = table.hook.reading.fire;\n this._ctx = {\n table: table,\n index: whereCtx.index,\n isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)),\n range: keyRange,\n keysOnly: false,\n dir: \"next\",\n unique: \"\",\n algorithm: null,\n filter: null,\n replayFilter: null,\n justLimit: true, // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: null,\n offset: 0,\n limit: Infinity,\n error: error, // If set, any promise must be rejected with this error\n or: whereCtx.or,\n valueMapper: readingHook !== mirror ? readingHook : null\n };\n }\n );\n}\n","import { IndexableType } from '../public/types/indexable-type';\n\nexport function simpleCompare(a, b) {\n return a < b ? -1 : a === b ? 0 : 1;\n}\n\nexport function simpleCompareReverse(a, b) {\n return a > b ? -1 : a === b ? 0 : 1;\n}\n","import { WhereClause } from './where-clause';\nimport { Collection } from '../collection';\nimport { STRING_EXPECTED } from '../../globals/constants';\nimport { simpleCompare, simpleCompareReverse } from '../../functions/compare-functions';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange, DBCoreRangeType } from '../../public/types/dbcore';\n\nexport function fail(collectionOrWhereClause: Collection | WhereClause, err, T?) {\n var collection = collectionOrWhereClause instanceof WhereClause ?\n new collectionOrWhereClause.Collection (collectionOrWhereClause) :\n collectionOrWhereClause;\n \n collection._ctx.error = T ? new T(err) : new TypeError(err);\n return collection;\n}\n\nexport function emptyCollection(whereClause: WhereClause) {\n return new whereClause.Collection (whereClause, () => rangeEqual(\"\")).limit(0);\n}\n\nexport function upperFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toUpperCase() :\n (s: string) => s.toLowerCase();\n}\n\nexport function lowerFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toLowerCase() :\n (s: string) => s.toUpperCase();\n}\n\nexport function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) {\n var length = Math.min(key.length, lowerNeedle.length);\n var llp = -1;\n for (var i = 0; i < length; ++i) {\n var lwrKeyChar = lowerKey[i];\n if (lwrKeyChar !== lowerNeedle[i]) {\n if (cmp(key[i], upperNeedle[i]) < 0) return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1);\n if (cmp(key[i], lowerNeedle[i]) < 0) return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1);\n if (llp >= 0) return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1);\n return null;\n }\n if (cmp(key[i], lwrKeyChar) < 0) llp = i;\n }\n if (length < lowerNeedle.length && dir === \"next\") return key + upperNeedle.substr(key.length);\n if (length < key.length && dir === \"prev\") return key.substr(0, upperNeedle.length);\n return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1));\n}\n\nexport function addIgnoreCaseAlgorithm(whereClause: WhereClause, match, needles, suffix) {\n /// \n var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix,\n needlesLen = needles.length;\n if (!needles.every(s => typeof s === 'string')) {\n return fail(whereClause, STRING_EXPECTED);\n }\n function initDirection(dir) {\n upper = upperFactory(dir);\n lower = lowerFactory(dir);\n compare = (dir === \"next\" ? simpleCompare : simpleCompareReverse);\n var needleBounds = needles.map(function (needle){\n return {lower: lower(needle), upper: upper(needle)};\n }).sort(function(a,b) {\n return compare(a.lower, b.lower);\n });\n upperNeedles = needleBounds.map(function (nb){ return nb.upper; });\n lowerNeedles = needleBounds.map(function (nb){ return nb.lower; });\n direction = dir;\n nextKeySuffix = (dir === \"next\" ? \"\" : suffix);\n }\n initDirection(\"next\");\n\n var c = new whereClause.Collection (\n whereClause,\n ()=>createRange(upperNeedles[0], lowerNeedles[needlesLen-1] + suffix)\n );\n\n c._ondirectionchange = function (direction) {\n // This event onlys occur before filter is called the first time.\n initDirection(direction);\n };\n\n var firstPossibleNeedle = 0;\n\n c._addAlgorithm(function (cursor, advance, resolve) {\n /// \n /// \n /// \n var key = cursor.key;\n if (typeof key !== 'string') return false;\n var lowerKey = lower(key);\n if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) {\n return true;\n } else {\n var lowestPossibleCasing = null;\n for (var i=firstPossibleNeedle; i 0) {\n lowestPossibleCasing = casing;\n }\n }\n if (lowestPossibleCasing !== null) {\n advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); });\n } else {\n advance(resolve);\n }\n return false;\n }\n });\n return c;\n}\n\nexport function createRange (lower: IndexableType, upper: IndexableType, lowerOpen?: boolean, upperOpen?: boolean): DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Range,\n lower,\n upper,\n lowerOpen,\n upperOpen\n };\n}\n\nexport function rangeEqual (value: IndexableType) : DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Equal,\n lower: value,\n upper: value\n };\n}\n","import { WhereClause as IWhereClause } from \"../../public/types/where-clause\";\nimport { Collection } from \"../collection\";\nimport { Table } from \"../table\";\nimport { IndexableType } from \"../../public/types/indexable-type\";\nimport { emptyCollection, fail, addIgnoreCaseAlgorithm, createRange, rangeEqual } from './where-clause-helpers';\nimport { INVALID_KEY_ARGUMENT, STRING_EXPECTED, maxString, minKey } from '../../globals/constants';\nimport { getArrayOf, NO_CHAR_ARRAY } from '../../functions/utils';\nimport { exceptions } from '../../errors';\nimport { Dexie } from '../dexie';\nimport { Collection as ICollection} from \"../../public/types/collection\";\n\n/** class WhereClause\n * \n * https://dexie.org/docs/WhereClause/WhereClause\n */\nexport class WhereClause implements IWhereClause {\n db: Dexie;\n _IDBKeyRange: typeof IDBKeyRange;\n _ctx: {\n table: Table;\n index: string;\n or: Collection;\n }\n _cmp: (a: IndexableType, b: IndexableType) => number;\n _ascending: (a: IndexableType, b: IndexableType) => number;\n _descending: (a: IndexableType, b: IndexableType) => number;\n _min: (a: IndexableType, b: IndexableType) => IndexableType;\n _max: (a: IndexableType, b: IndexableType) => IndexableType;\n\n get Collection() {\n return this._ctx.table.db.Collection;\n }\n\n /** WhereClause.between()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.between()\n * \n **/\n between(lower: IndexableType, upper: IndexableType, includeLower?: boolean, includeUpper?: boolean) {\n includeLower = includeLower !== false; // Default to true\n includeUpper = includeUpper === true; // Default to false\n try {\n if ((this._cmp(lower, upper) > 0) ||\n (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper)))\n return emptyCollection(this); // Workaround for idiotic W3C Specification that DataError must be thrown if lower > upper. The natural result would be to return an empty collection.\n return new this.Collection(this, ()=>createRange(lower, upper, !includeLower, !includeUpper));\n } catch (e) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n }\n\n /** WhereClause.equals()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equals()\n * \n **/\n equals(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => rangeEqual(value)) as ICollection;\n }\n\n /** WhereClause.above()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.above()\n * \n **/\n above(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, true));\n }\n\n /** WhereClause.aboveOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.aboveOrEqual()\n * \n **/\n aboveOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, false));\n }\n\n /** WhereClause.below()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.below()\n * \n **/\n below(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value, false, true));\n }\n\n /** WhereClause.belowOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.belowOrEqual()\n * \n **/\n belowOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value));\n }\n\n /** WhereClause.startsWith()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWith()\n * \n **/\n startsWith(str: string) {\n if (typeof str !== 'string') return fail(this, STRING_EXPECTED);\n return this.between(str, str + maxString, true, true);\n }\n\n /** WhereClause.startsWithIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithIgnoreCase()\n * \n **/\n startsWithIgnoreCase(str: string) {\n if (str === \"\") return this.startsWith(str);\n return addIgnoreCaseAlgorithm(this, (x, a) => x.indexOf(a[0]) === 0, [str], maxString);\n }\n\n /** WhereClause.equalsIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equalsIgnoreCase()\n * \n **/\n equalsIgnoreCase(str: string) {\n return addIgnoreCaseAlgorithm(this, (x, a) => x === a[0], [str], \"\");\n }\n\n /** WhereClause.anyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOfIgnoreCase()\n * \n **/\n anyOfIgnoreCase(...values: string[]): Collection;\n anyOfIgnoreCase(values: string[]): Collection;\n anyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.indexOf(x) !== -1, set, \"\");\n }\n\n /** WhereClause.startsWithAnyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOfIgnoreCase()\n * \n **/\n startsWithAnyOfIgnoreCase(...values: string[]): Collection;\n startsWithAnyOfIgnoreCase(values: string[]): Collection;\n startsWithAnyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.some(n => x.indexOf(n) === 0), set, maxString);\n }\n\n /** WhereClause.anyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOf()\n * \n **/\n anyOf(...values: string[]): Collection;\n anyOf(values: string[]): Collection;\n anyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n let compare = this._cmp;\n try { set.sort(compare); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n if (set.length === 0) return emptyCollection(this);\n const c = new this.Collection(this, () => createRange(set[0], set[set.length - 1]));\n\n c._ondirectionchange = direction => {\n compare = (direction === \"next\" ?\n this._ascending :\n this._descending);\n set.sort(compare);\n };\n\n let i = 0;\n c._addAlgorithm((cursor, advance, resolve) => {\n const key = cursor.key;\n while (compare(key, set[i]) > 0) {\n // The cursor has passed beyond this key. Check next.\n ++i;\n if (i === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (compare(key, set[i]) === 0) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => { cursor.continue(set[i]); });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.notEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.notEqual()\n * \n **/\n notEqual(value: IndexableType) {\n return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.noneOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.noneOf()\n * \n **/\n noneOf(...values: string[]): Collection;\n noneOf(values: string[]): Collection;\n noneOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return new this.Collection(this); // Return entire collection.\n try { set.sort(this._ascending); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n // Transform [\"a\",\"b\",\"c\"] to a set of ranges for between/above/below: [[minKey,\"a\"], [\"a\",\"b\"], [\"b\",\"c\"], [\"c\",maxKey]]\n const ranges = set.reduce(\n (res, val) => res ?\n res.concat([[res[res.length - 1][1], val]]) :\n [[minKey, val]],\n null);\n ranges.push([set[set.length - 1], this.db._maxKey]);\n return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.inAnyRange()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.inAnyRange()\n * \n **/\n inAnyRange(\n ranges: ReadonlyArray<{ 0: IndexableType, 1: IndexableType }>,\n options?: { includeLowers?: boolean, includeUppers?: boolean })\n {\n const cmp = this._cmp,\n ascending = this._ascending,\n descending = this._descending,\n min = this._min,\n max = this._max;\n\n if (ranges.length === 0) return emptyCollection(this);\n if (!ranges.every(range =>\n range[0] !== undefined &&\n range[1] !== undefined &&\n ascending(range[0], range[1]) <= 0)) {\n return fail(\n this,\n \"First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower\",\n exceptions.InvalidArgument);\n }\n const includeLowers = !options || options.includeLowers !== false; // Default to true\n const includeUppers = options && options.includeUppers === true; // Default to false\n\n function addRange(ranges, newRange) {\n let i = 0, l = ranges.length;\n for (; i < l; ++i) {\n const range = ranges[i];\n if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) {\n range[0] = min(range[0], newRange[0]);\n range[1] = max(range[1], newRange[1]);\n break;\n }\n }\n if (i === l)\n ranges.push(newRange);\n return ranges;\n }\n\n let sortDirection = ascending;\n function rangeSorter(a, b) { return sortDirection(a[0], b[0]); }\n\n // Join overlapping ranges\n let set;\n try {\n set = ranges.reduce(addRange, []);\n set.sort(rangeSorter);\n } catch (ex) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n\n let rangePos = 0;\n const keyIsBeyondCurrentEntry = includeUppers ?\n key => ascending(key, set[rangePos][1]) > 0 :\n key => ascending(key, set[rangePos][1]) >= 0;\n\n const keyIsBeforeCurrentEntry = includeLowers ?\n key => descending(key, set[rangePos][0]) > 0 :\n key => descending(key, set[rangePos][0]) >= 0;\n\n function keyWithinCurrentRange(key) {\n return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key);\n }\n\n let checkKey = keyIsBeyondCurrentEntry;\n\n const c = new this.Collection(\n this,\n () => createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers));\n\n c._ondirectionchange = direction => {\n if (direction === \"next\") {\n checkKey = keyIsBeyondCurrentEntry;\n sortDirection = ascending;\n } else {\n checkKey = keyIsBeforeCurrentEntry;\n sortDirection = descending;\n }\n set.sort(rangeSorter);\n };\n\n c._addAlgorithm((cursor, advance, resolve) => {\n var key = cursor.key;\n while (checkKey(key)) {\n // The cursor has passed beyond this key. Check next.\n ++rangePos;\n if (rangePos === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (keyWithinCurrentRange(key)) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else if (this._cmp(key, set[rangePos][1]) === 0 || this._cmp(key, set[rangePos][0]) === 0) {\n // includeUpper or includeLower is false so keyWithinCurrentRange() returns false even though we are at range border.\n // Continue to next key but don't include this one.\n return false;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => {\n if (sortDirection === ascending) cursor.continue(set[rangePos][0]);\n else cursor.continue(set[rangePos][1]);\n });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.startsWithAnyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOf()\n * \n **/\n startsWithAnyOf(...prefixes: string[]): Collection;\n startsWithAnyOf(prefixes: string[]): Collection;\n startsWithAnyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n\n if (!set.every(s => typeof s === 'string')) {\n return fail(this, \"startsWithAnyOf() only works with strings\");\n }\n if (set.length === 0) return emptyCollection(this);\n\n return this.inAnyRange(set.map((str: string) => [str, str + maxString]));\n }\n\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { WhereClause } from './where-clause';\nimport { Table } from '../table';\nimport { Collection } from '../collection';\nimport { exceptions } from '../../errors';\nimport { cmp } from '../../functions/cmp';\n\nexport interface WhereClauseConstructor {\n new(table: Table, index?: string, orCollection?: Collection): WhereClause;\n prototype: WhereClause;\n}\n\n/** Generates a WhereClause constructor.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createWhereClauseConstructor(db: Dexie) {\n return makeClassConstructor(\n WhereClause.prototype,\n\n function WhereClause(this: WhereClause, table: Table, index?: string, orCollection?: Collection) {\n this.db = db;\n this._ctx = {\n table: table,\n index: index === \":id\" ? null : index,\n or: orCollection\n };\n this._cmp = this._ascending = cmp;\n this._descending = (a, b) => cmp(b, a);\n this._max = (a, b) => cmp(a,b) > 0 ? a : b;\n this._min = (a, b) => cmp(a,b) < 0 ? a : b;\n this._IDBKeyRange = db._deps.IDBKeyRange;\n if (!this._IDBKeyRange) throw new exceptions.MissingAPI();\n }\n );\n}\n","import { wrap } from \"../helpers/promise\";\n\nexport function eventRejectHandler(reject) {\n return wrap(function (event) {\n preventDefault(event);\n reject (event.target.error);\n return false;\n });\n}\n\nexport function eventSuccessHandler (resolve) {\n return wrap(function (event){\n resolve(event.target.result);\n });\n}\n\nexport function hookedEventRejectHandler (reject) {\n return wrap(function (event) {\n // See comment on hookedEventSuccessHandler() why wrap() is needed only when supporting hooks.\n \n var req = event.target,\n err = req.error,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n hookErrorHandler = ctx && ctx.onerror;\n hookErrorHandler && hookErrorHandler(err);\n preventDefault(event);\n reject (err);\n return false;\n });\n}\n\nexport function hookedEventSuccessHandler(resolve) {\n // wrap() is needed when calling hooks because the rare scenario of:\n // * hook does a db operation that fails immediately (IDB throws exception)\n // For calling db operations on correct transaction, wrap makes sure to set PSD correctly.\n // wrap() will also execute in a virtual tick.\n // * If not wrapped in a virtual tick, direct exception will launch a new physical tick.\n // * If this was the last event in the bulk, the promise will resolve after a physical tick\n // and the transaction will have committed already.\n // If no hook, the virtual tick will be executed in the reject()/resolve of the final promise,\n // because it is always marked with _lib = true when created using Transaction._promise().\n return wrap(function(event) {\n var req = event.target,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n result = ctx.value || req.result, // Pass the object value on updates. The result from IDB is the primary key.\n hookSuccessHandler = ctx && ctx.onsuccess;\n hookSuccessHandler && hookSuccessHandler(result);\n resolve && resolve(result);\n }, resolve);\n}\n\n\nexport function preventDefault(event) {\n if (event.stopPropagation) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.stopPropagation();\n if (event.preventDefault) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.preventDefault();\n}\n\nexport function BulkErrorHandlerCatchAll(errorList, done?, supportHooks?) {\n return (supportHooks ? hookedEventRejectHandler : eventRejectHandler)(e => {\n errorList.push(e);\n done && done();\n });\n}\n\n","import Events from '../helpers/Events';\nimport { GlobalDexieEvents } from '../public/types/db-events';\n\nexport const DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated' as 'storagemutated';\n\n// Name of the global event fired using DOM dispatchEvent (if not in node).\n// Reason for propagating this as a DOM event is for getting reactivity across\n// multiple versions of Dexie within the same app (as long as they are\n// compatible with regards to the event data).\n// If the ObservabilitySet protocol change in a way that would not be backward\n// compatible, make sure also update the event name to a new number at the end\n// so that two Dexie instances of different versions continue to work together\n// - maybe not able to communicate but won't fail due to unexpected data in\n// the detail property of the CustomEvent. If so, also make sure to udpate\n// docs and explain at which Dexie version the new name and format of the event\n// is being used.\nexport const STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1';\n\nexport const globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME) as GlobalDexieEvents;\n","import { Transaction as ITransaction } from '../../public/types/transaction';\nimport { DexiePromise, wrap, rejection } from \"../../helpers/promise\";\nimport { DbSchema } from '../../public/types/db-schema';\nimport { assert, hasOwn } from '../../functions/utils';\nimport { PSD, usePSD } from '../../helpers/promise';\nimport { Dexie } from '../dexie';\nimport { exceptions } from '../../errors';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { preventDefault } from '../../functions/event-wrappers';\nimport { newScope } from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { Table } from '../table';\nimport { globalEvents } from '../../globals/global-events';\n\n/** Transaction\n * \n * https://dexie.org/docs/Transaction/Transaction\n * \n **/\nexport class Transaction implements ITransaction {\n db: Dexie;\n active: boolean;\n mode: IDBTransactionMode;\n chromeTransactionDurability: ChromeTransactionDurability;\n idbtrans: IDBTransaction;\n storeNames: string[];\n explicit?: boolean;\n on: any;\n parent?: Transaction;\n schema: DbSchema;\n _memoizedTables: {[tableName: string]: Table};\n\n _reculock: number;\n _blockedFuncs: { 0: () => any, 1: any }[];\n _resolve: () => void;\n _reject: (Error) => void;\n _waitingFor: DexiePromise; // for waitFor()\n _waitingQueue: Function[]; // for waitFor()\n _spinCount: number; // Just for debugging waitFor()\n _completion: DexiePromise;\n\n //\n // Transaction internal methods (not required by API users, but needed internally and eventually by dexie extensions)\n //\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _lock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n // Temporary set all requests into a pending queue if they are called before database is ready.\n ++this._reculock; // Recursive read/write lock pattern using PSD (Promise Specific Data) instead of TLS (Thread Local Storage)\n if (this._reculock === 1 && !PSD.global) PSD.lockOwnerFor = this;\n return this;\n }\n\n /** Transaction._unlock()\n * \n * Internal method.\n */\n _unlock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n if (--this._reculock === 0) {\n if (!PSD.global) PSD.lockOwnerFor = null;\n while (this._blockedFuncs.length > 0 && !this._locked()) {\n var fnAndPSD = this._blockedFuncs.shift();\n try { usePSD(fnAndPSD[1], fnAndPSD[0]); } catch (e) { }\n }\n }\n return this;\n }\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _locked() {\n // Checks if any write-lock is applied on this transaction.\n // To simplify the Dexie API for extension implementations, we support recursive locks.\n // This is accomplished by using \"Promise Specific Data\" (PSD).\n // PSD data is bound to a Promise and any child Promise emitted through then() or resolve( new Promise() ).\n // PSD is local to code executing on top of the call stacks of any of any code executed by Promise():\n // * callback given to the Promise() constructor (function (resolve, reject){...})\n // * callbacks given to then()/catch()/finally() methods (function (value){...})\n // If creating a new independant Promise instance from within a Promise call stack, the new Promise will derive the PSD from the call stack of the parent Promise.\n // Derivation is done so that the inner PSD __proto__ points to the outer PSD.\n // PSD.lockOwnerFor will point to current transaction object if the currently executing PSD scope owns the lock.\n return this._reculock && PSD.lockOwnerFor !== this;\n }\n\n /** Transaction.create()\n * \n * Internal method.\n * \n */\n create(idbtrans?: IDBTransaction & {[prop: string]: any}) {\n if (!this.mode) return this;\n const idbdb = this.db.idbdb;\n const dbOpenError = this.db._state.dbOpenError;\n assert(!this.idbtrans);\n if (!idbtrans && !idbdb) {\n switch (dbOpenError && dbOpenError.name) {\n case \"DatabaseClosedError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.DatabaseClosed(dbOpenError);\n case \"MissingAPIError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError);\n default:\n // Make it clear that the user operation was not what caused the error - the error had occurred earlier on db.open()!\n throw new exceptions.OpenFailed(dbOpenError);\n }\n }\n if (!this.active) throw new exceptions.TransactionInactive();\n assert(this._completion._state === null); // Completion Promise must still be pending.\n\n idbtrans = this.idbtrans = idbtrans ||\n (this.db.core \n ? this.db.core.transaction(this.storeNames, this.mode as 'readwrite' | 'readonly', { durability: this.chromeTransactionDurability })\n : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })\n ) as IDBTransaction;\n\n idbtrans.onerror = wrap(ev => {\n preventDefault(ev);// Prohibit default bubbling to window.error\n this._reject(idbtrans.error);\n });\n idbtrans.onabort = wrap(ev => {\n preventDefault(ev);\n this.active && this._reject(new exceptions.Abort(idbtrans.error));\n this.active = false;\n this.on(\"abort\").fire(ev);\n });\n idbtrans.oncomplete = wrap(() => {\n this.active = false;\n this._resolve();\n if ('mutatedParts' in idbtrans) {\n globalEvents.storagemutated.fire(idbtrans[\"mutatedParts\"]);\n }\n });\n return this;\n }\n\n /** Transaction._promise()\n * \n * Internal method.\n */\n _promise(\n mode: IDBTransactionMode,\n fn: (resolve, reject, trans: Transaction) => PromiseLike | void,\n bWriteLock?: string | boolean): DexiePromise\n {\n if (mode === 'readwrite' && this.mode !== 'readwrite')\n return rejection(new exceptions.ReadOnly(\"Transaction is readonly\"));\n\n if (!this.active)\n return rejection(new exceptions.TransactionInactive());\n\n if (this._locked()) {\n return new DexiePromise((resolve, reject) => {\n this._blockedFuncs.push([() => {\n this._promise(mode, fn, bWriteLock).then(resolve, reject);\n }, PSD]);\n });\n\n } else if (bWriteLock) {\n return newScope(() => {\n var p = new DexiePromise((resolve, reject) => {\n this._lock();\n const rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p.finally(() => this._unlock());\n p._lib = true;\n return p;\n });\n\n } else {\n var p = new DexiePromise((resolve, reject) => {\n var rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p._lib = true;\n return p;\n }\n }\n\n /** Transaction._root()\n * \n * Internal method. Retrieves the root transaction in the tree of sub transactions.\n */\n _root() {\n return this.parent ? this.parent._root() : this;\n }\n\n /** Transaction.waitFor()\n * \n * Internal method. Can be accessed from the public API through\n * Dexie.waitFor(): https://dexie.org/docs/Dexie/Dexie.waitFor()\n * \n **/\n waitFor(promiseLike: PromiseLike) {\n // Always operate on the root transaction (in case this is a sub stransaction)\n var root = this._root();\n // For stability reasons, convert parameter to promise no matter what type is passed to waitFor().\n // (We must be able to call .then() on it.)\n const promise = DexiePromise.resolve(promiseLike);\n if (root._waitingFor) {\n // Already called waitFor(). Wait for both to complete.\n root._waitingFor = root._waitingFor.then(() => promise);\n } else {\n // We're not in waiting state. Start waiting state.\n root._waitingFor = promise;\n root._waitingQueue = [];\n // Start interacting with indexedDB until promise completes:\n var store = root.idbtrans.objectStore(root.storeNames[0]);\n (function spin() {\n ++root._spinCount; // For debugging only\n while (root._waitingQueue.length) (root._waitingQueue.shift())();\n if (root._waitingFor) store.get(-Infinity).onsuccess = spin;\n }());\n }\n var currentWaitPromise = root._waitingFor;\n return new DexiePromise((resolve, reject) => {\n promise.then(\n res => root._waitingQueue.push(wrap(resolve.bind(null, res))),\n err => root._waitingQueue.push(wrap(reject.bind(null, err)))\n ).finally(() => {\n if (root._waitingFor === currentWaitPromise) {\n // No one added a wait after us. Safe to stop the spinning.\n root._waitingFor = null;\n }\n });\n });\n } \n\n /** Transaction.abort()\n * \n * https://dexie.org/docs/Transaction/Transaction.abort()\n */\n abort() {\n if (this.active) {\n this.active = false;\n if (this.idbtrans) this.idbtrans.abort();\n this._reject(new exceptions.Abort());\n }\n }\n\n /** Transaction.table()\n * \n * https://dexie.org/docs/Transaction/Transaction.table()\n */\n table(tableName: string) {\n const memoizedTables = (this._memoizedTables || (this._memoizedTables = {}));\n if (hasOwn(memoizedTables, tableName))\n return memoizedTables[tableName];\n const tableSchema = this.schema[tableName];\n if (!tableSchema) {\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\"); \n }\n\n const transactionBoundTable = new this.db.Table(tableName, tableSchema, this);\n transactionBoundTable.core = this.db.core.table(tableName);\n memoizedTables[tableName] = transactionBoundTable;\n return transactionBoundTable;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Transaction } from './transaction';\nimport { DbSchema } from '../../public/types/db-schema';\nimport Events from '../../helpers/Events';\nimport Promise, { rejection } from '../../helpers/promise';\n\nexport interface TransactionConstructor {\n new (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction) : T;\n prototype: T;\n}\n\n/** Generates a Transaction constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTransactionConstructor(db: Dexie) {\n return makeClassConstructor>(\n Transaction.prototype,\n function Transaction (\n this: Transaction,\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction)\n {\n this.db = db;\n this.mode = mode;\n this.storeNames = storeNames;\n this.schema = dbschema;\n this.chromeTransactionDurability = chromeTransactionDurability;\n this.idbtrans = null;\n this.on = Events(this, \"complete\", \"error\", \"abort\");\n this.parent = parent || null;\n this.active = true;\n this._reculock = 0;\n this._blockedFuncs = [];\n this._resolve = null;\n this._reject = null;\n this._waitingFor = null;\n this._waitingQueue = null;\n this._spinCount = 0; // Just for debugging waitFor()\n this._completion = new Promise ((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n \n this._completion.then(\n ()=> {\n this.active = false;\n this.on.complete.fire();\n },\n e => {\n var wasActive = this.active;\n this.active = false;\n this.on.error.fire(e);\n this.parent ?\n this.parent._reject(e) :\n wasActive && this.idbtrans && this.idbtrans.abort();\n return rejection(e); // Indicate we actually DO NOT catch this error.\n });\n \n });\n}\n","import { IndexSpec } from '../public/types/index-spec';\n\nexport function createIndexSpec(\n name: string,\n keyPath: string | string[],\n unique: boolean,\n multi: boolean,\n auto: boolean,\n compound: boolean,\n isPrimKey: boolean\n): IndexSpec {\n return {\n name,\n keyPath,\n unique,\n multi,\n auto,\n compound,\n src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? \"++\" : \"\") + nameFromKeyPath(keyPath)\n }\n}\n\nexport function nameFromKeyPath (keyPath?: string | string[]): string {\n return typeof keyPath === 'string' ?\n keyPath :\n keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : \"\";\n}\n","import { IndexSpec } from '../public/types/index-spec';\nimport { TableSchema } from '../public/types/table-schema';\nimport { createIndexSpec } from './index-spec';\nimport { arrayToObject } from '../functions/utils';\n\nexport function createTableSchema (\n name: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n): TableSchema {\n return {\n name,\n primKey,\n indexes,\n mappedClass: null,\n idxByName: arrayToObject(indexes, index => [index.name, index])\n };\n}\n","import { maxString } from '../globals/constants';\n\nexport function safariMultiStoreFix(storeNames: string[]) {\n return storeNames.length === 1 ? storeNames[0] : storeNames;\n}\n\nexport function getNativeGetDatabaseNamesFn(indexedDB) {\n var fn = indexedDB && (indexedDB.getDatabaseNames || indexedDB.webkitGetDatabaseNames);\n return fn && fn.bind(indexedDB);\n}\n\nexport let getMaxKey = (IdbKeyRange: typeof IDBKeyRange) => {\n try {\n IdbKeyRange.only([[]]);\n getMaxKey = () => [[]];\n return [[]];\n } catch (e) {\n getMaxKey = () => maxString;\n return maxString;\n }\n}\n","import { getByKeyPath } from '../functions/utils';\n\nexport function getKeyExtractor (keyPath: null | string | string[]) : (a: any) => any {\n if (keyPath == null) {\n return () => undefined;\n } else if (typeof keyPath === 'string') {\n return getSinglePathKeyExtractor(keyPath);\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n\nexport function getSinglePathKeyExtractor(keyPath: string) {\n const split = keyPath.split('.');\n if (split.length === 1) {\n return obj => obj[keyPath];\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n","import {\n DBCore,\n DBCoreCursor,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryResponse,\n DBCoreRangeType,\n DBCoreSchema,\n DBCoreTableSchema,\n DBCoreTable,\n DBCoreMutateResponse,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { eventRejectHandler, preventDefault } from '../functions/event-wrappers';\nimport { wrap } from '../helpers/promise';\nimport { getMaxKey } from '../functions/quirks';\nimport { getKeyExtractor } from './get-key-extractor';\n\nexport function arrayify(arrayLike: {length: number, [index: number]: T}): T[] {\n return [].slice.call(arrayLike);\n}\nexport function pick(obj: T, props: Prop[]): Pick {\n const result = {} as Pick;\n props.forEach(prop => result[prop] = obj[prop]);\n return result;\n}\n\nlet _id_counter = 0;\n\nexport function getKeyPathAlias(keyPath: null | string | string[]) {\n return keyPath == null ?\n \":id\" :\n typeof keyPath === 'string' ?\n keyPath :\n `[${keyPath.join('+')}]`;\n}\n\nexport function createDBCore (\n db: IDBDatabase,\n IdbKeyRange: typeof IDBKeyRange,\n tmpTrans: IDBTransaction) : DBCore\n{\n function extractSchema(db: IDBDatabase, trans: IDBTransaction) : {schema: DBCoreSchema, hasGetAll: boolean} {\n const tables = arrayify(db.objectStoreNames);\n return {\n schema: {\n name: db.name,\n tables: tables.map(table => trans.objectStore(table)).map(store => {\n const {keyPath, autoIncrement} = store;\n const compound = isArray(keyPath);\n const outbound = keyPath == null;\n const indexByKeyPath: {[keyPathAlias: string]: DBCoreIndex} = {};\n const result = {\n name: store.name,\n primaryKey: {\n name: null,\n isPrimaryKey: true,\n outbound,\n compound,\n keyPath,\n autoIncrement,\n unique: true,\n extractKey: getKeyExtractor(keyPath)\n } as DBCoreIndex,\n indexes: arrayify(store.indexNames).map(indexName => store.index(indexName))\n .map(index => {\n const {name, unique, multiEntry, keyPath} = index;\n const compound = isArray(keyPath);\n const result: DBCoreIndex = {\n name,\n compound,\n keyPath,\n unique,\n multiEntry,\n extractKey: getKeyExtractor(keyPath)\n };\n indexByKeyPath[getKeyPathAlias(keyPath)] = result;\n return result;\n }),\n getIndexByKeyPath: (keyPath: null | string | string[]) => indexByKeyPath[getKeyPathAlias(keyPath)]\n };\n indexByKeyPath[\":id\"] = result.primaryKey;\n if (keyPath != null) {\n indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey;\n }\n return result;\n })\n },\n hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) &&\n !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604) // Bug with getAll() on Safari ver<604. See discussion following PR #579\n };\n }\n\n function makeIDBKeyRange (range: DBCoreKeyRange) : IDBKeyRange | null {\n if (range.type === DBCoreRangeType.Any) return null;\n if (range.type === DBCoreRangeType.Never) throw new Error(\"Cannot convert never type to IDBKeyRange\");\n const {lower, upper, lowerOpen, upperOpen} = range;\n const idbRange = lower === undefined ?\n upper === undefined ?\n null : //IDBKeyRange.lowerBound(-Infinity, false) : // Any range (TODO: Should we return null instead?)\n IdbKeyRange.upperBound(upper, !!upperOpen) : // below\n upper === undefined ?\n IdbKeyRange.lowerBound(lower, !!lowerOpen) : // above\n IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen);\n return idbRange;\n }\n\n function createDbCoreTable(tableSchema: DBCoreTableSchema): DBCoreTable {\n const tableName = tableSchema.name;\n\n function mutate ({trans, type, keys, values, range}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const outbound = store.keyPath == null;\n const isAddOrPut = type === \"put\" || type === \"add\";\n if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange')\n throw new Error (\"Invalid operation type: \" + type);\n\n const {length} = keys || values || {length: 1}; // keys.length if keys. values.length if values. 1 if range.\n if (keys && values && keys.length !== values.length) {\n throw new Error(\"Given keys array must have same length as given values array.\");\n }\n if (length === 0)\n // No items to write. Don't even bother!\n return resolve({numFailures: 0, failures: {}, results: [], lastResult: undefined});\n\n let req: IDBRequest;\n const reqs: IDBRequest[] = [];\n \n const failures: {[operationNumber: number]: Error} = [];\n let numFailures = 0;\n const errorHandler = \n event => {\n ++numFailures;\n preventDefault(event);\n };\n \n if (type === 'deleteRange') {\n // Here the argument is the range\n if (range.type === DBCoreRangeType.Never)\n return resolve({numFailures, failures, results: [], lastResult: undefined}); // Deleting the Never range shoulnt do anything.\n if (range.type === DBCoreRangeType.Any)\n reqs.push(req = store.clear()); // Deleting the Any range is equivalent to store.clear()\n else\n reqs.push(req = store.delete(makeIDBKeyRange(range)));\n } else {\n // No matter add, put or delete - find out arrays of first and second arguments to it.\n const [args1, args2] = isAddOrPut ?\n outbound ?\n [values, keys] :\n [values, null] :\n [keys, null];\n\n if (isAddOrPut) {\n for (let i=0; i {\n const lastResult = event.target.result;\n reqs.forEach((req, i) => req.error != null && (failures[i] = req.error));\n resolve({\n numFailures,\n failures,\n results: type === \"delete\" ? keys : reqs.map(req => req.result),\n lastResult\n });\n };\n \n req.onerror = event => { // wrap() not needed. All paths calling outside will wrap!\n errorHandler(event);\n done(event);\n };\n \n req.onsuccess = done;\n });\n }\n \n function openCursor ({trans, values, query, reverse, unique}: DBCoreOpenCursorRequest): Promise\n {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n // source\n const source = index.isPrimaryKey ?\n store :\n store.index(index.name);\n // direction\n const direction = reverse ?\n unique ?\n \"prevunique\" :\n \"prev\" :\n unique ?\n \"nextunique\" :\n \"next\";\n // request\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(makeIDBKeyRange(range), direction) :\n source.openKeyCursor(makeIDBKeyRange(range), direction);\n \n // iteration\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = wrap(ev => {\n\n const cursor = req.result as unknown as DBCoreCursor;\n if (!cursor) {\n resolve(null);\n return;\n }\n (cursor as any).___id = ++_id_counter;\n (cursor as any).done = false;\n const _cursorContinue = cursor.continue.bind(cursor);\n let _cursorContinuePrimaryKey = cursor.continuePrimaryKey;\n if (_cursorContinuePrimaryKey) _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor);\n const _cursorAdvance = cursor.advance.bind(cursor);\n const doThrowCursorIsNotStarted = ()=>{throw new Error(\"Cursor not started\");}\n const doThrowCursorIsStopped = ()=>{throw new Error(\"Cursor not stopped\");}\n (cursor as any).trans = trans;\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted;\n cursor.fail = wrap(reject);\n cursor.next = function (this: DBCoreCursor) {\n // next() must work with \"this\" pointer in order to function correctly for ProxyCursors (derived objects)\n // without having to re-define next() on each child.\n let gotOne = 1;\n return this.start(() => gotOne-- ? this.continue() : this.stop()).then(() => this);\n };\n cursor.start = (callback) => {\n //console.log(\"Starting cursor\", (cursor as any).___id);\n const iterationPromise = new Promise((resolveIteration, rejectIteration) =>{\n resolveIteration = wrap(resolveIteration);\n req.onerror = eventRejectHandler(rejectIteration);\n cursor.fail = rejectIteration;\n cursor.stop = value => {\n //console.log(\"Cursor stop\", cursor);\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped;\n resolveIteration(value);\n };\n });\n // Now change req.onsuccess to a callback that doesn't call initCursor but just observer.next()\n const guardedCallback = () => {\n if (req.result) {\n //console.log(\"Next result\", cursor);\n try {\n callback();\n } catch (err) {\n cursor.fail(err);\n }\n } else {\n (cursor as any).done = true;\n cursor.start = ()=>{throw new Error(\"Cursor behind last entry\");}\n cursor.stop();\n }\n }\n req.onsuccess = wrap(ev => {\n //cursor.continue = _cursorContinue;\n //cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n //cursor.advance = _cursorAdvance;\n req.onsuccess = guardedCallback;\n guardedCallback();\n });\n cursor.continue = _cursorContinue;\n cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n cursor.advance = _cursorAdvance;\n guardedCallback();\n return iterationPromise;\n };\n resolve(cursor);\n }, reject); \n });\n }\n \n function query (hasGetAll: boolean) {\n return (request: DBCoreQueryRequest) => {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {trans, values, limit, query} = request;\n const nonInfinitLimit = limit === Infinity ? undefined : limit;\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n if (limit === 0) return resolve({result: []});\n if (hasGetAll) {\n const req = values ?\n (source as any).getAll(idbKeyRange, nonInfinitLimit) :\n (source as any).getAllKeys(idbKeyRange, nonInfinitLimit);\n req.onsuccess = event => resolve({result: event.target.result});\n req.onerror = eventRejectHandler(reject);\n } else {\n let count = 0;\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(idbKeyRange) :\n source.openKeyCursor(idbKeyRange)\n const result = [];\n req.onsuccess = event => {\n const cursor = req.result as IDBCursorWithValue;\n if (!cursor) return resolve({result});\n result.push(values ? cursor.value : cursor.primaryKey);\n if (++count === limit) return resolve({result});\n cursor.continue();\n };\n req.onerror = eventRejectHandler(reject);\n }\n });\n };\n }\n \n return {\n name: tableName,\n schema: tableSchema,\n \n mutate,\n\n getMany ({trans, keys}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const length = keys.length;\n const result = new Array(length);\n let keyCount = 0;\n let callbackCount = 0;\n let valueCount = 0;\n let req: IDBRequest & {_pos?: number};\n \n const successHandler = event => {\n const req = event.target;\n if ((result[req._pos] = req.result) != null) ++valueCount;\n if (++callbackCount === keyCount) resolve(result);\n };\n const errorHandler = eventRejectHandler(reject);\n \n for (let i=0; i((resolve, reject) => {\n resolve = wrap (resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const req = store.get(key);\n req.onsuccess = event => resolve((event.target as any).result);\n req.onerror = eventRejectHandler(reject);\n });\n },\n\n query: query(hasGetAll),\n \n openCursor,\n\n count ({query, trans}) {\n const {index, range} = query;\n return new Promise((resolve, reject) => {\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n const req = idbKeyRange ? source.count(idbKeyRange) : source.count();\n req.onsuccess = wrap(ev => resolve((ev.target as IDBRequest).result));\n req.onerror = eventRejectHandler(reject);\n });\n }\n };\n }\n\n const {schema, hasGetAll} = extractSchema(db, tmpTrans);\n const tables = schema.tables.map(tableSchema => createDbCoreTable(tableSchema));\n const tableMap: {[name: string]: DBCoreTable} = {};\n tables.forEach(table => tableMap[table.name] = table);\n return {\n stack: \"dbcore\",\n \n transaction: db.transaction.bind(db),\n\n table(name: string) {\n const result = tableMap[name];\n if (!result) throw new Error(`Table '${name}' not found`);\n return tableMap[name];\n },\n\n MIN_KEY: -Infinity,\n\n MAX_KEY: getMaxKey(IdbKeyRange),\n\n schema\n\n };\n}\n","import { Dexie } from './';\nimport { createDBCore } from '../../dbcore/dbcore-indexeddb';\nimport { DBCore } from '../../public/types/dbcore';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { DexieStacks, Middleware } from '../../public/types/middleware';\nimport { exceptions } from '../../errors';\n\nfunction createMiddlewareStack(\n stackImpl: {stack: string},\n middlewares: Middleware<{stack: string}>[]): TStack {\n return middlewares.reduce((down, {create}) => ({...down, ...create(down)}), stackImpl) as TStack;\n} \n\nfunction createMiddlewareStacks(\n middlewares: {[StackName in keyof DexieStacks]?: Middleware[]},\n idbdb: IDBDatabase,\n {IDBKeyRange, indexedDB}: DexieDOMDependencies,\n tmpTrans: IDBTransaction): {[StackName in keyof DexieStacks]?: DexieStacks[StackName]}\n{\n const dbcore = createMiddlewareStack(\n createDBCore(idbdb, IDBKeyRange, tmpTrans),\n middlewares.dbcore);\n \n // TODO: Create other stacks the same way as above. They might be dependant on the result\n // of creating dbcore stack.\n\n return {\n dbcore\n };\n}\n\nexport function generateMiddlewareStacks(db: Dexie, tmpTrans: IDBTransaction) {\n const idbdb = tmpTrans.db;\n const stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans);\n db.core = stacks.dbcore!;\n db.tables.forEach(table => {\n const tableName = table.name;\n if (db.core.schema.tables.some(tbl => tbl.name === tableName)) {\n table.core = db.core.table(tableName);\n if (db[tableName] instanceof db.Table) {\n db[tableName].core = table.core;\n }\n }\n });\n}\n","import { Dexie } from '../dexie';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { _global } from \"../../globals/global\";\nimport { setProp, keys, slice, isArray, shallowClone, isAsyncFunction, defineProperty, getPropertyDescriptor } from '../../functions/utils';\nimport { Transaction } from '../transaction';\nimport { Version } from './version';\nimport Promise, { PSD, newScope, NativePromise, decrementExpectedAwaits, incrementExpectedAwaits } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { IndexSpec } from '../../public/types/index-spec';\nimport { createIndexSpec, nameFromKeyPath } from '../../helpers/index-spec';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { generateMiddlewareStacks } from '../dexie/generate-middleware-stacks';\nimport { debug } from '../../helpers/debug';\nimport { PromiseExtended } from '../../public/types/promise-extended';\n\nexport function setApiOnPlace(db: Dexie, objs: Object[], tableNames: string[], dbschema: DbSchema) {\n tableNames.forEach(tableName => {\n const schema = dbschema[tableName];\n objs.forEach(obj => {\n const propDesc = getPropertyDescriptor(obj, tableName);\n if (!propDesc || (\"value\" in propDesc && propDesc.value === undefined)) {\n // Either the prop is not declared, or it is initialized to undefined.\n if (obj === db.Transaction.prototype || obj instanceof db.Transaction) {\n // obj is a Transaction prototype (or prototype of a subclass to Transaction)\n // Make the API a getter that returns this.table(tableName)\n setProp(obj, tableName, {\n get(this: Transaction) { return this.table(tableName); },\n set(value: any) {\n // Issue #1039\n // Let \"this.schema = dbschema;\" and other props in transaction constructor work even if there's a name collision with the table name.\n defineProperty(this, tableName, {value, writable: true, configurable: true, enumerable: true});\n }\n });\n } else {\n // Table will not be bound to a transaction (will use Dexie.currentTransaction)\n obj[tableName] = new db.Table(tableName, schema);\n }\n }\n });\n });\n}\n\nexport function removeTablesApi(db: Dexie, objs: Object[]) {\n objs.forEach(obj => {\n for (let key in obj) {\n if (obj[key] instanceof db.Table) delete obj[key];\n }\n });\n}\n\nexport function lowerVersionFirst(a: Version, b: Version) {\n return a._cfg.version - b._cfg.version;\n}\n\nexport function runUpgraders(db: Dexie, oldVersion: number, idbUpgradeTrans: IDBTransaction, reject) {\n const globalSchema = db._dbSchema;\n if (idbUpgradeTrans.objectStoreNames.contains('$meta') && !globalSchema.$meta) {\n globalSchema.$meta = createTableSchema(\"$meta\", parseIndexSyntax(\"\")[0], []);\n db._storeNames.push('$meta');\n }\n const trans = db._createTransaction('readwrite', db._storeNames, globalSchema);\n trans.create(idbUpgradeTrans);\n trans._completion.catch(reject);\n const rejectTransaction = trans._reject.bind(trans);\n const transless = PSD.transless || PSD;\n newScope(() => {\n PSD.trans = trans;\n PSD.transless = transless;\n if (oldVersion === 0) {\n // Create tables:\n keys(globalSchema).forEach(tableName => {\n createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes);\n });\n generateMiddlewareStacks(db, idbUpgradeTrans);\n Promise.follow(() => db.on.populate.fire(trans)).catch(rejectTransaction);\n } else {\n generateMiddlewareStacks(db, idbUpgradeTrans);\n return getExistingVersion(db, trans, oldVersion)\n .then(oldVersion => updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans))\n .catch(rejectTransaction);\n }\n });\n}\n\nexport type UpgradeQueueItem = (idbtrans: IDBTransaction) => PromiseLike | void;\n\nexport function patchCurrentVersion(db: Dexie, idbUpgradeTrans: IDBTransaction) {\n createMissingTables(db._dbSchema, idbUpgradeTrans);\n if (idbUpgradeTrans.db.version % 10 === 0 && !idbUpgradeTrans.objectStoreNames.contains('$meta')) {\n // Rolled over to the next 10-ies due to many schema upgrades without bumping version.\n // No problem! We pin the database to its expected version by adding the $meta table so that next\n // time the programmer bumps the version and attaches, an upgrader, that upgrader will indeed run,\n // as well any further upgraders coming after that.\n idbUpgradeTrans.db.createObjectStore('$meta').add(Math.ceil((idbUpgradeTrans.db.version / 10) - 1), 'version');\n }\n const globalSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n adjustToExistingIndexNames(db, db._dbSchema, idbUpgradeTrans);\n const diff = getSchemaDiff(globalSchema, db._dbSchema);\n for (const tableChange of diff.change) {\n if (tableChange.change.length || tableChange.recreate) {\n console.warn(`Unable to patch indexes of table ${tableChange.name} because it has changes on the type of index or primary key.`);\n return;\n }\n const store = idbUpgradeTrans.objectStore(tableChange.name);\n tableChange.add.forEach(idx => {\n if (debug) console.debug(`Dexie upgrade patch: Creating missing index ${tableChange.name}.${idx.src}`);\n addIndex(store, idx);\n });\n }\n}\n\nfunction getExistingVersion(db: Dexie, trans: Transaction, oldVersion: number): PromiseExtended {\n // In normal case, existing version is the native installed version divided by 10.\n // However, in case more than 10 schema changes have been made on the same version (such as while\n // developing an app), the native version may have passed beyond a multiple of 10 within the same version.\n // When that happens, a table $meta will have been created, containing a single entry with key \"version\"\n // and the value of the real old version to use when running upgraders going forward.\n if (trans.storeNames.includes('$meta')) {\n return trans.table('$meta').get('version').then(metaVersion => {\n return metaVersion != null ? metaVersion : oldVersion\n })\n } else {\n return Promise.resolve(oldVersion);\n }\n}\n\nfunction updateTablesAndIndexes(\n db: Dexie,\n oldVersion: number,\n trans: Transaction,\n idbUpgradeTrans: IDBTransaction)\n{\n // Upgrade version to version, step-by-step from oldest to newest version.\n // Each transaction object will contain the table set that was current in that version (but also not-yet-deleted tables from its previous version)\n const queue: UpgradeQueueItem[] = [];\n const versions = db._versions;\n let globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n let anyContentUpgraderHasRun = false;\n \n const versToRun = versions.filter(v => v._cfg.version >= oldVersion);\n if (versToRun.length === 0) {\n // Important not to continue at this point.\n // Coming here means we've already patched schema in patchCurrentVersion() after having\n // incremented native version to a value above the declared highest version.\n // When being in this mode, it means that there might be different versions the db competing\n // about it with different version of the schema. Therefore, we must avoid deleting tables\n // or indexes here so that both versions can co-exist until the application has been upgraded to\n // a version that declares no lower than the native version.\n // If after that, a downgrade happens again, we'll end up here again, accepting both versions\n // And we'll stay in this state until app developer releases a new declared version.\n return Promise.resolve(); \n }\n \n versToRun.forEach(version => {\n queue.push(() => {\n const oldSchema = globalSchema;\n const newSchema = version._cfg.dbschema;\n adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans);\n adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans);\n\n globalSchema = db._dbSchema = newSchema;\n\n const diff = getSchemaDiff(oldSchema, newSchema);\n // Add tables \n diff.add.forEach(tuple => {\n createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes);\n });\n // Change tables\n diff.change.forEach(change => {\n if (change.recreate) {\n throw new exceptions.Upgrade(\"Not yet support for changing primary key\");\n } else {\n const store = idbUpgradeTrans.objectStore(change.name);\n // Add indexes\n change.add.forEach(idx => addIndex(store, idx));\n // Update indexes\n change.change.forEach(idx => {\n store.deleteIndex(idx.name);\n addIndex(store, idx);\n });\n // Delete indexes\n change.del.forEach(idxName => store.deleteIndex(idxName));\n }\n });\n\n const contentUpgrade = version._cfg.contentUpgrade;\n\n if (contentUpgrade && version._cfg.version > oldVersion) {\n // Update db.core with new tables and indexes:\n generateMiddlewareStacks(db, idbUpgradeTrans);\n trans._memoizedTables = {}; // Invalidate memoization as transaction shape may change between versions.\n\n anyContentUpgraderHasRun = true;\n\n // Add to-be-deleted tables to contentUpgrade transaction\n let upgradeSchema = shallowClone(newSchema);\n diff.del.forEach(table => {\n upgradeSchema[table] = oldSchema[table];\n });\n\n // Safe to affect Transaction.prototype globally in this moment,\n // because when this code runs, there may not be any other code\n // that can access any transaction instance, else than this particular\n // upgrader function.\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema), upgradeSchema);\n trans.schema = upgradeSchema;\n\n // Support for native async await.\n const contentUpgradeIsAsync = isAsyncFunction(contentUpgrade);\n if (contentUpgradeIsAsync) {\n incrementExpectedAwaits();\n }\n \n let returnValue: any;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = contentUpgrade(trans);\n if (returnValue) {\n if (contentUpgradeIsAsync) {\n // contentUpgrade is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n }\n }\n });\n return (returnValue && typeof returnValue.then === 'function' ?\n Promise.resolve(returnValue) : promiseFollowed.then(()=>returnValue));\n }\n });\n queue.push(idbtrans => {\n const newSchema = version._cfg.dbschema;\n // Delete old tables\n deleteRemovedTables(newSchema, idbtrans);\n // Restore the final API\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema);\n trans.schema = db._dbSchema;\n });\n // Maintain the $meta table after this version's tables and indexes has been created and content upgraders have run.\n queue.push(idbtrans => {\n if (db.idbdb.objectStoreNames.contains('$meta')) {\n if (Math.ceil(db.idbdb.version / 10) === version._cfg.version) {\n // Remove $meta table if it's no more needed - we are in line with the native version\n db.idbdb.deleteObjectStore('$meta');\n delete db._dbSchema.$meta;\n db._storeNames = db._storeNames.filter(name => name !== '$meta');\n } else {\n // We're still not in line with the native version. Make sure to update the virtual version\n // to the successfully run version\n idbtrans.objectStore('$meta').put(version._cfg.version, 'version');\n }\n }\n }); \n });\n\n // Now, create a queue execution engine\n function runQueue() {\n return queue.length ? Promise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) :\n Promise.resolve();\n }\n\n return runQueue().then(() => {\n createMissingTables(globalSchema, idbUpgradeTrans); // At last, make sure to create any missing tables. (Needed by addons that add stores to DB without specifying version)\n });\n}\n\nexport interface SchemaDiff {\n del: string[],\n add: [string, TableSchema][];\n change: TableSchemaDiff[];\n}\n\nexport interface TableSchemaDiff {\n name: string,\n recreate: boolean,\n del: string[],\n add: IndexSpec[],\n change: IndexSpec[]\n}\n\nexport function getSchemaDiff(oldSchema: DbSchema, newSchema: DbSchema): SchemaDiff {\n const diff: SchemaDiff = {\n del: [], // Array of table names\n add: [], // Array of [tableName, newDefinition]\n change: [] // Array of {name: tableName, recreate: newDefinition, del: delIndexNames, add: newIndexDefs, change: changedIndexDefs}\n };\n let table: string;\n for (table in oldSchema) {\n if (!newSchema[table]) diff.del.push(table);\n }\n for (table in newSchema) {\n const oldDef = oldSchema[table],\n newDef = newSchema[table];\n if (!oldDef) {\n diff.add.push([table, newDef]);\n } else {\n const change = {\n name: table,\n def: newDef,\n recreate: false,\n del: [],\n add: [],\n change: []\n };\n if (\n (\n // compare keyPaths no matter if string or string[]\n // compare falsy keypaths same no matter if they are null or empty string.\n ''+(oldDef.primKey.keyPath||'')\n ) !== (\n ''+(newDef.primKey.keyPath||'')\n ) ||\n // Compare the autoIncrement flag also\n (oldDef.primKey.auto !== newDef.primKey.auto))\n {\n // Primary key has changed. Remove and re-add table.\n change.recreate = true;\n diff.change.push(change);\n } else {\n // Same primary key. Just find out what differs:\n const oldIndexes = oldDef.idxByName;\n const newIndexes = newDef.idxByName;\n let idxName: string;\n for (idxName in oldIndexes) {\n if (!newIndexes[idxName]) change.del.push(idxName);\n }\n for (idxName in newIndexes) {\n const oldIdx = oldIndexes[idxName],\n newIdx = newIndexes[idxName];\n if (!oldIdx) change.add.push(newIdx);\n else if (oldIdx.src !== newIdx.src) change.change.push(newIdx);\n }\n if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) {\n diff.change.push(change);\n }\n }\n }\n }\n return diff;\n}\n\nexport function createTable(\n idbtrans: IDBTransaction,\n tableName: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n) {\n const store = idbtrans.db.createObjectStore(\n tableName,\n primKey.keyPath ?\n { keyPath: primKey.keyPath, autoIncrement: primKey.auto } :\n { autoIncrement: primKey.auto }\n );\n indexes.forEach(idx => addIndex(store, idx));\n return store;\n}\n\nexport function createMissingTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n keys(newSchema).forEach(tableName => {\n if (!idbtrans.db.objectStoreNames.contains(tableName)) {\n if (debug) console.debug('Dexie: Creating missing table', tableName);\n createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes);\n }\n });\n}\n\nexport function deleteRemovedTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n [].slice.call(idbtrans.db.objectStoreNames).forEach(storeName =>\n newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName));\n}\n\nexport function addIndex(store: IDBObjectStore, idx: IndexSpec) {\n store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi });\n}\n\nfunction buildGlobalSchema(\n db: Dexie,\n idbdb: IDBDatabase,\n tmpTrans: IDBTransaction\n) {\n const globalSchema = {};\n const dbStoreNames = slice(idbdb.objectStoreNames, 0);\n dbStoreNames.forEach(storeName => {\n const store = tmpTrans.objectStore(storeName);\n let keyPath = store.keyPath;\n const primKey = createIndexSpec(\n nameFromKeyPath(keyPath),\n keyPath || \"\",\n true,\n false,\n !!store.autoIncrement,\n keyPath && typeof keyPath !== \"string\",\n true\n );\n const indexes: IndexSpec[] = [];\n for (let j = 0; j < store.indexNames.length; ++j) {\n const idbindex = store.index(store.indexNames[j]);\n keyPath = idbindex.keyPath;\n var index = createIndexSpec(\n idbindex.name,\n keyPath,\n !!idbindex.unique,\n !!idbindex.multiEntry,\n false,\n keyPath && typeof keyPath !== \"string\",\n false\n );\n indexes.push(index);\n }\n globalSchema[storeName] = createTableSchema(storeName, primKey, indexes);\n });\n return globalSchema;\n}\n\nexport function readGlobalSchema(db: Dexie, idbdb: IDBDatabase, tmpTrans: IDBTransaction) {\n db.verno = idbdb.version / 10;\n const globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans);\n db._storeNames = slice(idbdb.objectStoreNames, 0);\n setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema);\n}\n\nexport function verifyInstalledSchema(db: Dexie, tmpTrans: IDBTransaction): boolean {\n const installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans);\n const diff = getSchemaDiff(installedSchema, db._dbSchema);\n return !(diff.add.length || diff.change.some(ch => ch.add.length || ch.change.length));\n}\n\nexport function adjustToExistingIndexNames(db: Dexie, schema: DbSchema, idbtrans: IDBTransaction) {\n // Issue #30 Problem with existing db - adjust to existing index names when migrating from non-dexie db\n const storeNames = idbtrans.db.objectStoreNames;\n\n for (let i = 0; i < storeNames.length; ++i) {\n const storeName = storeNames[i];\n const store = idbtrans.objectStore(storeName);\n db._hasGetAll = 'getAll' in store;\n\n for (let j = 0; j < store.indexNames.length; ++j) {\n const indexName = store.indexNames[j];\n const keyPath = store.index(indexName).keyPath;\n const dexieName = typeof keyPath === 'string' ? keyPath : \"[\" + slice(keyPath).join('+') + \"]\";\n if (schema[storeName]) {\n const indexSpec = schema[storeName].idxByName[dexieName];\n if (indexSpec) {\n indexSpec.name = indexName;\n delete schema[storeName].idxByName[dexieName];\n schema[storeName].idxByName[indexName] = indexSpec;\n }\n }\n }\n }\n\n // Bug with getAll() on Safari ver<604 on Workers only, see discussion following PR #579\n if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604)\n {\n db._hasGetAll = false;\n }\n}\n\nexport function parseIndexSyntax(primKeyAndIndexes: string): IndexSpec[] {\n return primKeyAndIndexes.split(',').map((index, indexNum) => {\n index = index.trim();\n const name = index.replace(/([&*]|\\+\\+)/g, \"\"); // Remove \"&\", \"++\" and \"*\"\n // Let keyPath of \"[a+b]\" be [\"a\",\"b\"]:\n const keyPath = /^\\[/.test(name) ? name.match(/^\\[(.*)\\]$/)[1].split('+') : name;\n\n return createIndexSpec(\n name,\n keyPath || null,\n /\\&/.test(index),\n /\\*/.test(index),\n /\\+\\+/.test(index),\n isArray(keyPath),\n indexNum === 0\n );\n });\n}\n","import { Version as IVersion } from '../../public/types/version';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { extend, keys } from '../../functions/utils';\nimport { Dexie } from '../dexie';\nimport { Transaction } from '../transaction';\nimport { removeTablesApi, setApiOnPlace, parseIndexSyntax } from './schema-helpers';\nimport { exceptions } from '../../errors';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\n\n/** class Version\n *\n * https://dexie.org/docs/Version/Version\n */\nexport class Version implements IVersion {\n db: Dexie;\n _cfg: {\n version: number,\n storesSource: { [tableName: string]: string | null },\n dbschema: DbSchema,\n tables: {},\n contentUpgrade: Function | null\n }\n\n _parseStoresSpec(stores: { [tableName: string]: string | null }, outSchema: DbSchema): any {\n keys(stores).forEach(tableName => {\n if (stores[tableName] !== null) {\n var indexes = parseIndexSyntax(stores[tableName]);\n var primKey = indexes.shift();\n primKey.unique = true;\n if (primKey.multi) throw new exceptions.Schema(\"Primary key cannot be multi-valued\");\n indexes.forEach(idx => {\n if (idx.auto) throw new exceptions.Schema(\"Only primary key can be marked as autoIncrement (++)\");\n if (!idx.keyPath) throw new exceptions.Schema(\"Index must have a name and cannot be an empty string\");\n });\n outSchema[tableName] = createTableSchema(tableName, primKey, indexes);\n }\n });\n }\n\n stores(stores: { [key: string]: string | null; }): IVersion {\n const db = this.db;\n this._cfg.storesSource = this._cfg.storesSource ?\n extend(this._cfg.storesSource, stores) :\n stores;\n const versions = db._versions;\n\n // Derive stores from earlier versions if they are not explicitely specified as null or a new syntax.\n const storesSpec: { [key: string]: string; } = {};\n let dbschema = {};\n versions.forEach(version => { // 'versions' is always sorted by lowest version first.\n extend(storesSpec, version._cfg.storesSource);\n dbschema = (version._cfg.dbschema = {});\n version._parseStoresSpec(storesSpec, dbschema);\n });\n // Update the latest schema to this version\n db._dbSchema = dbschema;\n // Update APIs\n removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]);\n setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema);\n db._storeNames = keys(dbschema);\n return this;\n }\n\n upgrade(upgradeFunction: (trans: Transaction) => PromiseLike | void): Version {\n this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction);\n return this;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Version } from './version';\n\nexport interface VersionConstructor {\n new(versionNumber: number): Version;\n prototype: Version;\n}\n\n/** Generates a Version constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createVersionConstructor(db: Dexie) {\n return makeClassConstructor(\n Version.prototype,\n\n function Version(this: Version, versionNumber: number) {\n this.db = db;\n this._cfg = {\n version: versionNumber,\n storesSource: null,\n dbschema: {},\n tables: {},\n contentUpgrade: null\n };\n });\n\n}\n","import { Dexie } from \"../classes/dexie/dexie\";\nimport { Table } from \"../public/types/table\";\nimport { DBNAMES_DB } from \"../globals/constants\";\nimport { DexieDOMDependencies } from \"../public/types/dexie-dom-dependencies\";\nimport { nop } from \"../functions/chaining-functions\";\n\ntype IDBKeyNamesVar = typeof IDBKeyRange;\n\nfunction getDbNamesTable(indexedDB: IDBFactory, IDBKeyRange: IDBKeyNamesVar) {\n let dbNamesDB = indexedDB[\"_dbNamesDB\"];\n if (!dbNamesDB) {\n dbNamesDB = indexedDB[\"_dbNamesDB\"] = new Dexie(DBNAMES_DB, {\n addons: [],\n indexedDB,\n IDBKeyRange,\n });\n dbNamesDB.version(1).stores({ dbnames: \"name\" });\n }\n return dbNamesDB.table(\"dbnames\") as Table<{ name: string }, string>;\n}\n\nfunction hasDatabasesNative(indexedDB: IDBFactory) {\n return indexedDB && typeof indexedDB.databases === \"function\";\n}\n\nexport function getDatabaseNames({\n indexedDB,\n IDBKeyRange,\n}: DexieDOMDependencies) {\n return hasDatabasesNative(indexedDB)\n ? Promise.resolve(indexedDB.databases()).then((infos) =>\n infos\n // Select name prop of infos:\n .map((info) => info.name)\n // Filter out DBNAMES_DB as previous Dexie or browser version would not have included it in the result.\n .filter((name) => name !== DBNAMES_DB)\n )\n : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys();\n}\n\nexport function _onDatabaseCreated(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).put({name}).catch(nop);\n}\n\nexport function _onDatabaseDeleted(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop);\n}\n","import { newScope } from '../../helpers/promise';\nimport { PSD } from '../../helpers/promise';\n\nexport function vip (fn) {\n // To be used by subscribers to the on('ready') event.\n // This will let caller through to access DB even when it is blocked while the db.ready() subscribers are firing.\n // This would have worked automatically if we were certain that the Provider was using Dexie.Promise for all asyncronic operations. The promise PSD\n // from the provider.connect() call would then be derived all the way to when provider would call localDatabase.applyChanges(). But since\n // the provider more likely is using non-promise async APIs or other thenable implementations, we cannot assume that.\n // Note that this method is only useful for on('ready') subscribers that is returning a Promise from the event. If not using vip()\n // the database could deadlock since it wont open until the returned Promise is resolved, and any non-VIPed operation started by\n // the caller will not resolve until database is opened.\n return newScope(function () {\n PSD.letThrough = true; // Make sure we are let through if still blocking db due to onready is firing.\n return fn();\n });\n}\n\n","/**\n * Work around Safari 14 IndexedDB open bug.\n *\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up. https://bugs.webkit.org/show_bug.cgi?id=226547\n * The only solution is to keep nudging it until it's awake.\n */\nfunction idbReady() {\n var isSafari = !navigator.userAgentData &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\//.test(navigator.userAgent);\n // No point putting other browsers or older versions of Safari through this mess.\n if (!isSafari || !indexedDB.databases)\n return Promise.resolve();\n var intervalId;\n return new Promise(function (resolve) {\n var tryIdb = function () { return indexedDB.databases().finally(resolve); };\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(function () { return clearInterval(intervalId); });\n}\n\nexport default idbReady;\n","import { cmp } from \"../functions/cmp\";\nimport { extend, iteratorSymbol, props } from '../functions/utils';\nimport { IndexableType } from '../public';\nimport {\n EmptyRange,\n IntervalTree,\n IntervalTreeNode,\n RangeSetConstructor,\n RangeSetPrototype,\n} from \"../public/types/rangeset\";\n\n/* An interval tree implementation to efficiently detect overlapping ranges of queried indexes.\n *\n * https://en.wikipedia.org/wiki/Interval_tree\n * \n */\n\nfunction isEmptyRange(node: IntervalTree | {from: IndexableType, to: IndexableType}): node is EmptyRange {\n return !(\"from\" in node);\n}\n\nexport type RangeSet = RangeSetPrototype & IntervalTree;\n\nexport const RangeSet = function(fromOrTree: any, to?: any) {\n if (this) {\n // Called with new()\n extend(this, arguments.length ? {d:1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree} : {d:0});\n } else {\n // Called without new()\n const rv = new RangeSet();\n if (fromOrTree && (\"d\" in fromOrTree)) {\n extend(rv, fromOrTree);\n }\n return rv;\n }\n} as RangeSetConstructor;\n\nprops(RangeSet.prototype, {\n add(rangeSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n mergeRanges(this, rangeSet);\n return this;\n },\n addKey(key: IndexableType) {\n addRange(this, key, key);\n return this;\n },\n addKeys(keys: IndexableType[]) {\n keys.forEach(key => addRange(this, key, key));\n return this;\n },\n\n [iteratorSymbol](): Iterator {\n return getRangeSetIterator(this);\n }\n});\n\nfunction addRange(target: IntervalTree, from: IndexableType, to: IndexableType) {\n const diff = cmp(from, to);\n // cmp() returns NaN if one of the args are IDB-invalid keys.\n // Avoid storing invalid keys in rangeset:\n if (isNaN(diff)) return;\n\n // Caller is trying to add a range where from is greater than to:\n if (diff > 0) throw RangeError();\n \n if (isEmptyRange(target)) return extend(target, { from, to, d: 1 });\n const left = target.l;\n const right = target.r;\n if (cmp(to, target.from) < 0) {\n left\n ? addRange(left, from, to)\n : (target.l = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n if (cmp(from, target.to) > 0) {\n right\n ? addRange(right, from, to)\n : (target.r = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n // Now we have some kind of overlap. We will be able to merge the new range into the node or let it be swallowed.\n\n // Grow left?\n if (cmp(from, target.from) < 0) {\n target.from = from;\n target.l = null; // Cut off for now. Re-add later.\n target.d = right ? right.d + 1 : 1;\n }\n // Grow right?\n if (cmp(to, target.to) > 0) {\n target.to = to;\n target.r = null; // Cut off for now. Re-add later.\n target.d = target.l ? target.l.d + 1 : 1;\n }\n const rightWasCutOff = !target.r;\n // Re-add left?\n if (left && !target.l) {\n //Ranges to the left may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, left);\n }\n // Re-add right?\n if (right && rightWasCutOff) {\n //Ranges to the right may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, right);\n }\n}\n\nexport function mergeRanges(target: IntervalTree, newSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n function _addRangeSet(\n target: IntervalTree,\n { from, to, l, r }: IntervalTreeNode | {from: IndexableType, to: IndexableType, l?: undefined, r?: undefined}\n ) {\n addRange(target, from, to);\n if (l) _addRangeSet(target, l);\n if (r) _addRangeSet(target, r);\n }\n\n if(!isEmptyRange(newSet)) _addRangeSet(target, newSet);\n}\n\nexport function rangesOverlap(\n rangeSet1: IntervalTree,\n rangeSet2: IntervalTree\n): boolean {\n // Start iterating other from scratch.\n const i1 = getRangeSetIterator(rangeSet2);\n let nextResult1 = i1.next();\n if (nextResult1.done) return false;\n let a = nextResult1.value;\n\n // Start iterating this from start of other\n const i2 = getRangeSetIterator(rangeSet1);\n let nextResult2 = i2.next(a.from); // Start from beginning of other range\n let b = nextResult2.value;\n\n while (!nextResult1.done && !nextResult2.done) {\n if (cmp(b!.from, a.to) <= 0 && cmp(b!.to, a.from) >= 0) return true;\n cmp(a.from, b!.from) < 0\n ? (a = (nextResult1 = i1.next(b!.from)).value!) // a is behind. forward it to beginning of next b-range\n : (b = (nextResult2 = i2.next(a.from)).value); // b is behind. forward it to beginning of next a-range\n }\n return false;\n}\n\ntype RangeSetIteratorState =\n | {\n up?: RangeSetIteratorState;\n n: IntervalTreeNode;\n s: 0 | 1 | 2 | 3;\n }\n | undefined\n | null;\nexport function getRangeSetIterator(\n node: EmptyRange | IntervalTreeNode\n): Generator {\n let state: RangeSetIteratorState = isEmptyRange(node) ? null : { s: 0, n: node };\n\n return {\n next(key?) {\n const keyProvided = arguments.length > 0;\n while (state) {\n switch (state.s) {\n case 0:\n // Initial state for node.\n // Fast forward to leftmost node.\n state.s = 1;\n if (keyProvided) {\n while (state.n.l && cmp(key, state.n.from) < 0)\n state = { up: state, n: state.n.l, s: 1 };\n } else {\n while (state.n.l) state = { up: state, n: state.n.l, s: 1 };\n }\n // intentionally fall into case 1:\n case 1:\n // We're on a node where it's left part is already handled or does not exist.\n state.s = 2;\n if (!keyProvided || cmp(key, state.n.to) <= 0)\n return { value: state.n, done: false };\n case 2:\n // We've emitted our node and should continue with the right part or let parent take over from it's state 1\n if (state.n.r) {\n state.s = 3; // So when child is done, we know we're done.\n state = { up: state, n: state.n.r, s: 0 };\n continue; // Will fall in to case 0 with fast forward to left leaf of this subtree.\n }\n // intentionally fall into case 3:\n case 3:\n state = state.up;\n }\n }\n return { done: true };\n },\n } as Generator;\n}\n\nfunction rebalance(target: IntervalTreeNode) {\n const diff = (target.r?.d || 0) - (target.l?.d || 0);\n const r = diff > 1 ? \"r\" : diff < -1 ? \"l\" : \"\";\n if (r) {\n\n // Rotate (https://en.wikipedia.org/wiki/Tree_rotation)\n //\n // \n // [OLDROOT]\n // [OLDROOT.L] [NEWROOT]\n // [NEWROOT.L] [NEWROOT.R]\n //\n // Is going to become:\n //\n // \n // [NEWROOT]\n // [OLDROOT] [NEWROOT.R]\n // [OLDROOT.L] [NEWROOT.L] \n\n // * clone now has the props of OLDROOT\n // Plan:\n // * target must be given the props of NEWROOT\n // * target[l] must point to a new OLDROOT\n // * target[r] must point to NEWROOT.R\n // * OLDROOT[r] must point to NEWROOT.L\n const l = r === \"r\" ? \"l\" : \"r\"; // Support both left/right rotation\n const rootClone = { ...target };\n // We're gonna copy props from target's right node into target so that target will\n // have same range as old target[r] (instead of changing pointers, we copy values.\n // that way we do not need to adjust pointers in parents).\n const oldRootRight = target[r]; \n target.from = oldRootRight.from;\n target.to = oldRootRight.to;\n target[r] = oldRootRight[r];\n rootClone[r] = oldRootRight[l];\n target[l] = rootClone;\n rootClone.d = computeDepth(rootClone);\n }\n target.d = computeDepth(target);\n}\n\nfunction computeDepth({ r, l }: Pick) {\n return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1;\n}\n","import { cloneSimpleObjectTree, deepClone, keys, objectIsEmpty } from \"../functions/utils\";\nimport { mergeRanges, RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\n\nexport function extendObservabilitySet(\n target: ObservabilitySet,\n newSet: ObservabilitySet\n): ObservabilitySet {\n keys(newSet).forEach(part => {\n if (target[part]) mergeRanges(target[part], newSet[part]);\n else target[part] = cloneSimpleObjectTree(newSet[part]); // Somewhat faster\n });\n return target;\n}\n","import { rangesOverlap } from '../helpers/rangeset';\nimport { ObservabilitySet } from '../public/types/db-events';\n\nexport function obsSetsOverlap(os1: ObservabilitySet, os2: ObservabilitySet) {\n return os1.all || os2.all || Object.keys(os1).some(\n (key) => os2[key] && rangesOverlap(os2[key], os1[key])\n );\n}\n","import { type GlobalQueryCache } from \"../../public/types/cache\";\n\nexport const cache: GlobalQueryCache = {}\n","import { CacheEntry, TblQueryCache } from '../../public/types/cache';\nimport { ObservabilitySet } from '../../public/types/db-events';\nimport { extendObservabilitySet } from '../extend-observability-set';\nimport { obsSetsOverlap } from '../obs-sets-overlap';\nimport { cache } from './cache';\n\nlet unsignaledParts: ObservabilitySet = {};\nlet isTaskEnqueued = false;\n\nexport function signalSubscribersLazily(part: ObservabilitySet, optimistic = false) {\n extendObservabilitySet(unsignaledParts, part);\n if (!isTaskEnqueued) {\n isTaskEnqueued = true;\n setTimeout(() => {\n isTaskEnqueued = false;\n const parts = unsignaledParts;\n unsignaledParts = {};\n signalSubscribersNow(parts, false);\n }, 0);\n }\n}\n\nexport function signalSubscribersNow(\n updatedParts: ObservabilitySet,\n deleteAffectedCacheEntries = false\n) {\n const queriesToSignal = new Set<() => void>();\n if (updatedParts.all) {\n // Signal all subscribers to requery.\n for (const tblCache of Object.values(cache)) {\n collectTableSubscribers(\n tblCache,\n updatedParts,\n queriesToSignal,\n deleteAffectedCacheEntries\n );\n }\n } else {\n for (const key in updatedParts) {\n const parts = /^idb\\:\\/\\/(.*)\\/(.*)\\//.exec(key);\n if (parts) {\n const [, dbName, tableName] = parts;\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (tblCache)\n collectTableSubscribers(\n tblCache,\n updatedParts,\n queriesToSignal,\n deleteAffectedCacheEntries\n );\n }\n }\n }\n // Now when affected cache entries are removed, signal collected subscribers to requery.\n queriesToSignal.forEach((requery) => requery());\n}\n\nfunction collectTableSubscribers(\n tblCache: TblQueryCache,\n updatedParts: ObservabilitySet,\n outQueriesToSignal: Set<() => void>,\n deleteAffectedCacheEntries: boolean\n) {\n const updatedEntryLists: [string, CacheEntry[]][] = [];\n for (const [indexName, entries] of Object.entries(tblCache.queries.query)) {\n const filteredEntries: CacheEntry[] = [];\n for (const entry of entries) {\n if (obsSetsOverlap(updatedParts, entry.obsSet)) {\n // This query is affected by the mutation. Remove it from cache\n // and signal all subscribers to requery.\n entry.subscribers.forEach((requery) => outQueriesToSignal.add(requery));\n } else if (deleteAffectedCacheEntries) {\n filteredEntries.push(entry);\n }\n }\n // Collect cache entries to be updated\n if (deleteAffectedCacheEntries)\n updatedEntryLists.push([indexName, filteredEntries]);\n }\n if (deleteAffectedCacheEntries) {\n for (const [indexName, filteredEntries] of updatedEntryLists) {\n tblCache.queries.query[indexName] = filteredEntries;\n }\n }\n}\n","import { Dexie } from './dexie';\nimport * as Debug from '../../helpers/debug';\nimport { rejection } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { eventRejectHandler, preventDefault } from '../../functions/event-wrappers';\nimport Promise, { wrap } from '../../helpers/promise';\nimport { connections } from '../../globals/constants';\nimport { runUpgraders, readGlobalSchema, adjustToExistingIndexNames, verifyInstalledSchema, patchCurrentVersion } from '../version/schema-helpers';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { _onDatabaseCreated } from '../../helpers/database-enumerator';\nimport { vip } from './vip';\nimport { promisableChain, nop } from '../../functions/chaining-functions';\nimport { generateMiddlewareStacks } from './generate-middleware-stacks';\nimport { slice } from '../../functions/utils';\nimport safari14Workaround from 'safari-14-idb-fix';\nimport { type ObservabilitySet } from '../../public/types/db-events';\nimport { RangeSet } from '../../helpers/rangeset';\nimport { DEXIE_STORAGE_MUTATED_EVENT_NAME, globalEvents } from '../../globals/global-events';\nimport { signalSubscribersNow } from '../../live-query/cache/signalSubscribers';\n\nexport function dexieOpen (db: Dexie) {\n const state = db._state;\n const {indexedDB} = db._deps;\n if (state.isBeingOpened || db.idbdb)\n return state.dbReadyPromise.then(() => state.dbOpenError ?\n rejection (state.dbOpenError) :\n db);\n state.isBeingOpened = true;\n state.dbOpenError = null;\n state.openComplete = false;\n const openCanceller = state.openCanceller;\n let nativeVerToOpen = Math.round(db.verno * 10);\n let schemaPatchMode = false;\n\n function throwIfCancelled() {\n // If state.openCanceller object reference is replaced, it means db.close() has been called,\n // meaning this open flow should be cancelled.\n if (state.openCanceller !== openCanceller) throw new exceptions.DatabaseClosed('db.open() was cancelled');\n }\n \n // Function pointers to call when the core opening process completes.\n let resolveDbReady = state.dbReadyResolve,\n // upgradeTransaction to abort on failure.\n upgradeTransaction: (IDBTransaction | null) = null,\n wasCreated = false;\n\n const tryOpenDB = () => new Promise((resolve, reject) => {\n throwIfCancelled();\n // If no API, throw!\n if (!indexedDB) throw new exceptions.MissingAPI();\n const dbName = db.name;\n \n const req = state.autoSchema || !nativeVerToOpen ?\n indexedDB.open(dbName) :\n indexedDB.open(dbName, nativeVerToOpen);\n if (!req) throw new exceptions.MissingAPI(); // May happen in Safari private mode, see https://github.com/dfahlander/Dexie.js/issues/134\n req.onerror = eventRejectHandler(reject);\n req.onblocked = wrap(db._fireOnBlocked);\n req.onupgradeneeded = wrap (e => {\n upgradeTransaction = req.transaction;\n if (state.autoSchema && !db._options.allowEmptyDB) { // Unless an addon has specified db._allowEmptyDB, lets make the call fail.\n // Caller did not specify a version or schema. Doing that is only acceptable for opening alread existing databases.\n // If onupgradeneeded is called it means database did not exist. Reject the open() promise and make sure that we\n // do not create a new database by accident here.\n req.onerror = preventDefault; // Prohibit onabort error from firing before we're done!\n upgradeTransaction.abort(); // Abort transaction (would hope that this would make DB disappear but it doesnt.)\n // Close database and delete it.\n req.result.close();\n const delreq = indexedDB.deleteDatabase(dbName); // The upgrade transaction is atomic, and javascript is single threaded - meaning that there is no risk that we delete someone elses database here!\n delreq.onsuccess = delreq.onerror = wrap(() => {\n reject (new exceptions.NoSuchDatabase(`Database ${dbName} doesnt exist`));\n });\n } else {\n upgradeTransaction.onerror = eventRejectHandler(reject);\n const oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; // Safari 8 fix.\n wasCreated = oldVer < 1;\n db.idbdb = req.result;\n if (schemaPatchMode) {\n patchCurrentVersion(db, upgradeTransaction);\n }\n runUpgraders(db, oldVer / 10, upgradeTransaction, reject);\n }\n }, reject);\n \n req.onsuccess = wrap (() => {\n // Core opening procedure complete. Now let's just record some stuff.\n upgradeTransaction = null;\n const idbdb = db.idbdb = req.result;\n\n const objectStoreNames = slice(idbdb.objectStoreNames);\n if (objectStoreNames.length > 0) try {\n const tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly');\n if (state.autoSchema) readGlobalSchema(db, idbdb, tmpTrans);\n else {\n adjustToExistingIndexNames(db, db._dbSchema, tmpTrans);\n if (!verifyInstalledSchema(db, tmpTrans) && !schemaPatchMode) {\n console.warn(`Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this.`);\n idbdb.close();\n nativeVerToOpen = idbdb.version + 1;\n schemaPatchMode = true;\n return resolve (tryOpenDB()); // Try again with new version (nativeVerToOpen\n }\n }\n generateMiddlewareStacks(db, tmpTrans);\n } catch (e) {\n // Safari 8 may bail out if > 1 store names. However, this shouldnt be a showstopper. Issue #120.\n // BUGBUG: It will bail out anyway as of Dexie 3.\n // Should we support Safari 8 anymore? Believe all\n // Dexie users use the shim for that platform anyway?!\n // If removing Safari 8 support, go ahead and remove the safariMultiStoreFix() function\n // as well as absurd upgrade version quirk for Safari.\n }\n \n connections.push(db); // Used for emulating versionchange event on IE/Edge/Safari.\n \n idbdb.onversionchange = wrap(ev => {\n state.vcFired = true; // detect implementations that not support versionchange (IE/Edge/Safari)\n db.on(\"versionchange\").fire(ev);\n });\n \n idbdb.onclose = wrap(ev => {\n db.on(\"close\").fire(ev);\n });\n\n if (wasCreated) _onDatabaseCreated(db._deps, dbName);\n\n resolve();\n\n }, reject);\n }).catch(err => {\n switch (err?.name) {\n case \"UnknownError\":\n if (state.PR1398_maxLoop > 0) {\n // Bug in Chrome after clearing site data\n // https://github.com/dexie/Dexie.js/issues/543#issuecomment-1795736695\n state.PR1398_maxLoop--;\n console.warn('Dexie: Workaround for Chrome UnknownError on open()');\n return tryOpenDB();\n }\n break;\n case \"VersionError\":\n if (nativeVerToOpen > 0) {\n nativeVerToOpen = 0;\n return tryOpenDB();\n }\n break;\n }\n return Promise.reject(err);\n });\n \n // safari14Workaround = Workaround by jakearchibald for new nasty bug in safari 14.\n return Promise.race([\n openCanceller,\n (typeof navigator === 'undefined' ? Promise.resolve() : safari14Workaround()).then(tryOpenDB)\n ]).then(() => {\n // Before finally resolving the dbReadyPromise and this promise,\n // call and await all on('ready') subscribers:\n // Dexie.vip() makes subscribers able to use the database while being opened.\n // This is a must since these subscribers take part of the opening procedure.\n throwIfCancelled();\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>db.on.ready.fire(db.vip))).then(function fireRemainders() {\n if (state.onReadyBeingFired.length > 0) {\n // In case additional subscribers to db.on('ready') were added during the time db.on.ready.fire was executed.\n let remainders = state.onReadyBeingFired.reduce(promisableChain, nop);\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>remainders(db.vip))).then(fireRemainders)\n }\n });\n }).finally(()=>{\n if (state.openCanceller === openCanceller) {\n // Only modify state if not cancelled in the mean time.\n state.onReadyBeingFired = null;\n state.isBeingOpened = false;\n }\n }).catch(err => {\n state.dbOpenError = err; // Record the error. It will be used to reject further promises of db operations.\n try {\n // Did we fail within onupgradeneeded? Make sure to abort the upgrade transaction so it doesnt commit.\n upgradeTransaction && upgradeTransaction.abort();\n } catch { }\n if (openCanceller === state.openCanceller) {\n // Still in the same open flow - The error reason was not due to external call to db.close().\n // Make sure to call db.close() to finalize resources.\n db._close(); // Closes and resets idbdb, removes connections, resets dbReadyPromise and openCanceller so that a later db.open() is fresh.\n }\n return rejection (err);\n }).finally(()=>{\n state.openComplete = true;\n resolveDbReady(); // dbReadyPromise is resolved no matter if open() rejects or resolved. It's just to wake up waiters.\n }).then(()=>{\n if (wasCreated) {\n // Propagate full range on primary keys and indexes on all tables now that the DB is ready and opened,\n // and all upgraders and on('ready') subscribers have run.\n const everything: ObservabilitySet = {};\n db.tables.forEach(table => {\n table.schema.indexes.forEach(idx => {\n if (idx.name) everything[`idb://${db.name}/${table.name}/${idx.name}`] = new RangeSet(-Infinity, [[[]]]);\n });\n everything[`idb://${db.name}/${table.name}/`] = everything[`idb://${db.name}/${table.name}/:dels`] = new RangeSet(-Infinity, [[[]]]);\n });\n // Database was created. If another tab had it open when it was deleted and reopened, that tab must be updated now.\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME).fire(everything);\n // Wipe the cache and trigger optimistic queries:\n signalSubscribersNow(everything, true);\n }\n // Resolve the db.open() with the db instance.\n return db;\n });\n}\n","import { isArray } from '../functions/utils';\n\nexport function awaitIterator (iterator: Iterator) {\n var callNext = result => iterator.next(result),\n doThrow = error => iterator.throw(error),\n onSuccess = step(callNext),\n onError = step(doThrow);\n\n function step(getNext: (any)=>any) {\n return (val?) => {\n var next = getNext(val),\n value = next.value;\n\n return next.done ? value :\n (!value || typeof value.then !== 'function' ?\n isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) :\n value.then(onSuccess, onError));\n };\n }\n\n return step(callNext)();\n}\n","import { TransactionMode } from '../../public/types/transaction-mode';\nimport { errnames, exceptions } from '../../errors';\nimport { flatten, isAsyncFunction } from '../../functions/utils';\nimport { Dexie } from './dexie';\nimport { Transaction } from '../transaction';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise, {\n PSD,\n NativePromise,\n decrementExpectedAwaits,\n rejection,\n incrementExpectedAwaits\n} from '../../helpers/promise';\n\nexport function extractTransactionArgs(mode: TransactionMode, _tableArgs_, scopeFunc) {\n // Let table arguments be all arguments between mode and last argument.\n var i = arguments.length;\n if (i < 2) throw new exceptions.InvalidArgument(\"Too few arguments\");\n // Prevent optimzation killer (https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments)\n // and clone arguments except the first one into local var 'args'.\n var args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n // Let scopeFunc be the last argument and pop it so that args now only contain the table arguments.\n scopeFunc = args.pop();\n var tables = flatten(args); // Support using array as middle argument, or a mix of arrays and non-arrays.\n return [mode, tables, scopeFunc];\n}\n\nexport function enterTransactionScope(\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n parentTransaction: Transaction | undefined,\n scopeFunc: ()=>PromiseLike | any\n) {\n return Promise.resolve().then(() => {\n // Keep a pointer to last non-transactional PSD to use if someone calls Dexie.ignoreTransaction().\n const transless = PSD.transless || PSD;\n // Our transaction.\n //return new Promise((resolve, reject) => {\n const trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction);\n trans.explicit = true;\n // Let the transaction instance be part of a Promise-specific data (PSD) value.\n const zoneProps = {\n trans: trans,\n transless: transless\n };\n\n if (parentTransaction) {\n // Emulate transaction commit awareness for inner transaction (must 'commit' when the inner transaction has no more operations ongoing)\n trans.idbtrans = parentTransaction.idbtrans;\n } else {\n try {\n trans.create(); // Create the native transaction so that complete() or error() will trigger even if no operation is made upon it.\n // @ts-ignore Mark the idbtrans object with \"_explicit\". DBCore middleware won't have access to Dexie trans but will need to have this info.\n trans.idbtrans._explicit = true;\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db.close({disableAutoOpen: false});\n return db.open().then(() => enterTransactionScope(\n db,\n mode,\n storeNames,\n null,\n scopeFunc\n ));\n }\n return rejection(ex);\n }\n }\n\n // Support for native async await.\n const scopeFuncIsAsync = isAsyncFunction(scopeFunc);\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n\n let returnValue;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = scopeFunc.call(trans, trans);\n if (returnValue) {\n if (scopeFuncIsAsync) {\n // scopeFunc is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n } else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') {\n // scopeFunc returned an iterator with throw-support. Handle yield as await.\n returnValue = awaitIterator(returnValue);\n }\n }\n }, zoneProps);\n return (returnValue && typeof returnValue.then === 'function' ?\n // Promise returned. User uses promise-style transactions.\n Promise.resolve(returnValue).then(x => trans.active ?\n x // Transaction still active. Continue.\n : rejection(new exceptions.PrematureCommit(\n \"Transaction committed too early. See http://bit.ly/2kdckMn\")))\n // No promise returned. Wait for all outstanding promises before continuing. \n : promiseFollowed.then(() => returnValue)\n ).then(x => {\n // sub transactions don't react to idbtrans.oncomplete. We must trigger a completion:\n if (parentTransaction) trans._resolve();\n // wait for trans._completion\n // (if root transaction, this means 'complete' event. If sub-transaction, we've just fired it ourselves)\n return trans._completion.then(() => x);\n }).catch(e => {\n trans._reject(e); // Yes, above then-handler were maybe not called because of an unhandled rejection in scopeFunc!\n return rejection(e);\n });\n });\n}\n","import {\n DBCore,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryRequest,\n DBCoreRangeType,\n DBCoreOpenCursorRequest,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreTable,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { getKeyExtractor } from './get-key-extractor';\nimport { getKeyPathAlias } from './dbcore-indexeddb';\nimport { Middleware } from '../public/types/middleware';\n\ninterface VirtualIndex extends DBCoreIndex {\n /** True if this index is virtual, i.e. represents a compound index internally,\n * but makes it act as as having a subset of its keyPaths.\n */\n isVirtual: boolean;\n\n /** Number of keypaths that this index comprises. Can be 0..N.\n * Note: This is the length of the *virtual index*, not the real index.\n */\n keyLength: number;\n\n /** Number of popped keypaths from the real index.\n */\n keyTail: number;\n\n /** LowLevelIndex represents the actual IndexedDB index behind it */\n lowLevelIndex: DBCoreIndex;\n}\n\n// Move into some util:\nexport function pad (a: any | any[], value: any, count: number) {\n const result = isArray(a) ? a.slice() : [a];\n for (let i=0; i 0;\n const virtualIndex = {\n ...lowLevelIndex,\n name: isVirtual\n ? `${keyPathAlias}(virtual-from:${lowLevelIndex.name})`\n : lowLevelIndex.name,\n lowLevelIndex,\n isVirtual,\n keyTail,\n keyLength,\n extractKey: getKeyExtractor(keyPath),\n unique: !isVirtual && lowLevelIndex.unique\n };\n indexList.push(virtualIndex);\n if (!virtualIndex.isPrimaryKey) {\n allVirtualIndexes.push(virtualIndex);\n }\n if (keyLength > 1) {\n const virtualKeyPath = keyLength === 2 ?\n keyPath[0] : // This is a compound [a, b]. Add a virtual normal index a.\n keyPath.slice(0, keyLength - 1); // This is compound [a,b,c]. Add virtual compound [a,b].\n addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex);\n }\n indexList.sort((a,b) => a.keyTail - b.keyTail); // Shortest keyTail is the best one (represents real index)\n return virtualIndex;\n }\n \n const primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey);\n indexLookup[\":id\"] = [primaryKey];\n for (const index of schema.indexes) {\n addVirtualIndexes(index.keyPath, 0, index);\n }\n \n function findBestIndex(keyPath: null | string | string[]): VirtualIndex {\n const result = indexLookup[getKeyPathAlias(keyPath)];\n return result && result[0];\n }\n \n function translateRange (range: DBCoreKeyRange, keyTail: number): DBCoreKeyRange {\n return {\n type: range.type === DBCoreRangeType.Equal ?\n DBCoreRangeType.Range :\n range.type,\n lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail),\n lowerOpen: true, // doesn't matter true or false\n upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail),\n upperOpen: true // doesn't matter true or false\n };\n }\n \n function translateRequest (req: DBCoreQueryRequest): DBCoreQueryRequest;\n function translateRequest (req: DBCoreOpenCursorRequest): DBCoreOpenCursorRequest;\n function translateRequest (req: DBCoreCountRequest): DBCoreCountRequest {\n const index = req.query.index as VirtualIndex;\n return index.isVirtual ? {\n ...req,\n query: {\n index: index.lowLevelIndex,\n range: translateRange(req.query.range, index.keyTail)\n }\n } : req;\n }\n \n const result: DBCoreTable = {\n ...table,\n schema: {\n ...schema,\n primaryKey,\n indexes: allVirtualIndexes,\n getIndexByKeyPath: findBestIndex\n },\n\n count(req) {\n return table.count(translateRequest(req));\n }, \n \n query(req) {\n return table.query(translateRequest(req));\n },\n \n openCursor(req) {\n const {keyTail, isVirtual, keyLength} = (req.query.index as VirtualIndex);\n if (!isVirtual) return table.openCursor(req);\n \n function createVirtualCursor(cursor: DBCoreCursor) : DBCoreCursor {\n function _continue (key?: any) {\n key != null ?\n cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) :\n req.unique ?\n cursor.continue(\n cursor.key.slice(0, keyLength)\n .concat(req.reverse\n ? down.MIN_KEY\n : down.MAX_KEY, keyTail)\n ) :\n cursor.continue()\n }\n const virtualCursor = Object.create(cursor, {\n continue: {value: _continue},\n continuePrimaryKey: {\n value(key: any, primaryKey: any) {\n cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey);\n }\n },\n primaryKey: {\n get() {\n return cursor.primaryKey;\n }\n },\n key: {\n get() {\n const key = cursor.key as any[]; // A virtual cursor always operates on compound key\n return keyLength === 1 ?\n key[0] : // Cursor.key should not be an array.\n key.slice(0, keyLength); // Cursor.key should be first part of array.\n }\n },\n value: {\n get() {\n return cursor.value;\n }\n }\n });\n return virtualCursor;\n }\n \n return table.openCursor(translateRequest(req))\n .then(cursor => cursor && createVirtualCursor(cursor));\n }\n };\n return result;\n }\n }\n}\n\nexport const virtualIndexMiddleware : Middleware = {\n stack: \"dbcore\",\n name: \"VirtualIndexMiddleware\",\n level: 1,\n create: createVirtualIndexMiddleware\n};\n\n","import { keys, hasOwn, toStringTag } from './utils';\n\nexport function getObjectDiff(a: any, b: any, rv?: any, prfx?: string) {\n // Compares objects a and b and produces a diff object.\n rv = rv || {};\n prfx = prfx || '';\n keys(a).forEach((prop) => {\n if (!hasOwn(b, prop)) {\n // Property removed\n rv[prfx + prop] = undefined;\n } else {\n var ap = a[prop],\n bp = b[prop];\n if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) {\n const apTypeName = toStringTag(ap);\n const bpTypeName = toStringTag(bp);\n\n if (apTypeName !== bpTypeName) {\n rv[prfx + prop] = b[prop]; // Property changed to other type\n } else if (apTypeName === 'Object') {\n // Pojo objects (not Date, ArrayBuffer, Array etc). Go deep.\n getObjectDiff(ap, bp, rv, prfx + prop + '.');\n } else if (ap !== bp) {\n // Values differ.\n // Could have checked if Date, arrays or binary types have same\n // content here but I think that would be a suboptimation.\n // Prefer simplicity.\n rv[prfx + prop] = b[prop];\n }\n } else if (ap !== bp) rv[prfx + prop] = b[prop]; // Primitive value changed\n }\n });\n keys(b).forEach((prop) => {\n if (!hasOwn(a, prop)) {\n rv[prfx + prop] = b[prop]; // Property added\n }\n });\n return rv;\n}\n","import {\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreIndex,\n DBCoreTable,\n} from \"../public/types/dbcore\";\n\nexport function getEffectiveKeys (\n primaryKey: DBCoreIndex,\n req: (Pick & {keys?: any[]}) | Pick)\n{\n //const {outbound} = primaryKey;\n if (req.type === 'delete') return req.keys;\n return req.keys || req.values.map(primaryKey.extractKey)\n}\n","import {\n DBCore,\n DBCoreTable,\n DBCoreMutateResponse,\n DBCoreDeleteRangeRequest,\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreTransaction,\n DBCoreKeyRange\n} from \"../public/types/dbcore\";\nimport { nop } from '../functions/chaining-functions';\nimport { hasOwn, setByKeyPath } from '../functions/utils';\nimport { getObjectDiff } from \"../functions/get-object-diff\";\nimport { PSD } from '../helpers/promise';\n//import { LockableTableMiddleware } from '../dbcore/lockable-table-middleware';\nimport { getEffectiveKeys } from '../dbcore/get-effective-keys';\nimport { Middleware } from '../public/types/middleware';\nimport { Transaction } from '../classes/transaction';\n\nexport const hooksMiddleware: Middleware = {\n stack: \"dbcore\",\n name: \"HooksMiddleware\",\n level: 2,\n create: (downCore: DBCore) => ({\n ...downCore,\n table(tableName: string) {\n const downTable = downCore.table(tableName);\n const {primaryKey} = downTable.schema;\n \n const tableMiddleware: DBCoreTable = {\n ...downTable,\n mutate(req):Promise {\n const dxTrans = PSD.trans as Transaction;\n // Hooks can be transaction-bound. Need to grab them from transaction.table and not\n // db.table!\n const {deleting, creating, updating} = dxTrans.table(tableName).hook;\n switch (req.type) {\n case 'add':\n if (creating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'put':\n if (creating.fire === nop && updating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'delete':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'deleteRange':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>deleteRange(req), true);\n }\n // Any of the breaks above happened (no hooks) - do the default:\n return downTable.mutate(req);\n\n\n function addPutOrDelete(req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest): Promise {\n const dxTrans = PSD.trans;\n const keys = req.keys || getEffectiveKeys(primaryKey, req);\n if (!keys) throw new Error(\"Keys missing\");\n // Clone Request and set keys arg\n req = req.type === 'add' || req.type === 'put' ?\n {...req, keys} :\n {...req};\n if (req.type !== 'delete') req.values = [...req.values];\n if (req.keys) req.keys = [...req.keys];\n \n return getExistingValues(downTable, req, keys).then (existingValues => {\n const contexts = keys.map((key, i) => {\n const existingValue = existingValues[i];\n const ctx = { onerror: null, onsuccess: null };\n if (req.type === 'delete') {\n // delete operation\n deleting.fire.call(ctx, key, existingValue, dxTrans);\n } else if (req.type === 'add' || existingValue === undefined) {\n // The add() or put() resulted in a create\n const generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans);\n if (key == null && generatedPrimaryKey != null) {\n key = generatedPrimaryKey;\n req.keys[i] = key;\n if (!primaryKey.outbound) {\n setByKeyPath(req.values[i], primaryKey.keyPath, key);\n }\n }\n } else {\n // The put() operation resulted in an update\n const objectDiff = getObjectDiff(existingValue, req.values[i]);\n const additionalChanges = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans);\n if (additionalChanges) {\n const requestedValue = req.values[i];\n Object.keys(additionalChanges).forEach(keyPath => {\n if (hasOwn(requestedValue, keyPath)) {\n // keyPath is already present as a literal property of the object\n requestedValue[keyPath] = additionalChanges[keyPath];\n } else {\n // keyPath represents a new or existing path into the object\n setByKeyPath(requestedValue, keyPath, additionalChanges[keyPath]);\n }\n });\n }\n }\n return ctx;\n });\n return downTable.mutate(req).then(({failures, results, numFailures, lastResult}) => {\n for (let i=0; i {\n contexts.forEach(ctx => ctx.onerror && ctx.onerror(error));\n return Promise.reject(error);\n });\n });\n }\n \n function deleteRange(req: DBCoreDeleteRangeRequest): Promise {\n return deleteNextChunk(req.trans, req.range, 10000);\n }\n \n function deleteNextChunk(trans: DBCoreTransaction, range: DBCoreKeyRange, limit: number) {\n // Query what keys in the DB within the given range\n return downTable.query({trans, values: false, query: {index: primaryKey, range}, limit})\n .then(({result}) => {\n // Given a set of keys, bulk delete those using the same procedure as in addPutOrDelete().\n // This will make sure that deleting hook is called.\n return addPutOrDelete({type: 'delete', keys: result, trans}).then(res => {\n if (res.numFailures > 0) return Promise.reject(res.failures[0]);\n if (result.length < limit) {\n return {failures: [], numFailures: 0, lastResult: undefined} as DBCoreMutateResponse;\n } else {\n return deleteNextChunk(trans, {...range, lower: result[result.length - 1], lowerOpen: true}, limit);\n }\n });\n })\n }\n }\n };\n //const {lock, lockableMiddleware} = LockableTableMiddleware(tableMiddleware);\n\n return tableMiddleware;\n },\n }) as DBCore\n};\n\nfunction getExistingValues(\n table: DBCoreTable,\n req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest,\n effectiveKeys: any[]\n) {\n return req.type === \"add\"\n ? Promise.resolve([])\n : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: \"immutable\" });\n}\n","import { deepClone } from \"../functions/utils\";\nimport { DBCore } from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport Promise from \"../helpers/promise\";\nimport { cmp } from '../functions/cmp';\n\nexport function getFromTransactionCache(\n keys: readonly any[],\n cache: { keys: any[]; values: any[] } | undefined | null,\n clone?: boolean\n) {\n try {\n if (!cache) return null;\n if (cache.keys.length < keys.length) return null;\n const result: any[] = [];\n // Compare if the exact same order of keys was retrieved in same transaction:\n // Allow some cached keys to be omitted from provided set of keys\n // Use case: 1. getMany(keys) 2. update a subset of those 3. call put with the updated ones ==> middlewares should be able to find old values\n for (let i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) {\n if (cmp(cache.keys[i], keys[j]) !== 0) continue;\n result.push(clone ? deepClone(cache.values[i]) : cache.values[i]);\n ++j;\n }\n // If got all keys caller was looking for, return result.\n return result.length === keys.length ? result : null;\n } catch {\n return null;\n }\n}\n\nexport const cacheExistingValuesMiddleware: Middleware = {\n stack: \"dbcore\",\n level: -1,\n create: (core) => {\n return {\n table: (tableName) => {\n const table = core.table(tableName);\n return {\n ...table,\n getMany: (req) => {\n if (!req.cache) {\n return table.getMany(req);\n }\n const cachedResult = getFromTransactionCache(\n req.keys,\n req.trans[\"_cache\"],\n req.cache === \"clone\"\n );\n if (cachedResult) {\n return Promise.resolve(cachedResult);\n }\n return table.getMany(req).then((res) => {\n req.trans[\"_cache\"] = {\n keys: req.keys,\n values: req.cache === \"clone\" ? deepClone(res) : res,\n };\n return res;\n });\n },\n mutate: (req) => {\n // Invalidate cache on any mutate except \"add\" which can't change existing values:\n if (req.type !== \"add\") req.trans[\"_cache\"] = null;\n return table.mutate(req);\n },\n };\n },\n };\n },\n};\n","import { DBCore, DBCoreTable } from '../../public/types/dbcore';\nimport { LiveQueryContext } from '../live-query';\n\nexport function isCachableContext(ctx: LiveQueryContext, table: DBCoreTable) {\n return (\n ctx.trans.mode === 'readonly' &&\n !!ctx.subscr &&\n !ctx.trans.explicit &&\n ctx.trans.db._options.cache !== 'disabled' &&\n !table.schema.primaryKey.outbound\n );\n}\n\n","import { DBCoreCountRequest, DBCoreGetManyRequest, DBCoreGetRequest, DBCoreOpenCursorRequest, DBCoreQueryRequest } from '../../public/types/dbcore';\n\n\nexport function isCachableRequest(type: string, req: Partial) {\n switch (type) {\n case 'query':\n return req.values && !req.unique;\n case 'get':\n return false;\n case 'getMany':\n return false;\n case 'count':\n return false;\n case 'openCursor':\n return false;\n }\n}\n","import { LiveQueryContext } from \".\";\nimport { getFromTransactionCache } from \"../dbcore/cache-existing-values-middleware\";\nimport { getEffectiveKeys } from \"../dbcore/get-effective-keys\";\nimport { exceptions } from \"../errors\";\nimport { cmp } from \"../functions/cmp\";\nimport { isArray, keys } from \"../functions/utils\";\nimport { PSD } from \"../helpers/promise\";\nimport { RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport {\n DBCore,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreGetManyRequest,\n DBCoreGetRequest,\n DBCoreIndex,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreQueryResponse,\n DBCoreTable,\n DBCoreTableSchema,\n DBCoreTransaction,\n} from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport { isCachableContext } from \"./cache/is-cachable-context\";\nimport { isCachableRequest } from \"./cache/is-cachable-request\";\nimport { extendObservabilitySet } from \"./extend-observability-set\";\n\nexport const observabilityMiddleware: Middleware = {\n stack: \"dbcore\",\n level: 0,\n name: \"Observability\",\n create: (core) => {\n const dbName = core.schema.name;\n const FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY);\n\n return {\n ...core,\n transaction: (stores, mode, options) => {\n if (PSD.subscr && mode !== 'readonly') {\n throw new exceptions.ReadOnly(`Readwrite transaction in liveQuery context. Querier source: ${(PSD as LiveQueryContext).querier}`);\n }\n return core.transaction(stores, mode, options);\n },\n table: (tableName) => {\n const table = core.table(tableName);\n const { schema } = table;\n const { primaryKey, indexes } = schema;\n const { extractKey, outbound } = primaryKey;\n const indexesWithAutoIncPK = primaryKey.autoIncrement && indexes.filter(\n (index) => index.compound && (index.keyPath as string[]).includes(primaryKey.keyPath as string)\n );\n const tableClone: DBCoreTable = {\n ...table,\n mutate: (req) => {\n const trans = req.trans as DBCoreTransaction & {\n mutatedParts?: ObservabilitySet;\n };\n const mutatedParts = req.mutatedParts || (req.mutatedParts = {});\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (mutatedParts[part] ||\n (mutatedParts[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n\n const { type } = req;\n let [keys, newObjs] =\n req.type === \"deleteRange\"\n ? [req.range] // keys will be an DBCoreKeyRange object - transformed later on to a [from,to]-style range.\n : req.type === \"delete\"\n ? [req.keys] // keys known already here. newObjs will be undefined.\n : req.values.length < 50\n ? [getEffectiveKeys(primaryKey, req).filter(id => id), req.values] // keys except autoIncremented - they will be added later on.\n : []; // keys and newObjs will both be undefined - changeSpec will become true (changed for entire table)\n\n const oldCache = req.trans[\"_cache\"];\n\n // Add the mutated table and optionally keys to the mutatedTables set on the transaction.\n // Used by subscribers to txcommit event and for Collection.prototype.subscribe().\n if (isArray(keys)) {\n // keys is an array - delete, add or put of less than 50 rows.\n // Individual keys (add put or delete)\n pkRangeSet.addKeys(keys);\n // Only get oldObjs if they have been cached recently\n // (This applies to Collection.modify() only, but also if updating/deleting hooks have subscribers)\n const oldObjs = type === 'delete' || keys.length === newObjs.length ? getFromTransactionCache(keys, oldCache) : null;\n\n // Supply detailed values per index for both old and new objects:\n if (!oldObjs) {\n // add, delete or put and we don't know old values.\n // Indicate this in the \":dels\" part, for the sake of count() and primaryKeys() queries only!\n delsRangeSet.addKeys(keys);\n }\n if (oldObjs || newObjs) {\n // No matter if knowning oldObjs or not, track the indices if it's a put, add or delete.\n trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs);\n }\n } else if (keys) {\n // keys is a DBCoreKeyRange object. Transform it to [from,to]-style range.\n // As we can't know deleted index ranges, mark index-based subscriptions must trigger.\n const range = { from: keys.lower, to: keys.upper };\n delsRangeSet.add(range);\n // deleteRange. keys is a DBCoreKeyRange objects. Transform it to [from,to]-style range.\n pkRangeSet.add(range);\n } else {\n // Too many requests to record the details without slowing down write performance.\n // Let's just record a generic large range on primary key, the virtual :dels index and\n // all secondary indices:\n pkRangeSet.add(FULL_RANGE);\n delsRangeSet.add(FULL_RANGE);\n schema.indexes.forEach(idx => getRangeSet(idx.name).add(FULL_RANGE));\n }\n\n return table.mutate(req).then((res) => {\n // Merge the mutated parts from the request into the transaction's mutatedParts\n // now when the request went fine.\n if (keys && (req.type === 'add' || req.type === 'put')) {\n // Less than 50 requests (keys truthy) (otherwise we've added full range anyway)\n // autoincrement means we might not have got all keys until now\n pkRangeSet.addKeys(res.results);\n if (indexesWithAutoIncPK) {\n // Dexie Issue 1946:\n // If an auto-incremented primary key is part of a compound index,\n // we need to compute the resulting value of that index after inserting\n // the rows.\n indexesWithAutoIncPK.forEach(idx => {\n // Extract values of this compound index where primary key is not yet set:\n const idxVals = req.values.map(v => idx.extractKey(v));\n // Find the position of the primary key in the index:\n const pkPos = (idx.keyPath as string[]).findIndex(prop => prop === primaryKey.keyPath);\n // Update idxVals with the resulting primary keys to complete the index value:\n res.results!.forEach(pk => idxVals[pkPos] = pk);\n // Add the updated index to the rangeset:\n getRangeSet(idx.name).addKeys(idxVals);\n });\n }\n }\n trans.mutatedParts = extendObservabilitySet (\n trans.mutatedParts || {},\n mutatedParts\n );\n return res;\n });\n },\n };\n\n const getRange: (req: any) => [DBCoreIndex, RangeSet] = ({\n query: { index, range },\n }:\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest) => [\n index,\n new RangeSet(range.lower ?? core.MIN_KEY, range.upper ?? core.MAX_KEY),\n ];\n\n const readSubscribers: {[method in\n Exclude]: \n (req: any) => [DBCoreIndex, RangeSet]\n } = {\n get: (req) => [primaryKey, new RangeSet(req.key)],\n getMany: (req) => [primaryKey, new RangeSet().addKeys(req.keys)],\n count: getRange,\n query: getRange,\n openCursor: getRange,\n }\n\n keys(readSubscribers).forEach((method: 'get' | 'getMany' | 'count' | 'query' | 'openCursor') => {\n tableClone[method] = function (\n req:\n | DBCoreGetRequest\n | DBCoreGetManyRequest\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest\n ) {\n const { subscr } = PSD as LiveQueryContext;\n const isLiveQuery = !!subscr;\n let cachable = isCachableContext(PSD as LiveQueryContext, table) && isCachableRequest(method, req);\n const obsSet = cachable\n ? req.obsSet = {} // Implicit read transaction - track changes for this query only for the request's duration\n : subscr; // Explicit read transaction - track changes across entire live query\n\n if (isLiveQuery) {\n // Current zone want's to track all queries so they can be subscribed to.\n // (The query is executed within a \"liveQuery\" zone)\n // Check whether the query applies to a certain set of ranges:\n // Track what we should be observing:\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (obsSet[part] ||\n (obsSet[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n const [queriedIndex, queriedRanges] = readSubscribers[method](req);\n // A generic rule here: queried ranges should always be subscribed to.\n if (method === 'query' && queriedIndex.isPrimaryKey && !(req as DBCoreQueryRequest).values) {\n // A pure primay-key based Collection where only .primaryKeys() is requested. Don't wakeup on other changes than added or deleted primary keys within queried range.\n delsRangeSet.add(queriedRanges);\n } else {\n getRangeSet(queriedIndex.name || \"\").add(queriedRanges);\n }\n if (!queriedIndex.isPrimaryKey) {\n // Only count(), query() and openCursor() operates on secondary indices.\n // Since put(), delete() and deleteRange() mutations may happen without knowing oldObjs,\n // the mutate() method will be missing what secondary indices that are being deleted from\n // the subscribed range. We are working around this issue by recording all the resulting\n // primary keys from the queries. This only works for those kinds of queries where we can\n // derive the primary key from the result.\n // In this block we are accomplishing this using various strategies depending on the properties\n // of the query result.\n\n if (method === \"count\") {\n // We've got a problem! Delete and put mutations happen without known the oldObjs.\n // Those mutation could change the count.\n // Solution: Dedicated \":dels\" url represends a subscription to all mutations without oldObjs\n // (specially triggered in the mutators put(), delete() and deleteRange() when they don't know oldObject)\n delsRangeSet.add(FULL_RANGE);\n } else {\n // openCursor() or query()\n\n // Prepare a keysPromise in case the we're doing an IDBIndex.getAll() on a store with outbound keys.\n const keysPromise =\n method === \"query\" &&\n outbound &&\n (req as DBCoreQueryRequest).values &&\n table.query({\n ...(req as DBCoreQueryRequest),\n values: false,\n });\n\n return table[method].apply(this, arguments).then((res) => {\n if (method === \"query\") {\n if (outbound && (req as DBCoreQueryRequest).values) {\n // If keys are outbound, we can't use extractKey to map what keys to observe.\n // We've queried an index (like 'dateTime') on an outbound table\n // and retrieve a list of objects\n // from who we cannot know their primary keys.\n // \"Luckily\" though, we've prepared the keysPromise to assist us in exact this condition.\n return keysPromise.then(\n ({ result: resultingKeys }: DBCoreQueryResponse) => {\n pkRangeSet.addKeys(resultingKeys);\n return res;\n }\n );\n }\n // query() inbound values, keys or outbound keys. Secondary indexes only since\n // for primary keys we would only add results within the already registered range.\n const pKeys = (req as DBCoreQueryRequest).values\n ? (res as DBCoreQueryResponse).result.map(extractKey)\n : (res as DBCoreQueryResponse).result;\n if ((req as DBCoreQueryRequest).values) {\n // Subscribe to any mutation made on the returned keys,\n // so that we detect both deletions and updated properties.\n pkRangeSet.addKeys(pKeys);\n } else {\n // Subscribe only to mutations on the returned keys\n // in case the mutator was unable to know oldObjs.\n // If it has oldObj, the mutator won't put anything in \":dels\" because\n // it can more fine-grained put the exact removed and added index value in the correct\n // index range that we subscribe to in the queried range sets.\n // We don't load values so a change on a property outside our index will not\n // require us to re-execute the query.\n delsRangeSet.addKeys(pKeys);\n }\n } else if (method === \"openCursor\") {\n // Caller requests a cursor.\n // For the same reason as when method===\"query\", we only need to observe\n // those keys whose values are possibly used or rendered - which could\n // only happen on keys where they get the cursor's key, primaryKey or value.\n const cursor: DBCoreCursor | null = res;\n const wantValues = (req as DBCoreOpenCursorRequest).values;\n return (\n cursor &&\n Object.create(cursor, {\n key: {\n get() {\n delsRangeSet.addKey(cursor.primaryKey);\n return cursor.key;\n },\n },\n primaryKey: {\n get() {\n const pkey = cursor.primaryKey;\n delsRangeSet.addKey(pkey);\n return pkey;\n },\n },\n value: {\n get() {\n wantValues && pkRangeSet.addKey(cursor.primaryKey);\n return cursor.value;\n },\n },\n })\n );\n }\n return res;\n });\n }\n }\n }\n return table[method].apply(this, arguments);\n };\n });\n return tableClone;\n },\n };\n },\n};\n\nfunction trackAffectedIndexes(\n getRangeSet: (index: string) => RangeSet,\n schema: DBCoreTableSchema,\n oldObjs: readonly any[] | undefined,\n newObjs: readonly any[] | undefined\n) {\n function addAffectedIndex(ix: DBCoreIndex) {\n const rangeSet = getRangeSet(ix.name || \"\");\n function extractKey(obj: any) {\n return obj != null ? ix.extractKey(obj) : null;\n }\n const addKeyOrKeys = (key: any) => ix.multiEntry && isArray(key)\n // multiEntry and the old property was an array - add each array entry to the rangeSet:\n ? key.forEach(key => rangeSet.addKey(key))\n // Not multiEntry or the old property was not an array - add each array entry to the rangeSet:\n : rangeSet.addKey(key);\n\n (oldObjs || newObjs).forEach((_, i) => {\n const oldKey = oldObjs && extractKey(oldObjs[i]);\n const newKey = newObjs && extractKey(newObjs[i]);\n if (cmp(oldKey, newKey) !== 0) {\n // The index has changed. Add both old and new value of the index.\n if (oldKey != null) addKeyOrKeys(oldKey); // If oldKey is invalid key, addKey() will be a noop.\n if (newKey != null) addKeyOrKeys(newKey); // If newKey is invalid key, addKey() will be a noop.\n }\n });\n }\n schema.indexes.forEach(addAffectedIndex);\n}\n","import { delArrayItem, isArray } from '../../functions/utils';\nimport { TblQueryCache } from '../../public/types/cache';\nimport {\n DBCoreMutateRequest,\n DBCoreMutateResponse,\n} from '../../public/types/dbcore';\n\nexport function adjustOptimisticFromFailures(\n tblCache: TblQueryCache,\n req: DBCoreMutateRequest,\n res: DBCoreMutateResponse\n): DBCoreMutateRequest {\n if (res.numFailures === 0) return req;\n if (req.type === 'deleteRange') {\n // numFailures > 0 means the deleteRange operation failed in its whole.\n return null;\n }\n\n const numBulkOps = req.keys\n ? req.keys.length\n : 'values' in req && req.values\n ? req.values.length\n : 1;\n if (res.numFailures === numBulkOps) {\n // Same number of failures as the number of ops. This means that all ops failed.\n return null;\n }\n\n const clone: DBCoreMutateRequest = { ...req };\n\n if (isArray(clone.keys)) {\n clone.keys = clone.keys.filter((_, i) => !(i in res.failures));\n }\n if ('values' in clone && isArray(clone.values)) {\n clone.values = clone.values.filter((_, i) => !(i in res.failures));\n }\n return clone;\n}\n","import { cmp } from '../../functions/cmp';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function isAboveLower(key: IndexableType, range: DBCoreKeyRange) {\n return range.lower === undefined\n ? true // lower is less than anything because it is undefined\n : range.lowerOpen\n ? cmp(key, range.lower) > 0 // lowerOpen: Exclude lower bound\n : cmp(key, range.lower) >= 0; // !lowerOpen: Include lower bound\n}\n\nexport function isBelowUpper(key: IndexableType, range: DBCoreKeyRange) {\n return range.upper === undefined\n ? true // upper is greater than anything because it is undefined\n : range.upperOpen\n ? cmp(key, range.upper) < 0 // upperOpen: Exclude upper bound\n : cmp(key, range.upper) <= 0; // !upperOpen: Include upper bound\n}\n\nexport function isWithinRange(key: IndexableType, range: DBCoreKeyRange) {\n return isAboveLower(key, range) && isBelowUpper(key, range);\n}\n","import { cmp } from '../../functions/cmp';\nimport { deepClone, isArray } from '../../functions/utils';\nimport { RangeSet, rangesOverlap } from '../../helpers/rangeset';\nimport { CacheEntry } from '../../public/types/cache';\nimport {\n DBCoreIndex,\n DBCoreMutateRequest,\n DBCoreQueryRequest,\n DBCoreTable,\n} from '../../public/types/dbcore';\nimport { isWithinRange } from './is-within-range';\n\nexport function applyOptimisticOps(\n result: any[],\n req: DBCoreQueryRequest,\n ops: DBCoreMutateRequest[] | undefined,\n table: DBCoreTable,\n cacheEntry: CacheEntry,\n immutable: boolean\n): any[] {\n if (!ops || ops.length === 0) return result;\n const index = req.query.index;\n const { multiEntry } = index;\n const queryRange = req.query.range;\n const primaryKey = table.schema.primaryKey;\n const extractPrimKey = primaryKey.extractKey!;\n const extractIndex = index.extractKey!;\n const extractLowLevelIndex = (index.lowLevelIndex || index).extractKey!;\n\n let finalResult = ops.reduce((result, op) => {\n let modifedResult = result;\n const includedValues =\n op.type === 'add' || op.type === 'put'\n ? op.values.filter((v) => {\n const key = extractIndex(v);\n return multiEntry && isArray(key) // multiEntry index work like plain index unless key is array\n ? key.some((k) => isWithinRange(k, queryRange)) // multiEntry and array key\n : isWithinRange(key, queryRange); // multiEntry but not array key\n }).map(v => {\n v = deepClone(v);// v might come from user so we can't just freeze it.\n if (immutable) Object.freeze(v);\n return v;\n })\n : [];\n switch (op.type) {\n case 'add':\n modifedResult = result.concat(\n req.values\n ? includedValues\n : includedValues.map((v) => extractPrimKey(v))\n );\n break;\n case 'put':\n const keySet = new RangeSet().addKeys(\n op.values.map((v) => extractPrimKey(v))\n );\n modifedResult = result\n .filter((item) => {\n const key = req.values ? extractPrimKey(item) : item;\n return !rangesOverlap(new RangeSet(key), keySet);\n })\n .concat(\n req.values\n ? includedValues\n : includedValues.map((v) => extractPrimKey(v))\n );\n break;\n case 'delete':\n const keysToDelete = new RangeSet().addKeys(op.keys);\n modifedResult = result.filter((item) => {\n const key = req.values ? extractPrimKey(item) : item;\n return !rangesOverlap(new RangeSet(key), keysToDelete);\n });\n\n break;\n case 'deleteRange':\n const range = op.range;\n modifedResult = result.filter((item) => !isWithinRange(extractPrimKey(item), range));\n break;\n }\n return modifedResult;\n }, result);\n\n // If no changes were made, we can return the original result.\n if (finalResult === result) return result;\n\n // Sort the result on sortIndex:\n finalResult.sort((a, b) =>\n cmp(extractLowLevelIndex(a), extractLowLevelIndex(b)) ||\n cmp(extractPrimKey(a), extractPrimKey(b))\n );\n\n // If we have a limit we need to respect it:\n if (req.limit && req.limit < Infinity) {\n if (finalResult.length > req.limit) {\n finalResult.length = req.limit; // Cut of any extras after sorting correctly.\n } else if (result.length === req.limit && finalResult.length < req.limit) {\n // We're missing some items because of the limit. We need to add them back.\n // The easiest way is to mark the cache entry as dirty, which will cause\n // it to be requeried after the write-transaction successfully completes.\n cacheEntry.dirty = true;\n }\n }\n return immutable ? Object.freeze(finalResult) as any[] : finalResult;\n}\n","import { cmp } from '../../functions/cmp';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function areRangesEqual(r1: DBCoreKeyRange, r2: DBCoreKeyRange) {\n return (\n cmp(r1.lower, r2.lower) === 0 &&\n cmp(r1.upper, r2.upper) === 0 &&\n !!r1.lowerOpen === !!r2.lowerOpen &&\n !!r1.upperOpen === !!r2.upperOpen\n );\n}\n","import { cmp } from '../../functions/cmp';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function compareLowers(lower1: any, lower2: any, lowerOpen1: boolean, lowerOpen2: boolean) {\n if (lower1 === undefined) return lower2 !== undefined ? -1 : 0;\n if (lower2 === undefined) return 1; // since lower1 !== undefined\n const c = cmp(lower1, lower2);\n if (c === 0) {\n if (lowerOpen1 && lowerOpen2) return 0;\n if (lowerOpen1) return 1\n if (lowerOpen2) return -1;\n }\n return c;\n}\n\nexport function compareUppers(upper1: any, upper2: any, upperOpen1: boolean, upperOpen2: boolean) {\n if (upper1 === undefined) return upper2 !== undefined ? 1 : 0;\n if (upper2 === undefined) return -1; // since upper1 !== undefined\n const c = cmp(upper1, upper2);\n if (c === 0) {\n if (upperOpen1 && upperOpen2) return 0;\n if (upperOpen1) return -1\n if (upperOpen2) return 1;\n }\n return c;\n}\n\nexport function isSuperRange(r1: DBCoreKeyRange, r2: DBCoreKeyRange) {\n return (\n compareLowers(r1.lower, r2.lower, r1.lowerOpen, r2.lowerOpen) <= 0 &&\n compareUppers(r1.upper, r2.upper, r1.upperOpen, r2.upperOpen) >= 0\n );\n}","import { CacheEntry, TblQueryCache } from '../../public/types/cache';\nimport {\n DBCoreCountRequest,\n DBCoreQueryRequest,\n} from '../../public/types/dbcore';\nimport { areRangesEqual } from './are-ranges-equal';\nimport { cache } from './cache';\nimport { isSuperRange } from './is-super-range';\n\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'query',\n req: DBCoreQueryRequest\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]];\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'count',\n req: DBCoreCountRequest\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]];\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'query' | 'count',\n req: Partial & Partial\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]] {\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (!tblCache) return [];\n const queries = tblCache.queries[type];\n if (!queries) return [null, false, tblCache, null];\n const indexName = req.query ? req.query.index.name : null;\n const entries = queries[indexName || ''];\n if (!entries) return [null, false, tblCache, null];\n\n switch (type) {\n case 'query':\n const equalEntry = entries.find(\n (entry) =>\n (entry.req as DBCoreQueryRequest).limit === req.limit &&\n (entry.req as DBCoreQueryRequest).values === req.values &&\n areRangesEqual(entry.req.query.range, req.query.range)\n );\n if (equalEntry)\n return [\n equalEntry,\n true, // exact match\n tblCache,\n entries,\n ];\n const superEntry = entries.find((entry) => {\n const limit = 'limit' in entry.req ? entry.req.limit : Infinity;\n return (\n limit >= req.limit &&\n (req.values ? (entry.req as DBCoreQueryRequest).values : true) &&\n isSuperRange(entry.req.query.range, req.query.range)\n );\n });\n return [superEntry, false, tblCache, entries];\n case 'count':\n const countQuery = entries.find((entry) =>\n areRangesEqual(entry.req.query.range, req.query.range)\n );\n return [countQuery, !!countQuery, tblCache, entries];\n }\n}\n","import { delArrayItem } from \"../../functions/utils\";\nimport { CacheEntry } from \"../../public/types/cache\";\n\nexport function subscribeToCacheEntry(cacheEntry: CacheEntry, container: CacheEntry[], requery: ()=>void, signal: AbortSignal) {\n cacheEntry.subscribers.add(requery);\n signal.addEventListener(\"abort\", () => {\n cacheEntry.subscribers.delete(requery);\n if (cacheEntry.subscribers.size === 0) {\n enqueForDeletion(cacheEntry, container);\n }\n });\n}\n\n\nfunction enqueForDeletion(cacheEntry: CacheEntry, container: CacheEntry[]) {\n setTimeout(() => {\n if (cacheEntry.subscribers.size === 0) { // Still empty (no new subscribers readded after grace time)\n delArrayItem(container, cacheEntry);\n }\n }, 3000);\n}\n","import { LiveQueryContext } from '..';\nimport type { Transaction } from '../../classes/transaction';\nimport { getEffectiveKeys } from '../../dbcore/get-effective-keys';\nimport { deepClone, delArrayItem, setByKeyPath } from '../../functions/utils';\nimport DexiePromise, { PSD } from '../../helpers/promise';\nimport { ObservabilitySet } from '../../public/types/db-events';\nimport {\n DBCore, DBCoreMutateRequest, DBCoreMutateResponse, DBCoreQueryRequest,\n DBCoreQueryResponse\n} from '../../public/types/dbcore';\nimport { Middleware } from '../../public/types/middleware';\nimport { obsSetsOverlap } from '../obs-sets-overlap';\nimport { adjustOptimisticFromFailures } from './adjust-optimistic-request-from-failures';\nimport { applyOptimisticOps } from './apply-optimistic-ops';\nimport { cache } from './cache';\nimport { findCompatibleQuery } from './find-compatible-query';\nimport { isCachableContext } from './is-cachable-context';\nimport { isCachableRequest } from './is-cachable-request';\nimport { signalSubscribersLazily } from './signalSubscribers';\nimport { subscribeToCacheEntry } from './subscribe-cachentry';\n\nexport const cacheMiddleware: Middleware = {\n stack: 'dbcore',\n level: 0,\n name: 'Cache',\n create: (core) => {\n const dbName = core.schema.name;\n const coreMW: DBCore = {\n ...core,\n transaction: (stores, mode, options) => {\n const idbtrans = core.transaction(\n stores,\n mode,\n options\n ) as IDBTransaction & {\n mutatedParts?: ObservabilitySet;\n _explicit?: boolean;\n };\n // Maintain TblQueryCache.ops array when transactions commit or abort\n if (mode === 'readwrite') {\n const ac = new AbortController();\n const { signal } = ac;\n const endTransaction = (wasCommitted: boolean) => () => {\n ac.abort();\n if (mode === 'readwrite') {\n // Collect which subscribers to notify:\n const affectedSubscribers = new Set<()=>void>();\n\n // Go through all tables in transaction and check if they have any optimistic updates\n for (const storeName of stores) {\n const tblCache = cache[`idb://${dbName}/${storeName}`];\n if (tblCache) {\n const table = core.table(storeName);\n // Pick optimistic ops that are part of this transaction\n const ops = tblCache.optimisticOps.filter(\n (op) => op.trans === idbtrans\n );\n // Transaction was marked as _explicit in enterTransactionScope(), transaction-helpers.ts.\n if (idbtrans._explicit && wasCommitted && idbtrans.mutatedParts) {\n // Invalidate all queries that overlap with the mutated parts and signal their subscribers\n for (const entries of Object.values(\n tblCache.queries.query\n )) {\n for (const entry of entries.slice()) {\n if (obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)) {\n delArrayItem(entries, entry); // Remove the entry from the cache so it can be refreshed\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n }\n }\n }\n } else if (ops.length > 0) {\n // Remove them from the optimisticOps array\n tblCache.optimisticOps = tblCache.optimisticOps.filter(\n (op) => op.trans !== idbtrans\n );\n // Commit or abort the optimistic updates\n for (const entries of Object.values(\n tblCache.queries.query\n )) {\n for (const entry of entries.slice()) {\n if (\n entry.res != null && // if entry.promise but not entry.res, we're fine. Query will resume now and get the result.\n idbtrans.mutatedParts/* &&\n obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)*/\n ) {\n if (wasCommitted && !entry.dirty) {\n const freezeResults = Object.isFrozen(entry.res);\n const modRes = applyOptimisticOps(\n entry.res as any[],\n entry.req,\n ops,\n table,\n entry,\n freezeResults\n );\n if (entry.dirty) {\n // Found out at this point that the entry is dirty - not to rely on!\n delArrayItem(entries, entry);\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n } else if (modRes !== entry.res) {\n entry.res = modRes;\n // Update promise\n entry.promise = DexiePromise.resolve({result: modRes} satisfies DBCoreQueryResponse);\n \n // No need to notify subscribers. They already have this value.\n // We have just updated the value of the cache without having to\n // requery the database - because we know the result for this\n // query based on computing the operations and applying them\n // to the previous result.\n }\n } else {\n if (entry.dirty) {\n // If the entry is dirty we need to get rid of it so that\n // a new entry will be created when the query is run again.\n delArrayItem(entries, entry);\n }\n // If we're not committing, we need to notify subscribers that the\n // optimistic updates are no longer valid.\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n }\n }\n }\n }\n }\n }\n }\n affectedSubscribers.forEach((requery) => requery());\n }\n };\n idbtrans.addEventListener('abort', endTransaction(false), {\n signal,\n });\n idbtrans.addEventListener('error', endTransaction(false), {\n signal,\n });\n idbtrans.addEventListener('complete', endTransaction(true), {\n signal,\n });\n }\n return idbtrans;\n },\n table(tableName: string) {\n const downTable = core.table(tableName);\n const primKey = downTable.schema.primaryKey;\n const tableMW = {\n ...downTable,\n mutate(req: DBCoreMutateRequest): Promise {\n const trans = PSD.trans as Transaction;\n if (\n primKey.outbound || // Non-inbound tables are harded to apply optimistic updates on because we can't know primary key of results\n trans.db._options.cache === 'disabled' || // User has opted-out from caching\n trans.explicit // It's an explicit write transaction being made. Don't affect cache until transaction commits.\n ) {\n // Just forward the request to the core.\n return downTable.mutate(req);\n }\n // Find the TblQueryCache for this table:\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (!tblCache) return downTable.mutate(req);\n\n const promise = downTable.mutate(req);\n if ((req.type === 'add' || req.type === 'put') && (req.values.length >= 50 || getEffectiveKeys(primKey, req).some(key => key == null))) {\n // There are some autoIncremented keys not set yet. Need to wait for completion before we can reliably enqueue the operation.\n // (or there are too many objects so we lazy out to avoid performance bottleneck for large bulk inserts)\n promise.then((res) => { // We need to extract result keys and generate cloned values with the keys set (so that applyOptimisticOps can work)\n // But we have a problem! The req.mutatedParts is still not complete so we have to actively add the keys to the unsignaledParts set manually.\n const reqWithResolvedKeys = {\n ...req,\n values: req.values.map((value, i) => {\n const valueWithKey = primKey.keyPath?.includes('.')\n ? deepClone(value)\n : {\n ...value,\n };\n setByKeyPath(valueWithKey, primKey.keyPath, res.results![i]);\n return valueWithKey;\n })\n };\n const adjustedReq = adjustOptimisticFromFailures(tblCache, reqWithResolvedKeys, res);\n tblCache.optimisticOps.push(adjustedReq);\n // Signal subscribers after the observability middleware has complemented req.mutatedParts with the new keys.\n // We must queue the task so that we get the req.mutatedParts updated by observability middleware first.\n // If we refactor the dependency between observability middleware and this middleware we might not need to queue the task.\n queueMicrotask(()=>req.mutatedParts && signalSubscribersLazily(req.mutatedParts)); // Reason for double laziness: in user awaits put and then does another put, signal once.\n });\n } else {\n // Enque the operation immediately\n tblCache.optimisticOps.push(req);\n // Signal subscribers that there are mutated parts\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts);\n promise.then((res) => {\n if (res.numFailures > 0) {\n // In case the operation failed, we need to remove it from the optimisticOps array.\n delArrayItem(tblCache.optimisticOps, req);\n const adjustedReq = adjustOptimisticFromFailures(tblCache, req, res);\n if (adjustedReq) {\n tblCache.optimisticOps.push(adjustedReq);\n }\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts); // Signal the rolling back of the operation.\n }\n });\n promise.catch(()=> {\n // In case the operation failed, we need to remove it from the optimisticOps array.\n delArrayItem(tblCache.optimisticOps, req);\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts); // Signal the rolling back of the operation.\n });\n }\n return promise;\n },\n query(req: DBCoreQueryRequest): Promise {\n if (!isCachableContext(PSD, downTable) || !isCachableRequest(\"query\", req)) return downTable.query(req);\n const freezeResults =\n (PSD as LiveQueryContext).trans?.db._options.cache === 'immutable';\n const { requery, signal } = PSD as LiveQueryContext;\n let [cacheEntry, exactMatch, tblCache, container] =\n findCompatibleQuery(dbName, tableName, 'query', req);\n if (cacheEntry && exactMatch) {\n cacheEntry.obsSet = req.obsSet!; // So that optimistic result is monitored.\n // How? - because observability-middleware will track result where optimistic\n // mutations are applied and record it in the cacheEntry.\n // TODO: CHANGE THIS! The difference is resultKeys only.\n // Wanted behavior:\n // * cacheEntry obsSet should represent the obsSet without optimistic updates (so it can be checked when merging ops in tx commit)\n // * cacheEntry optimisticObsSet should represent the obsSet with current optimistic updates. It should be updated when adding an op\n // by adding the primary keys of the put/add/delete operation to the set.\n // * observability-middleware should stop recording req.obsSet when a cache entry exact match is found because it won't be used anyway.\n // I'm thinking of merging observability-middleware with cache-middleware into one single middleware because the dependencies are too\n // tight between them.\n } else {\n // --> TODO here: If not exact match, check if we have a superset to extract\n // the data from.\n\n // No cached result found. We need to query the database and cache the result.\n const promise = downTable.query(req).then((res) => {\n // Freeze or clone results\n const result = res.result;\n if (cacheEntry) cacheEntry.res = result;\n if (freezeResults) {\n // For performance reasons don't deep freeze.\n // Only freeze the top-level array and its items.\n // This is good enough to teach users that the result must be treated as immutable\n // without enforcing it recursively on the entire result (which is not even possible\n // for things like Date objects and typed arrays)\n for (let i = 0, l = result.length; i < l; ++i) {\n Object.freeze(result[i]);\n }\n Object.freeze(result);\n } else {\n // If not frozen, we need to clone the result to avoid user mutating the cache\n // When we do this, user's must feel conformable with the fact that the result\n // can be mutated deeply - user is not expected to have any respect for immutability.\n res.result = deepClone(result);\n }\n return res;\n }).catch(error => {\n // In case the query operation failed, we need to remove it from the cache\n // so that subsequent calls does not get the same error but re-evaluate\n // the query.\n if (container && cacheEntry) delArrayItem(container, cacheEntry);\n return Promise.reject(error);\n });\n cacheEntry = {\n obsSet: req.obsSet!,\n promise,\n subscribers: new Set(),\n type: 'query',\n req,\n dirty: false,\n };\n if (container) {\n container.push(cacheEntry);\n } else {\n container = [cacheEntry];\n if (!tblCache) {\n tblCache = cache[`idb://${dbName}/${tableName}`] = {\n queries: {\n query: {},\n count: {},\n },\n objs: new Map(),\n optimisticOps: [],\n unsignaledParts: {}\n };\n }\n tblCache.queries.query[req.query.index.name || ''] = container;\n }\n }\n subscribeToCacheEntry(cacheEntry, container!, requery, signal);\n return cacheEntry.promise.then((res: DBCoreQueryResponse) => {\n return {\n result: applyOptimisticOps(\n res.result,\n req,\n tblCache?.optimisticOps,\n downTable,\n cacheEntry!,\n freezeResults\n ) as any[], // readonly any[]\n };\n });\n },\n };\n return tableMW;\n },\n };\n return coreMW;\n },\n};\n\n\n","import { type Dexie } from \"../classes/dexie\";\nimport { type Table } from \"../classes/table\";\nimport { type Transaction } from \"../classes/transaction\";\n\nexport function vipify(\n target: T,\n vipDb: Dexie\n): T {\n return new Proxy(target, {\n get (target, prop, receiver) {\n // The \"db\" prop of the table or transaction is the only one we need to\n // override. The rest of the props can be accessed from the original\n // object.\n if (prop === 'db') return vipDb;\n return Reflect.get(target, prop, receiver);\n }\n });\n}\n","// Import types from the public API\nimport { Dexie as IDexie } from \"../../public/types/dexie\";\nimport { DexieOptions, DexieConstructor } from \"../../public/types/dexie-constructor\";\nimport { DbEvents } from \"../../public/types/db-events\";\n//import { PromiseExtended, PromiseExtendedConstructor } from '../../public/types/promise-extended';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from \"../../public/types/table-schema\";\nimport { DbSchema } from '../../public/types/db-schema';\n\n// Internal imports\nimport { Table, TableConstructor, createTableConstructor } from \"../table\";\nimport { Collection, CollectionConstructor, createCollectionConstructor } from '../collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { WhereClauseConstructor, createWhereClauseConstructor } from '../where-clause/where-clause-constructor';\nimport { Transaction } from '../transaction';\nimport { TransactionConstructor, createTransactionConstructor } from '../transaction/transaction-constructor';\nimport { Version } from \"../version/version\";\nimport { VersionConstructor, createVersionConstructor } from '../version/version-constructor';\n\n// Other imports...\nimport { DexieEventSet } from '../../public/types/dexie-event-set';\nimport { DexieExceptionClasses } from '../../public/types/errors';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\nimport Promise, { PSD, globalPSD } from '../../helpers/promise';\nimport { extend, override, keys, hasOwn } from '../../functions/utils';\nimport Events from '../../helpers/Events';\nimport { maxString, connections, READONLY, READWRITE } from '../../globals/constants';\nimport { getMaxKey } from '../../functions/quirks';\nimport { exceptions } from '../../errors';\nimport { lowerVersionFirst } from '../version/schema-helpers';\nimport { dexieOpen } from './dexie-open';\nimport { wrap } from '../../helpers/promise';\nimport { _onDatabaseDeleted } from '../../helpers/database-enumerator';\nimport { eventRejectHandler } from '../../functions/event-wrappers';\nimport { extractTransactionArgs, enterTransactionScope } from './transaction-helpers';\nimport { TransactionMode } from '../../public/types/transaction-mode';\nimport { rejection } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { DBCore } from '../../public/types/dbcore';\nimport { Middleware, DexieStacks } from '../../public/types/middleware';\nimport { virtualIndexMiddleware } from '../../dbcore/virtual-index-middleware';\nimport { hooksMiddleware } from '../../hooks/hooks-middleware';\nimport { IndexableType } from '../../public';\nimport { observabilityMiddleware } from '../../live-query/observability-middleware';\nimport { cacheExistingValuesMiddleware } from '../../dbcore/cache-existing-values-middleware';\nimport { cacheMiddleware } from \"../../live-query/cache/cache-middleware\";\nimport { vipify } from \"../../helpers/vipify\";\n\nexport interface DbReadyState {\n dbOpenError: any;\n isBeingOpened: boolean;\n onReadyBeingFired: undefined | Function[];\n openComplete: boolean;\n dbReadyResolve: () => void;\n dbReadyPromise: Promise;\n cancelOpen: (reason?: Error) => void;\n openCanceller: Promise & { _stackHolder?: Error };\n autoSchema: boolean;\n vcFired?: boolean;\n PR1398_maxLoop?: number;\n autoOpen?: boolean;\n}\n\nexport class Dexie implements IDexie {\n _options: DexieOptions;\n _state: DbReadyState;\n _versions: Version[];\n _storeNames: string[];\n _deps: DexieDOMDependencies;\n _allTables: { [name: string]: Table; };\n _createTransaction: (this: Dexie, mode: IDBTransactionMode, storeNames: ArrayLike, dbschema: { [tableName: string]: TableSchema; }, parentTransaction?: Transaction) => Transaction;\n _dbSchema: { [tableName: string]: TableSchema; };\n _hasGetAll?: boolean;\n _maxKey: IndexableType;\n _fireOnBlocked: (ev: Event) => void;\n _middlewares: {[StackName in keyof DexieStacks]?: Middleware[]} = {};\n _vip?: boolean;\n _novip: Dexie;// db._novip is to escape to orig db from db.vip.\n core: DBCore;\n\n name: string;\n verno: number = 0;\n idbdb: IDBDatabase | null;\n vip: Dexie;\n on: DbEvents;\n\n Table: TableConstructor;\n WhereClause: WhereClauseConstructor;\n Collection: CollectionConstructor;\n Version: VersionConstructor;\n Transaction: TransactionConstructor;\n static disableBfCache?: boolean;\n\n constructor(name: string, options?: DexieOptions) {\n const deps = (Dexie as any as DexieConstructor).dependencies;\n this._options = options = {\n // Default Options\n addons: (Dexie as any as DexieConstructor).addons, // Pick statically registered addons by default\n autoOpen: true, // Don't require db.open() explicitely.\n // Default DOM dependency implementations from static prop.\n indexedDB: deps.indexedDB, // Backend IndexedDB api. Default to browser env.\n IDBKeyRange: deps.IDBKeyRange, // Backend IDBKeyRange api. Default to browser env.\n cache: 'cloned', // Default to cloned for backward compatibility. For best performance and least memory consumption use 'immutable'.\n ...options\n }; \n this._deps = {\n indexedDB: options.indexedDB as IDBFactory,\n IDBKeyRange: options.IDBKeyRange as typeof IDBKeyRange\n };\n const {\n addons,\n } = options;\n this._dbSchema = {};\n this._versions = [];\n this._storeNames = [];\n this._allTables = {};\n this.idbdb = null;\n this._novip = this;\n const state: DbReadyState = {\n dbOpenError: null,\n isBeingOpened: false,\n onReadyBeingFired: null,\n openComplete: false,\n dbReadyResolve: nop,\n dbReadyPromise: null as Promise,\n cancelOpen: nop,\n openCanceller: null as Promise,\n autoSchema: true,\n PR1398_maxLoop: 3,\n autoOpen: options.autoOpen,\n };\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n this._state = state;\n this.name = name;\n this.on = Events(this, \"populate\", \"blocked\", \"versionchange\", \"close\", { ready: [promisableChain, nop] }) as DbEvents;\n this.on.ready.subscribe = override(this.on.ready.subscribe, subscribe => {\n return (subscriber, bSticky) => {\n (Dexie as any as DexieConstructor).vip(() => {\n const state = this._state;\n if (state.openComplete) {\n // Database already open. Call subscriber asap.\n if (!state.dbOpenError) Promise.resolve().then(subscriber);\n // bSticky: Also subscribe to future open sucesses (after close / reopen) \n if (bSticky) subscribe(subscriber);\n } else if (state.onReadyBeingFired) {\n // db.on('ready') subscribers are currently being executed and have not yet resolved or rejected\n state.onReadyBeingFired.push(subscriber);\n if (bSticky) subscribe(subscriber);\n } else {\n // Database not yet open. Subscribe to it.\n subscribe(subscriber);\n // If bSticky is falsy, make sure to unsubscribe subscriber when fired once.\n const db = this;\n if (!bSticky) subscribe(function unsubscribe() {\n db.on.ready.unsubscribe(subscriber);\n db.on.ready.unsubscribe(unsubscribe);\n });\n }\n });\n }\n });\n\n // Create derived classes bound to this instance of Dexie:\n this.Collection = createCollectionConstructor(this);\n this.Table = createTableConstructor(this);\n this.Transaction = createTransactionConstructor(this);\n this.Version = createVersionConstructor(this);\n this.WhereClause = createWhereClauseConstructor(this);\n\n // Default subscribers to \"versionchange\" and \"blocked\".\n // Can be overridden by custom handlers. If custom handlers return false, these default\n // behaviours will be prevented.\n this.on(\"versionchange\", ev => {\n // Default behavior for versionchange event is to close database connection.\n // Caller can override this behavior by doing db.on(\"versionchange\", function(){ return false; });\n // Let's not block the other window from making it's delete() or open() call.\n // NOTE! This event is never fired in IE,Edge or Safari.\n if (ev.newVersion > 0)\n console.warn(`Another connection wants to upgrade database '${this.name}'. Closing db now to resume the upgrade.`);\n else\n console.warn(`Another connection wants to delete database '${this.name}'. Closing db now to resume the delete request.`);\n this.close({disableAutoOpen: false});\n // In many web applications, it would be recommended to force window.reload()\n // when this event occurs. To do that, subscribe to the versionchange event\n // and call window.location.reload(true) if ev.newVersion > 0 (not a deletion)\n // The reason for this is that your current web app obviously has old schema code that needs\n // to be updated. Another window got a newer version of the app and needs to upgrade DB but\n // your window is blocking it unless we close it here.\n });\n this.on(\"blocked\", ev => {\n if (!ev.newVersion || ev.newVersion < ev.oldVersion)\n console.warn(`Dexie.delete('${this.name}') was blocked`);\n else\n console.warn(`Upgrade '${this.name}' blocked by other connection holding version ${ev.oldVersion / 10}`);\n });\n\n this._maxKey = getMaxKey(options.IDBKeyRange as typeof IDBKeyRange);\n\n this._createTransaction = (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n parentTransaction?: Transaction) => new this.Transaction(mode, storeNames, dbschema, this._options.chromeTransactionDurability, parentTransaction);\n\n this._fireOnBlocked = ev => {\n this.on(\"blocked\").fire(ev);\n // Workaround (not fully*) for missing \"versionchange\" event in IE,Edge and Safari:\n connections\n .filter(c => c.name === this.name && c !== this && !c._state.vcFired)\n .map(c => c.on(\"versionchange\").fire(ev));\n }\n\n // Default middlewares:\n this.use(cacheExistingValuesMiddleware);\n this.use(cacheMiddleware);\n this.use(observabilityMiddleware);\n this.use(virtualIndexMiddleware);\n this.use(hooksMiddleware);\n\n const vipDB = new Proxy(this, {\n get: (_, prop, receiver) => {\n if (prop === '_vip') return true;\n if (prop === 'table') return (tableName: string) => vipify(this.table(tableName), vipDB);\n const rv = Reflect.get(_, prop, receiver);\n if (rv instanceof Table) return vipify(rv, vipDB);\n if (prop === 'tables') return (rv as Table[]).map(t => vipify(t, vipDB));\n if (prop === '_createTransaction') return function() {\n const tx: Transaction = (rv as typeof this._createTransaction).apply(this, arguments);\n return vipify(tx, vipDB);\n }\n return rv;\n }\n });\n this.vip = vipDB;\n\n // Call each addon:\n addons.forEach(addon => addon(this));\n }\n\n version(versionNumber: number): Version {\n if (isNaN(versionNumber) || versionNumber < 0.1) throw new exceptions.Type(`Given version is not a positive number`);\n versionNumber = Math.round(versionNumber * 10) / 10;\n if (this.idbdb || this._state.isBeingOpened)\n throw new exceptions.Schema(\"Cannot add version when database is open\");\n this.verno = Math.max(this.verno, versionNumber);\n const versions = this._versions;\n var versionInstance = versions.filter(\n v => v._cfg.version === versionNumber)[0];\n if (versionInstance) return versionInstance;\n versionInstance = new this.Version(versionNumber);\n versions.push(versionInstance);\n versions.sort(lowerVersionFirst);\n versionInstance.stores({}); // Derive earlier schemas by default.\n // Disable autoschema mode, as at least one version is specified.\n this._state.autoSchema = false;\n return versionInstance;\n }\n\n _whenReady(fn: () => Promise): Promise {\n return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new Promise((resolve, reject) => {\n if (this._state.openComplete) {\n // idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return reject(new exceptions.DatabaseClosed(this._state.dbOpenError));\n }\n if (!this._state.isBeingOpened) {\n if (!this._state.autoOpen) {\n reject(new exceptions.DatabaseClosed());\n return;\n }\n this.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n this._state.dbReadyPromise.then(resolve, reject);\n }).then(fn);\n }\n\n use({stack, create, level, name}: Middleware): this {\n if (name) this.unuse({stack, name}); // Be able to replace existing middleware.\n const middlewares = this._middlewares[stack] || (this._middlewares[stack] = []);\n middlewares.push({stack, create, level: level == null ? 10 : level, name});\n middlewares.sort((a, b) => a.level - b.level);\n // Todo update db.core and db.tables...core ? Or should be expect this to have effect\n // only after next open()?\n return this;\n }\n\n unuse({stack, create}: Middleware<{stack: keyof DexieStacks}>): this;\n unuse({stack, name}: {stack: keyof DexieStacks, name: string}): this;\n unuse({stack, name, create}: {stack: keyof DexieStacks, name?: string, create?: Function}) {\n if (stack && this._middlewares[stack]) {\n this._middlewares[stack] = this._middlewares[stack].filter(mw =>\n create ? mw.create !== create : // Given middleware has a create method. Match that exactly.\n name ? mw.name !== name : // Given middleware spec \n false);\n }\n return this;\n }\n\n open() {\n return usePSD(\n globalPSD, // Enforce global scope here since db.open() can be part of a live query or transaction scope\n () => dexieOpen(this)\n );\n }\n\n _close(): void {\n const state = this._state;\n const idx = connections.indexOf(this);\n if (idx >= 0) connections.splice(idx, 1);\n if (this.idbdb) {\n try { this.idbdb.close(); } catch (e) { }\n this.idbdb = null;\n } \n // Reset dbReadyPromise promise:\n if (!state.isBeingOpened) {\n // Only if not being opened, reset these promises.\n // Otherwise, keep them so existing promise consumers will resolve when db\n // db is reopened later on, in case closing for purpose reopening, using {disableAutoOpen: false}.\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n }\n }\n\n close({disableAutoOpen} = {disableAutoOpen: true}): void {\n const state = this._state;\n if (disableAutoOpen) {\n if (state.isBeingOpened) {\n // cancel before the call to this._close() because this._close() will recreate dbReadyPromise and openCanceller.\n state.cancelOpen(new exceptions.DatabaseClosed());\n }\n this._close();\n state.autoOpen = false;\n state.dbOpenError = new exceptions.DatabaseClosed();\n } else {\n this._close();\n state.autoOpen = this._options.autoOpen ||\n state.isBeingOpened; // If an open call is ongoing, that same promise will resolve when db is reopend.\n state.openComplete = false;\n state.dbOpenError = null;\n }\n }\n\n delete(closeOptions = {disableAutoOpen: true}): Promise {\n // Prevent accidentially doing db.delete(1) when intention was to do db.[table].delete(1).\n const hasInvalidArguments = arguments.length > 0 && typeof arguments[0] !== 'object'; \n const state = this._state;\n return new Promise((resolve, reject) => {\n const doDelete = () => {\n this.close(closeOptions);\n var req = this._deps.indexedDB.deleteDatabase(this.name);\n req.onsuccess = wrap(() => {\n _onDatabaseDeleted(this._deps, this.name);\n resolve();\n });\n req.onerror = eventRejectHandler(reject);\n req.onblocked = this._fireOnBlocked;\n }\n // Prevent accidentially doing db.delete(1) when intention was to do db.[table].delete(1).\n if (hasInvalidArguments) throw new exceptions.InvalidArgument(\"Invalid closeOptions argument to db.delete()\");\n if (state.isBeingOpened) {\n state.dbReadyPromise.then(doDelete);\n } else {\n doDelete();\n }\n });\n }\n\n backendDB() {\n return this.idbdb;\n }\n\n isOpen() {\n return this.idbdb !== null;\n }\n\n hasBeenClosed() {\n const dbOpenError = this._state.dbOpenError;\n return dbOpenError && (dbOpenError.name === 'DatabaseClosed');\n }\n\n hasFailed() {\n return this._state.dbOpenError !== null;\n }\n\n dynamicallyOpened() {\n return this._state.autoSchema;\n }\n\n get tables () {\n return keys(this._allTables).map(name => this._allTables[name]);\n }\n\n transaction(): Promise {\n const args = extractTransactionArgs.apply(this, arguments);\n return this._transaction.apply(this, args);\n }\n\n _transaction(mode: TransactionMode, tables: Array, scopeFunc: Function) {\n let parentTransaction = PSD.trans as Transaction | undefined;\n // Check if parent transactions is bound to this db instance, and if caller wants to reuse it\n if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) parentTransaction = null;\n const onlyIfCompatible = mode.indexOf('?') !== -1;\n mode = mode.replace('!', '').replace('?', '') as TransactionMode; // Ok. Will change arguments[0] as well but we wont touch arguments henceforth.\n let idbMode: IDBTransactionMode,\n storeNames;\n\n try {\n //\n // Get storeNames from arguments. Either through given table instances, or through given table names.\n //\n storeNames = tables.map(table => {\n var storeName = table instanceof this.Table ? table.name : table;\n if (typeof storeName !== 'string') throw new TypeError(\"Invalid table argument to Dexie.transaction(). Only Table or String are allowed\");\n return storeName;\n });\n\n //\n // Resolve mode. Allow shortcuts \"r\" and \"rw\".\n //\n if (mode == \"r\" || mode === READONLY)\n idbMode = READONLY;\n else if (mode == \"rw\" || mode == READWRITE)\n idbMode = READWRITE;\n else\n throw new exceptions.InvalidArgument(\"Invalid transaction mode: \" + mode);\n\n if (parentTransaction) {\n // Basic checks\n if (parentTransaction.mode === READONLY && idbMode === READWRITE) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY\");\n }\n if (parentTransaction) {\n storeNames.forEach(storeName => {\n if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Table \" + storeName +\n \" not included in parent transaction.\");\n }\n });\n }\n if (onlyIfCompatible && parentTransaction && !parentTransaction.active) {\n // '?' mode should not keep using an inactive transaction.\n parentTransaction = null;\n }\n }\n } catch (e) {\n return parentTransaction ?\n parentTransaction._promise(null, (_, reject) => {reject(e);}) :\n rejection (e);\n }\n // If this is a sub-transaction, lock the parent and then launch the sub-transaction.\n const enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc);\n return (parentTransaction ?\n parentTransaction._promise(idbMode, enterTransaction, \"lock\") :\n PSD.trans ?\n // no parent transaction despite PSD.trans exists. Make sure also\n // that the zone we create is not a sub-zone of current, because\n // Promise.follow() should not wait for it if so.\n usePSD(PSD.transless, ()=>this._whenReady(enterTransaction)) :\n this._whenReady (enterTransaction));\n }\n\n table(tableName: string): Table;\n table(tableName: string): ITable;\n table(tableName: string): Table {\n if (!hasOwn(this._allTables, tableName)) {\n throw new exceptions.InvalidTable(`Table ${tableName} does not exist`); }\n return this._allTables[tableName];\n }\n}\n","import {\n Observable as IObservable,\n Observer,\n Subscription,\n} from \"../../public/types/observable\";\n\nconst symbolObservable: typeof Symbol.observable =\n typeof Symbol !== \"undefined\" && \"observable\" in Symbol\n ? Symbol.observable\n : \"@@observable\" as any;\n\nexport class Observable implements IObservable {\n private _subscribe: (observer: Observer) => Subscription;\n hasValue?: ()=>boolean;\n getValue?: ()=>T;\n\n constructor(subscribe: (observer: Observer) => Subscription) {\n this._subscribe = subscribe;\n }\n\n subscribe(\n onNext?: ((value: T) => void) | null,\n onError?: ((error: any) => void) | null,\n onComplete?: (() => void) | null\n ): Subscription;\n subscribe(observer?: Observer | null): Subscription;\n subscribe(x?: any, error?: any, complete?: any): Subscription {\n return this._subscribe(\n !x || typeof x === \"function\" ? { next: x, error, complete } : x\n );\n }\n\n [symbolObservable]() {\n return this;\n }\n}\n","import { _global } from '../../globals/global';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\n\nexport let domDeps: DexieDOMDependencies\n\ntry {\n domDeps = {\n // Required:\n indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB,\n IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange\n };\n} catch (e) {\n domDeps = { indexedDB: null, IDBKeyRange: null };\n}\n","import { _global, isAsyncFunction, keys, objectIsEmpty } from '../functions/utils';\nimport {\n globalEvents,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport {\n beginMicroTickScope,\n decrementExpectedAwaits,\n endMicroTickScope,\n execInGlobalContext,\n incrementExpectedAwaits,\n NativePromise,\n newScope,\n PSD,\n usePSD,\n} from '../helpers/promise';\nimport { ObservabilitySet } from '../public/types/db-events';\nimport {\n Observable as IObservable,\n Subscription,\n} from '../public/types/observable';\nimport { Observable } from '../classes/observable/observable';\nimport { extendObservabilitySet } from './extend-observability-set';\nimport { rangesOverlap } from '../helpers/rangeset';\nimport { domDeps } from '../classes/dexie/dexie-dom-dependencies';\nimport { Transaction } from '../classes/transaction';\nimport { obsSetsOverlap } from './obs-sets-overlap';\n\nexport interface LiveQueryContext {\n subscr: ObservabilitySet;\n signal: AbortSignal;\n requery: () => void;\n trans: null | Transaction;\n querier: Function; // For debugging purposes and Error messages\n}\n\nexport function liveQuery(querier: () => T | Promise): IObservable {\n let hasValue = false;\n let currentValue: T;\n const observable = new Observable((observer) => {\n const scopeFuncIsAsync = isAsyncFunction(querier);\n function execute(ctx: LiveQueryContext) {\n const wasRootExec = beginMicroTickScope(); // Performance: Avoid starting a new microtick scope within the async context.\n try {\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n let rv = newScope(querier, ctx);\n if (scopeFuncIsAsync) {\n // Make sure to set rv = rv.finally in order to wait to after decrementExpectedAwaits() has been called.\n // This fixes zone leaking issue that the liveQuery zone can leak to observer's next microtask.\n rv = (rv as Promise).finally(decrementExpectedAwaits);\n }\n return rv;\n } finally {\n wasRootExec && endMicroTickScope(); // Given that we created the microtick scope, we must also end it.\n }\n }\n\n let closed = false;\n let abortController: AbortController;\n\n let accumMuts: ObservabilitySet = {};\n let currentObs: ObservabilitySet = {};\n\n const subscription: Subscription = {\n get closed() {\n return closed;\n },\n unsubscribe: () => {\n if (closed) return;\n closed = true;\n if (abortController) abortController.abort();\n if (startedListening) globalEvents.storagemutated.unsubscribe(mutationListener);\n },\n };\n\n observer.start && observer.start(subscription); // https://github.com/tc39/proposal-observable\n\n let startedListening = false;\n\n const doQuery = () => execInGlobalContext(_doQuery);\n\n function shouldNotify() {\n return obsSetsOverlap(currentObs, accumMuts);\n }\n\n const mutationListener = (parts: ObservabilitySet) => {\n extendObservabilitySet(accumMuts, parts);\n if (shouldNotify()) {\n doQuery();\n }\n };\n\n const _doQuery = () => {\n if (\n closed || // closed - don't run!\n !domDeps.indexedDB) // SSR in sveltekit, nextjs etc\n {\n return;\n }\n accumMuts = {};\n const subscr: ObservabilitySet = {};\n // Abort signal fill three purposes:\n // 1. Abort the query if the observable is unsubscribed.\n // 2. Abort the query if a new query is made before the previous one has completed.\n // 3. For cached queries to know if they should remain in memory or could be enqued for being freed up.\n // (they will remain in memory for a short time and if noone needs them again, they will eventually be freed up)\n if (abortController) abortController.abort(); // Cancel previous query. Last query will be cancelled on unsubscribe().\n abortController = new AbortController();\n \n const ctx: LiveQueryContext = {\n subscr,\n signal: abortController.signal,\n requery: doQuery,\n querier,\n trans: null // Make the scope transactionless (don't reuse transaction from outer scope of the caller of subscribe())\n }\n const ret = execute(ctx);\n Promise.resolve(ret).then(\n (result) => {\n hasValue = true;\n currentValue = result;\n if (closed || ctx.signal.aborted) {\n // closed - no subscriber anymore.\n // signal.aborted - new query was made before this one completed and\n // the querier might have catched AbortError and return successful result.\n // If so, we should not rely in that result because we know we have aborted\n // this run, which means there's another run going on that will handle accumMuts\n // and we must not base currentObs on the half-baked subscr.\n return;\n }\n accumMuts = {};\n // Update what we are subscribing for based on this last run:\n currentObs = subscr;\n if (!objectIsEmpty(currentObs) && !startedListening) {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener);\n startedListening = true;\n }\n execInGlobalContext(()=>!closed && observer.next && observer.next(result));\n },\n (err) => {\n hasValue = false;\n if (!['DatabaseClosedError', 'AbortError'].includes(err?.name)) {\n if (!closed) execInGlobalContext(()=>{\n if (closed) return;\n observer.error && observer.error(err);\n });\n }\n }\n );\n };\n\n // Use setTimeot here to guarantee execution in a private macro task before and\n // after. The helper executeInGlobalContext(_doQuery) is not enough here because\n // caller of `subscribe()` could be anything, such as a frontend framework that will\n // continue in the same tick after subscribe() is called and call other\n // eftects, that could involve dexie operations such as writing to the DB.\n // If that happens, the private zone echoes from a live query tast started here\n // could still be ongoing when the other operations start and make them inherit\n // the async context from a live query.\n setTimeout(doQuery, 0);\n return subscription;\n });\n observable.hasValue = () => hasValue;\n observable.getValue = () => currentValue;\n return observable;\n}\n","import { Dexie as _Dexie } from './dexie';\nimport { _global } from '../../globals/global';\nimport { props, derive, extend, override, getByKeyPath, setByKeyPath, delByKeyPath, shallowClone, deepClone, asap } from '../../functions/utils';\nimport { getObjectDiff } from \"../../functions/get-object-diff\";\nimport { fullNameExceptions } from '../../errors';\nimport { DexieConstructor } from '../../public/types/dexie-constructor';\nimport { getDatabaseNames } from '../../helpers/database-enumerator';\nimport { PSD } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { newScope } from '../../helpers/promise';\nimport { rejection } from '../../helpers/promise';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { dexieStackFrameFilter, minKey, connections, DEXIE_VERSION } from '../../globals/constants';\nimport Events from '../../helpers/Events';\nimport { exceptions } from '../../errors';\nimport { errnames } from '../../errors';\nimport { getMaxKey } from '../../functions/quirks';\nimport { vip } from './vip';\nimport { globalEvents } from '../../globals/global-events';\nimport { liveQuery } from '../../live-query/live-query';\nimport { extendObservabilitySet } from '../../live-query/extend-observability-set';\nimport { domDeps } from './dexie-dom-dependencies';\nimport { cmp } from '../../functions/cmp';\nimport { cache } from '../../live-query/cache/cache';\n\n/* (Dexie) is an instance of DexieConstructor, as defined in public/types/dexie-constructor.d.ts\n* (new Dexie()) is an instance of Dexie, as defined in public/types/dexie.d.ts\n* \n* Why we're doing this?\n\n* Because we've choosen to define the public Dexie API using a DexieConstructor interface\n* rather than declaring a class. On that interface, all static props are defined.\n* In practice, class Dexie's constructor implements DexieConstructor and all member props\n* are defined in interface Dexie. We could say, it's a typescript limitation of not being\n* able to define a static interface that forces us to do the cast below.\n*/\nconst Dexie = _Dexie as any as DexieConstructor;\n\n//\n// Set all static methods and properties onto Dexie:\n// \nprops(Dexie, {\n\n // Dexie.BulkError = class BulkError {...};\n // Dexie.XXXError = class XXXError {...};\n ...fullNameExceptions,\n\n //\n // Static delete() method.\n //\n delete(databaseName: string) {\n const db = new Dexie(databaseName, {addons: []});\n return db.delete();\n },\n\n //\n // Static exists() method.\n //\n exists(name: string) {\n return new Dexie(name, { addons: [] }).open().then(db => {\n db.close();\n return true;\n }).catch('NoSuchDatabaseError', () => false);\n },\n\n //\n // Static method for retrieving a list of all existing databases at current host.\n //\n getDatabaseNames(cb) {\n try {\n return getDatabaseNames(Dexie.dependencies).then(cb);\n } catch {\n return rejection(new exceptions.MissingAPI());\n }\n },\n\n /** @deprecated */\n defineClass() {\n function Class(content) {\n extend(this, content);\n }\n return Class;\n },\n\n ignoreTransaction(scopeFunc) {\n // In case caller is within a transaction but needs to create a separate transaction.\n // Example of usage:\n //\n // Let's say we have a logger function in our app. Other application-logic should be unaware of the\n // logger function and not need to include the 'logentries' table in all transaction it performs.\n // The logging should always be done in a separate transaction and not be dependant on the current\n // running transaction context. Then you could use Dexie.ignoreTransaction() to run code that starts a new transaction.\n //\n // Dexie.ignoreTransaction(function() {\n // db.logentries.add(newLogEntry);\n // });\n //\n // Unless using Dexie.ignoreTransaction(), the above example would try to reuse the current transaction\n // in current Promise-scope.\n //\n // An alternative to Dexie.ignoreTransaction() would be setImmediate() or setTimeout(). The reason we still provide an\n // API for this because\n // 1) The intention of writing the statement could be unclear if using setImmediate() or setTimeout().\n // 2) setTimeout() would wait unnescessary until firing. This is however not the case with setImmediate().\n // 3) setImmediate() is not supported in the ES standard.\n // 4) You might want to keep other PSD state that was set in a parent PSD, such as PSD.letThrough.\n return PSD.trans ?\n usePSD(PSD.transless, scopeFunc) : // Use the closest parent that was non-transactional.\n scopeFunc(); // No need to change scope because there is no ongoing transaction.\n },\n\n vip,\n\n async: function (generatorFn: Function) {\n return function () {\n try {\n var rv = awaitIterator(generatorFn.apply(this, arguments));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n };\n },\n\n spawn: function (generatorFn, args, thiz) {\n try {\n var rv = awaitIterator(generatorFn.apply(thiz, args || []));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n },\n\n // Dexie.currentTransaction property\n currentTransaction: {\n get: () => PSD.trans || null\n },\n\n waitFor: function (promiseOrFunction, optionalTimeout) {\n // If a function is provided, invoke it and pass the returning value to Transaction.waitFor()\n const promise = Promise.resolve(\n typeof promiseOrFunction === 'function' ?\n Dexie.ignoreTransaction(promiseOrFunction) :\n promiseOrFunction)\n .timeout(optionalTimeout || 60000); // Default the timeout to one minute. Caller may specify Infinity if required. \n\n // Run given promise on current transaction. If no current transaction, just return a Dexie promise based\n // on given value.\n return PSD.trans ?\n PSD.trans.waitFor(promise) :\n promise;\n },\n\n // Export our Promise implementation since it can be handy as a standalone Promise implementation\n Promise: Promise,\n\n // Dexie.debug proptery:\n // Dexie.debug = false\n // Dexie.debug = true\n // Dexie.debug = \"dexie\" - don't hide dexie's stack frames.\n debug: {\n get: () => Debug.debug,\n set: value => {\n Debug.setDebug(value, value === 'dexie' ? () => true : dexieStackFrameFilter);\n }\n },\n\n // Export our derive/extend/override methodology\n derive: derive, // Deprecate?\n extend: extend, // Deprecate?\n props: props,\n override: override, // Deprecate?\n // Export our Events() function - can be handy as a toolkit\n Events: Events,\n on: globalEvents,\n liveQuery,\n extendObservabilitySet,\n // Utilities\n getByKeyPath: getByKeyPath,\n setByKeyPath: setByKeyPath,\n delByKeyPath: delByKeyPath,\n shallowClone: shallowClone,\n deepClone: deepClone,\n getObjectDiff: getObjectDiff,\n cmp,\n asap: asap,\n //maxKey: new Dexie('',{addons:[]})._maxKey,\n minKey: minKey,\n // Addon registry\n addons: [],\n // Global DB connection list\n connections: connections,\n\n //MultiModifyError: exceptions.Modify, // Obsolete!\n errnames: errnames,\n\n // Export other static classes\n //IndexSpec: IndexSpec, Obsolete!\n //TableSchema: TableSchema, Obsolete!\n\n //\n // Dependencies\n //\n // These will automatically work in browsers with indexedDB support, or where an indexedDB polyfill has been included.\n //\n // In node.js, however, these properties must be set \"manually\" before instansiating a new Dexie().\n // For node.js, you need to require indexeddb-js or similar and then set these deps.\n //\n dependencies: domDeps,\n cache,\n\n // API Version Number: Type Number, make sure to always set a version number that can be comparable correctly. Example: 0.9, 0.91, 0.92, 1.0, 1.01, 1.1, 1.2, 1.21, etc.\n semVer: DEXIE_VERSION,\n version: DEXIE_VERSION.split('.')\n .map(n => parseInt(n))\n .reduce((p, c, i) => p + (c / Math.pow(10, i * 2))),\n\n // https://github.com/dfahlander/Dexie.js/issues/186\n // typescript compiler tsc in mode ts-->es5 & commonJS, will expect require() to return\n // x.default. Workaround: Set Dexie.default = Dexie.\n // default: Dexie, // Commented because solved in index-umd.ts instead.\n // Make it possible to import {Dexie} (non-default import)\n // Reason 1: May switch to that in future.\n // Reason 2: We declare it both default and named exported in d.ts to make it possible\n // to let addons extend the Dexie interface with Typescript 2.1 (works only when explicitely\n // exporting the symbol, not just default exporting)\n // Dexie: Dexie // Commented because solved in index-umd.ts instead.\n});\n\nDexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange);\n","import { globalEvents, DEXIE_STORAGE_MUTATED_EVENT_NAME, STORAGE_MUTATED_DOM_EVENT_NAME } from '../globals/global-events';\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport { signalSubscribersNow } from './cache/signalSubscribers';\n\nif (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, updatedParts => {\n if (!propagatingLocally) {\n let event: CustomEvent;\n event = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, {\n detail: updatedParts\n });\n propagatingLocally = true;\n dispatchEvent(event);\n propagatingLocally = false;\n }\n });\n addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, ({detail}: CustomEvent) => {\n if (!propagatingLocally) {\n propagateLocally(detail);\n }\n });\n}\n\n/** Called from listeners to BroadcastChannel and DOM event to\n * propagate the event locally into dexie's storagemutated event\n * and invalidate cached queries.\n * \n * This function is only called when the event is not originating\n * from this same Dexie module - either from another redundant dexie import\n * or from a foreign tab or worker. That's why we need to invalidate\n * the cache when this happens.\n */\nexport function propagateLocally(updateParts: ObservabilitySet) {\n let wasMe = propagatingLocally;\n try {\n propagatingLocally = true;\n // Fire the \"storagemutated\" event.\n globalEvents.storagemutated.fire(updateParts);\n // Invalidate cached queries and signal subscribers to requery.\n signalSubscribersNow(updateParts, true);\n } finally {\n propagatingLocally = wasMe;\n }\n}\n\nexport let propagatingLocally = false;\n","import {\n globalEvents,\n STORAGE_MUTATED_DOM_EVENT_NAME,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport { propagateLocally, propagatingLocally } from './propagate-locally';\n\nexport let bc: BroadcastChannel;\n\nexport let createBC = ()=>{};\n\nif (typeof BroadcastChannel !== 'undefined') {\n createBC = () => {\n bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME);\n bc.onmessage = ev => ev.data && propagateLocally(ev.data);\n }\n createBC();\n\n /**\n * The Node.js BroadcastChannel will prevent the node process from exiting\n * if the BroadcastChannel is not closed.\n * Therefore we have to call unref() which allows the process to finish\n * properly even when the BroadcastChannel is never closed.\n * @link https://nodejs.org/api/worker_threads.html#broadcastchannelunref\n * @link https://github.com/dexie/Dexie.js/pull/1576\n */\n if (typeof (bc as any).unref === 'function') {\n (bc as any).unref();\n }\n \n //\n // Propagate local changes to remote tabs, windows and workers via BroadcastChannel\n //\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, (changedParts) => {\n if (!propagatingLocally) {\n bc.postMessage(changedParts);\n }\n });\n}\n","import { Dexie } from \"./classes/dexie\";\nimport { connections } from \"./globals/constants\";\nimport { debug } from \"./helpers/debug\";\nimport { RangeSet } from \"./helpers/rangeset\";\nimport { bc, createBC } from \"./live-query/enable-broadcast\";\nimport { propagateLocally } from \"./live-query/propagate-locally\";\n\n\nif (typeof addEventListener !== 'undefined') {\n addEventListener('pagehide', (event) => {\n if (!Dexie.disableBfCache && event.persisted) {\n if (debug) console.debug('Dexie: handling persisted pagehide');\n bc?.close();\n for (const db of connections) {\n db.close({disableAutoOpen: false});\n }\n }\n });\n addEventListener('pageshow', (event) => {\n if (!Dexie.disableBfCache && event.persisted) {\n if (debug) console.debug('Dexie: handling persisted pageshow');\n createBC();\n propagateLocally({all: new RangeSet(-Infinity, [[]])}); // Trigger all queries to requery\n }\n });\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function add(value: number | BigInt | Array) {\n return new PropModification({add: value});\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function remove(value: number | BigInt | Array) {\n return new PropModification({remove: value});\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function replacePrefix(a: string, b:string) {\n return new PropModification({replacePrefix: [a, b]});\n}\n","import { Dexie } from './classes/dexie';\nimport { DexieConstructor } from './public/types/dexie-constructor';\nimport { DexiePromise } from './helpers/promise';\nimport { mapError } from './errors';\nimport * as Debug from './helpers/debug';\nimport { dexieStackFrameFilter } from './globals/constants';\n\n// Generate all static properties such as Dexie.maxKey etc\n// (implement interface DexieConstructor):\nimport './classes/dexie/dexie-static-props';\nimport './live-query/enable-broadcast';\nimport './support-bfcache';\nimport { liveQuery } from './live-query/live-query';\nimport { Entity } from './classes/entity/Entity';\nimport { cmp } from './functions/cmp';\nimport { PropModification, PropModSymbol } from './helpers/prop-modification';\nimport { replacePrefix, add, remove } from './functions/propmods';\n\n\n// Set rejectionMapper of DexiePromise so that it generally tries to map\n// DOMErrors and DOMExceptions to a DexieError instance with same name but with\n// async stack support and with a prototypal inheritance from DexieError and Error.\n// of Map DOMErrors and DOMExceptions to corresponding Dexie errors.\nDexiePromise.rejectionMapper = mapError;\n\n// Let the async stack filter focus on app code and filter away frames from dexie.min.js:\nDebug.setDebug(Debug.debug, dexieStackFrameFilter);\n\nexport { RangeSet, mergeRanges, rangesOverlap } from \"./helpers/rangeset\";\nexport { Dexie, liveQuery }; // Comply with public/index.d.ts.\nexport { Entity };\nexport { cmp };\nexport { PropModSymbol, PropModification, replacePrefix, add, remove };\nexport default Dexie;\n","// Issue #1127. Need another index.ts for the UMD module with only a default export\n// like it was before.\n// In practice though, the UMD export will also export the named export in \n// https://github.com/dfahlander/Dexie.js/blob/c9187ae60c0d7a424f85bab3af179fbbc9901c8e/src/classes/dexie/dexie-static-props.ts#L223-L228\nimport Dexie from \"./index\";\nimport * as namedExports from \"./index\";\nimport { __assign } from 'tslib';\n__assign(Dexie, namedExports, {default: Dexie});\nexport default Dexie;\n"],"names":["asap","_a","Promise","Dexie","safari14Workaround","_Dexie","Debug.debug","Debug.setDebug"],"mappings":"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"} \ No newline at end of file diff --git a/src/assets/dexie/dist/dexie.min.js b/src/assets/dexie/dist/dexie.min.js deleted file mode 100644 index 88e76d734..000000000 --- a/src/assets/dexie/dist/dexie.min.js +++ /dev/null @@ -1,2 +0,0 @@ -(function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Dexie=t()})(this,function(){"use strict";var s=function(e,t){return(s=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};var w=function(){return(w=Object.assign||function(e){for(var t,n=1,r=arguments.length;n.",Ze="String expected.",et=[],tt="__dbnames",nt="readonly",rt="readwrite";function it(e,t){return e?t?function(){return e.apply(this,arguments)&&t.apply(this,arguments)}:e:t}var ot={type:3,lower:-1/0,lowerOpen:!1,upper:[[]],upperOpen:!1};function at(t){return"string"!=typeof t||/\./.test(t)?function(e){return e}:function(e){return void 0===e[t]&&t in e&&delete(e=S(e))[t],e}}function ut(){throw Y.Type()}function st(e,t){try{var n=ct(e),r=ct(t);if(n!==r)return"Array"===n?1:"Array"===r?-1:"binary"===n?1:"binary"===r?-1:"string"===n?1:"string"===r?-1:"Date"===n?1:"Date"!==r?NaN:-1;switch(n){case"number":case"Date":case"string":return ts+c&&f(s+g)})})}var h=yt(r)&&r.limit===1/0&&("function"!=typeof w||w===Et)&&{index:r.index,range:r.range};return f(0).then(function(){if(0=c})).length?(e.forEach(function(u){t.push(function(){var t=h,e=u._cfg.dbschema;fn(s,t,f),fn(s,e,f),h=s._dbSchema=e;var n=an(t,e);n.add.forEach(function(e){un(f,e[0],e[1].primKey,e[1].indexes)}),n.change.forEach(function(e){if(e.recreate)throw new Y.Upgrade("Not yet support for changing primary key");var t=f.objectStore(e.name);e.add.forEach(function(e){return cn(t,e)}),e.change.forEach(function(e){t.deleteIndex(e.name),cn(t,e)}),e.del.forEach(function(e){return t.deleteIndex(e)})});var r=u._cfg.contentUpgrade;if(r&&u._cfg.version>c){Zt(s,f),l._memoizedTables={};var i=g(e);n.del.forEach(function(e){i[e]=t[e]}),tn(s,[s.Transaction.prototype]),en(s,[s.Transaction.prototype],_(i),i),l.schema=i;var o,a=B(r);a&&Le();n=_e.follow(function(){var e;(o=r(l))&&a&&(e=Ue.bind(null,null),o.then(e,e))});return o&&"function"==typeof o.then?_e.resolve(o):n.then(function(){return o})}}),t.push(function(e){var t,n,r=u._cfg.dbschema;t=r,n=e,[].slice.call(n.db.objectStoreNames).forEach(function(e){return null==t[e]&&n.db.deleteObjectStore(e)}),tn(s,[s.Transaction.prototype]),en(s,[s.Transaction.prototype],s._storeNames,s._dbSchema),l.schema=s._dbSchema}),t.push(function(e){s.idbdb.objectStoreNames.contains("$meta")&&(Math.ceil(s.idbdb.version/10)===u._cfg.version?(s.idbdb.deleteObjectStore("$meta"),delete s._dbSchema.$meta,s._storeNames=s._storeNames.filter(function(e){return"$meta"!==e})):e.objectStore("$meta").put(u._cfg.version,"version"))})}),function e(){return t.length?_e.resolve(t.shift()(l.idbtrans)).then(e):_e.resolve()}().then(function(){sn(h,f)})):_e.resolve();var s,c,l,f,t,h}).catch(u)):(_(o).forEach(function(e){un(i,e,o[e].primKey,o[e].indexes)}),Zt(n,i),void _e.follow(function(){return n.on.populate.fire(a)}).catch(u));var e,t})}function on(e,r){sn(e._dbSchema,r),r.db.version%10!=0||r.objectStoreNames.contains("$meta")||r.db.createObjectStore("$meta").add(Math.ceil(r.db.version/10-1),"version");var t=ln(0,e.idbdb,r);fn(e,e._dbSchema,r);for(var n=0,i=an(t,e._dbSchema).change;nMath.pow(2,62)?0:e.oldVersion,m=e<1,f.idbdb=l.result,p&&on(f,v),rn(f,e/10,v,n))},n),l.onsuccess=Te(function(){v=null;var e,t,n,r,i,o=f.idbdb=l.result,a=b(o.objectStoreNames);if(0u.limit?t.length=u.limit:e.length===u.limit&&t.length=r.limit&&(!r.values||e.req.values)&&Xn(e.req.query.range,r.query.range)}),!1,i,o];case"count":a=o.find(function(e){return Gn(e.req.query.range,r.query.range)});return[a,!!a,i,o]}}(O,c,"query",t),a=o[0],e=o[1],u=o[2],s=o[3];return a&&e?a.obsSet=t.obsSet:(e=l.query(t).then(function(e){var t=e.result;if(a&&(a.res=t),i){for(var n=0,r=t.length;n= 0) - a.splice(i, 1); - return i >= 0; -} -var NO_CHAR_ARRAY = {}; -function getArrayOf(arrayLike) { - var i, a, x, it; - if (arguments.length === 1) { - if (isArray(arrayLike)) - return arrayLike.slice(); - if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') - return [arrayLike]; - if ((it = getIteratorOf(arrayLike))) { - a = []; - while ((x = it.next()), !x.done) - a.push(x.value); - return a; - } - if (arrayLike == null) - return [arrayLike]; - i = arrayLike.length; - if (typeof i === 'number') { - a = new Array(i); - while (i--) - a[i] = arrayLike[i]; - return a; - } - return [arrayLike]; - } - i = arguments.length; - a = new Array(i); - while (i--) - a[i] = arguments[i]; - return a; -} -var isAsyncFunction = typeof Symbol !== 'undefined' - ? function (fn) { return fn[Symbol.toStringTag] === 'AsyncFunction'; } - : function () { return false; }; - -var dexieErrorNames = [ - 'Modify', - 'Bulk', - 'OpenFailed', - 'VersionChange', - 'Schema', - 'Upgrade', - 'InvalidTable', - 'MissingAPI', - 'NoSuchDatabase', - 'InvalidArgument', - 'SubTransaction', - 'Unsupported', - 'Internal', - 'DatabaseClosed', - 'PrematureCommit', - 'ForeignAwait' -]; -var idbDomErrorNames = [ - 'Unknown', - 'Constraint', - 'Data', - 'TransactionInactive', - 'ReadOnly', - 'Version', - 'NotFound', - 'InvalidState', - 'InvalidAccess', - 'Abort', - 'Timeout', - 'QuotaExceeded', - 'Syntax', - 'DataClone' -]; -var errorList = dexieErrorNames.concat(idbDomErrorNames); -var defaultTexts = { - VersionChanged: "Database version changed by other database connection", - DatabaseClosed: "Database has been closed", - Abort: "Transaction aborted", - TransactionInactive: "Transaction has already completed or failed", - MissingAPI: "IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb" -}; -function DexieError(name, msg) { - this.name = name; - this.message = msg; -} -derive(DexieError).from(Error).extend({ - toString: function () { return this.name + ": " + this.message; } -}); -function getMultiErrorMessage(msg, failures) { - return msg + ". Errors: " + Object.keys(failures) - .map(function (key) { return failures[key].toString(); }) - .filter(function (v, i, s) { return s.indexOf(v) === i; }) - .join('\n'); -} -function ModifyError(msg, failures, successCount, failedKeys) { - this.failures = failures; - this.failedKeys = failedKeys; - this.successCount = successCount; - this.message = getMultiErrorMessage(msg, failures); -} -derive(ModifyError).from(DexieError); -function BulkError(msg, failures) { - this.name = "BulkError"; - this.failures = Object.keys(failures).map(function (pos) { return failures[pos]; }); - this.failuresByPos = failures; - this.message = getMultiErrorMessage(msg, this.failures); -} -derive(BulkError).from(DexieError); -var errnames = errorList.reduce(function (obj, name) { return (obj[name] = name + "Error", obj); }, {}); -var BaseException = DexieError; -var exceptions = errorList.reduce(function (obj, name) { - var fullName = name + "Error"; - function DexieError(msgOrInner, inner) { - this.name = fullName; - if (!msgOrInner) { - this.message = defaultTexts[name] || fullName; - this.inner = null; - } - else if (typeof msgOrInner === 'string') { - this.message = "".concat(msgOrInner).concat(!inner ? '' : '\n ' + inner); - this.inner = inner || null; - } - else if (typeof msgOrInner === 'object') { - this.message = "".concat(msgOrInner.name, " ").concat(msgOrInner.message); - this.inner = msgOrInner; - } - } - derive(DexieError).from(BaseException); - obj[name] = DexieError; - return obj; -}, {}); -exceptions.Syntax = SyntaxError; -exceptions.Type = TypeError; -exceptions.Range = RangeError; -var exceptionMap = idbDomErrorNames.reduce(function (obj, name) { - obj[name + "Error"] = exceptions[name]; - return obj; -}, {}); -function mapError(domError, message) { - if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name]) - return domError; - var rv = new exceptionMap[domError.name](message || domError.message, domError); - if ("stack" in domError) { - setProp(rv, "stack", { get: function () { - return this.inner.stack; - } }); - } - return rv; -} -var fullNameExceptions = errorList.reduce(function (obj, name) { - if (["Syntax", "Type", "Range"].indexOf(name) === -1) - obj[name + "Error"] = exceptions[name]; - return obj; -}, {}); -fullNameExceptions.ModifyError = ModifyError; -fullNameExceptions.DexieError = DexieError; -fullNameExceptions.BulkError = BulkError; - -function nop() { } -function mirror(val) { return val; } -function pureFunctionChain(f1, f2) { - if (f1 == null || f1 === mirror) - return f2; - return function (val) { - return f2(f1(val)); - }; -} -function callBoth(on1, on2) { - return function () { - on1.apply(this, arguments); - on2.apply(this, arguments); - }; -} -function hookCreatingChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - var res = f1.apply(this, arguments); - if (res !== undefined) - arguments[0] = res; - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = null; - this.onerror = null; - var res2 = f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - return res2 !== undefined ? res2 : res; - }; -} -function hookDeletingChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - f1.apply(this, arguments); - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = this.onerror = null; - f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - }; -} -function hookUpdatingChain(f1, f2) { - if (f1 === nop) - return f2; - return function (modifications) { - var res = f1.apply(this, arguments); - extend(modifications, res); - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = null; - this.onerror = null; - var res2 = f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - return res === undefined ? - (res2 === undefined ? undefined : res2) : - (extend(res, res2)); - }; -} -function reverseStoppableEventChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - if (f2.apply(this, arguments) === false) - return false; - return f1.apply(this, arguments); - }; -} -function promisableChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - var res = f1.apply(this, arguments); - if (res && typeof res.then === 'function') { - var thiz = this, i = arguments.length, args = new Array(i); - while (i--) - args[i] = arguments[i]; - return res.then(function () { - return f2.apply(thiz, args); - }); - } - return f2.apply(this, arguments); - }; -} - -var debug = typeof location !== 'undefined' && - /^(http|https):\/\/(localhost|127\.0\.0\.1)/.test(location.href); -function setDebug(value, filter) { - debug = value; -} - -var INTERNAL = {}; -var ZONE_ECHO_LIMIT = 100, _a$1 = typeof Promise === 'undefined' ? - [] : - (function () { - var globalP = Promise.resolve(); - if (typeof crypto === 'undefined' || !crypto.subtle) - return [globalP, getProto(globalP), globalP]; - var nativeP = crypto.subtle.digest("SHA-512", new Uint8Array([0])); - return [ - nativeP, - getProto(nativeP), - globalP - ]; - })(), resolvedNativePromise = _a$1[0], nativePromiseProto = _a$1[1], resolvedGlobalPromise = _a$1[2], nativePromiseThen = nativePromiseProto && nativePromiseProto.then; -var NativePromise = resolvedNativePromise && resolvedNativePromise.constructor; -var patchGlobalPromise = !!resolvedGlobalPromise; -function schedulePhysicalTick() { - queueMicrotask(physicalTick); -} -var asap = function (callback, args) { - microtickQueue.push([callback, args]); - if (needsNewPhysicalTick) { - schedulePhysicalTick(); - needsNewPhysicalTick = false; - } -}; -var isOutsideMicroTick = true, -needsNewPhysicalTick = true, -unhandledErrors = [], -rejectingErrors = [], -rejectionMapper = mirror; -var globalPSD = { - id: 'global', - global: true, - ref: 0, - unhandleds: [], - onunhandled: nop, - pgp: false, - env: {}, - finalize: nop -}; -var PSD = globalPSD; -var microtickQueue = []; -var numScheduledCalls = 0; -var tickFinalizers = []; -function DexiePromise(fn) { - if (typeof this !== 'object') - throw new TypeError('Promises must be constructed via new'); - this._listeners = []; - this._lib = false; - var psd = (this._PSD = PSD); - if (typeof fn !== 'function') { - if (fn !== INTERNAL) - throw new TypeError('Not a function'); - this._state = arguments[1]; - this._value = arguments[2]; - if (this._state === false) - handleRejection(this, this._value); - return; - } - this._state = null; - this._value = null; - ++psd.ref; - executePromiseTask(this, fn); -} -var thenProp = { - get: function () { - var psd = PSD, microTaskId = totalEchoes; - function then(onFulfilled, onRejected) { - var _this = this; - var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes); - var cleanup = possibleAwait && !decrementExpectedAwaits(); - var rv = new DexiePromise(function (resolve, reject) { - propagateToListener(_this, new Listener(nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup), nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup), resolve, reject, psd)); - }); - if (this._consoleTask) - rv._consoleTask = this._consoleTask; - return rv; - } - then.prototype = INTERNAL; - return then; - }, - set: function (value) { - setProp(this, 'then', value && value.prototype === INTERNAL ? - thenProp : - { - get: function () { - return value; - }, - set: thenProp.set - }); - } -}; -props(DexiePromise.prototype, { - then: thenProp, - _then: function (onFulfilled, onRejected) { - propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); - }, - catch: function (onRejected) { - if (arguments.length === 1) - return this.then(null, onRejected); - var type = arguments[0], handler = arguments[1]; - return typeof type === 'function' ? this.then(null, function (err) { - return err instanceof type ? handler(err) : PromiseReject(err); - }) - : this.then(null, function (err) { - return err && err.name === type ? handler(err) : PromiseReject(err); - }); - }, - finally: function (onFinally) { - return this.then(function (value) { - return DexiePromise.resolve(onFinally()).then(function () { return value; }); - }, function (err) { - return DexiePromise.resolve(onFinally()).then(function () { return PromiseReject(err); }); - }); - }, - timeout: function (ms, msg) { - var _this = this; - return ms < Infinity ? - new DexiePromise(function (resolve, reject) { - var handle = setTimeout(function () { return reject(new exceptions.Timeout(msg)); }, ms); - _this.then(resolve, reject).finally(clearTimeout.bind(null, handle)); - }) : this; - } -}); -if (typeof Symbol !== 'undefined' && Symbol.toStringTag) - setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise'); -globalPSD.env = snapShot(); -function Listener(onFulfilled, onRejected, resolve, reject, zone) { - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; - this.onRejected = typeof onRejected === 'function' ? onRejected : null; - this.resolve = resolve; - this.reject = reject; - this.psd = zone; -} -props(DexiePromise, { - all: function () { - var values = getArrayOf.apply(null, arguments) - .map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - if (values.length === 0) - resolve([]); - var remaining = values.length; - values.forEach(function (a, i) { return DexiePromise.resolve(a).then(function (x) { - values[i] = x; - if (!--remaining) - resolve(values); - }, reject); }); - }); - }, - resolve: function (value) { - if (value instanceof DexiePromise) - return value; - if (value && typeof value.then === 'function') - return new DexiePromise(function (resolve, reject) { - value.then(resolve, reject); - }); - var rv = new DexiePromise(INTERNAL, true, value); - return rv; - }, - reject: PromiseReject, - race: function () { - var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - values.map(function (value) { return DexiePromise.resolve(value).then(resolve, reject); }); - }); - }, - PSD: { - get: function () { return PSD; }, - set: function (value) { return PSD = value; } - }, - totalEchoes: { get: function () { return totalEchoes; } }, - newPSD: newScope, - usePSD: usePSD, - scheduler: { - get: function () { return asap; }, - set: function (value) { asap = value; } - }, - rejectionMapper: { - get: function () { return rejectionMapper; }, - set: function (value) { rejectionMapper = value; } - }, - follow: function (fn, zoneProps) { - return new DexiePromise(function (resolve, reject) { - return newScope(function (resolve, reject) { - var psd = PSD; - psd.unhandleds = []; - psd.onunhandled = reject; - psd.finalize = callBoth(function () { - var _this = this; - run_at_end_of_this_or_next_physical_tick(function () { - _this.unhandleds.length === 0 ? resolve() : reject(_this.unhandleds[0]); - }); - }, psd.finalize); - fn(); - }, zoneProps, resolve, reject); - }); - } -}); -if (NativePromise) { - if (NativePromise.allSettled) - setProp(DexiePromise, "allSettled", function () { - var possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(function (resolve) { - if (possiblePromises.length === 0) - resolve([]); - var remaining = possiblePromises.length; - var results = new Array(remaining); - possiblePromises.forEach(function (p, i) { return DexiePromise.resolve(p).then(function (value) { return results[i] = { status: "fulfilled", value: value }; }, function (reason) { return results[i] = { status: "rejected", reason: reason }; }) - .then(function () { return --remaining || resolve(results); }); }); - }); - }); - if (NativePromise.any && typeof AggregateError !== 'undefined') - setProp(DexiePromise, "any", function () { - var possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - if (possiblePromises.length === 0) - reject(new AggregateError([])); - var remaining = possiblePromises.length; - var failures = new Array(remaining); - possiblePromises.forEach(function (p, i) { return DexiePromise.resolve(p).then(function (value) { return resolve(value); }, function (failure) { - failures[i] = failure; - if (!--remaining) - reject(new AggregateError(failures)); - }); }); - }); - }); -} -function executePromiseTask(promise, fn) { - try { - fn(function (value) { - if (promise._state !== null) - return; - if (value === promise) - throw new TypeError('A promise cannot be resolved with itself.'); - var shouldExecuteTick = promise._lib && beginMicroTickScope(); - if (value && typeof value.then === 'function') { - executePromiseTask(promise, function (resolve, reject) { - value instanceof DexiePromise ? - value._then(resolve, reject) : - value.then(resolve, reject); - }); - } - else { - promise._state = true; - promise._value = value; - propagateAllListeners(promise); - } - if (shouldExecuteTick) - endMicroTickScope(); - }, handleRejection.bind(null, promise)); - } - catch (ex) { - handleRejection(promise, ex); - } -} -function handleRejection(promise, reason) { - rejectingErrors.push(reason); - if (promise._state !== null) - return; - var shouldExecuteTick = promise._lib && beginMicroTickScope(); - reason = rejectionMapper(reason); - promise._state = false; - promise._value = reason; - addPossiblyUnhandledError(promise); - propagateAllListeners(promise); - if (shouldExecuteTick) - endMicroTickScope(); -} -function propagateAllListeners(promise) { - var listeners = promise._listeners; - promise._listeners = []; - for (var i = 0, len = listeners.length; i < len; ++i) { - propagateToListener(promise, listeners[i]); - } - var psd = promise._PSD; - --psd.ref || psd.finalize(); - if (numScheduledCalls === 0) { - ++numScheduledCalls; - asap(function () { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - }, []); - } -} -function propagateToListener(promise, listener) { - if (promise._state === null) { - promise._listeners.push(listener); - return; - } - var cb = promise._state ? listener.onFulfilled : listener.onRejected; - if (cb === null) { - return (promise._state ? listener.resolve : listener.reject)(promise._value); - } - ++listener.psd.ref; - ++numScheduledCalls; - asap(callListener, [cb, promise, listener]); -} -function callListener(cb, promise, listener) { - try { - var ret, value = promise._value; - if (!promise._state && rejectingErrors.length) - rejectingErrors = []; - ret = debug && promise._consoleTask ? promise._consoleTask.run(function () { return cb(value); }) : cb(value); - if (!promise._state && rejectingErrors.indexOf(value) === -1) { - markErrorAsHandled(promise); - } - listener.resolve(ret); - } - catch (e) { - listener.reject(e); - } - finally { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - --listener.psd.ref || listener.psd.finalize(); - } -} -function physicalTick() { - usePSD(globalPSD, function () { - beginMicroTickScope() && endMicroTickScope(); - }); -} -function beginMicroTickScope() { - var wasRootExec = isOutsideMicroTick; - isOutsideMicroTick = false; - needsNewPhysicalTick = false; - return wasRootExec; -} -function endMicroTickScope() { - var callbacks, i, l; - do { - while (microtickQueue.length > 0) { - callbacks = microtickQueue; - microtickQueue = []; - l = callbacks.length; - for (i = 0; i < l; ++i) { - var item = callbacks[i]; - item[0].apply(null, item[1]); - } - } - } while (microtickQueue.length > 0); - isOutsideMicroTick = true; - needsNewPhysicalTick = true; -} -function finalizePhysicalTick() { - var unhandledErrs = unhandledErrors; - unhandledErrors = []; - unhandledErrs.forEach(function (p) { - p._PSD.onunhandled.call(null, p._value, p); - }); - var finalizers = tickFinalizers.slice(0); - var i = finalizers.length; - while (i) - finalizers[--i](); -} -function run_at_end_of_this_or_next_physical_tick(fn) { - function finalizer() { - fn(); - tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1); - } - tickFinalizers.push(finalizer); - ++numScheduledCalls; - asap(function () { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - }, []); -} -function addPossiblyUnhandledError(promise) { - if (!unhandledErrors.some(function (p) { return p._value === promise._value; })) - unhandledErrors.push(promise); -} -function markErrorAsHandled(promise) { - var i = unhandledErrors.length; - while (i) - if (unhandledErrors[--i]._value === promise._value) { - unhandledErrors.splice(i, 1); - return; - } -} -function PromiseReject(reason) { - return new DexiePromise(INTERNAL, false, reason); -} -function wrap(fn, errorCatcher) { - var psd = PSD; - return function () { - var wasRootExec = beginMicroTickScope(), outerScope = PSD; - try { - switchToZone(psd, true); - return fn.apply(this, arguments); - } - catch (e) { - errorCatcher && errorCatcher(e); - } - finally { - switchToZone(outerScope, false); - if (wasRootExec) - endMicroTickScope(); - } - }; -} -var task = { awaits: 0, echoes: 0, id: 0 }; -var taskCounter = 0; -var zoneStack = []; -var zoneEchoes = 0; -var totalEchoes = 0; -var zone_id_counter = 0; -function newScope(fn, props, a1, a2) { - var parent = PSD, psd = Object.create(parent); - psd.parent = parent; - psd.ref = 0; - psd.global = false; - psd.id = ++zone_id_counter; - globalPSD.env; - psd.env = patchGlobalPromise ? { - Promise: DexiePromise, - PromiseProp: { value: DexiePromise, configurable: true, writable: true }, - all: DexiePromise.all, - race: DexiePromise.race, - allSettled: DexiePromise.allSettled, - any: DexiePromise.any, - resolve: DexiePromise.resolve, - reject: DexiePromise.reject, - } : {}; - if (props) - extend(psd, props); - ++parent.ref; - psd.finalize = function () { - --this.parent.ref || this.parent.finalize(); - }; - var rv = usePSD(psd, fn, a1, a2); - if (psd.ref === 0) - psd.finalize(); - return rv; -} -function incrementExpectedAwaits() { - if (!task.id) - task.id = ++taskCounter; - ++task.awaits; - task.echoes += ZONE_ECHO_LIMIT; - return task.id; -} -function decrementExpectedAwaits() { - if (!task.awaits) - return false; - if (--task.awaits === 0) - task.id = 0; - task.echoes = task.awaits * ZONE_ECHO_LIMIT; - return true; -} -if (('' + nativePromiseThen).indexOf('[native code]') === -1) { - incrementExpectedAwaits = decrementExpectedAwaits = nop; -} -function onPossibleParallellAsync(possiblePromise) { - if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) { - incrementExpectedAwaits(); - return possiblePromise.then(function (x) { - decrementExpectedAwaits(); - return x; - }, function (e) { - decrementExpectedAwaits(); - return rejection(e); - }); - } - return possiblePromise; -} -function zoneEnterEcho(targetZone) { - ++totalEchoes; - if (!task.echoes || --task.echoes === 0) { - task.echoes = task.awaits = task.id = 0; - } - zoneStack.push(PSD); - switchToZone(targetZone, true); -} -function zoneLeaveEcho() { - var zone = zoneStack[zoneStack.length - 1]; - zoneStack.pop(); - switchToZone(zone, false); -} -function switchToZone(targetZone, bEnteringZone) { - var currentZone = PSD; - if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) { - queueMicrotask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho); - } - if (targetZone === PSD) - return; - PSD = targetZone; - if (currentZone === globalPSD) - globalPSD.env = snapShot(); - if (patchGlobalPromise) { - var GlobalPromise = globalPSD.env.Promise; - var targetEnv = targetZone.env; - if (currentZone.global || targetZone.global) { - Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp); - GlobalPromise.all = targetEnv.all; - GlobalPromise.race = targetEnv.race; - GlobalPromise.resolve = targetEnv.resolve; - GlobalPromise.reject = targetEnv.reject; - if (targetEnv.allSettled) - GlobalPromise.allSettled = targetEnv.allSettled; - if (targetEnv.any) - GlobalPromise.any = targetEnv.any; - } - } -} -function snapShot() { - var GlobalPromise = _global.Promise; - return patchGlobalPromise ? { - Promise: GlobalPromise, - PromiseProp: Object.getOwnPropertyDescriptor(_global, "Promise"), - all: GlobalPromise.all, - race: GlobalPromise.race, - allSettled: GlobalPromise.allSettled, - any: GlobalPromise.any, - resolve: GlobalPromise.resolve, - reject: GlobalPromise.reject, - } : {}; -} -function usePSD(psd, fn, a1, a2, a3) { - var outerScope = PSD; - try { - switchToZone(psd, true); - return fn(a1, a2, a3); - } - finally { - switchToZone(outerScope, false); - } -} -function nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) { - return typeof fn !== 'function' ? fn : function () { - var outerZone = PSD; - if (possibleAwait) - incrementExpectedAwaits(); - switchToZone(zone, true); - try { - return fn.apply(this, arguments); - } - finally { - switchToZone(outerZone, false); - if (cleanup) - queueMicrotask(decrementExpectedAwaits); - } - }; -} -function execInGlobalContext(cb) { - if (Promise === NativePromise && task.echoes === 0) { - if (zoneEchoes === 0) { - cb(); - } - else { - enqueueNativeMicroTask(cb); - } - } - else { - setTimeout(cb, 0); - } -} -var rejection = DexiePromise.reject; - -function tempTransaction(db, mode, storeNames, fn) { - if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) { - if (db._state.openComplete) { - return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError)); - } - if (!db._state.isBeingOpened) { - if (!db._state.autoOpen) - return rejection(new exceptions.DatabaseClosed()); - db.open().catch(nop); - } - return db._state.dbReadyPromise.then(function () { return tempTransaction(db, mode, storeNames, fn); }); - } - else { - var trans = db._createTransaction(mode, storeNames, db._dbSchema); - try { - trans.create(); - db._state.PR1398_maxLoop = 3; - } - catch (ex) { - if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { - console.warn('Dexie: Need to reopen db'); - db.close({ disableAutoOpen: false }); - return db.open().then(function () { return tempTransaction(db, mode, storeNames, fn); }); - } - return rejection(ex); - } - return trans._promise(mode, function (resolve, reject) { - return newScope(function () { - PSD.trans = trans; - return fn(resolve, reject, trans); - }); - }).then(function (result) { - if (mode === 'readwrite') - try { - trans.idbtrans.commit(); - } - catch (_a) { } - return mode === 'readonly' ? result : trans._completion.then(function () { return result; }); - }); - } -} - -var DEXIE_VERSION = '4.0.7'; -var maxString = String.fromCharCode(65535); -var minKey = -Infinity; -var INVALID_KEY_ARGUMENT = "Invalid key provided. Keys must be of type string, number, Date or Array."; -var STRING_EXPECTED = "String expected."; -var connections = []; -var DBNAMES_DB = '__dbnames'; -var READONLY = 'readonly'; -var READWRITE = 'readwrite'; - -function combine(filter1, filter2) { - return filter1 ? - filter2 ? - function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } : - filter1 : - filter2; -} - -var AnyRange = { - type: 3 , - lower: -Infinity, - lowerOpen: false, - upper: [[]], - upperOpen: false -}; - -function workaroundForUndefinedPrimKey(keyPath) { - return typeof keyPath === "string" && !/\./.test(keyPath) - ? function (obj) { - if (obj[keyPath] === undefined && (keyPath in obj)) { - obj = deepClone(obj); - delete obj[keyPath]; - } - return obj; - } - : function (obj) { return obj; }; -} - -function Entity() { - throw exceptions.Type(); -} - -function cmp(a, b) { - try { - var ta = type(a); - var tb = type(b); - if (ta !== tb) { - if (ta === 'Array') - return 1; - if (tb === 'Array') - return -1; - if (ta === 'binary') - return 1; - if (tb === 'binary') - return -1; - if (ta === 'string') - return 1; - if (tb === 'string') - return -1; - if (ta === 'Date') - return 1; - if (tb !== 'Date') - return NaN; - return -1; - } - switch (ta) { - case 'number': - case 'Date': - case 'string': - return a > b ? 1 : a < b ? -1 : 0; - case 'binary': { - return compareUint8Arrays(getUint8Array(a), getUint8Array(b)); - } - case 'Array': - return compareArrays(a, b); - } - } - catch (_a) { } - return NaN; -} -function compareArrays(a, b) { - var al = a.length; - var bl = b.length; - var l = al < bl ? al : bl; - for (var i = 0; i < l; ++i) { - var res = cmp(a[i], b[i]); - if (res !== 0) - return res; - } - return al === bl ? 0 : al < bl ? -1 : 1; -} -function compareUint8Arrays(a, b) { - var al = a.length; - var bl = b.length; - var l = al < bl ? al : bl; - for (var i = 0; i < l; ++i) { - if (a[i] !== b[i]) - return a[i] < b[i] ? -1 : 1; - } - return al === bl ? 0 : al < bl ? -1 : 1; -} -function type(x) { - var t = typeof x; - if (t !== 'object') - return t; - if (ArrayBuffer.isView(x)) - return 'binary'; - var tsTag = toStringTag(x); - return tsTag === 'ArrayBuffer' ? 'binary' : tsTag; -} -function getUint8Array(a) { - if (a instanceof Uint8Array) - return a; - if (ArrayBuffer.isView(a)) - return new Uint8Array(a.buffer, a.byteOffset, a.byteLength); - return new Uint8Array(a); -} - -var Table = (function () { - function Table() { - } - Table.prototype._trans = function (mode, fn, writeLocked) { - var trans = this._tx || PSD.trans; - var tableName = this.name; - var task = debug && typeof console !== 'undefined' && console.createTask && console.createTask("Dexie: ".concat(mode === 'readonly' ? 'read' : 'write', " ").concat(this.name)); - function checkTableInTransaction(resolve, reject, trans) { - if (!trans.schema[tableName]) - throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); - return fn(trans.idbtrans, trans); - } - var wasRootExec = beginMicroTickScope(); - try { - var p = trans && trans.db._novip === this.db._novip ? - trans === PSD.trans ? - trans._promise(mode, checkTableInTransaction, writeLocked) : - newScope(function () { return trans._promise(mode, checkTableInTransaction, writeLocked); }, { trans: trans, transless: PSD.transless || PSD }) : - tempTransaction(this.db, mode, [this.name], checkTableInTransaction); - if (task) { - p._consoleTask = task; - p = p.catch(function (err) { - console.trace(err); - return rejection(err); - }); - } - return p; - } - finally { - if (wasRootExec) - endMicroTickScope(); - } - }; - Table.prototype.get = function (keyOrCrit, cb) { - var _this = this; - if (keyOrCrit && keyOrCrit.constructor === Object) - return this.where(keyOrCrit).first(cb); - if (keyOrCrit == null) - return rejection(new exceptions.Type("Invalid argument to Table.get()")); - return this._trans('readonly', function (trans) { - return _this.core.get({ trans: trans, key: keyOrCrit }) - .then(function (res) { return _this.hook.reading.fire(res); }); - }).then(cb); - }; - Table.prototype.where = function (indexOrCrit) { - if (typeof indexOrCrit === 'string') - return new this.db.WhereClause(this, indexOrCrit); - if (isArray(indexOrCrit)) - return new this.db.WhereClause(this, "[".concat(indexOrCrit.join('+'), "]")); - var keyPaths = keys(indexOrCrit); - if (keyPaths.length === 1) - return this - .where(keyPaths[0]) - .equals(indexOrCrit[keyPaths[0]]); - var compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(function (ix) { - if (ix.compound && - keyPaths.every(function (keyPath) { return ix.keyPath.indexOf(keyPath) >= 0; })) { - for (var i = 0; i < keyPaths.length; ++i) { - if (keyPaths.indexOf(ix.keyPath[i]) === -1) - return false; - } - return true; - } - return false; - }).sort(function (a, b) { return a.keyPath.length - b.keyPath.length; })[0]; - if (compoundIndex && this.db._maxKey !== maxString) { - var keyPathsInValidOrder = compoundIndex.keyPath.slice(0, keyPaths.length); - return this - .where(keyPathsInValidOrder) - .equals(keyPathsInValidOrder.map(function (kp) { return indexOrCrit[kp]; })); - } - if (!compoundIndex && debug) - console.warn("The query ".concat(JSON.stringify(indexOrCrit), " on ").concat(this.name, " would benefit from a ") + - "compound index [".concat(keyPaths.join('+'), "]")); - var idxByName = this.schema.idxByName; - var idb = this.db._deps.indexedDB; - function equals(a, b) { - return idb.cmp(a, b) === 0; - } - var _a = keyPaths.reduce(function (_a, keyPath) { - var prevIndex = _a[0], prevFilterFn = _a[1]; - var index = idxByName[keyPath]; - var value = indexOrCrit[keyPath]; - return [ - prevIndex || index, - prevIndex || !index ? - combine(prevFilterFn, index && index.multi ? - function (x) { - var prop = getByKeyPath(x, keyPath); - return isArray(prop) && prop.some(function (item) { return equals(value, item); }); - } : function (x) { return equals(value, getByKeyPath(x, keyPath)); }) - : prevFilterFn - ]; - }, [null, null]), idx = _a[0], filterFunction = _a[1]; - return idx ? - this.where(idx.name).equals(indexOrCrit[idx.keyPath]) - .filter(filterFunction) : - compoundIndex ? - this.filter(filterFunction) : - this.where(keyPaths).equals(''); - }; - Table.prototype.filter = function (filterFunction) { - return this.toCollection().and(filterFunction); - }; - Table.prototype.count = function (thenShortcut) { - return this.toCollection().count(thenShortcut); - }; - Table.prototype.offset = function (offset) { - return this.toCollection().offset(offset); - }; - Table.prototype.limit = function (numRows) { - return this.toCollection().limit(numRows); - }; - Table.prototype.each = function (callback) { - return this.toCollection().each(callback); - }; - Table.prototype.toArray = function (thenShortcut) { - return this.toCollection().toArray(thenShortcut); - }; - Table.prototype.toCollection = function () { - return new this.db.Collection(new this.db.WhereClause(this)); - }; - Table.prototype.orderBy = function (index) { - return new this.db.Collection(new this.db.WhereClause(this, isArray(index) ? - "[".concat(index.join('+'), "]") : - index)); - }; - Table.prototype.reverse = function () { - return this.toCollection().reverse(); - }; - Table.prototype.mapToClass = function (constructor) { - var _a = this, db = _a.db, tableName = _a.name; - this.schema.mappedClass = constructor; - if (constructor.prototype instanceof Entity) { - constructor = (function (_super) { - __extends(class_1, _super); - function class_1() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(class_1.prototype, "db", { - get: function () { return db; }, - enumerable: false, - configurable: true - }); - class_1.prototype.table = function () { return tableName; }; - return class_1; - }(constructor)); - } - var inheritedProps = new Set(); - for (var proto = constructor.prototype; proto; proto = getProto(proto)) { - Object.getOwnPropertyNames(proto).forEach(function (propName) { return inheritedProps.add(propName); }); - } - var readHook = function (obj) { - if (!obj) - return obj; - var res = Object.create(constructor.prototype); - for (var m in obj) - if (!inheritedProps.has(m)) - try { - res[m] = obj[m]; - } - catch (_) { } - return res; - }; - if (this.schema.readHook) { - this.hook.reading.unsubscribe(this.schema.readHook); - } - this.schema.readHook = readHook; - this.hook("reading", readHook); - return constructor; - }; - Table.prototype.defineClass = function () { - function Class(content) { - extend(this, content); - } - return this.mapToClass(Class); - }; - Table.prototype.add = function (obj, key) { - var _this = this; - var _a = this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - var objToAdd = obj; - if (keyPath && auto) { - objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); - } - return this._trans('readwrite', function (trans) { - return _this.core.mutate({ trans: trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd] }); - }).then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult; }) - .then(function (lastResult) { - if (keyPath) { - try { - setByKeyPath(obj, keyPath, lastResult); - } - catch (_) { } - } - return lastResult; - }); - }; - Table.prototype.update = function (keyOrObject, modifications) { - if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) { - var key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath); - if (key === undefined) - return rejection(new exceptions.InvalidArgument("Given object does not contain its primary key")); - return this.where(":id").equals(key).modify(modifications); - } - else { - return this.where(":id").equals(keyOrObject).modify(modifications); - } - }; - Table.prototype.put = function (obj, key) { - var _this = this; - var _a = this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - var objToAdd = obj; - if (keyPath && auto) { - objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); - } - return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null }); }) - .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult; }) - .then(function (lastResult) { - if (keyPath) { - try { - setByKeyPath(obj, keyPath, lastResult); - } - catch (_) { } - } - return lastResult; - }); - }; - Table.prototype.delete = function (key) { - var _this = this; - return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'delete', keys: [key] }); }) - .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined; }); - }; - Table.prototype.clear = function () { - var _this = this; - return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'deleteRange', range: AnyRange }); }) - .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined; }); - }; - Table.prototype.bulkGet = function (keys) { - var _this = this; - return this._trans('readonly', function (trans) { - return _this.core.getMany({ - keys: keys, - trans: trans - }).then(function (result) { return result.map(function (res) { return _this.hook.reading.fire(res); }); }); - }); - }; - Table.prototype.bulkAdd = function (objects, keysOrOptions, options) { - var _this = this; - var keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; - options = options || (keys ? undefined : keysOrOptions); - var wantResults = options ? options.allKeys : undefined; - return this._trans('readwrite', function (trans) { - var _a = _this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - if (keyPath && keys) - throw new exceptions.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys"); - if (keys && keys.length !== objects.length) - throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); - var numObjects = objects.length; - var objectsToAdd = keyPath && auto ? - objects.map(workaroundForUndefinedPrimKey(keyPath)) : - objects; - return _this.core.mutate({ trans: trans, type: 'add', keys: keys, values: objectsToAdd, wantResults: wantResults }) - .then(function (_a) { - var numFailures = _a.numFailures, results = _a.results, lastResult = _a.lastResult, failures = _a.failures; - var result = wantResults ? results : lastResult; - if (numFailures === 0) - return result; - throw new BulkError("".concat(_this.name, ".bulkAdd(): ").concat(numFailures, " of ").concat(numObjects, " operations failed"), failures); - }); - }); - }; - Table.prototype.bulkPut = function (objects, keysOrOptions, options) { - var _this = this; - var keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; - options = options || (keys ? undefined : keysOrOptions); - var wantResults = options ? options.allKeys : undefined; - return this._trans('readwrite', function (trans) { - var _a = _this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - if (keyPath && keys) - throw new exceptions.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys"); - if (keys && keys.length !== objects.length) - throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); - var numObjects = objects.length; - var objectsToPut = keyPath && auto ? - objects.map(workaroundForUndefinedPrimKey(keyPath)) : - objects; - return _this.core.mutate({ trans: trans, type: 'put', keys: keys, values: objectsToPut, wantResults: wantResults }) - .then(function (_a) { - var numFailures = _a.numFailures, results = _a.results, lastResult = _a.lastResult, failures = _a.failures; - var result = wantResults ? results : lastResult; - if (numFailures === 0) - return result; - throw new BulkError("".concat(_this.name, ".bulkPut(): ").concat(numFailures, " of ").concat(numObjects, " operations failed"), failures); - }); - }); - }; - Table.prototype.bulkUpdate = function (keysAndChanges) { - var _this = this; - var coreTable = this.core; - var keys = keysAndChanges.map(function (entry) { return entry.key; }); - var changeSpecs = keysAndChanges.map(function (entry) { return entry.changes; }); - var offsetMap = []; - return this._trans('readwrite', function (trans) { - return coreTable.getMany({ trans: trans, keys: keys, cache: 'clone' }).then(function (objs) { - var resultKeys = []; - var resultObjs = []; - keysAndChanges.forEach(function (_a, idx) { - var key = _a.key, changes = _a.changes; - var obj = objs[idx]; - if (obj) { - for (var _i = 0, _b = Object.keys(changes); _i < _b.length; _i++) { - var keyPath = _b[_i]; - var value = changes[keyPath]; - if (keyPath === _this.schema.primKey.keyPath) { - if (cmp(value, key) !== 0) { - throw new exceptions.Constraint("Cannot update primary key in bulkUpdate()"); - } - } - else { - setByKeyPath(obj, keyPath, value); - } - } - offsetMap.push(idx); - resultKeys.push(key); - resultObjs.push(obj); - } - }); - var numEntries = resultKeys.length; - return coreTable - .mutate({ - trans: trans, - type: 'put', - keys: resultKeys, - values: resultObjs, - updates: { - keys: keys, - changeSpecs: changeSpecs - } - }) - .then(function (_a) { - var numFailures = _a.numFailures, failures = _a.failures; - if (numFailures === 0) - return numEntries; - for (var _i = 0, _b = Object.keys(failures); _i < _b.length; _i++) { - var offset = _b[_i]; - var mappedOffset = offsetMap[Number(offset)]; - if (mappedOffset != null) { - var failure = failures[offset]; - delete failures[offset]; - failures[mappedOffset] = failure; - } - } - throw new BulkError("".concat(_this.name, ".bulkUpdate(): ").concat(numFailures, " of ").concat(numEntries, " operations failed"), failures); - }); - }); - }); - }; - Table.prototype.bulkDelete = function (keys) { - var _this = this; - var numKeys = keys.length; - return this._trans('readwrite', function (trans) { - return _this.core.mutate({ trans: trans, type: 'delete', keys: keys }); - }).then(function (_a) { - var numFailures = _a.numFailures, lastResult = _a.lastResult, failures = _a.failures; - if (numFailures === 0) - return lastResult; - throw new BulkError("".concat(_this.name, ".bulkDelete(): ").concat(numFailures, " of ").concat(numKeys, " operations failed"), failures); - }); - }; - return Table; -}()); - -function Events(ctx) { - var evs = {}; - var rv = function (eventName, subscriber) { - if (subscriber) { - var i = arguments.length, args = new Array(i - 1); - while (--i) - args[i - 1] = arguments[i]; - evs[eventName].subscribe.apply(null, args); - return ctx; - } - else if (typeof (eventName) === 'string') { - return evs[eventName]; - } - }; - rv.addEventType = add; - for (var i = 1, l = arguments.length; i < l; ++i) { - add(arguments[i]); - } - return rv; - function add(eventName, chainFunction, defaultFunction) { - if (typeof eventName === 'object') - return addConfiguredEvents(eventName); - if (!chainFunction) - chainFunction = reverseStoppableEventChain; - if (!defaultFunction) - defaultFunction = nop; - var context = { - subscribers: [], - fire: defaultFunction, - subscribe: function (cb) { - if (context.subscribers.indexOf(cb) === -1) { - context.subscribers.push(cb); - context.fire = chainFunction(context.fire, cb); - } - }, - unsubscribe: function (cb) { - context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; }); - context.fire = context.subscribers.reduce(chainFunction, defaultFunction); - } - }; - evs[eventName] = rv[eventName] = context; - return context; - } - function addConfiguredEvents(cfg) { - keys(cfg).forEach(function (eventName) { - var args = cfg[eventName]; - if (isArray(args)) { - add(eventName, cfg[eventName][0], cfg[eventName][1]); - } - else if (args === 'asap') { - var context = add(eventName, mirror, function fire() { - var i = arguments.length, args = new Array(i); - while (i--) - args[i] = arguments[i]; - context.subscribers.forEach(function (fn) { - asap$1(function fireEvent() { - fn.apply(null, args); - }); - }); - }); - } - else - throw new exceptions.InvalidArgument("Invalid event config"); - }); - } -} - -function makeClassConstructor(prototype, constructor) { - derive(constructor).from({ prototype: prototype }); - return constructor; -} - -function createTableConstructor(db) { - return makeClassConstructor(Table.prototype, function Table(name, tableSchema, trans) { - this.db = db; - this._tx = trans; - this.name = name; - this.schema = tableSchema; - this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, { - "creating": [hookCreatingChain, nop], - "reading": [pureFunctionChain, mirror], - "updating": [hookUpdatingChain, nop], - "deleting": [hookDeletingChain, nop] - }); - }); -} - -function isPlainKeyRange(ctx, ignoreLimitFilter) { - return !(ctx.filter || ctx.algorithm || ctx.or) && - (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter); -} -function addFilter(ctx, fn) { - ctx.filter = combine(ctx.filter, fn); -} -function addReplayFilter(ctx, factory, isLimitFilter) { - var curr = ctx.replayFilter; - ctx.replayFilter = curr ? function () { return combine(curr(), factory()); } : factory; - ctx.justLimit = isLimitFilter && !curr; -} -function addMatchFilter(ctx, fn) { - ctx.isMatch = combine(ctx.isMatch, fn); -} -function getIndexOrStore(ctx, coreSchema) { - if (ctx.isPrimKey) - return coreSchema.primaryKey; - var index = coreSchema.getIndexByKeyPath(ctx.index); - if (!index) - throw new exceptions.Schema("KeyPath " + ctx.index + " on object store " + coreSchema.name + " is not indexed"); - return index; -} -function openCursor(ctx, coreTable, trans) { - var index = getIndexOrStore(ctx, coreTable.schema); - return coreTable.openCursor({ - trans: trans, - values: !ctx.keysOnly, - reverse: ctx.dir === 'prev', - unique: !!ctx.unique, - query: { - index: index, - range: ctx.range - } - }); -} -function iter(ctx, fn, coreTrans, coreTable) { - var filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter; - if (!ctx.or) { - return iterate(openCursor(ctx, coreTable, coreTrans), combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper); - } - else { - var set_1 = {}; - var union = function (item, cursor, advance) { - if (!filter || filter(cursor, advance, function (result) { return cursor.stop(result); }, function (err) { return cursor.fail(err); })) { - var primaryKey = cursor.primaryKey; - var key = '' + primaryKey; - if (key === '[object ArrayBuffer]') - key = '' + new Uint8Array(primaryKey); - if (!hasOwn(set_1, key)) { - set_1[key] = true; - fn(item, cursor, advance); - } - } - }; - return Promise.all([ - ctx.or._iterate(union, coreTrans), - iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper) - ]); - } -} -function iterate(cursorPromise, filter, fn, valueMapper) { - var mappedFn = valueMapper ? function (x, c, a) { return fn(valueMapper(x), c, a); } : fn; - var wrappedFn = wrap(mappedFn); - return cursorPromise.then(function (cursor) { - if (cursor) { - return cursor.start(function () { - var c = function () { return cursor.continue(); }; - if (!filter || filter(cursor, function (advancer) { return c = advancer; }, function (val) { cursor.stop(val); c = nop; }, function (e) { cursor.fail(e); c = nop; })) - wrappedFn(cursor.value, cursor, function (advancer) { return c = advancer; }); - c(); - }); - } - }); -} - -var PropModSymbol = Symbol(); -var PropModification = (function () { - function PropModification(spec) { - Object.assign(this, spec); - } - PropModification.prototype.execute = function (value) { - var _a; - if (this.add !== undefined) { - var term = this.add; - if (isArray(term)) { - return __spreadArray(__spreadArray([], (isArray(value) ? value : []), true), term, true).sort(); - } - if (typeof term === 'number') - return (Number(value) || 0) + term; - if (typeof term === 'bigint') { - try { - return BigInt(value) + term; - } - catch (_b) { - return BigInt(0) + term; - } - } - throw new TypeError("Invalid term ".concat(term)); - } - if (this.remove !== undefined) { - var subtrahend_1 = this.remove; - if (isArray(subtrahend_1)) { - return isArray(value) ? value.filter(function (item) { return !subtrahend_1.includes(item); }).sort() : []; - } - if (typeof subtrahend_1 === 'number') - return Number(value) - subtrahend_1; - if (typeof subtrahend_1 === 'bigint') { - try { - return BigInt(value) - subtrahend_1; - } - catch (_c) { - return BigInt(0) - subtrahend_1; - } - } - throw new TypeError("Invalid subtrahend ".concat(subtrahend_1)); - } - var prefixToReplace = (_a = this.replacePrefix) === null || _a === void 0 ? void 0 : _a[0]; - if (prefixToReplace && typeof value === 'string' && value.startsWith(prefixToReplace)) { - return this.replacePrefix[1] + value.substring(prefixToReplace.length); - } - return value; - }; - return PropModification; -}()); - -var Collection = (function () { - function Collection() { - } - Collection.prototype._read = function (fn, cb) { - var ctx = this._ctx; - return ctx.error ? - ctx.table._trans(null, rejection.bind(null, ctx.error)) : - ctx.table._trans('readonly', fn).then(cb); - }; - Collection.prototype._write = function (fn) { - var ctx = this._ctx; - return ctx.error ? - ctx.table._trans(null, rejection.bind(null, ctx.error)) : - ctx.table._trans('readwrite', fn, "locked"); - }; - Collection.prototype._addAlgorithm = function (fn) { - var ctx = this._ctx; - ctx.algorithm = combine(ctx.algorithm, fn); - }; - Collection.prototype._iterate = function (fn, coreTrans) { - return iter(this._ctx, fn, coreTrans, this._ctx.table.core); - }; - Collection.prototype.clone = function (props) { - var rv = Object.create(this.constructor.prototype), ctx = Object.create(this._ctx); - if (props) - extend(ctx, props); - rv._ctx = ctx; - return rv; - }; - Collection.prototype.raw = function () { - this._ctx.valueMapper = null; - return this; - }; - Collection.prototype.each = function (fn) { - var ctx = this._ctx; - return this._read(function (trans) { return iter(ctx, fn, trans, ctx.table.core); }); - }; - Collection.prototype.count = function (cb) { - var _this = this; - return this._read(function (trans) { - var ctx = _this._ctx; - var coreTable = ctx.table.core; - if (isPlainKeyRange(ctx, true)) { - return coreTable.count({ - trans: trans, - query: { - index: getIndexOrStore(ctx, coreTable.schema), - range: ctx.range - } - }).then(function (count) { return Math.min(count, ctx.limit); }); - } - else { - var count = 0; - return iter(ctx, function () { ++count; return false; }, trans, coreTable) - .then(function () { return count; }); - } - }).then(cb); - }; - Collection.prototype.sortBy = function (keyPath, cb) { - var parts = keyPath.split('.').reverse(), lastPart = parts[0], lastIndex = parts.length - 1; - function getval(obj, i) { - if (i) - return getval(obj[parts[i]], i - 1); - return obj[lastPart]; - } - var order = this._ctx.dir === "next" ? 1 : -1; - function sorter(a, b) { - var aVal = getval(a, lastIndex), bVal = getval(b, lastIndex); - return aVal < bVal ? -order : aVal > bVal ? order : 0; - } - return this.toArray(function (a) { - return a.sort(sorter); - }).then(cb); - }; - Collection.prototype.toArray = function (cb) { - var _this = this; - return this._read(function (trans) { - var ctx = _this._ctx; - if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { - var valueMapper_1 = ctx.valueMapper; - var index = getIndexOrStore(ctx, ctx.table.core.schema); - return ctx.table.core.query({ - trans: trans, - limit: ctx.limit, - values: true, - query: { - index: index, - range: ctx.range - } - }).then(function (_a) { - var result = _a.result; - return valueMapper_1 ? result.map(valueMapper_1) : result; - }); - } - else { - var a_1 = []; - return iter(ctx, function (item) { return a_1.push(item); }, trans, ctx.table.core).then(function () { return a_1; }); - } - }, cb); - }; - Collection.prototype.offset = function (offset) { - var ctx = this._ctx; - if (offset <= 0) - return this; - ctx.offset += offset; - if (isPlainKeyRange(ctx)) { - addReplayFilter(ctx, function () { - var offsetLeft = offset; - return function (cursor, advance) { - if (offsetLeft === 0) - return true; - if (offsetLeft === 1) { - --offsetLeft; - return false; - } - advance(function () { - cursor.advance(offsetLeft); - offsetLeft = 0; - }); - return false; - }; - }); - } - else { - addReplayFilter(ctx, function () { - var offsetLeft = offset; - return function () { return (--offsetLeft < 0); }; - }); - } - return this; - }; - Collection.prototype.limit = function (numRows) { - this._ctx.limit = Math.min(this._ctx.limit, numRows); - addReplayFilter(this._ctx, function () { - var rowsLeft = numRows; - return function (cursor, advance, resolve) { - if (--rowsLeft <= 0) - advance(resolve); - return rowsLeft >= 0; - }; - }, true); - return this; - }; - Collection.prototype.until = function (filterFunction, bIncludeStopEntry) { - addFilter(this._ctx, function (cursor, advance, resolve) { - if (filterFunction(cursor.value)) { - advance(resolve); - return bIncludeStopEntry; - } - else { - return true; - } - }); - return this; - }; - Collection.prototype.first = function (cb) { - return this.limit(1).toArray(function (a) { return a[0]; }).then(cb); - }; - Collection.prototype.last = function (cb) { - return this.reverse().first(cb); - }; - Collection.prototype.filter = function (filterFunction) { - addFilter(this._ctx, function (cursor) { - return filterFunction(cursor.value); - }); - addMatchFilter(this._ctx, filterFunction); - return this; - }; - Collection.prototype.and = function (filter) { - return this.filter(filter); - }; - Collection.prototype.or = function (indexName) { - return new this.db.WhereClause(this._ctx.table, indexName, this); - }; - Collection.prototype.reverse = function () { - this._ctx.dir = (this._ctx.dir === "prev" ? "next" : "prev"); - if (this._ondirectionchange) - this._ondirectionchange(this._ctx.dir); - return this; - }; - Collection.prototype.desc = function () { - return this.reverse(); - }; - Collection.prototype.eachKey = function (cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - return this.each(function (val, cursor) { cb(cursor.key, cursor); }); - }; - Collection.prototype.eachUniqueKey = function (cb) { - this._ctx.unique = "unique"; - return this.eachKey(cb); - }; - Collection.prototype.eachPrimaryKey = function (cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); }); - }; - Collection.prototype.keys = function (cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - var a = []; - return this.each(function (item, cursor) { - a.push(cursor.key); - }).then(function () { - return a; - }).then(cb); - }; - Collection.prototype.primaryKeys = function (cb) { - var ctx = this._ctx; - if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { - return this._read(function (trans) { - var index = getIndexOrStore(ctx, ctx.table.core.schema); - return ctx.table.core.query({ - trans: trans, - values: false, - limit: ctx.limit, - query: { - index: index, - range: ctx.range - } - }); - }).then(function (_a) { - var result = _a.result; - return result; - }).then(cb); - } - ctx.keysOnly = !ctx.isMatch; - var a = []; - return this.each(function (item, cursor) { - a.push(cursor.primaryKey); - }).then(function () { - return a; - }).then(cb); - }; - Collection.prototype.uniqueKeys = function (cb) { - this._ctx.unique = "unique"; - return this.keys(cb); - }; - Collection.prototype.firstKey = function (cb) { - return this.limit(1).keys(function (a) { return a[0]; }).then(cb); - }; - Collection.prototype.lastKey = function (cb) { - return this.reverse().firstKey(cb); - }; - Collection.prototype.distinct = function () { - var ctx = this._ctx, idx = ctx.index && ctx.table.schema.idxByName[ctx.index]; - if (!idx || !idx.multi) - return this; - var set = {}; - addFilter(this._ctx, function (cursor) { - var strKey = cursor.primaryKey.toString(); - var found = hasOwn(set, strKey); - set[strKey] = true; - return !found; - }); - return this; - }; - Collection.prototype.modify = function (changes) { - var _this = this; - var ctx = this._ctx; - return this._write(function (trans) { - var modifyer; - if (typeof changes === 'function') { - modifyer = changes; - } - else { - var keyPaths = keys(changes); - var numKeys = keyPaths.length; - modifyer = function (item) { - var anythingModified = false; - for (var i = 0; i < numKeys; ++i) { - var keyPath = keyPaths[i]; - var val = changes[keyPath]; - var origVal = getByKeyPath(item, keyPath); - if (val instanceof PropModification) { - setByKeyPath(item, keyPath, val.execute(origVal)); - anythingModified = true; - } - else if (origVal !== val) { - setByKeyPath(item, keyPath, val); - anythingModified = true; - } - } - return anythingModified; - }; - } - var coreTable = ctx.table.core; - var _a = coreTable.schema.primaryKey, outbound = _a.outbound, extractKey = _a.extractKey; - var limit = _this.db._options.modifyChunkSize || 200; - var totalFailures = []; - var successCount = 0; - var failedKeys = []; - var applyMutateResult = function (expectedCount, res) { - var failures = res.failures, numFailures = res.numFailures; - successCount += expectedCount - numFailures; - for (var _i = 0, _a = keys(failures); _i < _a.length; _i++) { - var pos = _a[_i]; - totalFailures.push(failures[pos]); - } - }; - return _this.clone().primaryKeys().then(function (keys) { - var criteria = isPlainKeyRange(ctx) && - ctx.limit === Infinity && - (typeof changes !== 'function' || changes === deleteCallback) && { - index: ctx.index, - range: ctx.range - }; - var nextChunk = function (offset) { - var count = Math.min(limit, keys.length - offset); - return coreTable.getMany({ - trans: trans, - keys: keys.slice(offset, offset + count), - cache: "immutable" - }).then(function (values) { - var addValues = []; - var putValues = []; - var putKeys = outbound ? [] : null; - var deleteKeys = []; - for (var i = 0; i < count; ++i) { - var origValue = values[i]; - var ctx_1 = { - value: deepClone(origValue), - primKey: keys[offset + i] - }; - if (modifyer.call(ctx_1, ctx_1.value, ctx_1) !== false) { - if (ctx_1.value == null) { - deleteKeys.push(keys[offset + i]); - } - else if (!outbound && cmp(extractKey(origValue), extractKey(ctx_1.value)) !== 0) { - deleteKeys.push(keys[offset + i]); - addValues.push(ctx_1.value); - } - else { - putValues.push(ctx_1.value); - if (outbound) - putKeys.push(keys[offset + i]); - } - } - } - return Promise.resolve(addValues.length > 0 && - coreTable.mutate({ trans: trans, type: 'add', values: addValues }) - .then(function (res) { - for (var pos in res.failures) { - deleteKeys.splice(parseInt(pos), 1); - } - applyMutateResult(addValues.length, res); - })).then(function () { return (putValues.length > 0 || (criteria && typeof changes === 'object')) && - coreTable.mutate({ - trans: trans, - type: 'put', - keys: putKeys, - values: putValues, - criteria: criteria, - changeSpec: typeof changes !== 'function' - && changes, - isAdditionalChunk: offset > 0 - }).then(function (res) { return applyMutateResult(putValues.length, res); }); }).then(function () { return (deleteKeys.length > 0 || (criteria && changes === deleteCallback)) && - coreTable.mutate({ - trans: trans, - type: 'delete', - keys: deleteKeys, - criteria: criteria, - isAdditionalChunk: offset > 0 - }).then(function (res) { return applyMutateResult(deleteKeys.length, res); }); }).then(function () { - return keys.length > offset + count && nextChunk(offset + limit); - }); - }); - }; - return nextChunk(0).then(function () { - if (totalFailures.length > 0) - throw new ModifyError("Error modifying one or more objects", totalFailures, successCount, failedKeys); - return keys.length; - }); - }); - }); - }; - Collection.prototype.delete = function () { - var ctx = this._ctx, range = ctx.range; - if (isPlainKeyRange(ctx) && - (ctx.isPrimKey || range.type === 3 )) - { - return this._write(function (trans) { - var primaryKey = ctx.table.core.schema.primaryKey; - var coreRange = range; - return ctx.table.core.count({ trans: trans, query: { index: primaryKey, range: coreRange } }).then(function (count) { - return ctx.table.core.mutate({ trans: trans, type: 'deleteRange', range: coreRange }) - .then(function (_a) { - var failures = _a.failures; _a.lastResult; _a.results; var numFailures = _a.numFailures; - if (numFailures) - throw new ModifyError("Could not delete some values", Object.keys(failures).map(function (pos) { return failures[pos]; }), count - numFailures); - return count - numFailures; - }); - }); - }); - } - return this.modify(deleteCallback); - }; - return Collection; -}()); -var deleteCallback = function (value, ctx) { return ctx.value = null; }; - -function createCollectionConstructor(db) { - return makeClassConstructor(Collection.prototype, function Collection(whereClause, keyRangeGenerator) { - this.db = db; - var keyRange = AnyRange, error = null; - if (keyRangeGenerator) - try { - keyRange = keyRangeGenerator(); - } - catch (ex) { - error = ex; - } - var whereCtx = whereClause._ctx; - var table = whereCtx.table; - var readingHook = table.hook.reading.fire; - this._ctx = { - table: table, - index: whereCtx.index, - isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)), - range: keyRange, - keysOnly: false, - dir: "next", - unique: "", - algorithm: null, - filter: null, - replayFilter: null, - justLimit: true, - isMatch: null, - offset: 0, - limit: Infinity, - error: error, - or: whereCtx.or, - valueMapper: readingHook !== mirror ? readingHook : null - }; - }); -} - -function simpleCompare(a, b) { - return a < b ? -1 : a === b ? 0 : 1; -} -function simpleCompareReverse(a, b) { - return a > b ? -1 : a === b ? 0 : 1; -} - -function fail(collectionOrWhereClause, err, T) { - var collection = collectionOrWhereClause instanceof WhereClause ? - new collectionOrWhereClause.Collection(collectionOrWhereClause) : - collectionOrWhereClause; - collection._ctx.error = T ? new T(err) : new TypeError(err); - return collection; -} -function emptyCollection(whereClause) { - return new whereClause.Collection(whereClause, function () { return rangeEqual(""); }).limit(0); -} -function upperFactory(dir) { - return dir === "next" ? - function (s) { return s.toUpperCase(); } : - function (s) { return s.toLowerCase(); }; -} -function lowerFactory(dir) { - return dir === "next" ? - function (s) { return s.toLowerCase(); } : - function (s) { return s.toUpperCase(); }; -} -function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) { - var length = Math.min(key.length, lowerNeedle.length); - var llp = -1; - for (var i = 0; i < length; ++i) { - var lwrKeyChar = lowerKey[i]; - if (lwrKeyChar !== lowerNeedle[i]) { - if (cmp(key[i], upperNeedle[i]) < 0) - return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1); - if (cmp(key[i], lowerNeedle[i]) < 0) - return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1); - if (llp >= 0) - return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1); - return null; - } - if (cmp(key[i], lwrKeyChar) < 0) - llp = i; - } - if (length < lowerNeedle.length && dir === "next") - return key + upperNeedle.substr(key.length); - if (length < key.length && dir === "prev") - return key.substr(0, upperNeedle.length); - return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1)); -} -function addIgnoreCaseAlgorithm(whereClause, match, needles, suffix) { - var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix, needlesLen = needles.length; - if (!needles.every(function (s) { return typeof s === 'string'; })) { - return fail(whereClause, STRING_EXPECTED); - } - function initDirection(dir) { - upper = upperFactory(dir); - lower = lowerFactory(dir); - compare = (dir === "next" ? simpleCompare : simpleCompareReverse); - var needleBounds = needles.map(function (needle) { - return { lower: lower(needle), upper: upper(needle) }; - }).sort(function (a, b) { - return compare(a.lower, b.lower); - }); - upperNeedles = needleBounds.map(function (nb) { return nb.upper; }); - lowerNeedles = needleBounds.map(function (nb) { return nb.lower; }); - direction = dir; - nextKeySuffix = (dir === "next" ? "" : suffix); - } - initDirection("next"); - var c = new whereClause.Collection(whereClause, function () { return createRange(upperNeedles[0], lowerNeedles[needlesLen - 1] + suffix); }); - c._ondirectionchange = function (direction) { - initDirection(direction); - }; - var firstPossibleNeedle = 0; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - if (typeof key !== 'string') - return false; - var lowerKey = lower(key); - if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) { - return true; - } - else { - var lowestPossibleCasing = null; - for (var i = firstPossibleNeedle; i < needlesLen; ++i) { - var casing = nextCasing(key, lowerKey, upperNeedles[i], lowerNeedles[i], compare, direction); - if (casing === null && lowestPossibleCasing === null) - firstPossibleNeedle = i + 1; - else if (lowestPossibleCasing === null || compare(lowestPossibleCasing, casing) > 0) { - lowestPossibleCasing = casing; - } - } - if (lowestPossibleCasing !== null) { - advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); }); - } - else { - advance(resolve); - } - return false; - } - }); - return c; -} -function createRange(lower, upper, lowerOpen, upperOpen) { - return { - type: 2 , - lower: lower, - upper: upper, - lowerOpen: lowerOpen, - upperOpen: upperOpen - }; -} -function rangeEqual(value) { - return { - type: 1 , - lower: value, - upper: value - }; -} - -var WhereClause = (function () { - function WhereClause() { - } - Object.defineProperty(WhereClause.prototype, "Collection", { - get: function () { - return this._ctx.table.db.Collection; - }, - enumerable: false, - configurable: true - }); - WhereClause.prototype.between = function (lower, upper, includeLower, includeUpper) { - includeLower = includeLower !== false; - includeUpper = includeUpper === true; - try { - if ((this._cmp(lower, upper) > 0) || - (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper))) - return emptyCollection(this); - return new this.Collection(this, function () { return createRange(lower, upper, !includeLower, !includeUpper); }); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - }; - WhereClause.prototype.equals = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return rangeEqual(value); }); - }; - WhereClause.prototype.above = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(value, undefined, true); }); - }; - WhereClause.prototype.aboveOrEqual = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(value, undefined, false); }); - }; - WhereClause.prototype.below = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(undefined, value, false, true); }); - }; - WhereClause.prototype.belowOrEqual = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(undefined, value); }); - }; - WhereClause.prototype.startsWith = function (str) { - if (typeof str !== 'string') - return fail(this, STRING_EXPECTED); - return this.between(str, str + maxString, true, true); - }; - WhereClause.prototype.startsWithIgnoreCase = function (str) { - if (str === "") - return this.startsWith(str); - return addIgnoreCaseAlgorithm(this, function (x, a) { return x.indexOf(a[0]) === 0; }, [str], maxString); - }; - WhereClause.prototype.equalsIgnoreCase = function (str) { - return addIgnoreCaseAlgorithm(this, function (x, a) { return x === a[0]; }, [str], ""); - }; - WhereClause.prototype.anyOfIgnoreCase = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return emptyCollection(this); - return addIgnoreCaseAlgorithm(this, function (x, a) { return a.indexOf(x) !== -1; }, set, ""); - }; - WhereClause.prototype.startsWithAnyOfIgnoreCase = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return emptyCollection(this); - return addIgnoreCaseAlgorithm(this, function (x, a) { return a.some(function (n) { return x.indexOf(n) === 0; }); }, set, maxString); - }; - WhereClause.prototype.anyOf = function () { - var _this = this; - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - var compare = this._cmp; - try { - set.sort(compare); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - if (set.length === 0) - return emptyCollection(this); - var c = new this.Collection(this, function () { return createRange(set[0], set[set.length - 1]); }); - c._ondirectionchange = function (direction) { - compare = (direction === "next" ? - _this._ascending : - _this._descending); - set.sort(compare); - }; - var i = 0; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - while (compare(key, set[i]) > 0) { - ++i; - if (i === set.length) { - advance(resolve); - return false; - } - } - if (compare(key, set[i]) === 0) { - return true; - } - else { - advance(function () { cursor.continue(set[i]); }); - return false; - } - }); - return c; - }; - WhereClause.prototype.notEqual = function (value) { - return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false }); - }; - WhereClause.prototype.noneOf = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return new this.Collection(this); - try { - set.sort(this._ascending); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - var ranges = set.reduce(function (res, val) { return res ? - res.concat([[res[res.length - 1][1], val]]) : - [[minKey, val]]; }, null); - ranges.push([set[set.length - 1], this.db._maxKey]); - return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false }); - }; - WhereClause.prototype.inAnyRange = function (ranges, options) { - var _this = this; - var cmp = this._cmp, ascending = this._ascending, descending = this._descending, min = this._min, max = this._max; - if (ranges.length === 0) - return emptyCollection(this); - if (!ranges.every(function (range) { - return range[0] !== undefined && - range[1] !== undefined && - ascending(range[0], range[1]) <= 0; - })) { - return fail(this, "First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower", exceptions.InvalidArgument); - } - var includeLowers = !options || options.includeLowers !== false; - var includeUppers = options && options.includeUppers === true; - function addRange(ranges, newRange) { - var i = 0, l = ranges.length; - for (; i < l; ++i) { - var range = ranges[i]; - if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) { - range[0] = min(range[0], newRange[0]); - range[1] = max(range[1], newRange[1]); - break; - } - } - if (i === l) - ranges.push(newRange); - return ranges; - } - var sortDirection = ascending; - function rangeSorter(a, b) { return sortDirection(a[0], b[0]); } - var set; - try { - set = ranges.reduce(addRange, []); - set.sort(rangeSorter); - } - catch (ex) { - return fail(this, INVALID_KEY_ARGUMENT); - } - var rangePos = 0; - var keyIsBeyondCurrentEntry = includeUppers ? - function (key) { return ascending(key, set[rangePos][1]) > 0; } : - function (key) { return ascending(key, set[rangePos][1]) >= 0; }; - var keyIsBeforeCurrentEntry = includeLowers ? - function (key) { return descending(key, set[rangePos][0]) > 0; } : - function (key) { return descending(key, set[rangePos][0]) >= 0; }; - function keyWithinCurrentRange(key) { - return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key); - } - var checkKey = keyIsBeyondCurrentEntry; - var c = new this.Collection(this, function () { return createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers); }); - c._ondirectionchange = function (direction) { - if (direction === "next") { - checkKey = keyIsBeyondCurrentEntry; - sortDirection = ascending; - } - else { - checkKey = keyIsBeforeCurrentEntry; - sortDirection = descending; - } - set.sort(rangeSorter); - }; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - while (checkKey(key)) { - ++rangePos; - if (rangePos === set.length) { - advance(resolve); - return false; - } - } - if (keyWithinCurrentRange(key)) { - return true; - } - else if (_this._cmp(key, set[rangePos][1]) === 0 || _this._cmp(key, set[rangePos][0]) === 0) { - return false; - } - else { - advance(function () { - if (sortDirection === ascending) - cursor.continue(set[rangePos][0]); - else - cursor.continue(set[rangePos][1]); - }); - return false; - } - }); - return c; - }; - WhereClause.prototype.startsWithAnyOf = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (!set.every(function (s) { return typeof s === 'string'; })) { - return fail(this, "startsWithAnyOf() only works with strings"); - } - if (set.length === 0) - return emptyCollection(this); - return this.inAnyRange(set.map(function (str) { return [str, str + maxString]; })); - }; - return WhereClause; -}()); - -function createWhereClauseConstructor(db) { - return makeClassConstructor(WhereClause.prototype, function WhereClause(table, index, orCollection) { - this.db = db; - this._ctx = { - table: table, - index: index === ":id" ? null : index, - or: orCollection - }; - this._cmp = this._ascending = cmp; - this._descending = function (a, b) { return cmp(b, a); }; - this._max = function (a, b) { return cmp(a, b) > 0 ? a : b; }; - this._min = function (a, b) { return cmp(a, b) < 0 ? a : b; }; - this._IDBKeyRange = db._deps.IDBKeyRange; - if (!this._IDBKeyRange) - throw new exceptions.MissingAPI(); - }); -} - -function eventRejectHandler(reject) { - return wrap(function (event) { - preventDefault(event); - reject(event.target.error); - return false; - }); -} -function preventDefault(event) { - if (event.stopPropagation) - event.stopPropagation(); - if (event.preventDefault) - event.preventDefault(); -} - -var DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated'; -var STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1'; -var globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME); - -var Transaction = (function () { - function Transaction() { - } - Transaction.prototype._lock = function () { - assert(!PSD.global); - ++this._reculock; - if (this._reculock === 1 && !PSD.global) - PSD.lockOwnerFor = this; - return this; - }; - Transaction.prototype._unlock = function () { - assert(!PSD.global); - if (--this._reculock === 0) { - if (!PSD.global) - PSD.lockOwnerFor = null; - while (this._blockedFuncs.length > 0 && !this._locked()) { - var fnAndPSD = this._blockedFuncs.shift(); - try { - usePSD(fnAndPSD[1], fnAndPSD[0]); - } - catch (e) { } - } - } - return this; - }; - Transaction.prototype._locked = function () { - return this._reculock && PSD.lockOwnerFor !== this; - }; - Transaction.prototype.create = function (idbtrans) { - var _this = this; - if (!this.mode) - return this; - var idbdb = this.db.idbdb; - var dbOpenError = this.db._state.dbOpenError; - assert(!this.idbtrans); - if (!idbtrans && !idbdb) { - switch (dbOpenError && dbOpenError.name) { - case "DatabaseClosedError": - throw new exceptions.DatabaseClosed(dbOpenError); - case "MissingAPIError": - throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError); - default: - throw new exceptions.OpenFailed(dbOpenError); - } - } - if (!this.active) - throw new exceptions.TransactionInactive(); - assert(this._completion._state === null); - idbtrans = this.idbtrans = idbtrans || - (this.db.core - ? this.db.core.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability }) - : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })); - idbtrans.onerror = wrap(function (ev) { - preventDefault(ev); - _this._reject(idbtrans.error); - }); - idbtrans.onabort = wrap(function (ev) { - preventDefault(ev); - _this.active && _this._reject(new exceptions.Abort(idbtrans.error)); - _this.active = false; - _this.on("abort").fire(ev); - }); - idbtrans.oncomplete = wrap(function () { - _this.active = false; - _this._resolve(); - if ('mutatedParts' in idbtrans) { - globalEvents.storagemutated.fire(idbtrans["mutatedParts"]); - } - }); - return this; - }; - Transaction.prototype._promise = function (mode, fn, bWriteLock) { - var _this = this; - if (mode === 'readwrite' && this.mode !== 'readwrite') - return rejection(new exceptions.ReadOnly("Transaction is readonly")); - if (!this.active) - return rejection(new exceptions.TransactionInactive()); - if (this._locked()) { - return new DexiePromise(function (resolve, reject) { - _this._blockedFuncs.push([function () { - _this._promise(mode, fn, bWriteLock).then(resolve, reject); - }, PSD]); - }); - } - else if (bWriteLock) { - return newScope(function () { - var p = new DexiePromise(function (resolve, reject) { - _this._lock(); - var rv = fn(resolve, reject, _this); - if (rv && rv.then) - rv.then(resolve, reject); - }); - p.finally(function () { return _this._unlock(); }); - p._lib = true; - return p; - }); - } - else { - var p = new DexiePromise(function (resolve, reject) { - var rv = fn(resolve, reject, _this); - if (rv && rv.then) - rv.then(resolve, reject); - }); - p._lib = true; - return p; - } - }; - Transaction.prototype._root = function () { - return this.parent ? this.parent._root() : this; - }; - Transaction.prototype.waitFor = function (promiseLike) { - var root = this._root(); - var promise = DexiePromise.resolve(promiseLike); - if (root._waitingFor) { - root._waitingFor = root._waitingFor.then(function () { return promise; }); - } - else { - root._waitingFor = promise; - root._waitingQueue = []; - var store = root.idbtrans.objectStore(root.storeNames[0]); - (function spin() { - ++root._spinCount; - while (root._waitingQueue.length) - (root._waitingQueue.shift())(); - if (root._waitingFor) - store.get(-Infinity).onsuccess = spin; - }()); - } - var currentWaitPromise = root._waitingFor; - return new DexiePromise(function (resolve, reject) { - promise.then(function (res) { return root._waitingQueue.push(wrap(resolve.bind(null, res))); }, function (err) { return root._waitingQueue.push(wrap(reject.bind(null, err))); }).finally(function () { - if (root._waitingFor === currentWaitPromise) { - root._waitingFor = null; - } - }); - }); - }; - Transaction.prototype.abort = function () { - if (this.active) { - this.active = false; - if (this.idbtrans) - this.idbtrans.abort(); - this._reject(new exceptions.Abort()); - } - }; - Transaction.prototype.table = function (tableName) { - var memoizedTables = (this._memoizedTables || (this._memoizedTables = {})); - if (hasOwn(memoizedTables, tableName)) - return memoizedTables[tableName]; - var tableSchema = this.schema[tableName]; - if (!tableSchema) { - throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); - } - var transactionBoundTable = new this.db.Table(tableName, tableSchema, this); - transactionBoundTable.core = this.db.core.table(tableName); - memoizedTables[tableName] = transactionBoundTable; - return transactionBoundTable; - }; - return Transaction; -}()); - -function createTransactionConstructor(db) { - return makeClassConstructor(Transaction.prototype, function Transaction(mode, storeNames, dbschema, chromeTransactionDurability, parent) { - var _this = this; - this.db = db; - this.mode = mode; - this.storeNames = storeNames; - this.schema = dbschema; - this.chromeTransactionDurability = chromeTransactionDurability; - this.idbtrans = null; - this.on = Events(this, "complete", "error", "abort"); - this.parent = parent || null; - this.active = true; - this._reculock = 0; - this._blockedFuncs = []; - this._resolve = null; - this._reject = null; - this._waitingFor = null; - this._waitingQueue = null; - this._spinCount = 0; - this._completion = new DexiePromise(function (resolve, reject) { - _this._resolve = resolve; - _this._reject = reject; - }); - this._completion.then(function () { - _this.active = false; - _this.on.complete.fire(); - }, function (e) { - var wasActive = _this.active; - _this.active = false; - _this.on.error.fire(e); - _this.parent ? - _this.parent._reject(e) : - wasActive && _this.idbtrans && _this.idbtrans.abort(); - return rejection(e); - }); - }); -} - -function createIndexSpec(name, keyPath, unique, multi, auto, compound, isPrimKey) { - return { - name: name, - keyPath: keyPath, - unique: unique, - multi: multi, - auto: auto, - compound: compound, - src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? "++" : "") + nameFromKeyPath(keyPath) - }; -} -function nameFromKeyPath(keyPath) { - return typeof keyPath === 'string' ? - keyPath : - keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : ""; -} - -function createTableSchema(name, primKey, indexes) { - return { - name: name, - primKey: primKey, - indexes: indexes, - mappedClass: null, - idxByName: arrayToObject(indexes, function (index) { return [index.name, index]; }) - }; -} - -function safariMultiStoreFix(storeNames) { - return storeNames.length === 1 ? storeNames[0] : storeNames; -} -var getMaxKey = function (IdbKeyRange) { - try { - IdbKeyRange.only([[]]); - getMaxKey = function () { return [[]]; }; - return [[]]; - } - catch (e) { - getMaxKey = function () { return maxString; }; - return maxString; - } -}; - -function getKeyExtractor(keyPath) { - if (keyPath == null) { - return function () { return undefined; }; - } - else if (typeof keyPath === 'string') { - return getSinglePathKeyExtractor(keyPath); - } - else { - return function (obj) { return getByKeyPath(obj, keyPath); }; - } -} -function getSinglePathKeyExtractor(keyPath) { - var split = keyPath.split('.'); - if (split.length === 1) { - return function (obj) { return obj[keyPath]; }; - } - else { - return function (obj) { return getByKeyPath(obj, keyPath); }; - } -} - -function arrayify(arrayLike) { - return [].slice.call(arrayLike); -} -var _id_counter = 0; -function getKeyPathAlias(keyPath) { - return keyPath == null ? - ":id" : - typeof keyPath === 'string' ? - keyPath : - "[".concat(keyPath.join('+'), "]"); -} -function createDBCore(db, IdbKeyRange, tmpTrans) { - function extractSchema(db, trans) { - var tables = arrayify(db.objectStoreNames); - return { - schema: { - name: db.name, - tables: tables.map(function (table) { return trans.objectStore(table); }).map(function (store) { - var keyPath = store.keyPath, autoIncrement = store.autoIncrement; - var compound = isArray(keyPath); - var outbound = keyPath == null; - var indexByKeyPath = {}; - var result = { - name: store.name, - primaryKey: { - name: null, - isPrimaryKey: true, - outbound: outbound, - compound: compound, - keyPath: keyPath, - autoIncrement: autoIncrement, - unique: true, - extractKey: getKeyExtractor(keyPath) - }, - indexes: arrayify(store.indexNames).map(function (indexName) { return store.index(indexName); }) - .map(function (index) { - var name = index.name, unique = index.unique, multiEntry = index.multiEntry, keyPath = index.keyPath; - var compound = isArray(keyPath); - var result = { - name: name, - compound: compound, - keyPath: keyPath, - unique: unique, - multiEntry: multiEntry, - extractKey: getKeyExtractor(keyPath) - }; - indexByKeyPath[getKeyPathAlias(keyPath)] = result; - return result; - }), - getIndexByKeyPath: function (keyPath) { return indexByKeyPath[getKeyPathAlias(keyPath)]; } - }; - indexByKeyPath[":id"] = result.primaryKey; - if (keyPath != null) { - indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey; - } - return result; - }) - }, - hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) && - !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && - !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && - [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) - }; - } - function makeIDBKeyRange(range) { - if (range.type === 3 ) - return null; - if (range.type === 4 ) - throw new Error("Cannot convert never type to IDBKeyRange"); - var lower = range.lower, upper = range.upper, lowerOpen = range.lowerOpen, upperOpen = range.upperOpen; - var idbRange = lower === undefined ? - upper === undefined ? - null : - IdbKeyRange.upperBound(upper, !!upperOpen) : - upper === undefined ? - IdbKeyRange.lowerBound(lower, !!lowerOpen) : - IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen); - return idbRange; - } - function createDbCoreTable(tableSchema) { - var tableName = tableSchema.name; - function mutate(_a) { - var trans = _a.trans, type = _a.type, keys = _a.keys, values = _a.values, range = _a.range; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var store = trans.objectStore(tableName); - var outbound = store.keyPath == null; - var isAddOrPut = type === "put" || type === "add"; - if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange') - throw new Error("Invalid operation type: " + type); - var length = (keys || values || { length: 1 }).length; - if (keys && values && keys.length !== values.length) { - throw new Error("Given keys array must have same length as given values array."); - } - if (length === 0) - return resolve({ numFailures: 0, failures: {}, results: [], lastResult: undefined }); - var req; - var reqs = []; - var failures = []; - var numFailures = 0; - var errorHandler = function (event) { - ++numFailures; - preventDefault(event); - }; - if (type === 'deleteRange') { - if (range.type === 4 ) - return resolve({ numFailures: numFailures, failures: failures, results: [], lastResult: undefined }); - if (range.type === 3 ) - reqs.push(req = store.clear()); - else - reqs.push(req = store.delete(makeIDBKeyRange(range))); - } - else { - var _a = isAddOrPut ? - outbound ? - [values, keys] : - [values, null] : - [keys, null], args1 = _a[0], args2 = _a[1]; - if (isAddOrPut) { - for (var i = 0; i < length; ++i) { - reqs.push(req = (args2 && args2[i] !== undefined ? - store[type](args1[i], args2[i]) : - store[type](args1[i]))); - req.onerror = errorHandler; - } - } - else { - for (var i = 0; i < length; ++i) { - reqs.push(req = store[type](args1[i])); - req.onerror = errorHandler; - } - } - } - var done = function (event) { - var lastResult = event.target.result; - reqs.forEach(function (req, i) { return req.error != null && (failures[i] = req.error); }); - resolve({ - numFailures: numFailures, - failures: failures, - results: type === "delete" ? keys : reqs.map(function (req) { return req.result; }), - lastResult: lastResult - }); - }; - req.onerror = function (event) { - errorHandler(event); - done(event); - }; - req.onsuccess = done; - }); - } - function openCursor(_a) { - var trans = _a.trans, values = _a.values, query = _a.query, reverse = _a.reverse, unique = _a.unique; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var index = query.index, range = query.range; - var store = trans.objectStore(tableName); - var source = index.isPrimaryKey ? - store : - store.index(index.name); - var direction = reverse ? - unique ? - "prevunique" : - "prev" : - unique ? - "nextunique" : - "next"; - var req = values || !('openKeyCursor' in source) ? - source.openCursor(makeIDBKeyRange(range), direction) : - source.openKeyCursor(makeIDBKeyRange(range), direction); - req.onerror = eventRejectHandler(reject); - req.onsuccess = wrap(function (ev) { - var cursor = req.result; - if (!cursor) { - resolve(null); - return; - } - cursor.___id = ++_id_counter; - cursor.done = false; - var _cursorContinue = cursor.continue.bind(cursor); - var _cursorContinuePrimaryKey = cursor.continuePrimaryKey; - if (_cursorContinuePrimaryKey) - _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor); - var _cursorAdvance = cursor.advance.bind(cursor); - var doThrowCursorIsNotStarted = function () { throw new Error("Cursor not started"); }; - var doThrowCursorIsStopped = function () { throw new Error("Cursor not stopped"); }; - cursor.trans = trans; - cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted; - cursor.fail = wrap(reject); - cursor.next = function () { - var _this = this; - var gotOne = 1; - return this.start(function () { return gotOne-- ? _this.continue() : _this.stop(); }).then(function () { return _this; }); - }; - cursor.start = function (callback) { - var iterationPromise = new Promise(function (resolveIteration, rejectIteration) { - resolveIteration = wrap(resolveIteration); - req.onerror = eventRejectHandler(rejectIteration); - cursor.fail = rejectIteration; - cursor.stop = function (value) { - cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped; - resolveIteration(value); - }; - }); - var guardedCallback = function () { - if (req.result) { - try { - callback(); - } - catch (err) { - cursor.fail(err); - } - } - else { - cursor.done = true; - cursor.start = function () { throw new Error("Cursor behind last entry"); }; - cursor.stop(); - } - }; - req.onsuccess = wrap(function (ev) { - req.onsuccess = guardedCallback; - guardedCallback(); - }); - cursor.continue = _cursorContinue; - cursor.continuePrimaryKey = _cursorContinuePrimaryKey; - cursor.advance = _cursorAdvance; - guardedCallback(); - return iterationPromise; - }; - resolve(cursor); - }, reject); - }); - } - function query(hasGetAll) { - return function (request) { - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var trans = request.trans, values = request.values, limit = request.limit, query = request.query; - var nonInfinitLimit = limit === Infinity ? undefined : limit; - var index = query.index, range = query.range; - var store = trans.objectStore(tableName); - var source = index.isPrimaryKey ? store : store.index(index.name); - var idbKeyRange = makeIDBKeyRange(range); - if (limit === 0) - return resolve({ result: [] }); - if (hasGetAll) { - var req = values ? - source.getAll(idbKeyRange, nonInfinitLimit) : - source.getAllKeys(idbKeyRange, nonInfinitLimit); - req.onsuccess = function (event) { return resolve({ result: event.target.result }); }; - req.onerror = eventRejectHandler(reject); - } - else { - var count_1 = 0; - var req_1 = values || !('openKeyCursor' in source) ? - source.openCursor(idbKeyRange) : - source.openKeyCursor(idbKeyRange); - var result_1 = []; - req_1.onsuccess = function (event) { - var cursor = req_1.result; - if (!cursor) - return resolve({ result: result_1 }); - result_1.push(values ? cursor.value : cursor.primaryKey); - if (++count_1 === limit) - return resolve({ result: result_1 }); - cursor.continue(); - }; - req_1.onerror = eventRejectHandler(reject); - } - }); - }; - } - return { - name: tableName, - schema: tableSchema, - mutate: mutate, - getMany: function (_a) { - var trans = _a.trans, keys = _a.keys; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var store = trans.objectStore(tableName); - var length = keys.length; - var result = new Array(length); - var keyCount = 0; - var callbackCount = 0; - var req; - var successHandler = function (event) { - var req = event.target; - if ((result[req._pos] = req.result) != null) - ; - if (++callbackCount === keyCount) - resolve(result); - }; - var errorHandler = eventRejectHandler(reject); - for (var i = 0; i < length; ++i) { - var key = keys[i]; - if (key != null) { - req = store.get(keys[i]); - req._pos = i; - req.onsuccess = successHandler; - req.onerror = errorHandler; - ++keyCount; - } - } - if (keyCount === 0) - resolve(result); - }); - }, - get: function (_a) { - var trans = _a.trans, key = _a.key; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var store = trans.objectStore(tableName); - var req = store.get(key); - req.onsuccess = function (event) { return resolve(event.target.result); }; - req.onerror = eventRejectHandler(reject); - }); - }, - query: query(hasGetAll), - openCursor: openCursor, - count: function (_a) { - var query = _a.query, trans = _a.trans; - var index = query.index, range = query.range; - return new Promise(function (resolve, reject) { - var store = trans.objectStore(tableName); - var source = index.isPrimaryKey ? store : store.index(index.name); - var idbKeyRange = makeIDBKeyRange(range); - var req = idbKeyRange ? source.count(idbKeyRange) : source.count(); - req.onsuccess = wrap(function (ev) { return resolve(ev.target.result); }); - req.onerror = eventRejectHandler(reject); - }); - } - }; - } - var _a = extractSchema(db, tmpTrans), schema = _a.schema, hasGetAll = _a.hasGetAll; - var tables = schema.tables.map(function (tableSchema) { return createDbCoreTable(tableSchema); }); - var tableMap = {}; - tables.forEach(function (table) { return tableMap[table.name] = table; }); - return { - stack: "dbcore", - transaction: db.transaction.bind(db), - table: function (name) { - var result = tableMap[name]; - if (!result) - throw new Error("Table '".concat(name, "' not found")); - return tableMap[name]; - }, - MIN_KEY: -Infinity, - MAX_KEY: getMaxKey(IdbKeyRange), - schema: schema - }; -} - -function createMiddlewareStack(stackImpl, middlewares) { - return middlewares.reduce(function (down, _a) { - var create = _a.create; - return (__assign(__assign({}, down), create(down))); - }, stackImpl); -} -function createMiddlewareStacks(middlewares, idbdb, _a, tmpTrans) { - var IDBKeyRange = _a.IDBKeyRange; _a.indexedDB; - var dbcore = createMiddlewareStack(createDBCore(idbdb, IDBKeyRange, tmpTrans), middlewares.dbcore); - return { - dbcore: dbcore - }; -} -function generateMiddlewareStacks(db, tmpTrans) { - var idbdb = tmpTrans.db; - var stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans); - db.core = stacks.dbcore; - db.tables.forEach(function (table) { - var tableName = table.name; - if (db.core.schema.tables.some(function (tbl) { return tbl.name === tableName; })) { - table.core = db.core.table(tableName); - if (db[tableName] instanceof db.Table) { - db[tableName].core = table.core; - } - } - }); -} - -function setApiOnPlace(db, objs, tableNames, dbschema) { - tableNames.forEach(function (tableName) { - var schema = dbschema[tableName]; - objs.forEach(function (obj) { - var propDesc = getPropertyDescriptor(obj, tableName); - if (!propDesc || ("value" in propDesc && propDesc.value === undefined)) { - if (obj === db.Transaction.prototype || obj instanceof db.Transaction) { - setProp(obj, tableName, { - get: function () { return this.table(tableName); }, - set: function (value) { - defineProperty(this, tableName, { value: value, writable: true, configurable: true, enumerable: true }); - } - }); - } - else { - obj[tableName] = new db.Table(tableName, schema); - } - } - }); - }); -} -function removeTablesApi(db, objs) { - objs.forEach(function (obj) { - for (var key in obj) { - if (obj[key] instanceof db.Table) - delete obj[key]; - } - }); -} -function lowerVersionFirst(a, b) { - return a._cfg.version - b._cfg.version; -} -function runUpgraders(db, oldVersion, idbUpgradeTrans, reject) { - var globalSchema = db._dbSchema; - if (idbUpgradeTrans.objectStoreNames.contains('$meta') && !globalSchema.$meta) { - globalSchema.$meta = createTableSchema("$meta", parseIndexSyntax("")[0], []); - db._storeNames.push('$meta'); - } - var trans = db._createTransaction('readwrite', db._storeNames, globalSchema); - trans.create(idbUpgradeTrans); - trans._completion.catch(reject); - var rejectTransaction = trans._reject.bind(trans); - var transless = PSD.transless || PSD; - newScope(function () { - PSD.trans = trans; - PSD.transless = transless; - if (oldVersion === 0) { - keys(globalSchema).forEach(function (tableName) { - createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes); - }); - generateMiddlewareStacks(db, idbUpgradeTrans); - DexiePromise.follow(function () { return db.on.populate.fire(trans); }).catch(rejectTransaction); - } - else { - generateMiddlewareStacks(db, idbUpgradeTrans); - return getExistingVersion(db, trans, oldVersion) - .then(function (oldVersion) { return updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans); }) - .catch(rejectTransaction); - } - }); -} -function patchCurrentVersion(db, idbUpgradeTrans) { - createMissingTables(db._dbSchema, idbUpgradeTrans); - if (idbUpgradeTrans.db.version % 10 === 0 && !idbUpgradeTrans.objectStoreNames.contains('$meta')) { - idbUpgradeTrans.db.createObjectStore('$meta').add(Math.ceil((idbUpgradeTrans.db.version / 10) - 1), 'version'); - } - var globalSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); - adjustToExistingIndexNames(db, db._dbSchema, idbUpgradeTrans); - var diff = getSchemaDiff(globalSchema, db._dbSchema); - var _loop_1 = function (tableChange) { - if (tableChange.change.length || tableChange.recreate) { - console.warn("Unable to patch indexes of table ".concat(tableChange.name, " because it has changes on the type of index or primary key.")); - return { value: void 0 }; - } - var store = idbUpgradeTrans.objectStore(tableChange.name); - tableChange.add.forEach(function (idx) { - if (debug) - console.debug("Dexie upgrade patch: Creating missing index ".concat(tableChange.name, ".").concat(idx.src)); - addIndex(store, idx); - }); - }; - for (var _i = 0, _a = diff.change; _i < _a.length; _i++) { - var tableChange = _a[_i]; - var state_1 = _loop_1(tableChange); - if (typeof state_1 === "object") - return state_1.value; - } -} -function getExistingVersion(db, trans, oldVersion) { - if (trans.storeNames.includes('$meta')) { - return trans.table('$meta').get('version').then(function (metaVersion) { - return metaVersion != null ? metaVersion : oldVersion; - }); - } - else { - return DexiePromise.resolve(oldVersion); - } -} -function updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans) { - var queue = []; - var versions = db._versions; - var globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); - var versToRun = versions.filter(function (v) { return v._cfg.version >= oldVersion; }); - if (versToRun.length === 0) { - return DexiePromise.resolve(); - } - versToRun.forEach(function (version) { - queue.push(function () { - var oldSchema = globalSchema; - var newSchema = version._cfg.dbschema; - adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans); - adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans); - globalSchema = db._dbSchema = newSchema; - var diff = getSchemaDiff(oldSchema, newSchema); - diff.add.forEach(function (tuple) { - createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes); - }); - diff.change.forEach(function (change) { - if (change.recreate) { - throw new exceptions.Upgrade("Not yet support for changing primary key"); - } - else { - var store_1 = idbUpgradeTrans.objectStore(change.name); - change.add.forEach(function (idx) { return addIndex(store_1, idx); }); - change.change.forEach(function (idx) { - store_1.deleteIndex(idx.name); - addIndex(store_1, idx); - }); - change.del.forEach(function (idxName) { return store_1.deleteIndex(idxName); }); - } - }); - var contentUpgrade = version._cfg.contentUpgrade; - if (contentUpgrade && version._cfg.version > oldVersion) { - generateMiddlewareStacks(db, idbUpgradeTrans); - trans._memoizedTables = {}; - var upgradeSchema_1 = shallowClone(newSchema); - diff.del.forEach(function (table) { - upgradeSchema_1[table] = oldSchema[table]; - }); - removeTablesApi(db, [db.Transaction.prototype]); - setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema_1), upgradeSchema_1); - trans.schema = upgradeSchema_1; - var contentUpgradeIsAsync_1 = isAsyncFunction(contentUpgrade); - if (contentUpgradeIsAsync_1) { - incrementExpectedAwaits(); - } - var returnValue_1; - var promiseFollowed = DexiePromise.follow(function () { - returnValue_1 = contentUpgrade(trans); - if (returnValue_1) { - if (contentUpgradeIsAsync_1) { - var decrementor = decrementExpectedAwaits.bind(null, null); - returnValue_1.then(decrementor, decrementor); - } - } - }); - return (returnValue_1 && typeof returnValue_1.then === 'function' ? - DexiePromise.resolve(returnValue_1) : promiseFollowed.then(function () { return returnValue_1; })); - } - }); - queue.push(function (idbtrans) { - var newSchema = version._cfg.dbschema; - deleteRemovedTables(newSchema, idbtrans); - removeTablesApi(db, [db.Transaction.prototype]); - setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema); - trans.schema = db._dbSchema; - }); - queue.push(function (idbtrans) { - if (db.idbdb.objectStoreNames.contains('$meta')) { - if (Math.ceil(db.idbdb.version / 10) === version._cfg.version) { - db.idbdb.deleteObjectStore('$meta'); - delete db._dbSchema.$meta; - db._storeNames = db._storeNames.filter(function (name) { return name !== '$meta'; }); - } - else { - idbtrans.objectStore('$meta').put(version._cfg.version, 'version'); - } - } - }); - }); - function runQueue() { - return queue.length ? DexiePromise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) : - DexiePromise.resolve(); - } - return runQueue().then(function () { - createMissingTables(globalSchema, idbUpgradeTrans); - }); -} -function getSchemaDiff(oldSchema, newSchema) { - var diff = { - del: [], - add: [], - change: [] - }; - var table; - for (table in oldSchema) { - if (!newSchema[table]) - diff.del.push(table); - } - for (table in newSchema) { - var oldDef = oldSchema[table], newDef = newSchema[table]; - if (!oldDef) { - diff.add.push([table, newDef]); - } - else { - var change = { - name: table, - def: newDef, - recreate: false, - del: [], - add: [], - change: [] - }; - if (( - '' + (oldDef.primKey.keyPath || '')) !== ('' + (newDef.primKey.keyPath || '')) || - (oldDef.primKey.auto !== newDef.primKey.auto)) { - change.recreate = true; - diff.change.push(change); - } - else { - var oldIndexes = oldDef.idxByName; - var newIndexes = newDef.idxByName; - var idxName = void 0; - for (idxName in oldIndexes) { - if (!newIndexes[idxName]) - change.del.push(idxName); - } - for (idxName in newIndexes) { - var oldIdx = oldIndexes[idxName], newIdx = newIndexes[idxName]; - if (!oldIdx) - change.add.push(newIdx); - else if (oldIdx.src !== newIdx.src) - change.change.push(newIdx); - } - if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) { - diff.change.push(change); - } - } - } - } - return diff; -} -function createTable(idbtrans, tableName, primKey, indexes) { - var store = idbtrans.db.createObjectStore(tableName, primKey.keyPath ? - { keyPath: primKey.keyPath, autoIncrement: primKey.auto } : - { autoIncrement: primKey.auto }); - indexes.forEach(function (idx) { return addIndex(store, idx); }); - return store; -} -function createMissingTables(newSchema, idbtrans) { - keys(newSchema).forEach(function (tableName) { - if (!idbtrans.db.objectStoreNames.contains(tableName)) { - if (debug) - console.debug('Dexie: Creating missing table', tableName); - createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes); - } - }); -} -function deleteRemovedTables(newSchema, idbtrans) { - [].slice.call(idbtrans.db.objectStoreNames).forEach(function (storeName) { - return newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName); - }); -} -function addIndex(store, idx) { - store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi }); -} -function buildGlobalSchema(db, idbdb, tmpTrans) { - var globalSchema = {}; - var dbStoreNames = slice(idbdb.objectStoreNames, 0); - dbStoreNames.forEach(function (storeName) { - var store = tmpTrans.objectStore(storeName); - var keyPath = store.keyPath; - var primKey = createIndexSpec(nameFromKeyPath(keyPath), keyPath || "", true, false, !!store.autoIncrement, keyPath && typeof keyPath !== "string", true); - var indexes = []; - for (var j = 0; j < store.indexNames.length; ++j) { - var idbindex = store.index(store.indexNames[j]); - keyPath = idbindex.keyPath; - var index = createIndexSpec(idbindex.name, keyPath, !!idbindex.unique, !!idbindex.multiEntry, false, keyPath && typeof keyPath !== "string", false); - indexes.push(index); - } - globalSchema[storeName] = createTableSchema(storeName, primKey, indexes); - }); - return globalSchema; -} -function readGlobalSchema(db, idbdb, tmpTrans) { - db.verno = idbdb.version / 10; - var globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans); - db._storeNames = slice(idbdb.objectStoreNames, 0); - setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema); -} -function verifyInstalledSchema(db, tmpTrans) { - var installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans); - var diff = getSchemaDiff(installedSchema, db._dbSchema); - return !(diff.add.length || diff.change.some(function (ch) { return ch.add.length || ch.change.length; })); -} -function adjustToExistingIndexNames(db, schema, idbtrans) { - var storeNames = idbtrans.db.objectStoreNames; - for (var i = 0; i < storeNames.length; ++i) { - var storeName = storeNames[i]; - var store = idbtrans.objectStore(storeName); - db._hasGetAll = 'getAll' in store; - for (var j = 0; j < store.indexNames.length; ++j) { - var indexName = store.indexNames[j]; - var keyPath = store.index(indexName).keyPath; - var dexieName = typeof keyPath === 'string' ? keyPath : "[" + slice(keyPath).join('+') + "]"; - if (schema[storeName]) { - var indexSpec = schema[storeName].idxByName[dexieName]; - if (indexSpec) { - indexSpec.name = indexName; - delete schema[storeName].idxByName[dexieName]; - schema[storeName].idxByName[indexName] = indexSpec; - } - } - } - } - if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && - !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && - _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope && - [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) { - db._hasGetAll = false; - } -} -function parseIndexSyntax(primKeyAndIndexes) { - return primKeyAndIndexes.split(',').map(function (index, indexNum) { - index = index.trim(); - var name = index.replace(/([&*]|\+\+)/g, ""); - var keyPath = /^\[/.test(name) ? name.match(/^\[(.*)\]$/)[1].split('+') : name; - return createIndexSpec(name, keyPath || null, /\&/.test(index), /\*/.test(index), /\+\+/.test(index), isArray(keyPath), indexNum === 0); - }); -} - -var Version = (function () { - function Version() { - } - Version.prototype._parseStoresSpec = function (stores, outSchema) { - keys(stores).forEach(function (tableName) { - if (stores[tableName] !== null) { - var indexes = parseIndexSyntax(stores[tableName]); - var primKey = indexes.shift(); - primKey.unique = true; - if (primKey.multi) - throw new exceptions.Schema("Primary key cannot be multi-valued"); - indexes.forEach(function (idx) { - if (idx.auto) - throw new exceptions.Schema("Only primary key can be marked as autoIncrement (++)"); - if (!idx.keyPath) - throw new exceptions.Schema("Index must have a name and cannot be an empty string"); - }); - outSchema[tableName] = createTableSchema(tableName, primKey, indexes); - } - }); - }; - Version.prototype.stores = function (stores) { - var db = this.db; - this._cfg.storesSource = this._cfg.storesSource ? - extend(this._cfg.storesSource, stores) : - stores; - var versions = db._versions; - var storesSpec = {}; - var dbschema = {}; - versions.forEach(function (version) { - extend(storesSpec, version._cfg.storesSource); - dbschema = (version._cfg.dbschema = {}); - version._parseStoresSpec(storesSpec, dbschema); - }); - db._dbSchema = dbschema; - removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]); - setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema); - db._storeNames = keys(dbschema); - return this; - }; - Version.prototype.upgrade = function (upgradeFunction) { - this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction); - return this; - }; - return Version; -}()); - -function createVersionConstructor(db) { - return makeClassConstructor(Version.prototype, function Version(versionNumber) { - this.db = db; - this._cfg = { - version: versionNumber, - storesSource: null, - dbschema: {}, - tables: {}, - contentUpgrade: null - }; - }); -} - -function getDbNamesTable(indexedDB, IDBKeyRange) { - var dbNamesDB = indexedDB["_dbNamesDB"]; - if (!dbNamesDB) { - dbNamesDB = indexedDB["_dbNamesDB"] = new Dexie$1(DBNAMES_DB, { - addons: [], - indexedDB: indexedDB, - IDBKeyRange: IDBKeyRange, - }); - dbNamesDB.version(1).stores({ dbnames: "name" }); - } - return dbNamesDB.table("dbnames"); -} -function hasDatabasesNative(indexedDB) { - return indexedDB && typeof indexedDB.databases === "function"; -} -function getDatabaseNames(_a) { - var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; - return hasDatabasesNative(indexedDB) - ? Promise.resolve(indexedDB.databases()).then(function (infos) { - return infos - .map(function (info) { return info.name; }) - .filter(function (name) { return name !== DBNAMES_DB; }); - }) - : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys(); -} -function _onDatabaseCreated(_a, name) { - var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; - !hasDatabasesNative(indexedDB) && - name !== DBNAMES_DB && - getDbNamesTable(indexedDB, IDBKeyRange).put({ name: name }).catch(nop); -} -function _onDatabaseDeleted(_a, name) { - var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; - !hasDatabasesNative(indexedDB) && - name !== DBNAMES_DB && - getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop); -} - -function vip(fn) { - return newScope(function () { - PSD.letThrough = true; - return fn(); - }); -} - -function idbReady() { - var isSafari = !navigator.userAgentData && - /Safari\//.test(navigator.userAgent) && - !/Chrom(e|ium)\//.test(navigator.userAgent); - if (!isSafari || !indexedDB.databases) - return Promise.resolve(); - var intervalId; - return new Promise(function (resolve) { - var tryIdb = function () { return indexedDB.databases().finally(resolve); }; - intervalId = setInterval(tryIdb, 100); - tryIdb(); - }).finally(function () { return clearInterval(intervalId); }); -} - -var _a; -function isEmptyRange(node) { - return !("from" in node); -} -var RangeSet = function (fromOrTree, to) { - if (this) { - extend(this, arguments.length ? { d: 1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree } : { d: 0 }); - } - else { - var rv = new RangeSet(); - if (fromOrTree && ("d" in fromOrTree)) { - extend(rv, fromOrTree); - } - return rv; - } -}; -props(RangeSet.prototype, (_a = { - add: function (rangeSet) { - mergeRanges(this, rangeSet); - return this; - }, - addKey: function (key) { - addRange(this, key, key); - return this; - }, - addKeys: function (keys) { - var _this = this; - keys.forEach(function (key) { return addRange(_this, key, key); }); - return this; - } - }, - _a[iteratorSymbol] = function () { - return getRangeSetIterator(this); - }, - _a)); -function addRange(target, from, to) { - var diff = cmp(from, to); - if (isNaN(diff)) - return; - if (diff > 0) - throw RangeError(); - if (isEmptyRange(target)) - return extend(target, { from: from, to: to, d: 1 }); - var left = target.l; - var right = target.r; - if (cmp(to, target.from) < 0) { - left - ? addRange(left, from, to) - : (target.l = { from: from, to: to, d: 1, l: null, r: null }); - return rebalance(target); - } - if (cmp(from, target.to) > 0) { - right - ? addRange(right, from, to) - : (target.r = { from: from, to: to, d: 1, l: null, r: null }); - return rebalance(target); - } - if (cmp(from, target.from) < 0) { - target.from = from; - target.l = null; - target.d = right ? right.d + 1 : 1; - } - if (cmp(to, target.to) > 0) { - target.to = to; - target.r = null; - target.d = target.l ? target.l.d + 1 : 1; - } - var rightWasCutOff = !target.r; - if (left && !target.l) { - mergeRanges(target, left); - } - if (right && rightWasCutOff) { - mergeRanges(target, right); - } -} -function mergeRanges(target, newSet) { - function _addRangeSet(target, _a) { - var from = _a.from, to = _a.to, l = _a.l, r = _a.r; - addRange(target, from, to); - if (l) - _addRangeSet(target, l); - if (r) - _addRangeSet(target, r); - } - if (!isEmptyRange(newSet)) - _addRangeSet(target, newSet); -} -function rangesOverlap(rangeSet1, rangeSet2) { - var i1 = getRangeSetIterator(rangeSet2); - var nextResult1 = i1.next(); - if (nextResult1.done) - return false; - var a = nextResult1.value; - var i2 = getRangeSetIterator(rangeSet1); - var nextResult2 = i2.next(a.from); - var b = nextResult2.value; - while (!nextResult1.done && !nextResult2.done) { - if (cmp(b.from, a.to) <= 0 && cmp(b.to, a.from) >= 0) - return true; - cmp(a.from, b.from) < 0 - ? (a = (nextResult1 = i1.next(b.from)).value) - : (b = (nextResult2 = i2.next(a.from)).value); - } - return false; -} -function getRangeSetIterator(node) { - var state = isEmptyRange(node) ? null : { s: 0, n: node }; - return { - next: function (key) { - var keyProvided = arguments.length > 0; - while (state) { - switch (state.s) { - case 0: - state.s = 1; - if (keyProvided) { - while (state.n.l && cmp(key, state.n.from) < 0) - state = { up: state, n: state.n.l, s: 1 }; - } - else { - while (state.n.l) - state = { up: state, n: state.n.l, s: 1 }; - } - case 1: - state.s = 2; - if (!keyProvided || cmp(key, state.n.to) <= 0) - return { value: state.n, done: false }; - case 2: - if (state.n.r) { - state.s = 3; - state = { up: state, n: state.n.r, s: 0 }; - continue; - } - case 3: - state = state.up; - } - } - return { done: true }; - }, - }; -} -function rebalance(target) { - var _a, _b; - var diff = (((_a = target.r) === null || _a === void 0 ? void 0 : _a.d) || 0) - (((_b = target.l) === null || _b === void 0 ? void 0 : _b.d) || 0); - var r = diff > 1 ? "r" : diff < -1 ? "l" : ""; - if (r) { - var l = r === "r" ? "l" : "r"; - var rootClone = __assign({}, target); - var oldRootRight = target[r]; - target.from = oldRootRight.from; - target.to = oldRootRight.to; - target[r] = oldRootRight[r]; - rootClone[r] = oldRootRight[l]; - target[l] = rootClone; - rootClone.d = computeDepth(rootClone); - } - target.d = computeDepth(target); -} -function computeDepth(_a) { - var r = _a.r, l = _a.l; - return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1; -} - -function extendObservabilitySet(target, newSet) { - keys(newSet).forEach(function (part) { - if (target[part]) - mergeRanges(target[part], newSet[part]); - else - target[part] = cloneSimpleObjectTree(newSet[part]); - }); - return target; -} - -function obsSetsOverlap(os1, os2) { - return os1.all || os2.all || Object.keys(os1).some(function (key) { return os2[key] && rangesOverlap(os2[key], os1[key]); }); -} - -var cache = {}; - -var unsignaledParts = {}; -var isTaskEnqueued = false; -function signalSubscribersLazily(part, optimistic) { - extendObservabilitySet(unsignaledParts, part); - if (!isTaskEnqueued) { - isTaskEnqueued = true; - setTimeout(function () { - isTaskEnqueued = false; - var parts = unsignaledParts; - unsignaledParts = {}; - signalSubscribersNow(parts, false); - }, 0); - } -} -function signalSubscribersNow(updatedParts, deleteAffectedCacheEntries) { - if (deleteAffectedCacheEntries === void 0) { deleteAffectedCacheEntries = false; } - var queriesToSignal = new Set(); - if (updatedParts.all) { - for (var _i = 0, _a = Object.values(cache); _i < _a.length; _i++) { - var tblCache = _a[_i]; - collectTableSubscribers(tblCache, updatedParts, queriesToSignal, deleteAffectedCacheEntries); - } - } - else { - for (var key in updatedParts) { - var parts = /^idb\:\/\/(.*)\/(.*)\//.exec(key); - if (parts) { - var dbName = parts[1], tableName = parts[2]; - var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)]; - if (tblCache) - collectTableSubscribers(tblCache, updatedParts, queriesToSignal, deleteAffectedCacheEntries); - } - } - } - queriesToSignal.forEach(function (requery) { return requery(); }); -} -function collectTableSubscribers(tblCache, updatedParts, outQueriesToSignal, deleteAffectedCacheEntries) { - var updatedEntryLists = []; - for (var _i = 0, _a = Object.entries(tblCache.queries.query); _i < _a.length; _i++) { - var _b = _a[_i], indexName = _b[0], entries = _b[1]; - var filteredEntries = []; - for (var _c = 0, entries_1 = entries; _c < entries_1.length; _c++) { - var entry = entries_1[_c]; - if (obsSetsOverlap(updatedParts, entry.obsSet)) { - entry.subscribers.forEach(function (requery) { return outQueriesToSignal.add(requery); }); - } - else if (deleteAffectedCacheEntries) { - filteredEntries.push(entry); - } - } - if (deleteAffectedCacheEntries) - updatedEntryLists.push([indexName, filteredEntries]); - } - if (deleteAffectedCacheEntries) { - for (var _d = 0, updatedEntryLists_1 = updatedEntryLists; _d < updatedEntryLists_1.length; _d++) { - var _e = updatedEntryLists_1[_d], indexName = _e[0], filteredEntries = _e[1]; - tblCache.queries.query[indexName] = filteredEntries; - } - } -} - -function dexieOpen(db) { - var state = db._state; - var indexedDB = db._deps.indexedDB; - if (state.isBeingOpened || db.idbdb) - return state.dbReadyPromise.then(function () { return state.dbOpenError ? - rejection(state.dbOpenError) : - db; }); - state.isBeingOpened = true; - state.dbOpenError = null; - state.openComplete = false; - var openCanceller = state.openCanceller; - var nativeVerToOpen = Math.round(db.verno * 10); - var schemaPatchMode = false; - function throwIfCancelled() { - if (state.openCanceller !== openCanceller) - throw new exceptions.DatabaseClosed('db.open() was cancelled'); - } - var resolveDbReady = state.dbReadyResolve, - upgradeTransaction = null, wasCreated = false; - var tryOpenDB = function () { return new DexiePromise(function (resolve, reject) { - throwIfCancelled(); - if (!indexedDB) - throw new exceptions.MissingAPI(); - var dbName = db.name; - var req = state.autoSchema || !nativeVerToOpen ? - indexedDB.open(dbName) : - indexedDB.open(dbName, nativeVerToOpen); - if (!req) - throw new exceptions.MissingAPI(); - req.onerror = eventRejectHandler(reject); - req.onblocked = wrap(db._fireOnBlocked); - req.onupgradeneeded = wrap(function (e) { - upgradeTransaction = req.transaction; - if (state.autoSchema && !db._options.allowEmptyDB) { - req.onerror = preventDefault; - upgradeTransaction.abort(); - req.result.close(); - var delreq = indexedDB.deleteDatabase(dbName); - delreq.onsuccess = delreq.onerror = wrap(function () { - reject(new exceptions.NoSuchDatabase("Database ".concat(dbName, " doesnt exist"))); - }); - } - else { - upgradeTransaction.onerror = eventRejectHandler(reject); - var oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; - wasCreated = oldVer < 1; - db.idbdb = req.result; - if (schemaPatchMode) { - patchCurrentVersion(db, upgradeTransaction); - } - runUpgraders(db, oldVer / 10, upgradeTransaction, reject); - } - }, reject); - req.onsuccess = wrap(function () { - upgradeTransaction = null; - var idbdb = db.idbdb = req.result; - var objectStoreNames = slice(idbdb.objectStoreNames); - if (objectStoreNames.length > 0) - try { - var tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly'); - if (state.autoSchema) - readGlobalSchema(db, idbdb, tmpTrans); - else { - adjustToExistingIndexNames(db, db._dbSchema, tmpTrans); - if (!verifyInstalledSchema(db, tmpTrans) && !schemaPatchMode) { - console.warn("Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this."); - idbdb.close(); - nativeVerToOpen = idbdb.version + 1; - schemaPatchMode = true; - return resolve(tryOpenDB()); - } - } - generateMiddlewareStacks(db, tmpTrans); - } - catch (e) { - } - connections.push(db); - idbdb.onversionchange = wrap(function (ev) { - state.vcFired = true; - db.on("versionchange").fire(ev); - }); - idbdb.onclose = wrap(function (ev) { - db.on("close").fire(ev); - }); - if (wasCreated) - _onDatabaseCreated(db._deps, dbName); - resolve(); - }, reject); - }).catch(function (err) { - switch (err === null || err === void 0 ? void 0 : err.name) { - case "UnknownError": - if (state.PR1398_maxLoop > 0) { - state.PR1398_maxLoop--; - console.warn('Dexie: Workaround for Chrome UnknownError on open()'); - return tryOpenDB(); - } - break; - case "VersionError": - if (nativeVerToOpen > 0) { - nativeVerToOpen = 0; - return tryOpenDB(); - } - break; - } - return DexiePromise.reject(err); - }); }; - return DexiePromise.race([ - openCanceller, - (typeof navigator === 'undefined' ? DexiePromise.resolve() : idbReady()).then(tryOpenDB) - ]).then(function () { - throwIfCancelled(); - state.onReadyBeingFired = []; - return DexiePromise.resolve(vip(function () { return db.on.ready.fire(db.vip); })).then(function fireRemainders() { - if (state.onReadyBeingFired.length > 0) { - var remainders_1 = state.onReadyBeingFired.reduce(promisableChain, nop); - state.onReadyBeingFired = []; - return DexiePromise.resolve(vip(function () { return remainders_1(db.vip); })).then(fireRemainders); - } - }); - }).finally(function () { - if (state.openCanceller === openCanceller) { - state.onReadyBeingFired = null; - state.isBeingOpened = false; - } - }).catch(function (err) { - state.dbOpenError = err; - try { - upgradeTransaction && upgradeTransaction.abort(); - } - catch (_a) { } - if (openCanceller === state.openCanceller) { - db._close(); - } - return rejection(err); - }).finally(function () { - state.openComplete = true; - resolveDbReady(); - }).then(function () { - if (wasCreated) { - var everything_1 = {}; - db.tables.forEach(function (table) { - table.schema.indexes.forEach(function (idx) { - if (idx.name) - everything_1["idb://".concat(db.name, "/").concat(table.name, "/").concat(idx.name)] = new RangeSet(-Infinity, [[[]]]); - }); - everything_1["idb://".concat(db.name, "/").concat(table.name, "/")] = everything_1["idb://".concat(db.name, "/").concat(table.name, "/:dels")] = new RangeSet(-Infinity, [[[]]]); - }); - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME).fire(everything_1); - signalSubscribersNow(everything_1, true); - } - return db; - }); -} - -function awaitIterator(iterator) { - var callNext = function (result) { return iterator.next(result); }, doThrow = function (error) { return iterator.throw(error); }, onSuccess = step(callNext), onError = step(doThrow); - function step(getNext) { - return function (val) { - var next = getNext(val), value = next.value; - return next.done ? value : - (!value || typeof value.then !== 'function' ? - isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) : - value.then(onSuccess, onError)); - }; - } - return step(callNext)(); -} - -function extractTransactionArgs(mode, _tableArgs_, scopeFunc) { - var i = arguments.length; - if (i < 2) - throw new exceptions.InvalidArgument("Too few arguments"); - var args = new Array(i - 1); - while (--i) - args[i - 1] = arguments[i]; - scopeFunc = args.pop(); - var tables = flatten(args); - return [mode, tables, scopeFunc]; -} -function enterTransactionScope(db, mode, storeNames, parentTransaction, scopeFunc) { - return DexiePromise.resolve().then(function () { - var transless = PSD.transless || PSD; - var trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction); - trans.explicit = true; - var zoneProps = { - trans: trans, - transless: transless - }; - if (parentTransaction) { - trans.idbtrans = parentTransaction.idbtrans; - } - else { - try { - trans.create(); - trans.idbtrans._explicit = true; - db._state.PR1398_maxLoop = 3; - } - catch (ex) { - if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { - console.warn('Dexie: Need to reopen db'); - db.close({ disableAutoOpen: false }); - return db.open().then(function () { return enterTransactionScope(db, mode, storeNames, null, scopeFunc); }); - } - return rejection(ex); - } - } - var scopeFuncIsAsync = isAsyncFunction(scopeFunc); - if (scopeFuncIsAsync) { - incrementExpectedAwaits(); - } - var returnValue; - var promiseFollowed = DexiePromise.follow(function () { - returnValue = scopeFunc.call(trans, trans); - if (returnValue) { - if (scopeFuncIsAsync) { - var decrementor = decrementExpectedAwaits.bind(null, null); - returnValue.then(decrementor, decrementor); - } - else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') { - returnValue = awaitIterator(returnValue); - } - } - }, zoneProps); - return (returnValue && typeof returnValue.then === 'function' ? - DexiePromise.resolve(returnValue).then(function (x) { return trans.active ? - x - : rejection(new exceptions.PrematureCommit("Transaction committed too early. See http://bit.ly/2kdckMn")); }) - : promiseFollowed.then(function () { return returnValue; })).then(function (x) { - if (parentTransaction) - trans._resolve(); - return trans._completion.then(function () { return x; }); - }).catch(function (e) { - trans._reject(e); - return rejection(e); - }); - }); -} - -function pad(a, value, count) { - var result = isArray(a) ? a.slice() : [a]; - for (var i = 0; i < count; ++i) - result.push(value); - return result; -} -function createVirtualIndexMiddleware(down) { - return __assign(__assign({}, down), { table: function (tableName) { - var table = down.table(tableName); - var schema = table.schema; - var indexLookup = {}; - var allVirtualIndexes = []; - function addVirtualIndexes(keyPath, keyTail, lowLevelIndex) { - var keyPathAlias = getKeyPathAlias(keyPath); - var indexList = (indexLookup[keyPathAlias] = indexLookup[keyPathAlias] || []); - var keyLength = keyPath == null ? 0 : typeof keyPath === 'string' ? 1 : keyPath.length; - var isVirtual = keyTail > 0; - var virtualIndex = __assign(__assign({}, lowLevelIndex), { name: isVirtual - ? "".concat(keyPathAlias, "(virtual-from:").concat(lowLevelIndex.name, ")") - : lowLevelIndex.name, lowLevelIndex: lowLevelIndex, isVirtual: isVirtual, keyTail: keyTail, keyLength: keyLength, extractKey: getKeyExtractor(keyPath), unique: !isVirtual && lowLevelIndex.unique }); - indexList.push(virtualIndex); - if (!virtualIndex.isPrimaryKey) { - allVirtualIndexes.push(virtualIndex); - } - if (keyLength > 1) { - var virtualKeyPath = keyLength === 2 ? - keyPath[0] : - keyPath.slice(0, keyLength - 1); - addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex); - } - indexList.sort(function (a, b) { return a.keyTail - b.keyTail; }); - return virtualIndex; - } - var primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey); - indexLookup[":id"] = [primaryKey]; - for (var _i = 0, _a = schema.indexes; _i < _a.length; _i++) { - var index = _a[_i]; - addVirtualIndexes(index.keyPath, 0, index); - } - function findBestIndex(keyPath) { - var result = indexLookup[getKeyPathAlias(keyPath)]; - return result && result[0]; - } - function translateRange(range, keyTail) { - return { - type: range.type === 1 ? - 2 : - range.type, - lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail), - lowerOpen: true, - upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail), - upperOpen: true - }; - } - function translateRequest(req) { - var index = req.query.index; - return index.isVirtual ? __assign(__assign({}, req), { query: { - index: index.lowLevelIndex, - range: translateRange(req.query.range, index.keyTail) - } }) : req; - } - var result = __assign(__assign({}, table), { schema: __assign(__assign({}, schema), { primaryKey: primaryKey, indexes: allVirtualIndexes, getIndexByKeyPath: findBestIndex }), count: function (req) { - return table.count(translateRequest(req)); - }, query: function (req) { - return table.query(translateRequest(req)); - }, openCursor: function (req) { - var _a = req.query.index, keyTail = _a.keyTail, isVirtual = _a.isVirtual, keyLength = _a.keyLength; - if (!isVirtual) - return table.openCursor(req); - function createVirtualCursor(cursor) { - function _continue(key) { - key != null ? - cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) : - req.unique ? - cursor.continue(cursor.key.slice(0, keyLength) - .concat(req.reverse - ? down.MIN_KEY - : down.MAX_KEY, keyTail)) : - cursor.continue(); - } - var virtualCursor = Object.create(cursor, { - continue: { value: _continue }, - continuePrimaryKey: { - value: function (key, primaryKey) { - cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey); - } - }, - primaryKey: { - get: function () { - return cursor.primaryKey; - } - }, - key: { - get: function () { - var key = cursor.key; - return keyLength === 1 ? - key[0] : - key.slice(0, keyLength); - } - }, - value: { - get: function () { - return cursor.value; - } - } - }); - return virtualCursor; - } - return table.openCursor(translateRequest(req)) - .then(function (cursor) { return cursor && createVirtualCursor(cursor); }); - } }); - return result; - } }); -} -var virtualIndexMiddleware = { - stack: "dbcore", - name: "VirtualIndexMiddleware", - level: 1, - create: createVirtualIndexMiddleware -}; - -function getObjectDiff(a, b, rv, prfx) { - rv = rv || {}; - prfx = prfx || ''; - keys(a).forEach(function (prop) { - if (!hasOwn(b, prop)) { - rv[prfx + prop] = undefined; - } - else { - var ap = a[prop], bp = b[prop]; - if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) { - var apTypeName = toStringTag(ap); - var bpTypeName = toStringTag(bp); - if (apTypeName !== bpTypeName) { - rv[prfx + prop] = b[prop]; - } - else if (apTypeName === 'Object') { - getObjectDiff(ap, bp, rv, prfx + prop + '.'); - } - else if (ap !== bp) { - rv[prfx + prop] = b[prop]; - } - } - else if (ap !== bp) - rv[prfx + prop] = b[prop]; - } - }); - keys(b).forEach(function (prop) { - if (!hasOwn(a, prop)) { - rv[prfx + prop] = b[prop]; - } - }); - return rv; -} - -function getEffectiveKeys(primaryKey, req) { - if (req.type === 'delete') - return req.keys; - return req.keys || req.values.map(primaryKey.extractKey); -} - -var hooksMiddleware = { - stack: "dbcore", - name: "HooksMiddleware", - level: 2, - create: function (downCore) { return (__assign(__assign({}, downCore), { table: function (tableName) { - var downTable = downCore.table(tableName); - var primaryKey = downTable.schema.primaryKey; - var tableMiddleware = __assign(__assign({}, downTable), { mutate: function (req) { - var dxTrans = PSD.trans; - var _a = dxTrans.table(tableName).hook, deleting = _a.deleting, creating = _a.creating, updating = _a.updating; - switch (req.type) { - case 'add': - if (creating.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); - case 'put': - if (creating.fire === nop && updating.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); - case 'delete': - if (deleting.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); - case 'deleteRange': - if (deleting.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return deleteRange(req); }, true); - } - return downTable.mutate(req); - function addPutOrDelete(req) { - var dxTrans = PSD.trans; - var keys = req.keys || getEffectiveKeys(primaryKey, req); - if (!keys) - throw new Error("Keys missing"); - req = req.type === 'add' || req.type === 'put' ? __assign(__assign({}, req), { keys: keys }) : __assign({}, req); - if (req.type !== 'delete') - req.values = __spreadArray([], req.values, true); - if (req.keys) - req.keys = __spreadArray([], req.keys, true); - return getExistingValues(downTable, req, keys).then(function (existingValues) { - var contexts = keys.map(function (key, i) { - var existingValue = existingValues[i]; - var ctx = { onerror: null, onsuccess: null }; - if (req.type === 'delete') { - deleting.fire.call(ctx, key, existingValue, dxTrans); - } - else if (req.type === 'add' || existingValue === undefined) { - var generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans); - if (key == null && generatedPrimaryKey != null) { - key = generatedPrimaryKey; - req.keys[i] = key; - if (!primaryKey.outbound) { - setByKeyPath(req.values[i], primaryKey.keyPath, key); - } - } - } - else { - var objectDiff = getObjectDiff(existingValue, req.values[i]); - var additionalChanges_1 = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans); - if (additionalChanges_1) { - var requestedValue_1 = req.values[i]; - Object.keys(additionalChanges_1).forEach(function (keyPath) { - if (hasOwn(requestedValue_1, keyPath)) { - requestedValue_1[keyPath] = additionalChanges_1[keyPath]; - } - else { - setByKeyPath(requestedValue_1, keyPath, additionalChanges_1[keyPath]); - } - }); - } - } - return ctx; - }); - return downTable.mutate(req).then(function (_a) { - var failures = _a.failures, results = _a.results, numFailures = _a.numFailures, lastResult = _a.lastResult; - for (var i = 0; i < keys.length; ++i) { - var primKey = results ? results[i] : keys[i]; - var ctx = contexts[i]; - if (primKey == null) { - ctx.onerror && ctx.onerror(failures[i]); - } - else { - ctx.onsuccess && ctx.onsuccess(req.type === 'put' && existingValues[i] ? - req.values[i] : - primKey - ); - } - } - return { failures: failures, results: results, numFailures: numFailures, lastResult: lastResult }; - }).catch(function (error) { - contexts.forEach(function (ctx) { return ctx.onerror && ctx.onerror(error); }); - return Promise.reject(error); - }); - }); - } - function deleteRange(req) { - return deleteNextChunk(req.trans, req.range, 10000); - } - function deleteNextChunk(trans, range, limit) { - return downTable.query({ trans: trans, values: false, query: { index: primaryKey, range: range }, limit: limit }) - .then(function (_a) { - var result = _a.result; - return addPutOrDelete({ type: 'delete', keys: result, trans: trans }).then(function (res) { - if (res.numFailures > 0) - return Promise.reject(res.failures[0]); - if (result.length < limit) { - return { failures: [], numFailures: 0, lastResult: undefined }; - } - else { - return deleteNextChunk(trans, __assign(__assign({}, range), { lower: result[result.length - 1], lowerOpen: true }), limit); - } - }); - }); - } - } }); - return tableMiddleware; - } })); } -}; -function getExistingValues(table, req, effectiveKeys) { - return req.type === "add" - ? Promise.resolve([]) - : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: "immutable" }); -} - -function getFromTransactionCache(keys, cache, clone) { - try { - if (!cache) - return null; - if (cache.keys.length < keys.length) - return null; - var result = []; - for (var i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) { - if (cmp(cache.keys[i], keys[j]) !== 0) - continue; - result.push(clone ? deepClone(cache.values[i]) : cache.values[i]); - ++j; - } - return result.length === keys.length ? result : null; - } - catch (_a) { - return null; - } -} -var cacheExistingValuesMiddleware = { - stack: "dbcore", - level: -1, - create: function (core) { - return { - table: function (tableName) { - var table = core.table(tableName); - return __assign(__assign({}, table), { getMany: function (req) { - if (!req.cache) { - return table.getMany(req); - } - var cachedResult = getFromTransactionCache(req.keys, req.trans["_cache"], req.cache === "clone"); - if (cachedResult) { - return DexiePromise.resolve(cachedResult); - } - return table.getMany(req).then(function (res) { - req.trans["_cache"] = { - keys: req.keys, - values: req.cache === "clone" ? deepClone(res) : res, - }; - return res; - }); - }, mutate: function (req) { - if (req.type !== "add") - req.trans["_cache"] = null; - return table.mutate(req); - } }); - }, - }; - }, -}; - -function isCachableContext(ctx, table) { - return (ctx.trans.mode === 'readonly' && - !!ctx.subscr && - !ctx.trans.explicit && - ctx.trans.db._options.cache !== 'disabled' && - !table.schema.primaryKey.outbound); -} - -function isCachableRequest(type, req) { - switch (type) { - case 'query': - return req.values && !req.unique; - case 'get': - return false; - case 'getMany': - return false; - case 'count': - return false; - case 'openCursor': - return false; - } -} - -var observabilityMiddleware = { - stack: "dbcore", - level: 0, - name: "Observability", - create: function (core) { - var dbName = core.schema.name; - var FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY); - return __assign(__assign({}, core), { transaction: function (stores, mode, options) { - if (PSD.subscr && mode !== 'readonly') { - throw new exceptions.ReadOnly("Readwrite transaction in liveQuery context. Querier source: ".concat(PSD.querier)); - } - return core.transaction(stores, mode, options); - }, table: function (tableName) { - var table = core.table(tableName); - var schema = table.schema; - var primaryKey = schema.primaryKey, indexes = schema.indexes; - var extractKey = primaryKey.extractKey, outbound = primaryKey.outbound; - var indexesWithAutoIncPK = primaryKey.autoIncrement && indexes.filter(function (index) { return index.compound && index.keyPath.includes(primaryKey.keyPath); }); - var tableClone = __assign(__assign({}, table), { mutate: function (req) { - var trans = req.trans; - var mutatedParts = req.mutatedParts || (req.mutatedParts = {}); - var getRangeSet = function (indexName) { - var part = "idb://".concat(dbName, "/").concat(tableName, "/").concat(indexName); - return (mutatedParts[part] || - (mutatedParts[part] = new RangeSet())); - }; - var pkRangeSet = getRangeSet(""); - var delsRangeSet = getRangeSet(":dels"); - var type = req.type; - var _a = req.type === "deleteRange" - ? [req.range] - : req.type === "delete" - ? [req.keys] - : req.values.length < 50 - ? [getEffectiveKeys(primaryKey, req).filter(function (id) { return id; }), req.values] - : [], keys = _a[0], newObjs = _a[1]; - var oldCache = req.trans["_cache"]; - if (isArray(keys)) { - pkRangeSet.addKeys(keys); - var oldObjs = type === 'delete' || keys.length === newObjs.length ? getFromTransactionCache(keys, oldCache) : null; - if (!oldObjs) { - delsRangeSet.addKeys(keys); - } - if (oldObjs || newObjs) { - trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs); - } - } - else if (keys) { - var range = { from: keys.lower, to: keys.upper }; - delsRangeSet.add(range); - pkRangeSet.add(range); - } - else { - pkRangeSet.add(FULL_RANGE); - delsRangeSet.add(FULL_RANGE); - schema.indexes.forEach(function (idx) { return getRangeSet(idx.name).add(FULL_RANGE); }); - } - return table.mutate(req).then(function (res) { - if (keys && (req.type === 'add' || req.type === 'put')) { - pkRangeSet.addKeys(res.results); - if (indexesWithAutoIncPK) { - indexesWithAutoIncPK.forEach(function (idx) { - var idxVals = req.values.map(function (v) { return idx.extractKey(v); }); - var pkPos = idx.keyPath.findIndex(function (prop) { return prop === primaryKey.keyPath; }); - res.results.forEach(function (pk) { return idxVals[pkPos] = pk; }); - getRangeSet(idx.name).addKeys(idxVals); - }); - } - } - trans.mutatedParts = extendObservabilitySet(trans.mutatedParts || {}, mutatedParts); - return res; - }); - } }); - var getRange = function (_a) { - var _b, _c; - var _d = _a.query, index = _d.index, range = _d.range; - return [ - index, - new RangeSet((_b = range.lower) !== null && _b !== void 0 ? _b : core.MIN_KEY, (_c = range.upper) !== null && _c !== void 0 ? _c : core.MAX_KEY), - ]; - }; - var readSubscribers = { - get: function (req) { return [primaryKey, new RangeSet(req.key)]; }, - getMany: function (req) { return [primaryKey, new RangeSet().addKeys(req.keys)]; }, - count: getRange, - query: getRange, - openCursor: getRange, - }; - keys(readSubscribers).forEach(function (method) { - tableClone[method] = function (req) { - var subscr = PSD.subscr; - var isLiveQuery = !!subscr; - var cachable = isCachableContext(PSD, table) && isCachableRequest(method, req); - var obsSet = cachable - ? req.obsSet = {} - : subscr; - if (isLiveQuery) { - var getRangeSet = function (indexName) { - var part = "idb://".concat(dbName, "/").concat(tableName, "/").concat(indexName); - return (obsSet[part] || - (obsSet[part] = new RangeSet())); - }; - var pkRangeSet_1 = getRangeSet(""); - var delsRangeSet_1 = getRangeSet(":dels"); - var _a = readSubscribers[method](req), queriedIndex = _a[0], queriedRanges = _a[1]; - if (method === 'query' && queriedIndex.isPrimaryKey && !req.values) { - delsRangeSet_1.add(queriedRanges); - } - else { - getRangeSet(queriedIndex.name || "").add(queriedRanges); - } - if (!queriedIndex.isPrimaryKey) { - if (method === "count") { - delsRangeSet_1.add(FULL_RANGE); - } - else { - var keysPromise_1 = method === "query" && - outbound && - req.values && - table.query(__assign(__assign({}, req), { values: false })); - return table[method].apply(this, arguments).then(function (res) { - if (method === "query") { - if (outbound && req.values) { - return keysPromise_1.then(function (_a) { - var resultingKeys = _a.result; - pkRangeSet_1.addKeys(resultingKeys); - return res; - }); - } - var pKeys = req.values - ? res.result.map(extractKey) - : res.result; - if (req.values) { - pkRangeSet_1.addKeys(pKeys); - } - else { - delsRangeSet_1.addKeys(pKeys); - } - } - else if (method === "openCursor") { - var cursor_1 = res; - var wantValues_1 = req.values; - return (cursor_1 && - Object.create(cursor_1, { - key: { - get: function () { - delsRangeSet_1.addKey(cursor_1.primaryKey); - return cursor_1.key; - }, - }, - primaryKey: { - get: function () { - var pkey = cursor_1.primaryKey; - delsRangeSet_1.addKey(pkey); - return pkey; - }, - }, - value: { - get: function () { - wantValues_1 && pkRangeSet_1.addKey(cursor_1.primaryKey); - return cursor_1.value; - }, - }, - })); - } - return res; - }); - } - } - } - return table[method].apply(this, arguments); - }; - }); - return tableClone; - } }); - }, -}; -function trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs) { - function addAffectedIndex(ix) { - var rangeSet = getRangeSet(ix.name || ""); - function extractKey(obj) { - return obj != null ? ix.extractKey(obj) : null; - } - var addKeyOrKeys = function (key) { return ix.multiEntry && isArray(key) - ? key.forEach(function (key) { return rangeSet.addKey(key); }) - : rangeSet.addKey(key); }; - (oldObjs || newObjs).forEach(function (_, i) { - var oldKey = oldObjs && extractKey(oldObjs[i]); - var newKey = newObjs && extractKey(newObjs[i]); - if (cmp(oldKey, newKey) !== 0) { - if (oldKey != null) - addKeyOrKeys(oldKey); - if (newKey != null) - addKeyOrKeys(newKey); - } - }); - } - schema.indexes.forEach(addAffectedIndex); -} - -function adjustOptimisticFromFailures(tblCache, req, res) { - if (res.numFailures === 0) - return req; - if (req.type === 'deleteRange') { - return null; - } - var numBulkOps = req.keys - ? req.keys.length - : 'values' in req && req.values - ? req.values.length - : 1; - if (res.numFailures === numBulkOps) { - return null; - } - var clone = __assign({}, req); - if (isArray(clone.keys)) { - clone.keys = clone.keys.filter(function (_, i) { return !(i in res.failures); }); - } - if ('values' in clone && isArray(clone.values)) { - clone.values = clone.values.filter(function (_, i) { return !(i in res.failures); }); - } - return clone; -} - -function isAboveLower(key, range) { - return range.lower === undefined - ? true - : range.lowerOpen - ? cmp(key, range.lower) > 0 - : cmp(key, range.lower) >= 0; -} -function isBelowUpper(key, range) { - return range.upper === undefined - ? true - : range.upperOpen - ? cmp(key, range.upper) < 0 - : cmp(key, range.upper) <= 0; -} -function isWithinRange(key, range) { - return isAboveLower(key, range) && isBelowUpper(key, range); -} - -function applyOptimisticOps(result, req, ops, table, cacheEntry, immutable) { - if (!ops || ops.length === 0) - return result; - var index = req.query.index; - var multiEntry = index.multiEntry; - var queryRange = req.query.range; - var primaryKey = table.schema.primaryKey; - var extractPrimKey = primaryKey.extractKey; - var extractIndex = index.extractKey; - var extractLowLevelIndex = (index.lowLevelIndex || index).extractKey; - var finalResult = ops.reduce(function (result, op) { - var modifedResult = result; - var includedValues = op.type === 'add' || op.type === 'put' - ? op.values.filter(function (v) { - var key = extractIndex(v); - return multiEntry && isArray(key) - ? key.some(function (k) { return isWithinRange(k, queryRange); }) - : isWithinRange(key, queryRange); - }).map(function (v) { - v = deepClone(v); - if (immutable) - Object.freeze(v); - return v; - }) - : []; - switch (op.type) { - case 'add': - modifedResult = result.concat(req.values - ? includedValues - : includedValues.map(function (v) { return extractPrimKey(v); })); - break; - case 'put': - var keySet_1 = new RangeSet().addKeys(op.values.map(function (v) { return extractPrimKey(v); })); - modifedResult = result - .filter(function (item) { - var key = req.values ? extractPrimKey(item) : item; - return !rangesOverlap(new RangeSet(key), keySet_1); - }) - .concat(req.values - ? includedValues - : includedValues.map(function (v) { return extractPrimKey(v); })); - break; - case 'delete': - var keysToDelete_1 = new RangeSet().addKeys(op.keys); - modifedResult = result.filter(function (item) { - var key = req.values ? extractPrimKey(item) : item; - return !rangesOverlap(new RangeSet(key), keysToDelete_1); - }); - break; - case 'deleteRange': - var range_1 = op.range; - modifedResult = result.filter(function (item) { return !isWithinRange(extractPrimKey(item), range_1); }); - break; - } - return modifedResult; - }, result); - if (finalResult === result) - return result; - finalResult.sort(function (a, b) { - return cmp(extractLowLevelIndex(a), extractLowLevelIndex(b)) || - cmp(extractPrimKey(a), extractPrimKey(b)); - }); - if (req.limit && req.limit < Infinity) { - if (finalResult.length > req.limit) { - finalResult.length = req.limit; - } - else if (result.length === req.limit && finalResult.length < req.limit) { - cacheEntry.dirty = true; - } - } - return immutable ? Object.freeze(finalResult) : finalResult; -} - -function areRangesEqual(r1, r2) { - return (cmp(r1.lower, r2.lower) === 0 && - cmp(r1.upper, r2.upper) === 0 && - !!r1.lowerOpen === !!r2.lowerOpen && - !!r1.upperOpen === !!r2.upperOpen); -} - -function compareLowers(lower1, lower2, lowerOpen1, lowerOpen2) { - if (lower1 === undefined) - return lower2 !== undefined ? -1 : 0; - if (lower2 === undefined) - return 1; - var c = cmp(lower1, lower2); - if (c === 0) { - if (lowerOpen1 && lowerOpen2) - return 0; - if (lowerOpen1) - return 1; - if (lowerOpen2) - return -1; - } - return c; -} -function compareUppers(upper1, upper2, upperOpen1, upperOpen2) { - if (upper1 === undefined) - return upper2 !== undefined ? 1 : 0; - if (upper2 === undefined) - return -1; - var c = cmp(upper1, upper2); - if (c === 0) { - if (upperOpen1 && upperOpen2) - return 0; - if (upperOpen1) - return -1; - if (upperOpen2) - return 1; - } - return c; -} -function isSuperRange(r1, r2) { - return (compareLowers(r1.lower, r2.lower, r1.lowerOpen, r2.lowerOpen) <= 0 && - compareUppers(r1.upper, r2.upper, r1.upperOpen, r2.upperOpen) >= 0); -} - -function findCompatibleQuery(dbName, tableName, type, req) { - var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)]; - if (!tblCache) - return []; - var queries = tblCache.queries[type]; - if (!queries) - return [null, false, tblCache, null]; - var indexName = req.query ? req.query.index.name : null; - var entries = queries[indexName || '']; - if (!entries) - return [null, false, tblCache, null]; - switch (type) { - case 'query': - var equalEntry = entries.find(function (entry) { - return entry.req.limit === req.limit && - entry.req.values === req.values && - areRangesEqual(entry.req.query.range, req.query.range); - }); - if (equalEntry) - return [ - equalEntry, - true, - tblCache, - entries, - ]; - var superEntry = entries.find(function (entry) { - var limit = 'limit' in entry.req ? entry.req.limit : Infinity; - return (limit >= req.limit && - (req.values ? entry.req.values : true) && - isSuperRange(entry.req.query.range, req.query.range)); - }); - return [superEntry, false, tblCache, entries]; - case 'count': - var countQuery = entries.find(function (entry) { - return areRangesEqual(entry.req.query.range, req.query.range); - }); - return [countQuery, !!countQuery, tblCache, entries]; - } -} - -function subscribeToCacheEntry(cacheEntry, container, requery, signal) { - cacheEntry.subscribers.add(requery); - signal.addEventListener("abort", function () { - cacheEntry.subscribers.delete(requery); - if (cacheEntry.subscribers.size === 0) { - enqueForDeletion(cacheEntry, container); - } - }); -} -function enqueForDeletion(cacheEntry, container) { - setTimeout(function () { - if (cacheEntry.subscribers.size === 0) { - delArrayItem(container, cacheEntry); - } - }, 3000); -} - -var cacheMiddleware = { - stack: 'dbcore', - level: 0, - name: 'Cache', - create: function (core) { - var dbName = core.schema.name; - var coreMW = __assign(__assign({}, core), { transaction: function (stores, mode, options) { - var idbtrans = core.transaction(stores, mode, options); - if (mode === 'readwrite') { - var ac_1 = new AbortController(); - var signal = ac_1.signal; - var endTransaction = function (wasCommitted) { return function () { - ac_1.abort(); - if (mode === 'readwrite') { - var affectedSubscribers_1 = new Set(); - for (var _i = 0, stores_1 = stores; _i < stores_1.length; _i++) { - var storeName = stores_1[_i]; - var tblCache = cache["idb://".concat(dbName, "/").concat(storeName)]; - if (tblCache) { - var table = core.table(storeName); - var ops = tblCache.optimisticOps.filter(function (op) { return op.trans === idbtrans; }); - if (idbtrans._explicit && wasCommitted && idbtrans.mutatedParts) { - for (var _a = 0, _b = Object.values(tblCache.queries.query); _a < _b.length; _a++) { - var entries = _b[_a]; - for (var _c = 0, _d = entries.slice(); _c < _d.length; _c++) { - var entry = _d[_c]; - if (obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)) { - delArrayItem(entries, entry); - entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); }); - } - } - } - } - else if (ops.length > 0) { - tblCache.optimisticOps = tblCache.optimisticOps.filter(function (op) { return op.trans !== idbtrans; }); - for (var _e = 0, _f = Object.values(tblCache.queries.query); _e < _f.length; _e++) { - var entries = _f[_e]; - for (var _g = 0, _h = entries.slice(); _g < _h.length; _g++) { - var entry = _h[_g]; - if (entry.res != null && - idbtrans.mutatedParts -) { - if (wasCommitted && !entry.dirty) { - var freezeResults = Object.isFrozen(entry.res); - var modRes = applyOptimisticOps(entry.res, entry.req, ops, table, entry, freezeResults); - if (entry.dirty) { - delArrayItem(entries, entry); - entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); }); - } - else if (modRes !== entry.res) { - entry.res = modRes; - entry.promise = DexiePromise.resolve({ result: modRes }); - } - } - else { - if (entry.dirty) { - delArrayItem(entries, entry); - } - entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); }); - } - } - } - } - } - } - } - affectedSubscribers_1.forEach(function (requery) { return requery(); }); - } - }; }; - idbtrans.addEventListener('abort', endTransaction(false), { - signal: signal, - }); - idbtrans.addEventListener('error', endTransaction(false), { - signal: signal, - }); - idbtrans.addEventListener('complete', endTransaction(true), { - signal: signal, - }); - } - return idbtrans; - }, table: function (tableName) { - var downTable = core.table(tableName); - var primKey = downTable.schema.primaryKey; - var tableMW = __assign(__assign({}, downTable), { mutate: function (req) { - var trans = PSD.trans; - if (primKey.outbound || - trans.db._options.cache === 'disabled' || - trans.explicit - ) { - return downTable.mutate(req); - } - var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)]; - if (!tblCache) - return downTable.mutate(req); - var promise = downTable.mutate(req); - if ((req.type === 'add' || req.type === 'put') && (req.values.length >= 50 || getEffectiveKeys(primKey, req).some(function (key) { return key == null; }))) { - promise.then(function (res) { - var reqWithResolvedKeys = __assign(__assign({}, req), { values: req.values.map(function (value, i) { - var _a; - var valueWithKey = ((_a = primKey.keyPath) === null || _a === void 0 ? void 0 : _a.includes('.')) - ? deepClone(value) - : __assign({}, value); - setByKeyPath(valueWithKey, primKey.keyPath, res.results[i]); - return valueWithKey; - }) }); - var adjustedReq = adjustOptimisticFromFailures(tblCache, reqWithResolvedKeys, res); - tblCache.optimisticOps.push(adjustedReq); - queueMicrotask(function () { return req.mutatedParts && signalSubscribersLazily(req.mutatedParts); }); - }); - } - else { - tblCache.optimisticOps.push(req); - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - promise.then(function (res) { - if (res.numFailures > 0) { - delArrayItem(tblCache.optimisticOps, req); - var adjustedReq = adjustOptimisticFromFailures(tblCache, req, res); - if (adjustedReq) { - tblCache.optimisticOps.push(adjustedReq); - } - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - } - }); - promise.catch(function () { - delArrayItem(tblCache.optimisticOps, req); - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - }); - } - return promise; - }, query: function (req) { - var _a; - if (!isCachableContext(PSD, downTable) || !isCachableRequest("query", req)) - return downTable.query(req); - var freezeResults = ((_a = PSD.trans) === null || _a === void 0 ? void 0 : _a.db._options.cache) === 'immutable'; - var _b = PSD, requery = _b.requery, signal = _b.signal; - var _c = findCompatibleQuery(dbName, tableName, 'query', req), cacheEntry = _c[0], exactMatch = _c[1], tblCache = _c[2], container = _c[3]; - if (cacheEntry && exactMatch) { - cacheEntry.obsSet = req.obsSet; - } - else { - var promise = downTable.query(req).then(function (res) { - var result = res.result; - if (cacheEntry) - cacheEntry.res = result; - if (freezeResults) { - for (var i = 0, l = result.length; i < l; ++i) { - Object.freeze(result[i]); - } - Object.freeze(result); - } - else { - res.result = deepClone(result); - } - return res; - }).catch(function (error) { - if (container && cacheEntry) - delArrayItem(container, cacheEntry); - return Promise.reject(error); - }); - cacheEntry = { - obsSet: req.obsSet, - promise: promise, - subscribers: new Set(), - type: 'query', - req: req, - dirty: false, - }; - if (container) { - container.push(cacheEntry); - } - else { - container = [cacheEntry]; - if (!tblCache) { - tblCache = cache["idb://".concat(dbName, "/").concat(tableName)] = { - queries: { - query: {}, - count: {}, - }, - objs: new Map(), - optimisticOps: [], - unsignaledParts: {} - }; - } - tblCache.queries.query[req.query.index.name || ''] = container; - } - } - subscribeToCacheEntry(cacheEntry, container, requery, signal); - return cacheEntry.promise.then(function (res) { - return { - result: applyOptimisticOps(res.result, req, tblCache === null || tblCache === void 0 ? void 0 : tblCache.optimisticOps, downTable, cacheEntry, freezeResults), - }; - }); - } }); - return tableMW; - } }); - return coreMW; - }, -}; - -function vipify(target, vipDb) { - return new Proxy(target, { - get: function (target, prop, receiver) { - if (prop === 'db') - return vipDb; - return Reflect.get(target, prop, receiver); - } - }); -} - -var Dexie$1 = (function () { - function Dexie(name, options) { - var _this = this; - this._middlewares = {}; - this.verno = 0; - var deps = Dexie.dependencies; - this._options = options = __assign({ - addons: Dexie.addons, autoOpen: true, - indexedDB: deps.indexedDB, IDBKeyRange: deps.IDBKeyRange, cache: 'cloned' }, options); - this._deps = { - indexedDB: options.indexedDB, - IDBKeyRange: options.IDBKeyRange - }; - var addons = options.addons; - this._dbSchema = {}; - this._versions = []; - this._storeNames = []; - this._allTables = {}; - this.idbdb = null; - this._novip = this; - var state = { - dbOpenError: null, - isBeingOpened: false, - onReadyBeingFired: null, - openComplete: false, - dbReadyResolve: nop, - dbReadyPromise: null, - cancelOpen: nop, - openCanceller: null, - autoSchema: true, - PR1398_maxLoop: 3, - autoOpen: options.autoOpen, - }; - state.dbReadyPromise = new DexiePromise(function (resolve) { - state.dbReadyResolve = resolve; - }); - state.openCanceller = new DexiePromise(function (_, reject) { - state.cancelOpen = reject; - }); - this._state = state; - this.name = name; - this.on = Events(this, "populate", "blocked", "versionchange", "close", { ready: [promisableChain, nop] }); - this.on.ready.subscribe = override(this.on.ready.subscribe, function (subscribe) { - return function (subscriber, bSticky) { - Dexie.vip(function () { - var state = _this._state; - if (state.openComplete) { - if (!state.dbOpenError) - DexiePromise.resolve().then(subscriber); - if (bSticky) - subscribe(subscriber); - } - else if (state.onReadyBeingFired) { - state.onReadyBeingFired.push(subscriber); - if (bSticky) - subscribe(subscriber); - } - else { - subscribe(subscriber); - var db_1 = _this; - if (!bSticky) - subscribe(function unsubscribe() { - db_1.on.ready.unsubscribe(subscriber); - db_1.on.ready.unsubscribe(unsubscribe); - }); - } - }); - }; - }); - this.Collection = createCollectionConstructor(this); - this.Table = createTableConstructor(this); - this.Transaction = createTransactionConstructor(this); - this.Version = createVersionConstructor(this); - this.WhereClause = createWhereClauseConstructor(this); - this.on("versionchange", function (ev) { - if (ev.newVersion > 0) - console.warn("Another connection wants to upgrade database '".concat(_this.name, "'. Closing db now to resume the upgrade.")); - else - console.warn("Another connection wants to delete database '".concat(_this.name, "'. Closing db now to resume the delete request.")); - _this.close({ disableAutoOpen: false }); - }); - this.on("blocked", function (ev) { - if (!ev.newVersion || ev.newVersion < ev.oldVersion) - console.warn("Dexie.delete('".concat(_this.name, "') was blocked")); - else - console.warn("Upgrade '".concat(_this.name, "' blocked by other connection holding version ").concat(ev.oldVersion / 10)); - }); - this._maxKey = getMaxKey(options.IDBKeyRange); - this._createTransaction = function (mode, storeNames, dbschema, parentTransaction) { return new _this.Transaction(mode, storeNames, dbschema, _this._options.chromeTransactionDurability, parentTransaction); }; - this._fireOnBlocked = function (ev) { - _this.on("blocked").fire(ev); - connections - .filter(function (c) { return c.name === _this.name && c !== _this && !c._state.vcFired; }) - .map(function (c) { return c.on("versionchange").fire(ev); }); - }; - this.use(cacheExistingValuesMiddleware); - this.use(cacheMiddleware); - this.use(observabilityMiddleware); - this.use(virtualIndexMiddleware); - this.use(hooksMiddleware); - var vipDB = new Proxy(this, { - get: function (_, prop, receiver) { - if (prop === '_vip') - return true; - if (prop === 'table') - return function (tableName) { return vipify(_this.table(tableName), vipDB); }; - var rv = Reflect.get(_, prop, receiver); - if (rv instanceof Table) - return vipify(rv, vipDB); - if (prop === 'tables') - return rv.map(function (t) { return vipify(t, vipDB); }); - if (prop === '_createTransaction') - return function () { - var tx = rv.apply(this, arguments); - return vipify(tx, vipDB); - }; - return rv; - } - }); - this.vip = vipDB; - addons.forEach(function (addon) { return addon(_this); }); - } - Dexie.prototype.version = function (versionNumber) { - if (isNaN(versionNumber) || versionNumber < 0.1) - throw new exceptions.Type("Given version is not a positive number"); - versionNumber = Math.round(versionNumber * 10) / 10; - if (this.idbdb || this._state.isBeingOpened) - throw new exceptions.Schema("Cannot add version when database is open"); - this.verno = Math.max(this.verno, versionNumber); - var versions = this._versions; - var versionInstance = versions.filter(function (v) { return v._cfg.version === versionNumber; })[0]; - if (versionInstance) - return versionInstance; - versionInstance = new this.Version(versionNumber); - versions.push(versionInstance); - versions.sort(lowerVersionFirst); - versionInstance.stores({}); - this._state.autoSchema = false; - return versionInstance; - }; - Dexie.prototype._whenReady = function (fn) { - var _this = this; - return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new DexiePromise(function (resolve, reject) { - if (_this._state.openComplete) { - return reject(new exceptions.DatabaseClosed(_this._state.dbOpenError)); - } - if (!_this._state.isBeingOpened) { - if (!_this._state.autoOpen) { - reject(new exceptions.DatabaseClosed()); - return; - } - _this.open().catch(nop); - } - _this._state.dbReadyPromise.then(resolve, reject); - }).then(fn); - }; - Dexie.prototype.use = function (_a) { - var stack = _a.stack, create = _a.create, level = _a.level, name = _a.name; - if (name) - this.unuse({ stack: stack, name: name }); - var middlewares = this._middlewares[stack] || (this._middlewares[stack] = []); - middlewares.push({ stack: stack, create: create, level: level == null ? 10 : level, name: name }); - middlewares.sort(function (a, b) { return a.level - b.level; }); - return this; - }; - Dexie.prototype.unuse = function (_a) { - var stack = _a.stack, name = _a.name, create = _a.create; - if (stack && this._middlewares[stack]) { - this._middlewares[stack] = this._middlewares[stack].filter(function (mw) { - return create ? mw.create !== create : - name ? mw.name !== name : - false; - }); - } - return this; - }; - Dexie.prototype.open = function () { - var _this = this; - return usePSD(globalPSD, - function () { return dexieOpen(_this); }); - }; - Dexie.prototype._close = function () { - var state = this._state; - var idx = connections.indexOf(this); - if (idx >= 0) - connections.splice(idx, 1); - if (this.idbdb) { - try { - this.idbdb.close(); - } - catch (e) { } - this.idbdb = null; - } - if (!state.isBeingOpened) { - state.dbReadyPromise = new DexiePromise(function (resolve) { - state.dbReadyResolve = resolve; - }); - state.openCanceller = new DexiePromise(function (_, reject) { - state.cancelOpen = reject; - }); - } - }; - Dexie.prototype.close = function (_a) { - var _b = _a === void 0 ? { disableAutoOpen: true } : _a, disableAutoOpen = _b.disableAutoOpen; - var state = this._state; - if (disableAutoOpen) { - if (state.isBeingOpened) { - state.cancelOpen(new exceptions.DatabaseClosed()); - } - this._close(); - state.autoOpen = false; - state.dbOpenError = new exceptions.DatabaseClosed(); - } - else { - this._close(); - state.autoOpen = this._options.autoOpen || - state.isBeingOpened; - state.openComplete = false; - state.dbOpenError = null; - } - }; - Dexie.prototype.delete = function (closeOptions) { - var _this = this; - if (closeOptions === void 0) { closeOptions = { disableAutoOpen: true }; } - var hasInvalidArguments = arguments.length > 0 && typeof arguments[0] !== 'object'; - var state = this._state; - return new DexiePromise(function (resolve, reject) { - var doDelete = function () { - _this.close(closeOptions); - var req = _this._deps.indexedDB.deleteDatabase(_this.name); - req.onsuccess = wrap(function () { - _onDatabaseDeleted(_this._deps, _this.name); - resolve(); - }); - req.onerror = eventRejectHandler(reject); - req.onblocked = _this._fireOnBlocked; - }; - if (hasInvalidArguments) - throw new exceptions.InvalidArgument("Invalid closeOptions argument to db.delete()"); - if (state.isBeingOpened) { - state.dbReadyPromise.then(doDelete); - } - else { - doDelete(); - } - }); - }; - Dexie.prototype.backendDB = function () { - return this.idbdb; - }; - Dexie.prototype.isOpen = function () { - return this.idbdb !== null; - }; - Dexie.prototype.hasBeenClosed = function () { - var dbOpenError = this._state.dbOpenError; - return dbOpenError && (dbOpenError.name === 'DatabaseClosed'); - }; - Dexie.prototype.hasFailed = function () { - return this._state.dbOpenError !== null; - }; - Dexie.prototype.dynamicallyOpened = function () { - return this._state.autoSchema; - }; - Object.defineProperty(Dexie.prototype, "tables", { - get: function () { - var _this = this; - return keys(this._allTables).map(function (name) { return _this._allTables[name]; }); - }, - enumerable: false, - configurable: true - }); - Dexie.prototype.transaction = function () { - var args = extractTransactionArgs.apply(this, arguments); - return this._transaction.apply(this, args); - }; - Dexie.prototype._transaction = function (mode, tables, scopeFunc) { - var _this = this; - var parentTransaction = PSD.trans; - if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) - parentTransaction = null; - var onlyIfCompatible = mode.indexOf('?') !== -1; - mode = mode.replace('!', '').replace('?', ''); - var idbMode, storeNames; - try { - storeNames = tables.map(function (table) { - var storeName = table instanceof _this.Table ? table.name : table; - if (typeof storeName !== 'string') - throw new TypeError("Invalid table argument to Dexie.transaction(). Only Table or String are allowed"); - return storeName; - }); - if (mode == "r" || mode === READONLY) - idbMode = READONLY; - else if (mode == "rw" || mode == READWRITE) - idbMode = READWRITE; - else - throw new exceptions.InvalidArgument("Invalid transaction mode: " + mode); - if (parentTransaction) { - if (parentTransaction.mode === READONLY && idbMode === READWRITE) { - if (onlyIfCompatible) { - parentTransaction = null; - } - else - throw new exceptions.SubTransaction("Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY"); - } - if (parentTransaction) { - storeNames.forEach(function (storeName) { - if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) { - if (onlyIfCompatible) { - parentTransaction = null; - } - else - throw new exceptions.SubTransaction("Table " + storeName + - " not included in parent transaction."); - } - }); - } - if (onlyIfCompatible && parentTransaction && !parentTransaction.active) { - parentTransaction = null; - } - } - } - catch (e) { - return parentTransaction ? - parentTransaction._promise(null, function (_, reject) { reject(e); }) : - rejection(e); - } - var enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc); - return (parentTransaction ? - parentTransaction._promise(idbMode, enterTransaction, "lock") : - PSD.trans ? - usePSD(PSD.transless, function () { return _this._whenReady(enterTransaction); }) : - this._whenReady(enterTransaction)); - }; - Dexie.prototype.table = function (tableName) { - if (!hasOwn(this._allTables, tableName)) { - throw new exceptions.InvalidTable("Table ".concat(tableName, " does not exist")); - } - return this._allTables[tableName]; - }; - return Dexie; -}()); - -var symbolObservable = typeof Symbol !== "undefined" && "observable" in Symbol - ? Symbol.observable - : "@@observable"; -var Observable = (function () { - function Observable(subscribe) { - this._subscribe = subscribe; - } - Observable.prototype.subscribe = function (x, error, complete) { - return this._subscribe(!x || typeof x === "function" ? { next: x, error: error, complete: complete } : x); - }; - Observable.prototype[symbolObservable] = function () { - return this; - }; - return Observable; -}()); - -var domDeps; -try { - domDeps = { - indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB, - IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange - }; -} -catch (e) { - domDeps = { indexedDB: null, IDBKeyRange: null }; -} - -function liveQuery(querier) { - var hasValue = false; - var currentValue; - var observable = new Observable(function (observer) { - var scopeFuncIsAsync = isAsyncFunction(querier); - function execute(ctx) { - var wasRootExec = beginMicroTickScope(); - try { - if (scopeFuncIsAsync) { - incrementExpectedAwaits(); - } - var rv = newScope(querier, ctx); - if (scopeFuncIsAsync) { - rv = rv.finally(decrementExpectedAwaits); - } - return rv; - } - finally { - wasRootExec && endMicroTickScope(); - } - } - var closed = false; - var abortController; - var accumMuts = {}; - var currentObs = {}; - var subscription = { - get closed() { - return closed; - }, - unsubscribe: function () { - if (closed) - return; - closed = true; - if (abortController) - abortController.abort(); - if (startedListening) - globalEvents.storagemutated.unsubscribe(mutationListener); - }, - }; - observer.start && observer.start(subscription); - var startedListening = false; - var doQuery = function () { return execInGlobalContext(_doQuery); }; - function shouldNotify() { - return obsSetsOverlap(currentObs, accumMuts); - } - var mutationListener = function (parts) { - extendObservabilitySet(accumMuts, parts); - if (shouldNotify()) { - doQuery(); - } - }; - var _doQuery = function () { - if (closed || - !domDeps.indexedDB) - { - return; - } - accumMuts = {}; - var subscr = {}; - if (abortController) - abortController.abort(); - abortController = new AbortController(); - var ctx = { - subscr: subscr, - signal: abortController.signal, - requery: doQuery, - querier: querier, - trans: null - }; - var ret = execute(ctx); - Promise.resolve(ret).then(function (result) { - hasValue = true; - currentValue = result; - if (closed || ctx.signal.aborted) { - return; - } - accumMuts = {}; - currentObs = subscr; - if (!objectIsEmpty(currentObs) && !startedListening) { - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener); - startedListening = true; - } - execInGlobalContext(function () { return !closed && observer.next && observer.next(result); }); - }, function (err) { - hasValue = false; - if (!['DatabaseClosedError', 'AbortError'].includes(err === null || err === void 0 ? void 0 : err.name)) { - if (!closed) - execInGlobalContext(function () { - if (closed) - return; - observer.error && observer.error(err); - }); - } - }); - }; - setTimeout(doQuery, 0); - return subscription; - }); - observable.hasValue = function () { return hasValue; }; - observable.getValue = function () { return currentValue; }; - return observable; -} - -var Dexie = Dexie$1; -props(Dexie, __assign(__assign({}, fullNameExceptions), { - delete: function (databaseName) { - var db = new Dexie(databaseName, { addons: [] }); - return db.delete(); - }, - exists: function (name) { - return new Dexie(name, { addons: [] }).open().then(function (db) { - db.close(); - return true; - }).catch('NoSuchDatabaseError', function () { return false; }); - }, - getDatabaseNames: function (cb) { - try { - return getDatabaseNames(Dexie.dependencies).then(cb); - } - catch (_a) { - return rejection(new exceptions.MissingAPI()); - } - }, - defineClass: function () { - function Class(content) { - extend(this, content); - } - return Class; - }, ignoreTransaction: function (scopeFunc) { - return PSD.trans ? - usePSD(PSD.transless, scopeFunc) : - scopeFunc(); - }, vip: vip, async: function (generatorFn) { - return function () { - try { - var rv = awaitIterator(generatorFn.apply(this, arguments)); - if (!rv || typeof rv.then !== 'function') - return DexiePromise.resolve(rv); - return rv; - } - catch (e) { - return rejection(e); - } - }; - }, spawn: function (generatorFn, args, thiz) { - try { - var rv = awaitIterator(generatorFn.apply(thiz, args || [])); - if (!rv || typeof rv.then !== 'function') - return DexiePromise.resolve(rv); - return rv; - } - catch (e) { - return rejection(e); - } - }, - currentTransaction: { - get: function () { return PSD.trans || null; } - }, waitFor: function (promiseOrFunction, optionalTimeout) { - var promise = DexiePromise.resolve(typeof promiseOrFunction === 'function' ? - Dexie.ignoreTransaction(promiseOrFunction) : - promiseOrFunction) - .timeout(optionalTimeout || 60000); - return PSD.trans ? - PSD.trans.waitFor(promise) : - promise; - }, - Promise: DexiePromise, - debug: { - get: function () { return debug; }, - set: function (value) { - setDebug(value); - } - }, - derive: derive, extend: extend, props: props, override: override, - Events: Events, on: globalEvents, liveQuery: liveQuery, extendObservabilitySet: extendObservabilitySet, - getByKeyPath: getByKeyPath, setByKeyPath: setByKeyPath, delByKeyPath: delByKeyPath, shallowClone: shallowClone, deepClone: deepClone, getObjectDiff: getObjectDiff, cmp: cmp, asap: asap$1, - minKey: minKey, - addons: [], - connections: connections, - errnames: errnames, - dependencies: domDeps, cache: cache, - semVer: DEXIE_VERSION, version: DEXIE_VERSION.split('.') - .map(function (n) { return parseInt(n); }) - .reduce(function (p, c, i) { return p + (c / Math.pow(10, i * 2)); }) })); -Dexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange); - -if (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') { - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (updatedParts) { - if (!propagatingLocally) { - var event_1; - event_1 = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, { - detail: updatedParts - }); - propagatingLocally = true; - dispatchEvent(event_1); - propagatingLocally = false; - } - }); - addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, function (_a) { - var detail = _a.detail; - if (!propagatingLocally) { - propagateLocally(detail); - } - }); -} -function propagateLocally(updateParts) { - var wasMe = propagatingLocally; - try { - propagatingLocally = true; - globalEvents.storagemutated.fire(updateParts); - signalSubscribersNow(updateParts, true); - } - finally { - propagatingLocally = wasMe; - } -} -var propagatingLocally = false; - -var bc; -var createBC = function () { }; -if (typeof BroadcastChannel !== 'undefined') { - createBC = function () { - bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME); - bc.onmessage = function (ev) { return ev.data && propagateLocally(ev.data); }; - }; - createBC(); - if (typeof bc.unref === 'function') { - bc.unref(); - } - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (changedParts) { - if (!propagatingLocally) { - bc.postMessage(changedParts); - } - }); -} - -if (typeof addEventListener !== 'undefined') { - addEventListener('pagehide', function (event) { - if (!Dexie$1.disableBfCache && event.persisted) { - if (debug) - console.debug('Dexie: handling persisted pagehide'); - bc === null || bc === void 0 ? void 0 : bc.close(); - for (var _i = 0, connections_1 = connections; _i < connections_1.length; _i++) { - var db = connections_1[_i]; - db.close({ disableAutoOpen: false }); - } - } - }); - addEventListener('pageshow', function (event) { - if (!Dexie$1.disableBfCache && event.persisted) { - if (debug) - console.debug('Dexie: handling persisted pageshow'); - createBC(); - propagateLocally({ all: new RangeSet(-Infinity, [[]]) }); - } - }); -} - -function add(value) { - return new PropModification({ add: value }); -} - -function remove(value) { - return new PropModification({ remove: value }); -} - -function replacePrefix(a, b) { - return new PropModification({ replacePrefix: [a, b] }); -} - -DexiePromise.rejectionMapper = mapError; -setDebug(debug); - -export { Dexie$1 as Dexie, Entity, PropModSymbol, PropModification, RangeSet, add, cmp, Dexie$1 as default, liveQuery, mergeRanges, rangesOverlap, remove, replacePrefix }; -//# sourceMappingURL=dexie.mjs.map diff --git a/src/assets/dexie/dist/dexie.mjs.map b/src/assets/dexie/dist/dexie.mjs.map deleted file mode 100644 index ad2b2acf2..000000000 --- a/src/assets/dexie/dist/dexie.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dexie.mjs","sources":["../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.es6.js","../src/globals/global.ts","../src/functions/utils.ts","../src/errors/errors.js","../src/functions/chaining-functions.js","../src/helpers/debug.ts","../src/helpers/promise.js","../src/functions/temp-transaction.ts","../src/globals/constants.ts","../src/functions/combine.ts","../src/dbcore/keyrange.ts","../src/functions/workaround-undefined-primkey.ts","../src/classes/entity/Entity.ts","../src/functions/cmp.ts","../src/classes/table/table.ts","../src/helpers/Events.js","../src/functions/make-class-constructor.ts","../src/classes/table/table-constructor.ts","../src/classes/collection/collection-helpers.ts","../src/helpers/prop-modification.ts","../src/classes/collection/collection.ts","../src/classes/collection/collection-constructor.ts","../src/functions/compare-functions.ts","../src/classes/where-clause/where-clause-helpers.ts","../src/classes/where-clause/where-clause.ts","../src/classes/where-clause/where-clause-constructor.ts","../src/functions/event-wrappers.ts","../src/globals/global-events.ts","../src/classes/transaction/transaction.ts","../src/classes/transaction/transaction-constructor.ts","../src/helpers/index-spec.ts","../src/helpers/table-schema.ts","../src/functions/quirks.ts","../src/dbcore/get-key-extractor.ts","../src/dbcore/dbcore-indexeddb.ts","../src/classes/dexie/generate-middleware-stacks.ts","../src/classes/version/schema-helpers.ts","../src/classes/version/version.ts","../src/classes/version/version-constructor.ts","../src/helpers/database-enumerator.ts","../src/classes/dexie/vip.ts","../node_modules/.pnpm/safari-14-idb-fix@3.0.0/node_modules/safari-14-idb-fix/dist/index.js","../src/helpers/rangeset.ts","../src/live-query/extend-observability-set.ts","../src/live-query/obs-sets-overlap.ts","../src/live-query/cache/cache.ts","../src/live-query/cache/signalSubscribers.ts","../src/classes/dexie/dexie-open.ts","../src/helpers/yield-support.ts","../src/classes/dexie/transaction-helpers.ts","../src/dbcore/virtual-index-middleware.ts","../src/functions/get-object-diff.ts","../src/dbcore/get-effective-keys.ts","../src/hooks/hooks-middleware.ts","../src/dbcore/cache-existing-values-middleware.ts","../src/live-query/cache/is-cachable-context.ts","../src/live-query/cache/is-cachable-request.ts","../src/live-query/observability-middleware.ts","../src/live-query/cache/adjust-optimistic-request-from-failures.ts","../src/live-query/cache/is-within-range.ts","../src/live-query/cache/apply-optimistic-ops.ts","../src/live-query/cache/are-ranges-equal.ts","../src/live-query/cache/is-super-range.ts","../src/live-query/cache/find-compatible-query.ts","../src/live-query/cache/subscribe-cachentry.ts","../src/live-query/cache/cache-middleware.ts","../src/helpers/vipify.ts","../src/classes/dexie/dexie.ts","../src/classes/observable/observable.ts","../src/classes/dexie/dexie-dom-dependencies.ts","../src/live-query/live-query.ts","../src/classes/dexie/dexie-static-props.ts","../src/live-query/propagate-locally.ts","../src/live-query/enable-broadcast.ts","../src/support-bfcache.ts","../src/functions/propmods/add.ts","../src/functions/propmods/remove.ts","../src/functions/propmods/replace-prefix.ts","../src/index.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","declare var global;\nexport const _global: any =\n typeof globalThis !== 'undefined' ? globalThis :\n typeof self !== 'undefined' ? self :\n typeof window !== 'undefined' ? window :\n global;\n","import { _global } from \"../globals/global\";\nexport const keys = Object.keys;\nexport const isArray = Array.isArray;\nif (typeof Promise !== 'undefined' && !_global.Promise){\n // In jsdom, this it can be the case that Promise is not put on the global object.\n // If so, we need to patch the global object for the rest of the code to work as expected.\n // Other dexie code expects Promise to be on the global object (like normal browser environments)\n _global.Promise = Promise;\n}\nexport { _global }\n\nexport function extend(obj: T, extension: X): T & X {\n if (typeof extension !== 'object') return obj as T & X;\n keys(extension).forEach(function (key) {\n obj[key] = extension[key];\n });\n return obj as T & X;\n}\n\nexport const getProto = Object.getPrototypeOf;\nexport const _hasOwn = {}.hasOwnProperty;\nexport function hasOwn(obj, prop) {\n return _hasOwn.call(obj, prop);\n}\n\nexport function props (proto, extension) {\n if (typeof extension === 'function') extension = extension(getProto(proto));\n (typeof Reflect === \"undefined\" ? keys : Reflect.ownKeys)(extension).forEach(key => {\n setProp(proto, key, extension[key]);\n });\n}\n\nexport const defineProperty = Object.defineProperty;\n\nexport function setProp(obj, prop, functionOrGetSet, options?) {\n defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, \"get\") && typeof functionOrGetSet.get === 'function' ?\n {get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true} :\n {value: functionOrGetSet, configurable: true, writable: true}, options));\n}\n\nexport function derive(Child) {\n return {\n from: function (Parent) {\n Child.prototype = Object.create(Parent.prototype);\n setProp(Child.prototype, \"constructor\", Child);\n return {\n extend: props.bind(null, Child.prototype)\n };\n }\n };\n}\n\nexport const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nexport function getPropertyDescriptor(obj, prop) {\n const pd = getOwnPropertyDescriptor(obj, prop);\n let proto;\n return pd || (proto = getProto(obj)) && getPropertyDescriptor (proto, prop);\n}\n\nconst _slice = [].slice;\nexport function slice(args, start?, end?) {\n return _slice.call(args, start, end);\n}\n\nexport function override(origFunc, overridedFactory) {\n return overridedFactory(origFunc);\n}\n\nexport function assert (b) {\n if (!b) throw new Error(\"Assertion Failed\");\n}\n\nexport function asap(fn) {\n // @ts-ignore\n if (_global.setImmediate) setImmediate(fn); else setTimeout(fn, 0);\n}\n\nexport function getUniqueArray(a) {\n return a.filter((value, index, self) => self.indexOf(value) === index);\n}\n\n/** Generate an object (hash map) based on given array.\n * @param extractor Function taking an array item and its index and returning an array of 2 items ([key, value]) to\n * instert on the resulting object for each item in the array. If this function returns a falsy value, the\n * current item wont affect the resulting object.\n */\nexport function arrayToObject (array: T[], extractor: (x:T, idx: number)=>[string, R]): {[name: string]: R} {\n return array.reduce((result, item, i) => {\n var nameAndValue = extractor(item, i);\n if (nameAndValue) result[nameAndValue[0]] = nameAndValue[1];\n return result;\n }, {});\n}\n\nexport function trycatcher(fn, reject) {\n return function () {\n try {\n fn.apply(this, arguments);\n } catch (e) {\n reject(e);\n }\n };\n}\n\nexport function tryCatch(fn: (...args: any[])=>void, onerror, args?) : void {\n try {\n fn.apply(null, args);\n } catch (ex) {\n onerror && onerror(ex);\n }\n}\n\nexport function getByKeyPath(obj, keyPath) {\n // http://www.w3.org/TR/IndexedDB/#steps-for-extracting-a-key-from-a-value-using-a-key-path\n if (typeof keyPath === 'string' && hasOwn(obj, keyPath)) return obj[keyPath]; // This line is moved from last to first for optimization purpose.\n if (!keyPath) return obj;\n if (typeof keyPath !== 'string') {\n var rv = [];\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n var val = getByKeyPath(obj, keyPath[i]);\n rv.push(val);\n }\n return rv;\n }\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var innerObj = obj[keyPath.substr(0, period)];\n return innerObj == null ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1));\n }\n return undefined;\n}\n\nexport function setByKeyPath(obj, keyPath, value) {\n if (!obj || keyPath === undefined) return;\n if ('isFrozen' in Object && Object.isFrozen(obj)) return;\n if (typeof keyPath !== 'string' && 'length' in keyPath) {\n assert(typeof value !== 'string' && 'length' in value);\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n setByKeyPath(obj, keyPath[i], value[i]);\n }\n } else {\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var currentKeyPath = keyPath.substr(0, period);\n var remainingKeyPath = keyPath.substr(period + 1);\n if (remainingKeyPath === \"\")\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) obj.splice(currentKeyPath, 1);\n else delete obj[currentKeyPath];\n } else obj[currentKeyPath] = value;\n else {\n var innerObj = obj[currentKeyPath];\n if (!innerObj || !hasOwn(obj, currentKeyPath)) innerObj = (obj[currentKeyPath] = {});\n setByKeyPath(innerObj, remainingKeyPath, value);\n }\n } else {\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(keyPath))) obj.splice(keyPath, 1);\n else delete obj[keyPath];\n } else obj[keyPath] = value;\n }\n }\n}\n\nexport function delByKeyPath(obj, keyPath) {\n if (typeof keyPath === 'string')\n setByKeyPath(obj, keyPath, undefined);\n else if ('length' in keyPath)\n [].map.call(keyPath, function(kp) {\n setByKeyPath(obj, kp, undefined);\n });\n}\n\nexport function shallowClone(obj) {\n var rv = {};\n for (var m in obj) {\n if (hasOwn(obj, m)) rv[m] = obj[m];\n }\n return rv;\n}\n\nconst concat = [].concat;\nexport function flatten (a: (T | T[])[]) : T[] {\n return concat.apply([], a);\n}\n\n//https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm\nconst intrinsicTypeNames =\n \"BigUint64Array,BigInt64Array,Array,Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,FileSystemDirectoryHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey\"\n .split(',').concat(\n flatten([8,16,32,64].map(num=>[\"Int\",\"Uint\",\"Float\"].map(t=>t+num+\"Array\")))\n ).filter(t=>_global[t]);\nconst intrinsicTypes = new Set(intrinsicTypeNames.map(t=>_global[t]));\n\n/** Deep clone a simple object tree.\n * \n * Copies object tree deeply, but does not deep-copy arrays,\n * typed arrays, Dates or other intrinsic types.\n * \n * Does not check for cyclic references.\n * \n * This function is 6 times faster than structuredClone() on chromium 111.\n * \n * This function can safely be used for cloning ObservabilitySets and RangeSets.\n * \n * @param o Object to clone\n * @returns Cloned object\n */\nexport function cloneSimpleObjectTree(o: T): T {\n const rv = {} as T;\n for (const k in o) if (hasOwn(o, k)) {\n const v = o[k];\n rv[k] = !v || typeof v !== 'object' || intrinsicTypes.has(v.constructor) ? v : cloneSimpleObjectTree(v);\n }\n return rv;\n}\n\nexport function objectIsEmpty(o: object) {\n for (const k in o) if (hasOwn(o, k)) return false;\n return true;\n}\n\nlet circularRefs: null | WeakMap = null;\n\n/** Deep clone an object or array.\n * \n * \n * @param any \n * @returns \n */\nexport function deepClone(any: T): T {\n circularRefs = new WeakMap();\n const rv = innerDeepClone(any);\n circularRefs = null;\n return rv;\n}\n\nfunction innerDeepClone(x: T): T {\n if (!x || typeof x !== 'object') return x;\n let rv = circularRefs.get(x); // Resolve circular references\n if (rv) return rv;\n if (isArray(x)) {\n rv = [];\n circularRefs.set(x, rv);\n for (var i = 0, l = x.length; i < l; ++i) {\n rv.push(innerDeepClone(x[i]));\n }\n } else if (intrinsicTypes.has(x.constructor)) {\n // For performance, we're less strict than structuredClone - we're only\n // cloning arrays and custom objects.\n // Typed arrays, Dates etc are not cloned.\n rv = x;\n } else {\n // We're nicer to custom classes than what structuredClone() is -\n // we preserve the proto of each object.\n const proto = getProto(x);\n rv = proto === Object.prototype ? {} : Object.create(proto);\n circularRefs.set(x, rv);\n for (var prop in x) {\n if (hasOwn(x, prop)) {\n rv[prop] = innerDeepClone(x[prop]);\n }\n }\n }\n return rv;\n}\n\nconst {toString} = {};\nexport function toStringTag(o: Object) {\n return toString.call(o).slice(8, -1);\n}\n\n// If first argument is iterable or array-like, return it as an array\nexport const iteratorSymbol = typeof Symbol !== 'undefined' ?\n Symbol.iterator :\n '@@iterator';\nexport const getIteratorOf = typeof iteratorSymbol === \"symbol\" ? function(x) {\n var i;\n return x != null && (i = x[iteratorSymbol]) && i.apply(x);\n} : function () { return null; };\nexport const asyncIteratorSymbol = typeof Symbol !== 'undefined'\n ? Symbol.asyncIterator || Symbol.for(\"Symbol.asyncIterator\")\n : '@asyncIterator';\n\nexport function delArrayItem(a: any[], x: any) {\n const i = a.indexOf(x);\n if (i >= 0) a.splice(i, 1);\n return i >= 0;\n}\n\nexport const NO_CHAR_ARRAY = {};\n// Takes one or several arguments and returns an array based on the following criteras:\n// * If several arguments provided, return arguments converted to an array in a way that\n// still allows javascript engine to optimize the code.\n// * If single argument is an array, return a clone of it.\n// * If this-pointer equals NO_CHAR_ARRAY, don't accept strings as valid iterables as a special\n// case to the two bullets below.\n// * If single argument is an iterable, convert it to an array and return the resulting array.\n// * If single argument is array-like (has length of type number), convert it to an array.\nexport function getArrayOf (arrayLike) {\n var i, a, x, it;\n if (arguments.length === 1) {\n if (isArray(arrayLike)) return arrayLike.slice();\n if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') return [arrayLike];\n if ((it = getIteratorOf(arrayLike))) {\n a = [];\n while ((x = it.next()), !x.done) a.push(x.value);\n return a;\n }\n if (arrayLike == null) return [arrayLike];\n i = arrayLike.length;\n if (typeof i === 'number') {\n a = new Array(i);\n while (i--) a[i] = arrayLike[i];\n return a;\n }\n return [arrayLike];\n }\n i = arguments.length;\n a = new Array(i);\n while (i--) a[i] = arguments[i];\n return a;\n}\nexport const isAsyncFunction = typeof Symbol !== 'undefined'\n ? (fn: Function) => fn[Symbol.toStringTag] === 'AsyncFunction'\n : ()=>false;\n","import { derive, setProp } from '../functions/utils';\n\nvar dexieErrorNames = [\n 'Modify',\n 'Bulk',\n 'OpenFailed',\n 'VersionChange',\n 'Schema',\n 'Upgrade',\n 'InvalidTable',\n 'MissingAPI',\n 'NoSuchDatabase',\n 'InvalidArgument',\n 'SubTransaction',\n 'Unsupported',\n 'Internal',\n 'DatabaseClosed',\n 'PrematureCommit',\n 'ForeignAwait'\n];\n\nvar idbDomErrorNames = [\n 'Unknown',\n 'Constraint',\n 'Data',\n 'TransactionInactive',\n 'ReadOnly',\n 'Version',\n 'NotFound',\n 'InvalidState',\n 'InvalidAccess',\n 'Abort',\n 'Timeout',\n 'QuotaExceeded',\n 'Syntax',\n 'DataClone'\n];\n\nvar errorList = dexieErrorNames.concat(idbDomErrorNames);\n\nvar defaultTexts = {\n VersionChanged: \"Database version changed by other database connection\",\n DatabaseClosed: \"Database has been closed\",\n Abort: \"Transaction aborted\",\n TransactionInactive: \"Transaction has already completed or failed\",\n MissingAPI: \"IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb\"\n};\n\n//\n// DexieError - base class of all out exceptions.\n//\nexport function DexieError (name, msg) {\n // Reason we don't use ES6 classes is because:\n // 1. It bloats transpiled code and increases size of minified code.\n // 2. It doesn't give us much in this case.\n // 3. It would require sub classes to call super(), which\n // is not needed when deriving from Error.\n this.name = name;\n this.message = msg;\n}\n\nderive(DexieError).from(Error).extend({\n toString: function(){ return this.name + \": \" + this.message; }\n});\n\nfunction getMultiErrorMessage (msg, failures) {\n return msg + \". Errors: \" + Object.keys(failures)\n .map(key=>failures[key].toString())\n .filter((v,i,s)=>s.indexOf(v) === i) // Only unique error strings\n .join('\\n');\n}\n\n//\n// ModifyError - thrown in Collection.modify()\n// Specific constructor because it contains members failures and failedKeys.\n//\nexport function ModifyError (msg, failures, successCount, failedKeys) {\n this.failures = failures;\n this.failedKeys = failedKeys;\n this.successCount = successCount;\n this.message = getMultiErrorMessage(msg, failures);\n}\nderive(ModifyError).from(DexieError);\n\nexport function BulkError (msg, failures) {\n this.name = \"BulkError\";\n this.failures = Object.keys(failures).map(pos => failures[pos]);\n this.failuresByPos = failures;\n this.message = getMultiErrorMessage(msg, this.failures);\n}\nderive(BulkError).from(DexieError);\n\n//\n//\n// Dynamically generate error names and exception classes based\n// on the names in errorList.\n//\n//\n\n// Map of {ErrorName -> ErrorName + \"Error\"}\nexport var errnames = errorList.reduce((obj,name)=>(obj[name]=name+\"Error\",obj),{});\n\n// Need an alias for DexieError because we're gonna create subclasses with the same name.\nconst BaseException = DexieError;\n// Map of {ErrorName -> exception constructor}\nexport var exceptions = errorList.reduce((obj,name)=>{\n // Let the name be \"DexieError\" because this name may\n // be shown in call stack and when debugging. DexieError is\n // the most true name because it derives from DexieError,\n // and we cannot change Function.name programatically without\n // dynamically create a Function object, which would be considered\n // 'eval-evil'.\n var fullName = name + \"Error\";\n function DexieError (msgOrInner, inner){\n this.name = fullName;\n if (!msgOrInner) {\n this.message = defaultTexts[name] || fullName;\n this.inner = null;\n } else if (typeof msgOrInner === 'string') {\n this.message = `${msgOrInner}${!inner ? '' : '\\n ' + inner}`;\n this.inner = inner || null;\n } else if (typeof msgOrInner === 'object') {\n this.message = `${msgOrInner.name} ${msgOrInner.message}`;\n this.inner = msgOrInner;\n }\n }\n derive(DexieError).from(BaseException);\n obj[name]=DexieError;\n return obj;\n},{});\n\n// Use ECMASCRIPT standard exceptions where applicable:\nexceptions.Syntax = SyntaxError;\nexceptions.Type = TypeError;\nexceptions.Range = RangeError;\n\nexport var exceptionMap = idbDomErrorNames.reduce((obj, name)=>{\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nexport function mapError (domError, message) {\n if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name])\n return domError;\n var rv = new exceptionMap[domError.name](message || domError.message, domError);\n if (\"stack\" in domError) {\n // Derive stack from inner exception if it has a stack\n setProp(rv, \"stack\", {get: function(){\n return this.inner.stack;\n }});\n }\n return rv;\n}\n\nexport var fullNameExceptions = errorList.reduce((obj, name)=>{\n if ([\"Syntax\",\"Type\",\"Range\"].indexOf(name) === -1)\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nfullNameExceptions.ModifyError = ModifyError;\nfullNameExceptions.DexieError = DexieError;\nfullNameExceptions.BulkError = BulkError;\n","import {extend} from './utils';\n\nexport function nop() { }\nexport function mirror(val) { return val; }\nexport function pureFunctionChain(f1, f2) {\n // Enables chained events that takes ONE argument and returns it to the next function in chain.\n // This pattern is used in the hook(\"reading\") event.\n if (f1 == null || f1 === mirror) return f2;\n return function (val) {\n return f2(f1(val));\n };\n}\n\nexport function callBoth(on1, on2) {\n return function () {\n on1.apply(this, arguments);\n on2.apply(this, arguments);\n };\n}\n\nexport function hookCreatingChain(f1, f2) {\n // Enables chained events that takes several arguments and may modify first argument by making a modification and then returning the same instance.\n // This pattern is used in the hook(\"creating\") event.\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res !== undefined) arguments[0] = res;\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res2 !== undefined ? res2 : res;\n };\n}\n\nexport function hookDeletingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = this.onerror = null;\n f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n };\n}\n\nexport function hookUpdatingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function (modifications) {\n var res = f1.apply(this, arguments);\n extend(modifications, res); // If f1 returns new modifications, extend caller's modifications with the result before calling next in chain.\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res === undefined ?\n (res2 === undefined ? undefined : res2) :\n (extend(res, res2));\n };\n}\n\nexport function reverseStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n if (f2.apply(this, arguments) === false) return false;\n return f1.apply(this, arguments);\n };\n}\n\nexport function nonStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n f2.apply(this, arguments);\n };\n}\n\nexport function promisableChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res && typeof res.then === 'function') {\n var thiz = this,\n i = arguments.length,\n args = new Array(i);\n while (i--) args[i] = arguments[i];\n return res.then(function () {\n return f2.apply(thiz, args);\n });\n }\n return f2.apply(this, arguments);\n };\n}\n","// By default, debug will be true only if platform is a web platform and its page is served from localhost.\n// When debug = true, error's stacks will contain asyncronic long stacks.\nexport var debug = typeof location !== 'undefined' &&\n // By default, use debug mode if served from localhost.\n /^(http|https):\\/\\/(localhost|127\\.0\\.0\\.1)/.test(location.href);\n\nexport function setDebug(value, filter) {\n debug = value;\n}\n\nexport function deprecated (what: string, fn: (...args)=>T) {\n return function () {\n console.warn(`${what} is deprecated. See https://dexie.org/docs/Deprecations}`);\n return fn.apply(this, arguments);\n } as (...args)=>T\n}\n","/*\n * Copyright (c) 2014-2017 David Fahlander\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/LICENSE-2.0\n */\nimport { _global } from '../globals/global';\nimport {tryCatch, props, setProp,\n getPropertyDescriptor, getArrayOf, extend, getProto} from '../functions/utils';\nimport {nop, callBoth, mirror} from '../functions/chaining-functions';\nimport {debug} from './debug';\nimport {exceptions} from '../errors';\n\n//\n// Promise and Zone (PSD) for Dexie library\n//\n// I started out writing this Promise class by copying promise-light (https://github.com/taylorhakes/promise-light) by\n// https://github.com/taylorhakes - an A+ and ECMASCRIPT 6 compliant Promise implementation.\n//\n// In previous versions this was fixed by not calling setTimeout when knowing that the resolve() or reject() came from another\n// tick. In Dexie v1.4.0, I've rewritten the Promise class entirely. Just some fragments of promise-light is left. I use\n// another strategy now that simplifies everything a lot: to always execute callbacks in a new micro-task, but have an own micro-task\n// engine that is indexedDB compliant across all browsers.\n// Promise class has also been optimized a lot with inspiration from bluebird - to avoid closures as much as possible.\n//\n// Specific non-standard features of this Promise class:\n// * Custom zone support (a.k.a. PSD) with ability to keep zones also when using native promises as well as\n// native async / await.\n// * Promise.follow() method built upon the custom zone engine, that allows user to track all promises created from current stack frame\n// and below + all promises that those promises creates or awaits.\n// * Detect any unhandled promise in a PSD-scope (PSD.onunhandled). \n//\n// David Fahlander, https://github.com/dfahlander\n//\n\n// Just a pointer that only this module knows about.\n// Used in Promise constructor to emulate a private constructor.\nvar INTERNAL = {};\n\nconst\n ZONE_ECHO_LIMIT = 100,\n [resolvedNativePromise, nativePromiseProto, resolvedGlobalPromise] = typeof Promise === 'undefined' ?\n [] :\n (()=>{\n let globalP = Promise.resolve();\n if (typeof crypto === 'undefined' || !crypto.subtle)\n return [globalP, getProto(globalP), globalP];\n // Generate a native promise (as window.Promise may have been patched)\n const nativeP = crypto.subtle.digest(\"SHA-512\", new Uint8Array([0]));\n return [\n nativeP,\n getProto(nativeP),\n globalP\n ];\n })(),\n nativePromiseThen = nativePromiseProto && nativePromiseProto.then;\n\nexport const NativePromise = resolvedNativePromise && resolvedNativePromise.constructor;\nconst patchGlobalPromise = !!resolvedGlobalPromise;\n\n/* The default function used only for the very first promise in a promise chain.\n As soon as then promise is resolved or rejected, all next tasks will be executed in micro ticks\n emulated in this module. For indexedDB compatibility, this means that every method needs to \n execute at least one promise before doing an indexedDB operation. Dexie will always call \n db.ready().then() for every operation to make sure the indexedDB event is started in an\n indexedDB-compatible emulated micro task loop.\n*/\nfunction schedulePhysicalTick() {\n queueMicrotask(physicalTick);\n}\n\n// Configurable through Promise.scheduler.\n// Don't export because it would be unsafe to let unknown\n// code call it unless they do try..catch within their callback.\n// This function can be retrieved through getter of Promise.scheduler though,\n// but users must not do Promise.scheduler = myFuncThatThrowsException\nvar asap = function (callback, args) {\n microtickQueue.push([callback, args]);\n if (needsNewPhysicalTick) {\n schedulePhysicalTick();\n needsNewPhysicalTick = false;\n }\n};\n\nvar isOutsideMicroTick = true, // True when NOT in a virtual microTick.\n needsNewPhysicalTick = true, // True when a push to microtickQueue must also schedulePhysicalTick()\n unhandledErrors = [], // Rejected promises that has occured. Used for triggering 'unhandledrejection'.\n rejectingErrors = [], // Tracks if errors are being re-rejected during onRejected callback.\n rejectionMapper = mirror; // Remove in next major when removing error mapping of DOMErrors and DOMExceptions\n \nexport var globalPSD = {\n id: 'global',\n global: true,\n ref: 0,\n unhandleds: [],\n onunhandled: nop,\n pgp: false,\n env: {},\n finalize: nop\n};\n\nexport var PSD = globalPSD;\n\nexport var microtickQueue = []; // Callbacks to call in this or next physical tick.\nexport var numScheduledCalls = 0; // Number of listener-calls left to do in this physical tick.\nexport var tickFinalizers = []; // Finalizers to call when there are no more async calls scheduled within current physical tick.\n\nexport default function DexiePromise(fn) {\n if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); \n this._listeners = [];\n \n // A library may set `promise._lib = true;` after promise is created to make resolve() or reject()\n // execute the microtask engine implicitely within the call to resolve() or reject().\n // To remain A+ compliant, a library must only set `_lib=true` if it can guarantee that the stack\n // only contains library code when calling resolve() or reject().\n // RULE OF THUMB: ONLY set _lib = true for promises explicitely resolving/rejecting directly from\n // global scope (event handler, timer etc)!\n this._lib = false;\n // Current async scope\n var psd = (this._PSD = PSD);\n \n if (typeof fn !== 'function') {\n if (fn !== INTERNAL) throw new TypeError('Not a function');\n // Private constructor (INTERNAL, state, value).\n // Used internally by Promise.resolve() and Promise.reject().\n this._state = arguments[1];\n this._value = arguments[2];\n if (this._state === false)\n handleRejection(this, this._value); // Map error, set stack and addPossiblyUnhandledError().\n return;\n }\n \n this._state = null; // null (=pending), false (=rejected) or true (=resolved)\n this._value = null; // error or result\n ++psd.ref; // Refcounting current scope\n executePromiseTask(this, fn);\n}\n\n// Prepare a property descriptor to put onto Promise.prototype.then\nconst thenProp = {\n get: function() {\n var psd = PSD, microTaskId = totalEchoes;\n\n function then (onFulfilled, onRejected) {\n var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes);\n const cleanup = possibleAwait && !decrementExpectedAwaits();\n var rv = new DexiePromise((resolve, reject) => {\n propagateToListener(this, new Listener(\n nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup),\n nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup),\n resolve,\n reject,\n psd));\n });\n if (this._consoleTask) rv._consoleTask = this._consoleTask;\n return rv;\n }\n\n then.prototype = INTERNAL; // For idempotense, see setter below.\n\n return then;\n },\n // Be idempotent and allow another framework (such as zone.js or another instance of a Dexie.Promise module) to replace Promise.prototype.then\n // and when that framework wants to restore the original property, we must identify that and restore the original property descriptor.\n set: function (value) {\n setProp (this, 'then', value && value.prototype === INTERNAL ?\n thenProp : // Restore to original property descriptor.\n {\n get: function(){\n return value; // Getter returning provided value (behaves like value is just changed)\n },\n set: thenProp.set // Keep a setter that is prepared to restore original.\n }\n );\n }\n};\n\nprops(DexiePromise.prototype, {\n then: thenProp, // Defined above.\n _then: function (onFulfilled, onRejected) {\n // A little tinier version of then() that don't have to create a resulting promise.\n propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); \n },\n\n catch: function (onRejected) {\n if (arguments.length === 1) return this.then(null, onRejected);\n // First argument is the Error type to catch\n var type = arguments[0],\n handler = arguments[1];\n return typeof type === 'function' ? this.then(null, err =>\n // Catching errors by its constructor type (similar to java / c++ / c#)\n // Sample: promise.catch(TypeError, function (e) { ... });\n err instanceof type ? handler(err) : PromiseReject(err))\n : this.then(null, err =>\n // Catching errors by the error.name property. Makes sense for indexedDB where error type\n // is always DOMError but where e.name tells the actual error type.\n // Sample: promise.catch('ConstraintError', function (e) { ... });\n err && err.name === type ? handler(err) : PromiseReject(err));\n },\n\n finally: function (onFinally) {\n return this.then(value => {\n return DexiePromise.resolve(onFinally()).then(()=>value);\n }, err => {\n return DexiePromise.resolve(onFinally()).then(()=>PromiseReject(err));\n });\n },\n \n timeout: function (ms, msg) {\n return ms < Infinity ?\n new DexiePromise((resolve, reject) => {\n var handle = setTimeout(() => reject(new exceptions.Timeout(msg)), ms);\n this.then(resolve, reject).finally(clearTimeout.bind(null, handle));\n }) : this;\n }\n});\n\nif (typeof Symbol !== 'undefined' && Symbol.toStringTag)\n setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise');\n\n// Now that Promise.prototype is defined, we have all it takes to set globalPSD.env.\n// Environment globals snapshotted on leaving global zone\nglobalPSD.env = snapShot();\n\nfunction Listener(onFulfilled, onRejected, resolve, reject, zone) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.resolve = resolve;\n this.reject = reject;\n this.psd = zone;\n}\n\n// Promise Static Properties\nprops (DexiePromise, {\n all: function () {\n var values = getArrayOf.apply(null, arguments) // Supports iterables, implicit arguments and array-like.\n .map(onPossibleParallellAsync); // Handle parallell async/awaits \n return new DexiePromise(function (resolve, reject) {\n if (values.length === 0) resolve([]);\n var remaining = values.length;\n values.forEach((a,i) => DexiePromise.resolve(a).then(x => {\n values[i] = x;\n if (!--remaining) resolve(values);\n }, reject));\n });\n },\n \n resolve: value => {\n if (value instanceof DexiePromise) return value;\n if (value && typeof value.then === 'function') return new DexiePromise((resolve, reject)=>{\n value.then(resolve, reject);\n });\n var rv = new DexiePromise(INTERNAL, true, value);\n return rv;\n },\n \n reject: PromiseReject,\n \n race: function () {\n var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n values.map(value => DexiePromise.resolve(value).then(resolve, reject));\n });\n },\n\n PSD: {\n get: ()=>PSD,\n set: value => PSD = value\n },\n\n totalEchoes: {get: ()=>totalEchoes},\n\n //task: {get: ()=>task},\n \n newPSD: newScope,\n \n usePSD: usePSD,\n \n scheduler: {\n get: () => asap,\n set: value => {asap = value}\n },\n \n rejectionMapper: {\n get: () => rejectionMapper,\n set: value => {rejectionMapper = value;} // Map reject failures\n },\n \n follow: (fn, zoneProps) => {\n return new DexiePromise((resolve, reject) => {\n return newScope((resolve, reject) => {\n var psd = PSD;\n psd.unhandleds = []; // For unhandled standard- or 3rd party Promises. Checked at psd.finalize()\n psd.onunhandled = reject; // Triggered directly on unhandled promises of this library.\n psd.finalize = callBoth(function () {\n // Unhandled standard or 3rd part promises are put in PSD.unhandleds and\n // examined upon scope completion while unhandled rejections in this Promise\n // will trigger directly through psd.onunhandled\n run_at_end_of_this_or_next_physical_tick(()=>{\n this.unhandleds.length === 0 ? resolve() : reject(this.unhandleds[0]);\n });\n }, psd.finalize);\n fn();\n }, zoneProps, resolve, reject);\n });\n }\n});\n\nif (NativePromise) {\n if (NativePromise.allSettled) setProp (DexiePromise, \"allSettled\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise(resolve => {\n if (possiblePromises.length === 0) resolve([]);\n let remaining = possiblePromises.length;\n const results = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => results[i] = {status: \"fulfilled\", value},\n reason => results[i] = {status: \"rejected\", reason})\n .then(()=>--remaining || resolve(results)));\n });\n });\n if (NativePromise.any && typeof AggregateError !== 'undefined') setProp(DexiePromise, \"any\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n if (possiblePromises.length === 0) reject(new AggregateError([]));\n let remaining = possiblePromises.length;\n const failures = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => resolve(value),\n failure => {\n failures[i] = failure;\n if (!--remaining) reject(new AggregateError(failures));\n }));\n });\n });\n}\n\n/**\n* Take a potentially misbehaving resolver function and make sure\n* onFulfilled and onRejected are only called once.\n*\n* Makes no guarantees about asynchrony.\n*/\nfunction executePromiseTask (promise, fn) {\n // Promise Resolution Procedure:\n // https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n try {\n fn(value => {\n if (promise._state !== null) return; // Already settled\n if (value === promise) throw new TypeError('A promise cannot be resolved with itself.');\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n if (value && typeof value.then === 'function') {\n executePromiseTask(promise, (resolve, reject) => {\n value instanceof DexiePromise ?\n value._then(resolve, reject) :\n value.then(resolve, reject);\n });\n } else {\n promise._state = true;\n promise._value = value;\n propagateAllListeners(promise);\n }\n if (shouldExecuteTick) endMicroTickScope();\n }, handleRejection.bind(null, promise)); // If Function.bind is not supported. Exception is handled in catch below\n } catch (ex) {\n handleRejection(promise, ex);\n }\n}\n\nfunction handleRejection (promise, reason) {\n rejectingErrors.push(reason);\n if (promise._state !== null) return;\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n reason = rejectionMapper(reason);\n promise._state = false;\n promise._value = reason;\n // Add the failure to a list of possibly uncaught errors\n addPossiblyUnhandledError(promise);\n propagateAllListeners(promise);\n if (shouldExecuteTick) endMicroTickScope();\n}\n\nfunction propagateAllListeners (promise) {\n //debug && linkToPreviousPromise(promise);\n var listeners = promise._listeners;\n promise._listeners = [];\n for (var i = 0, len = listeners.length; i < len; ++i) {\n propagateToListener(promise, listeners[i]);\n }\n var psd = promise._PSD;\n --psd.ref || psd.finalize(); // if psd.ref reaches zero, call psd.finalize();\n if (numScheduledCalls === 0) {\n // If numScheduledCalls is 0, it means that our stack is not in a callback of a scheduled call,\n // and that no deferreds where listening to this rejection or success.\n // Since there is a risk that our stack can contain application code that may\n // do stuff after this code is finished that may generate new calls, we cannot\n // call finalizers here.\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick(); // Will detect unhandled errors\n }, []);\n }\n}\n\nfunction propagateToListener(promise, listener) {\n if (promise._state === null) {\n promise._listeners.push(listener);\n return;\n }\n\n var cb = promise._state ? listener.onFulfilled : listener.onRejected;\n if (cb === null) {\n // This Listener doesnt have a listener for the event being triggered (onFulfilled or onReject) so lets forward the event to any eventual listeners on the Promise instance returned by then() or catch()\n return (promise._state ? listener.resolve : listener.reject) (promise._value);\n }\n ++listener.psd.ref;\n ++numScheduledCalls;\n asap (callListener, [cb, promise, listener]);\n}\n\nfunction callListener (cb, promise, listener) {\n try {\n // Call callback and resolve our listener with it's return value.\n var ret, value = promise._value;\n \n if (!promise._state && rejectingErrors.length) rejectingErrors = [];\n // cb is onResolved\n ret = debug && promise._consoleTask ? promise._consoleTask.run(()=>cb (value)) : cb (value);\n if (!promise._state && rejectingErrors.indexOf(value) === -1) {\n markErrorAsHandled(promise); // Callback didnt do Promise.reject(err) nor reject(err) onto another promise.\n }\n listener.resolve(ret);\n } catch (e) {\n // Exception thrown in callback. Reject our listener.\n listener.reject(e);\n } finally {\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n --listener.psd.ref || listener.psd.finalize();\n }\n}\n\n/* The callback to schedule with queueMicrotask().\n It runs a virtual microtick and executes any callback registered in microtickQueue.\n */\nfunction physicalTick() {\n usePSD(globalPSD, ()=>{\n // Make sure to reset the async context to globalPSD before\n // executing any of the microtick subscribers.\n beginMicroTickScope() && endMicroTickScope();\n });\n}\n\nexport function beginMicroTickScope() {\n var wasRootExec = isOutsideMicroTick;\n isOutsideMicroTick = false;\n needsNewPhysicalTick = false;\n return wasRootExec;\n}\n\n/* Executes micro-ticks without doing try..catch.\n This can be possible because we only use this internally and\n the registered functions are exception-safe (they do try..catch\n internally before calling any external method). If registering\n functions in the microtickQueue that are not exception-safe, this\n would destroy the framework and make it instable. So we don't export\n our asap method.\n*/\nexport function endMicroTickScope() {\n var callbacks, i, l;\n do {\n while (microtickQueue.length > 0) {\n callbacks = microtickQueue;\n microtickQueue = [];\n l = callbacks.length;\n for (i = 0; i < l; ++i) {\n var item = callbacks[i];\n item[0].apply(null, item[1]);\n }\n }\n } while (microtickQueue.length > 0);\n isOutsideMicroTick = true;\n needsNewPhysicalTick = true;\n}\n\nfunction finalizePhysicalTick() {\n var unhandledErrs = unhandledErrors;\n unhandledErrors = [];\n unhandledErrs.forEach(p => {\n p._PSD.onunhandled.call(null, p._value, p);\n });\n var finalizers = tickFinalizers.slice(0); // Clone first because finalizer may remove itself from list.\n var i = finalizers.length;\n while (i) finalizers[--i](); \n}\n\nfunction run_at_end_of_this_or_next_physical_tick (fn) {\n function finalizer() {\n fn();\n tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1);\n }\n tickFinalizers.push(finalizer);\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n }, []);\n}\n\nfunction addPossiblyUnhandledError(promise) {\n // Only add to unhandledErrors if not already there. The first one to add to this list\n // will be upon the first rejection so that the root cause (first promise in the\n // rejection chain) is the one listed.\n if (!unhandledErrors.some(p => p._value === promise._value))\n unhandledErrors.push(promise);\n}\n\nfunction markErrorAsHandled(promise) {\n // Called when a reject handled is actually being called.\n // Search in unhandledErrors for any promise whos _value is this promise_value (list\n // contains only rejected promises, and only one item per error)\n var i = unhandledErrors.length;\n while (i) if (unhandledErrors[--i]._value === promise._value) {\n // Found a promise that failed with this same error object pointer,\n // Remove that since there is a listener that actually takes care of it.\n unhandledErrors.splice(i, 1);\n return;\n }\n}\n\nfunction PromiseReject (reason) {\n return new DexiePromise(INTERNAL, false, reason);\n}\n\nexport function wrap (fn, errorCatcher) {\n var psd = PSD;\n return function() {\n var wasRootExec = beginMicroTickScope(),\n outerScope = PSD;\n\n try {\n switchToZone(psd, true);\n return fn.apply(this, arguments);\n } catch (e) {\n errorCatcher && errorCatcher(e);\n } finally {\n switchToZone(outerScope, false);\n if (wasRootExec) endMicroTickScope();\n }\n };\n}\n\n\n//\n// variables used for native await support\n//\nconst task = { awaits: 0, echoes: 0, id: 0}; // The ongoing macro-task when using zone-echoing.\nvar taskCounter = 0; // ID counter for macro tasks.\nvar zoneStack = []; // Stack of left zones to restore asynchronically.\nvar zoneEchoes = 0; // When > 0, zoneLeaveEcho is queued. When 0 and task.echoes is also 0, nothing is queued.\nvar totalEchoes = 0; // ID counter for micro-tasks. Used to detect possible native await in our Promise.prototype.then.\n\n\nvar zone_id_counter = 0;\nexport function newScope (fn, props, a1, a2) {\n var parent = PSD,\n psd = Object.create(parent);\n psd.parent = parent;\n psd.ref = 0;\n psd.global = false;\n psd.id = ++zone_id_counter;\n // Prepare for promise patching (done in usePSD):\n var globalEnv = globalPSD.env;\n psd.env = patchGlobalPromise ? {\n Promise: DexiePromise, // Changing window.Promise could be omitted for Chrome and Edge, where IDB+Promise plays well!\n PromiseProp: {value: DexiePromise, configurable: true, writable: true},\n all: DexiePromise.all,\n race: DexiePromise.race,\n allSettled: DexiePromise.allSettled,\n any: DexiePromise.any,\n resolve: DexiePromise.resolve,\n reject: DexiePromise.reject,\n } : {};\n if (props) extend(psd, props);\n \n // unhandleds and onunhandled should not be specifically set here.\n // Leave them on parent prototype.\n // unhandleds.push(err) will push to parent's prototype\n // onunhandled() will call parents onunhandled (with this scope's this-pointer though!)\n ++parent.ref;\n psd.finalize = function () {\n --this.parent.ref || this.parent.finalize();\n }\n var rv = usePSD (psd, fn, a1, a2);\n if (psd.ref === 0) psd.finalize();\n return rv;\n}\n\n// Function to call if scopeFunc returns NativePromise\n// Also for each NativePromise in the arguments to Promise.all()\nexport function incrementExpectedAwaits() {\n if (!task.id) task.id = ++taskCounter;\n ++task.awaits;\n task.echoes += ZONE_ECHO_LIMIT;\n return task.id;\n}\n\n// Function to call when 'then' calls back on a native promise where onAwaitExpected() had been called.\n// Also call this when a native await calls then method on a promise. In that case, don't supply\n// sourceTaskId because we already know it refers to current task.\nexport function decrementExpectedAwaits() {\n if (!task.awaits) return false;\n if (--task.awaits === 0) task.id = 0;\n task.echoes = task.awaits * ZONE_ECHO_LIMIT; // Will reset echoes to 0 if awaits is 0.\n return true;\n}\n\nif ((''+nativePromiseThen).indexOf('[native code]') === -1) {\n // If the native promise' prototype is patched, we cannot rely on zone echoing.\n // Disable that here:\n incrementExpectedAwaits = decrementExpectedAwaits = nop;\n}\n\n// Call from Promise.all() and Promise.race()\nexport function onPossibleParallellAsync (possiblePromise) {\n if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) {\n incrementExpectedAwaits(); \n return possiblePromise.then(x => {\n decrementExpectedAwaits();\n return x;\n }, e => {\n decrementExpectedAwaits();\n return rejection(e);\n });\n }\n return possiblePromise;\n}\n\nfunction zoneEnterEcho(targetZone) {\n ++totalEchoes;\n //console.log(\"Total echoes \", totalEchoes);\n //if (task.echoes === 1) console.warn(\"Cancelling echoing of async context.\");\n if (!task.echoes || --task.echoes === 0) {\n task.echoes = task.awaits = task.id = 0; // Cancel echoing.\n }\n\n zoneStack.push(PSD);\n switchToZone(targetZone, true);\n}\n\nfunction zoneLeaveEcho() {\n var zone = zoneStack[zoneStack.length-1];\n zoneStack.pop();\n switchToZone(zone, false);\n}\n\nfunction switchToZone (targetZone, bEnteringZone) {\n var currentZone = PSD;\n if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) {\n // Enter or leave zone asynchronically as well, so that tasks initiated during current tick\n // will be surrounded by the zone when they are invoked.\n queueMicrotask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho);\n }\n if (targetZone === PSD) return;\n\n PSD = targetZone; // The actual zone switch occurs at this line.\n\n // Snapshot on every leave from global zone.\n if (currentZone === globalPSD) globalPSD.env = snapShot();\n\n if (patchGlobalPromise) {\n // Let's patch the global and native Promises (may be same or may be different)\n var GlobalPromise = globalPSD.env.Promise;\n // Swich environments (may be PSD-zone or the global zone. Both apply.)\n var targetEnv = targetZone.env;\n\n if (currentZone.global || targetZone.global) {\n // Leaving or entering global zone. It's time to patch / restore global Promise.\n\n // Set this Promise to window.Promise so that transiled async functions will work on Firefox, Safari and IE, as well as with Zonejs and angular.\n Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp);\n\n // Support Promise.all() etc to work indexedDB-safe also when people are including es6-promise as a module (they might\n // not be accessing global.Promise but a local reference to it)\n GlobalPromise.all = targetEnv.all;\n GlobalPromise.race = targetEnv.race;\n GlobalPromise.resolve = targetEnv.resolve;\n GlobalPromise.reject = targetEnv.reject;\n if (targetEnv.allSettled) GlobalPromise.allSettled = targetEnv.allSettled;\n if (targetEnv.any) GlobalPromise.any = targetEnv.any;\n }\n }\n}\n\nfunction snapShot () {\n var GlobalPromise = _global.Promise;\n return patchGlobalPromise ? {\n Promise: GlobalPromise,\n PromiseProp: Object.getOwnPropertyDescriptor(_global, \"Promise\"),\n all: GlobalPromise.all,\n race: GlobalPromise.race,\n allSettled: GlobalPromise.allSettled,\n any: GlobalPromise.any,\n resolve: GlobalPromise.resolve,\n reject: GlobalPromise.reject,\n } : {};\n}\n\nexport function usePSD (psd, fn, a1, a2, a3) {\n var outerScope = PSD;\n try {\n switchToZone(psd, true);\n return fn(a1, a2, a3);\n } finally {\n switchToZone(outerScope, false);\n }\n}\n\nfunction nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) {\n return typeof fn !== 'function' ? fn : function () {\n var outerZone = PSD;\n if (possibleAwait) incrementExpectedAwaits();\n switchToZone(zone, true);\n try {\n return fn.apply(this, arguments);\n } finally {\n switchToZone(outerZone, false);\n if (cleanup) queueMicrotask(decrementExpectedAwaits);\n }\n };\n}\n\n/** Execute callback in global context */\nexport function execInGlobalContext(cb) {\n if (Promise === NativePromise && task.echoes === 0) {\n if (zoneEchoes === 0) {\n cb();\n } else {\n enqueueNativeMicroTask(cb);\n }\n } else {\n setTimeout(cb, 0);\n }\n}\n\nexport var rejection = DexiePromise.reject;\n\nexport {DexiePromise};\n","import { PSD, rejection, newScope } from \"../helpers/promise\";\nimport { DexieOptions } from \"../public/types/dexie-constructor\";\nimport { errnames, exceptions } from \"../errors\";\nimport { nop } from \"./chaining-functions\";\nimport { Transaction } from \"../classes/transaction\";\nimport { Dexie } from '../classes/dexie';\n\n/* Generate a temporary transaction when db operations are done outside a transaction scope.\n*/\nexport function tempTransaction (\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n fn: (resolve, reject, trans: Transaction) => any)\n // Last argument is \"writeLocked\". But this doesnt apply to oneshot direct db operations, so we ignore it.\n{\n if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) {\n if (db._state.openComplete) {\n // db.idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError));\n }\n if (!db._state.isBeingOpened) {\n if (!db._state.autoOpen)\n return rejection(new exceptions.DatabaseClosed());\n db.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n return db._state.dbReadyPromise.then(() => tempTransaction(db, mode, storeNames, fn));\n } else {\n var trans = db._createTransaction(mode, storeNames, db._dbSchema);\n try {\n trans.create();\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db.close({disableAutoOpen: false});\n return db.open().then(()=>tempTransaction(db, mode, storeNames, fn));\n }\n return rejection(ex);\n }\n return trans._promise(mode, (resolve, reject) => {\n return newScope(() => { // OPTIMIZATION POSSIBLE? newScope() not needed because it's already done in _promise.\n PSD.trans = trans;\n return fn(resolve, reject, trans);\n });\n }).then(result => {\n // Instead of resolving value directly, wait with resolving it until transaction has completed.\n // Otherwise the data would not be in the DB if requesting it in the then() operation.\n // Specifically, to ensure that the following expression will work:\n //\n // db.friends.put({name: \"Arne\"}).then(function () {\n // db.friends.where(\"name\").equals(\"Arne\").count(function(count) {\n // assert (count === 1);\n // });\n // });\n //\n if (mode === 'readwrite') try {trans.idbtrans.commit();} catch {}\n return mode === 'readonly' ? result : trans._completion.then(() => result);\n });/*.catch(err => { // Don't do this as of now. If would affect bulk- and modify methods in a way that could be more intuitive. But wait! Maybe change in next major.\n trans._reject(err);\n return rejection(err);\n });*/\n }\n}\n","import { Dexie } from \"../classes/dexie\";\n\nexport const DEXIE_VERSION = '{version}'; // Replaced by build-script.\nexport const maxString = String.fromCharCode(65535);\nexport const minKey = -Infinity; // minKey can be constant. maxKey must be a prop of Dexie (_maxKey)\nexport const INVALID_KEY_ARGUMENT =\n \"Invalid key provided. Keys must be of type string, number, Date or Array.\";\nexport const STRING_EXPECTED = \"String expected.\";\nexport const connections: Dexie[] = [];\nexport const dexieStackFrameFilter = frame => !/(dexie\\.js|dexie\\.min\\.js)/.test(frame);\nexport const DBNAMES_DB = '__dbnames';\nexport const READONLY = 'readonly';\nexport const READWRITE = 'readwrite';\n","export function combine(filter1, filter2) {\n return filter1 ?\n filter2 ?\n function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } :\n filter1 :\n filter2;\n}\n","import { DBCoreKeyRange, DBCoreRangeType } from '../public/types/dbcore';\n\nexport const AnyRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Any,\n lower: -Infinity,\n lowerOpen: false,\n upper: [[]],\n upperOpen: false\n}\n\nexport const NeverRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Never,\n lower: -Infinity,\n lowerOpen: true,\n upper: -Infinity,\n upperOpen: true\n}\n","import { deepClone, delByKeyPath, getByKeyPath } from './utils';\n\n// This workaround is needed since obj could be a custom-class instance with an\n// uninitialized keyPath. See the following comment for more context:\n// https://github.com/dfahlander/Dexie.js/issues/1280#issuecomment-823557881\nexport function workaroundForUndefinedPrimKey(keyPath: string | ArrayLike) {\n // Workaround only needed for plain non-dotted keyPaths\n return typeof keyPath === \"string\" && !/\\./.test(keyPath) \n ? (obj: object) => {\n if (obj[keyPath] === undefined && (keyPath in obj)) {\n // property exists but is undefined. This will not be liked by Indexeddb.\n // Need to remove the property before adding it but we need to clone it before\n // doing that to not be intrusive.\n obj = deepClone(obj);\n delete obj[keyPath];\n }\n return obj;\n }\n : (obj: object) => obj;\n}","import { exceptions } from \"../../errors\";\n\nexport function Entity(){\n throw exceptions.Type();\n}\n","// Implementation of https://www.w3.org/TR/IndexedDB-3/#compare-two-keys\n\nimport { toStringTag } from './utils';\n\n// ... with the adjustment to return NaN instead of throwing.\nexport function cmp(a: any, b: any): number {\n try {\n const ta = type(a);\n const tb = type(b);\n if (ta !== tb) {\n if (ta === 'Array') return 1;\n if (tb === 'Array') return -1;\n if (ta === 'binary') return 1;\n if (tb === 'binary') return -1;\n if (ta === 'string') return 1;\n if (tb === 'string') return -1;\n if (ta === 'Date') return 1;\n if (tb !== 'Date') return NaN;\n return -1;\n }\n switch (ta) {\n case 'number':\n case 'Date':\n case 'string':\n return a > b ? 1 : a < b ? -1 : 0;\n case 'binary': {\n return compareUint8Arrays(getUint8Array(a), getUint8Array(b));\n }\n case 'Array':\n return compareArrays(a, b);\n }\n } catch {}\n return NaN; // Return value if any given args are valid keys.\n}\n\nexport function compareArrays(a: any[], b: any[]): number {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n const res = cmp(a[i], b[i]);\n if (res !== 0) return res;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\nexport function compareUint8Arrays(\n a: Uint8Array,\n b: Uint8Array\n) {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n if (a[i] !== b[i]) return a[i] < b[i] ? -1 : 1;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\n// Implementation of https://www.w3.org/TR/IndexedDB-3/#key-type\nfunction type(x: any) {\n const t = typeof x;\n if (t !== 'object') return t;\n if (ArrayBuffer.isView(x)) return 'binary';\n const tsTag = toStringTag(x); // Cannot use instanceof in Safari\n return tsTag === 'ArrayBuffer' ? 'binary' : (tsTag as 'Array' | 'Date');\n}\n\ntype BinaryType =\n | ArrayBuffer\n | DataView\n | Uint8ClampedArray\n | ArrayBufferView\n | Uint8Array\n | Int8Array\n | Uint16Array\n | Int16Array\n | Uint32Array\n | Int32Array\n | Float32Array\n | Float64Array\n | BigInt64Array \n | BigUint64Array;\n\nfunction getUint8Array(a: BinaryType): Uint8Array {\n if (a instanceof Uint8Array) return a;\n if (ArrayBuffer.isView(a))\n // TypedArray or DataView\n return new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n return new Uint8Array(a); // ArrayBuffer\n}\n","import { BulkError, exceptions } from '../../errors';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { DexiePromise as Promise, PSD, newScope, rejection, beginMicroTickScope, endMicroTickScope } from '../../helpers/promise';\nimport { Transaction } from '../transaction';\nimport { Dexie } from '../dexie';\nimport { tempTransaction } from '../../functions/temp-transaction';\nimport { Collection } from '../collection';\nimport { isArray, keys, getByKeyPath, setByKeyPath, extend, getProto } from '../../functions/utils';\nimport { maxString } from '../../globals/constants';\nimport { combine } from '../../functions/combine';\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { IndexableType } from '../../public/types/indexable-type';\nimport { debug } from '../../helpers/debug';\nimport { DBCoreTable } from '../../public/types/dbcore';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { workaroundForUndefinedPrimKey } from '../../functions/workaround-undefined-primkey';\nimport { Entity } from '../entity/Entity';\nimport { UpdateSpec } from '../../public';\nimport { cmp } from '../../functions/cmp';\n\n/** class Table\n * \n * https://dexie.org/docs/Table/Table\n */\nexport class Table implements ITable {\n db: Dexie;\n _tx?: Transaction;\n name: string;\n schema: TableSchema;\n hook: TableHooks;\n core: DBCoreTable;\n\n _trans(\n mode: IDBTransactionMode,\n fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike | void,\n writeLocked?: boolean | string) : PromiseExtended\n {\n const trans: Transaction = this._tx || PSD.trans;\n const tableName = this.name;\n // @ts-ignore: Use Chrome's Async Stack Tagging API to allow tracing and simplify debugging for dexie users.\n const task = debug && typeof console !== 'undefined' && console.createTask && console.createTask(`Dexie: ${mode === 'readonly' ? 'read' : 'write' } ${this.name}`);\n \n function checkTableInTransaction(resolve, reject, trans: Transaction) {\n if (!trans.schema[tableName])\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\");\n return fn(trans.idbtrans, trans) as Promise;\n }\n // Surround all in a microtick scope.\n // Reason: Browsers (modern Safari + older others)\n // still as of 2018-10-10 has problems keeping a transaction\n // alive between micro ticks. Safari because if transaction\n // is created but not used in same microtick, it will go\n // away. That specific issue could be solved in DBCore\n // by opening the transaction just before using it instead.\n // But older Firefoxes and IE11 (with Promise polyfills)\n // will still have probs.\n // The beginMicrotickScope()/endMicrotickScope() works\n // in cooperation with Dexie.Promise to orchestrate\n // the micro-ticks in endMicrotickScope() rather than\n // in native engine.\n const wasRootExec = beginMicroTickScope();\n try {\n let p = trans && trans.db._novip === this.db._novip ?\n trans === PSD.trans ?\n trans._promise(mode, checkTableInTransaction, writeLocked) :\n newScope(() => trans._promise(mode, checkTableInTransaction, writeLocked), { trans: trans, transless: PSD.transless || PSD }) :\n tempTransaction(this.db, mode, [this.name], checkTableInTransaction);\n if (task) { // Dexie.debug = true so we trace errors\n p._consoleTask = task;\n p = p.catch(err => {\n console.trace(err);\n return rejection(err);\n });\n }\n return p; \n } finally {\n if (wasRootExec) endMicroTickScope();\n }\n }\n\n /** Table.get()\n * \n * https://dexie.org/docs/Table/Table.get()\n * \n **/\n get(keyOrCrit, cb?) {\n if (keyOrCrit && keyOrCrit.constructor === Object)\n return this.where(keyOrCrit as { [key: string]: IndexableType }).first(cb);\n if (keyOrCrit == null) return rejection(new exceptions.Type(`Invalid argument to Table.get()`));\n\n return this._trans('readonly', (trans) => {\n return this.core.get({trans, key: keyOrCrit})\n .then(res => this.hook.reading.fire(res));\n }).then(cb);\n }\n\n /** Table.where()\n * \n * https://dexie.org/docs/Table/Table.where()\n * \n **/\n where(indexOrCrit: string | string[] | { [key: string]: IndexableType }) {\n if (typeof indexOrCrit === 'string')\n return new this.db.WhereClause(this, indexOrCrit);\n if (isArray(indexOrCrit))\n return new this.db.WhereClause(this, `[${indexOrCrit.join('+')}]`);\n // indexOrCrit is an object map of {[keyPath]:value} \n const keyPaths = keys(indexOrCrit);\n if (keyPaths.length === 1)\n // Only one critera. This was the easy case:\n return this\n .where(keyPaths[0])\n .equals(indexOrCrit[keyPaths[0]]);\n\n // Multiple criterias.\n // Let's try finding a compound index that matches all keyPaths in\n // arbritary order:\n const compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(ix => {\n if (\n ix.compound &&\n keyPaths.every(keyPath => ix.keyPath.indexOf(keyPath) >= 0)) {\n for (let i=0; i a.keyPath.length - b.keyPath.length)[0];\n \n if (compoundIndex && this.db._maxKey !== maxString) {\n // Cool! We found such compound index\n // and this browser supports compound indexes (maxKey !== maxString)!\n const keyPathsInValidOrder = (compoundIndex.keyPath as string[]).slice(0, keyPaths.length);\n return this\n .where(keyPathsInValidOrder)\n .equals(keyPathsInValidOrder.map(kp => indexOrCrit[kp]));\n }\n\n if (!compoundIndex && debug) console.warn(\n `The query ${JSON.stringify(indexOrCrit)} on ${this.name} would benefit from a ` +\n `compound index [${keyPaths.join('+')}]`);\n\n // Ok, now let's fallback to finding at least one matching index\n // and filter the rest.\n const { idxByName } = this.schema;\n const idb = this.db._deps.indexedDB;\n\n function equals (a, b) {\n return idb.cmp(a,b) === 0; // Works with all indexable types including binary keys.\n }\n\n const [idx, filterFunction] = keyPaths.reduce(([prevIndex, prevFilterFn], keyPath) => {\n const index = idxByName[keyPath];\n const value = indexOrCrit[keyPath];\n return [\n prevIndex || index, // idx::=Pick index of first matching keypath\n prevIndex || !index ? // filter::=null if not needed, otherwise combine function filter\n combine(\n prevFilterFn,\n index && index.multi ?\n x => {\n const prop = getByKeyPath(x, keyPath);\n return isArray(prop) && prop.some(item => equals(value, item));\n } : x => equals(value, getByKeyPath(x, keyPath)))\n : prevFilterFn\n ];\n }, [null, null]);\n\n return idx ?\n this.where(idx.name).equals(indexOrCrit[idx.keyPath])\n .filter(filterFunction) :\n compoundIndex ?\n this.filter(filterFunction) : // Has compound but browser bad. Allow filter.\n this.where(keyPaths).equals(''); // No index at all. Fail lazily with \"[a+b+c] is not indexed\"\n }\n\n /** Table.filter()\n * \n * https://dexie.org/docs/Table/Table.filter()\n * \n **/\n filter(filterFunction: (obj: any) => boolean) {\n return this.toCollection().and(filterFunction);\n }\n\n /** Table.count()\n * \n * https://dexie.org/docs/Table/Table.count()\n * \n **/\n count(thenShortcut?: any) {\n return this.toCollection().count(thenShortcut);\n }\n\n /** Table.offset()\n * \n * https://dexie.org/docs/Table/Table.offset()\n * \n **/\n offset(offset: number) {\n return this.toCollection().offset(offset);\n }\n\n /** Table.limit()\n * \n * https://dexie.org/docs/Table/Table.limit()\n * \n **/\n limit(numRows: number) {\n return this.toCollection().limit(numRows);\n }\n\n /** Table.each()\n * \n * https://dexie.org/docs/Table/Table.each()\n * \n **/\n each(callback: (obj: any, cursor: { key: IndexableType, primaryKey: IndexableType }) => any) {\n return this.toCollection().each(callback);\n }\n\n /** Table.toArray()\n * \n * https://dexie.org/docs/Table/Table.toArray()\n * \n **/\n toArray(thenShortcut?: any) {\n return this.toCollection().toArray(thenShortcut);\n }\n\n /** Table.toCollection()\n * \n * https://dexie.org/docs/Table/Table.toCollection()\n * \n **/\n toCollection() {\n return new this.db.Collection(new this.db.WhereClause(this));\n }\n\n /** Table.orderBy()\n * \n * https://dexie.org/docs/Table/Table.orderBy()\n * \n **/\n orderBy(index: string | string[]) {\n return new this.db.Collection(\n new this.db.WhereClause(this, isArray(index) ?\n `[${index.join('+')}]` :\n index));\n }\n\n /** Table.reverse()\n * \n * https://dexie.org/docs/Table/Table.reverse()\n * \n **/\n reverse(): Collection {\n return this.toCollection().reverse();\n }\n\n /** Table.mapToClass()\n * \n * https://dexie.org/docs/Table/Table.mapToClass()\n * \n **/\n mapToClass(constructor: Function) {\n const {db, name: tableName} = this;\n this.schema.mappedClass = constructor;\n if (constructor.prototype instanceof Entity) {\n constructor = class extends (constructor as any) {\n get db () { return db; }\n table() { return tableName; }\n }\n }\n // Collect all inherited property names (including method names) by\n // walking the prototype chain. This is to avoid overwriting them from\n // database data - so application code can rely on inherited props never\n // becoming shadowed by database object props.\n const inheritedProps = new Set();\n for (let proto = constructor.prototype; proto; proto = getProto(proto)) {\n Object.getOwnPropertyNames(proto).forEach(propName => inheritedProps.add(propName));\n }\n \n // Now, subscribe to the when(\"reading\") event to make all objects that come out from this table inherit from given class\n // no matter which method to use for reading (Table.get() or Table.where(...)... )\n const readHook = (obj: Object) => {\n if (!obj) return obj; // No valid object. (Value is null or undefined). Return as is.\n // Create a new object that derives from constructor:\n const res = Object.create(constructor.prototype);\n // Clone members (but never those that collide with a property in the prototype\n // hierchary (MUST BE ABLE TO RELY ON Entity methods and props!)):\n for (let m in obj) if (!inheritedProps.has(m)) try { res[m] = obj[m]; } catch (_) { }\n return res;\n };\n\n if (this.schema.readHook) {\n this.hook.reading.unsubscribe(this.schema.readHook);\n }\n this.schema.readHook = readHook;\n this.hook(\"reading\", readHook);\n return constructor;\n }\n\n /** @deprecated */\n defineClass() {\n function Class (content){\n extend(this, content);\n };\n return this.mapToClass(Class);\n }\n\n /** Table.add()\n * \n * https://dexie.org/docs/Table/Table.add()\n * \n **/\n add(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd]});\n }).then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.update()\n * \n * https://dexie.org/docs/Table/Table.update()\n * \n **/\n update(keyOrObject, modifications: { [keyPath: string]: any; } | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) {\n const key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath);\n if (key === undefined) return rejection(new exceptions.InvalidArgument(\n \"Given object does not contain its primary key\"));\n /*// object to modify. Also modify given object with the modifications:\n // This part should be here for backward compatibility.\n // If ever feeling too bad about mutating given object, please wait to a new major before removing it,\n // and document the change thoroughly. TODO: Document this change!\n if (!Object.isFrozen(keyOrObject)) try {\n if (typeof modifications !== \"function\") {\n keys(modifications).forEach(keyPath => {\n setByKeyPath(keyOrObject, keyPath, modifications[keyPath]);\n });\n } else {\n // Now since we support function argument, we should have a similar behavior here as well\n // (as long as we do this mutability stuff on the given object)\n modifications(keyOrObject, {value: keyOrObject, primKey: key});\n }\n } catch {\n // Maybe given object was frozen.\n // This part is not essential. Just move on as nothing happened...\n }*/\n return this.where(\":id\").equals(key).modify(modifications);\n } else {\n // key to modify\n return this.where(\":id\").equals(keyOrObject).modify(modifications);\n }\n }\n\n /** Table.put()\n * \n * https://dexie.org/docs/Table/Table.put()\n * \n **/\n put(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans(\n 'readwrite',\n trans => this.core.mutate({trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.delete()\n * \n * https://dexie.org/docs/Table/Table.delete()\n * \n **/\n delete(key: IndexableType): PromiseExtended {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'delete', keys: [key]}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.clear()\n * \n * https://dexie.org/docs/Table/Table.clear()\n * \n **/\n clear() {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'deleteRange', range: AnyRange}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.bulkGet()\n * \n * https://dexie.org/docs/Table/Table.bulkGet()\n * \n * @param keys \n */\n bulkGet(keys: IndexableType[]) {\n return this._trans('readonly', trans => {\n return this.core.getMany({\n keys,\n trans\n }).then(result => result.map(res => this.hook.reading.fire(res)));\n });\n }\n\n /** Table.bulkAdd()\n * \n * https://dexie.org/docs/Table/Table.bulkAdd()\n * \n **/\n bulkAdd(\n objects: readonly any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkAdd(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToAdd = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n return this.core.mutate(\n {trans, type: 'add', keys: keys as IndexableType[], values: objectsToAdd, wantResults}\n )\n .then(({numFailures, results,lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkAdd(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkPut()\n * \n * https://dexie.org/docs/Table/Table.bulkPut()\n * \n **/\n bulkPut(\n objects: readonly any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkPut(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToPut = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n\n return this.core.mutate(\n {trans, type: 'put', keys: keys as IndexableType[], values: objectsToPut, wantResults}\n )\n .then(({numFailures, results, lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkPut(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkUpdate()\n *\n * https://dexie.org/docs/Table.Table.bulkUpdate()\n */\n bulkUpdate(\n keysAndChanges: readonly { key: any; changes: UpdateSpec }[]\n ): PromiseExtended {\n const coreTable = this.core;\n const keys = keysAndChanges.map((entry) => entry.key);\n const changeSpecs = keysAndChanges.map((entry) => entry.changes);\n const offsetMap: number[] = [];\n return this._trans('readwrite', (trans) => {\n return coreTable.getMany({ trans, keys, cache: 'clone' }).then((objs) => {\n const resultKeys: any[] = [];\n const resultObjs: any[] = [];\n keysAndChanges.forEach(({ key, changes }, idx) => {\n const obj = objs[idx];\n if (obj) {\n for (const keyPath of Object.keys(changes)) {\n const value = changes[keyPath];\n if (keyPath === this.schema.primKey.keyPath) {\n if (cmp(value, key) !== 0) {\n throw new exceptions.Constraint(\n `Cannot update primary key in bulkUpdate()`\n );\n }\n } else {\n setByKeyPath(obj, keyPath, value);\n }\n }\n offsetMap.push(idx);\n resultKeys.push(key);\n resultObjs.push(obj);\n }\n });\n const numEntries = resultKeys.length;\n return coreTable\n .mutate({\n trans,\n type: 'put',\n keys: resultKeys,\n values: resultObjs,\n updates: {\n keys,\n changeSpecs\n }\n })\n .then(({ numFailures, failures }) => {\n if (numFailures === 0) return numEntries;\n // Failure. bulkPut() may have a subset of keys\n // so we must translate returned 'failutes' into the offsets of given argument:\n for (const offset of Object.keys(failures)) {\n const mappedOffset = offsetMap[Number(offset)];\n if (mappedOffset != null) {\n const failure = failures[offset];\n delete failures[offset];\n failures[mappedOffset] = failure;\n }\n }\n throw new BulkError(\n `${this.name}.bulkUpdate(): ${numFailures} of ${numEntries} operations failed`,\n failures\n );\n });\n });\n });\n }\n\n /** Table.bulkDelete()\n * \n * https://dexie.org/docs/Table/Table.bulkDelete()\n * \n **/\n bulkDelete(keys: ReadonlyArray): PromiseExtended {\n const numKeys = keys.length;\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'delete', keys: keys as IndexableType[]});\n }).then(({numFailures, lastResult, failures}) => {\n if (numFailures === 0) return lastResult;\n throw new BulkError(\n `${this.name}.bulkDelete(): ${numFailures} of ${numKeys} operations failed`, failures);\n });\n }\n}\n","import {keys, isArray, asap} from '../functions/utils';\nimport {nop, mirror, reverseStoppableEventChain} from '../functions/chaining-functions';\nimport {exceptions} from '../errors';\n\nexport default function Events(ctx) {\n var evs = {};\n var rv = function (eventName, subscriber) {\n if (subscriber) {\n // Subscribe. If additional arguments than just the subscriber was provided, forward them as well.\n var i = arguments.length, args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n evs[eventName].subscribe.apply(null, args);\n return ctx;\n } else if (typeof (eventName) === 'string') {\n // Return interface allowing to fire or unsubscribe from event\n return evs[eventName];\n }\n };\n rv.addEventType = add;\n \n for (var i = 1, l = arguments.length; i < l; ++i) {\n add(arguments[i]);\n }\n \n return rv;\n\n function add(eventName, chainFunction, defaultFunction) {\n if (typeof eventName === 'object') return addConfiguredEvents(eventName);\n if (!chainFunction) chainFunction = reverseStoppableEventChain;\n if (!defaultFunction) defaultFunction = nop;\n\n var context = {\n subscribers: [],\n fire: defaultFunction,\n subscribe: function (cb) {\n if (context.subscribers.indexOf(cb) === -1) {\n context.subscribers.push(cb);\n context.fire = chainFunction(context.fire, cb);\n }\n },\n unsubscribe: function (cb) {\n context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; });\n context.fire = context.subscribers.reduce(chainFunction, defaultFunction);\n }\n };\n evs[eventName] = rv[eventName] = context;\n return context;\n }\n\n function addConfiguredEvents(cfg) {\n // events(this, {reading: [functionChain, nop]});\n keys(cfg).forEach(function (eventName) {\n var args = cfg[eventName];\n if (isArray(args)) {\n add(eventName, cfg[eventName][0], cfg[eventName][1]);\n } else if (args === 'asap') {\n // Rather than approaching event subscription using a functional approach, we here do it in a for-loop where subscriber is executed in its own stack\n // enabling that any exception that occur wont disturb the initiator and also not nescessary be catched and forgotten.\n var context = add(eventName, mirror, function fire() {\n // Optimazation-safe cloning of arguments into args.\n var i = arguments.length, args = new Array(i);\n while (i--) args[i] = arguments[i];\n // All each subscriber:\n context.subscribers.forEach(function (fn) {\n asap(function fireEvent() {\n fn.apply(null, args);\n });\n });\n });\n } else throw new exceptions.InvalidArgument(\"Invalid event config\");\n });\n }\n}\n","import { arrayToObject, derive } from './utils';\n\n\nexport function makeClassConstructor (prototype: Object, constructor: Function) {\n /*const propertyDescriptorMap = arrayToObject(\n Object.getOwnPropertyNames(prototype),\n propKey => [propKey, Object.getOwnPropertyDescriptor(prototype, propKey)]);\n\n // Both derive and clone the prototype.\n // derive: So that x instanceof T returns true when T is the class template.\n // clone: Optimizes method access a bit (but actually not nescessary)\n const derivedPrototypeClone = Object.create(prototype, propertyDescriptorMap);\n derivedPrototypeClone.constructor = constructor;\n constructor.prototype = derivedPrototypeClone;\n return constructor as any as TConstructor;*/\n\n // Keep the above code in case we want to clone AND derive the parent prototype.\n // Reason would be optimization of property access.\n // The code below will only create a prototypal inheritance from given constructor function\n // to given prototype.\n derive(constructor).from({prototype});\n return constructor as any as TConstructor; \n}\n","import { Dexie } from '../dexie';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { Transaction } from '../transaction/transaction';\nimport { hookCreatingChain, pureFunctionChain, nop, mirror, hookUpdatingChain, hookDeletingChain } from '../../functions/chaining-functions';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { Table } from './table';\nimport Events from '../../helpers/Events';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\n\nexport interface TableConstructor {\n new (name: string, tableSchema: TableSchema, optionalTrans?: Transaction) : Table;\n prototype: Table;\n}\n\n/** Generates a Table constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTableConstructor (db: Dexie) {\n return makeClassConstructor(\n Table.prototype,\n\n function Table (this: Table, name: string, tableSchema: TableSchema, trans?: Transaction) {\n this.db = db;\n this._tx = trans;\n this.name = name;\n this.schema = tableSchema;\n this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, {\n \"creating\": [hookCreatingChain, nop],\n \"reading\": [pureFunctionChain, mirror],\n \"updating\": [hookUpdatingChain, nop],\n \"deleting\": [hookDeletingChain, nop]\n }) as TableHooks;\n }\n\n );\n}\n","import { combine } from \"../../functions/combine\";\nimport { exceptions } from \"../../errors\";\nimport { hasOwn } from \"../../functions/utils\";\nimport { wrap } from \"../../helpers/promise\";\nimport { Collection } from './';\nimport { DBCoreCursor, DBCoreTable, DBCoreTransaction, DBCoreTableSchema, DBCoreRangeType } from '../../public/types/dbcore';\nimport { nop } from '../../functions/chaining-functions';\n\ntype CollectionContext = Collection[\"_ctx\"];\n\nexport function isPlainKeyRange (ctx: CollectionContext, ignoreLimitFilter?: boolean) {\n return !(ctx.filter || ctx.algorithm || ctx.or) &&\n (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter);\n} \n\nexport function addFilter(ctx: CollectionContext, fn: Function) {\n ctx.filter = combine(ctx.filter, fn);\n}\n\nexport function addReplayFilter (ctx: CollectionContext, factory, isLimitFilter?) {\n var curr = ctx.replayFilter;\n ctx.replayFilter = curr ? ()=>combine(curr(), factory()) : factory;\n ctx.justLimit = isLimitFilter && !curr;\n}\n\nexport function addMatchFilter(ctx: CollectionContext, fn) {\n ctx.isMatch = combine(ctx.isMatch, fn);\n}\n\nexport function getIndexOrStore(ctx: CollectionContext, coreSchema: DBCoreTableSchema) {\n // TODO: Rewrite this. No need to know ctx.isPrimKey. ctx.index should hold the keypath.\n // Still, throw if not found!\n if (ctx.isPrimKey) return coreSchema.primaryKey;\n const index = coreSchema.getIndexByKeyPath(ctx.index);\n if (!index) throw new exceptions.Schema(\"KeyPath \" + ctx.index + \" on object store \" + coreSchema.name + \" is not indexed\");\n return index;\n}\n\nexport function openCursor(ctx: CollectionContext, coreTable: DBCoreTable, trans: DBCoreTransaction) {\n const index = getIndexOrStore(ctx, coreTable.schema);\n return coreTable.openCursor({\n trans,\n values: !ctx.keysOnly,\n reverse: ctx.dir === 'prev',\n unique: !!ctx.unique,\n query: {\n index, \n range: ctx.range\n }\n });\n}\n\nexport function iter (\n ctx: CollectionContext, \n fn: (item, cursor: DBCoreCursor, advance: Function)=>void,\n coreTrans: DBCoreTransaction,\n coreTable: DBCoreTable): Promise\n{\n const filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter;\n if (!ctx.or) {\n return iterate(\n openCursor(ctx, coreTable, coreTrans),\n combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper);\n } else {\n const set = {};\n\n const union = (item: any, cursor: DBCoreCursor, advance) => {\n if (!filter || filter(cursor, advance, result=>cursor.stop(result), err => cursor.fail(err))) {\n var primaryKey = cursor.primaryKey;\n var key = '' + primaryKey;\n if (key === '[object ArrayBuffer]') key = '' + new Uint8Array(primaryKey);\n if (!hasOwn(set, key)) {\n set[key] = true;\n fn(item, cursor, advance);\n }\n }\n }\n\n return Promise.all([\n ctx.or._iterate(union, coreTrans),\n iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper)\n ]);\n }\n}\n\nfunction iterate(cursorPromise: Promise, filter, fn, valueMapper): Promise {\n \n // Apply valueMapper (hook('reading') or mappped class)\n var mappedFn = valueMapper ? (x,c,a) => fn(valueMapper(x),c,a) : fn;\n // Wrap fn with PSD and microtick stuff from Promise.\n var wrappedFn = wrap(mappedFn);\n \n return cursorPromise.then(cursor => {\n if (cursor) {\n return cursor.start(()=>{\n var c = ()=>cursor.continue();\n if (!filter || filter(cursor, advancer => c = advancer, val=>{cursor.stop(val);c=nop}, e => {cursor.fail(e);c = nop;}))\n wrappedFn(cursor.value, cursor, advancer => c = advancer);\n c();\n });\n }\n });\n}\n","import { isArray } from \"../functions/utils\";\nimport { PropModSpec } from \"../public/types/prop-modification\";\n\nexport const PropModSymbol: unique symbol = Symbol();\n\n/** Consistent change propagation across offline synced data.\n * \n * This class is executed client- and server side on sync, making\n * an operation consistent across sync for full consistency and accuracy.\n * \n * Example: An object represents a bank account with a balance.\n * One offline user adds $ 1.00 to the balance.\n * Another user (online) adds $ 2.00 to the balance.\n * When first user syncs, the balance becomes the sum of every operation (3.00).\n * \n * -- initial: balance is 0\n * 1. db.bankAccounts.update(1, { balance: new ProdModification({add: 100})}) // user 1 (offline)\n * 2. db.bankAccounts.update(1, { balance: new ProdModification({add: 200})}) // user 2 (online)\n * -- before user 1 syncs, balance is 200 (representing money with integers * 100 to avoid rounding issues)\n * \n * -- balance is 300\n * \n * When new operations are added, they need to be added to:\n * 1. PropModSpec interface\n * 2. Here in PropModification with the logic they represent\n * 3. (Optionally) a sugar function for it, such as const mathAdd = (amount: number | BigInt) => new PropModification({mathAdd: amount})\n */\nexport class PropModification implements PropModSpec {\n [PropModSymbol]?: true;\n replacePrefix?: [string, string];\n add?: number | BigInt | Array;\n remove?: number | BigInt | Array;\n\n execute(value: any): any {\n // add (mathematical or set-wise)\n if (this.add !== undefined) {\n const term = this.add;\n // Set-addition on array representing a set of primitive types (strings, numbers)\n if (isArray(term)) {\n return [...(isArray(value) ? value : []), ...term].sort();\n }\n // Mathematical addition:\n if (typeof term === 'number') return (Number(value) || 0) + term; // if value is not convertible to number, return 0 + term\n if (typeof term === 'bigint') {\n try {\n return BigInt(value) + term;\n } catch {\n return BigInt(0) + term; // Unlike Number(value) that can return NaN, BigInt(value) throws if value is not BigInt, Number or numeric string\n }\n }\n throw new TypeError(`Invalid term ${term}`);\n }\n\n // remove (mathematical or set-wise)\n if (this.remove !== undefined) {\n const subtrahend = this.remove;\n // Set-addition on array representing a set of primitive types (strings, numbers)\n if (isArray(subtrahend)) {\n return isArray(value) ? value.filter(item => !subtrahend.includes(item)).sort() : [];\n } \n // Mathematical addition:\n if (typeof subtrahend === 'number') return Number(value) - subtrahend;\n if (typeof subtrahend === 'bigint') {\n try {\n return BigInt(value) - subtrahend;\n } catch {\n return BigInt(0) - subtrahend; // Unlike Number(value) that can return NaN, BigInt(value) throws if value is not BigInt, Number or numeric string\n }\n }\n throw new TypeError(`Invalid subtrahend ${subtrahend}`);\n }\n\n // Replace a prefix:\n const prefixToReplace = this.replacePrefix?.[0];\n if (prefixToReplace && typeof value === 'string' && value.startsWith(prefixToReplace)) {\n return this.replacePrefix[1] + value.substring(prefixToReplace.length);\n }\n return value;\n }\n\n constructor(spec: PropModSpec) {\n Object.assign(this, spec);\n }\n}\n","import { Collection as ICollection } from \"../../public/types/collection\";\nimport { Dexie } from \"../dexie\";\nimport { Table } from \"../table\";\nimport { IndexableType, IndexableTypeArrayReadonly } from \"../../public/types/indexable-type\";\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { iter, isPlainKeyRange, getIndexOrStore, addReplayFilter, addFilter, addMatchFilter } from \"./collection-helpers\";\nimport { rejection } from \"../../helpers/promise\";\nimport { combine } from \"../../functions/combine\";\nimport { extend, hasOwn, deepClone, keys, setByKeyPath, getByKeyPath } from \"../../functions/utils\";\nimport { ModifyError } from \"../../errors\";\nimport { ThenShortcut } from \"../../public/types/then-shortcut\";\nimport { Transaction } from '../transaction';\nimport { DBCoreCursor, DBCoreTransaction, DBCoreRangeType, DBCoreMutateResponse, DBCoreKeyRange } from '../../public/types/dbcore';\nimport { cmp } from \"../../functions/cmp\";\nimport { PropModification } from \"../../helpers/prop-modification\";\nimport { UpdateSpec } from \"../../public/types/update-spec\";\n\n/** class Collection\n * \n * https://dexie.org/docs/Collection/Collection\n */\nexport class Collection implements ICollection {\n db: Dexie;\n _ctx: {\n table: Table;\n index?: string | null;\n isPrimKey?: boolean;\n range: DBCoreKeyRange;\n keysOnly: boolean;\n dir: \"next\" | \"prev\";\n unique: \"\" | \"unique\";\n algorithm?: Function | null;\n filter?: Function | null;\n replayFilter: Function | null;\n justLimit: boolean; // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: Function | null;\n offset: number,\n limit: number,\n error: any, // If set, any promise must be rejected with this error\n or: Collection,\n valueMapper: (any) => any\n }\n \n _ondirectionchange?: Function;\n\n _read(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike, cb?): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readonly', fn).then(cb);\n }\n\n _write(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readwrite', fn, \"locked\"); // When doing write operations on collections, always lock the operation so that upcoming operations gets queued.\n }\n\n _addAlgorithm(fn) {\n var ctx = this._ctx;\n ctx.algorithm = combine(ctx.algorithm, fn);\n }\n\n _iterate(\n fn: (item, cursor: DBCoreCursor, advance: Function) => void,\n coreTrans: DBCoreTransaction) : Promise\n {\n return iter(this._ctx, fn, coreTrans, this._ctx.table.core);\n }\n\n /** Collection.clone()\n * \n * https://dexie.org/docs/Collection/Collection.clone()\n * \n **/\n clone(props?): this {\n var rv = Object.create(this.constructor.prototype),\n ctx = Object.create(this._ctx);\n if (props) extend(ctx, props);\n rv._ctx = ctx;\n return rv;\n }\n\n /** Collection.raw()\n * \n * https://dexie.org/docs/Collection/Collection.raw()\n * \n **/\n raw(): this {\n this._ctx.valueMapper = null;\n return this;\n }\n\n /** Collection.each()\n * \n * https://dexie.org/docs/Collection/Collection.each()\n * \n **/\n each(fn: (obj, cursor: DBCoreCursor) => any): PromiseExtended {\n var ctx = this._ctx;\n\n return this._read(trans => iter(ctx, fn, trans, ctx.table.core));\n }\n\n /** Collection.count()\n * \n * https://dexie.org/docs/Collection/Collection.count()\n * \n **/\n count(cb?) {\n return this._read(trans => {\n const ctx = this._ctx;\n const coreTable = ctx.table.core;\n if (isPlainKeyRange(ctx, true)) {\n // This is a plain key range. We can use the count() method if the index.\n return coreTable.count({\n trans,\n query: {\n index: getIndexOrStore(ctx, coreTable.schema),\n range: ctx.range\n }\n }).then(count => Math.min(count, ctx.limit));\n } else {\n // Algorithms, filters or expressions are applied. Need to count manually.\n var count = 0;\n return iter(ctx, () => { ++count; return false; }, trans, coreTable)\n .then(()=>count);\n }\n }).then(cb);\n }\n\n /** Collection.sortBy()\n * \n * https://dexie.org/docs/Collection/Collection.sortBy()\n * \n **/\n sortBy(keyPath: string): PromiseExtended;\n sortBy(keyPath: string, thenShortcut: ThenShortcut) : PromiseExtended;\n sortBy(keyPath: string, cb?: ThenShortcut) {\n const parts = keyPath.split('.').reverse(),\n lastPart = parts[0],\n lastIndex = parts.length - 1;\n function getval(obj, i) {\n if (i) return getval(obj[parts[i]], i - 1);\n return obj[lastPart];\n }\n var order = this._ctx.dir === \"next\" ? 1 : -1;\n\n function sorter(a, b) {\n var aVal = getval(a, lastIndex),\n bVal = getval(b, lastIndex);\n return aVal < bVal ? -order : aVal > bVal ? order : 0;\n }\n return this.toArray(function (a) {\n return a.sort(sorter);\n }).then(cb);\n }\n\n /** Collection.toArray()\n * \n * https://dexie.org/docs/Collection/Collection.toArray()\n * \n **/\n toArray(cb?): PromiseExtended {\n return this._read(trans => {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAll() or\n // IDBKeyRange.getAll():\n const {valueMapper} = ctx;\n const index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n limit: ctx.limit,\n values: true,\n query: {\n index,\n range: ctx.range\n }\n }).then(({result}) => valueMapper ? result.map(valueMapper) : result);\n } else {\n // Getting array through a cursor.\n const a = [];\n return iter(ctx, item => a.push(item), trans, ctx.table.core).then(()=>a);\n }\n }, cb);\n }\n\n /** Collection.offset()\n * \n * https://dexie.org/docs/Collection/Collection.offset()\n * \n **/\n offset(offset: number) : Collection{\n var ctx = this._ctx;\n if (offset <= 0) return this;\n ctx.offset += offset; // For count()\n if (isPlainKeyRange(ctx)) {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return (cursor, advance) => {\n if (offsetLeft === 0) return true;\n if (offsetLeft === 1) { --offsetLeft; return false; }\n advance(() => {\n cursor.advance(offsetLeft);\n offsetLeft = 0;\n });\n return false;\n };\n });\n } else {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return () => (--offsetLeft < 0);\n });\n }\n return this;\n }\n\n /** Collection.limit()\n * \n * https://dexie.org/docs/Collection/Collection.limit()\n * \n **/\n limit(numRows: number) : Collection {\n this._ctx.limit = Math.min(this._ctx.limit, numRows); // For count()\n addReplayFilter(this._ctx, () => {\n var rowsLeft = numRows;\n return function (cursor, advance, resolve) {\n if (--rowsLeft <= 0) advance(resolve); // Stop after this item has been included\n return rowsLeft >= 0; // If numRows is already below 0, return false because then 0 was passed to numRows initially. Otherwise we wouldnt come here.\n };\n }, true);\n return this;\n }\n\n /** Collection.until()\n * \n * https://dexie.org/docs/Collection/Collection.until()\n * \n **/\n until(filterFunction: (x) => boolean, bIncludeStopEntry?) {\n addFilter(this._ctx, function (cursor, advance, resolve) {\n if (filterFunction(cursor.value)) {\n advance(resolve);\n return bIncludeStopEntry;\n } else {\n return true;\n }\n });\n return this;\n }\n\n /** Collection.first()\n * \n * https://dexie.org/docs/Collection/Collection.first()\n * \n **/\n first(cb?) {\n return this.limit(1).toArray(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.last()\n * \n * https://dexie.org/docs/Collection/Collection.last()\n * \n **/\n last(cb?) {\n return this.reverse().first(cb);\n }\n\n /** Collection.filter()\n * \n * https://dexie.org/docs/Collection/Collection.filter()\n * \n **/\n filter(filterFunction: (x) => boolean): Collection {\n /// function(val){return true/false}\n addFilter(this._ctx, function (cursor) {\n return filterFunction(cursor.value);\n });\n // match filters not used in Dexie.js but can be used by 3rd part libraries to test a\n // collection for a match without querying DB. Used by Dexie.Observable.\n addMatchFilter(this._ctx, filterFunction);\n return this;\n }\n\n /** Collection.and()\n * \n * https://dexie.org/docs/Collection/Collection.and()\n * \n **/\n and(filter: (x) => boolean) {\n return this.filter(filter);\n }\n\n /** Collection.or()\n * \n * https://dexie.org/docs/Collection/Collection.or()\n * \n **/\n or(indexName: string) {\n return new this.db.WhereClause(this._ctx.table, indexName, this);\n }\n\n /** Collection.reverse()\n * \n * https://dexie.org/docs/Collection/Collection.reverse()\n * \n **/\n reverse() {\n this._ctx.dir = (this._ctx.dir === \"prev\" ? \"next\" : \"prev\");\n if (this._ondirectionchange) this._ondirectionchange(this._ctx.dir);\n return this;\n }\n\n /** Collection.desc()\n * \n * https://dexie.org/docs/Collection/Collection.desc()\n * \n **/\n desc() {\n return this.reverse();\n }\n\n /** Collection.eachKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachKey()\n * \n **/\n eachKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.key, cursor); });\n }\n\n /** Collection.eachUniqueKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachUniqueKey()\n * \n **/\n eachUniqueKey(cb?) {\n this._ctx.unique = \"unique\";\n return this.eachKey(cb);\n }\n\n /** Collection.eachPrimaryKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachPrimaryKey()\n * \n **/\n eachPrimaryKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); });\n }\n\n /** Collection.keys()\n * \n * https://dexie.org/docs/Collection/Collection.keys()\n * \n **/\n keys(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.key);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.primaryKeys()\n * \n * https://dexie.org/docs/Collection/Collection.primaryKeys()\n * \n **/\n primaryKeys(cb?) : PromiseExtended {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAllKeys() or\n // IDBKeyRange.getAllKeys():\n return this._read(trans => {\n var index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n values: false,\n limit: ctx.limit,\n query: {\n index,\n range: ctx.range\n }});\n }).then(({result})=>result).then(cb);\n }\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.primaryKey);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.uniqueKeys()\n * \n * https://dexie.org/docs/Collection/Collection.uniqueKeys()\n * \n **/\n uniqueKeys(cb?) {\n this._ctx.unique = \"unique\";\n return this.keys(cb);\n }\n\n /** Collection.firstKey()\n * \n * https://dexie.org/docs/Collection/Collection.firstKey()\n * \n **/\n firstKey(cb?) {\n return this.limit(1).keys(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.lastKey()\n * \n * https://dexie.org/docs/Collection/Collection.lastKey()\n * \n **/\n lastKey(cb?) {\n return this.reverse().firstKey(cb);\n }\n\n /** Collection.distinct()\n * \n * https://dexie.org/docs/Collection/Collection.distinct()\n * \n **/\n distinct() {\n var ctx = this._ctx,\n idx = ctx.index && ctx.table.schema.idxByName[ctx.index];\n if (!idx || !idx.multi) return this; // distinct() only makes differencies on multiEntry indexes.\n var set = {};\n addFilter(this._ctx, function (cursor: DBCoreCursor) {\n var strKey = cursor.primaryKey.toString(); // Converts any Date to String, String to String, Number to String and Array to comma-separated string\n var found = hasOwn(set, strKey);\n set[strKey] = true;\n return !found;\n });\n return this;\n }\n\n //\n // Methods that mutate storage\n //\n\n /** Collection.modify()\n * \n * https://dexie.org/docs/Collection/Collection.modify()\n * \n **/\n modify(changes: UpdateSpec | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n var ctx = this._ctx;\n return this._write(trans => {\n var modifyer: (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean\n if (typeof changes === 'function') {\n // Changes is a function that may update, add or delete propterties or even require a deletion the object itself (delete this.item)\n modifyer = changes as (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean;\n } else {\n // changes is a set of {keyPath: value} and no one is listening to the updating hook.\n var keyPaths = keys(changes);\n var numKeys = keyPaths.length;\n modifyer = function (item) {\n let anythingModified = false;\n for (let i = 0; i < numKeys; ++i) {\n let keyPath = keyPaths[i];\n let val = changes[keyPath];\n let origVal = getByKeyPath(item, keyPath);\n\n if (val instanceof PropModification) {\n setByKeyPath(item, keyPath, val.execute(origVal));\n anythingModified = true;\n } else if (origVal !== val) {\n setByKeyPath(item, keyPath, val); // Adding {keyPath: undefined} means that the keyPath should be deleted. Handled by setByKeyPath\n anythingModified = true;\n }\n }\n return anythingModified;\n };\n }\n\n const coreTable = ctx.table.core;\n const {outbound, extractKey} = coreTable.schema.primaryKey;\n const limit = this.db._options.modifyChunkSize || 200;\n const totalFailures = [];\n let successCount = 0;\n const failedKeys: IndexableType[] = [];\n const applyMutateResult = (expectedCount: number, res: DBCoreMutateResponse) => {\n const {failures, numFailures} = res;\n successCount += expectedCount - numFailures;\n for (let pos of keys(failures)) {\n totalFailures.push(failures[pos]);\n }\n }\n return this.clone().primaryKeys().then(keys => {\n const criteria = isPlainKeyRange(ctx) &&\n ctx.limit === Infinity &&\n (typeof changes !== 'function' || changes === deleteCallback) && {\n index: ctx.index,\n range: ctx.range\n };\n\n const nextChunk = (offset: number) => {\n const count = Math.min(limit, keys.length - offset);\n return coreTable.getMany({\n trans,\n keys: keys.slice(offset, offset + count),\n cache: \"immutable\" // Optimize for 2 things:\n // 1) observability-middleware can track changes better.\n // 2) hooks middleware don't have to query the existing values again when tracking changes.\n // We can use \"immutable\" because we promise to not touch the values we retrieve here!\n }).then(values => {\n const addValues = [];\n const putValues = [];\n const putKeys = outbound ? [] : null;\n const deleteKeys = [];\n for (let i=0; i 0 &&\n coreTable.mutate({trans, type: 'add', values: addValues})\n .then(res => {\n for (let pos in res.failures) {\n // Remove from deleteKeys the key of the object that failed to change its primary key\n deleteKeys.splice(parseInt(pos), 1);\n }\n applyMutateResult(addValues.length, res);\n })\n ).then(()=>(putValues.length > 0 || (criteria && typeof changes === 'object')) &&\n coreTable.mutate({\n trans,\n type: 'put',\n keys: putKeys,\n values: putValues,\n criteria,\n changeSpec: typeof changes !== 'function'\n && changes,\n isAdditionalChunk: offset > 0\n }).then(res=>applyMutateResult(putValues.length, res))\n ).then(()=>(deleteKeys.length > 0 || (criteria && changes === deleteCallback)) &&\n coreTable.mutate({\n trans,\n type: 'delete',\n keys: deleteKeys,\n criteria,\n isAdditionalChunk: offset > 0\n }).then(res=>applyMutateResult(deleteKeys.length, res))\n ).then(()=>{\n return keys.length > offset + count && nextChunk(offset + limit);\n });\n });\n }\n\n return nextChunk(0).then(()=>{\n if (totalFailures.length > 0)\n throw new ModifyError(\"Error modifying one or more objects\", totalFailures, successCount, failedKeys as IndexableTypeArrayReadonly);\n\n return keys.length;\n });\n });\n\n });\n }\n\n /** Collection.delete()\n * \n * https://dexie.org/docs/Collection/Collection.delete()\n * \n **/\n delete() : PromiseExtended {\n var ctx = this._ctx,\n range = ctx.range;\n //deletingHook = ctx.table.hook.deleting.fire,\n //hasDeleteHook = deletingHook !== nop;\n if (isPlainKeyRange(ctx) &&\n (ctx.isPrimKey || range.type === DBCoreRangeType.Any)) // if no range, we'll use clear().\n {\n // May use IDBObjectStore.delete(IDBKeyRange) in this case (Issue #208)\n // For chromium, this is the way most optimized version.\n // For IE/Edge, this could hang the indexedDB engine and make operating system instable\n // (https://gist.github.com/dfahlander/5a39328f029de18222cf2125d56c38f7)\n return this._write(trans => {\n // Our API contract is to return a count of deleted items, so we have to count() before delete().\n const {primaryKey} = ctx.table.core.schema;\n const coreRange = range;\n return ctx.table.core.count({trans, query: {index: primaryKey, range: coreRange}}).then(count => {\n return ctx.table.core.mutate({trans, type: 'deleteRange', range: coreRange})\n .then(({failures, lastResult, results, numFailures}) => {\n if (numFailures) throw new ModifyError(\"Could not delete some values\",\n Object.keys(failures).map(pos => failures[pos]),\n count - numFailures);\n return count - numFailures;\n });\n });\n });\n }\n\n return this.modify(deleteCallback);\n }\n}\n\nconst deleteCallback = (value, ctx) => ctx.value = null;\n","import { Dexie } from '../../classes/dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Collection } from './collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\nimport { mirror } from '../../functions/chaining-functions';\n\n/** Constructs a Collection instance. */\nexport interface CollectionConstructor {\n new(whereClause?: WhereClause | null, keyRangeGenerator?: () => DBCoreKeyRange): Collection;\n prototype: Collection;\n}\n\n/** Generates a Collection constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createCollectionConstructor(db: Dexie) {\n return makeClassConstructor(\n Collection.prototype,\n\n function Collection(\n this: Collection,\n whereClause?: WhereClause | null,\n keyRangeGenerator?: () => DBCoreKeyRange)\n {\n this.db = db;\n let keyRange = AnyRange, error = null;\n if (keyRangeGenerator) try {\n keyRange = keyRangeGenerator();\n } catch (ex) {\n error = ex;\n }\n\n const whereCtx = whereClause._ctx;\n const table = whereCtx.table;\n const readingHook = table.hook.reading.fire;\n this._ctx = {\n table: table,\n index: whereCtx.index,\n isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)),\n range: keyRange,\n keysOnly: false,\n dir: \"next\",\n unique: \"\",\n algorithm: null,\n filter: null,\n replayFilter: null,\n justLimit: true, // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: null,\n offset: 0,\n limit: Infinity,\n error: error, // If set, any promise must be rejected with this error\n or: whereCtx.or,\n valueMapper: readingHook !== mirror ? readingHook : null\n };\n }\n );\n}\n","import { IndexableType } from '../public/types/indexable-type';\n\nexport function simpleCompare(a, b) {\n return a < b ? -1 : a === b ? 0 : 1;\n}\n\nexport function simpleCompareReverse(a, b) {\n return a > b ? -1 : a === b ? 0 : 1;\n}\n","import { WhereClause } from './where-clause';\nimport { Collection } from '../collection';\nimport { STRING_EXPECTED } from '../../globals/constants';\nimport { simpleCompare, simpleCompareReverse } from '../../functions/compare-functions';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange, DBCoreRangeType } from '../../public/types/dbcore';\n\nexport function fail(collectionOrWhereClause: Collection | WhereClause, err, T?) {\n var collection = collectionOrWhereClause instanceof WhereClause ?\n new collectionOrWhereClause.Collection (collectionOrWhereClause) :\n collectionOrWhereClause;\n \n collection._ctx.error = T ? new T(err) : new TypeError(err);\n return collection;\n}\n\nexport function emptyCollection(whereClause: WhereClause) {\n return new whereClause.Collection (whereClause, () => rangeEqual(\"\")).limit(0);\n}\n\nexport function upperFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toUpperCase() :\n (s: string) => s.toLowerCase();\n}\n\nexport function lowerFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toLowerCase() :\n (s: string) => s.toUpperCase();\n}\n\nexport function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) {\n var length = Math.min(key.length, lowerNeedle.length);\n var llp = -1;\n for (var i = 0; i < length; ++i) {\n var lwrKeyChar = lowerKey[i];\n if (lwrKeyChar !== lowerNeedle[i]) {\n if (cmp(key[i], upperNeedle[i]) < 0) return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1);\n if (cmp(key[i], lowerNeedle[i]) < 0) return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1);\n if (llp >= 0) return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1);\n return null;\n }\n if (cmp(key[i], lwrKeyChar) < 0) llp = i;\n }\n if (length < lowerNeedle.length && dir === \"next\") return key + upperNeedle.substr(key.length);\n if (length < key.length && dir === \"prev\") return key.substr(0, upperNeedle.length);\n return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1));\n}\n\nexport function addIgnoreCaseAlgorithm(whereClause: WhereClause, match, needles, suffix) {\n /// \n var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix,\n needlesLen = needles.length;\n if (!needles.every(s => typeof s === 'string')) {\n return fail(whereClause, STRING_EXPECTED);\n }\n function initDirection(dir) {\n upper = upperFactory(dir);\n lower = lowerFactory(dir);\n compare = (dir === \"next\" ? simpleCompare : simpleCompareReverse);\n var needleBounds = needles.map(function (needle){\n return {lower: lower(needle), upper: upper(needle)};\n }).sort(function(a,b) {\n return compare(a.lower, b.lower);\n });\n upperNeedles = needleBounds.map(function (nb){ return nb.upper; });\n lowerNeedles = needleBounds.map(function (nb){ return nb.lower; });\n direction = dir;\n nextKeySuffix = (dir === \"next\" ? \"\" : suffix);\n }\n initDirection(\"next\");\n\n var c = new whereClause.Collection (\n whereClause,\n ()=>createRange(upperNeedles[0], lowerNeedles[needlesLen-1] + suffix)\n );\n\n c._ondirectionchange = function (direction) {\n // This event onlys occur before filter is called the first time.\n initDirection(direction);\n };\n\n var firstPossibleNeedle = 0;\n\n c._addAlgorithm(function (cursor, advance, resolve) {\n /// \n /// \n /// \n var key = cursor.key;\n if (typeof key !== 'string') return false;\n var lowerKey = lower(key);\n if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) {\n return true;\n } else {\n var lowestPossibleCasing = null;\n for (var i=firstPossibleNeedle; i 0) {\n lowestPossibleCasing = casing;\n }\n }\n if (lowestPossibleCasing !== null) {\n advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); });\n } else {\n advance(resolve);\n }\n return false;\n }\n });\n return c;\n}\n\nexport function createRange (lower: IndexableType, upper: IndexableType, lowerOpen?: boolean, upperOpen?: boolean): DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Range,\n lower,\n upper,\n lowerOpen,\n upperOpen\n };\n}\n\nexport function rangeEqual (value: IndexableType) : DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Equal,\n lower: value,\n upper: value\n };\n}\n","import { WhereClause as IWhereClause } from \"../../public/types/where-clause\";\nimport { Collection } from \"../collection\";\nimport { Table } from \"../table\";\nimport { IndexableType } from \"../../public/types/indexable-type\";\nimport { emptyCollection, fail, addIgnoreCaseAlgorithm, createRange, rangeEqual } from './where-clause-helpers';\nimport { INVALID_KEY_ARGUMENT, STRING_EXPECTED, maxString, minKey } from '../../globals/constants';\nimport { getArrayOf, NO_CHAR_ARRAY } from '../../functions/utils';\nimport { exceptions } from '../../errors';\nimport { Dexie } from '../dexie';\nimport { Collection as ICollection} from \"../../public/types/collection\";\n\n/** class WhereClause\n * \n * https://dexie.org/docs/WhereClause/WhereClause\n */\nexport class WhereClause implements IWhereClause {\n db: Dexie;\n _IDBKeyRange: typeof IDBKeyRange;\n _ctx: {\n table: Table;\n index: string;\n or: Collection;\n }\n _cmp: (a: IndexableType, b: IndexableType) => number;\n _ascending: (a: IndexableType, b: IndexableType) => number;\n _descending: (a: IndexableType, b: IndexableType) => number;\n _min: (a: IndexableType, b: IndexableType) => IndexableType;\n _max: (a: IndexableType, b: IndexableType) => IndexableType;\n\n get Collection() {\n return this._ctx.table.db.Collection;\n }\n\n /** WhereClause.between()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.between()\n * \n **/\n between(lower: IndexableType, upper: IndexableType, includeLower?: boolean, includeUpper?: boolean) {\n includeLower = includeLower !== false; // Default to true\n includeUpper = includeUpper === true; // Default to false\n try {\n if ((this._cmp(lower, upper) > 0) ||\n (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper)))\n return emptyCollection(this); // Workaround for idiotic W3C Specification that DataError must be thrown if lower > upper. The natural result would be to return an empty collection.\n return new this.Collection(this, ()=>createRange(lower, upper, !includeLower, !includeUpper));\n } catch (e) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n }\n\n /** WhereClause.equals()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equals()\n * \n **/\n equals(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => rangeEqual(value)) as ICollection;\n }\n\n /** WhereClause.above()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.above()\n * \n **/\n above(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, true));\n }\n\n /** WhereClause.aboveOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.aboveOrEqual()\n * \n **/\n aboveOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, false));\n }\n\n /** WhereClause.below()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.below()\n * \n **/\n below(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value, false, true));\n }\n\n /** WhereClause.belowOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.belowOrEqual()\n * \n **/\n belowOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value));\n }\n\n /** WhereClause.startsWith()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWith()\n * \n **/\n startsWith(str: string) {\n if (typeof str !== 'string') return fail(this, STRING_EXPECTED);\n return this.between(str, str + maxString, true, true);\n }\n\n /** WhereClause.startsWithIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithIgnoreCase()\n * \n **/\n startsWithIgnoreCase(str: string) {\n if (str === \"\") return this.startsWith(str);\n return addIgnoreCaseAlgorithm(this, (x, a) => x.indexOf(a[0]) === 0, [str], maxString);\n }\n\n /** WhereClause.equalsIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equalsIgnoreCase()\n * \n **/\n equalsIgnoreCase(str: string) {\n return addIgnoreCaseAlgorithm(this, (x, a) => x === a[0], [str], \"\");\n }\n\n /** WhereClause.anyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOfIgnoreCase()\n * \n **/\n anyOfIgnoreCase(...values: string[]): Collection;\n anyOfIgnoreCase(values: string[]): Collection;\n anyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.indexOf(x) !== -1, set, \"\");\n }\n\n /** WhereClause.startsWithAnyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOfIgnoreCase()\n * \n **/\n startsWithAnyOfIgnoreCase(...values: string[]): Collection;\n startsWithAnyOfIgnoreCase(values: string[]): Collection;\n startsWithAnyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.some(n => x.indexOf(n) === 0), set, maxString);\n }\n\n /** WhereClause.anyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOf()\n * \n **/\n anyOf(...values: string[]): Collection;\n anyOf(values: string[]): Collection;\n anyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n let compare = this._cmp;\n try { set.sort(compare); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n if (set.length === 0) return emptyCollection(this);\n const c = new this.Collection(this, () => createRange(set[0], set[set.length - 1]));\n\n c._ondirectionchange = direction => {\n compare = (direction === \"next\" ?\n this._ascending :\n this._descending);\n set.sort(compare);\n };\n\n let i = 0;\n c._addAlgorithm((cursor, advance, resolve) => {\n const key = cursor.key;\n while (compare(key, set[i]) > 0) {\n // The cursor has passed beyond this key. Check next.\n ++i;\n if (i === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (compare(key, set[i]) === 0) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => { cursor.continue(set[i]); });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.notEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.notEqual()\n * \n **/\n notEqual(value: IndexableType) {\n return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.noneOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.noneOf()\n * \n **/\n noneOf(...values: string[]): Collection;\n noneOf(values: string[]): Collection;\n noneOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return new this.Collection(this); // Return entire collection.\n try { set.sort(this._ascending); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n // Transform [\"a\",\"b\",\"c\"] to a set of ranges for between/above/below: [[minKey,\"a\"], [\"a\",\"b\"], [\"b\",\"c\"], [\"c\",maxKey]]\n const ranges = set.reduce(\n (res, val) => res ?\n res.concat([[res[res.length - 1][1], val]]) :\n [[minKey, val]],\n null);\n ranges.push([set[set.length - 1], this.db._maxKey]);\n return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.inAnyRange()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.inAnyRange()\n * \n **/\n inAnyRange(\n ranges: ReadonlyArray<{ 0: IndexableType, 1: IndexableType }>,\n options?: { includeLowers?: boolean, includeUppers?: boolean })\n {\n const cmp = this._cmp,\n ascending = this._ascending,\n descending = this._descending,\n min = this._min,\n max = this._max;\n\n if (ranges.length === 0) return emptyCollection(this);\n if (!ranges.every(range =>\n range[0] !== undefined &&\n range[1] !== undefined &&\n ascending(range[0], range[1]) <= 0)) {\n return fail(\n this,\n \"First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower\",\n exceptions.InvalidArgument);\n }\n const includeLowers = !options || options.includeLowers !== false; // Default to true\n const includeUppers = options && options.includeUppers === true; // Default to false\n\n function addRange(ranges, newRange) {\n let i = 0, l = ranges.length;\n for (; i < l; ++i) {\n const range = ranges[i];\n if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) {\n range[0] = min(range[0], newRange[0]);\n range[1] = max(range[1], newRange[1]);\n break;\n }\n }\n if (i === l)\n ranges.push(newRange);\n return ranges;\n }\n\n let sortDirection = ascending;\n function rangeSorter(a, b) { return sortDirection(a[0], b[0]); }\n\n // Join overlapping ranges\n let set;\n try {\n set = ranges.reduce(addRange, []);\n set.sort(rangeSorter);\n } catch (ex) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n\n let rangePos = 0;\n const keyIsBeyondCurrentEntry = includeUppers ?\n key => ascending(key, set[rangePos][1]) > 0 :\n key => ascending(key, set[rangePos][1]) >= 0;\n\n const keyIsBeforeCurrentEntry = includeLowers ?\n key => descending(key, set[rangePos][0]) > 0 :\n key => descending(key, set[rangePos][0]) >= 0;\n\n function keyWithinCurrentRange(key) {\n return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key);\n }\n\n let checkKey = keyIsBeyondCurrentEntry;\n\n const c = new this.Collection(\n this,\n () => createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers));\n\n c._ondirectionchange = direction => {\n if (direction === \"next\") {\n checkKey = keyIsBeyondCurrentEntry;\n sortDirection = ascending;\n } else {\n checkKey = keyIsBeforeCurrentEntry;\n sortDirection = descending;\n }\n set.sort(rangeSorter);\n };\n\n c._addAlgorithm((cursor, advance, resolve) => {\n var key = cursor.key;\n while (checkKey(key)) {\n // The cursor has passed beyond this key. Check next.\n ++rangePos;\n if (rangePos === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (keyWithinCurrentRange(key)) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else if (this._cmp(key, set[rangePos][1]) === 0 || this._cmp(key, set[rangePos][0]) === 0) {\n // includeUpper or includeLower is false so keyWithinCurrentRange() returns false even though we are at range border.\n // Continue to next key but don't include this one.\n return false;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => {\n if (sortDirection === ascending) cursor.continue(set[rangePos][0]);\n else cursor.continue(set[rangePos][1]);\n });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.startsWithAnyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOf()\n * \n **/\n startsWithAnyOf(...prefixes: string[]): Collection;\n startsWithAnyOf(prefixes: string[]): Collection;\n startsWithAnyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n\n if (!set.every(s => typeof s === 'string')) {\n return fail(this, \"startsWithAnyOf() only works with strings\");\n }\n if (set.length === 0) return emptyCollection(this);\n\n return this.inAnyRange(set.map((str: string) => [str, str + maxString]));\n }\n\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { WhereClause } from './where-clause';\nimport { Table } from '../table';\nimport { Collection } from '../collection';\nimport { exceptions } from '../../errors';\nimport { cmp } from '../../functions/cmp';\n\nexport interface WhereClauseConstructor {\n new(table: Table, index?: string, orCollection?: Collection): WhereClause;\n prototype: WhereClause;\n}\n\n/** Generates a WhereClause constructor.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createWhereClauseConstructor(db: Dexie) {\n return makeClassConstructor(\n WhereClause.prototype,\n\n function WhereClause(this: WhereClause, table: Table, index?: string, orCollection?: Collection) {\n this.db = db;\n this._ctx = {\n table: table,\n index: index === \":id\" ? null : index,\n or: orCollection\n };\n this._cmp = this._ascending = cmp;\n this._descending = (a, b) => cmp(b, a);\n this._max = (a, b) => cmp(a,b) > 0 ? a : b;\n this._min = (a, b) => cmp(a,b) < 0 ? a : b;\n this._IDBKeyRange = db._deps.IDBKeyRange;\n if (!this._IDBKeyRange) throw new exceptions.MissingAPI();\n }\n );\n}\n","import { wrap } from \"../helpers/promise\";\n\nexport function eventRejectHandler(reject) {\n return wrap(function (event) {\n preventDefault(event);\n reject (event.target.error);\n return false;\n });\n}\n\nexport function eventSuccessHandler (resolve) {\n return wrap(function (event){\n resolve(event.target.result);\n });\n}\n\nexport function hookedEventRejectHandler (reject) {\n return wrap(function (event) {\n // See comment on hookedEventSuccessHandler() why wrap() is needed only when supporting hooks.\n \n var req = event.target,\n err = req.error,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n hookErrorHandler = ctx && ctx.onerror;\n hookErrorHandler && hookErrorHandler(err);\n preventDefault(event);\n reject (err);\n return false;\n });\n}\n\nexport function hookedEventSuccessHandler(resolve) {\n // wrap() is needed when calling hooks because the rare scenario of:\n // * hook does a db operation that fails immediately (IDB throws exception)\n // For calling db operations on correct transaction, wrap makes sure to set PSD correctly.\n // wrap() will also execute in a virtual tick.\n // * If not wrapped in a virtual tick, direct exception will launch a new physical tick.\n // * If this was the last event in the bulk, the promise will resolve after a physical tick\n // and the transaction will have committed already.\n // If no hook, the virtual tick will be executed in the reject()/resolve of the final promise,\n // because it is always marked with _lib = true when created using Transaction._promise().\n return wrap(function(event) {\n var req = event.target,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n result = ctx.value || req.result, // Pass the object value on updates. The result from IDB is the primary key.\n hookSuccessHandler = ctx && ctx.onsuccess;\n hookSuccessHandler && hookSuccessHandler(result);\n resolve && resolve(result);\n }, resolve);\n}\n\n\nexport function preventDefault(event) {\n if (event.stopPropagation) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.stopPropagation();\n if (event.preventDefault) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.preventDefault();\n}\n\nexport function BulkErrorHandlerCatchAll(errorList, done?, supportHooks?) {\n return (supportHooks ? hookedEventRejectHandler : eventRejectHandler)(e => {\n errorList.push(e);\n done && done();\n });\n}\n\n","import Events from '../helpers/Events';\nimport { GlobalDexieEvents } from '../public/types/db-events';\n\nexport const DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated' as 'storagemutated';\n\n// Name of the global event fired using DOM dispatchEvent (if not in node).\n// Reason for propagating this as a DOM event is for getting reactivity across\n// multiple versions of Dexie within the same app (as long as they are\n// compatible with regards to the event data).\n// If the ObservabilitySet protocol change in a way that would not be backward\n// compatible, make sure also update the event name to a new number at the end\n// so that two Dexie instances of different versions continue to work together\n// - maybe not able to communicate but won't fail due to unexpected data in\n// the detail property of the CustomEvent. If so, also make sure to udpate\n// docs and explain at which Dexie version the new name and format of the event\n// is being used.\nexport const STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1';\n\nexport const globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME) as GlobalDexieEvents;\n","import { Transaction as ITransaction } from '../../public/types/transaction';\nimport { DexiePromise, wrap, rejection } from \"../../helpers/promise\";\nimport { DbSchema } from '../../public/types/db-schema';\nimport { assert, hasOwn } from '../../functions/utils';\nimport { PSD, usePSD } from '../../helpers/promise';\nimport { Dexie } from '../dexie';\nimport { exceptions } from '../../errors';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { preventDefault } from '../../functions/event-wrappers';\nimport { newScope } from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { Table } from '../table';\nimport { globalEvents } from '../../globals/global-events';\n\n/** Transaction\n * \n * https://dexie.org/docs/Transaction/Transaction\n * \n **/\nexport class Transaction implements ITransaction {\n db: Dexie;\n active: boolean;\n mode: IDBTransactionMode;\n chromeTransactionDurability: ChromeTransactionDurability;\n idbtrans: IDBTransaction;\n storeNames: string[];\n explicit?: boolean;\n on: any;\n parent?: Transaction;\n schema: DbSchema;\n _memoizedTables: {[tableName: string]: Table};\n\n _reculock: number;\n _blockedFuncs: { 0: () => any, 1: any }[];\n _resolve: () => void;\n _reject: (Error) => void;\n _waitingFor: DexiePromise; // for waitFor()\n _waitingQueue: Function[]; // for waitFor()\n _spinCount: number; // Just for debugging waitFor()\n _completion: DexiePromise;\n\n //\n // Transaction internal methods (not required by API users, but needed internally and eventually by dexie extensions)\n //\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _lock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n // Temporary set all requests into a pending queue if they are called before database is ready.\n ++this._reculock; // Recursive read/write lock pattern using PSD (Promise Specific Data) instead of TLS (Thread Local Storage)\n if (this._reculock === 1 && !PSD.global) PSD.lockOwnerFor = this;\n return this;\n }\n\n /** Transaction._unlock()\n * \n * Internal method.\n */\n _unlock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n if (--this._reculock === 0) {\n if (!PSD.global) PSD.lockOwnerFor = null;\n while (this._blockedFuncs.length > 0 && !this._locked()) {\n var fnAndPSD = this._blockedFuncs.shift();\n try { usePSD(fnAndPSD[1], fnAndPSD[0]); } catch (e) { }\n }\n }\n return this;\n }\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _locked() {\n // Checks if any write-lock is applied on this transaction.\n // To simplify the Dexie API for extension implementations, we support recursive locks.\n // This is accomplished by using \"Promise Specific Data\" (PSD).\n // PSD data is bound to a Promise and any child Promise emitted through then() or resolve( new Promise() ).\n // PSD is local to code executing on top of the call stacks of any of any code executed by Promise():\n // * callback given to the Promise() constructor (function (resolve, reject){...})\n // * callbacks given to then()/catch()/finally() methods (function (value){...})\n // If creating a new independant Promise instance from within a Promise call stack, the new Promise will derive the PSD from the call stack of the parent Promise.\n // Derivation is done so that the inner PSD __proto__ points to the outer PSD.\n // PSD.lockOwnerFor will point to current transaction object if the currently executing PSD scope owns the lock.\n return this._reculock && PSD.lockOwnerFor !== this;\n }\n\n /** Transaction.create()\n * \n * Internal method.\n * \n */\n create(idbtrans?: IDBTransaction & {[prop: string]: any}) {\n if (!this.mode) return this;\n const idbdb = this.db.idbdb;\n const dbOpenError = this.db._state.dbOpenError;\n assert(!this.idbtrans);\n if (!idbtrans && !idbdb) {\n switch (dbOpenError && dbOpenError.name) {\n case \"DatabaseClosedError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.DatabaseClosed(dbOpenError);\n case \"MissingAPIError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError);\n default:\n // Make it clear that the user operation was not what caused the error - the error had occurred earlier on db.open()!\n throw new exceptions.OpenFailed(dbOpenError);\n }\n }\n if (!this.active) throw new exceptions.TransactionInactive();\n assert(this._completion._state === null); // Completion Promise must still be pending.\n\n idbtrans = this.idbtrans = idbtrans ||\n (this.db.core \n ? this.db.core.transaction(this.storeNames, this.mode as 'readwrite' | 'readonly', { durability: this.chromeTransactionDurability })\n : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })\n ) as IDBTransaction;\n\n idbtrans.onerror = wrap(ev => {\n preventDefault(ev);// Prohibit default bubbling to window.error\n this._reject(idbtrans.error);\n });\n idbtrans.onabort = wrap(ev => {\n preventDefault(ev);\n this.active && this._reject(new exceptions.Abort(idbtrans.error));\n this.active = false;\n this.on(\"abort\").fire(ev);\n });\n idbtrans.oncomplete = wrap(() => {\n this.active = false;\n this._resolve();\n if ('mutatedParts' in idbtrans) {\n globalEvents.storagemutated.fire(idbtrans[\"mutatedParts\"]);\n }\n });\n return this;\n }\n\n /** Transaction._promise()\n * \n * Internal method.\n */\n _promise(\n mode: IDBTransactionMode,\n fn: (resolve, reject, trans: Transaction) => PromiseLike | void,\n bWriteLock?: string | boolean): DexiePromise\n {\n if (mode === 'readwrite' && this.mode !== 'readwrite')\n return rejection(new exceptions.ReadOnly(\"Transaction is readonly\"));\n\n if (!this.active)\n return rejection(new exceptions.TransactionInactive());\n\n if (this._locked()) {\n return new DexiePromise((resolve, reject) => {\n this._blockedFuncs.push([() => {\n this._promise(mode, fn, bWriteLock).then(resolve, reject);\n }, PSD]);\n });\n\n } else if (bWriteLock) {\n return newScope(() => {\n var p = new DexiePromise((resolve, reject) => {\n this._lock();\n const rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p.finally(() => this._unlock());\n p._lib = true;\n return p;\n });\n\n } else {\n var p = new DexiePromise((resolve, reject) => {\n var rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p._lib = true;\n return p;\n }\n }\n\n /** Transaction._root()\n * \n * Internal method. Retrieves the root transaction in the tree of sub transactions.\n */\n _root() {\n return this.parent ? this.parent._root() : this;\n }\n\n /** Transaction.waitFor()\n * \n * Internal method. Can be accessed from the public API through\n * Dexie.waitFor(): https://dexie.org/docs/Dexie/Dexie.waitFor()\n * \n **/\n waitFor(promiseLike: PromiseLike) {\n // Always operate on the root transaction (in case this is a sub stransaction)\n var root = this._root();\n // For stability reasons, convert parameter to promise no matter what type is passed to waitFor().\n // (We must be able to call .then() on it.)\n const promise = DexiePromise.resolve(promiseLike);\n if (root._waitingFor) {\n // Already called waitFor(). Wait for both to complete.\n root._waitingFor = root._waitingFor.then(() => promise);\n } else {\n // We're not in waiting state. Start waiting state.\n root._waitingFor = promise;\n root._waitingQueue = [];\n // Start interacting with indexedDB until promise completes:\n var store = root.idbtrans.objectStore(root.storeNames[0]);\n (function spin() {\n ++root._spinCount; // For debugging only\n while (root._waitingQueue.length) (root._waitingQueue.shift())();\n if (root._waitingFor) store.get(-Infinity).onsuccess = spin;\n }());\n }\n var currentWaitPromise = root._waitingFor;\n return new DexiePromise((resolve, reject) => {\n promise.then(\n res => root._waitingQueue.push(wrap(resolve.bind(null, res))),\n err => root._waitingQueue.push(wrap(reject.bind(null, err)))\n ).finally(() => {\n if (root._waitingFor === currentWaitPromise) {\n // No one added a wait after us. Safe to stop the spinning.\n root._waitingFor = null;\n }\n });\n });\n } \n\n /** Transaction.abort()\n * \n * https://dexie.org/docs/Transaction/Transaction.abort()\n */\n abort() {\n if (this.active) {\n this.active = false;\n if (this.idbtrans) this.idbtrans.abort();\n this._reject(new exceptions.Abort());\n }\n }\n\n /** Transaction.table()\n * \n * https://dexie.org/docs/Transaction/Transaction.table()\n */\n table(tableName: string) {\n const memoizedTables = (this._memoizedTables || (this._memoizedTables = {}));\n if (hasOwn(memoizedTables, tableName))\n return memoizedTables[tableName];\n const tableSchema = this.schema[tableName];\n if (!tableSchema) {\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\"); \n }\n\n const transactionBoundTable = new this.db.Table(tableName, tableSchema, this);\n transactionBoundTable.core = this.db.core.table(tableName);\n memoizedTables[tableName] = transactionBoundTable;\n return transactionBoundTable;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Transaction } from './transaction';\nimport { DbSchema } from '../../public/types/db-schema';\nimport Events from '../../helpers/Events';\nimport Promise, { rejection } from '../../helpers/promise';\n\nexport interface TransactionConstructor {\n new (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction) : T;\n prototype: T;\n}\n\n/** Generates a Transaction constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTransactionConstructor(db: Dexie) {\n return makeClassConstructor>(\n Transaction.prototype,\n function Transaction (\n this: Transaction,\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction)\n {\n this.db = db;\n this.mode = mode;\n this.storeNames = storeNames;\n this.schema = dbschema;\n this.chromeTransactionDurability = chromeTransactionDurability;\n this.idbtrans = null;\n this.on = Events(this, \"complete\", \"error\", \"abort\");\n this.parent = parent || null;\n this.active = true;\n this._reculock = 0;\n this._blockedFuncs = [];\n this._resolve = null;\n this._reject = null;\n this._waitingFor = null;\n this._waitingQueue = null;\n this._spinCount = 0; // Just for debugging waitFor()\n this._completion = new Promise ((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n \n this._completion.then(\n ()=> {\n this.active = false;\n this.on.complete.fire();\n },\n e => {\n var wasActive = this.active;\n this.active = false;\n this.on.error.fire(e);\n this.parent ?\n this.parent._reject(e) :\n wasActive && this.idbtrans && this.idbtrans.abort();\n return rejection(e); // Indicate we actually DO NOT catch this error.\n });\n \n });\n}\n","import { IndexSpec } from '../public/types/index-spec';\n\nexport function createIndexSpec(\n name: string,\n keyPath: string | string[],\n unique: boolean,\n multi: boolean,\n auto: boolean,\n compound: boolean,\n isPrimKey: boolean\n): IndexSpec {\n return {\n name,\n keyPath,\n unique,\n multi,\n auto,\n compound,\n src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? \"++\" : \"\") + nameFromKeyPath(keyPath)\n }\n}\n\nexport function nameFromKeyPath (keyPath?: string | string[]): string {\n return typeof keyPath === 'string' ?\n keyPath :\n keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : \"\";\n}\n","import { IndexSpec } from '../public/types/index-spec';\nimport { TableSchema } from '../public/types/table-schema';\nimport { createIndexSpec } from './index-spec';\nimport { arrayToObject } from '../functions/utils';\n\nexport function createTableSchema (\n name: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n): TableSchema {\n return {\n name,\n primKey,\n indexes,\n mappedClass: null,\n idxByName: arrayToObject(indexes, index => [index.name, index])\n };\n}\n","import { maxString } from '../globals/constants';\n\nexport function safariMultiStoreFix(storeNames: string[]) {\n return storeNames.length === 1 ? storeNames[0] : storeNames;\n}\n\nexport function getNativeGetDatabaseNamesFn(indexedDB) {\n var fn = indexedDB && (indexedDB.getDatabaseNames || indexedDB.webkitGetDatabaseNames);\n return fn && fn.bind(indexedDB);\n}\n\nexport let getMaxKey = (IdbKeyRange: typeof IDBKeyRange) => {\n try {\n IdbKeyRange.only([[]]);\n getMaxKey = () => [[]];\n return [[]];\n } catch (e) {\n getMaxKey = () => maxString;\n return maxString;\n }\n}\n","import { getByKeyPath } from '../functions/utils';\n\nexport function getKeyExtractor (keyPath: null | string | string[]) : (a: any) => any {\n if (keyPath == null) {\n return () => undefined;\n } else if (typeof keyPath === 'string') {\n return getSinglePathKeyExtractor(keyPath);\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n\nexport function getSinglePathKeyExtractor(keyPath: string) {\n const split = keyPath.split('.');\n if (split.length === 1) {\n return obj => obj[keyPath];\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n","import {\n DBCore,\n DBCoreCursor,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryResponse,\n DBCoreRangeType,\n DBCoreSchema,\n DBCoreTableSchema,\n DBCoreTable,\n DBCoreMutateResponse,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { eventRejectHandler, preventDefault } from '../functions/event-wrappers';\nimport { wrap } from '../helpers/promise';\nimport { getMaxKey } from '../functions/quirks';\nimport { getKeyExtractor } from './get-key-extractor';\n\nexport function arrayify(arrayLike: {length: number, [index: number]: T}): T[] {\n return [].slice.call(arrayLike);\n}\nexport function pick(obj: T, props: Prop[]): Pick {\n const result = {} as Pick;\n props.forEach(prop => result[prop] = obj[prop]);\n return result;\n}\n\nlet _id_counter = 0;\n\nexport function getKeyPathAlias(keyPath: null | string | string[]) {\n return keyPath == null ?\n \":id\" :\n typeof keyPath === 'string' ?\n keyPath :\n `[${keyPath.join('+')}]`;\n}\n\nexport function createDBCore (\n db: IDBDatabase,\n IdbKeyRange: typeof IDBKeyRange,\n tmpTrans: IDBTransaction) : DBCore\n{\n function extractSchema(db: IDBDatabase, trans: IDBTransaction) : {schema: DBCoreSchema, hasGetAll: boolean} {\n const tables = arrayify(db.objectStoreNames);\n return {\n schema: {\n name: db.name,\n tables: tables.map(table => trans.objectStore(table)).map(store => {\n const {keyPath, autoIncrement} = store;\n const compound = isArray(keyPath);\n const outbound = keyPath == null;\n const indexByKeyPath: {[keyPathAlias: string]: DBCoreIndex} = {};\n const result = {\n name: store.name,\n primaryKey: {\n name: null,\n isPrimaryKey: true,\n outbound,\n compound,\n keyPath,\n autoIncrement,\n unique: true,\n extractKey: getKeyExtractor(keyPath)\n } as DBCoreIndex,\n indexes: arrayify(store.indexNames).map(indexName => store.index(indexName))\n .map(index => {\n const {name, unique, multiEntry, keyPath} = index;\n const compound = isArray(keyPath);\n const result: DBCoreIndex = {\n name,\n compound,\n keyPath,\n unique,\n multiEntry,\n extractKey: getKeyExtractor(keyPath)\n };\n indexByKeyPath[getKeyPathAlias(keyPath)] = result;\n return result;\n }),\n getIndexByKeyPath: (keyPath: null | string | string[]) => indexByKeyPath[getKeyPathAlias(keyPath)]\n };\n indexByKeyPath[\":id\"] = result.primaryKey;\n if (keyPath != null) {\n indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey;\n }\n return result;\n })\n },\n hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) &&\n !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604) // Bug with getAll() on Safari ver<604. See discussion following PR #579\n };\n }\n\n function makeIDBKeyRange (range: DBCoreKeyRange) : IDBKeyRange | null {\n if (range.type === DBCoreRangeType.Any) return null;\n if (range.type === DBCoreRangeType.Never) throw new Error(\"Cannot convert never type to IDBKeyRange\");\n const {lower, upper, lowerOpen, upperOpen} = range;\n const idbRange = lower === undefined ?\n upper === undefined ?\n null : //IDBKeyRange.lowerBound(-Infinity, false) : // Any range (TODO: Should we return null instead?)\n IdbKeyRange.upperBound(upper, !!upperOpen) : // below\n upper === undefined ?\n IdbKeyRange.lowerBound(lower, !!lowerOpen) : // above\n IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen);\n return idbRange;\n }\n\n function createDbCoreTable(tableSchema: DBCoreTableSchema): DBCoreTable {\n const tableName = tableSchema.name;\n\n function mutate ({trans, type, keys, values, range}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const outbound = store.keyPath == null;\n const isAddOrPut = type === \"put\" || type === \"add\";\n if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange')\n throw new Error (\"Invalid operation type: \" + type);\n\n const {length} = keys || values || {length: 1}; // keys.length if keys. values.length if values. 1 if range.\n if (keys && values && keys.length !== values.length) {\n throw new Error(\"Given keys array must have same length as given values array.\");\n }\n if (length === 0)\n // No items to write. Don't even bother!\n return resolve({numFailures: 0, failures: {}, results: [], lastResult: undefined});\n\n let req: IDBRequest;\n const reqs: IDBRequest[] = [];\n \n const failures: {[operationNumber: number]: Error} = [];\n let numFailures = 0;\n const errorHandler = \n event => {\n ++numFailures;\n preventDefault(event);\n };\n \n if (type === 'deleteRange') {\n // Here the argument is the range\n if (range.type === DBCoreRangeType.Never)\n return resolve({numFailures, failures, results: [], lastResult: undefined}); // Deleting the Never range shoulnt do anything.\n if (range.type === DBCoreRangeType.Any)\n reqs.push(req = store.clear()); // Deleting the Any range is equivalent to store.clear()\n else\n reqs.push(req = store.delete(makeIDBKeyRange(range)));\n } else {\n // No matter add, put or delete - find out arrays of first and second arguments to it.\n const [args1, args2] = isAddOrPut ?\n outbound ?\n [values, keys] :\n [values, null] :\n [keys, null];\n\n if (isAddOrPut) {\n for (let i=0; i {\n const lastResult = event.target.result;\n reqs.forEach((req, i) => req.error != null && (failures[i] = req.error));\n resolve({\n numFailures,\n failures,\n results: type === \"delete\" ? keys : reqs.map(req => req.result),\n lastResult\n });\n };\n \n req.onerror = event => { // wrap() not needed. All paths calling outside will wrap!\n errorHandler(event);\n done(event);\n };\n \n req.onsuccess = done;\n });\n }\n \n function openCursor ({trans, values, query, reverse, unique}: DBCoreOpenCursorRequest): Promise\n {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n // source\n const source = index.isPrimaryKey ?\n store :\n store.index(index.name);\n // direction\n const direction = reverse ?\n unique ?\n \"prevunique\" :\n \"prev\" :\n unique ?\n \"nextunique\" :\n \"next\";\n // request\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(makeIDBKeyRange(range), direction) :\n source.openKeyCursor(makeIDBKeyRange(range), direction);\n \n // iteration\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = wrap(ev => {\n\n const cursor = req.result as unknown as DBCoreCursor;\n if (!cursor) {\n resolve(null);\n return;\n }\n (cursor as any).___id = ++_id_counter;\n (cursor as any).done = false;\n const _cursorContinue = cursor.continue.bind(cursor);\n let _cursorContinuePrimaryKey = cursor.continuePrimaryKey;\n if (_cursorContinuePrimaryKey) _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor);\n const _cursorAdvance = cursor.advance.bind(cursor);\n const doThrowCursorIsNotStarted = ()=>{throw new Error(\"Cursor not started\");}\n const doThrowCursorIsStopped = ()=>{throw new Error(\"Cursor not stopped\");}\n (cursor as any).trans = trans;\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted;\n cursor.fail = wrap(reject);\n cursor.next = function (this: DBCoreCursor) {\n // next() must work with \"this\" pointer in order to function correctly for ProxyCursors (derived objects)\n // without having to re-define next() on each child.\n let gotOne = 1;\n return this.start(() => gotOne-- ? this.continue() : this.stop()).then(() => this);\n };\n cursor.start = (callback) => {\n //console.log(\"Starting cursor\", (cursor as any).___id);\n const iterationPromise = new Promise((resolveIteration, rejectIteration) =>{\n resolveIteration = wrap(resolveIteration);\n req.onerror = eventRejectHandler(rejectIteration);\n cursor.fail = rejectIteration;\n cursor.stop = value => {\n //console.log(\"Cursor stop\", cursor);\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped;\n resolveIteration(value);\n };\n });\n // Now change req.onsuccess to a callback that doesn't call initCursor but just observer.next()\n const guardedCallback = () => {\n if (req.result) {\n //console.log(\"Next result\", cursor);\n try {\n callback();\n } catch (err) {\n cursor.fail(err);\n }\n } else {\n (cursor as any).done = true;\n cursor.start = ()=>{throw new Error(\"Cursor behind last entry\");}\n cursor.stop();\n }\n }\n req.onsuccess = wrap(ev => {\n //cursor.continue = _cursorContinue;\n //cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n //cursor.advance = _cursorAdvance;\n req.onsuccess = guardedCallback;\n guardedCallback();\n });\n cursor.continue = _cursorContinue;\n cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n cursor.advance = _cursorAdvance;\n guardedCallback();\n return iterationPromise;\n };\n resolve(cursor);\n }, reject); \n });\n }\n \n function query (hasGetAll: boolean) {\n return (request: DBCoreQueryRequest) => {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {trans, values, limit, query} = request;\n const nonInfinitLimit = limit === Infinity ? undefined : limit;\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n if (limit === 0) return resolve({result: []});\n if (hasGetAll) {\n const req = values ?\n (source as any).getAll(idbKeyRange, nonInfinitLimit) :\n (source as any).getAllKeys(idbKeyRange, nonInfinitLimit);\n req.onsuccess = event => resolve({result: event.target.result});\n req.onerror = eventRejectHandler(reject);\n } else {\n let count = 0;\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(idbKeyRange) :\n source.openKeyCursor(idbKeyRange)\n const result = [];\n req.onsuccess = event => {\n const cursor = req.result as IDBCursorWithValue;\n if (!cursor) return resolve({result});\n result.push(values ? cursor.value : cursor.primaryKey);\n if (++count === limit) return resolve({result});\n cursor.continue();\n };\n req.onerror = eventRejectHandler(reject);\n }\n });\n };\n }\n \n return {\n name: tableName,\n schema: tableSchema,\n \n mutate,\n\n getMany ({trans, keys}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const length = keys.length;\n const result = new Array(length);\n let keyCount = 0;\n let callbackCount = 0;\n let valueCount = 0;\n let req: IDBRequest & {_pos?: number};\n \n const successHandler = event => {\n const req = event.target;\n if ((result[req._pos] = req.result) != null) ++valueCount;\n if (++callbackCount === keyCount) resolve(result);\n };\n const errorHandler = eventRejectHandler(reject);\n \n for (let i=0; i((resolve, reject) => {\n resolve = wrap (resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const req = store.get(key);\n req.onsuccess = event => resolve((event.target as any).result);\n req.onerror = eventRejectHandler(reject);\n });\n },\n\n query: query(hasGetAll),\n \n openCursor,\n\n count ({query, trans}) {\n const {index, range} = query;\n return new Promise((resolve, reject) => {\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n const req = idbKeyRange ? source.count(idbKeyRange) : source.count();\n req.onsuccess = wrap(ev => resolve((ev.target as IDBRequest).result));\n req.onerror = eventRejectHandler(reject);\n });\n }\n };\n }\n\n const {schema, hasGetAll} = extractSchema(db, tmpTrans);\n const tables = schema.tables.map(tableSchema => createDbCoreTable(tableSchema));\n const tableMap: {[name: string]: DBCoreTable} = {};\n tables.forEach(table => tableMap[table.name] = table);\n return {\n stack: \"dbcore\",\n \n transaction: db.transaction.bind(db),\n\n table(name: string) {\n const result = tableMap[name];\n if (!result) throw new Error(`Table '${name}' not found`);\n return tableMap[name];\n },\n\n MIN_KEY: -Infinity,\n\n MAX_KEY: getMaxKey(IdbKeyRange),\n\n schema\n\n };\n}\n","import { Dexie } from './';\nimport { createDBCore } from '../../dbcore/dbcore-indexeddb';\nimport { DBCore } from '../../public/types/dbcore';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { DexieStacks, Middleware } from '../../public/types/middleware';\nimport { exceptions } from '../../errors';\n\nfunction createMiddlewareStack(\n stackImpl: {stack: string},\n middlewares: Middleware<{stack: string}>[]): TStack {\n return middlewares.reduce((down, {create}) => ({...down, ...create(down)}), stackImpl) as TStack;\n} \n\nfunction createMiddlewareStacks(\n middlewares: {[StackName in keyof DexieStacks]?: Middleware[]},\n idbdb: IDBDatabase,\n {IDBKeyRange, indexedDB}: DexieDOMDependencies,\n tmpTrans: IDBTransaction): {[StackName in keyof DexieStacks]?: DexieStacks[StackName]}\n{\n const dbcore = createMiddlewareStack(\n createDBCore(idbdb, IDBKeyRange, tmpTrans),\n middlewares.dbcore);\n \n // TODO: Create other stacks the same way as above. They might be dependant on the result\n // of creating dbcore stack.\n\n return {\n dbcore\n };\n}\n\nexport function generateMiddlewareStacks(db: Dexie, tmpTrans: IDBTransaction) {\n const idbdb = tmpTrans.db;\n const stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans);\n db.core = stacks.dbcore!;\n db.tables.forEach(table => {\n const tableName = table.name;\n if (db.core.schema.tables.some(tbl => tbl.name === tableName)) {\n table.core = db.core.table(tableName);\n if (db[tableName] instanceof db.Table) {\n db[tableName].core = table.core;\n }\n }\n });\n}\n","import { Dexie } from '../dexie';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { _global } from \"../../globals/global\";\nimport { setProp, keys, slice, isArray, shallowClone, isAsyncFunction, defineProperty, getPropertyDescriptor } from '../../functions/utils';\nimport { Transaction } from '../transaction';\nimport { Version } from './version';\nimport Promise, { PSD, newScope, NativePromise, decrementExpectedAwaits, incrementExpectedAwaits } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { IndexSpec } from '../../public/types/index-spec';\nimport { createIndexSpec, nameFromKeyPath } from '../../helpers/index-spec';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { generateMiddlewareStacks } from '../dexie/generate-middleware-stacks';\nimport { debug } from '../../helpers/debug';\nimport { PromiseExtended } from '../../public/types/promise-extended';\n\nexport function setApiOnPlace(db: Dexie, objs: Object[], tableNames: string[], dbschema: DbSchema) {\n tableNames.forEach(tableName => {\n const schema = dbschema[tableName];\n objs.forEach(obj => {\n const propDesc = getPropertyDescriptor(obj, tableName);\n if (!propDesc || (\"value\" in propDesc && propDesc.value === undefined)) {\n // Either the prop is not declared, or it is initialized to undefined.\n if (obj === db.Transaction.prototype || obj instanceof db.Transaction) {\n // obj is a Transaction prototype (or prototype of a subclass to Transaction)\n // Make the API a getter that returns this.table(tableName)\n setProp(obj, tableName, {\n get(this: Transaction) { return this.table(tableName); },\n set(value: any) {\n // Issue #1039\n // Let \"this.schema = dbschema;\" and other props in transaction constructor work even if there's a name collision with the table name.\n defineProperty(this, tableName, {value, writable: true, configurable: true, enumerable: true});\n }\n });\n } else {\n // Table will not be bound to a transaction (will use Dexie.currentTransaction)\n obj[tableName] = new db.Table(tableName, schema);\n }\n }\n });\n });\n}\n\nexport function removeTablesApi(db: Dexie, objs: Object[]) {\n objs.forEach(obj => {\n for (let key in obj) {\n if (obj[key] instanceof db.Table) delete obj[key];\n }\n });\n}\n\nexport function lowerVersionFirst(a: Version, b: Version) {\n return a._cfg.version - b._cfg.version;\n}\n\nexport function runUpgraders(db: Dexie, oldVersion: number, idbUpgradeTrans: IDBTransaction, reject) {\n const globalSchema = db._dbSchema;\n if (idbUpgradeTrans.objectStoreNames.contains('$meta') && !globalSchema.$meta) {\n globalSchema.$meta = createTableSchema(\"$meta\", parseIndexSyntax(\"\")[0], []);\n db._storeNames.push('$meta');\n }\n const trans = db._createTransaction('readwrite', db._storeNames, globalSchema);\n trans.create(idbUpgradeTrans);\n trans._completion.catch(reject);\n const rejectTransaction = trans._reject.bind(trans);\n const transless = PSD.transless || PSD;\n newScope(() => {\n PSD.trans = trans;\n PSD.transless = transless;\n if (oldVersion === 0) {\n // Create tables:\n keys(globalSchema).forEach(tableName => {\n createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes);\n });\n generateMiddlewareStacks(db, idbUpgradeTrans);\n Promise.follow(() => db.on.populate.fire(trans)).catch(rejectTransaction);\n } else {\n generateMiddlewareStacks(db, idbUpgradeTrans);\n return getExistingVersion(db, trans, oldVersion)\n .then(oldVersion => updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans))\n .catch(rejectTransaction);\n }\n });\n}\n\nexport type UpgradeQueueItem = (idbtrans: IDBTransaction) => PromiseLike | void;\n\nexport function patchCurrentVersion(db: Dexie, idbUpgradeTrans: IDBTransaction) {\n createMissingTables(db._dbSchema, idbUpgradeTrans);\n if (idbUpgradeTrans.db.version % 10 === 0 && !idbUpgradeTrans.objectStoreNames.contains('$meta')) {\n // Rolled over to the next 10-ies due to many schema upgrades without bumping version.\n // No problem! We pin the database to its expected version by adding the $meta table so that next\n // time the programmer bumps the version and attaches, an upgrader, that upgrader will indeed run,\n // as well any further upgraders coming after that.\n idbUpgradeTrans.db.createObjectStore('$meta').add(Math.ceil((idbUpgradeTrans.db.version / 10) - 1), 'version');\n }\n const globalSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n adjustToExistingIndexNames(db, db._dbSchema, idbUpgradeTrans);\n const diff = getSchemaDiff(globalSchema, db._dbSchema);\n for (const tableChange of diff.change) {\n if (tableChange.change.length || tableChange.recreate) {\n console.warn(`Unable to patch indexes of table ${tableChange.name} because it has changes on the type of index or primary key.`);\n return;\n }\n const store = idbUpgradeTrans.objectStore(tableChange.name);\n tableChange.add.forEach(idx => {\n if (debug) console.debug(`Dexie upgrade patch: Creating missing index ${tableChange.name}.${idx.src}`);\n addIndex(store, idx);\n });\n }\n}\n\nfunction getExistingVersion(db: Dexie, trans: Transaction, oldVersion: number): PromiseExtended {\n // In normal case, existing version is the native installed version divided by 10.\n // However, in case more than 10 schema changes have been made on the same version (such as while\n // developing an app), the native version may have passed beyond a multiple of 10 within the same version.\n // When that happens, a table $meta will have been created, containing a single entry with key \"version\"\n // and the value of the real old version to use when running upgraders going forward.\n if (trans.storeNames.includes('$meta')) {\n return trans.table('$meta').get('version').then(metaVersion => {\n return metaVersion != null ? metaVersion : oldVersion\n })\n } else {\n return Promise.resolve(oldVersion);\n }\n}\n\nfunction updateTablesAndIndexes(\n db: Dexie,\n oldVersion: number,\n trans: Transaction,\n idbUpgradeTrans: IDBTransaction)\n{\n // Upgrade version to version, step-by-step from oldest to newest version.\n // Each transaction object will contain the table set that was current in that version (but also not-yet-deleted tables from its previous version)\n const queue: UpgradeQueueItem[] = [];\n const versions = db._versions;\n let globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n let anyContentUpgraderHasRun = false;\n \n const versToRun = versions.filter(v => v._cfg.version >= oldVersion);\n if (versToRun.length === 0) {\n // Important not to continue at this point.\n // Coming here means we've already patched schema in patchCurrentVersion() after having\n // incremented native version to a value above the declared highest version.\n // When being in this mode, it means that there might be different versions the db competing\n // about it with different version of the schema. Therefore, we must avoid deleting tables\n // or indexes here so that both versions can co-exist until the application has been upgraded to\n // a version that declares no lower than the native version.\n // If after that, a downgrade happens again, we'll end up here again, accepting both versions\n // And we'll stay in this state until app developer releases a new declared version.\n return Promise.resolve(); \n }\n \n versToRun.forEach(version => {\n queue.push(() => {\n const oldSchema = globalSchema;\n const newSchema = version._cfg.dbschema;\n adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans);\n adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans);\n\n globalSchema = db._dbSchema = newSchema;\n\n const diff = getSchemaDiff(oldSchema, newSchema);\n // Add tables \n diff.add.forEach(tuple => {\n createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes);\n });\n // Change tables\n diff.change.forEach(change => {\n if (change.recreate) {\n throw new exceptions.Upgrade(\"Not yet support for changing primary key\");\n } else {\n const store = idbUpgradeTrans.objectStore(change.name);\n // Add indexes\n change.add.forEach(idx => addIndex(store, idx));\n // Update indexes\n change.change.forEach(idx => {\n store.deleteIndex(idx.name);\n addIndex(store, idx);\n });\n // Delete indexes\n change.del.forEach(idxName => store.deleteIndex(idxName));\n }\n });\n\n const contentUpgrade = version._cfg.contentUpgrade;\n\n if (contentUpgrade && version._cfg.version > oldVersion) {\n // Update db.core with new tables and indexes:\n generateMiddlewareStacks(db, idbUpgradeTrans);\n trans._memoizedTables = {}; // Invalidate memoization as transaction shape may change between versions.\n\n anyContentUpgraderHasRun = true;\n\n // Add to-be-deleted tables to contentUpgrade transaction\n let upgradeSchema = shallowClone(newSchema);\n diff.del.forEach(table => {\n upgradeSchema[table] = oldSchema[table];\n });\n\n // Safe to affect Transaction.prototype globally in this moment,\n // because when this code runs, there may not be any other code\n // that can access any transaction instance, else than this particular\n // upgrader function.\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema), upgradeSchema);\n trans.schema = upgradeSchema;\n\n // Support for native async await.\n const contentUpgradeIsAsync = isAsyncFunction(contentUpgrade);\n if (contentUpgradeIsAsync) {\n incrementExpectedAwaits();\n }\n \n let returnValue: any;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = contentUpgrade(trans);\n if (returnValue) {\n if (contentUpgradeIsAsync) {\n // contentUpgrade is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n }\n }\n });\n return (returnValue && typeof returnValue.then === 'function' ?\n Promise.resolve(returnValue) : promiseFollowed.then(()=>returnValue));\n }\n });\n queue.push(idbtrans => {\n const newSchema = version._cfg.dbschema;\n // Delete old tables\n deleteRemovedTables(newSchema, idbtrans);\n // Restore the final API\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema);\n trans.schema = db._dbSchema;\n });\n // Maintain the $meta table after this version's tables and indexes has been created and content upgraders have run.\n queue.push(idbtrans => {\n if (db.idbdb.objectStoreNames.contains('$meta')) {\n if (Math.ceil(db.idbdb.version / 10) === version._cfg.version) {\n // Remove $meta table if it's no more needed - we are in line with the native version\n db.idbdb.deleteObjectStore('$meta');\n delete db._dbSchema.$meta;\n db._storeNames = db._storeNames.filter(name => name !== '$meta');\n } else {\n // We're still not in line with the native version. Make sure to update the virtual version\n // to the successfully run version\n idbtrans.objectStore('$meta').put(version._cfg.version, 'version');\n }\n }\n }); \n });\n\n // Now, create a queue execution engine\n function runQueue() {\n return queue.length ? Promise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) :\n Promise.resolve();\n }\n\n return runQueue().then(() => {\n createMissingTables(globalSchema, idbUpgradeTrans); // At last, make sure to create any missing tables. (Needed by addons that add stores to DB without specifying version)\n });\n}\n\nexport interface SchemaDiff {\n del: string[],\n add: [string, TableSchema][];\n change: TableSchemaDiff[];\n}\n\nexport interface TableSchemaDiff {\n name: string,\n recreate: boolean,\n del: string[],\n add: IndexSpec[],\n change: IndexSpec[]\n}\n\nexport function getSchemaDiff(oldSchema: DbSchema, newSchema: DbSchema): SchemaDiff {\n const diff: SchemaDiff = {\n del: [], // Array of table names\n add: [], // Array of [tableName, newDefinition]\n change: [] // Array of {name: tableName, recreate: newDefinition, del: delIndexNames, add: newIndexDefs, change: changedIndexDefs}\n };\n let table: string;\n for (table in oldSchema) {\n if (!newSchema[table]) diff.del.push(table);\n }\n for (table in newSchema) {\n const oldDef = oldSchema[table],\n newDef = newSchema[table];\n if (!oldDef) {\n diff.add.push([table, newDef]);\n } else {\n const change = {\n name: table,\n def: newDef,\n recreate: false,\n del: [],\n add: [],\n change: []\n };\n if (\n (\n // compare keyPaths no matter if string or string[]\n // compare falsy keypaths same no matter if they are null or empty string.\n ''+(oldDef.primKey.keyPath||'')\n ) !== (\n ''+(newDef.primKey.keyPath||'')\n ) ||\n // Compare the autoIncrement flag also\n (oldDef.primKey.auto !== newDef.primKey.auto))\n {\n // Primary key has changed. Remove and re-add table.\n change.recreate = true;\n diff.change.push(change);\n } else {\n // Same primary key. Just find out what differs:\n const oldIndexes = oldDef.idxByName;\n const newIndexes = newDef.idxByName;\n let idxName: string;\n for (idxName in oldIndexes) {\n if (!newIndexes[idxName]) change.del.push(idxName);\n }\n for (idxName in newIndexes) {\n const oldIdx = oldIndexes[idxName],\n newIdx = newIndexes[idxName];\n if (!oldIdx) change.add.push(newIdx);\n else if (oldIdx.src !== newIdx.src) change.change.push(newIdx);\n }\n if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) {\n diff.change.push(change);\n }\n }\n }\n }\n return diff;\n}\n\nexport function createTable(\n idbtrans: IDBTransaction,\n tableName: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n) {\n const store = idbtrans.db.createObjectStore(\n tableName,\n primKey.keyPath ?\n { keyPath: primKey.keyPath, autoIncrement: primKey.auto } :\n { autoIncrement: primKey.auto }\n );\n indexes.forEach(idx => addIndex(store, idx));\n return store;\n}\n\nexport function createMissingTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n keys(newSchema).forEach(tableName => {\n if (!idbtrans.db.objectStoreNames.contains(tableName)) {\n if (debug) console.debug('Dexie: Creating missing table', tableName);\n createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes);\n }\n });\n}\n\nexport function deleteRemovedTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n [].slice.call(idbtrans.db.objectStoreNames).forEach(storeName =>\n newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName));\n}\n\nexport function addIndex(store: IDBObjectStore, idx: IndexSpec) {\n store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi });\n}\n\nfunction buildGlobalSchema(\n db: Dexie,\n idbdb: IDBDatabase,\n tmpTrans: IDBTransaction\n) {\n const globalSchema = {};\n const dbStoreNames = slice(idbdb.objectStoreNames, 0);\n dbStoreNames.forEach(storeName => {\n const store = tmpTrans.objectStore(storeName);\n let keyPath = store.keyPath;\n const primKey = createIndexSpec(\n nameFromKeyPath(keyPath),\n keyPath || \"\",\n true,\n false,\n !!store.autoIncrement,\n keyPath && typeof keyPath !== \"string\",\n true\n );\n const indexes: IndexSpec[] = [];\n for (let j = 0; j < store.indexNames.length; ++j) {\n const idbindex = store.index(store.indexNames[j]);\n keyPath = idbindex.keyPath;\n var index = createIndexSpec(\n idbindex.name,\n keyPath,\n !!idbindex.unique,\n !!idbindex.multiEntry,\n false,\n keyPath && typeof keyPath !== \"string\",\n false\n );\n indexes.push(index);\n }\n globalSchema[storeName] = createTableSchema(storeName, primKey, indexes);\n });\n return globalSchema;\n}\n\nexport function readGlobalSchema(db: Dexie, idbdb: IDBDatabase, tmpTrans: IDBTransaction) {\n db.verno = idbdb.version / 10;\n const globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans);\n db._storeNames = slice(idbdb.objectStoreNames, 0);\n setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema);\n}\n\nexport function verifyInstalledSchema(db: Dexie, tmpTrans: IDBTransaction): boolean {\n const installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans);\n const diff = getSchemaDiff(installedSchema, db._dbSchema);\n return !(diff.add.length || diff.change.some(ch => ch.add.length || ch.change.length));\n}\n\nexport function adjustToExistingIndexNames(db: Dexie, schema: DbSchema, idbtrans: IDBTransaction) {\n // Issue #30 Problem with existing db - adjust to existing index names when migrating from non-dexie db\n const storeNames = idbtrans.db.objectStoreNames;\n\n for (let i = 0; i < storeNames.length; ++i) {\n const storeName = storeNames[i];\n const store = idbtrans.objectStore(storeName);\n db._hasGetAll = 'getAll' in store;\n\n for (let j = 0; j < store.indexNames.length; ++j) {\n const indexName = store.indexNames[j];\n const keyPath = store.index(indexName).keyPath;\n const dexieName = typeof keyPath === 'string' ? keyPath : \"[\" + slice(keyPath).join('+') + \"]\";\n if (schema[storeName]) {\n const indexSpec = schema[storeName].idxByName[dexieName];\n if (indexSpec) {\n indexSpec.name = indexName;\n delete schema[storeName].idxByName[dexieName];\n schema[storeName].idxByName[indexName] = indexSpec;\n }\n }\n }\n }\n\n // Bug with getAll() on Safari ver<604 on Workers only, see discussion following PR #579\n if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604)\n {\n db._hasGetAll = false;\n }\n}\n\nexport function parseIndexSyntax(primKeyAndIndexes: string): IndexSpec[] {\n return primKeyAndIndexes.split(',').map((index, indexNum) => {\n index = index.trim();\n const name = index.replace(/([&*]|\\+\\+)/g, \"\"); // Remove \"&\", \"++\" and \"*\"\n // Let keyPath of \"[a+b]\" be [\"a\",\"b\"]:\n const keyPath = /^\\[/.test(name) ? name.match(/^\\[(.*)\\]$/)[1].split('+') : name;\n\n return createIndexSpec(\n name,\n keyPath || null,\n /\\&/.test(index),\n /\\*/.test(index),\n /\\+\\+/.test(index),\n isArray(keyPath),\n indexNum === 0\n );\n });\n}\n","import { Version as IVersion } from '../../public/types/version';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { extend, keys } from '../../functions/utils';\nimport { Dexie } from '../dexie';\nimport { Transaction } from '../transaction';\nimport { removeTablesApi, setApiOnPlace, parseIndexSyntax } from './schema-helpers';\nimport { exceptions } from '../../errors';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\n\n/** class Version\n *\n * https://dexie.org/docs/Version/Version\n */\nexport class Version implements IVersion {\n db: Dexie;\n _cfg: {\n version: number,\n storesSource: { [tableName: string]: string | null },\n dbschema: DbSchema,\n tables: {},\n contentUpgrade: Function | null\n }\n\n _parseStoresSpec(stores: { [tableName: string]: string | null }, outSchema: DbSchema): any {\n keys(stores).forEach(tableName => {\n if (stores[tableName] !== null) {\n var indexes = parseIndexSyntax(stores[tableName]);\n var primKey = indexes.shift();\n primKey.unique = true;\n if (primKey.multi) throw new exceptions.Schema(\"Primary key cannot be multi-valued\");\n indexes.forEach(idx => {\n if (idx.auto) throw new exceptions.Schema(\"Only primary key can be marked as autoIncrement (++)\");\n if (!idx.keyPath) throw new exceptions.Schema(\"Index must have a name and cannot be an empty string\");\n });\n outSchema[tableName] = createTableSchema(tableName, primKey, indexes);\n }\n });\n }\n\n stores(stores: { [key: string]: string | null; }): IVersion {\n const db = this.db;\n this._cfg.storesSource = this._cfg.storesSource ?\n extend(this._cfg.storesSource, stores) :\n stores;\n const versions = db._versions;\n\n // Derive stores from earlier versions if they are not explicitely specified as null or a new syntax.\n const storesSpec: { [key: string]: string; } = {};\n let dbschema = {};\n versions.forEach(version => { // 'versions' is always sorted by lowest version first.\n extend(storesSpec, version._cfg.storesSource);\n dbschema = (version._cfg.dbschema = {});\n version._parseStoresSpec(storesSpec, dbschema);\n });\n // Update the latest schema to this version\n db._dbSchema = dbschema;\n // Update APIs\n removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]);\n setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema);\n db._storeNames = keys(dbschema);\n return this;\n }\n\n upgrade(upgradeFunction: (trans: Transaction) => PromiseLike | void): Version {\n this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction);\n return this;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Version } from './version';\n\nexport interface VersionConstructor {\n new(versionNumber: number): Version;\n prototype: Version;\n}\n\n/** Generates a Version constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createVersionConstructor(db: Dexie) {\n return makeClassConstructor(\n Version.prototype,\n\n function Version(this: Version, versionNumber: number) {\n this.db = db;\n this._cfg = {\n version: versionNumber,\n storesSource: null,\n dbschema: {},\n tables: {},\n contentUpgrade: null\n };\n });\n\n}\n","import { Dexie } from \"../classes/dexie/dexie\";\nimport { Table } from \"../public/types/table\";\nimport { DBNAMES_DB } from \"../globals/constants\";\nimport { DexieDOMDependencies } from \"../public/types/dexie-dom-dependencies\";\nimport { nop } from \"../functions/chaining-functions\";\n\ntype IDBKeyNamesVar = typeof IDBKeyRange;\n\nfunction getDbNamesTable(indexedDB: IDBFactory, IDBKeyRange: IDBKeyNamesVar) {\n let dbNamesDB = indexedDB[\"_dbNamesDB\"];\n if (!dbNamesDB) {\n dbNamesDB = indexedDB[\"_dbNamesDB\"] = new Dexie(DBNAMES_DB, {\n addons: [],\n indexedDB,\n IDBKeyRange,\n });\n dbNamesDB.version(1).stores({ dbnames: \"name\" });\n }\n return dbNamesDB.table(\"dbnames\") as Table<{ name: string }, string>;\n}\n\nfunction hasDatabasesNative(indexedDB: IDBFactory) {\n return indexedDB && typeof indexedDB.databases === \"function\";\n}\n\nexport function getDatabaseNames({\n indexedDB,\n IDBKeyRange,\n}: DexieDOMDependencies) {\n return hasDatabasesNative(indexedDB)\n ? Promise.resolve(indexedDB.databases()).then((infos) =>\n infos\n // Select name prop of infos:\n .map((info) => info.name)\n // Filter out DBNAMES_DB as previous Dexie or browser version would not have included it in the result.\n .filter((name) => name !== DBNAMES_DB)\n )\n : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys();\n}\n\nexport function _onDatabaseCreated(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).put({name}).catch(nop);\n}\n\nexport function _onDatabaseDeleted(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop);\n}\n","import { newScope } from '../../helpers/promise';\nimport { PSD } from '../../helpers/promise';\n\nexport function vip (fn) {\n // To be used by subscribers to the on('ready') event.\n // This will let caller through to access DB even when it is blocked while the db.ready() subscribers are firing.\n // This would have worked automatically if we were certain that the Provider was using Dexie.Promise for all asyncronic operations. The promise PSD\n // from the provider.connect() call would then be derived all the way to when provider would call localDatabase.applyChanges(). But since\n // the provider more likely is using non-promise async APIs or other thenable implementations, we cannot assume that.\n // Note that this method is only useful for on('ready') subscribers that is returning a Promise from the event. If not using vip()\n // the database could deadlock since it wont open until the returned Promise is resolved, and any non-VIPed operation started by\n // the caller will not resolve until database is opened.\n return newScope(function () {\n PSD.letThrough = true; // Make sure we are let through if still blocking db due to onready is firing.\n return fn();\n });\n}\n\n","/**\n * Work around Safari 14 IndexedDB open bug.\n *\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up. https://bugs.webkit.org/show_bug.cgi?id=226547\n * The only solution is to keep nudging it until it's awake.\n */\nfunction idbReady() {\n var isSafari = !navigator.userAgentData &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\//.test(navigator.userAgent);\n // No point putting other browsers or older versions of Safari through this mess.\n if (!isSafari || !indexedDB.databases)\n return Promise.resolve();\n var intervalId;\n return new Promise(function (resolve) {\n var tryIdb = function () { return indexedDB.databases().finally(resolve); };\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(function () { return clearInterval(intervalId); });\n}\n\nexport default idbReady;\n","import { cmp } from \"../functions/cmp\";\nimport { extend, iteratorSymbol, props } from '../functions/utils';\nimport { IndexableType } from '../public';\nimport {\n EmptyRange,\n IntervalTree,\n IntervalTreeNode,\n RangeSetConstructor,\n RangeSetPrototype,\n} from \"../public/types/rangeset\";\n\n/* An interval tree implementation to efficiently detect overlapping ranges of queried indexes.\n *\n * https://en.wikipedia.org/wiki/Interval_tree\n * \n */\n\nfunction isEmptyRange(node: IntervalTree | {from: IndexableType, to: IndexableType}): node is EmptyRange {\n return !(\"from\" in node);\n}\n\nexport type RangeSet = RangeSetPrototype & IntervalTree;\n\nexport const RangeSet = function(fromOrTree: any, to?: any) {\n if (this) {\n // Called with new()\n extend(this, arguments.length ? {d:1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree} : {d:0});\n } else {\n // Called without new()\n const rv = new RangeSet();\n if (fromOrTree && (\"d\" in fromOrTree)) {\n extend(rv, fromOrTree);\n }\n return rv;\n }\n} as RangeSetConstructor;\n\nprops(RangeSet.prototype, {\n add(rangeSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n mergeRanges(this, rangeSet);\n return this;\n },\n addKey(key: IndexableType) {\n addRange(this, key, key);\n return this;\n },\n addKeys(keys: IndexableType[]) {\n keys.forEach(key => addRange(this, key, key));\n return this;\n },\n\n [iteratorSymbol](): Iterator {\n return getRangeSetIterator(this);\n }\n});\n\nfunction addRange(target: IntervalTree, from: IndexableType, to: IndexableType) {\n const diff = cmp(from, to);\n // cmp() returns NaN if one of the args are IDB-invalid keys.\n // Avoid storing invalid keys in rangeset:\n if (isNaN(diff)) return;\n\n // Caller is trying to add a range where from is greater than to:\n if (diff > 0) throw RangeError();\n \n if (isEmptyRange(target)) return extend(target, { from, to, d: 1 });\n const left = target.l;\n const right = target.r;\n if (cmp(to, target.from) < 0) {\n left\n ? addRange(left, from, to)\n : (target.l = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n if (cmp(from, target.to) > 0) {\n right\n ? addRange(right, from, to)\n : (target.r = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n // Now we have some kind of overlap. We will be able to merge the new range into the node or let it be swallowed.\n\n // Grow left?\n if (cmp(from, target.from) < 0) {\n target.from = from;\n target.l = null; // Cut off for now. Re-add later.\n target.d = right ? right.d + 1 : 1;\n }\n // Grow right?\n if (cmp(to, target.to) > 0) {\n target.to = to;\n target.r = null; // Cut off for now. Re-add later.\n target.d = target.l ? target.l.d + 1 : 1;\n }\n const rightWasCutOff = !target.r;\n // Re-add left?\n if (left && !target.l) {\n //Ranges to the left may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, left);\n }\n // Re-add right?\n if (right && rightWasCutOff) {\n //Ranges to the right may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, right);\n }\n}\n\nexport function mergeRanges(target: IntervalTree, newSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n function _addRangeSet(\n target: IntervalTree,\n { from, to, l, r }: IntervalTreeNode | {from: IndexableType, to: IndexableType, l?: undefined, r?: undefined}\n ) {\n addRange(target, from, to);\n if (l) _addRangeSet(target, l);\n if (r) _addRangeSet(target, r);\n }\n\n if(!isEmptyRange(newSet)) _addRangeSet(target, newSet);\n}\n\nexport function rangesOverlap(\n rangeSet1: IntervalTree,\n rangeSet2: IntervalTree\n): boolean {\n // Start iterating other from scratch.\n const i1 = getRangeSetIterator(rangeSet2);\n let nextResult1 = i1.next();\n if (nextResult1.done) return false;\n let a = nextResult1.value;\n\n // Start iterating this from start of other\n const i2 = getRangeSetIterator(rangeSet1);\n let nextResult2 = i2.next(a.from); // Start from beginning of other range\n let b = nextResult2.value;\n\n while (!nextResult1.done && !nextResult2.done) {\n if (cmp(b!.from, a.to) <= 0 && cmp(b!.to, a.from) >= 0) return true;\n cmp(a.from, b!.from) < 0\n ? (a = (nextResult1 = i1.next(b!.from)).value!) // a is behind. forward it to beginning of next b-range\n : (b = (nextResult2 = i2.next(a.from)).value); // b is behind. forward it to beginning of next a-range\n }\n return false;\n}\n\ntype RangeSetIteratorState =\n | {\n up?: RangeSetIteratorState;\n n: IntervalTreeNode;\n s: 0 | 1 | 2 | 3;\n }\n | undefined\n | null;\nexport function getRangeSetIterator(\n node: EmptyRange | IntervalTreeNode\n): Generator {\n let state: RangeSetIteratorState = isEmptyRange(node) ? null : { s: 0, n: node };\n\n return {\n next(key?) {\n const keyProvided = arguments.length > 0;\n while (state) {\n switch (state.s) {\n case 0:\n // Initial state for node.\n // Fast forward to leftmost node.\n state.s = 1;\n if (keyProvided) {\n while (state.n.l && cmp(key, state.n.from) < 0)\n state = { up: state, n: state.n.l, s: 1 };\n } else {\n while (state.n.l) state = { up: state, n: state.n.l, s: 1 };\n }\n // intentionally fall into case 1:\n case 1:\n // We're on a node where it's left part is already handled or does not exist.\n state.s = 2;\n if (!keyProvided || cmp(key, state.n.to) <= 0)\n return { value: state.n, done: false };\n case 2:\n // We've emitted our node and should continue with the right part or let parent take over from it's state 1\n if (state.n.r) {\n state.s = 3; // So when child is done, we know we're done.\n state = { up: state, n: state.n.r, s: 0 };\n continue; // Will fall in to case 0 with fast forward to left leaf of this subtree.\n }\n // intentionally fall into case 3:\n case 3:\n state = state.up;\n }\n }\n return { done: true };\n },\n } as Generator;\n}\n\nfunction rebalance(target: IntervalTreeNode) {\n const diff = (target.r?.d || 0) - (target.l?.d || 0);\n const r = diff > 1 ? \"r\" : diff < -1 ? \"l\" : \"\";\n if (r) {\n\n // Rotate (https://en.wikipedia.org/wiki/Tree_rotation)\n //\n // \n // [OLDROOT]\n // [OLDROOT.L] [NEWROOT]\n // [NEWROOT.L] [NEWROOT.R]\n //\n // Is going to become:\n //\n // \n // [NEWROOT]\n // [OLDROOT] [NEWROOT.R]\n // [OLDROOT.L] [NEWROOT.L] \n\n // * clone now has the props of OLDROOT\n // Plan:\n // * target must be given the props of NEWROOT\n // * target[l] must point to a new OLDROOT\n // * target[r] must point to NEWROOT.R\n // * OLDROOT[r] must point to NEWROOT.L\n const l = r === \"r\" ? \"l\" : \"r\"; // Support both left/right rotation\n const rootClone = { ...target };\n // We're gonna copy props from target's right node into target so that target will\n // have same range as old target[r] (instead of changing pointers, we copy values.\n // that way we do not need to adjust pointers in parents).\n const oldRootRight = target[r]; \n target.from = oldRootRight.from;\n target.to = oldRootRight.to;\n target[r] = oldRootRight[r];\n rootClone[r] = oldRootRight[l];\n target[l] = rootClone;\n rootClone.d = computeDepth(rootClone);\n }\n target.d = computeDepth(target);\n}\n\nfunction computeDepth({ r, l }: Pick) {\n return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1;\n}\n","import { cloneSimpleObjectTree, deepClone, keys, objectIsEmpty } from \"../functions/utils\";\nimport { mergeRanges, RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\n\nexport function extendObservabilitySet(\n target: ObservabilitySet,\n newSet: ObservabilitySet\n): ObservabilitySet {\n keys(newSet).forEach(part => {\n if (target[part]) mergeRanges(target[part], newSet[part]);\n else target[part] = cloneSimpleObjectTree(newSet[part]); // Somewhat faster\n });\n return target;\n}\n","import { rangesOverlap } from '../helpers/rangeset';\nimport { ObservabilitySet } from '../public/types/db-events';\n\nexport function obsSetsOverlap(os1: ObservabilitySet, os2: ObservabilitySet) {\n return os1.all || os2.all || Object.keys(os1).some(\n (key) => os2[key] && rangesOverlap(os2[key], os1[key])\n );\n}\n","import { type GlobalQueryCache } from \"../../public/types/cache\";\n\nexport const cache: GlobalQueryCache = {}\n","import { CacheEntry, TblQueryCache } from '../../public/types/cache';\nimport { ObservabilitySet } from '../../public/types/db-events';\nimport { extendObservabilitySet } from '../extend-observability-set';\nimport { obsSetsOverlap } from '../obs-sets-overlap';\nimport { cache } from './cache';\n\nlet unsignaledParts: ObservabilitySet = {};\nlet isTaskEnqueued = false;\n\nexport function signalSubscribersLazily(part: ObservabilitySet, optimistic = false) {\n extendObservabilitySet(unsignaledParts, part);\n if (!isTaskEnqueued) {\n isTaskEnqueued = true;\n setTimeout(() => {\n isTaskEnqueued = false;\n const parts = unsignaledParts;\n unsignaledParts = {};\n signalSubscribersNow(parts, false);\n }, 0);\n }\n}\n\nexport function signalSubscribersNow(\n updatedParts: ObservabilitySet,\n deleteAffectedCacheEntries = false\n) {\n const queriesToSignal = new Set<() => void>();\n if (updatedParts.all) {\n // Signal all subscribers to requery.\n for (const tblCache of Object.values(cache)) {\n collectTableSubscribers(\n tblCache,\n updatedParts,\n queriesToSignal,\n deleteAffectedCacheEntries\n );\n }\n } else {\n for (const key in updatedParts) {\n const parts = /^idb\\:\\/\\/(.*)\\/(.*)\\//.exec(key);\n if (parts) {\n const [, dbName, tableName] = parts;\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (tblCache)\n collectTableSubscribers(\n tblCache,\n updatedParts,\n queriesToSignal,\n deleteAffectedCacheEntries\n );\n }\n }\n }\n // Now when affected cache entries are removed, signal collected subscribers to requery.\n queriesToSignal.forEach((requery) => requery());\n}\n\nfunction collectTableSubscribers(\n tblCache: TblQueryCache,\n updatedParts: ObservabilitySet,\n outQueriesToSignal: Set<() => void>,\n deleteAffectedCacheEntries: boolean\n) {\n const updatedEntryLists: [string, CacheEntry[]][] = [];\n for (const [indexName, entries] of Object.entries(tblCache.queries.query)) {\n const filteredEntries: CacheEntry[] = [];\n for (const entry of entries) {\n if (obsSetsOverlap(updatedParts, entry.obsSet)) {\n // This query is affected by the mutation. Remove it from cache\n // and signal all subscribers to requery.\n entry.subscribers.forEach((requery) => outQueriesToSignal.add(requery));\n } else if (deleteAffectedCacheEntries) {\n filteredEntries.push(entry);\n }\n }\n // Collect cache entries to be updated\n if (deleteAffectedCacheEntries)\n updatedEntryLists.push([indexName, filteredEntries]);\n }\n if (deleteAffectedCacheEntries) {\n for (const [indexName, filteredEntries] of updatedEntryLists) {\n tblCache.queries.query[indexName] = filteredEntries;\n }\n }\n}\n","import { Dexie } from './dexie';\nimport * as Debug from '../../helpers/debug';\nimport { rejection } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { eventRejectHandler, preventDefault } from '../../functions/event-wrappers';\nimport Promise, { wrap } from '../../helpers/promise';\nimport { connections } from '../../globals/constants';\nimport { runUpgraders, readGlobalSchema, adjustToExistingIndexNames, verifyInstalledSchema, patchCurrentVersion } from '../version/schema-helpers';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { _onDatabaseCreated } from '../../helpers/database-enumerator';\nimport { vip } from './vip';\nimport { promisableChain, nop } from '../../functions/chaining-functions';\nimport { generateMiddlewareStacks } from './generate-middleware-stacks';\nimport { slice } from '../../functions/utils';\nimport safari14Workaround from 'safari-14-idb-fix';\nimport { type ObservabilitySet } from '../../public/types/db-events';\nimport { RangeSet } from '../../helpers/rangeset';\nimport { DEXIE_STORAGE_MUTATED_EVENT_NAME, globalEvents } from '../../globals/global-events';\nimport { signalSubscribersNow } from '../../live-query/cache/signalSubscribers';\n\nexport function dexieOpen (db: Dexie) {\n const state = db._state;\n const {indexedDB} = db._deps;\n if (state.isBeingOpened || db.idbdb)\n return state.dbReadyPromise.then(() => state.dbOpenError ?\n rejection (state.dbOpenError) :\n db);\n state.isBeingOpened = true;\n state.dbOpenError = null;\n state.openComplete = false;\n const openCanceller = state.openCanceller;\n let nativeVerToOpen = Math.round(db.verno * 10);\n let schemaPatchMode = false;\n\n function throwIfCancelled() {\n // If state.openCanceller object reference is replaced, it means db.close() has been called,\n // meaning this open flow should be cancelled.\n if (state.openCanceller !== openCanceller) throw new exceptions.DatabaseClosed('db.open() was cancelled');\n }\n \n // Function pointers to call when the core opening process completes.\n let resolveDbReady = state.dbReadyResolve,\n // upgradeTransaction to abort on failure.\n upgradeTransaction: (IDBTransaction | null) = null,\n wasCreated = false;\n\n const tryOpenDB = () => new Promise((resolve, reject) => {\n throwIfCancelled();\n // If no API, throw!\n if (!indexedDB) throw new exceptions.MissingAPI();\n const dbName = db.name;\n \n const req = state.autoSchema || !nativeVerToOpen ?\n indexedDB.open(dbName) :\n indexedDB.open(dbName, nativeVerToOpen);\n if (!req) throw new exceptions.MissingAPI(); // May happen in Safari private mode, see https://github.com/dfahlander/Dexie.js/issues/134\n req.onerror = eventRejectHandler(reject);\n req.onblocked = wrap(db._fireOnBlocked);\n req.onupgradeneeded = wrap (e => {\n upgradeTransaction = req.transaction;\n if (state.autoSchema && !db._options.allowEmptyDB) { // Unless an addon has specified db._allowEmptyDB, lets make the call fail.\n // Caller did not specify a version or schema. Doing that is only acceptable for opening alread existing databases.\n // If onupgradeneeded is called it means database did not exist. Reject the open() promise and make sure that we\n // do not create a new database by accident here.\n req.onerror = preventDefault; // Prohibit onabort error from firing before we're done!\n upgradeTransaction.abort(); // Abort transaction (would hope that this would make DB disappear but it doesnt.)\n // Close database and delete it.\n req.result.close();\n const delreq = indexedDB.deleteDatabase(dbName); // The upgrade transaction is atomic, and javascript is single threaded - meaning that there is no risk that we delete someone elses database here!\n delreq.onsuccess = delreq.onerror = wrap(() => {\n reject (new exceptions.NoSuchDatabase(`Database ${dbName} doesnt exist`));\n });\n } else {\n upgradeTransaction.onerror = eventRejectHandler(reject);\n const oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; // Safari 8 fix.\n wasCreated = oldVer < 1;\n db.idbdb = req.result;\n if (schemaPatchMode) {\n patchCurrentVersion(db, upgradeTransaction);\n }\n runUpgraders(db, oldVer / 10, upgradeTransaction, reject);\n }\n }, reject);\n \n req.onsuccess = wrap (() => {\n // Core opening procedure complete. Now let's just record some stuff.\n upgradeTransaction = null;\n const idbdb = db.idbdb = req.result;\n\n const objectStoreNames = slice(idbdb.objectStoreNames);\n if (objectStoreNames.length > 0) try {\n const tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly');\n if (state.autoSchema) readGlobalSchema(db, idbdb, tmpTrans);\n else {\n adjustToExistingIndexNames(db, db._dbSchema, tmpTrans);\n if (!verifyInstalledSchema(db, tmpTrans) && !schemaPatchMode) {\n console.warn(`Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this.`);\n idbdb.close();\n nativeVerToOpen = idbdb.version + 1;\n schemaPatchMode = true;\n return resolve (tryOpenDB()); // Try again with new version (nativeVerToOpen\n }\n }\n generateMiddlewareStacks(db, tmpTrans);\n } catch (e) {\n // Safari 8 may bail out if > 1 store names. However, this shouldnt be a showstopper. Issue #120.\n // BUGBUG: It will bail out anyway as of Dexie 3.\n // Should we support Safari 8 anymore? Believe all\n // Dexie users use the shim for that platform anyway?!\n // If removing Safari 8 support, go ahead and remove the safariMultiStoreFix() function\n // as well as absurd upgrade version quirk for Safari.\n }\n \n connections.push(db); // Used for emulating versionchange event on IE/Edge/Safari.\n \n idbdb.onversionchange = wrap(ev => {\n state.vcFired = true; // detect implementations that not support versionchange (IE/Edge/Safari)\n db.on(\"versionchange\").fire(ev);\n });\n \n idbdb.onclose = wrap(ev => {\n db.on(\"close\").fire(ev);\n });\n\n if (wasCreated) _onDatabaseCreated(db._deps, dbName);\n\n resolve();\n\n }, reject);\n }).catch(err => {\n switch (err?.name) {\n case \"UnknownError\":\n if (state.PR1398_maxLoop > 0) {\n // Bug in Chrome after clearing site data\n // https://github.com/dexie/Dexie.js/issues/543#issuecomment-1795736695\n state.PR1398_maxLoop--;\n console.warn('Dexie: Workaround for Chrome UnknownError on open()');\n return tryOpenDB();\n }\n break;\n case \"VersionError\":\n if (nativeVerToOpen > 0) {\n nativeVerToOpen = 0;\n return tryOpenDB();\n }\n break;\n }\n return Promise.reject(err);\n });\n \n // safari14Workaround = Workaround by jakearchibald for new nasty bug in safari 14.\n return Promise.race([\n openCanceller,\n (typeof navigator === 'undefined' ? Promise.resolve() : safari14Workaround()).then(tryOpenDB)\n ]).then(() => {\n // Before finally resolving the dbReadyPromise and this promise,\n // call and await all on('ready') subscribers:\n // Dexie.vip() makes subscribers able to use the database while being opened.\n // This is a must since these subscribers take part of the opening procedure.\n throwIfCancelled();\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>db.on.ready.fire(db.vip))).then(function fireRemainders() {\n if (state.onReadyBeingFired.length > 0) {\n // In case additional subscribers to db.on('ready') were added during the time db.on.ready.fire was executed.\n let remainders = state.onReadyBeingFired.reduce(promisableChain, nop);\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>remainders(db.vip))).then(fireRemainders)\n }\n });\n }).finally(()=>{\n if (state.openCanceller === openCanceller) {\n // Only modify state if not cancelled in the mean time.\n state.onReadyBeingFired = null;\n state.isBeingOpened = false;\n }\n }).catch(err => {\n state.dbOpenError = err; // Record the error. It will be used to reject further promises of db operations.\n try {\n // Did we fail within onupgradeneeded? Make sure to abort the upgrade transaction so it doesnt commit.\n upgradeTransaction && upgradeTransaction.abort();\n } catch { }\n if (openCanceller === state.openCanceller) {\n // Still in the same open flow - The error reason was not due to external call to db.close().\n // Make sure to call db.close() to finalize resources.\n db._close(); // Closes and resets idbdb, removes connections, resets dbReadyPromise and openCanceller so that a later db.open() is fresh.\n }\n return rejection (err);\n }).finally(()=>{\n state.openComplete = true;\n resolveDbReady(); // dbReadyPromise is resolved no matter if open() rejects or resolved. It's just to wake up waiters.\n }).then(()=>{\n if (wasCreated) {\n // Propagate full range on primary keys and indexes on all tables now that the DB is ready and opened,\n // and all upgraders and on('ready') subscribers have run.\n const everything: ObservabilitySet = {};\n db.tables.forEach(table => {\n table.schema.indexes.forEach(idx => {\n if (idx.name) everything[`idb://${db.name}/${table.name}/${idx.name}`] = new RangeSet(-Infinity, [[[]]]);\n });\n everything[`idb://${db.name}/${table.name}/`] = everything[`idb://${db.name}/${table.name}/:dels`] = new RangeSet(-Infinity, [[[]]]);\n });\n // Database was created. If another tab had it open when it was deleted and reopened, that tab must be updated now.\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME).fire(everything);\n // Wipe the cache and trigger optimistic queries:\n signalSubscribersNow(everything, true);\n }\n // Resolve the db.open() with the db instance.\n return db;\n });\n}\n","import { isArray } from '../functions/utils';\n\nexport function awaitIterator (iterator: Iterator) {\n var callNext = result => iterator.next(result),\n doThrow = error => iterator.throw(error),\n onSuccess = step(callNext),\n onError = step(doThrow);\n\n function step(getNext: (any)=>any) {\n return (val?) => {\n var next = getNext(val),\n value = next.value;\n\n return next.done ? value :\n (!value || typeof value.then !== 'function' ?\n isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) :\n value.then(onSuccess, onError));\n };\n }\n\n return step(callNext)();\n}\n","import { TransactionMode } from '../../public/types/transaction-mode';\nimport { errnames, exceptions } from '../../errors';\nimport { flatten, isAsyncFunction } from '../../functions/utils';\nimport { Dexie } from './dexie';\nimport { Transaction } from '../transaction';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise, {\n PSD,\n NativePromise,\n decrementExpectedAwaits,\n rejection,\n incrementExpectedAwaits\n} from '../../helpers/promise';\n\nexport function extractTransactionArgs(mode: TransactionMode, _tableArgs_, scopeFunc) {\n // Let table arguments be all arguments between mode and last argument.\n var i = arguments.length;\n if (i < 2) throw new exceptions.InvalidArgument(\"Too few arguments\");\n // Prevent optimzation killer (https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments)\n // and clone arguments except the first one into local var 'args'.\n var args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n // Let scopeFunc be the last argument and pop it so that args now only contain the table arguments.\n scopeFunc = args.pop();\n var tables = flatten(args); // Support using array as middle argument, or a mix of arrays and non-arrays.\n return [mode, tables, scopeFunc];\n}\n\nexport function enterTransactionScope(\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n parentTransaction: Transaction | undefined,\n scopeFunc: ()=>PromiseLike | any\n) {\n return Promise.resolve().then(() => {\n // Keep a pointer to last non-transactional PSD to use if someone calls Dexie.ignoreTransaction().\n const transless = PSD.transless || PSD;\n // Our transaction.\n //return new Promise((resolve, reject) => {\n const trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction);\n trans.explicit = true;\n // Let the transaction instance be part of a Promise-specific data (PSD) value.\n const zoneProps = {\n trans: trans,\n transless: transless\n };\n\n if (parentTransaction) {\n // Emulate transaction commit awareness for inner transaction (must 'commit' when the inner transaction has no more operations ongoing)\n trans.idbtrans = parentTransaction.idbtrans;\n } else {\n try {\n trans.create(); // Create the native transaction so that complete() or error() will trigger even if no operation is made upon it.\n // @ts-ignore Mark the idbtrans object with \"_explicit\". DBCore middleware won't have access to Dexie trans but will need to have this info.\n trans.idbtrans._explicit = true;\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db.close({disableAutoOpen: false});\n return db.open().then(() => enterTransactionScope(\n db,\n mode,\n storeNames,\n null,\n scopeFunc\n ));\n }\n return rejection(ex);\n }\n }\n\n // Support for native async await.\n const scopeFuncIsAsync = isAsyncFunction(scopeFunc);\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n\n let returnValue;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = scopeFunc.call(trans, trans);\n if (returnValue) {\n if (scopeFuncIsAsync) {\n // scopeFunc is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n } else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') {\n // scopeFunc returned an iterator with throw-support. Handle yield as await.\n returnValue = awaitIterator(returnValue);\n }\n }\n }, zoneProps);\n return (returnValue && typeof returnValue.then === 'function' ?\n // Promise returned. User uses promise-style transactions.\n Promise.resolve(returnValue).then(x => trans.active ?\n x // Transaction still active. Continue.\n : rejection(new exceptions.PrematureCommit(\n \"Transaction committed too early. See http://bit.ly/2kdckMn\")))\n // No promise returned. Wait for all outstanding promises before continuing. \n : promiseFollowed.then(() => returnValue)\n ).then(x => {\n // sub transactions don't react to idbtrans.oncomplete. We must trigger a completion:\n if (parentTransaction) trans._resolve();\n // wait for trans._completion\n // (if root transaction, this means 'complete' event. If sub-transaction, we've just fired it ourselves)\n return trans._completion.then(() => x);\n }).catch(e => {\n trans._reject(e); // Yes, above then-handler were maybe not called because of an unhandled rejection in scopeFunc!\n return rejection(e);\n });\n });\n}\n","import {\n DBCore,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryRequest,\n DBCoreRangeType,\n DBCoreOpenCursorRequest,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreTable,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { getKeyExtractor } from './get-key-extractor';\nimport { getKeyPathAlias } from './dbcore-indexeddb';\nimport { Middleware } from '../public/types/middleware';\n\ninterface VirtualIndex extends DBCoreIndex {\n /** True if this index is virtual, i.e. represents a compound index internally,\n * but makes it act as as having a subset of its keyPaths.\n */\n isVirtual: boolean;\n\n /** Number of keypaths that this index comprises. Can be 0..N.\n * Note: This is the length of the *virtual index*, not the real index.\n */\n keyLength: number;\n\n /** Number of popped keypaths from the real index.\n */\n keyTail: number;\n\n /** LowLevelIndex represents the actual IndexedDB index behind it */\n lowLevelIndex: DBCoreIndex;\n}\n\n// Move into some util:\nexport function pad (a: any | any[], value: any, count: number) {\n const result = isArray(a) ? a.slice() : [a];\n for (let i=0; i 0;\n const virtualIndex = {\n ...lowLevelIndex,\n name: isVirtual\n ? `${keyPathAlias}(virtual-from:${lowLevelIndex.name})`\n : lowLevelIndex.name,\n lowLevelIndex,\n isVirtual,\n keyTail,\n keyLength,\n extractKey: getKeyExtractor(keyPath),\n unique: !isVirtual && lowLevelIndex.unique\n };\n indexList.push(virtualIndex);\n if (!virtualIndex.isPrimaryKey) {\n allVirtualIndexes.push(virtualIndex);\n }\n if (keyLength > 1) {\n const virtualKeyPath = keyLength === 2 ?\n keyPath[0] : // This is a compound [a, b]. Add a virtual normal index a.\n keyPath.slice(0, keyLength - 1); // This is compound [a,b,c]. Add virtual compound [a,b].\n addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex);\n }\n indexList.sort((a,b) => a.keyTail - b.keyTail); // Shortest keyTail is the best one (represents real index)\n return virtualIndex;\n }\n \n const primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey);\n indexLookup[\":id\"] = [primaryKey];\n for (const index of schema.indexes) {\n addVirtualIndexes(index.keyPath, 0, index);\n }\n \n function findBestIndex(keyPath: null | string | string[]): VirtualIndex {\n const result = indexLookup[getKeyPathAlias(keyPath)];\n return result && result[0];\n }\n \n function translateRange (range: DBCoreKeyRange, keyTail: number): DBCoreKeyRange {\n return {\n type: range.type === DBCoreRangeType.Equal ?\n DBCoreRangeType.Range :\n range.type,\n lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail),\n lowerOpen: true, // doesn't matter true or false\n upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail),\n upperOpen: true // doesn't matter true or false\n };\n }\n \n function translateRequest (req: DBCoreQueryRequest): DBCoreQueryRequest;\n function translateRequest (req: DBCoreOpenCursorRequest): DBCoreOpenCursorRequest;\n function translateRequest (req: DBCoreCountRequest): DBCoreCountRequest {\n const index = req.query.index as VirtualIndex;\n return index.isVirtual ? {\n ...req,\n query: {\n index: index.lowLevelIndex,\n range: translateRange(req.query.range, index.keyTail)\n }\n } : req;\n }\n \n const result: DBCoreTable = {\n ...table,\n schema: {\n ...schema,\n primaryKey,\n indexes: allVirtualIndexes,\n getIndexByKeyPath: findBestIndex\n },\n\n count(req) {\n return table.count(translateRequest(req));\n }, \n \n query(req) {\n return table.query(translateRequest(req));\n },\n \n openCursor(req) {\n const {keyTail, isVirtual, keyLength} = (req.query.index as VirtualIndex);\n if (!isVirtual) return table.openCursor(req);\n \n function createVirtualCursor(cursor: DBCoreCursor) : DBCoreCursor {\n function _continue (key?: any) {\n key != null ?\n cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) :\n req.unique ?\n cursor.continue(\n cursor.key.slice(0, keyLength)\n .concat(req.reverse\n ? down.MIN_KEY\n : down.MAX_KEY, keyTail)\n ) :\n cursor.continue()\n }\n const virtualCursor = Object.create(cursor, {\n continue: {value: _continue},\n continuePrimaryKey: {\n value(key: any, primaryKey: any) {\n cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey);\n }\n },\n primaryKey: {\n get() {\n return cursor.primaryKey;\n }\n },\n key: {\n get() {\n const key = cursor.key as any[]; // A virtual cursor always operates on compound key\n return keyLength === 1 ?\n key[0] : // Cursor.key should not be an array.\n key.slice(0, keyLength); // Cursor.key should be first part of array.\n }\n },\n value: {\n get() {\n return cursor.value;\n }\n }\n });\n return virtualCursor;\n }\n \n return table.openCursor(translateRequest(req))\n .then(cursor => cursor && createVirtualCursor(cursor));\n }\n };\n return result;\n }\n }\n}\n\nexport const virtualIndexMiddleware : Middleware = {\n stack: \"dbcore\",\n name: \"VirtualIndexMiddleware\",\n level: 1,\n create: createVirtualIndexMiddleware\n};\n\n","import { keys, hasOwn, toStringTag } from './utils';\n\nexport function getObjectDiff(a: any, b: any, rv?: any, prfx?: string) {\n // Compares objects a and b and produces a diff object.\n rv = rv || {};\n prfx = prfx || '';\n keys(a).forEach((prop) => {\n if (!hasOwn(b, prop)) {\n // Property removed\n rv[prfx + prop] = undefined;\n } else {\n var ap = a[prop],\n bp = b[prop];\n if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) {\n const apTypeName = toStringTag(ap);\n const bpTypeName = toStringTag(bp);\n\n if (apTypeName !== bpTypeName) {\n rv[prfx + prop] = b[prop]; // Property changed to other type\n } else if (apTypeName === 'Object') {\n // Pojo objects (not Date, ArrayBuffer, Array etc). Go deep.\n getObjectDiff(ap, bp, rv, prfx + prop + '.');\n } else if (ap !== bp) {\n // Values differ.\n // Could have checked if Date, arrays or binary types have same\n // content here but I think that would be a suboptimation.\n // Prefer simplicity.\n rv[prfx + prop] = b[prop];\n }\n } else if (ap !== bp) rv[prfx + prop] = b[prop]; // Primitive value changed\n }\n });\n keys(b).forEach((prop) => {\n if (!hasOwn(a, prop)) {\n rv[prfx + prop] = b[prop]; // Property added\n }\n });\n return rv;\n}\n","import {\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreIndex,\n DBCoreTable,\n} from \"../public/types/dbcore\";\n\nexport function getEffectiveKeys (\n primaryKey: DBCoreIndex,\n req: (Pick & {keys?: any[]}) | Pick)\n{\n //const {outbound} = primaryKey;\n if (req.type === 'delete') return req.keys;\n return req.keys || req.values.map(primaryKey.extractKey)\n}\n","import {\n DBCore,\n DBCoreTable,\n DBCoreMutateResponse,\n DBCoreDeleteRangeRequest,\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreTransaction,\n DBCoreKeyRange\n} from \"../public/types/dbcore\";\nimport { nop } from '../functions/chaining-functions';\nimport { hasOwn, setByKeyPath } from '../functions/utils';\nimport { getObjectDiff } from \"../functions/get-object-diff\";\nimport { PSD } from '../helpers/promise';\n//import { LockableTableMiddleware } from '../dbcore/lockable-table-middleware';\nimport { getEffectiveKeys } from '../dbcore/get-effective-keys';\nimport { Middleware } from '../public/types/middleware';\nimport { Transaction } from '../classes/transaction';\n\nexport const hooksMiddleware: Middleware = {\n stack: \"dbcore\",\n name: \"HooksMiddleware\",\n level: 2,\n create: (downCore: DBCore) => ({\n ...downCore,\n table(tableName: string) {\n const downTable = downCore.table(tableName);\n const {primaryKey} = downTable.schema;\n \n const tableMiddleware: DBCoreTable = {\n ...downTable,\n mutate(req):Promise {\n const dxTrans = PSD.trans as Transaction;\n // Hooks can be transaction-bound. Need to grab them from transaction.table and not\n // db.table!\n const {deleting, creating, updating} = dxTrans.table(tableName).hook;\n switch (req.type) {\n case 'add':\n if (creating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'put':\n if (creating.fire === nop && updating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'delete':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'deleteRange':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>deleteRange(req), true);\n }\n // Any of the breaks above happened (no hooks) - do the default:\n return downTable.mutate(req);\n\n\n function addPutOrDelete(req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest): Promise {\n const dxTrans = PSD.trans;\n const keys = req.keys || getEffectiveKeys(primaryKey, req);\n if (!keys) throw new Error(\"Keys missing\");\n // Clone Request and set keys arg\n req = req.type === 'add' || req.type === 'put' ?\n {...req, keys} :\n {...req};\n if (req.type !== 'delete') req.values = [...req.values];\n if (req.keys) req.keys = [...req.keys];\n \n return getExistingValues(downTable, req, keys).then (existingValues => {\n const contexts = keys.map((key, i) => {\n const existingValue = existingValues[i];\n const ctx = { onerror: null, onsuccess: null };\n if (req.type === 'delete') {\n // delete operation\n deleting.fire.call(ctx, key, existingValue, dxTrans);\n } else if (req.type === 'add' || existingValue === undefined) {\n // The add() or put() resulted in a create\n const generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans);\n if (key == null && generatedPrimaryKey != null) {\n key = generatedPrimaryKey;\n req.keys[i] = key;\n if (!primaryKey.outbound) {\n setByKeyPath(req.values[i], primaryKey.keyPath, key);\n }\n }\n } else {\n // The put() operation resulted in an update\n const objectDiff = getObjectDiff(existingValue, req.values[i]);\n const additionalChanges = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans);\n if (additionalChanges) {\n const requestedValue = req.values[i];\n Object.keys(additionalChanges).forEach(keyPath => {\n if (hasOwn(requestedValue, keyPath)) {\n // keyPath is already present as a literal property of the object\n requestedValue[keyPath] = additionalChanges[keyPath];\n } else {\n // keyPath represents a new or existing path into the object\n setByKeyPath(requestedValue, keyPath, additionalChanges[keyPath]);\n }\n });\n }\n }\n return ctx;\n });\n return downTable.mutate(req).then(({failures, results, numFailures, lastResult}) => {\n for (let i=0; i {\n contexts.forEach(ctx => ctx.onerror && ctx.onerror(error));\n return Promise.reject(error);\n });\n });\n }\n \n function deleteRange(req: DBCoreDeleteRangeRequest): Promise {\n return deleteNextChunk(req.trans, req.range, 10000);\n }\n \n function deleteNextChunk(trans: DBCoreTransaction, range: DBCoreKeyRange, limit: number) {\n // Query what keys in the DB within the given range\n return downTable.query({trans, values: false, query: {index: primaryKey, range}, limit})\n .then(({result}) => {\n // Given a set of keys, bulk delete those using the same procedure as in addPutOrDelete().\n // This will make sure that deleting hook is called.\n return addPutOrDelete({type: 'delete', keys: result, trans}).then(res => {\n if (res.numFailures > 0) return Promise.reject(res.failures[0]);\n if (result.length < limit) {\n return {failures: [], numFailures: 0, lastResult: undefined} as DBCoreMutateResponse;\n } else {\n return deleteNextChunk(trans, {...range, lower: result[result.length - 1], lowerOpen: true}, limit);\n }\n });\n })\n }\n }\n };\n //const {lock, lockableMiddleware} = LockableTableMiddleware(tableMiddleware);\n\n return tableMiddleware;\n },\n }) as DBCore\n};\n\nfunction getExistingValues(\n table: DBCoreTable,\n req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest,\n effectiveKeys: any[]\n) {\n return req.type === \"add\"\n ? Promise.resolve([])\n : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: \"immutable\" });\n}\n","import { deepClone } from \"../functions/utils\";\nimport { DBCore } from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport Promise from \"../helpers/promise\";\nimport { cmp } from '../functions/cmp';\n\nexport function getFromTransactionCache(\n keys: readonly any[],\n cache: { keys: any[]; values: any[] } | undefined | null,\n clone?: boolean\n) {\n try {\n if (!cache) return null;\n if (cache.keys.length < keys.length) return null;\n const result: any[] = [];\n // Compare if the exact same order of keys was retrieved in same transaction:\n // Allow some cached keys to be omitted from provided set of keys\n // Use case: 1. getMany(keys) 2. update a subset of those 3. call put with the updated ones ==> middlewares should be able to find old values\n for (let i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) {\n if (cmp(cache.keys[i], keys[j]) !== 0) continue;\n result.push(clone ? deepClone(cache.values[i]) : cache.values[i]);\n ++j;\n }\n // If got all keys caller was looking for, return result.\n return result.length === keys.length ? result : null;\n } catch {\n return null;\n }\n}\n\nexport const cacheExistingValuesMiddleware: Middleware = {\n stack: \"dbcore\",\n level: -1,\n create: (core) => {\n return {\n table: (tableName) => {\n const table = core.table(tableName);\n return {\n ...table,\n getMany: (req) => {\n if (!req.cache) {\n return table.getMany(req);\n }\n const cachedResult = getFromTransactionCache(\n req.keys,\n req.trans[\"_cache\"],\n req.cache === \"clone\"\n );\n if (cachedResult) {\n return Promise.resolve(cachedResult);\n }\n return table.getMany(req).then((res) => {\n req.trans[\"_cache\"] = {\n keys: req.keys,\n values: req.cache === \"clone\" ? deepClone(res) : res,\n };\n return res;\n });\n },\n mutate: (req) => {\n // Invalidate cache on any mutate except \"add\" which can't change existing values:\n if (req.type !== \"add\") req.trans[\"_cache\"] = null;\n return table.mutate(req);\n },\n };\n },\n };\n },\n};\n","import { DBCore, DBCoreTable } from '../../public/types/dbcore';\nimport { LiveQueryContext } from '../live-query';\n\nexport function isCachableContext(ctx: LiveQueryContext, table: DBCoreTable) {\n return (\n ctx.trans.mode === 'readonly' &&\n !!ctx.subscr &&\n !ctx.trans.explicit &&\n ctx.trans.db._options.cache !== 'disabled' &&\n !table.schema.primaryKey.outbound\n );\n}\n\n","import { DBCoreCountRequest, DBCoreGetManyRequest, DBCoreGetRequest, DBCoreOpenCursorRequest, DBCoreQueryRequest } from '../../public/types/dbcore';\n\n\nexport function isCachableRequest(type: string, req: Partial) {\n switch (type) {\n case 'query':\n return req.values && !req.unique;\n case 'get':\n return false;\n case 'getMany':\n return false;\n case 'count':\n return false;\n case 'openCursor':\n return false;\n }\n}\n","import { LiveQueryContext } from \".\";\nimport { getFromTransactionCache } from \"../dbcore/cache-existing-values-middleware\";\nimport { getEffectiveKeys } from \"../dbcore/get-effective-keys\";\nimport { exceptions } from \"../errors\";\nimport { cmp } from \"../functions/cmp\";\nimport { isArray, keys } from \"../functions/utils\";\nimport { PSD } from \"../helpers/promise\";\nimport { RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport {\n DBCore,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreGetManyRequest,\n DBCoreGetRequest,\n DBCoreIndex,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreQueryResponse,\n DBCoreTable,\n DBCoreTableSchema,\n DBCoreTransaction,\n} from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport { isCachableContext } from \"./cache/is-cachable-context\";\nimport { isCachableRequest } from \"./cache/is-cachable-request\";\nimport { extendObservabilitySet } from \"./extend-observability-set\";\n\nexport const observabilityMiddleware: Middleware = {\n stack: \"dbcore\",\n level: 0,\n name: \"Observability\",\n create: (core) => {\n const dbName = core.schema.name;\n const FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY);\n\n return {\n ...core,\n transaction: (stores, mode, options) => {\n if (PSD.subscr && mode !== 'readonly') {\n throw new exceptions.ReadOnly(`Readwrite transaction in liveQuery context. Querier source: ${(PSD as LiveQueryContext).querier}`);\n }\n return core.transaction(stores, mode, options);\n },\n table: (tableName) => {\n const table = core.table(tableName);\n const { schema } = table;\n const { primaryKey, indexes } = schema;\n const { extractKey, outbound } = primaryKey;\n const indexesWithAutoIncPK = primaryKey.autoIncrement && indexes.filter(\n (index) => index.compound && (index.keyPath as string[]).includes(primaryKey.keyPath as string)\n );\n const tableClone: DBCoreTable = {\n ...table,\n mutate: (req) => {\n const trans = req.trans as DBCoreTransaction & {\n mutatedParts?: ObservabilitySet;\n };\n const mutatedParts = req.mutatedParts || (req.mutatedParts = {});\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (mutatedParts[part] ||\n (mutatedParts[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n\n const { type } = req;\n let [keys, newObjs] =\n req.type === \"deleteRange\"\n ? [req.range] // keys will be an DBCoreKeyRange object - transformed later on to a [from,to]-style range.\n : req.type === \"delete\"\n ? [req.keys] // keys known already here. newObjs will be undefined.\n : req.values.length < 50\n ? [getEffectiveKeys(primaryKey, req).filter(id => id), req.values] // keys except autoIncremented - they will be added later on.\n : []; // keys and newObjs will both be undefined - changeSpec will become true (changed for entire table)\n\n const oldCache = req.trans[\"_cache\"];\n\n // Add the mutated table and optionally keys to the mutatedTables set on the transaction.\n // Used by subscribers to txcommit event and for Collection.prototype.subscribe().\n if (isArray(keys)) {\n // keys is an array - delete, add or put of less than 50 rows.\n // Individual keys (add put or delete)\n pkRangeSet.addKeys(keys);\n // Only get oldObjs if they have been cached recently\n // (This applies to Collection.modify() only, but also if updating/deleting hooks have subscribers)\n const oldObjs = type === 'delete' || keys.length === newObjs.length ? getFromTransactionCache(keys, oldCache) : null;\n\n // Supply detailed values per index for both old and new objects:\n if (!oldObjs) {\n // add, delete or put and we don't know old values.\n // Indicate this in the \":dels\" part, for the sake of count() and primaryKeys() queries only!\n delsRangeSet.addKeys(keys);\n }\n if (oldObjs || newObjs) {\n // No matter if knowning oldObjs or not, track the indices if it's a put, add or delete.\n trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs);\n }\n } else if (keys) {\n // keys is a DBCoreKeyRange object. Transform it to [from,to]-style range.\n // As we can't know deleted index ranges, mark index-based subscriptions must trigger.\n const range = { from: keys.lower, to: keys.upper };\n delsRangeSet.add(range);\n // deleteRange. keys is a DBCoreKeyRange objects. Transform it to [from,to]-style range.\n pkRangeSet.add(range);\n } else {\n // Too many requests to record the details without slowing down write performance.\n // Let's just record a generic large range on primary key, the virtual :dels index and\n // all secondary indices:\n pkRangeSet.add(FULL_RANGE);\n delsRangeSet.add(FULL_RANGE);\n schema.indexes.forEach(idx => getRangeSet(idx.name).add(FULL_RANGE));\n }\n\n return table.mutate(req).then((res) => {\n // Merge the mutated parts from the request into the transaction's mutatedParts\n // now when the request went fine.\n if (keys && (req.type === 'add' || req.type === 'put')) {\n // Less than 50 requests (keys truthy) (otherwise we've added full range anyway)\n // autoincrement means we might not have got all keys until now\n pkRangeSet.addKeys(res.results);\n if (indexesWithAutoIncPK) {\n // Dexie Issue 1946:\n // If an auto-incremented primary key is part of a compound index,\n // we need to compute the resulting value of that index after inserting\n // the rows.\n indexesWithAutoIncPK.forEach(idx => {\n // Extract values of this compound index where primary key is not yet set:\n const idxVals = req.values.map(v => idx.extractKey(v));\n // Find the position of the primary key in the index:\n const pkPos = (idx.keyPath as string[]).findIndex(prop => prop === primaryKey.keyPath);\n // Update idxVals with the resulting primary keys to complete the index value:\n res.results!.forEach(pk => idxVals[pkPos] = pk);\n // Add the updated index to the rangeset:\n getRangeSet(idx.name).addKeys(idxVals);\n });\n }\n }\n trans.mutatedParts = extendObservabilitySet (\n trans.mutatedParts || {},\n mutatedParts\n );\n return res;\n });\n },\n };\n\n const getRange: (req: any) => [DBCoreIndex, RangeSet] = ({\n query: { index, range },\n }:\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest) => [\n index,\n new RangeSet(range.lower ?? core.MIN_KEY, range.upper ?? core.MAX_KEY),\n ];\n\n const readSubscribers: {[method in\n Exclude]: \n (req: any) => [DBCoreIndex, RangeSet]\n } = {\n get: (req) => [primaryKey, new RangeSet(req.key)],\n getMany: (req) => [primaryKey, new RangeSet().addKeys(req.keys)],\n count: getRange,\n query: getRange,\n openCursor: getRange,\n }\n\n keys(readSubscribers).forEach((method: 'get' | 'getMany' | 'count' | 'query' | 'openCursor') => {\n tableClone[method] = function (\n req:\n | DBCoreGetRequest\n | DBCoreGetManyRequest\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest\n ) {\n const { subscr } = PSD as LiveQueryContext;\n const isLiveQuery = !!subscr;\n let cachable = isCachableContext(PSD as LiveQueryContext, table) && isCachableRequest(method, req);\n const obsSet = cachable\n ? req.obsSet = {} // Implicit read transaction - track changes for this query only for the request's duration\n : subscr; // Explicit read transaction - track changes across entire live query\n\n if (isLiveQuery) {\n // Current zone want's to track all queries so they can be subscribed to.\n // (The query is executed within a \"liveQuery\" zone)\n // Check whether the query applies to a certain set of ranges:\n // Track what we should be observing:\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (obsSet[part] ||\n (obsSet[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n const [queriedIndex, queriedRanges] = readSubscribers[method](req);\n // A generic rule here: queried ranges should always be subscribed to.\n if (method === 'query' && queriedIndex.isPrimaryKey && !(req as DBCoreQueryRequest).values) {\n // A pure primay-key based Collection where only .primaryKeys() is requested. Don't wakeup on other changes than added or deleted primary keys within queried range.\n delsRangeSet.add(queriedRanges);\n } else {\n getRangeSet(queriedIndex.name || \"\").add(queriedRanges);\n }\n if (!queriedIndex.isPrimaryKey) {\n // Only count(), query() and openCursor() operates on secondary indices.\n // Since put(), delete() and deleteRange() mutations may happen without knowing oldObjs,\n // the mutate() method will be missing what secondary indices that are being deleted from\n // the subscribed range. We are working around this issue by recording all the resulting\n // primary keys from the queries. This only works for those kinds of queries where we can\n // derive the primary key from the result.\n // In this block we are accomplishing this using various strategies depending on the properties\n // of the query result.\n\n if (method === \"count\") {\n // We've got a problem! Delete and put mutations happen without known the oldObjs.\n // Those mutation could change the count.\n // Solution: Dedicated \":dels\" url represends a subscription to all mutations without oldObjs\n // (specially triggered in the mutators put(), delete() and deleteRange() when they don't know oldObject)\n delsRangeSet.add(FULL_RANGE);\n } else {\n // openCursor() or query()\n\n // Prepare a keysPromise in case the we're doing an IDBIndex.getAll() on a store with outbound keys.\n const keysPromise =\n method === \"query\" &&\n outbound &&\n (req as DBCoreQueryRequest).values &&\n table.query({\n ...(req as DBCoreQueryRequest),\n values: false,\n });\n\n return table[method].apply(this, arguments).then((res) => {\n if (method === \"query\") {\n if (outbound && (req as DBCoreQueryRequest).values) {\n // If keys are outbound, we can't use extractKey to map what keys to observe.\n // We've queried an index (like 'dateTime') on an outbound table\n // and retrieve a list of objects\n // from who we cannot know their primary keys.\n // \"Luckily\" though, we've prepared the keysPromise to assist us in exact this condition.\n return keysPromise.then(\n ({ result: resultingKeys }: DBCoreQueryResponse) => {\n pkRangeSet.addKeys(resultingKeys);\n return res;\n }\n );\n }\n // query() inbound values, keys or outbound keys. Secondary indexes only since\n // for primary keys we would only add results within the already registered range.\n const pKeys = (req as DBCoreQueryRequest).values\n ? (res as DBCoreQueryResponse).result.map(extractKey)\n : (res as DBCoreQueryResponse).result;\n if ((req as DBCoreQueryRequest).values) {\n // Subscribe to any mutation made on the returned keys,\n // so that we detect both deletions and updated properties.\n pkRangeSet.addKeys(pKeys);\n } else {\n // Subscribe only to mutations on the returned keys\n // in case the mutator was unable to know oldObjs.\n // If it has oldObj, the mutator won't put anything in \":dels\" because\n // it can more fine-grained put the exact removed and added index value in the correct\n // index range that we subscribe to in the queried range sets.\n // We don't load values so a change on a property outside our index will not\n // require us to re-execute the query.\n delsRangeSet.addKeys(pKeys);\n }\n } else if (method === \"openCursor\") {\n // Caller requests a cursor.\n // For the same reason as when method===\"query\", we only need to observe\n // those keys whose values are possibly used or rendered - which could\n // only happen on keys where they get the cursor's key, primaryKey or value.\n const cursor: DBCoreCursor | null = res;\n const wantValues = (req as DBCoreOpenCursorRequest).values;\n return (\n cursor &&\n Object.create(cursor, {\n key: {\n get() {\n delsRangeSet.addKey(cursor.primaryKey);\n return cursor.key;\n },\n },\n primaryKey: {\n get() {\n const pkey = cursor.primaryKey;\n delsRangeSet.addKey(pkey);\n return pkey;\n },\n },\n value: {\n get() {\n wantValues && pkRangeSet.addKey(cursor.primaryKey);\n return cursor.value;\n },\n },\n })\n );\n }\n return res;\n });\n }\n }\n }\n return table[method].apply(this, arguments);\n };\n });\n return tableClone;\n },\n };\n },\n};\n\nfunction trackAffectedIndexes(\n getRangeSet: (index: string) => RangeSet,\n schema: DBCoreTableSchema,\n oldObjs: readonly any[] | undefined,\n newObjs: readonly any[] | undefined\n) {\n function addAffectedIndex(ix: DBCoreIndex) {\n const rangeSet = getRangeSet(ix.name || \"\");\n function extractKey(obj: any) {\n return obj != null ? ix.extractKey(obj) : null;\n }\n const addKeyOrKeys = (key: any) => ix.multiEntry && isArray(key)\n // multiEntry and the old property was an array - add each array entry to the rangeSet:\n ? key.forEach(key => rangeSet.addKey(key))\n // Not multiEntry or the old property was not an array - add each array entry to the rangeSet:\n : rangeSet.addKey(key);\n\n (oldObjs || newObjs).forEach((_, i) => {\n const oldKey = oldObjs && extractKey(oldObjs[i]);\n const newKey = newObjs && extractKey(newObjs[i]);\n if (cmp(oldKey, newKey) !== 0) {\n // The index has changed. Add both old and new value of the index.\n if (oldKey != null) addKeyOrKeys(oldKey); // If oldKey is invalid key, addKey() will be a noop.\n if (newKey != null) addKeyOrKeys(newKey); // If newKey is invalid key, addKey() will be a noop.\n }\n });\n }\n schema.indexes.forEach(addAffectedIndex);\n}\n","import { delArrayItem, isArray } from '../../functions/utils';\nimport { TblQueryCache } from '../../public/types/cache';\nimport {\n DBCoreMutateRequest,\n DBCoreMutateResponse,\n} from '../../public/types/dbcore';\n\nexport function adjustOptimisticFromFailures(\n tblCache: TblQueryCache,\n req: DBCoreMutateRequest,\n res: DBCoreMutateResponse\n): DBCoreMutateRequest {\n if (res.numFailures === 0) return req;\n if (req.type === 'deleteRange') {\n // numFailures > 0 means the deleteRange operation failed in its whole.\n return null;\n }\n\n const numBulkOps = req.keys\n ? req.keys.length\n : 'values' in req && req.values\n ? req.values.length\n : 1;\n if (res.numFailures === numBulkOps) {\n // Same number of failures as the number of ops. This means that all ops failed.\n return null;\n }\n\n const clone: DBCoreMutateRequest = { ...req };\n\n if (isArray(clone.keys)) {\n clone.keys = clone.keys.filter((_, i) => !(i in res.failures));\n }\n if ('values' in clone && isArray(clone.values)) {\n clone.values = clone.values.filter((_, i) => !(i in res.failures));\n }\n return clone;\n}\n","import { cmp } from '../../functions/cmp';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function isAboveLower(key: IndexableType, range: DBCoreKeyRange) {\n return range.lower === undefined\n ? true // lower is less than anything because it is undefined\n : range.lowerOpen\n ? cmp(key, range.lower) > 0 // lowerOpen: Exclude lower bound\n : cmp(key, range.lower) >= 0; // !lowerOpen: Include lower bound\n}\n\nexport function isBelowUpper(key: IndexableType, range: DBCoreKeyRange) {\n return range.upper === undefined\n ? true // upper is greater than anything because it is undefined\n : range.upperOpen\n ? cmp(key, range.upper) < 0 // upperOpen: Exclude upper bound\n : cmp(key, range.upper) <= 0; // !upperOpen: Include upper bound\n}\n\nexport function isWithinRange(key: IndexableType, range: DBCoreKeyRange) {\n return isAboveLower(key, range) && isBelowUpper(key, range);\n}\n","import { cmp } from '../../functions/cmp';\nimport { deepClone, isArray } from '../../functions/utils';\nimport { RangeSet, rangesOverlap } from '../../helpers/rangeset';\nimport { CacheEntry } from '../../public/types/cache';\nimport {\n DBCoreIndex,\n DBCoreMutateRequest,\n DBCoreQueryRequest,\n DBCoreTable,\n} from '../../public/types/dbcore';\nimport { isWithinRange } from './is-within-range';\n\nexport function applyOptimisticOps(\n result: any[],\n req: DBCoreQueryRequest,\n ops: DBCoreMutateRequest[] | undefined,\n table: DBCoreTable,\n cacheEntry: CacheEntry,\n immutable: boolean\n): any[] {\n if (!ops || ops.length === 0) return result;\n const index = req.query.index;\n const { multiEntry } = index;\n const queryRange = req.query.range;\n const primaryKey = table.schema.primaryKey;\n const extractPrimKey = primaryKey.extractKey!;\n const extractIndex = index.extractKey!;\n const extractLowLevelIndex = (index.lowLevelIndex || index).extractKey!;\n\n let finalResult = ops.reduce((result, op) => {\n let modifedResult = result;\n const includedValues =\n op.type === 'add' || op.type === 'put'\n ? op.values.filter((v) => {\n const key = extractIndex(v);\n return multiEntry && isArray(key) // multiEntry index work like plain index unless key is array\n ? key.some((k) => isWithinRange(k, queryRange)) // multiEntry and array key\n : isWithinRange(key, queryRange); // multiEntry but not array key\n }).map(v => {\n v = deepClone(v);// v might come from user so we can't just freeze it.\n if (immutable) Object.freeze(v);\n return v;\n })\n : [];\n switch (op.type) {\n case 'add':\n modifedResult = result.concat(\n req.values\n ? includedValues\n : includedValues.map((v) => extractPrimKey(v))\n );\n break;\n case 'put':\n const keySet = new RangeSet().addKeys(\n op.values.map((v) => extractPrimKey(v))\n );\n modifedResult = result\n .filter((item) => {\n const key = req.values ? extractPrimKey(item) : item;\n return !rangesOverlap(new RangeSet(key), keySet);\n })\n .concat(\n req.values\n ? includedValues\n : includedValues.map((v) => extractPrimKey(v))\n );\n break;\n case 'delete':\n const keysToDelete = new RangeSet().addKeys(op.keys);\n modifedResult = result.filter((item) => {\n const key = req.values ? extractPrimKey(item) : item;\n return !rangesOverlap(new RangeSet(key), keysToDelete);\n });\n\n break;\n case 'deleteRange':\n const range = op.range;\n modifedResult = result.filter((item) => !isWithinRange(extractPrimKey(item), range));\n break;\n }\n return modifedResult;\n }, result);\n\n // If no changes were made, we can return the original result.\n if (finalResult === result) return result;\n\n // Sort the result on sortIndex:\n finalResult.sort((a, b) =>\n cmp(extractLowLevelIndex(a), extractLowLevelIndex(b)) ||\n cmp(extractPrimKey(a), extractPrimKey(b))\n );\n\n // If we have a limit we need to respect it:\n if (req.limit && req.limit < Infinity) {\n if (finalResult.length > req.limit) {\n finalResult.length = req.limit; // Cut of any extras after sorting correctly.\n } else if (result.length === req.limit && finalResult.length < req.limit) {\n // We're missing some items because of the limit. We need to add them back.\n // The easiest way is to mark the cache entry as dirty, which will cause\n // it to be requeried after the write-transaction successfully completes.\n cacheEntry.dirty = true;\n }\n }\n return immutable ? Object.freeze(finalResult) as any[] : finalResult;\n}\n","import { cmp } from '../../functions/cmp';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function areRangesEqual(r1: DBCoreKeyRange, r2: DBCoreKeyRange) {\n return (\n cmp(r1.lower, r2.lower) === 0 &&\n cmp(r1.upper, r2.upper) === 0 &&\n !!r1.lowerOpen === !!r2.lowerOpen &&\n !!r1.upperOpen === !!r2.upperOpen\n );\n}\n","import { cmp } from '../../functions/cmp';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function compareLowers(lower1: any, lower2: any, lowerOpen1: boolean, lowerOpen2: boolean) {\n if (lower1 === undefined) return lower2 !== undefined ? -1 : 0;\n if (lower2 === undefined) return 1; // since lower1 !== undefined\n const c = cmp(lower1, lower2);\n if (c === 0) {\n if (lowerOpen1 && lowerOpen2) return 0;\n if (lowerOpen1) return 1\n if (lowerOpen2) return -1;\n }\n return c;\n}\n\nexport function compareUppers(upper1: any, upper2: any, upperOpen1: boolean, upperOpen2: boolean) {\n if (upper1 === undefined) return upper2 !== undefined ? 1 : 0;\n if (upper2 === undefined) return -1; // since upper1 !== undefined\n const c = cmp(upper1, upper2);\n if (c === 0) {\n if (upperOpen1 && upperOpen2) return 0;\n if (upperOpen1) return -1\n if (upperOpen2) return 1;\n }\n return c;\n}\n\nexport function isSuperRange(r1: DBCoreKeyRange, r2: DBCoreKeyRange) {\n return (\n compareLowers(r1.lower, r2.lower, r1.lowerOpen, r2.lowerOpen) <= 0 &&\n compareUppers(r1.upper, r2.upper, r1.upperOpen, r2.upperOpen) >= 0\n );\n}","import { CacheEntry, TblQueryCache } from '../../public/types/cache';\nimport {\n DBCoreCountRequest,\n DBCoreQueryRequest,\n} from '../../public/types/dbcore';\nimport { areRangesEqual } from './are-ranges-equal';\nimport { cache } from './cache';\nimport { isSuperRange } from './is-super-range';\n\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'query',\n req: DBCoreQueryRequest\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]];\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'count',\n req: DBCoreCountRequest\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]];\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'query' | 'count',\n req: Partial & Partial\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]] {\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (!tblCache) return [];\n const queries = tblCache.queries[type];\n if (!queries) return [null, false, tblCache, null];\n const indexName = req.query ? req.query.index.name : null;\n const entries = queries[indexName || ''];\n if (!entries) return [null, false, tblCache, null];\n\n switch (type) {\n case 'query':\n const equalEntry = entries.find(\n (entry) =>\n (entry.req as DBCoreQueryRequest).limit === req.limit &&\n (entry.req as DBCoreQueryRequest).values === req.values &&\n areRangesEqual(entry.req.query.range, req.query.range)\n );\n if (equalEntry)\n return [\n equalEntry,\n true, // exact match\n tblCache,\n entries,\n ];\n const superEntry = entries.find((entry) => {\n const limit = 'limit' in entry.req ? entry.req.limit : Infinity;\n return (\n limit >= req.limit &&\n (req.values ? (entry.req as DBCoreQueryRequest).values : true) &&\n isSuperRange(entry.req.query.range, req.query.range)\n );\n });\n return [superEntry, false, tblCache, entries];\n case 'count':\n const countQuery = entries.find((entry) =>\n areRangesEqual(entry.req.query.range, req.query.range)\n );\n return [countQuery, !!countQuery, tblCache, entries];\n }\n}\n","import { delArrayItem } from \"../../functions/utils\";\nimport { CacheEntry } from \"../../public/types/cache\";\n\nexport function subscribeToCacheEntry(cacheEntry: CacheEntry, container: CacheEntry[], requery: ()=>void, signal: AbortSignal) {\n cacheEntry.subscribers.add(requery);\n signal.addEventListener(\"abort\", () => {\n cacheEntry.subscribers.delete(requery);\n if (cacheEntry.subscribers.size === 0) {\n enqueForDeletion(cacheEntry, container);\n }\n });\n}\n\n\nfunction enqueForDeletion(cacheEntry: CacheEntry, container: CacheEntry[]) {\n setTimeout(() => {\n if (cacheEntry.subscribers.size === 0) { // Still empty (no new subscribers readded after grace time)\n delArrayItem(container, cacheEntry);\n }\n }, 3000);\n}\n","import { LiveQueryContext } from '..';\nimport type { Transaction } from '../../classes/transaction';\nimport { getEffectiveKeys } from '../../dbcore/get-effective-keys';\nimport { deepClone, delArrayItem, setByKeyPath } from '../../functions/utils';\nimport DexiePromise, { PSD } from '../../helpers/promise';\nimport { ObservabilitySet } from '../../public/types/db-events';\nimport {\n DBCore, DBCoreMutateRequest, DBCoreMutateResponse, DBCoreQueryRequest,\n DBCoreQueryResponse\n} from '../../public/types/dbcore';\nimport { Middleware } from '../../public/types/middleware';\nimport { obsSetsOverlap } from '../obs-sets-overlap';\nimport { adjustOptimisticFromFailures } from './adjust-optimistic-request-from-failures';\nimport { applyOptimisticOps } from './apply-optimistic-ops';\nimport { cache } from './cache';\nimport { findCompatibleQuery } from './find-compatible-query';\nimport { isCachableContext } from './is-cachable-context';\nimport { isCachableRequest } from './is-cachable-request';\nimport { signalSubscribersLazily } from './signalSubscribers';\nimport { subscribeToCacheEntry } from './subscribe-cachentry';\n\nexport const cacheMiddleware: Middleware = {\n stack: 'dbcore',\n level: 0,\n name: 'Cache',\n create: (core) => {\n const dbName = core.schema.name;\n const coreMW: DBCore = {\n ...core,\n transaction: (stores, mode, options) => {\n const idbtrans = core.transaction(\n stores,\n mode,\n options\n ) as IDBTransaction & {\n mutatedParts?: ObservabilitySet;\n _explicit?: boolean;\n };\n // Maintain TblQueryCache.ops array when transactions commit or abort\n if (mode === 'readwrite') {\n const ac = new AbortController();\n const { signal } = ac;\n const endTransaction = (wasCommitted: boolean) => () => {\n ac.abort();\n if (mode === 'readwrite') {\n // Collect which subscribers to notify:\n const affectedSubscribers = new Set<()=>void>();\n\n // Go through all tables in transaction and check if they have any optimistic updates\n for (const storeName of stores) {\n const tblCache = cache[`idb://${dbName}/${storeName}`];\n if (tblCache) {\n const table = core.table(storeName);\n // Pick optimistic ops that are part of this transaction\n const ops = tblCache.optimisticOps.filter(\n (op) => op.trans === idbtrans\n );\n // Transaction was marked as _explicit in enterTransactionScope(), transaction-helpers.ts.\n if (idbtrans._explicit && wasCommitted && idbtrans.mutatedParts) {\n // Invalidate all queries that overlap with the mutated parts and signal their subscribers\n for (const entries of Object.values(\n tblCache.queries.query\n )) {\n for (const entry of entries.slice()) {\n if (obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)) {\n delArrayItem(entries, entry); // Remove the entry from the cache so it can be refreshed\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n }\n }\n }\n } else if (ops.length > 0) {\n // Remove them from the optimisticOps array\n tblCache.optimisticOps = tblCache.optimisticOps.filter(\n (op) => op.trans !== idbtrans\n );\n // Commit or abort the optimistic updates\n for (const entries of Object.values(\n tblCache.queries.query\n )) {\n for (const entry of entries.slice()) {\n if (\n entry.res != null && // if entry.promise but not entry.res, we're fine. Query will resume now and get the result.\n idbtrans.mutatedParts/* &&\n obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)*/\n ) {\n if (wasCommitted && !entry.dirty) {\n const freezeResults = Object.isFrozen(entry.res);\n const modRes = applyOptimisticOps(\n entry.res as any[],\n entry.req,\n ops,\n table,\n entry,\n freezeResults\n );\n if (entry.dirty) {\n // Found out at this point that the entry is dirty - not to rely on!\n delArrayItem(entries, entry);\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n } else if (modRes !== entry.res) {\n entry.res = modRes;\n // Update promise\n entry.promise = DexiePromise.resolve({result: modRes} satisfies DBCoreQueryResponse);\n \n // No need to notify subscribers. They already have this value.\n // We have just updated the value of the cache without having to\n // requery the database - because we know the result for this\n // query based on computing the operations and applying them\n // to the previous result.\n }\n } else {\n if (entry.dirty) {\n // If the entry is dirty we need to get rid of it so that\n // a new entry will be created when the query is run again.\n delArrayItem(entries, entry);\n }\n // If we're not committing, we need to notify subscribers that the\n // optimistic updates are no longer valid.\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n }\n }\n }\n }\n }\n }\n }\n affectedSubscribers.forEach((requery) => requery());\n }\n };\n idbtrans.addEventListener('abort', endTransaction(false), {\n signal,\n });\n idbtrans.addEventListener('error', endTransaction(false), {\n signal,\n });\n idbtrans.addEventListener('complete', endTransaction(true), {\n signal,\n });\n }\n return idbtrans;\n },\n table(tableName: string) {\n const downTable = core.table(tableName);\n const primKey = downTable.schema.primaryKey;\n const tableMW = {\n ...downTable,\n mutate(req: DBCoreMutateRequest): Promise {\n const trans = PSD.trans as Transaction;\n if (\n primKey.outbound || // Non-inbound tables are harded to apply optimistic updates on because we can't know primary key of results\n trans.db._options.cache === 'disabled' || // User has opted-out from caching\n trans.explicit // It's an explicit write transaction being made. Don't affect cache until transaction commits.\n ) {\n // Just forward the request to the core.\n return downTable.mutate(req);\n }\n // Find the TblQueryCache for this table:\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (!tblCache) return downTable.mutate(req);\n\n const promise = downTable.mutate(req);\n if ((req.type === 'add' || req.type === 'put') && (req.values.length >= 50 || getEffectiveKeys(primKey, req).some(key => key == null))) {\n // There are some autoIncremented keys not set yet. Need to wait for completion before we can reliably enqueue the operation.\n // (or there are too many objects so we lazy out to avoid performance bottleneck for large bulk inserts)\n promise.then((res) => { // We need to extract result keys and generate cloned values with the keys set (so that applyOptimisticOps can work)\n // But we have a problem! The req.mutatedParts is still not complete so we have to actively add the keys to the unsignaledParts set manually.\n const reqWithResolvedKeys = {\n ...req,\n values: req.values.map((value, i) => {\n const valueWithKey = primKey.keyPath?.includes('.')\n ? deepClone(value)\n : {\n ...value,\n };\n setByKeyPath(valueWithKey, primKey.keyPath, res.results![i]);\n return valueWithKey;\n })\n };\n const adjustedReq = adjustOptimisticFromFailures(tblCache, reqWithResolvedKeys, res);\n tblCache.optimisticOps.push(adjustedReq);\n // Signal subscribers after the observability middleware has complemented req.mutatedParts with the new keys.\n // We must queue the task so that we get the req.mutatedParts updated by observability middleware first.\n // If we refactor the dependency between observability middleware and this middleware we might not need to queue the task.\n queueMicrotask(()=>req.mutatedParts && signalSubscribersLazily(req.mutatedParts)); // Reason for double laziness: in user awaits put and then does another put, signal once.\n });\n } else {\n // Enque the operation immediately\n tblCache.optimisticOps.push(req);\n // Signal subscribers that there are mutated parts\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts);\n promise.then((res) => {\n if (res.numFailures > 0) {\n // In case the operation failed, we need to remove it from the optimisticOps array.\n delArrayItem(tblCache.optimisticOps, req);\n const adjustedReq = adjustOptimisticFromFailures(tblCache, req, res);\n if (adjustedReq) {\n tblCache.optimisticOps.push(adjustedReq);\n }\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts); // Signal the rolling back of the operation.\n }\n });\n promise.catch(()=> {\n // In case the operation failed, we need to remove it from the optimisticOps array.\n delArrayItem(tblCache.optimisticOps, req);\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts); // Signal the rolling back of the operation.\n });\n }\n return promise;\n },\n query(req: DBCoreQueryRequest): Promise {\n if (!isCachableContext(PSD, downTable) || !isCachableRequest(\"query\", req)) return downTable.query(req);\n const freezeResults =\n (PSD as LiveQueryContext).trans?.db._options.cache === 'immutable';\n const { requery, signal } = PSD as LiveQueryContext;\n let [cacheEntry, exactMatch, tblCache, container] =\n findCompatibleQuery(dbName, tableName, 'query', req);\n if (cacheEntry && exactMatch) {\n cacheEntry.obsSet = req.obsSet!; // So that optimistic result is monitored.\n // How? - because observability-middleware will track result where optimistic\n // mutations are applied and record it in the cacheEntry.\n // TODO: CHANGE THIS! The difference is resultKeys only.\n // Wanted behavior:\n // * cacheEntry obsSet should represent the obsSet without optimistic updates (so it can be checked when merging ops in tx commit)\n // * cacheEntry optimisticObsSet should represent the obsSet with current optimistic updates. It should be updated when adding an op\n // by adding the primary keys of the put/add/delete operation to the set.\n // * observability-middleware should stop recording req.obsSet when a cache entry exact match is found because it won't be used anyway.\n // I'm thinking of merging observability-middleware with cache-middleware into one single middleware because the dependencies are too\n // tight between them.\n } else {\n // --> TODO here: If not exact match, check if we have a superset to extract\n // the data from.\n\n // No cached result found. We need to query the database and cache the result.\n const promise = downTable.query(req).then((res) => {\n // Freeze or clone results\n const result = res.result;\n if (cacheEntry) cacheEntry.res = result;\n if (freezeResults) {\n // For performance reasons don't deep freeze.\n // Only freeze the top-level array and its items.\n // This is good enough to teach users that the result must be treated as immutable\n // without enforcing it recursively on the entire result (which is not even possible\n // for things like Date objects and typed arrays)\n for (let i = 0, l = result.length; i < l; ++i) {\n Object.freeze(result[i]);\n }\n Object.freeze(result);\n } else {\n // If not frozen, we need to clone the result to avoid user mutating the cache\n // When we do this, user's must feel conformable with the fact that the result\n // can be mutated deeply - user is not expected to have any respect for immutability.\n res.result = deepClone(result);\n }\n return res;\n }).catch(error => {\n // In case the query operation failed, we need to remove it from the cache\n // so that subsequent calls does not get the same error but re-evaluate\n // the query.\n if (container && cacheEntry) delArrayItem(container, cacheEntry);\n return Promise.reject(error);\n });\n cacheEntry = {\n obsSet: req.obsSet!,\n promise,\n subscribers: new Set(),\n type: 'query',\n req,\n dirty: false,\n };\n if (container) {\n container.push(cacheEntry);\n } else {\n container = [cacheEntry];\n if (!tblCache) {\n tblCache = cache[`idb://${dbName}/${tableName}`] = {\n queries: {\n query: {},\n count: {},\n },\n objs: new Map(),\n optimisticOps: [],\n unsignaledParts: {}\n };\n }\n tblCache.queries.query[req.query.index.name || ''] = container;\n }\n }\n subscribeToCacheEntry(cacheEntry, container!, requery, signal);\n return cacheEntry.promise.then((res: DBCoreQueryResponse) => {\n return {\n result: applyOptimisticOps(\n res.result,\n req,\n tblCache?.optimisticOps,\n downTable,\n cacheEntry!,\n freezeResults\n ) as any[], // readonly any[]\n };\n });\n },\n };\n return tableMW;\n },\n };\n return coreMW;\n },\n};\n\n\n","import { type Dexie } from \"../classes/dexie\";\nimport { type Table } from \"../classes/table\";\nimport { type Transaction } from \"../classes/transaction\";\n\nexport function vipify(\n target: T,\n vipDb: Dexie\n): T {\n return new Proxy(target, {\n get (target, prop, receiver) {\n // The \"db\" prop of the table or transaction is the only one we need to\n // override. The rest of the props can be accessed from the original\n // object.\n if (prop === 'db') return vipDb;\n return Reflect.get(target, prop, receiver);\n }\n });\n}\n","// Import types from the public API\nimport { Dexie as IDexie } from \"../../public/types/dexie\";\nimport { DexieOptions, DexieConstructor } from \"../../public/types/dexie-constructor\";\nimport { DbEvents } from \"../../public/types/db-events\";\n//import { PromiseExtended, PromiseExtendedConstructor } from '../../public/types/promise-extended';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from \"../../public/types/table-schema\";\nimport { DbSchema } from '../../public/types/db-schema';\n\n// Internal imports\nimport { Table, TableConstructor, createTableConstructor } from \"../table\";\nimport { Collection, CollectionConstructor, createCollectionConstructor } from '../collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { WhereClauseConstructor, createWhereClauseConstructor } from '../where-clause/where-clause-constructor';\nimport { Transaction } from '../transaction';\nimport { TransactionConstructor, createTransactionConstructor } from '../transaction/transaction-constructor';\nimport { Version } from \"../version/version\";\nimport { VersionConstructor, createVersionConstructor } from '../version/version-constructor';\n\n// Other imports...\nimport { DexieEventSet } from '../../public/types/dexie-event-set';\nimport { DexieExceptionClasses } from '../../public/types/errors';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\nimport Promise, { PSD, globalPSD } from '../../helpers/promise';\nimport { extend, override, keys, hasOwn } from '../../functions/utils';\nimport Events from '../../helpers/Events';\nimport { maxString, connections, READONLY, READWRITE } from '../../globals/constants';\nimport { getMaxKey } from '../../functions/quirks';\nimport { exceptions } from '../../errors';\nimport { lowerVersionFirst } from '../version/schema-helpers';\nimport { dexieOpen } from './dexie-open';\nimport { wrap } from '../../helpers/promise';\nimport { _onDatabaseDeleted } from '../../helpers/database-enumerator';\nimport { eventRejectHandler } from '../../functions/event-wrappers';\nimport { extractTransactionArgs, enterTransactionScope } from './transaction-helpers';\nimport { TransactionMode } from '../../public/types/transaction-mode';\nimport { rejection } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { DBCore } from '../../public/types/dbcore';\nimport { Middleware, DexieStacks } from '../../public/types/middleware';\nimport { virtualIndexMiddleware } from '../../dbcore/virtual-index-middleware';\nimport { hooksMiddleware } from '../../hooks/hooks-middleware';\nimport { IndexableType } from '../../public';\nimport { observabilityMiddleware } from '../../live-query/observability-middleware';\nimport { cacheExistingValuesMiddleware } from '../../dbcore/cache-existing-values-middleware';\nimport { cacheMiddleware } from \"../../live-query/cache/cache-middleware\";\nimport { vipify } from \"../../helpers/vipify\";\n\nexport interface DbReadyState {\n dbOpenError: any;\n isBeingOpened: boolean;\n onReadyBeingFired: undefined | Function[];\n openComplete: boolean;\n dbReadyResolve: () => void;\n dbReadyPromise: Promise;\n cancelOpen: (reason?: Error) => void;\n openCanceller: Promise & { _stackHolder?: Error };\n autoSchema: boolean;\n vcFired?: boolean;\n PR1398_maxLoop?: number;\n autoOpen?: boolean;\n}\n\nexport class Dexie implements IDexie {\n _options: DexieOptions;\n _state: DbReadyState;\n _versions: Version[];\n _storeNames: string[];\n _deps: DexieDOMDependencies;\n _allTables: { [name: string]: Table; };\n _createTransaction: (this: Dexie, mode: IDBTransactionMode, storeNames: ArrayLike, dbschema: { [tableName: string]: TableSchema; }, parentTransaction?: Transaction) => Transaction;\n _dbSchema: { [tableName: string]: TableSchema; };\n _hasGetAll?: boolean;\n _maxKey: IndexableType;\n _fireOnBlocked: (ev: Event) => void;\n _middlewares: {[StackName in keyof DexieStacks]?: Middleware[]} = {};\n _vip?: boolean;\n _novip: Dexie;// db._novip is to escape to orig db from db.vip.\n core: DBCore;\n\n name: string;\n verno: number = 0;\n idbdb: IDBDatabase | null;\n vip: Dexie;\n on: DbEvents;\n\n Table: TableConstructor;\n WhereClause: WhereClauseConstructor;\n Collection: CollectionConstructor;\n Version: VersionConstructor;\n Transaction: TransactionConstructor;\n static disableBfCache?: boolean;\n\n constructor(name: string, options?: DexieOptions) {\n const deps = (Dexie as any as DexieConstructor).dependencies;\n this._options = options = {\n // Default Options\n addons: (Dexie as any as DexieConstructor).addons, // Pick statically registered addons by default\n autoOpen: true, // Don't require db.open() explicitely.\n // Default DOM dependency implementations from static prop.\n indexedDB: deps.indexedDB, // Backend IndexedDB api. Default to browser env.\n IDBKeyRange: deps.IDBKeyRange, // Backend IDBKeyRange api. Default to browser env.\n cache: 'cloned', // Default to cloned for backward compatibility. For best performance and least memory consumption use 'immutable'.\n ...options\n }; \n this._deps = {\n indexedDB: options.indexedDB as IDBFactory,\n IDBKeyRange: options.IDBKeyRange as typeof IDBKeyRange\n };\n const {\n addons,\n } = options;\n this._dbSchema = {};\n this._versions = [];\n this._storeNames = [];\n this._allTables = {};\n this.idbdb = null;\n this._novip = this;\n const state: DbReadyState = {\n dbOpenError: null,\n isBeingOpened: false,\n onReadyBeingFired: null,\n openComplete: false,\n dbReadyResolve: nop,\n dbReadyPromise: null as Promise,\n cancelOpen: nop,\n openCanceller: null as Promise,\n autoSchema: true,\n PR1398_maxLoop: 3,\n autoOpen: options.autoOpen,\n };\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n this._state = state;\n this.name = name;\n this.on = Events(this, \"populate\", \"blocked\", \"versionchange\", \"close\", { ready: [promisableChain, nop] }) as DbEvents;\n this.on.ready.subscribe = override(this.on.ready.subscribe, subscribe => {\n return (subscriber, bSticky) => {\n (Dexie as any as DexieConstructor).vip(() => {\n const state = this._state;\n if (state.openComplete) {\n // Database already open. Call subscriber asap.\n if (!state.dbOpenError) Promise.resolve().then(subscriber);\n // bSticky: Also subscribe to future open sucesses (after close / reopen) \n if (bSticky) subscribe(subscriber);\n } else if (state.onReadyBeingFired) {\n // db.on('ready') subscribers are currently being executed and have not yet resolved or rejected\n state.onReadyBeingFired.push(subscriber);\n if (bSticky) subscribe(subscriber);\n } else {\n // Database not yet open. Subscribe to it.\n subscribe(subscriber);\n // If bSticky is falsy, make sure to unsubscribe subscriber when fired once.\n const db = this;\n if (!bSticky) subscribe(function unsubscribe() {\n db.on.ready.unsubscribe(subscriber);\n db.on.ready.unsubscribe(unsubscribe);\n });\n }\n });\n }\n });\n\n // Create derived classes bound to this instance of Dexie:\n this.Collection = createCollectionConstructor(this);\n this.Table = createTableConstructor(this);\n this.Transaction = createTransactionConstructor(this);\n this.Version = createVersionConstructor(this);\n this.WhereClause = createWhereClauseConstructor(this);\n\n // Default subscribers to \"versionchange\" and \"blocked\".\n // Can be overridden by custom handlers. If custom handlers return false, these default\n // behaviours will be prevented.\n this.on(\"versionchange\", ev => {\n // Default behavior for versionchange event is to close database connection.\n // Caller can override this behavior by doing db.on(\"versionchange\", function(){ return false; });\n // Let's not block the other window from making it's delete() or open() call.\n // NOTE! This event is never fired in IE,Edge or Safari.\n if (ev.newVersion > 0)\n console.warn(`Another connection wants to upgrade database '${this.name}'. Closing db now to resume the upgrade.`);\n else\n console.warn(`Another connection wants to delete database '${this.name}'. Closing db now to resume the delete request.`);\n this.close({disableAutoOpen: false});\n // In many web applications, it would be recommended to force window.reload()\n // when this event occurs. To do that, subscribe to the versionchange event\n // and call window.location.reload(true) if ev.newVersion > 0 (not a deletion)\n // The reason for this is that your current web app obviously has old schema code that needs\n // to be updated. Another window got a newer version of the app and needs to upgrade DB but\n // your window is blocking it unless we close it here.\n });\n this.on(\"blocked\", ev => {\n if (!ev.newVersion || ev.newVersion < ev.oldVersion)\n console.warn(`Dexie.delete('${this.name}') was blocked`);\n else\n console.warn(`Upgrade '${this.name}' blocked by other connection holding version ${ev.oldVersion / 10}`);\n });\n\n this._maxKey = getMaxKey(options.IDBKeyRange as typeof IDBKeyRange);\n\n this._createTransaction = (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n parentTransaction?: Transaction) => new this.Transaction(mode, storeNames, dbschema, this._options.chromeTransactionDurability, parentTransaction);\n\n this._fireOnBlocked = ev => {\n this.on(\"blocked\").fire(ev);\n // Workaround (not fully*) for missing \"versionchange\" event in IE,Edge and Safari:\n connections\n .filter(c => c.name === this.name && c !== this && !c._state.vcFired)\n .map(c => c.on(\"versionchange\").fire(ev));\n }\n\n // Default middlewares:\n this.use(cacheExistingValuesMiddleware);\n this.use(cacheMiddleware);\n this.use(observabilityMiddleware);\n this.use(virtualIndexMiddleware);\n this.use(hooksMiddleware);\n\n const vipDB = new Proxy(this, {\n get: (_, prop, receiver) => {\n if (prop === '_vip') return true;\n if (prop === 'table') return (tableName: string) => vipify(this.table(tableName), vipDB);\n const rv = Reflect.get(_, prop, receiver);\n if (rv instanceof Table) return vipify(rv, vipDB);\n if (prop === 'tables') return (rv as Table[]).map(t => vipify(t, vipDB));\n if (prop === '_createTransaction') return function() {\n const tx: Transaction = (rv as typeof this._createTransaction).apply(this, arguments);\n return vipify(tx, vipDB);\n }\n return rv;\n }\n });\n this.vip = vipDB;\n\n // Call each addon:\n addons.forEach(addon => addon(this));\n }\n\n version(versionNumber: number): Version {\n if (isNaN(versionNumber) || versionNumber < 0.1) throw new exceptions.Type(`Given version is not a positive number`);\n versionNumber = Math.round(versionNumber * 10) / 10;\n if (this.idbdb || this._state.isBeingOpened)\n throw new exceptions.Schema(\"Cannot add version when database is open\");\n this.verno = Math.max(this.verno, versionNumber);\n const versions = this._versions;\n var versionInstance = versions.filter(\n v => v._cfg.version === versionNumber)[0];\n if (versionInstance) return versionInstance;\n versionInstance = new this.Version(versionNumber);\n versions.push(versionInstance);\n versions.sort(lowerVersionFirst);\n versionInstance.stores({}); // Derive earlier schemas by default.\n // Disable autoschema mode, as at least one version is specified.\n this._state.autoSchema = false;\n return versionInstance;\n }\n\n _whenReady(fn: () => Promise): Promise {\n return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new Promise((resolve, reject) => {\n if (this._state.openComplete) {\n // idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return reject(new exceptions.DatabaseClosed(this._state.dbOpenError));\n }\n if (!this._state.isBeingOpened) {\n if (!this._state.autoOpen) {\n reject(new exceptions.DatabaseClosed());\n return;\n }\n this.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n this._state.dbReadyPromise.then(resolve, reject);\n }).then(fn);\n }\n\n use({stack, create, level, name}: Middleware): this {\n if (name) this.unuse({stack, name}); // Be able to replace existing middleware.\n const middlewares = this._middlewares[stack] || (this._middlewares[stack] = []);\n middlewares.push({stack, create, level: level == null ? 10 : level, name});\n middlewares.sort((a, b) => a.level - b.level);\n // Todo update db.core and db.tables...core ? Or should be expect this to have effect\n // only after next open()?\n return this;\n }\n\n unuse({stack, create}: Middleware<{stack: keyof DexieStacks}>): this;\n unuse({stack, name}: {stack: keyof DexieStacks, name: string}): this;\n unuse({stack, name, create}: {stack: keyof DexieStacks, name?: string, create?: Function}) {\n if (stack && this._middlewares[stack]) {\n this._middlewares[stack] = this._middlewares[stack].filter(mw =>\n create ? mw.create !== create : // Given middleware has a create method. Match that exactly.\n name ? mw.name !== name : // Given middleware spec \n false);\n }\n return this;\n }\n\n open() {\n return usePSD(\n globalPSD, // Enforce global scope here since db.open() can be part of a live query or transaction scope\n () => dexieOpen(this)\n );\n }\n\n _close(): void {\n const state = this._state;\n const idx = connections.indexOf(this);\n if (idx >= 0) connections.splice(idx, 1);\n if (this.idbdb) {\n try { this.idbdb.close(); } catch (e) { }\n this.idbdb = null;\n } \n // Reset dbReadyPromise promise:\n if (!state.isBeingOpened) {\n // Only if not being opened, reset these promises.\n // Otherwise, keep them so existing promise consumers will resolve when db\n // db is reopened later on, in case closing for purpose reopening, using {disableAutoOpen: false}.\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n }\n }\n\n close({disableAutoOpen} = {disableAutoOpen: true}): void {\n const state = this._state;\n if (disableAutoOpen) {\n if (state.isBeingOpened) {\n // cancel before the call to this._close() because this._close() will recreate dbReadyPromise and openCanceller.\n state.cancelOpen(new exceptions.DatabaseClosed());\n }\n this._close();\n state.autoOpen = false;\n state.dbOpenError = new exceptions.DatabaseClosed();\n } else {\n this._close();\n state.autoOpen = this._options.autoOpen ||\n state.isBeingOpened; // If an open call is ongoing, that same promise will resolve when db is reopend.\n state.openComplete = false;\n state.dbOpenError = null;\n }\n }\n\n delete(closeOptions = {disableAutoOpen: true}): Promise {\n // Prevent accidentially doing db.delete(1) when intention was to do db.[table].delete(1).\n const hasInvalidArguments = arguments.length > 0 && typeof arguments[0] !== 'object'; \n const state = this._state;\n return new Promise((resolve, reject) => {\n const doDelete = () => {\n this.close(closeOptions);\n var req = this._deps.indexedDB.deleteDatabase(this.name);\n req.onsuccess = wrap(() => {\n _onDatabaseDeleted(this._deps, this.name);\n resolve();\n });\n req.onerror = eventRejectHandler(reject);\n req.onblocked = this._fireOnBlocked;\n }\n // Prevent accidentially doing db.delete(1) when intention was to do db.[table].delete(1).\n if (hasInvalidArguments) throw new exceptions.InvalidArgument(\"Invalid closeOptions argument to db.delete()\");\n if (state.isBeingOpened) {\n state.dbReadyPromise.then(doDelete);\n } else {\n doDelete();\n }\n });\n }\n\n backendDB() {\n return this.idbdb;\n }\n\n isOpen() {\n return this.idbdb !== null;\n }\n\n hasBeenClosed() {\n const dbOpenError = this._state.dbOpenError;\n return dbOpenError && (dbOpenError.name === 'DatabaseClosed');\n }\n\n hasFailed() {\n return this._state.dbOpenError !== null;\n }\n\n dynamicallyOpened() {\n return this._state.autoSchema;\n }\n\n get tables () {\n return keys(this._allTables).map(name => this._allTables[name]);\n }\n\n transaction(): Promise {\n const args = extractTransactionArgs.apply(this, arguments);\n return this._transaction.apply(this, args);\n }\n\n _transaction(mode: TransactionMode, tables: Array, scopeFunc: Function) {\n let parentTransaction = PSD.trans as Transaction | undefined;\n // Check if parent transactions is bound to this db instance, and if caller wants to reuse it\n if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) parentTransaction = null;\n const onlyIfCompatible = mode.indexOf('?') !== -1;\n mode = mode.replace('!', '').replace('?', '') as TransactionMode; // Ok. Will change arguments[0] as well but we wont touch arguments henceforth.\n let idbMode: IDBTransactionMode,\n storeNames;\n\n try {\n //\n // Get storeNames from arguments. Either through given table instances, or through given table names.\n //\n storeNames = tables.map(table => {\n var storeName = table instanceof this.Table ? table.name : table;\n if (typeof storeName !== 'string') throw new TypeError(\"Invalid table argument to Dexie.transaction(). Only Table or String are allowed\");\n return storeName;\n });\n\n //\n // Resolve mode. Allow shortcuts \"r\" and \"rw\".\n //\n if (mode == \"r\" || mode === READONLY)\n idbMode = READONLY;\n else if (mode == \"rw\" || mode == READWRITE)\n idbMode = READWRITE;\n else\n throw new exceptions.InvalidArgument(\"Invalid transaction mode: \" + mode);\n\n if (parentTransaction) {\n // Basic checks\n if (parentTransaction.mode === READONLY && idbMode === READWRITE) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY\");\n }\n if (parentTransaction) {\n storeNames.forEach(storeName => {\n if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Table \" + storeName +\n \" not included in parent transaction.\");\n }\n });\n }\n if (onlyIfCompatible && parentTransaction && !parentTransaction.active) {\n // '?' mode should not keep using an inactive transaction.\n parentTransaction = null;\n }\n }\n } catch (e) {\n return parentTransaction ?\n parentTransaction._promise(null, (_, reject) => {reject(e);}) :\n rejection (e);\n }\n // If this is a sub-transaction, lock the parent and then launch the sub-transaction.\n const enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc);\n return (parentTransaction ?\n parentTransaction._promise(idbMode, enterTransaction, \"lock\") :\n PSD.trans ?\n // no parent transaction despite PSD.trans exists. Make sure also\n // that the zone we create is not a sub-zone of current, because\n // Promise.follow() should not wait for it if so.\n usePSD(PSD.transless, ()=>this._whenReady(enterTransaction)) :\n this._whenReady (enterTransaction));\n }\n\n table(tableName: string): Table;\n table(tableName: string): ITable;\n table(tableName: string): Table {\n if (!hasOwn(this._allTables, tableName)) {\n throw new exceptions.InvalidTable(`Table ${tableName} does not exist`); }\n return this._allTables[tableName];\n }\n}\n","import {\n Observable as IObservable,\n Observer,\n Subscription,\n} from \"../../public/types/observable\";\n\nconst symbolObservable: typeof Symbol.observable =\n typeof Symbol !== \"undefined\" && \"observable\" in Symbol\n ? Symbol.observable\n : \"@@observable\" as any;\n\nexport class Observable implements IObservable {\n private _subscribe: (observer: Observer) => Subscription;\n hasValue?: ()=>boolean;\n getValue?: ()=>T;\n\n constructor(subscribe: (observer: Observer) => Subscription) {\n this._subscribe = subscribe;\n }\n\n subscribe(\n onNext?: ((value: T) => void) | null,\n onError?: ((error: any) => void) | null,\n onComplete?: (() => void) | null\n ): Subscription;\n subscribe(observer?: Observer | null): Subscription;\n subscribe(x?: any, error?: any, complete?: any): Subscription {\n return this._subscribe(\n !x || typeof x === \"function\" ? { next: x, error, complete } : x\n );\n }\n\n [symbolObservable]() {\n return this;\n }\n}\n","import { _global } from '../../globals/global';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\n\nexport let domDeps: DexieDOMDependencies\n\ntry {\n domDeps = {\n // Required:\n indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB,\n IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange\n };\n} catch (e) {\n domDeps = { indexedDB: null, IDBKeyRange: null };\n}\n","import { _global, isAsyncFunction, keys, objectIsEmpty } from '../functions/utils';\nimport {\n globalEvents,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport {\n beginMicroTickScope,\n decrementExpectedAwaits,\n endMicroTickScope,\n execInGlobalContext,\n incrementExpectedAwaits,\n NativePromise,\n newScope,\n PSD,\n usePSD,\n} from '../helpers/promise';\nimport { ObservabilitySet } from '../public/types/db-events';\nimport {\n Observable as IObservable,\n Subscription,\n} from '../public/types/observable';\nimport { Observable } from '../classes/observable/observable';\nimport { extendObservabilitySet } from './extend-observability-set';\nimport { rangesOverlap } from '../helpers/rangeset';\nimport { domDeps } from '../classes/dexie/dexie-dom-dependencies';\nimport { Transaction } from '../classes/transaction';\nimport { obsSetsOverlap } from './obs-sets-overlap';\n\nexport interface LiveQueryContext {\n subscr: ObservabilitySet;\n signal: AbortSignal;\n requery: () => void;\n trans: null | Transaction;\n querier: Function; // For debugging purposes and Error messages\n}\n\nexport function liveQuery(querier: () => T | Promise): IObservable {\n let hasValue = false;\n let currentValue: T;\n const observable = new Observable((observer) => {\n const scopeFuncIsAsync = isAsyncFunction(querier);\n function execute(ctx: LiveQueryContext) {\n const wasRootExec = beginMicroTickScope(); // Performance: Avoid starting a new microtick scope within the async context.\n try {\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n let rv = newScope(querier, ctx);\n if (scopeFuncIsAsync) {\n // Make sure to set rv = rv.finally in order to wait to after decrementExpectedAwaits() has been called.\n // This fixes zone leaking issue that the liveQuery zone can leak to observer's next microtask.\n rv = (rv as Promise).finally(decrementExpectedAwaits);\n }\n return rv;\n } finally {\n wasRootExec && endMicroTickScope(); // Given that we created the microtick scope, we must also end it.\n }\n }\n\n let closed = false;\n let abortController: AbortController;\n\n let accumMuts: ObservabilitySet = {};\n let currentObs: ObservabilitySet = {};\n\n const subscription: Subscription = {\n get closed() {\n return closed;\n },\n unsubscribe: () => {\n if (closed) return;\n closed = true;\n if (abortController) abortController.abort();\n if (startedListening) globalEvents.storagemutated.unsubscribe(mutationListener);\n },\n };\n\n observer.start && observer.start(subscription); // https://github.com/tc39/proposal-observable\n\n let startedListening = false;\n\n const doQuery = () => execInGlobalContext(_doQuery);\n\n function shouldNotify() {\n return obsSetsOverlap(currentObs, accumMuts);\n }\n\n const mutationListener = (parts: ObservabilitySet) => {\n extendObservabilitySet(accumMuts, parts);\n if (shouldNotify()) {\n doQuery();\n }\n };\n\n const _doQuery = () => {\n if (\n closed || // closed - don't run!\n !domDeps.indexedDB) // SSR in sveltekit, nextjs etc\n {\n return;\n }\n accumMuts = {};\n const subscr: ObservabilitySet = {};\n // Abort signal fill three purposes:\n // 1. Abort the query if the observable is unsubscribed.\n // 2. Abort the query if a new query is made before the previous one has completed.\n // 3. For cached queries to know if they should remain in memory or could be enqued for being freed up.\n // (they will remain in memory for a short time and if noone needs them again, they will eventually be freed up)\n if (abortController) abortController.abort(); // Cancel previous query. Last query will be cancelled on unsubscribe().\n abortController = new AbortController();\n \n const ctx: LiveQueryContext = {\n subscr,\n signal: abortController.signal,\n requery: doQuery,\n querier,\n trans: null // Make the scope transactionless (don't reuse transaction from outer scope of the caller of subscribe())\n }\n const ret = execute(ctx);\n Promise.resolve(ret).then(\n (result) => {\n hasValue = true;\n currentValue = result;\n if (closed || ctx.signal.aborted) {\n // closed - no subscriber anymore.\n // signal.aborted - new query was made before this one completed and\n // the querier might have catched AbortError and return successful result.\n // If so, we should not rely in that result because we know we have aborted\n // this run, which means there's another run going on that will handle accumMuts\n // and we must not base currentObs on the half-baked subscr.\n return;\n }\n accumMuts = {};\n // Update what we are subscribing for based on this last run:\n currentObs = subscr;\n if (!objectIsEmpty(currentObs) && !startedListening) {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener);\n startedListening = true;\n }\n execInGlobalContext(()=>!closed && observer.next && observer.next(result));\n },\n (err) => {\n hasValue = false;\n if (!['DatabaseClosedError', 'AbortError'].includes(err?.name)) {\n if (!closed) execInGlobalContext(()=>{\n if (closed) return;\n observer.error && observer.error(err);\n });\n }\n }\n );\n };\n\n // Use setTimeot here to guarantee execution in a private macro task before and\n // after. The helper executeInGlobalContext(_doQuery) is not enough here because\n // caller of `subscribe()` could be anything, such as a frontend framework that will\n // continue in the same tick after subscribe() is called and call other\n // eftects, that could involve dexie operations such as writing to the DB.\n // If that happens, the private zone echoes from a live query tast started here\n // could still be ongoing when the other operations start and make them inherit\n // the async context from a live query.\n setTimeout(doQuery, 0);\n return subscription;\n });\n observable.hasValue = () => hasValue;\n observable.getValue = () => currentValue;\n return observable;\n}\n","import { Dexie as _Dexie } from './dexie';\nimport { _global } from '../../globals/global';\nimport { props, derive, extend, override, getByKeyPath, setByKeyPath, delByKeyPath, shallowClone, deepClone, asap } from '../../functions/utils';\nimport { getObjectDiff } from \"../../functions/get-object-diff\";\nimport { fullNameExceptions } from '../../errors';\nimport { DexieConstructor } from '../../public/types/dexie-constructor';\nimport { getDatabaseNames } from '../../helpers/database-enumerator';\nimport { PSD } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { newScope } from '../../helpers/promise';\nimport { rejection } from '../../helpers/promise';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { dexieStackFrameFilter, minKey, connections, DEXIE_VERSION } from '../../globals/constants';\nimport Events from '../../helpers/Events';\nimport { exceptions } from '../../errors';\nimport { errnames } from '../../errors';\nimport { getMaxKey } from '../../functions/quirks';\nimport { vip } from './vip';\nimport { globalEvents } from '../../globals/global-events';\nimport { liveQuery } from '../../live-query/live-query';\nimport { extendObservabilitySet } from '../../live-query/extend-observability-set';\nimport { domDeps } from './dexie-dom-dependencies';\nimport { cmp } from '../../functions/cmp';\nimport { cache } from '../../live-query/cache/cache';\n\n/* (Dexie) is an instance of DexieConstructor, as defined in public/types/dexie-constructor.d.ts\n* (new Dexie()) is an instance of Dexie, as defined in public/types/dexie.d.ts\n* \n* Why we're doing this?\n\n* Because we've choosen to define the public Dexie API using a DexieConstructor interface\n* rather than declaring a class. On that interface, all static props are defined.\n* In practice, class Dexie's constructor implements DexieConstructor and all member props\n* are defined in interface Dexie. We could say, it's a typescript limitation of not being\n* able to define a static interface that forces us to do the cast below.\n*/\nconst Dexie = _Dexie as any as DexieConstructor;\n\n//\n// Set all static methods and properties onto Dexie:\n// \nprops(Dexie, {\n\n // Dexie.BulkError = class BulkError {...};\n // Dexie.XXXError = class XXXError {...};\n ...fullNameExceptions,\n\n //\n // Static delete() method.\n //\n delete(databaseName: string) {\n const db = new Dexie(databaseName, {addons: []});\n return db.delete();\n },\n\n //\n // Static exists() method.\n //\n exists(name: string) {\n return new Dexie(name, { addons: [] }).open().then(db => {\n db.close();\n return true;\n }).catch('NoSuchDatabaseError', () => false);\n },\n\n //\n // Static method for retrieving a list of all existing databases at current host.\n //\n getDatabaseNames(cb) {\n try {\n return getDatabaseNames(Dexie.dependencies).then(cb);\n } catch {\n return rejection(new exceptions.MissingAPI());\n }\n },\n\n /** @deprecated */\n defineClass() {\n function Class(content) {\n extend(this, content);\n }\n return Class;\n },\n\n ignoreTransaction(scopeFunc) {\n // In case caller is within a transaction but needs to create a separate transaction.\n // Example of usage:\n //\n // Let's say we have a logger function in our app. Other application-logic should be unaware of the\n // logger function and not need to include the 'logentries' table in all transaction it performs.\n // The logging should always be done in a separate transaction and not be dependant on the current\n // running transaction context. Then you could use Dexie.ignoreTransaction() to run code that starts a new transaction.\n //\n // Dexie.ignoreTransaction(function() {\n // db.logentries.add(newLogEntry);\n // });\n //\n // Unless using Dexie.ignoreTransaction(), the above example would try to reuse the current transaction\n // in current Promise-scope.\n //\n // An alternative to Dexie.ignoreTransaction() would be setImmediate() or setTimeout(). The reason we still provide an\n // API for this because\n // 1) The intention of writing the statement could be unclear if using setImmediate() or setTimeout().\n // 2) setTimeout() would wait unnescessary until firing. This is however not the case with setImmediate().\n // 3) setImmediate() is not supported in the ES standard.\n // 4) You might want to keep other PSD state that was set in a parent PSD, such as PSD.letThrough.\n return PSD.trans ?\n usePSD(PSD.transless, scopeFunc) : // Use the closest parent that was non-transactional.\n scopeFunc(); // No need to change scope because there is no ongoing transaction.\n },\n\n vip,\n\n async: function (generatorFn: Function) {\n return function () {\n try {\n var rv = awaitIterator(generatorFn.apply(this, arguments));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n };\n },\n\n spawn: function (generatorFn, args, thiz) {\n try {\n var rv = awaitIterator(generatorFn.apply(thiz, args || []));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n },\n\n // Dexie.currentTransaction property\n currentTransaction: {\n get: () => PSD.trans || null\n },\n\n waitFor: function (promiseOrFunction, optionalTimeout) {\n // If a function is provided, invoke it and pass the returning value to Transaction.waitFor()\n const promise = Promise.resolve(\n typeof promiseOrFunction === 'function' ?\n Dexie.ignoreTransaction(promiseOrFunction) :\n promiseOrFunction)\n .timeout(optionalTimeout || 60000); // Default the timeout to one minute. Caller may specify Infinity if required. \n\n // Run given promise on current transaction. If no current transaction, just return a Dexie promise based\n // on given value.\n return PSD.trans ?\n PSD.trans.waitFor(promise) :\n promise;\n },\n\n // Export our Promise implementation since it can be handy as a standalone Promise implementation\n Promise: Promise,\n\n // Dexie.debug proptery:\n // Dexie.debug = false\n // Dexie.debug = true\n // Dexie.debug = \"dexie\" - don't hide dexie's stack frames.\n debug: {\n get: () => Debug.debug,\n set: value => {\n Debug.setDebug(value, value === 'dexie' ? () => true : dexieStackFrameFilter);\n }\n },\n\n // Export our derive/extend/override methodology\n derive: derive, // Deprecate?\n extend: extend, // Deprecate?\n props: props,\n override: override, // Deprecate?\n // Export our Events() function - can be handy as a toolkit\n Events: Events,\n on: globalEvents,\n liveQuery,\n extendObservabilitySet,\n // Utilities\n getByKeyPath: getByKeyPath,\n setByKeyPath: setByKeyPath,\n delByKeyPath: delByKeyPath,\n shallowClone: shallowClone,\n deepClone: deepClone,\n getObjectDiff: getObjectDiff,\n cmp,\n asap: asap,\n //maxKey: new Dexie('',{addons:[]})._maxKey,\n minKey: minKey,\n // Addon registry\n addons: [],\n // Global DB connection list\n connections: connections,\n\n //MultiModifyError: exceptions.Modify, // Obsolete!\n errnames: errnames,\n\n // Export other static classes\n //IndexSpec: IndexSpec, Obsolete!\n //TableSchema: TableSchema, Obsolete!\n\n //\n // Dependencies\n //\n // These will automatically work in browsers with indexedDB support, or where an indexedDB polyfill has been included.\n //\n // In node.js, however, these properties must be set \"manually\" before instansiating a new Dexie().\n // For node.js, you need to require indexeddb-js or similar and then set these deps.\n //\n dependencies: domDeps,\n cache,\n\n // API Version Number: Type Number, make sure to always set a version number that can be comparable correctly. Example: 0.9, 0.91, 0.92, 1.0, 1.01, 1.1, 1.2, 1.21, etc.\n semVer: DEXIE_VERSION,\n version: DEXIE_VERSION.split('.')\n .map(n => parseInt(n))\n .reduce((p, c, i) => p + (c / Math.pow(10, i * 2))),\n\n // https://github.com/dfahlander/Dexie.js/issues/186\n // typescript compiler tsc in mode ts-->es5 & commonJS, will expect require() to return\n // x.default. Workaround: Set Dexie.default = Dexie.\n // default: Dexie, // Commented because solved in index-umd.ts instead.\n // Make it possible to import {Dexie} (non-default import)\n // Reason 1: May switch to that in future.\n // Reason 2: We declare it both default and named exported in d.ts to make it possible\n // to let addons extend the Dexie interface with Typescript 2.1 (works only when explicitely\n // exporting the symbol, not just default exporting)\n // Dexie: Dexie // Commented because solved in index-umd.ts instead.\n});\n\nDexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange);\n","import { globalEvents, DEXIE_STORAGE_MUTATED_EVENT_NAME, STORAGE_MUTATED_DOM_EVENT_NAME } from '../globals/global-events';\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport { signalSubscribersNow } from './cache/signalSubscribers';\n\nif (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, updatedParts => {\n if (!propagatingLocally) {\n let event: CustomEvent;\n event = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, {\n detail: updatedParts\n });\n propagatingLocally = true;\n dispatchEvent(event);\n propagatingLocally = false;\n }\n });\n addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, ({detail}: CustomEvent) => {\n if (!propagatingLocally) {\n propagateLocally(detail);\n }\n });\n}\n\n/** Called from listeners to BroadcastChannel and DOM event to\n * propagate the event locally into dexie's storagemutated event\n * and invalidate cached queries.\n * \n * This function is only called when the event is not originating\n * from this same Dexie module - either from another redundant dexie import\n * or from a foreign tab or worker. That's why we need to invalidate\n * the cache when this happens.\n */\nexport function propagateLocally(updateParts: ObservabilitySet) {\n let wasMe = propagatingLocally;\n try {\n propagatingLocally = true;\n // Fire the \"storagemutated\" event.\n globalEvents.storagemutated.fire(updateParts);\n // Invalidate cached queries and signal subscribers to requery.\n signalSubscribersNow(updateParts, true);\n } finally {\n propagatingLocally = wasMe;\n }\n}\n\nexport let propagatingLocally = false;\n","import {\n globalEvents,\n STORAGE_MUTATED_DOM_EVENT_NAME,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport { propagateLocally, propagatingLocally } from './propagate-locally';\n\nexport let bc: BroadcastChannel;\n\nexport let createBC = ()=>{};\n\nif (typeof BroadcastChannel !== 'undefined') {\n createBC = () => {\n bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME);\n bc.onmessage = ev => ev.data && propagateLocally(ev.data);\n }\n createBC();\n\n /**\n * The Node.js BroadcastChannel will prevent the node process from exiting\n * if the BroadcastChannel is not closed.\n * Therefore we have to call unref() which allows the process to finish\n * properly even when the BroadcastChannel is never closed.\n * @link https://nodejs.org/api/worker_threads.html#broadcastchannelunref\n * @link https://github.com/dexie/Dexie.js/pull/1576\n */\n if (typeof (bc as any).unref === 'function') {\n (bc as any).unref();\n }\n \n //\n // Propagate local changes to remote tabs, windows and workers via BroadcastChannel\n //\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, (changedParts) => {\n if (!propagatingLocally) {\n bc.postMessage(changedParts);\n }\n });\n}\n","import { Dexie } from \"./classes/dexie\";\nimport { connections } from \"./globals/constants\";\nimport { debug } from \"./helpers/debug\";\nimport { RangeSet } from \"./helpers/rangeset\";\nimport { bc, createBC } from \"./live-query/enable-broadcast\";\nimport { propagateLocally } from \"./live-query/propagate-locally\";\n\n\nif (typeof addEventListener !== 'undefined') {\n addEventListener('pagehide', (event) => {\n if (!Dexie.disableBfCache && event.persisted) {\n if (debug) console.debug('Dexie: handling persisted pagehide');\n bc?.close();\n for (const db of connections) {\n db.close({disableAutoOpen: false});\n }\n }\n });\n addEventListener('pageshow', (event) => {\n if (!Dexie.disableBfCache && event.persisted) {\n if (debug) console.debug('Dexie: handling persisted pageshow');\n createBC();\n propagateLocally({all: new RangeSet(-Infinity, [[]])}); // Trigger all queries to requery\n }\n });\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function add(value: number | BigInt | Array) {\n return new PropModification({add: value});\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function remove(value: number | BigInt | Array) {\n return new PropModification({remove: value});\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function replacePrefix(a: string, b:string) {\n return new PropModification({replacePrefix: [a, b]});\n}\n","import { Dexie } from './classes/dexie';\nimport { DexieConstructor } from './public/types/dexie-constructor';\nimport { DexiePromise } from './helpers/promise';\nimport { mapError } from './errors';\nimport * as Debug from './helpers/debug';\nimport { dexieStackFrameFilter } from './globals/constants';\n\n// Generate all static properties such as Dexie.maxKey etc\n// (implement interface DexieConstructor):\nimport './classes/dexie/dexie-static-props';\nimport './live-query/enable-broadcast';\nimport './support-bfcache';\nimport { liveQuery } from './live-query/live-query';\nimport { Entity } from './classes/entity/Entity';\nimport { cmp } from './functions/cmp';\nimport { PropModification, PropModSymbol } from './helpers/prop-modification';\nimport { replacePrefix, add, remove } from './functions/propmods';\n\n\n// Set rejectionMapper of DexiePromise so that it generally tries to map\n// DOMErrors and DOMExceptions to a DexieError instance with same name but with\n// async stack support and with a prototypal inheritance from DexieError and Error.\n// of Map DOMErrors and DOMExceptions to corresponding Dexie errors.\nDexiePromise.rejectionMapper = mapError;\n\n// Let the async stack filter focus on app code and filter away frames from dexie.min.js:\nDebug.setDebug(Debug.debug, dexieStackFrameFilter);\n\nexport { RangeSet, mergeRanges, rangesOverlap } from \"./helpers/rangeset\";\nexport { Dexie, liveQuery }; // Comply with public/index.d.ts.\nexport { Entity };\nexport { cmp };\nexport { PropModSymbol, PropModification, replacePrefix, add, remove };\nexport default Dexie;\n"],"names":["asap","_a","Promise","Dexie","safari14Workaround","_Dexie","Debug.debug","Debug.setDebug"],"mappings":"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"} \ No newline at end of file diff --git a/src/assets/dexie/dist/modern/dexie.min.mjs b/src/assets/dexie/dist/modern/dexie.min.mjs deleted file mode 100644 index 5b3a35ac6..000000000 --- a/src/assets/dexie/dist/modern/dexie.min.mjs +++ /dev/null @@ -1,2 +0,0 @@ -const e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,t=Object.keys,n=Array.isArray;function r(e,n){return"object"!=typeof n||t(n).forEach((function(t){e[t]=n[t]})),e}"undefined"==typeof Promise||e.Promise||(e.Promise=Promise);const s=Object.getPrototypeOf,i={}.hasOwnProperty;function o(e,t){return i.call(e,t)}function a(e,n){"function"==typeof n&&(n=n(s(e))),("undefined"==typeof Reflect?t:Reflect.ownKeys)(n).forEach((t=>{l(e,t,n[t])}))}const u=Object.defineProperty;function l(e,t,n,s){u(e,t,r(n&&o(n,"get")&&"function"==typeof n.get?{get:n.get,set:n.set,configurable:!0}:{value:n,configurable:!0,writable:!0},s))}function c(e){return{from:function(t){return e.prototype=Object.create(t.prototype),l(e.prototype,"constructor",e),{extend:a.bind(null,e.prototype)}}}}const h=Object.getOwnPropertyDescriptor;function d(e,t){let n;return h(e,t)||(n=s(e))&&d(n,t)}const f=[].slice;function p(e,t,n){return f.call(e,t,n)}function y(e,t){return t(e)}function m(e){if(!e)throw new Error("Assertion Failed")}function b(t){e.setImmediate?setImmediate(t):setTimeout(t,0)}function g(e,t){if("string"==typeof t&&o(e,t))return e[t];if(!t)return e;if("string"!=typeof t){for(var n=[],r=0,s=t.length;r["Int","Uint","Float"].map((t=>t+e+"Array")))))).filter((t=>e[t])),O=new Set(k.map((t=>e[t])));function P(e){const t={};for(const n in e)if(o(e,n)){const r=e[n];t[n]=!r||"object"!=typeof r||O.has(r.constructor)?r:P(r)}return t}let E=null;function K(e){E=new WeakMap;const t=S(e);return E=null,t}function S(e){if(!e||"object"!=typeof e)return e;let t=E.get(e);if(t)return t;if(n(e)){t=[],E.set(e,t);for(var r=0,i=e.length;r=0&&e.splice(n,1),n>=0}const T={};function I(e){var t,r,s,i;if(1===arguments.length){if(n(e))return e.slice();if(this===T&&"string"==typeof e)return[e];if(i=D(e)){for(r=[];!(s=i.next()).done;)r.push(s.value);return r}if(null==e)return[e];if("number"==typeof(t=e.length)){for(r=new Array(t);t--;)r[t]=e[t];return r}return[e]}for(t=arguments.length,r=new Array(t);t--;)r[t]=arguments[t];return r}const B="undefined"!=typeof Symbol?e=>"AsyncFunction"===e[Symbol.toStringTag]:()=>!1;var R=["Unknown","Constraint","Data","TransactionInactive","ReadOnly","Version","NotFound","InvalidState","InvalidAccess","Abort","Timeout","QuotaExceeded","Syntax","DataClone"],$=["Modify","Bulk","OpenFailed","VersionChange","Schema","Upgrade","InvalidTable","MissingAPI","NoSuchDatabase","InvalidArgument","SubTransaction","Unsupported","Internal","DatabaseClosed","PrematureCommit","ForeignAwait"].concat(R),F={VersionChanged:"Database version changed by other database connection",DatabaseClosed:"Database has been closed",Abort:"Transaction aborted",TransactionInactive:"Transaction has already completed or failed",MissingAPI:"IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb"};function N(e,t){this.name=e,this.message=t}function M(e,t){return e+". Errors: "+Object.keys(t).map((e=>t[e].toString())).filter(((e,t,n)=>n.indexOf(e)===t)).join("\n")}function L(e,t,n,r){this.failures=t,this.failedKeys=r,this.successCount=n,this.message=M(e,t)}function U(e,t){this.name="BulkError",this.failures=Object.keys(t).map((e=>t[e])),this.failuresByPos=t,this.message=M(e,this.failures)}c(N).from(Error).extend({toString:function(){return this.name+": "+this.message}}),c(L).from(N),c(U).from(N);var V=$.reduce(((e,t)=>(e[t]=t+"Error",e)),{});const z=N;var W=$.reduce(((e,t)=>{var n=t+"Error";function r(e,r){this.name=n,e?"string"==typeof e?(this.message=`${e}${r?"\n "+r:""}`,this.inner=r||null):"object"==typeof e&&(this.message=`${e.name} ${e.message}`,this.inner=e):(this.message=F[t]||n,this.inner=null)}return c(r).from(z),e[t]=r,e}),{});W.Syntax=SyntaxError,W.Type=TypeError,W.Range=RangeError;var Y=R.reduce(((e,t)=>(e[t+"Error"]=W[t],e)),{});var G=$.reduce(((e,t)=>(-1===["Syntax","Type","Range"].indexOf(t)&&(e[t+"Error"]=W[t]),e)),{});function Q(){}function X(e){return e}function H(e,t){return null==e||e===X?t:function(n){return t(e(n))}}function J(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function Z(e,t){return e===Q?t:function(){var n=e.apply(this,arguments);void 0!==n&&(arguments[0]=n);var r=this.onsuccess,s=this.onerror;this.onsuccess=null,this.onerror=null;var i=t.apply(this,arguments);return r&&(this.onsuccess=this.onsuccess?J(r,this.onsuccess):r),s&&(this.onerror=this.onerror?J(s,this.onerror):s),void 0!==i?i:n}}function ee(e,t){return e===Q?t:function(){e.apply(this,arguments);var n=this.onsuccess,r=this.onerror;this.onsuccess=this.onerror=null,t.apply(this,arguments),n&&(this.onsuccess=this.onsuccess?J(n,this.onsuccess):n),r&&(this.onerror=this.onerror?J(r,this.onerror):r)}}function te(e,t){return e===Q?t:function(n){var s=e.apply(this,arguments);r(n,s);var i=this.onsuccess,o=this.onerror;this.onsuccess=null,this.onerror=null;var a=t.apply(this,arguments);return i&&(this.onsuccess=this.onsuccess?J(i,this.onsuccess):i),o&&(this.onerror=this.onerror?J(o,this.onerror):o),void 0===s?void 0===a?void 0:a:r(s,a)}}function ne(e,t){return e===Q?t:function(){return!1!==t.apply(this,arguments)&&e.apply(this,arguments)}}function re(e,t){return e===Q?t:function(){var n=e.apply(this,arguments);if(n&&"function"==typeof n.then){for(var r=this,s=arguments.length,i=new Array(s);s--;)i[s]=arguments[s];return n.then((function(){return t.apply(r,i)}))}return t.apply(this,arguments)}}G.ModifyError=L,G.DexieError=N,G.BulkError=U;var se="undefined"!=typeof location&&/^(http|https):\/\/(localhost|127\.0\.0\.1)/.test(location.href);function ie(e,t){se=e}var oe={};const[ae,ue,le]="undefined"==typeof Promise?[]:(()=>{let e=Promise.resolve();if("undefined"==typeof crypto||!crypto.subtle)return[e,s(e),e];const t=crypto.subtle.digest("SHA-512",new Uint8Array([0]));return[t,s(t),e]})(),ce=ue&&ue.then,he=ae&&ae.constructor,de=!!le;var fe=function(e,t){_e.push([e,t]),ye&&(queueMicrotask(De),ye=!1)},pe=!0,ye=!0,me=[],be=[],ge=X,ve={id:"global",global:!0,ref:0,unhandleds:[],onunhandled:Q,pgp:!1,env:{},finalize:Q},we=ve,_e=[],xe=0,ke=[];function Oe(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");this._listeners=[],this._lib=!1;var t=this._PSD=we;if("function"!=typeof e){if(e!==oe)throw new TypeError("Not a function");return this._state=arguments[1],this._value=arguments[2],void(!1===this._state&&Se(this,this._value))}this._state=null,this._value=null,++t.ref,Ke(this,e)}const Pe={get:function(){var e=we,t=Le;function n(n,r){var s=!e.global&&(e!==we||t!==Le);const i=s&&!We();var o=new Oe(((t,o)=>{Ae(this,new Ee(Ze(n,e,s,i),Ze(r,e,s,i),t,o,e))}));return this._consoleTask&&(o._consoleTask=this._consoleTask),o}return n.prototype=oe,n},set:function(e){l(this,"then",e&&e.prototype===oe?Pe:{get:function(){return e},set:Pe.set})}};function Ee(e,t,n,r,s){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=r,this.psd=s}function Ke(e,t){try{t((t=>{if(null===e._state){if(t===e)throw new TypeError("A promise cannot be resolved with itself.");var n=e._lib&&qe();t&&"function"==typeof t.then?Ke(e,((e,n)=>{t instanceof Oe?t._then(e,n):t.then(e,n)})):(e._state=!0,e._value=t,Ce(e)),n&&Te()}}),Se.bind(null,e))}catch(t){Se(e,t)}}function Se(e,t){if(be.push(t),null===e._state){var n=e._lib&&qe();t=ge(t),e._state=!1,e._value=t,function(e){me.some((t=>t._value===e._value))||me.push(e)}(e),Ce(e),n&&Te()}}function Ce(e){var t=e._listeners;e._listeners=[];for(var n=0,r=t.length;n{0==--xe&&Ie()}),[]))}function Ae(e,t){if(null!==e._state){var n=e._state?t.onFulfilled:t.onRejected;if(null===n)return(e._state?t.resolve:t.reject)(e._value);++t.psd.ref,++xe,fe(je,[n,e,t])}else e._listeners.push(t)}function je(e,t,n){try{var r,s=t._value;!t._state&&be.length&&(be=[]),r=se&&t._consoleTask?t._consoleTask.run((()=>e(s))):e(s),t._state||-1!==be.indexOf(s)||function(e){var t=me.length;for(;t;)if(me[--t]._value===e._value)return void me.splice(t,1)}(t),n.resolve(r)}catch(e){n.reject(e)}finally{0==--xe&&Ie(),--n.psd.ref||n.psd.finalize()}}function De(){Je(ve,(()=>{qe()&&Te()}))}function qe(){var e=pe;return pe=!1,ye=!1,e}function Te(){var e,t,n;do{for(;_e.length>0;)for(e=_e,_e=[],n=e.length,t=0;t0);pe=!0,ye=!0}function Ie(){var e=me;me=[],e.forEach((e=>{e._PSD.onunhandled.call(null,e._value,e)}));for(var t=ke.slice(0),n=t.length;n;)t[--n]()}function Be(e){return new Oe(oe,!1,e)}function Re(e,t){var n=we;return function(){var r=qe(),s=we;try{return Xe(n,!0),e.apply(this,arguments)}catch(e){t&&t(e)}finally{Xe(s,!1),r&&Te()}}}a(Oe.prototype,{then:Pe,_then:function(e,t){Ae(this,new Ee(null,null,e,t,we))},catch:function(e){if(1===arguments.length)return this.then(null,e);var t=arguments[0],n=arguments[1];return"function"==typeof t?this.then(null,(e=>e instanceof t?n(e):Be(e))):this.then(null,(e=>e&&e.name===t?n(e):Be(e)))},finally:function(e){return this.then((t=>Oe.resolve(e()).then((()=>t))),(t=>Oe.resolve(e()).then((()=>Be(t)))))},timeout:function(e,t){return e<1/0?new Oe(((n,r)=>{var s=setTimeout((()=>r(new W.Timeout(t))),e);this.then(n,r).finally(clearTimeout.bind(null,s))})):this}}),"undefined"!=typeof Symbol&&Symbol.toStringTag&&l(Oe.prototype,Symbol.toStringTag,"Dexie.Promise"),ve.env=He(),a(Oe,{all:function(){var e=I.apply(null,arguments).map(Ye);return new Oe((function(t,n){0===e.length&&t([]);var r=e.length;e.forEach(((s,i)=>Oe.resolve(s).then((n=>{e[i]=n,--r||t(e)}),n)))}))},resolve:e=>e instanceof Oe?e:e&&"function"==typeof e.then?new Oe(((t,n)=>{e.then(t,n)})):new Oe(oe,!0,e),reject:Be,race:function(){var e=I.apply(null,arguments).map(Ye);return new Oe(((t,n)=>{e.map((e=>Oe.resolve(e).then(t,n)))}))},PSD:{get:()=>we,set:e=>we=e},totalEchoes:{get:()=>Le},newPSD:Ve,usePSD:Je,scheduler:{get:()=>fe,set:e=>{fe=e}},rejectionMapper:{get:()=>ge,set:e=>{ge=e}},follow:(e,t)=>new Oe(((n,r)=>Ve(((t,n)=>{var r=we;r.unhandleds=[],r.onunhandled=n,r.finalize=J((function(){!function(e){function t(){e(),ke.splice(ke.indexOf(t),1)}ke.push(t),++xe,fe((()=>{0==--xe&&Ie()}),[])}((()=>{0===this.unhandleds.length?t():n(this.unhandleds[0])}))}),r.finalize),e()}),t,n,r)))}),he&&(he.allSettled&&l(Oe,"allSettled",(function(){const e=I.apply(null,arguments).map(Ye);return new Oe((t=>{0===e.length&&t([]);let n=e.length;const r=new Array(n);e.forEach(((e,s)=>Oe.resolve(e).then((e=>r[s]={status:"fulfilled",value:e}),(e=>r[s]={status:"rejected",reason:e})).then((()=>--n||t(r)))))}))})),he.any&&"undefined"!=typeof AggregateError&&l(Oe,"any",(function(){const e=I.apply(null,arguments).map(Ye);return new Oe(((t,n)=>{0===e.length&&n(new AggregateError([]));let r=e.length;const s=new Array(r);e.forEach(((e,i)=>Oe.resolve(e).then((e=>t(e)),(e=>{s[i]=e,--r||n(new AggregateError(s))}))))}))})));const $e={awaits:0,echoes:0,id:0};var Fe=0,Ne=[],Me=0,Le=0,Ue=0;function Ve(e,t,n,s){var i=we,o=Object.create(i);o.parent=i,o.ref=0,o.global=!1,o.id=++Ue,ve.env,o.env=de?{Promise:Oe,PromiseProp:{value:Oe,configurable:!0,writable:!0},all:Oe.all,race:Oe.race,allSettled:Oe.allSettled,any:Oe.any,resolve:Oe.resolve,reject:Oe.reject}:{},t&&r(o,t),++i.ref,o.finalize=function(){--this.parent.ref||this.parent.finalize()};var a=Je(o,e,n,s);return 0===o.ref&&o.finalize(),a}function ze(){return $e.id||($e.id=++Fe),++$e.awaits,$e.echoes+=100,$e.id}function We(){return!!$e.awaits&&(0==--$e.awaits&&($e.id=0),$e.echoes=100*$e.awaits,!0)}function Ye(e){return $e.echoes&&e&&e.constructor===he?(ze(),e.then((e=>(We(),e)),(e=>(We(),tt(e))))):e}function Ge(e){++Le,$e.echoes&&0!=--$e.echoes||($e.echoes=$e.awaits=$e.id=0),Ne.push(we),Xe(e,!0)}function Qe(){var e=Ne[Ne.length-1];Ne.pop(),Xe(e,!1)}function Xe(t,n){var r=we;if((n?!$e.echoes||Me++&&t===we:!Me||--Me&&t===we)||queueMicrotask(n?Ge.bind(null,t):Qe),t!==we&&(we=t,r===ve&&(ve.env=He()),de)){var s=ve.env.Promise,i=t.env;(r.global||t.global)&&(Object.defineProperty(e,"Promise",i.PromiseProp),s.all=i.all,s.race=i.race,s.resolve=i.resolve,s.reject=i.reject,i.allSettled&&(s.allSettled=i.allSettled),i.any&&(s.any=i.any))}}function He(){var t=e.Promise;return de?{Promise:t,PromiseProp:Object.getOwnPropertyDescriptor(e,"Promise"),all:t.all,race:t.race,allSettled:t.allSettled,any:t.any,resolve:t.resolve,reject:t.reject}:{}}function Je(e,t,n,r,s){var i=we;try{return Xe(e,!0),t(n,r,s)}finally{Xe(i,!1)}}function Ze(e,t,n,r){return"function"!=typeof e?e:function(){var s=we;n&&ze(),Xe(t,!0);try{return e.apply(this,arguments)}finally{Xe(s,!1),r&&queueMicrotask(We)}}}function et(e){Promise===he&&0===$e.echoes?0===Me?e():enqueueNativeMicroTask(e):setTimeout(e,0)}-1===(""+ce).indexOf("[native code]")&&(ze=We=Q);var tt=Oe.reject;function nt(e,t,n,r){if(e.idbdb&&(e._state.openComplete||we.letThrough||e._vip)){var s=e._createTransaction(t,n,e._dbSchema);try{s.create(),e._state.PR1398_maxLoop=3}catch(s){return s.name===V.InvalidState&&e.isOpen()&&--e._state.PR1398_maxLoop>0?(console.warn("Dexie: Need to reopen db"),e.close({disableAutoOpen:!1}),e.open().then((()=>nt(e,t,n,r)))):tt(s)}return s._promise(t,((e,t)=>Ve((()=>(we.trans=s,r(e,t,s)))))).then((e=>{if("readwrite"===t)try{s.idbtrans.commit()}catch{}return"readonly"===t?e:s._completion.then((()=>e))}))}if(e._state.openComplete)return tt(new W.DatabaseClosed(e._state.dbOpenError));if(!e._state.isBeingOpened){if(!e._state.autoOpen)return tt(new W.DatabaseClosed);e.open().catch(Q)}return e._state.dbReadyPromise.then((()=>nt(e,t,n,r)))}const rt=String.fromCharCode(65535),st="Invalid key provided. Keys must be of type string, number, Date or Array.",it=[];function ot(e,t){return e?t?function(){return e.apply(this,arguments)&&t.apply(this,arguments)}:e:t}const at={type:3,lower:-1/0,lowerOpen:!1,upper:[[]],upperOpen:!1};function ut(e){return"string"!=typeof e||/\./.test(e)?e=>e:t=>(void 0===t[e]&&e in t&&delete(t=K(t))[e],t)}function lt(){throw W.Type()}function ct(e,t){try{const n=ht(e),r=ht(t);if(n!==r)return"Array"===n?1:"Array"===r?-1:"binary"===n?1:"binary"===r?-1:"string"===n?1:"string"===r?-1:"Date"===n?1:"Date"!==r?NaN:-1;switch(n){case"number":case"Date":case"string":return e>t?1:er._promise(e,o,n)),{trans:r,transless:we.transless||we}):nt(this.db,e,[this.name],o);return i&&(t._consoleTask=i,t=t.catch((e=>(console.trace(e),tt(e))))),t}finally{a&&Te()}}get(e,t){return e&&e.constructor===Object?this.where(e).first(t):null==e?tt(new W.Type("Invalid argument to Table.get()")):this._trans("readonly",(t=>this.core.get({trans:t,key:e}).then((e=>this.hook.reading.fire(e))))).then(t)}where(e){if("string"==typeof e)return new this.db.WhereClause(this,e);if(n(e))return new this.db.WhereClause(this,`[${e.join("+")}]`);const r=t(e);if(1===r.length)return this.where(r[0]).equals(e[r[0]]);const s=this.schema.indexes.concat(this.schema.primKey).filter((e=>{if(e.compound&&r.every((t=>e.keyPath.indexOf(t)>=0))){for(let t=0;te.keyPath.length-t.keyPath.length))[0];if(s&&this.db._maxKey!==rt){const t=s.keyPath.slice(0,r.length);return this.where(t).equals(t.map((t=>e[t])))}!s&&se&&console.warn(`The query ${JSON.stringify(e)} on ${this.name} would benefit from a compound index [${r.join("+")}]`);const{idxByName:i}=this.schema,o=this.db._deps.indexedDB;function a(e,t){return 0===o.cmp(e,t)}const[u,l]=r.reduce((([t,r],s)=>{const o=i[s],u=e[s];return[t||o,t||!o?ot(r,o&&o.multi?e=>{const t=g(e,s);return n(t)&&t.some((e=>a(u,e)))}:e=>a(u,g(e,s))):r]}),[null,null]);return u?this.where(u.name).equals(e[u.keyPath]).filter(l):s?this.filter(l):this.where(r).equals("")}filter(e){return this.toCollection().and(e)}count(e){return this.toCollection().count(e)}offset(e){return this.toCollection().offset(e)}limit(e){return this.toCollection().limit(e)}each(e){return this.toCollection().each(e)}toArray(e){return this.toCollection().toArray(e)}toCollection(){return new this.db.Collection(new this.db.WhereClause(this))}orderBy(e){return new this.db.Collection(new this.db.WhereClause(this,n(e)?`[${e.join("+")}]`:e))}reverse(){return this.toCollection().reverse()}mapToClass(e){const{db:t,name:n}=this;this.schema.mappedClass=e,e.prototype instanceof lt&&(e=class extends e{get db(){return t}table(){return n}});const r=new Set;for(let t=e.prototype;t;t=s(t))Object.getOwnPropertyNames(t).forEach((e=>r.add(e)));const i=t=>{if(!t)return t;const n=Object.create(e.prototype);for(let e in t)if(!r.has(e))try{n[e]=t[e]}catch(e){}return n};return this.schema.readHook&&this.hook.reading.unsubscribe(this.schema.readHook),this.schema.readHook=i,this.hook("reading",i),e}defineClass(){return this.mapToClass((function(e){r(this,e)}))}add(e,t){const{auto:n,keyPath:r}=this.schema.primKey;let s=e;return r&&n&&(s=ut(r)(e)),this._trans("readwrite",(e=>this.core.mutate({trans:e,type:"add",keys:null!=t?[t]:null,values:[s]}))).then((e=>e.numFailures?Oe.reject(e.failures[0]):e.lastResult)).then((t=>{if(r)try{v(e,r,t)}catch(e){}return t}))}update(e,t){if("object"!=typeof e||n(e))return this.where(":id").equals(e).modify(t);{const n=g(e,this.schema.primKey.keyPath);return void 0===n?tt(new W.InvalidArgument("Given object does not contain its primary key")):this.where(":id").equals(n).modify(t)}}put(e,t){const{auto:n,keyPath:r}=this.schema.primKey;let s=e;return r&&n&&(s=ut(r)(e)),this._trans("readwrite",(e=>this.core.mutate({trans:e,type:"put",values:[s],keys:null!=t?[t]:null}))).then((e=>e.numFailures?Oe.reject(e.failures[0]):e.lastResult)).then((t=>{if(r)try{v(e,r,t)}catch(e){}return t}))}delete(e){return this._trans("readwrite",(t=>this.core.mutate({trans:t,type:"delete",keys:[e]}))).then((e=>e.numFailures?Oe.reject(e.failures[0]):void 0))}clear(){return this._trans("readwrite",(e=>this.core.mutate({trans:e,type:"deleteRange",range:at}))).then((e=>e.numFailures?Oe.reject(e.failures[0]):void 0))}bulkGet(e){return this._trans("readonly",(t=>this.core.getMany({keys:e,trans:t}).then((e=>e.map((e=>this.hook.reading.fire(e)))))))}bulkAdd(e,t,n){const r=Array.isArray(t)?t:void 0,s=(n=n||(r?void 0:t))?n.allKeys:void 0;return this._trans("readwrite",(t=>{const{auto:n,keyPath:i}=this.schema.primKey;if(i&&r)throw new W.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys");if(r&&r.length!==e.length)throw new W.InvalidArgument("Arguments objects and keys must have the same length");const o=e.length;let a=i&&n?e.map(ut(i)):e;return this.core.mutate({trans:t,type:"add",keys:r,values:a,wantResults:s}).then((({numFailures:e,results:t,lastResult:n,failures:r})=>{if(0===e)return s?t:n;throw new U(`${this.name}.bulkAdd(): ${e} of ${o} operations failed`,r)}))}))}bulkPut(e,t,n){const r=Array.isArray(t)?t:void 0,s=(n=n||(r?void 0:t))?n.allKeys:void 0;return this._trans("readwrite",(t=>{const{auto:n,keyPath:i}=this.schema.primKey;if(i&&r)throw new W.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys");if(r&&r.length!==e.length)throw new W.InvalidArgument("Arguments objects and keys must have the same length");const o=e.length;let a=i&&n?e.map(ut(i)):e;return this.core.mutate({trans:t,type:"put",keys:r,values:a,wantResults:s}).then((({numFailures:e,results:t,lastResult:n,failures:r})=>{if(0===e)return s?t:n;throw new U(`${this.name}.bulkPut(): ${e} of ${o} operations failed`,r)}))}))}bulkUpdate(e){const t=this.core,n=e.map((e=>e.key)),r=e.map((e=>e.changes)),s=[];return this._trans("readwrite",(i=>t.getMany({trans:i,keys:n,cache:"clone"}).then((o=>{const a=[],u=[];e.forEach((({key:e,changes:t},n)=>{const r=o[n];if(r){for(const n of Object.keys(t)){const s=t[n];if(n===this.schema.primKey.keyPath){if(0!==ct(s,e))throw new W.Constraint("Cannot update primary key in bulkUpdate()")}else v(r,n,s)}s.push(n),a.push(e),u.push(r)}}));const l=a.length;return t.mutate({trans:i,type:"put",keys:a,values:u,updates:{keys:n,changeSpecs:r}}).then((({numFailures:e,failures:t})=>{if(0===e)return l;for(const e of Object.keys(t)){const n=s[Number(e)];if(null!=n){const r=t[e];delete t[e],t[n]=r}}throw new U(`${this.name}.bulkUpdate(): ${e} of ${l} operations failed`,t)}))}))))}bulkDelete(e){const t=e.length;return this._trans("readwrite",(t=>this.core.mutate({trans:t,type:"delete",keys:e}))).then((({numFailures:e,lastResult:n,failures:r})=>{if(0===e)return n;throw new U(`${this.name}.bulkDelete(): ${e} of ${t} operations failed`,r)}))}}function pt(e){var r={},s=function(t,n){if(n){for(var s=arguments.length,i=new Array(s-1);--s;)i[s-1]=arguments[s];return r[t].subscribe.apply(null,i),e}if("string"==typeof t)return r[t]};s.addEventType=a;for(var i=1,o=arguments.length;iot(r(),t()):t,e.justLimit=n&&!r}function vt(e,t){if(e.isPrimKey)return t.primaryKey;const n=t.getIndexByKeyPath(e.index);if(!n)throw new W.Schema("KeyPath "+e.index+" on object store "+t.name+" is not indexed");return n}function wt(e,t,n){const r=vt(e,t.schema);return t.openCursor({trans:n,values:!e.keysOnly,reverse:"prev"===e.dir,unique:!!e.unique,query:{index:r,range:e.range}})}function _t(e,t,n,r){const s=e.replayFilter?ot(e.filter,e.replayFilter()):e.filter;if(e.or){const i={},a=(e,n,r)=>{if(!s||s(n,r,(e=>n.stop(e)),(e=>n.fail(e)))){var a=n.primaryKey,u=""+a;"[object ArrayBuffer]"===u&&(u=""+new Uint8Array(a)),o(i,u)||(i[u]=!0,t(e,n,r))}};return Promise.all([e.or._iterate(a,n),xt(wt(e,r,n),e.algorithm,a,!e.keysOnly&&e.valueMapper)])}return xt(wt(e,r,n),ot(e.algorithm,s),t,!e.keysOnly&&e.valueMapper)}function xt(e,t,n,r){var s=Re(r?(e,t,s)=>n(r(e),t,s):n);return e.then((e=>{if(e)return e.start((()=>{var n=()=>e.continue();t&&!t(e,(e=>n=e),(t=>{e.stop(t),n=Q}),(t=>{e.fail(t),n=Q}))||s(e.value,e,(e=>n=e)),n()}))}))}const kt=Symbol();class Ot{execute(e){if(void 0!==this.add){const t=this.add;if(n(t))return[...n(e)?e:[],...t].sort();if("number"==typeof t)return(Number(e)||0)+t;if("bigint"==typeof t)try{return BigInt(e)+t}catch{return BigInt(0)+t}throw new TypeError(`Invalid term ${t}`)}if(void 0!==this.remove){const t=this.remove;if(n(t))return n(e)?e.filter((e=>!t.includes(e))).sort():[];if("number"==typeof t)return Number(e)-t;if("bigint"==typeof t)try{return BigInt(e)-t}catch{return BigInt(0)-t}throw new TypeError(`Invalid subtrahend ${t}`)}const t=this.replacePrefix?.[0];return t&&"string"==typeof e&&e.startsWith(t)?this.replacePrefix[1]+e.substring(t.length):e}constructor(e){Object.assign(this,e)}}class Pt{_read(e,t){var n=this._ctx;return n.error?n.table._trans(null,tt.bind(null,n.error)):n.table._trans("readonly",e).then(t)}_write(e){var t=this._ctx;return t.error?t.table._trans(null,tt.bind(null,t.error)):t.table._trans("readwrite",e,"locked")}_addAlgorithm(e){var t=this._ctx;t.algorithm=ot(t.algorithm,e)}_iterate(e,t){return _t(this._ctx,e,t,this._ctx.table.core)}clone(e){var t=Object.create(this.constructor.prototype),n=Object.create(this._ctx);return e&&r(n,e),t._ctx=n,t}raw(){return this._ctx.valueMapper=null,this}each(e){var t=this._ctx;return this._read((n=>_t(t,e,n,t.table.core)))}count(e){return this._read((e=>{const t=this._ctx,n=t.table.core;if(mt(t,!0))return n.count({trans:e,query:{index:vt(t,n.schema),range:t.range}}).then((e=>Math.min(e,t.limit)));var r=0;return _t(t,(()=>(++r,!1)),e,n).then((()=>r))})).then(e)}sortBy(e,t){const n=e.split(".").reverse(),r=n[0],s=n.length-1;function i(e,t){return t?i(e[n[t]],t-1):e[r]}var o="next"===this._ctx.dir?1:-1;function a(e,t){var n=i(e,s),r=i(t,s);return nr?o:0}return this.toArray((function(e){return e.sort(a)})).then(t)}toArray(e){return this._read((e=>{var t=this._ctx;if("next"===t.dir&&mt(t,!0)&&t.limit>0){const{valueMapper:n}=t,r=vt(t,t.table.core.schema);return t.table.core.query({trans:e,limit:t.limit,values:!0,query:{index:r,range:t.range}}).then((({result:e})=>n?e.map(n):e))}{const n=[];return _t(t,(e=>n.push(e)),e,t.table.core).then((()=>n))}}),e)}offset(e){var t=this._ctx;return e<=0||(t.offset+=e,mt(t)?gt(t,(()=>{var t=e;return(e,n)=>0===t||(1===t?(--t,!1):(n((()=>{e.advance(t),t=0})),!1))})):gt(t,(()=>{var t=e;return()=>--t<0}))),this}limit(e){return this._ctx.limit=Math.min(this._ctx.limit,e),gt(this._ctx,(()=>{var t=e;return function(e,n,r){return--t<=0&&n(r),t>=0}}),!0),this}until(e,t){return bt(this._ctx,(function(n,r,s){return!e(n.value)||(r(s),t)})),this}first(e){return this.limit(1).toArray((function(e){return e[0]})).then(e)}last(e){return this.reverse().first(e)}filter(e){var t,n;return bt(this._ctx,(function(t){return e(t.value)})),t=this._ctx,n=e,t.isMatch=ot(t.isMatch,n),this}and(e){return this.filter(e)}or(e){return new this.db.WhereClause(this._ctx.table,e,this)}reverse(){return this._ctx.dir="prev"===this._ctx.dir?"next":"prev",this._ondirectionchange&&this._ondirectionchange(this._ctx.dir),this}desc(){return this.reverse()}eachKey(e){var t=this._ctx;return t.keysOnly=!t.isMatch,this.each((function(t,n){e(n.key,n)}))}eachUniqueKey(e){return this._ctx.unique="unique",this.eachKey(e)}eachPrimaryKey(e){var t=this._ctx;return t.keysOnly=!t.isMatch,this.each((function(t,n){e(n.primaryKey,n)}))}keys(e){var t=this._ctx;t.keysOnly=!t.isMatch;var n=[];return this.each((function(e,t){n.push(t.key)})).then((function(){return n})).then(e)}primaryKeys(e){var t=this._ctx;if("next"===t.dir&&mt(t,!0)&&t.limit>0)return this._read((e=>{var n=vt(t,t.table.core.schema);return t.table.core.query({trans:e,values:!1,limit:t.limit,query:{index:n,range:t.range}})})).then((({result:e})=>e)).then(e);t.keysOnly=!t.isMatch;var n=[];return this.each((function(e,t){n.push(t.primaryKey)})).then((function(){return n})).then(e)}uniqueKeys(e){return this._ctx.unique="unique",this.keys(e)}firstKey(e){return this.limit(1).keys((function(e){return e[0]})).then(e)}lastKey(e){return this.reverse().firstKey(e)}distinct(){var e=this._ctx,t=e.index&&e.table.schema.idxByName[e.index];if(!t||!t.multi)return this;var n={};return bt(this._ctx,(function(e){var t=e.primaryKey.toString(),r=o(n,t);return n[t]=!0,!r})),this}modify(e){var n=this._ctx;return this._write((r=>{var s;if("function"==typeof e)s=e;else{var i=t(e),o=i.length;s=function(t){let n=!1;for(let r=0;r{const{failures:r,numFailures:s}=n;d+=e-s;for(let e of t(r))h.push(r[e])};return this.clone().primaryKeys().then((t=>{const i=mt(n)&&n.limit===1/0&&("function"!=typeof e||e===Et)&&{index:n.index,range:n.range},o=n=>{const h=Math.min(c,t.length-n);return a.getMany({trans:r,keys:t.slice(n,n+h),cache:"immutable"}).then((d=>{const f=[],y=[],m=u?[]:null,b=[];for(let e=0;e0&&a.mutate({trans:r,type:"add",values:f}).then((e=>{for(let t in e.failures)b.splice(parseInt(t),1);p(f.length,e)}))).then((()=>(y.length>0||i&&"object"==typeof e)&&a.mutate({trans:r,type:"put",keys:m,values:y,criteria:i,changeSpec:"function"!=typeof e&&e,isAdditionalChunk:n>0}).then((e=>p(y.length,e))))).then((()=>(b.length>0||i&&e===Et)&&a.mutate({trans:r,type:"delete",keys:b,criteria:i,isAdditionalChunk:n>0}).then((e=>p(b.length,e))))).then((()=>t.length>n+h&&o(n+c)))}))};return o(0).then((()=>{if(h.length>0)throw new L("Error modifying one or more objects",h,d,f);return t.length}))}))}))}delete(){var e=this._ctx,t=e.range;return mt(e)&&(e.isPrimKey||3===t.type)?this._write((n=>{const{primaryKey:r}=e.table.core.schema,s=t;return e.table.core.count({trans:n,query:{index:r,range:s}}).then((t=>e.table.core.mutate({trans:n,type:"deleteRange",range:s}).then((({failures:e,lastResult:n,results:r,numFailures:s})=>{if(s)throw new L("Could not delete some values",Object.keys(e).map((t=>e[t])),t-s);return t-s}))))})):this.modify(Et)}}const Et=(e,t)=>t.value=null;function Kt(e,t){return et?-1:e===t?0:1}function Ct(e,t,n){var r=e instanceof It?new e.Collection(e):e;return r._ctx.error=n?new n(t):new TypeError(t),r}function At(e){return new e.Collection(e,(()=>Tt(""))).limit(0)}function jt(e,t,n,r,s,i){for(var o=Math.min(e.length,r.length),a=-1,u=0;u=0?e.substr(0,a)+t[a]+n.substr(a+1):null;s(e[u],l)<0&&(a=u)}return o"string"==typeof e)))return Ct(e,"String expected.");function d(e){s=function(e){return"next"===e?e=>e.toUpperCase():e=>e.toLowerCase()}(e),i=function(e){return"next"===e?e=>e.toLowerCase():e=>e.toUpperCase()}(e),o="next"===e?Kt:St;var t=n.map((function(e){return{lower:i(e),upper:s(e)}})).sort((function(e,t){return o(e.lower,t.lower)}));a=t.map((function(e){return e.upper})),u=t.map((function(e){return e.lower})),l=e,c="next"===e?"":r}d("next");var f=new e.Collection(e,(()=>qt(a[0],u[h-1]+r)));f._ondirectionchange=function(e){d(e)};var p=0;return f._addAlgorithm((function(e,n,r){var s=e.key;if("string"!=typeof s)return!1;var d=i(s);if(t(d,u,p))return!0;for(var f=null,y=p;y0)&&(f=m)}return n(null!==f?function(){e.continue(f+c)}:r),!1})),f}function qt(e,t,n,r){return{type:2,lower:e,upper:t,lowerOpen:n,upperOpen:r}}function Tt(e){return{type:1,lower:e,upper:e}}class It{get Collection(){return this._ctx.table.db.Collection}between(e,t,n,r){n=!1!==n,r=!0===r;try{return this._cmp(e,t)>0||0===this._cmp(e,t)&&(n||r)&&(!n||!r)?At(this):new this.Collection(this,(()=>qt(e,t,!n,!r)))}catch(e){return Ct(this,st)}}equals(e){return null==e?Ct(this,st):new this.Collection(this,(()=>Tt(e)))}above(e){return null==e?Ct(this,st):new this.Collection(this,(()=>qt(e,void 0,!0)))}aboveOrEqual(e){return null==e?Ct(this,st):new this.Collection(this,(()=>qt(e,void 0,!1)))}below(e){return null==e?Ct(this,st):new this.Collection(this,(()=>qt(void 0,e,!1,!0)))}belowOrEqual(e){return null==e?Ct(this,st):new this.Collection(this,(()=>qt(void 0,e)))}startsWith(e){return"string"!=typeof e?Ct(this,"String expected."):this.between(e,e+rt,!0,!0)}startsWithIgnoreCase(e){return""===e?this.startsWith(e):Dt(this,((e,t)=>0===e.indexOf(t[0])),[e],rt)}equalsIgnoreCase(e){return Dt(this,((e,t)=>e===t[0]),[e],"")}anyOfIgnoreCase(){var e=I.apply(T,arguments);return 0===e.length?At(this):Dt(this,((e,t)=>-1!==t.indexOf(e)),e,"")}startsWithAnyOfIgnoreCase(){var e=I.apply(T,arguments);return 0===e.length?At(this):Dt(this,((e,t)=>t.some((t=>0===e.indexOf(t)))),e,rt)}anyOf(){const e=I.apply(T,arguments);let t=this._cmp;try{e.sort(t)}catch(e){return Ct(this,st)}if(0===e.length)return At(this);const n=new this.Collection(this,(()=>qt(e[0],e[e.length-1])));n._ondirectionchange=n=>{t="next"===n?this._ascending:this._descending,e.sort(t)};let r=0;return n._addAlgorithm(((n,s,i)=>{const o=n.key;for(;t(o,e[r])>0;)if(++r,r===e.length)return s(i),!1;return 0===t(o,e[r])||(s((()=>{n.continue(e[r])})),!1)})),n}notEqual(e){return this.inAnyRange([[-(1/0),e],[e,this.db._maxKey]],{includeLowers:!1,includeUppers:!1})}noneOf(){const e=I.apply(T,arguments);if(0===e.length)return new this.Collection(this);try{e.sort(this._ascending)}catch(e){return Ct(this,st)}const t=e.reduce(((e,t)=>e?e.concat([[e[e.length-1][1],t]]):[[-(1/0),t]]),null);return t.push([e[e.length-1],this.db._maxKey]),this.inAnyRange(t,{includeLowers:!1,includeUppers:!1})}inAnyRange(e,t){const n=this._cmp,r=this._ascending,s=this._descending,i=this._min,o=this._max;if(0===e.length)return At(this);if(!e.every((e=>void 0!==e[0]&&void 0!==e[1]&&r(e[0],e[1])<=0)))return Ct(this,"First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower",W.InvalidArgument);const a=!t||!1!==t.includeLowers,u=t&&!0===t.includeUppers;let l,c=r;function h(e,t){return c(e[0],t[0])}try{l=e.reduce((function(e,t){let r=0,s=e.length;for(;r0){s[0]=i(s[0],t[0]),s[1]=o(s[1],t[1]);break}}return r===s&&e.push(t),e}),[]),l.sort(h)}catch(e){return Ct(this,st)}let d=0;const f=u?e=>r(e,l[d][1])>0:e=>r(e,l[d][1])>=0,p=a?e=>s(e,l[d][0])>0:e=>s(e,l[d][0])>=0;let y=f;const m=new this.Collection(this,(()=>qt(l[0][0],l[l.length-1][1],!a,!u)));return m._ondirectionchange=e=>{"next"===e?(y=f,c=r):(y=p,c=s),l.sort(h)},m._addAlgorithm(((e,t,n)=>{for(var s=e.key;y(s);)if(++d,d===l.length)return t(n),!1;return!!function(e){return!f(e)&&!p(e)}(s)||(0===this._cmp(s,l[d][1])||0===this._cmp(s,l[d][0])||t((()=>{c===r?e.continue(l[d][0]):e.continue(l[d][1])})),!1)})),m}startsWithAnyOf(){const e=I.apply(T,arguments);return e.every((e=>"string"==typeof e))?0===e.length?At(this):this.inAnyRange(e.map((e=>[e,e+rt]))):Ct(this,"startsWithAnyOf() only works with strings")}}function Bt(e){return Re((function(t){return Rt(t),e(t.target.error),!1}))}function Rt(e){e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault()}const $t=pt(null,"storagemutated");class Ft{_lock(){return m(!we.global),++this._reculock,1!==this._reculock||we.global||(we.lockOwnerFor=this),this}_unlock(){if(m(!we.global),0==--this._reculock)for(we.global||(we.lockOwnerFor=null);this._blockedFuncs.length>0&&!this._locked();){var e=this._blockedFuncs.shift();try{Je(e[1],e[0])}catch(e){}}return this}_locked(){return this._reculock&&we.lockOwnerFor!==this}create(e){if(!this.mode)return this;const t=this.db.idbdb,n=this.db._state.dbOpenError;if(m(!this.idbtrans),!e&&!t)switch(n&&n.name){case"DatabaseClosedError":throw new W.DatabaseClosed(n);case"MissingAPIError":throw new W.MissingAPI(n.message,n);default:throw new W.OpenFailed(n)}if(!this.active)throw new W.TransactionInactive;return m(null===this._completion._state),(e=this.idbtrans=e||(this.db.core?this.db.core.transaction(this.storeNames,this.mode,{durability:this.chromeTransactionDurability}):t.transaction(this.storeNames,this.mode,{durability:this.chromeTransactionDurability}))).onerror=Re((t=>{Rt(t),this._reject(e.error)})),e.onabort=Re((t=>{Rt(t),this.active&&this._reject(new W.Abort(e.error)),this.active=!1,this.on("abort").fire(t)})),e.oncomplete=Re((()=>{this.active=!1,this._resolve(),"mutatedParts"in e&&$t.storagemutated.fire(e.mutatedParts)})),this}_promise(e,t,n){if("readwrite"===e&&"readwrite"!==this.mode)return tt(new W.ReadOnly("Transaction is readonly"));if(!this.active)return tt(new W.TransactionInactive);if(this._locked())return new Oe(((r,s)=>{this._blockedFuncs.push([()=>{this._promise(e,t,n).then(r,s)},we])}));if(n)return Ve((()=>{var e=new Oe(((e,n)=>{this._lock();const r=t(e,n,this);r&&r.then&&r.then(e,n)}));return e.finally((()=>this._unlock())),e._lib=!0,e}));var r=new Oe(((e,n)=>{var r=t(e,n,this);r&&r.then&&r.then(e,n)}));return r._lib=!0,r}_root(){return this.parent?this.parent._root():this}waitFor(e){var t=this._root();const n=Oe.resolve(e);if(t._waitingFor)t._waitingFor=t._waitingFor.then((()=>n));else{t._waitingFor=n,t._waitingQueue=[];var r=t.idbtrans.objectStore(t.storeNames[0]);!function e(){for(++t._spinCount;t._waitingQueue.length;)t._waitingQueue.shift()();t._waitingFor&&(r.get(-1/0).onsuccess=e)}()}var s=t._waitingFor;return new Oe(((e,r)=>{n.then((n=>t._waitingQueue.push(Re(e.bind(null,n)))),(e=>t._waitingQueue.push(Re(r.bind(null,e))))).finally((()=>{t._waitingFor===s&&(t._waitingFor=null)}))}))}abort(){this.active&&(this.active=!1,this.idbtrans&&this.idbtrans.abort(),this._reject(new W.Abort))}table(e){const t=this._memoizedTables||(this._memoizedTables={});if(o(t,e))return t[e];const n=this.schema[e];if(!n)throw new W.NotFound("Table "+e+" not part of transaction");const r=new this.db.Table(e,n,this);return r.core=this.db.core.table(e),t[e]=r,r}}function Nt(e,t,n,r,s,i,o){return{name:e,keyPath:t,unique:n,multi:r,auto:s,compound:i,src:(n&&!o?"&":"")+(r?"*":"")+(s?"++":"")+Mt(t)}}function Mt(e){return"string"==typeof e?e:e?"["+[].join.call(e,"+")+"]":""}function Lt(e,t,n){return{name:e,primKey:t,indexes:n,mappedClass:null,idxByName:(r=n,s=e=>[e.name,e],r.reduce(((e,t,n)=>{var r=s(t,n);return r&&(e[r[0]]=r[1]),e}),{}))};var r,s}let Ut=e=>{try{return e.only([[]]),Ut=()=>[[]],[[]]}catch(e){return Ut=()=>rt,rt}};function Vt(e){return null==e?()=>{}:"string"==typeof e?function(e){return 1===e.split(".").length?t=>t[e]:t=>g(t,e)}(e):t=>g(t,e)}function zt(e){return[].slice.call(e)}let Wt=0;function Yt(e){return null==e?":id":"string"==typeof e?e:`[${e.join("+")}]`}function Gt(e,t,r){function s(e){if(3===e.type)return null;if(4===e.type)throw new Error("Cannot convert never type to IDBKeyRange");const{lower:n,upper:r,lowerOpen:s,upperOpen:i}=e;return void 0===n?void 0===r?null:t.upperBound(r,!!i):void 0===r?t.lowerBound(n,!!s):t.bound(n,r,!!s,!!i)}const{schema:i,hasGetAll:o}=function(e,t){const r=zt(e.objectStoreNames);return{schema:{name:e.name,tables:r.map((e=>t.objectStore(e))).map((e=>{const{keyPath:t,autoIncrement:r}=e,s=n(t),i=null==t,o={},a={name:e.name,primaryKey:{name:null,isPrimaryKey:!0,outbound:i,compound:s,keyPath:t,autoIncrement:r,unique:!0,extractKey:Vt(t)},indexes:zt(e.indexNames).map((t=>e.index(t))).map((e=>{const{name:t,unique:r,multiEntry:s,keyPath:i}=e,a={name:t,compound:n(i),keyPath:i,unique:r,multiEntry:s,extractKey:Vt(i)};return o[Yt(i)]=a,a})),getIndexByKeyPath:e=>o[Yt(e)]};return o[":id"]=a.primaryKey,null!=t&&(o[Yt(t)]=a.primaryKey),a}))},hasGetAll:r.length>0&&"getAll"in t.objectStore(r[0])&&!("undefined"!=typeof navigator&&/Safari/.test(navigator.userAgent)&&!/(Chrome\/|Edge\/)/.test(navigator.userAgent)&&[].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1]<604)}}(e,r),a=i.tables.map((e=>function(e){const t=e.name;return{name:t,schema:e,mutate:function({trans:e,type:n,keys:r,values:i,range:o}){return new Promise(((a,u)=>{a=Re(a);const l=e.objectStore(t),c=null==l.keyPath,h="put"===n||"add"===n;if(!h&&"delete"!==n&&"deleteRange"!==n)throw new Error("Invalid operation type: "+n);const{length:d}=r||i||{length:1};if(r&&i&&r.length!==i.length)throw new Error("Given keys array must have same length as given values array.");if(0===d)return a({numFailures:0,failures:{},results:[],lastResult:void 0});let f;const p=[],y=[];let m=0;const b=e=>{++m,Rt(e)};if("deleteRange"===n){if(4===o.type)return a({numFailures:m,failures:y,results:[],lastResult:void 0});3===o.type?p.push(f=l.clear()):p.push(f=l.delete(s(o)))}else{const[e,t]=h?c?[i,r]:[i,null]:[r,null];if(h)for(let r=0;r{const t=e.target.result;p.forEach(((e,t)=>null!=e.error&&(y[t]=e.error))),a({numFailures:m,failures:y,results:"delete"===n?r:p.map((e=>e.result)),lastResult:t})};f.onerror=e=>{b(e),g(e)},f.onsuccess=g}))},getMany:({trans:e,keys:n})=>new Promise(((r,s)=>{r=Re(r);const i=e.objectStore(t),o=n.length,a=new Array(o);let u,l=0,c=0;const h=e=>{const t=e.target;a[t._pos]=t.result,++c===l&&r(a)},d=Bt(s);for(let e=0;enew Promise(((r,s)=>{r=Re(r);const i=e.objectStore(t).get(n);i.onsuccess=e=>r(e.target.result),i.onerror=Bt(s)})),query:function(e){return n=>new Promise(((r,i)=>{r=Re(r);const{trans:o,values:a,limit:u,query:l}=n,c=u===1/0?void 0:u,{index:h,range:d}=l,f=o.objectStore(t),p=h.isPrimaryKey?f:f.index(h.name),y=s(d);if(0===u)return r({result:[]});if(e){const e=a?p.getAll(y,c):p.getAllKeys(y,c);e.onsuccess=e=>r({result:e.target.result}),e.onerror=Bt(i)}else{let e=0;const t=a||!("openKeyCursor"in p)?p.openCursor(y):p.openKeyCursor(y),n=[];t.onsuccess=s=>{const i=t.result;return i?(n.push(a?i.value:i.primaryKey),++e===u?r({result:n}):void i.continue()):r({result:n})},t.onerror=Bt(i)}}))}(o),openCursor:function({trans:e,values:n,query:r,reverse:i,unique:o}){return new Promise(((a,u)=>{a=Re(a);const{index:l,range:c}=r,h=e.objectStore(t),d=l.isPrimaryKey?h:h.index(l.name),f=i?o?"prevunique":"prev":o?"nextunique":"next",p=n||!("openKeyCursor"in d)?d.openCursor(s(c),f):d.openKeyCursor(s(c),f);p.onerror=Bt(u),p.onsuccess=Re((t=>{const n=p.result;if(!n)return void a(null);n.___id=++Wt,n.done=!1;const r=n.continue.bind(n);let s=n.continuePrimaryKey;s&&(s=s.bind(n));const i=n.advance.bind(n),o=()=>{throw new Error("Cursor not stopped")};n.trans=e,n.stop=n.continue=n.continuePrimaryKey=n.advance=()=>{throw new Error("Cursor not started")},n.fail=Re(u),n.next=function(){let e=1;return this.start((()=>e--?this.continue():this.stop())).then((()=>this))},n.start=e=>{const t=new Promise(((e,t)=>{e=Re(e),p.onerror=Bt(t),n.fail=t,n.stop=t=>{n.stop=n.continue=n.continuePrimaryKey=n.advance=o,e(t)}})),a=()=>{if(p.result)try{e()}catch(e){n.fail(e)}else n.done=!0,n.start=()=>{throw new Error("Cursor behind last entry")},n.stop()};return p.onsuccess=Re((e=>{p.onsuccess=a,a()})),n.continue=r,n.continuePrimaryKey=s,n.advance=i,a(),t},a(n)}),u)}))},count({query:e,trans:n}){const{index:r,range:i}=e;return new Promise(((e,o)=>{const a=n.objectStore(t),u=r.isPrimaryKey?a:a.index(r.name),l=s(i),c=l?u.count(l):u.count();c.onsuccess=Re((t=>e(t.target.result))),c.onerror=Bt(o)}))}}}(e))),u={};return a.forEach((e=>u[e.name]=e)),{stack:"dbcore",transaction:e.transaction.bind(e),table(e){if(!u[e])throw new Error(`Table '${e}' not found`);return u[e]},MIN_KEY:-1/0,MAX_KEY:Ut(t),schema:i}}function Qt(e,t){const n=t.db,r=function(e,t,{IDBKeyRange:n,indexedDB:r},s){const i=function(e,t){return t.reduce(((e,{create:t})=>({...e,...t(e)})),e)}(Gt(t,n,s),e.dbcore);return{dbcore:i}}(e._middlewares,n,e._deps,t);e.core=r.dbcore,e.tables.forEach((t=>{const n=t.name;e.core.schema.tables.some((e=>e.name===n))&&(t.core=e.core.table(n),e[n]instanceof e.Table&&(e[n].core=t.core))}))}function Xt(e,t,n,r){n.forEach((n=>{const s=r[n];t.forEach((t=>{const r=d(t,n);(!r||"value"in r&&void 0===r.value)&&(t===e.Transaction.prototype||t instanceof e.Transaction?l(t,n,{get(){return this.table(n)},set(e){u(this,n,{value:e,writable:!0,configurable:!0,enumerable:!0})}}):t[n]=new e.Table(n,s))}))}))}function Ht(e,t){t.forEach((t=>{for(let n in t)t[n]instanceof e.Table&&delete t[n]}))}function Jt(e,t){return e._cfg.version-t._cfg.version}function Zt(e,n,r,s){const i=e._dbSchema;r.objectStoreNames.contains("$meta")&&!i.$meta&&(i.$meta=Lt("$meta",an("")[0],[]),e._storeNames.push("$meta"));const o=e._createTransaction("readwrite",e._storeNames,i);o.create(r),o._completion.catch(s);const a=o._reject.bind(o),u=we.transless||we;Ve((()=>{if(we.trans=o,we.transless=u,0!==n)return Qt(e,r),function(e,t,n){return t.storeNames.includes("$meta")?t.table("$meta").get("version").then((e=>null!=e?e:n)):Oe.resolve(n)}(0,o,n).then((n=>function(e,n,r,s){const i=[],o=e._versions;let a=e._dbSchema=sn(e,e.idbdb,s);const u=o.filter((e=>e._cfg.version>=n));if(0===u.length)return Oe.resolve();function l(){return i.length?Oe.resolve(i.shift()(r.idbtrans)).then(l):Oe.resolve()}return u.forEach((o=>{i.push((()=>{const i=a,u=o._cfg.dbschema;on(e,i,s),on(e,u,s),a=e._dbSchema=u;const l=en(i,u);l.add.forEach((e=>{tn(s,e[0],e[1].primKey,e[1].indexes)})),l.change.forEach((e=>{if(e.recreate)throw new W.Upgrade("Not yet support for changing primary key");{const t=s.objectStore(e.name);e.add.forEach((e=>rn(t,e))),e.change.forEach((e=>{t.deleteIndex(e.name),rn(t,e)})),e.del.forEach((e=>t.deleteIndex(e)))}}));const c=o._cfg.contentUpgrade;if(c&&o._cfg.version>n){Qt(e,s),r._memoizedTables={};let n=w(u);l.del.forEach((e=>{n[e]=i[e]})),Ht(e,[e.Transaction.prototype]),Xt(e,[e.Transaction.prototype],t(n),n),r.schema=n;const o=B(c);let a;o&&ze();const h=Oe.follow((()=>{if(a=c(r),a&&o){var e=We.bind(null,null);a.then(e,e)}}));return a&&"function"==typeof a.then?Oe.resolve(a):h.then((()=>a))}})),i.push((t=>{!function(e,t){[].slice.call(t.db.objectStoreNames).forEach((n=>null==e[n]&&t.db.deleteObjectStore(n)))}(o._cfg.dbschema,t),Ht(e,[e.Transaction.prototype]),Xt(e,[e.Transaction.prototype],e._storeNames,e._dbSchema),r.schema=e._dbSchema})),i.push((t=>{e.idbdb.objectStoreNames.contains("$meta")&&(Math.ceil(e.idbdb.version/10)===o._cfg.version?(e.idbdb.deleteObjectStore("$meta"),delete e._dbSchema.$meta,e._storeNames=e._storeNames.filter((e=>"$meta"!==e))):t.objectStore("$meta").put(o._cfg.version,"version"))}))})),l().then((()=>{nn(a,s)}))}(e,n,o,r))).catch(a);t(i).forEach((e=>{tn(r,e,i[e].primKey,i[e].indexes)})),Qt(e,r),Oe.follow((()=>e.on.populate.fire(o))).catch(a)}))}function en(e,t){const n={del:[],add:[],change:[]};let r;for(r in e)t[r]||n.del.push(r);for(r in t){const s=e[r],i=t[r];if(s){const e={name:r,def:i,recreate:!1,del:[],add:[],change:[]};if(""+(s.primKey.keyPath||"")!=""+(i.primKey.keyPath||"")||s.primKey.auto!==i.primKey.auto)e.recreate=!0,n.change.push(e);else{const t=s.idxByName,r=i.idxByName;let o;for(o in t)r[o]||e.del.push(o);for(o in r){const n=t[o],s=r[o];n?n.src!==s.src&&e.change.push(s):e.add.push(s)}(e.del.length>0||e.add.length>0||e.change.length>0)&&n.change.push(e)}}else n.add.push([r,i])}return n}function tn(e,t,n,r){const s=e.db.createObjectStore(t,n.keyPath?{keyPath:n.keyPath,autoIncrement:n.auto}:{autoIncrement:n.auto});return r.forEach((e=>rn(s,e))),s}function nn(e,n){t(e).forEach((t=>{n.db.objectStoreNames.contains(t)||(se&&console.debug("Dexie: Creating missing table",t),tn(n,t,e[t].primKey,e[t].indexes))}))}function rn(e,t){e.createIndex(t.name,t.keyPath,{unique:t.unique,multiEntry:t.multi})}function sn(e,t,n){const r={};return p(t.objectStoreNames,0).forEach((e=>{const t=n.objectStore(e);let s=t.keyPath;const i=Nt(Mt(s),s||"",!0,!1,!!t.autoIncrement,s&&"string"!=typeof s,!0),o=[];for(let e=0;e{const r=(e=e.trim()).replace(/([&*]|\+\+)/g,""),s=/^\[/.test(r)?r.match(/^\[(.*)\]$/)[1].split("+"):r;return Nt(r,s||null,/\&/.test(e),/\*/.test(e),/\+\+/.test(e),n(s),0===t)}))}class un{_parseStoresSpec(e,n){t(e).forEach((t=>{if(null!==e[t]){var r=an(e[t]),s=r.shift();if(s.unique=!0,s.multi)throw new W.Schema("Primary key cannot be multi-valued");r.forEach((e=>{if(e.auto)throw new W.Schema("Only primary key can be marked as autoIncrement (++)");if(!e.keyPath)throw new W.Schema("Index must have a name and cannot be an empty string")})),n[t]=Lt(t,s,r)}}))}stores(e){const n=this.db;this._cfg.storesSource=this._cfg.storesSource?r(this._cfg.storesSource,e):e;const s=n._versions,i={};let o={};return s.forEach((e=>{r(i,e._cfg.storesSource),o=e._cfg.dbschema={},e._parseStoresSpec(i,o)})),n._dbSchema=o,Ht(n,[n._allTables,n,n.Transaction.prototype]),Xt(n,[n._allTables,n,n.Transaction.prototype,this._cfg.tables],t(o),o),n._storeNames=t(o),this}upgrade(e){return this._cfg.contentUpgrade=re(this._cfg.contentUpgrade||Q,e),this}}function ln(e,t){let n=e._dbNamesDB;return n||(n=e._dbNamesDB=new Hn("__dbnames",{addons:[],indexedDB:e,IDBKeyRange:t}),n.version(1).stores({dbnames:"name"})),n.table("dbnames")}function cn(e){return e&&"function"==typeof e.databases}function hn(e){return Ve((function(){return we.letThrough=!0,e()}))}function dn(){var e;return!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent)&&indexedDB.databases?new Promise((function(t){var n=function(){return indexedDB.databases().finally(t)};e=setInterval(n,100),n()})).finally((function(){return clearInterval(e)})):Promise.resolve()}function fn(e){return!("from"in e)}const pn=function(e,t){if(!this){const t=new pn;return e&&"d"in e&&r(t,e),t}r(this,arguments.length?{d:1,from:e,to:arguments.length>1?t:e}:{d:0})};function yn(e,t,n){const s=ct(t,n);if(isNaN(s))return;if(s>0)throw RangeError();if(fn(e))return r(e,{from:t,to:n,d:1});const i=e.l,o=e.r;if(ct(n,e.from)<0)return i?yn(i,t,n):e.l={from:t,to:n,d:1,l:null,r:null},vn(e);if(ct(t,e.to)>0)return o?yn(o,t,n):e.r={from:t,to:n,d:1,l:null,r:null},vn(e);ct(t,e.from)<0&&(e.from=t,e.l=null,e.d=o?o.d+1:1),ct(n,e.to)>0&&(e.to=n,e.r=null,e.d=e.l?e.l.d+1:1);const a=!e.r;i&&!e.l&&mn(e,i),o&&a&&mn(e,o)}function mn(e,t){fn(t)||function e(t,{from:n,to:r,l:s,r:i}){yn(t,n,r),s&&e(t,s),i&&e(t,i)}(e,t)}function bn(e,t){const n=gn(t);let r=n.next();if(r.done)return!1;let s=r.value;const i=gn(e);let o=i.next(s.from),a=o.value;for(;!r.done&&!o.done;){if(ct(a.from,s.to)<=0&&ct(a.to,s.from)>=0)return!0;ct(s.from,a.from)<0?s=(r=n.next(a.from)).value:a=(o=i.next(s.from)).value}return!1}function gn(e){let t=fn(e)?null:{s:0,n:e};return{next(e){const n=arguments.length>0;for(;t;)switch(t.s){case 0:if(t.s=1,n)for(;t.n.l&&ct(e,t.n.from)<0;)t={up:t,n:t.n.l,s:1};else for(;t.n.l;)t={up:t,n:t.n.l,s:1};case 1:if(t.s=2,!n||ct(e,t.n.to)<=0)return{value:t.n,done:!1};case 2:if(t.n.r){t.s=3,t={up:t,n:t.n.r,s:0};continue}case 3:t=t.up}return{done:!0}}}}function vn(e){const t=(e.r?.d||0)-(e.l?.d||0),n=t>1?"r":t<-1?"l":"";if(n){const t="r"===n?"l":"r",r={...e},s=e[n];e.from=s.from,e.to=s.to,e[n]=s[n],r[n]=s[t],e[t]=r,r.d=wn(r)}e.d=wn(e)}function wn({r:e,l:t}){return(e?t?Math.max(e.d,t.d):e.d:t?t.d:0)+1}function _n(e,n){return t(n).forEach((t=>{e[t]?mn(e[t],n[t]):e[t]=P(n[t])})),e}function xn(e,t){return e.all||t.all||Object.keys(e).some((n=>t[n]&&bn(t[n],e[n])))}a(pn.prototype,{add(e){return mn(this,e),this},addKey(e){return yn(this,e,e),this},addKeys(e){return e.forEach((e=>yn(this,e,e))),this},[j](){return gn(this)}});const kn={};let On={},Pn=!1;function En(e,t=!1){_n(On,e),Pn||(Pn=!0,setTimeout((()=>{Pn=!1;const e=On;On={},Kn(e,!1)}),0))}function Kn(e,t=!1){const n=new Set;if(e.all)for(const r of Object.values(kn))Sn(r,e,n,t);else for(const r in e){const s=/^idb\:\/\/(.*)\/(.*)\//.exec(r);if(s){const[,r,i]=s,o=kn[`idb://${r}/${i}`];o&&Sn(o,e,n,t)}}n.forEach((e=>e()))}function Sn(e,t,n,r){const s=[];for(const[i,o]of Object.entries(e.queries.query)){const e=[];for(const s of o)xn(t,s.obsSet)?s.subscribers.forEach((e=>n.add(e))):r&&e.push(s);r&&s.push([i,e])}if(r)for(const[t,n]of s)e.queries.query[t]=n}function Cn(e){const n=e._state,{indexedDB:r}=e._deps;if(n.isBeingOpened||e.idbdb)return n.dbReadyPromise.then((()=>n.dbOpenError?tt(n.dbOpenError):e));n.isBeingOpened=!0,n.dbOpenError=null,n.openComplete=!1;const s=n.openCanceller;let i=Math.round(10*e.verno),o=!1;function a(){if(n.openCanceller!==s)throw new W.DatabaseClosed("db.open() was cancelled")}let u=n.dbReadyResolve,l=null,c=!1;const h=()=>new Oe(((s,u)=>{if(a(),!r)throw new W.MissingAPI;const d=e.name,f=n.autoSchema||!i?r.open(d):r.open(d,i);if(!f)throw new W.MissingAPI;f.onerror=Bt(u),f.onblocked=Re(e._fireOnBlocked),f.onupgradeneeded=Re((t=>{if(l=f.transaction,n.autoSchema&&!e._options.allowEmptyDB){f.onerror=Rt,l.abort(),f.result.close();const e=r.deleteDatabase(d);e.onsuccess=e.onerror=Re((()=>{u(new W.NoSuchDatabase(`Database ${d} doesnt exist`))}))}else{l.onerror=Bt(u);const n=t.oldVersion>Math.pow(2,62)?0:t.oldVersion;c=n<1,e.idbdb=f.result,o&&function(e,t){nn(e._dbSchema,t),t.db.version%10!=0||t.objectStoreNames.contains("$meta")||t.db.createObjectStore("$meta").add(Math.ceil(t.db.version/10-1),"version");const n=sn(0,e.idbdb,t);on(e,e._dbSchema,t);const r=en(n,e._dbSchema);for(const e of r.change){if(e.change.length||e.recreate)return void console.warn(`Unable to patch indexes of table ${e.name} because it has changes on the type of index or primary key.`);const n=t.objectStore(e.name);e.add.forEach((t=>{se&&console.debug(`Dexie upgrade patch: Creating missing index ${e.name}.${t.src}`),rn(n,t)}))}}(e,l),Zt(e,n/10,l,u)}}),u),f.onsuccess=Re((()=>{l=null;const r=e.idbdb=f.result,a=p(r.objectStoreNames);if(a.length>0)try{const l=r.transaction(1===(u=a).length?u[0]:u,"readonly");if(n.autoSchema)!function(e,n,r){e.verno=n.version/10;const s=e._dbSchema=sn(0,n,r);e._storeNames=p(n.objectStoreNames,0),Xt(e,[e._allTables],t(s),s)}(e,r,l);else if(on(e,e._dbSchema,l),!function(e,t){const n=en(sn(0,e.idbdb,t),e._dbSchema);return!(n.add.length||n.change.some((e=>e.add.length||e.change.length)))}(e,l)&&!o)return console.warn("Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this."),r.close(),i=r.version+1,o=!0,s(h());Qt(e,l)}catch(e){}var u;it.push(e),r.onversionchange=Re((t=>{n.vcFired=!0,e.on("versionchange").fire(t)})),r.onclose=Re((t=>{e.on("close").fire(t)})),c&&function({indexedDB:e,IDBKeyRange:t},n){!cn(e)&&"__dbnames"!==n&&ln(e,t).put({name:n}).catch(Q)}(e._deps,d),s()}),u)})).catch((e=>{switch(e?.name){case"UnknownError":if(n.PR1398_maxLoop>0)return n.PR1398_maxLoop--,console.warn("Dexie: Workaround for Chrome UnknownError on open()"),h();break;case"VersionError":if(i>0)return i=0,h()}return Oe.reject(e)}));return Oe.race([s,("undefined"==typeof navigator?Oe.resolve():dn()).then(h)]).then((()=>(a(),n.onReadyBeingFired=[],Oe.resolve(hn((()=>e.on.ready.fire(e.vip)))).then((function t(){if(n.onReadyBeingFired.length>0){let r=n.onReadyBeingFired.reduce(re,Q);return n.onReadyBeingFired=[],Oe.resolve(hn((()=>r(e.vip)))).then(t)}}))))).finally((()=>{n.openCanceller===s&&(n.onReadyBeingFired=null,n.isBeingOpened=!1)})).catch((t=>{n.dbOpenError=t;try{l&&l.abort()}catch{}return s===n.openCanceller&&e._close(),tt(t)})).finally((()=>{n.openComplete=!0,u()})).then((()=>{if(c){const t={};e.tables.forEach((n=>{n.schema.indexes.forEach((r=>{r.name&&(t[`idb://${e.name}/${n.name}/${r.name}`]=new pn(-1/0,[[[]]]))})),t[`idb://${e.name}/${n.name}/`]=t[`idb://${e.name}/${n.name}/:dels`]=new pn(-1/0,[[[]]])})),$t("storagemutated").fire(t),Kn(t,!0)}return e}))}function An(e){var t=t=>e.next(t),r=i(t),s=i((t=>e.throw(t)));function i(e){return t=>{var i=e(t),o=i.value;return i.done?o:o&&"function"==typeof o.then?o.then(r,s):n(o)?Promise.all(o).then(r,s):r(o)}}return i(t)()}function jn(e,t,n){var r=arguments.length;if(r<2)throw new W.InvalidArgument("Too few arguments");for(var s=new Array(r-1);--r;)s[r-1]=arguments[r];n=s.pop();var i=x(s);return[e,i,n]}function Dn(e,t,n,r,s){return Oe.resolve().then((()=>{const i=we.transless||we,o=e._createTransaction(t,n,e._dbSchema,r);o.explicit=!0;const a={trans:o,transless:i};if(r)o.idbtrans=r.idbtrans;else try{o.create(),o.idbtrans._explicit=!0,e._state.PR1398_maxLoop=3}catch(r){return r.name===V.InvalidState&&e.isOpen()&&--e._state.PR1398_maxLoop>0?(console.warn("Dexie: Need to reopen db"),e.close({disableAutoOpen:!1}),e.open().then((()=>Dn(e,t,n,null,s)))):tt(r)}const u=B(s);let l;u&&ze();const c=Oe.follow((()=>{if(l=s.call(o,o),l)if(u){var e=We.bind(null,null);l.then(e,e)}else"function"==typeof l.next&&"function"==typeof l.throw&&(l=An(l))}),a);return(l&&"function"==typeof l.then?Oe.resolve(l).then((e=>o.active?e:tt(new W.PrematureCommit("Transaction committed too early. See http://bit.ly/2kdckMn")))):c.then((()=>l))).then((e=>(r&&o._resolve(),o._completion.then((()=>e))))).catch((e=>(o._reject(e),tt(e))))}))}function qn(e,t,r){const s=n(e)?e.slice():[e];for(let e=0;e0,c={...n,name:l?`${r}(virtual-from:${n.name})`:n.name,lowLevelIndex:n,isVirtual:l,keyTail:t,keyLength:u,extractKey:Vt(e),unique:!l&&n.unique};if(a.push(c),c.isPrimaryKey||i.push(c),u>1){o(2===u?e[0]:e.slice(0,u-1),t+1,n)}return a.sort(((e,t)=>e.keyTail-t.keyTail)),c}const a=o(r.primaryKey.keyPath,0,r.primaryKey);s[":id"]=[a];for(const e of r.indexes)o(e.keyPath,0,e);function u(t){const n=t.query.index;return n.isVirtual?{...t,query:{index:n.lowLevelIndex,range:(r=t.query.range,s=n.keyTail,{type:1===r.type?2:r.type,lower:qn(r.lower,r.lowerOpen?e.MAX_KEY:e.MIN_KEY,s),lowerOpen:!0,upper:qn(r.upper,r.upperOpen?e.MIN_KEY:e.MAX_KEY,s),upperOpen:!0})}}:t;var r,s}const l={...n,schema:{...r,primaryKey:a,indexes:i,getIndexByKeyPath:function(e){const t=s[Yt(e)];return t&&t[0]}},count:e=>n.count(u(e)),query:e=>n.query(u(e)),openCursor(t){const{keyTail:r,isVirtual:s,keyLength:i}=t.query.index;if(!s)return n.openCursor(t);return n.openCursor(u(t)).then((n=>n&&function(n){const s=Object.create(n,{continue:{value:function(s){null!=s?n.continue(qn(s,t.reverse?e.MAX_KEY:e.MIN_KEY,r)):t.unique?n.continue(n.key.slice(0,i).concat(t.reverse?e.MIN_KEY:e.MAX_KEY,r)):n.continue()}},continuePrimaryKey:{value(t,s){n.continuePrimaryKey(qn(t,e.MAX_KEY,r),s)}},primaryKey:{get:()=>n.primaryKey},key:{get(){const e=n.key;return 1===i?e[0]:e.slice(0,i)}},value:{get:()=>n.value}});return s}(n)))}};return l}}}};function In(e,n,r,s){return r=r||{},s=s||"",t(e).forEach((t=>{if(o(n,t)){var i=e[t],a=n[t];if("object"==typeof i&&"object"==typeof a&&i&&a){const e=A(i);e!==A(a)?r[s+t]=n[t]:"Object"===e?In(i,a,r,s+t+"."):i!==a&&(r[s+t]=n[t])}else i!==a&&(r[s+t]=n[t])}else r[s+t]=void 0})),t(n).forEach((t=>{o(e,t)||(r[s+t]=n[t])})),r}function Bn(e,t){return"delete"===t.type?t.keys:t.keys||t.values.map(e.extractKey)}const Rn={stack:"dbcore",name:"HooksMiddleware",level:2,create:e=>({...e,table(t){const n=e.table(t),{primaryKey:r}=n.schema,s={...n,mutate(e){const s=we.trans,{deleting:i,creating:a,updating:u}=s.table(t).hook;switch(e.type){case"add":if(a.fire===Q)break;return s._promise("readwrite",(()=>l(e)),!0);case"put":if(a.fire===Q&&u.fire===Q)break;return s._promise("readwrite",(()=>l(e)),!0);case"delete":if(i.fire===Q)break;return s._promise("readwrite",(()=>l(e)),!0);case"deleteRange":if(i.fire===Q)break;return s._promise("readwrite",(()=>function(e){return c(e.trans,e.range,1e4)}(e)),!0)}return n.mutate(e);function l(e){const t=we.trans,s=e.keys||Bn(r,e);if(!s)throw new Error("Keys missing");return"delete"!==(e="add"===e.type||"put"===e.type?{...e,keys:s}:{...e}).type&&(e.values=[...e.values]),e.keys&&(e.keys=[...e.keys]),function(e,t,n){return"add"===t.type?Promise.resolve([]):e.getMany({trans:t.trans,keys:n,cache:"immutable"})}(n,e,s).then((l=>{const c=s.map(((n,s)=>{const c=l[s],h={onerror:null,onsuccess:null};if("delete"===e.type)i.fire.call(h,n,c,t);else if("add"===e.type||void 0===c){const i=a.fire.call(h,n,e.values[s],t);null==n&&null!=i&&(n=i,e.keys[s]=n,r.outbound||v(e.values[s],r.keyPath,n))}else{const r=In(c,e.values[s]),i=u.fire.call(h,r,n,c,t);if(i){const t=e.values[s];Object.keys(i).forEach((e=>{o(t,e)?t[e]=i[e]:v(t,e,i[e])}))}}return h}));return n.mutate(e).then((({failures:t,results:n,numFailures:r,lastResult:i})=>{for(let r=0;r(c.forEach((t=>t.onerror&&t.onerror(e))),Promise.reject(e))))}))}function c(e,t,s){return n.query({trans:e,values:!1,query:{index:r,range:t},limit:s}).then((({result:n})=>l({type:"delete",keys:n,trans:e}).then((r=>r.numFailures>0?Promise.reject(r.failures[0]):n.length({table:t=>{const n=e.table(t);return{...n,getMany:e=>{if(!e.cache)return n.getMany(e);const t=$n(e.keys,e.trans._cache,"clone"===e.cache);return t?Oe.resolve(t):n.getMany(e).then((t=>(e.trans._cache={keys:e.keys,values:"clone"===e.cache?K(t):t},t)))},mutate:e=>("add"!==e.type&&(e.trans._cache=null),n.mutate(e))}}})};function Nn(e,t){return"readonly"===e.trans.mode&&!!e.subscr&&!e.trans.explicit&&"disabled"!==e.trans.db._options.cache&&!t.schema.primaryKey.outbound}function Mn(e,t){switch(e){case"query":return t.values&&!t.unique;case"get":case"getMany":case"count":case"openCursor":return!1}}const Ln={stack:"dbcore",level:0,name:"Observability",create:e=>{const r=e.schema.name,s=new pn(e.MIN_KEY,e.MAX_KEY);return{...e,transaction:(t,n,r)=>{if(we.subscr&&"readonly"!==n)throw new W.ReadOnly(`Readwrite transaction in liveQuery context. Querier source: ${we.querier}`);return e.transaction(t,n,r)},table:i=>{const o=e.table(i),{schema:a}=o,{primaryKey:u,indexes:l}=a,{extractKey:c,outbound:h}=u,d=u.autoIncrement&&l.filter((e=>e.compound&&e.keyPath.includes(u.keyPath))),f={...o,mutate:e=>{const t=e.trans,l=e.mutatedParts||(e.mutatedParts={}),c=e=>{const t=`idb://${r}/${i}/${e}`;return l[t]||(l[t]=new pn)},h=c(""),f=c(":dels"),{type:p}=e;let[y,m]="deleteRange"===e.type?[e.range]:"delete"===e.type?[e.keys]:e.values.length<50?[Bn(u,e).filter((e=>e)),e.values]:[];const b=e.trans._cache;if(n(y)){h.addKeys(y);const e="delete"===p||y.length===m.length?$n(y,b):null;e||f.addKeys(y),(e||m)&&function(e,t,r,s){function i(t){const i=e(t.name||"");function o(e){return null!=e?t.extractKey(e):null}const a=e=>t.multiEntry&&n(e)?e.forEach((e=>i.addKey(e))):i.addKey(e);(r||s).forEach(((e,t)=>{const n=r&&o(r[t]),i=s&&o(s[t]);0!==ct(n,i)&&(null!=n&&a(n),null!=i&&a(i))}))}t.indexes.forEach(i)}(c,a,e,m)}else if(y){const e={from:y.lower,to:y.upper};f.add(e),h.add(e)}else h.add(s),f.add(s),a.indexes.forEach((e=>c(e.name).add(s)));return o.mutate(e).then((n=>(!y||"add"!==e.type&&"put"!==e.type||(h.addKeys(n.results),d&&d.forEach((t=>{const r=e.values.map((e=>t.extractKey(e))),s=t.keyPath.findIndex((e=>e===u.keyPath));n.results.forEach((e=>r[s]=e)),c(t.name).addKeys(r)}))),t.mutatedParts=_n(t.mutatedParts||{},l),n)))}},p=({query:{index:t,range:n}})=>[t,new pn(n.lower??e.MIN_KEY,n.upper??e.MAX_KEY)],y={get:e=>[u,new pn(e.key)],getMany:e=>[u,(new pn).addKeys(e.keys)],count:p,query:p,openCursor:p};return t(y).forEach((e=>{f[e]=function(t){const{subscr:n}=we,a=!!n;let u=Nn(we,o)&&Mn(e,t);const l=u?t.obsSet={}:n;if(a){const n=e=>{const t=`idb://${r}/${i}/${e}`;return l[t]||(l[t]=new pn)},a=n(""),u=n(":dels"),[d,f]=y[e](t);if("query"===e&&d.isPrimaryKey&&!t.values?u.add(f):n(d.name||"").add(f),!d.isPrimaryKey){if("count"!==e){const n="query"===e&&h&&t.values&&o.query({...t,values:!1});return o[e].apply(this,arguments).then((r=>{if("query"===e){if(h&&t.values)return n.then((({result:e})=>(a.addKeys(e),r)));const e=t.values?r.result.map(c):r.result;t.values?a.addKeys(e):u.addKeys(e)}else if("openCursor"===e){const e=r,n=t.values;return e&&Object.create(e,{key:{get:()=>(u.addKey(e.primaryKey),e.key)},primaryKey:{get(){const t=e.primaryKey;return u.addKey(t),t}},value:{get:()=>(n&&a.addKey(e.primaryKey),e.value)}})}return r}))}u.add(s)}}return o[e].apply(this,arguments)}})),f}}}};function Un(e,t,r){if(0===r.numFailures)return t;if("deleteRange"===t.type)return null;const s=t.keys?t.keys.length:"values"in t&&t.values?t.values.length:1;if(r.numFailures===s)return null;const i={...t};return n(i.keys)&&(i.keys=i.keys.filter(((e,t)=>!(t in r.failures)))),"values"in i&&n(i.values)&&(i.values=i.values.filter(((e,t)=>!(t in r.failures)))),i}function Vn(e,t){return function(e,t){return void 0===t.lower||(t.lowerOpen?ct(e,t.lower)>0:ct(e,t.lower)>=0)}(e,t)&&function(e,t){return void 0===t.upper||(t.upperOpen?ct(e,t.upper)<0:ct(e,t.upper)<=0)}(e,t)}function zn(e,t,r,s,i,o){if(!r||0===r.length)return e;const a=t.query.index,{multiEntry:u}=a,l=t.query.range,c=s.schema.primaryKey.extractKey,h=a.extractKey,d=(a.lowLevelIndex||a).extractKey;let f=r.reduce(((e,r)=>{let s=e;const i="add"===r.type||"put"===r.type?r.values.filter((e=>{const t=h(e);return u&&n(t)?t.some((e=>Vn(e,l))):Vn(t,l)})).map((e=>(e=K(e),o&&Object.freeze(e),e))):[];switch(r.type){case"add":s=e.concat(t.values?i:i.map((e=>c(e))));break;case"put":const n=(new pn).addKeys(r.values.map((e=>c(e))));s=e.filter((e=>{const r=t.values?c(e):e;return!bn(new pn(r),n)})).concat(t.values?i:i.map((e=>c(e))));break;case"delete":const o=(new pn).addKeys(r.keys);s=e.filter((e=>{const n=t.values?c(e):e;return!bn(new pn(n),o)}));break;case"deleteRange":const a=r.range;s=e.filter((e=>!Vn(c(e),a)))}return s}),e);return f===e?e:(f.sort(((e,t)=>ct(d(e),d(t))||ct(c(e),c(t)))),t.limit&&t.limit<1/0&&(f.length>t.limit?f.length=t.limit:e.length===t.limit&&f.length=0}function Gn(e,t,n,r){e.subscribers.add(n),r.addEventListener("abort",(()=>{e.subscribers.delete(n),0===e.subscribers.size&&function(e,t){setTimeout((()=>{0===e.subscribers.size&&q(t,e)}),3e3)}(e,t)}))}const Qn={stack:"dbcore",level:0,name:"Cache",create:e=>{const t=e.schema.name,n={...e,transaction:(n,r,s)=>{const i=e.transaction(n,r,s);if("readwrite"===r){const s=new AbortController,{signal:o}=s,a=o=>()=>{if(s.abort(),"readwrite"===r){const r=new Set;for(const s of n){const n=kn[`idb://${t}/${s}`];if(n){const t=e.table(s),a=n.optimisticOps.filter((e=>e.trans===i));if(i._explicit&&o&&i.mutatedParts)for(const e of Object.values(n.queries.query))for(const t of e.slice())xn(t.obsSet,i.mutatedParts)&&(q(e,t),t.subscribers.forEach((e=>r.add(e))));else if(a.length>0){n.optimisticOps=n.optimisticOps.filter((e=>e.trans!==i));for(const e of Object.values(n.queries.query))for(const n of e.slice())if(null!=n.res&&i.mutatedParts)if(o&&!n.dirty){const s=Object.isFrozen(n.res),i=zn(n.res,n.req,a,t,n,s);n.dirty?(q(e,n),n.subscribers.forEach((e=>r.add(e)))):i!==n.res&&(n.res=i,n.promise=Oe.resolve({result:i}))}else n.dirty&&q(e,n),n.subscribers.forEach((e=>r.add(e)))}}}r.forEach((e=>e()))}};i.addEventListener("abort",a(!1),{signal:o}),i.addEventListener("error",a(!1),{signal:o}),i.addEventListener("complete",a(!0),{signal:o})}return i},table(n){const r=e.table(n),s=r.schema.primaryKey,i={...r,mutate(e){const i=we.trans;if(s.outbound||"disabled"===i.db._options.cache||i.explicit)return r.mutate(e);const o=kn[`idb://${t}/${n}`];if(!o)return r.mutate(e);const a=r.mutate(e);return"add"!==e.type&&"put"!==e.type||!(e.values.length>=50||Bn(s,e).some((e=>null==e)))?(o.optimisticOps.push(e),e.mutatedParts&&En(e.mutatedParts),a.then((t=>{if(t.numFailures>0){q(o.optimisticOps,e);const n=Un(0,e,t);n&&o.optimisticOps.push(n),e.mutatedParts&&En(e.mutatedParts)}})),a.catch((()=>{q(o.optimisticOps,e),e.mutatedParts&&En(e.mutatedParts)}))):a.then((t=>{const n=Un(0,{...e,values:e.values.map(((e,n)=>{const r=s.keyPath?.includes(".")?K(e):{...e};return v(r,s.keyPath,t.results[n]),r}))},t);o.optimisticOps.push(n),queueMicrotask((()=>e.mutatedParts&&En(e.mutatedParts)))})),a},query(e){if(!Nn(we,r)||!Mn("query",e))return r.query(e);const s="immutable"===we.trans?.db._options.cache,{requery:i,signal:o}=we;let[a,u,l,c]=function(e,t,n,r){const s=kn[`idb://${e}/${t}`];if(!s)return[];const i=s.queries[n];if(!i)return[null,!1,s,null];const o=i[(r.query?r.query.index.name:null)||""];if(!o)return[null,!1,s,null];switch(n){case"query":const e=o.find((e=>e.req.limit===r.limit&&e.req.values===r.values&&Wn(e.req.query.range,r.query.range)));return e?[e,!0,s,o]:[o.find((e=>("limit"in e.req?e.req.limit:1/0)>=r.limit&&(!r.values||e.req.values)&&Yn(e.req.query.range,r.query.range))),!1,s,o];case"count":const t=o.find((e=>Wn(e.req.query.range,r.query.range)));return[t,!!t,s,o]}}(t,n,"query",e);if(a&&u)a.obsSet=e.obsSet;else{const i=r.query(e).then((e=>{const t=e.result;if(a&&(a.res=t),s){for(let e=0,n=t.length;e(c&&a&&q(c,a),Promise.reject(e))));a={obsSet:e.obsSet,promise:i,subscribers:new Set,type:"query",req:e,dirty:!1},c?c.push(a):(c=[a],l||(l=kn[`idb://${t}/${n}`]={queries:{query:{},count:{}},objs:new Map,optimisticOps:[],unsignaledParts:{}}),l.queries.query[e.query.index.name||""]=c)}return Gn(a,c,i,o),a.promise.then((t=>({result:zn(t.result,e,l?.optimisticOps,r,a,s)})))}};return i}};return n}};function Xn(e,t){return new Proxy(e,{get:(e,n,r)=>"db"===n?t:Reflect.get(e,n,r)})}class Hn{constructor(e,t){this._middlewares={},this.verno=0;const n=Hn.dependencies;this._options=t={addons:Hn.addons,autoOpen:!0,indexedDB:n.indexedDB,IDBKeyRange:n.IDBKeyRange,cache:"cloned",...t},this._deps={indexedDB:t.indexedDB,IDBKeyRange:t.IDBKeyRange};const{addons:r}=t;this._dbSchema={},this._versions=[],this._storeNames=[],this._allTables={},this.idbdb=null,this._novip=this;const s={dbOpenError:null,isBeingOpened:!1,onReadyBeingFired:null,openComplete:!1,dbReadyResolve:Q,dbReadyPromise:null,cancelOpen:Q,openCanceller:null,autoSchema:!0,PR1398_maxLoop:3,autoOpen:t.autoOpen};var i;s.dbReadyPromise=new Oe((e=>{s.dbReadyResolve=e})),s.openCanceller=new Oe(((e,t)=>{s.cancelOpen=t})),this._state=s,this.name=e,this.on=pt(this,"populate","blocked","versionchange","close",{ready:[re,Q]}),this.on.ready.subscribe=y(this.on.ready.subscribe,(e=>(t,n)=>{Hn.vip((()=>{const r=this._state;if(r.openComplete)r.dbOpenError||Oe.resolve().then(t),n&&e(t);else if(r.onReadyBeingFired)r.onReadyBeingFired.push(t),n&&e(t);else{e(t);const r=this;n||e((function e(){r.on.ready.unsubscribe(t),r.on.ready.unsubscribe(e)}))}}))})),this.Collection=(i=this,yt(Pt.prototype,(function(e,t){this.db=i;let n=at,r=null;if(t)try{n=t()}catch(e){r=e}const s=e._ctx,o=s.table,a=o.hook.reading.fire;this._ctx={table:o,index:s.index,isPrimKey:!s.index||o.schema.primKey.keyPath&&s.index===o.schema.primKey.name,range:n,keysOnly:!1,dir:"next",unique:"",algorithm:null,filter:null,replayFilter:null,justLimit:!0,isMatch:null,offset:0,limit:1/0,error:r,or:s.or,valueMapper:a!==X?a:null}}))),this.Table=function(e){return yt(ft.prototype,(function(t,n,r){this.db=e,this._tx=r,this.name=t,this.schema=n,this.hook=e._allTables[t]?e._allTables[t].hook:pt(null,{creating:[Z,Q],reading:[H,X],updating:[te,Q],deleting:[ee,Q]})}))}(this),this.Transaction=function(e){return yt(Ft.prototype,(function(t,n,r,s,i){this.db=e,this.mode=t,this.storeNames=n,this.schema=r,this.chromeTransactionDurability=s,this.idbtrans=null,this.on=pt(this,"complete","error","abort"),this.parent=i||null,this.active=!0,this._reculock=0,this._blockedFuncs=[],this._resolve=null,this._reject=null,this._waitingFor=null,this._waitingQueue=null,this._spinCount=0,this._completion=new Oe(((e,t)=>{this._resolve=e,this._reject=t})),this._completion.then((()=>{this.active=!1,this.on.complete.fire()}),(e=>{var t=this.active;return this.active=!1,this.on.error.fire(e),this.parent?this.parent._reject(e):t&&this.idbtrans&&this.idbtrans.abort(),tt(e)}))}))}(this),this.Version=function(e){return yt(un.prototype,(function(t){this.db=e,this._cfg={version:t,storesSource:null,dbschema:{},tables:{},contentUpgrade:null}}))}(this),this.WhereClause=function(e){return yt(It.prototype,(function(t,n,r){if(this.db=e,this._ctx={table:t,index:":id"===n?null:n,or:r},this._cmp=this._ascending=ct,this._descending=(e,t)=>ct(t,e),this._max=(e,t)=>ct(e,t)>0?e:t,this._min=(e,t)=>ct(e,t)<0?e:t,this._IDBKeyRange=e._deps.IDBKeyRange,!this._IDBKeyRange)throw new W.MissingAPI}))}(this),this.on("versionchange",(e=>{e.newVersion>0?console.warn(`Another connection wants to upgrade database '${this.name}'. Closing db now to resume the upgrade.`):console.warn(`Another connection wants to delete database '${this.name}'. Closing db now to resume the delete request.`),this.close({disableAutoOpen:!1})})),this.on("blocked",(e=>{!e.newVersion||e.newVersionnew this.Transaction(e,t,n,this._options.chromeTransactionDurability,r),this._fireOnBlocked=e=>{this.on("blocked").fire(e),it.filter((e=>e.name===this.name&&e!==this&&!e._state.vcFired)).map((t=>t.on("versionchange").fire(e)))},this.use(Fn),this.use(Qn),this.use(Ln),this.use(Tn),this.use(Rn);const o=new Proxy(this,{get:(e,t,n)=>{if("_vip"===t)return!0;if("table"===t)return e=>Xn(this.table(e),o);const r=Reflect.get(e,t,n);return r instanceof ft?Xn(r,o):"tables"===t?r.map((e=>Xn(e,o))):"_createTransaction"===t?function(){const e=r.apply(this,arguments);return Xn(e,o)}:r}});this.vip=o,r.forEach((e=>e(this)))}version(e){if(isNaN(e)||e<.1)throw new W.Type("Given version is not a positive number");if(e=Math.round(10*e)/10,this.idbdb||this._state.isBeingOpened)throw new W.Schema("Cannot add version when database is open");this.verno=Math.max(this.verno,e);const t=this._versions;var n=t.filter((t=>t._cfg.version===e))[0];return n||(n=new this.Version(e),t.push(n),t.sort(Jt),n.stores({}),this._state.autoSchema=!1,n)}_whenReady(e){return this.idbdb&&(this._state.openComplete||we.letThrough||this._vip)?e():new Oe(((e,t)=>{if(this._state.openComplete)return t(new W.DatabaseClosed(this._state.dbOpenError));if(!this._state.isBeingOpened){if(!this._state.autoOpen)return void t(new W.DatabaseClosed);this.open().catch(Q)}this._state.dbReadyPromise.then(e,t)})).then(e)}use({stack:e,create:t,level:n,name:r}){r&&this.unuse({stack:e,name:r});const s=this._middlewares[e]||(this._middlewares[e]=[]);return s.push({stack:e,create:t,level:null==n?10:n,name:r}),s.sort(((e,t)=>e.level-t.level)),this}unuse({stack:e,name:t,create:n}){return e&&this._middlewares[e]&&(this._middlewares[e]=this._middlewares[e].filter((e=>n?e.create!==n:!!t&&e.name!==t))),this}open(){return Je(ve,(()=>Cn(this)))}_close(){const e=this._state,t=it.indexOf(this);if(t>=0&&it.splice(t,1),this.idbdb){try{this.idbdb.close()}catch(e){}this.idbdb=null}e.isBeingOpened||(e.dbReadyPromise=new Oe((t=>{e.dbReadyResolve=t})),e.openCanceller=new Oe(((t,n)=>{e.cancelOpen=n})))}close({disableAutoOpen:e}={disableAutoOpen:!0}){const t=this._state;e?(t.isBeingOpened&&t.cancelOpen(new W.DatabaseClosed),this._close(),t.autoOpen=!1,t.dbOpenError=new W.DatabaseClosed):(this._close(),t.autoOpen=this._options.autoOpen||t.isBeingOpened,t.openComplete=!1,t.dbOpenError=null)}delete(e={disableAutoOpen:!0}){const t=arguments.length>0&&"object"!=typeof arguments[0],n=this._state;return new Oe(((r,s)=>{const i=()=>{this.close(e);var t=this._deps.indexedDB.deleteDatabase(this.name);t.onsuccess=Re((()=>{!function({indexedDB:e,IDBKeyRange:t},n){!cn(e)&&"__dbnames"!==n&&ln(e,t).delete(n).catch(Q)}(this._deps,this.name),r()})),t.onerror=Bt(s),t.onblocked=this._fireOnBlocked};if(t)throw new W.InvalidArgument("Invalid closeOptions argument to db.delete()");n.isBeingOpened?n.dbReadyPromise.then(i):i()}))}backendDB(){return this.idbdb}isOpen(){return null!==this.idbdb}hasBeenClosed(){const e=this._state.dbOpenError;return e&&"DatabaseClosed"===e.name}hasFailed(){return null!==this._state.dbOpenError}dynamicallyOpened(){return this._state.autoSchema}get tables(){return t(this._allTables).map((e=>this._allTables[e]))}transaction(){const e=jn.apply(this,arguments);return this._transaction.apply(this,e)}_transaction(e,t,n){let r=we.trans;r&&r.db===this&&-1===e.indexOf("!")||(r=null);const s=-1!==e.indexOf("?");let i,o;e=e.replace("!","").replace("?","");try{if(o=t.map((e=>{var t=e instanceof this.Table?e.name:e;if("string"!=typeof t)throw new TypeError("Invalid table argument to Dexie.transaction(). Only Table or String are allowed");return t})),"r"==e||"readonly"===e)i="readonly";else{if("rw"!=e&&"readwrite"!=e)throw new W.InvalidArgument("Invalid transaction mode: "+e);i="readwrite"}if(r){if("readonly"===r.mode&&"readwrite"===i){if(!s)throw new W.SubTransaction("Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY");r=null}r&&o.forEach((e=>{if(r&&-1===r.storeNames.indexOf(e)){if(!s)throw new W.SubTransaction("Table "+e+" not included in parent transaction.");r=null}})),s&&r&&!r.active&&(r=null)}}catch(e){return r?r._promise(null,((t,n)=>{n(e)})):tt(e)}const a=Dn.bind(null,this,i,o,r,n);return r?r._promise(i,a,"lock"):we.trans?Je(we.transless,(()=>this._whenReady(a))):this._whenReady(a)}table(e){if(!o(this._allTables,e))throw new W.InvalidTable(`Table ${e} does not exist`);return this._allTables[e]}}const Jn="undefined"!=typeof Symbol&&"observable"in Symbol?Symbol.observable:"@@observable";class Zn{constructor(e){this._subscribe=e}subscribe(e,t,n){return this._subscribe(e&&"function"!=typeof e?e:{next:e,error:t,complete:n})}[Jn](){return this}}let er;try{er={indexedDB:e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB,IDBKeyRange:e.IDBKeyRange||e.webkitIDBKeyRange}}catch(e){er={indexedDB:null,IDBKeyRange:null}}function tr(e){let t,n=!1;const r=new Zn((r=>{const s=B(e);let i,a=!1,u={},l={};const c={get closed(){return a},unsubscribe:()=>{a||(a=!0,i&&i.abort(),h&&$t.storagemutated.unsubscribe(f))}};r.start&&r.start(c);let h=!1;const d=()=>et(p);const f=e=>{_n(u,e),xn(l,u)&&d()},p=()=>{if(a||!er.indexedDB)return;u={};const c={};i&&i.abort(),i=new AbortController;const p={subscr:c,signal:i.signal,requery:d,querier:e,trans:null},y=function(t){const n=qe();try{s&&ze();let r=Ve(e,t);return s&&(r=r.finally(We)),r}finally{n&&Te()}}(p);Promise.resolve(y).then((e=>{n=!0,t=e,a||p.signal.aborted||(u={},l=c,function(e){for(const t in e)if(o(e,t))return!1;return!0}(l)||h||($t("storagemutated",f),h=!0),et((()=>!a&&r.next&&r.next(e))))}),(e=>{n=!1,["DatabaseClosedError","AbortError"].includes(e?.name)||a||et((()=>{a||r.error&&r.error(e)}))}))};return setTimeout(d,0),c}));return r.hasValue=()=>n,r.getValue=()=>t,r}const nr=Hn;function rr(e){let t=ir;try{ir=!0,$t.storagemutated.fire(e),Kn(e,!0)}finally{ir=t}}a(nr,{...G,delete:e=>new nr(e,{addons:[]}).delete(),exists:e=>new nr(e,{addons:[]}).open().then((e=>(e.close(),!0))).catch("NoSuchDatabaseError",(()=>!1)),getDatabaseNames(e){try{return function({indexedDB:e,IDBKeyRange:t}){return cn(e)?Promise.resolve(e.databases()).then((e=>e.map((e=>e.name)).filter((e=>"__dbnames"!==e)))):ln(e,t).toCollection().primaryKeys()}(nr.dependencies).then(e)}catch{return tt(new W.MissingAPI)}},defineClass:()=>function(e){r(this,e)},ignoreTransaction:e=>we.trans?Je(we.transless,e):e(),vip:hn,async:function(e){return function(){try{var t=An(e.apply(this,arguments));return t&&"function"==typeof t.then?t:Oe.resolve(t)}catch(e){return tt(e)}}},spawn:function(e,t,n){try{var r=An(e.apply(n,t||[]));return r&&"function"==typeof r.then?r:Oe.resolve(r)}catch(e){return tt(e)}},currentTransaction:{get:()=>we.trans||null},waitFor:function(e,t){const n=Oe.resolve("function"==typeof e?nr.ignoreTransaction(e):e).timeout(t||6e4);return we.trans?we.trans.waitFor(n):n},Promise:Oe,debug:{get:()=>se,set:e=>{ie(e)}},derive:c,extend:r,props:a,override:y,Events:pt,on:$t,liveQuery:tr,extendObservabilitySet:_n,getByKeyPath:g,setByKeyPath:v,delByKeyPath:function(e,t){"string"==typeof t?v(e,t,void 0):"length"in t&&[].map.call(t,(function(t){v(e,t,void 0)}))},shallowClone:w,deepClone:K,getObjectDiff:In,cmp:ct,asap:b,minKey:-(1/0),addons:[],connections:it,errnames:V,dependencies:er,cache:kn,semVer:"4.0.7",version:"4.0.7".split(".").map((e=>parseInt(e))).reduce(((e,t,n)=>e+t/Math.pow(10,2*n)))}),nr.maxKey=Ut(nr.dependencies.IDBKeyRange),"undefined"!=typeof dispatchEvent&&"undefined"!=typeof addEventListener&&($t("storagemutated",(e=>{if(!ir){let t;t=new CustomEvent("x-storagemutated-1",{detail:e}),ir=!0,dispatchEvent(t),ir=!1}})),addEventListener("x-storagemutated-1",(({detail:e})=>{ir||rr(e)})));let sr,ir=!1,or=()=>{};function ar(e){return new Ot({add:e})}function ur(e){return new Ot({remove:e})}function lr(e,t){return new Ot({replacePrefix:[e,t]})}"undefined"!=typeof BroadcastChannel&&(or=()=>{sr=new BroadcastChannel("x-storagemutated-1"),sr.onmessage=e=>e.data&&rr(e.data)},or(),"function"==typeof sr.unref&&sr.unref(),$t("storagemutated",(e=>{ir||sr.postMessage(e)}))),"undefined"!=typeof addEventListener&&(addEventListener("pagehide",(e=>{if(!Hn.disableBfCache&&e.persisted){se&&console.debug("Dexie: handling persisted pagehide"),sr?.close();for(const e of it)e.close({disableAutoOpen:!1})}})),addEventListener("pageshow",(e=>{!Hn.disableBfCache&&e.persisted&&(se&&console.debug("Dexie: handling persisted pageshow"),or(),rr({all:new pn(-1/0,[[]])}))}))),Oe.rejectionMapper=function(e,t){if(!e||e instanceof N||e instanceof TypeError||e instanceof SyntaxError||!e.name||!Y[e.name])return e;var n=new Y[e.name](t||e.message,e);return"stack"in e&&l(n,"stack",{get:function(){return this.inner.stack}}),n},ie(se);export{Hn as Dexie,lt as Entity,kt as PropModSymbol,Ot as PropModification,pn as RangeSet,ar as add,ct as cmp,Hn as default,tr as liveQuery,mn as mergeRanges,bn as rangesOverlap,ur as remove,lr as replacePrefix}; -//# sourceMappingURL=dexie.min.mjs.map \ No newline at end of file diff --git a/src/assets/dexie/dist/modern/dexie.min.mjs.map b/src/assets/dexie/dist/modern/dexie.min.mjs.map deleted file mode 100644 index 04601b62e..000000000 --- a/src/assets/dexie/dist/modern/dexie.min.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["dexie.mjs"],"names":["_global","globalThis","self","window","global","keys","Object","isArray","Array","extend","obj","extension","forEach","key","Promise","getProto","getPrototypeOf","_hasOwn","hasOwnProperty","hasOwn","prop","call","props","proto","Reflect","ownKeys","setProp","defineProperty","functionOrGetSet","options","get","set","configurable","value","writable","derive","Child","from","Parent","prototype","create","bind","getOwnPropertyDescriptor","getPropertyDescriptor","_slice","slice","args","start","end","override","origFunc","overridedFactory","assert","b","Error","asap$1","fn","setImmediate","setTimeout","getByKeyPath","keyPath","rv","i","l","length","val","push","period","indexOf","innerObj","substr","undefined","setByKeyPath","isFrozen","currentKeyPath","remainingKeyPath","isNaN","parseInt","splice","shallowClone","m","concat","flatten","a","apply","intrinsicTypeNames","split","map","num","t","filter","intrinsicTypes","Set","cloneSimpleObjectTree","o","k","v","has","constructor","circularRefs","deepClone","any","WeakMap","innerDeepClone","x","toString","toStringTag","iteratorSymbol","Symbol","iterator","getIteratorOf","delArrayItem","NO_CHAR_ARRAY","getArrayOf","arrayLike","it","arguments","this","next","done","isAsyncFunction","idbDomErrorNames","errorList","defaultTexts","VersionChanged","DatabaseClosed","Abort","TransactionInactive","MissingAPI","DexieError","name","msg","message","getMultiErrorMessage","failures","s","join","ModifyError","successCount","failedKeys","BulkError","pos","failuresByPos","errnames","reduce","BaseException","exceptions","fullName","msgOrInner","inner","Syntax","SyntaxError","Type","TypeError","Range","RangeError","exceptionMap","fullNameExceptions","nop","mirror","pureFunctionChain","f1","f2","callBoth","on1","on2","hookCreatingChain","res","onsuccess","onerror","res2","hookDeletingChain","hookUpdatingChain","modifications","reverseStoppableEventChain","promisableChain","then","thiz","debug","location","test","href","setDebug","INTERNAL","resolvedNativePromise","nativePromiseProto","resolvedGlobalPromise","globalP","resolve","crypto","subtle","nativeP","digest","Uint8Array","nativePromiseThen","NativePromise","patchGlobalPromise","asap","callback","microtickQueue","needsNewPhysicalTick","queueMicrotask","physicalTick","isOutsideMicroTick","unhandledErrors","rejectingErrors","rejectionMapper","globalPSD","id","ref","unhandleds","onunhandled","pgp","env","finalize","PSD","numScheduledCalls","tickFinalizers","DexiePromise","_listeners","_lib","psd","_PSD","_state","_value","handleRejection","executePromiseTask","thenProp","microTaskId","totalEchoes","onFulfilled","onRejected","possibleAwait","cleanup","decrementExpectedAwaits","reject","propagateToListener","Listener","nativeAwaitCompatibleWrap","_consoleTask","zone","promise","shouldExecuteTick","beginMicroTickScope","_then","propagateAllListeners","endMicroTickScope","ex","reason","some","p","addPossiblyUnhandledError","listeners","len","finalizePhysicalTick","listener","cb","callListener","ret","run","markErrorAsHandled","e","usePSD","wasRootExec","callbacks","item","unhandledErrs","finalizers","PromiseReject","wrap","errorCatcher","outerScope","switchToZone","catch","type","handler","err","finally","onFinally","timeout","ms","Infinity","handle","Timeout","clearTimeout","snapShot","all","values","onPossibleParallellAsync","remaining","race","newPSD","newScope","scheduler","follow","zoneProps","finalizer","run_at_end_of_this_or_next_physical_tick","allSettled","possiblePromises","results","status","AggregateError","failure","task","awaits","echoes","taskCounter","zoneStack","zoneEchoes","zone_id_counter","a1","a2","parent","PromiseProp","incrementExpectedAwaits","possiblePromise","rejection","zoneEnterEcho","targetZone","zoneLeaveEcho","pop","bEnteringZone","currentZone","GlobalPromise","targetEnv","a3","outerZone","execInGlobalContext","enqueueNativeMicroTask","tempTransaction","db","mode","storeNames","idbdb","openComplete","letThrough","_vip","trans","_createTransaction","_dbSchema","PR1398_maxLoop","InvalidState","isOpen","console","warn","close","disableAutoOpen","open","_promise","result","idbtrans","commit","_completion","dbOpenError","isBeingOpened","autoOpen","dbReadyPromise","maxString","String","fromCharCode","INVALID_KEY_ARGUMENT","connections","combine","filter1","filter2","AnyRange","lower","lowerOpen","upper","upperOpen","workaroundForUndefinedPrimKey","Entity","cmp","ta","tb","NaN","al","bl","compareUint8Arrays","getUint8Array","compareArrays","ArrayBuffer","isView","tsTag","buffer","byteOffset","byteLength","Table","_trans","writeLocked","_tx","tableName","createTask","checkTableInTransaction","schema","NotFound","_novip","transless","trace","keyOrCrit","where","first","core","hook","reading","fire","indexOrCrit","WhereClause","keyPaths","equals","compoundIndex","indexes","primKey","ix","compound","every","sort","_maxKey","keyPathsInValidOrder","kp","JSON","stringify","idxByName","idb","_deps","indexedDB","idx","filterFunction","prevIndex","prevFilterFn","index","multi","toCollection","and","count","thenShortcut","offset","limit","numRows","each","toArray","Collection","orderBy","reverse","mapToClass","mappedClass","table","inheritedProps","getOwnPropertyNames","propName","add","readHook","_","unsubscribe","defineClass","content","auto","objToAdd","mutate","numFailures","lastResult","update","keyOrObject","modify","InvalidArgument","put","delete","clear","range","bulkGet","getMany","bulkAdd","objects","keysOrOptions","wantResults","allKeys","numObjects","objectsToAdd","bulkPut","objectsToPut","bulkUpdate","keysAndChanges","coreTable","entry","changeSpecs","changes","offsetMap","cache","objs","resultKeys","resultObjs","Constraint","numEntries","updates","mappedOffset","Number","bulkDelete","numKeys","Events","ctx","evs","eventName","subscriber","subscribe","addEventType","chainFunction","defaultFunction","addConfiguredEvents","context","subscribers","cfg","makeClassConstructor","isPlainKeyRange","ignoreLimitFilter","algorithm","or","justLimit","replayFilter","addFilter","addReplayFilter","factory","isLimitFilter","curr","getIndexOrStore","coreSchema","isPrimKey","primaryKey","getIndexByKeyPath","Schema","openCursor","keysOnly","dir","unique","query","iter","coreTrans","union","cursor","advance","stop","fail","_iterate","iterate","valueMapper","cursorPromise","wrappedFn","c","continue","advancer","PropModSymbol","PropModification","execute","term","BigInt","remove","subtrahend","includes","prefixToReplace","replacePrefix","startsWith","substring","spec","assign","_read","_ctx","error","_write","_addAlgorithm","clone","raw","Math","min","sortBy","parts","lastPart","lastIndex","getval","order","sorter","aVal","bVal","offsetLeft","rowsLeft","until","bIncludeStopEntry","last","isMatch","indexName","_ondirectionchange","desc","eachKey","eachUniqueKey","eachPrimaryKey","primaryKeys","uniqueKeys","firstKey","lastKey","distinct","strKey","found","modifyer","anythingModified","origVal","outbound","extractKey","_options","modifyChunkSize","totalFailures","applyMutateResult","expectedCount","criteria","deleteCallback","nextChunk","addValues","putValues","putKeys","deleteKeys","origValue","changeSpec","isAdditionalChunk","coreRange","simpleCompare","simpleCompareReverse","collectionOrWhereClause","T","collection","emptyCollection","whereClause","rangeEqual","nextCasing","lowerKey","upperNeedle","lowerNeedle","llp","lwrKeyChar","addIgnoreCaseAlgorithm","match","needles","suffix","compare","upperNeedles","lowerNeedles","direction","nextKeySuffix","needlesLen","initDirection","toUpperCase","toLowerCase","upperFactory","lowerFactory","needleBounds","needle","nb","createRange","firstPossibleNeedle","lowestPossibleCasing","casing","between","includeLower","includeUpper","_cmp","above","aboveOrEqual","below","belowOrEqual","str","startsWithIgnoreCase","equalsIgnoreCase","anyOfIgnoreCase","startsWithAnyOfIgnoreCase","n","anyOf","_ascending","_descending","notEqual","inAnyRange","includeLowers","includeUppers","noneOf","ranges","ascending","descending","_min","max","_max","sortDirection","rangeSorter","newRange","rangePos","keyIsBeyondCurrentEntry","keyIsBeforeCurrentEntry","checkKey","keyWithinCurrentRange","startsWithAnyOf","eventRejectHandler","event","preventDefault","target","stopPropagation","globalEvents","Transaction","_lock","_reculock","lockOwnerFor","_unlock","_blockedFuncs","_locked","fnAndPSD","shift","OpenFailed","active","transaction","durability","chromeTransactionDurability","ev","_reject","onabort","on","oncomplete","_resolve","storagemutated","bWriteLock","ReadOnly","_root","waitFor","promiseLike","root","_waitingFor","_waitingQueue","store","objectStore","spin","_spinCount","currentWaitPromise","abort","memoizedTables","_memoizedTables","tableSchema","transactionBoundTable","createIndexSpec","src","nameFromKeyPath","createTableSchema","array","extractor","nameAndValue","getMaxKey","IdbKeyRange","only","getKeyExtractor","getSinglePathKeyExtractor","arrayify","_id_counter","getKeyPathAlias","createDBCore","tmpTrans","makeIDBKeyRange","upperBound","lowerBound","bound","hasGetAll","tables","objectStoreNames","autoIncrement","indexByKeyPath","isPrimaryKey","indexNames","multiEntry","navigator","userAgent","extractSchema","isAddOrPut","req","reqs","errorHandler","args1","args2","keyCount","callbackCount","successHandler","_pos","request","nonInfinitLimit","source","idbKeyRange","getAll","getAllKeys","openKeyCursor","___id","_cursorContinue","_cursorContinuePrimaryKey","continuePrimaryKey","_cursorAdvance","doThrowCursorIsStopped","gotOne","iterationPromise","resolveIteration","rejectIteration","guardedCallback","createDbCoreTable","tableMap","stack","MIN_KEY","MAX_KEY","generateMiddlewareStacks","stacks","middlewares","IDBKeyRange","dbcore","stackImpl","down","createMiddlewareStack","createMiddlewareStacks","_middlewares","tbl","setApiOnPlace","tableNames","dbschema","propDesc","enumerable","removeTablesApi","lowerVersionFirst","_cfg","version","runUpgraders","oldVersion","idbUpgradeTrans","globalSchema","contains","$meta","parseIndexSyntax","_storeNames","rejectTransaction","metaVersion","getExistingVersion","queue","versions","_versions","buildGlobalSchema","versToRun","runQueue","oldSchema","newSchema","adjustToExistingIndexNames","diff","getSchemaDiff","tuple","createTable","change","recreate","Upgrade","addIndex","deleteIndex","del","idxName","contentUpgrade","upgradeSchema","contentUpgradeIsAsync","returnValue","promiseFollowed","decrementor","storeName","deleteObjectStore","deleteRemovedTables","ceil","createMissingTables","updateTablesAndIndexes","populate","oldDef","newDef","def","oldIndexes","newIndexes","oldIdx","newIdx","createObjectStore","createIndex","j","idbindex","_hasGetAll","dexieName","indexSpec","WorkerGlobalScope","primKeyAndIndexes","indexNum","trim","replace","Version","_parseStoresSpec","stores","outSchema","storesSource","storesSpec","_allTables","upgrade","upgradeFunction","getDbNamesTable","dbNamesDB","Dexie$1","addons","dbnames","hasDatabasesNative","databases","vip","idbReady","intervalId","userAgentData","tryIdb","setInterval","clearInterval","isEmptyRange","node","RangeSet","fromOrTree","to","d","addRange","left","right","r","rebalance","rightWasCutOff","mergeRanges","newSet","_addRangeSet","rangesOverlap","rangeSet1","rangeSet2","i1","getRangeSetIterator","nextResult1","i2","nextResult2","state","keyProvided","up","rootClone","oldRootRight","computeDepth","extendObservabilitySet","part","obsSetsOverlap","os1","os2","rangeSet","addKey","addKeys","unsignaledParts","isTaskEnqueued","signalSubscribersLazily","optimistic","signalSubscribersNow","updatedParts","deleteAffectedCacheEntries","queriesToSignal","tblCache","collectTableSubscribers","exec","dbName","requery","outQueriesToSignal","updatedEntryLists","entries","queries","filteredEntries","obsSet","dexieOpen","openCanceller","nativeVerToOpen","round","verno","schemaPatchMode","throwIfCancelled","resolveDbReady","dbReadyResolve","upgradeTransaction","wasCreated","tryOpenDB","autoSchema","onblocked","_fireOnBlocked","onupgradeneeded","allowEmptyDB","delreq","deleteDatabase","NoSuchDatabase","oldVer","pow","tableChange","patchCurrentVersion","readGlobalSchema","ch","verifyInstalledSchema","onversionchange","vcFired","onclose","_onDatabaseCreated","onReadyBeingFired","ready","fireRemainders","remainders","_close","everything","awaitIterator","callNext","onSuccess","step","onError","throw","getNext","extractTransactionArgs","_tableArgs_","scopeFunc","enterTransactionScope","parentTransaction","explicit","_explicit","scopeFuncIsAsync","PrematureCommit","pad","virtualIndexMiddleware","level","indexLookup","allVirtualIndexes","addVirtualIndexes","keyTail","lowLevelIndex","keyPathAlias","indexList","keyLength","isVirtual","virtualIndex","translateRequest","virtualCursor","createVirtualCursor","getObjectDiff","prfx","ap","bp","apTypeName","getEffectiveKeys","hooksMiddleware","downCore","downTable","tableMiddleware","dxTrans","deleting","creating","updating","addPutOrDelete","deleteNextChunk","deleteRange","effectiveKeys","getExistingValues","existingValues","contexts","existingValue","generatedPrimaryKey","objectDiff","additionalChanges","requestedValue","getFromTransactionCache","cacheExistingValuesMiddleware","cachedResult","isCachableContext","subscr","isCachableRequest","observabilityMiddleware","FULL_RANGE","querier","indexesWithAutoIncPK","tableClone","mutatedParts","getRangeSet","pkRangeSet","delsRangeSet","newObjs","oldCache","oldObjs","addAffectedIndex","addKeyOrKeys","oldKey","newKey","trackAffectedIndexes","idxVals","pkPos","findIndex","pk","getRange","readSubscribers","method","isLiveQuery","cachable","queriedIndex","queriedRanges","keysPromise","resultingKeys","pKeys","wantValues","pkey","adjustOptimisticFromFailures","numBulkOps","isWithinRange","isAboveLower","isBelowUpper","applyOptimisticOps","ops","cacheEntry","immutable","queryRange","extractPrimKey","extractIndex","extractLowLevelIndex","finalResult","op","modifedResult","includedValues","freeze","keySet","keysToDelete","dirty","areRangesEqual","r1","r2","isSuperRange","lower1","lower2","lowerOpen1","lowerOpen2","compareLowers","upper1","upper2","upperOpen1","upperOpen2","compareUppers","subscribeToCacheEntry","container","signal","addEventListener","size","enqueForDeletion","cacheMiddleware","coreMW","ac","AbortController","endTransaction","wasCommitted","affectedSubscribers","optimisticOps","freezeResults","modRes","tableMW","adjustedReq","valueWithKey","exactMatch","equalEntry","find","countQuery","findCompatibleQuery","Map","vipify","vipDb","Proxy","receiver","deps","dependencies","cancelOpen","bSticky","keyRangeGenerator","keyRange","whereCtx","readingHook","createTableConstructor","complete","wasActive","createTransactionConstructor","versionNumber","createVersionConstructor","orCollection","_IDBKeyRange","createWhereClauseConstructor","newVersion","use","vipDB","tx","addon","versionInstance","_whenReady","unuse","mw","closeOptions","hasInvalidArguments","doDelete","_onDatabaseDeleted","backendDB","hasBeenClosed","hasFailed","dynamicallyOpened","_transaction","onlyIfCompatible","idbMode","SubTransaction","enterTransaction","InvalidTable","symbolObservable","observable","Observable","_subscribe","domDeps","mozIndexedDB","webkitIndexedDB","msIndexedDB","webkitIDBKeyRange","liveQuery","currentValue","hasValue","observer","abortController","closed","accumMuts","currentObs","subscription","startedListening","mutationListener","doQuery","_doQuery","aborted","objectIsEmpty","getValue","Dexie","propagateLocally","updateParts","wasMe","propagatingLocally","databaseName","exists","getDatabaseNames","infos","info","ignoreTransaction","async","generatorFn","spawn","currentTransaction","promiseOrFunction","optionalTimeout","delByKeyPath","minKey","semVer","maxKey","dispatchEvent","CustomEvent","detail","bc","createBC","BroadcastChannel","onmessage","data","unref","changedParts","postMessage","disableBfCache","persisted","domError"],"mappings":"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"} \ No newline at end of file diff --git a/src/assets/dexie/dist/modern/dexie.mjs b/src/assets/dexie/dist/modern/dexie.mjs deleted file mode 100644 index 75744312a..000000000 --- a/src/assets/dexie/dist/modern/dexie.mjs +++ /dev/null @@ -1,5768 +0,0 @@ -/* - * Dexie.js - a minimalistic wrapper for IndexedDB - * =============================================== - * - * By David Fahlander, david.fahlander@gmail.com - * - * Version 4.0.7, Sun May 26 2024 - * - * https://dexie.org - * - * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/ - */ - -const _global = typeof globalThis !== 'undefined' ? globalThis : - typeof self !== 'undefined' ? self : - typeof window !== 'undefined' ? window : - global; - -const keys = Object.keys; -const isArray = Array.isArray; -if (typeof Promise !== 'undefined' && !_global.Promise) { - _global.Promise = Promise; -} -function extend(obj, extension) { - if (typeof extension !== 'object') - return obj; - keys(extension).forEach(function (key) { - obj[key] = extension[key]; - }); - return obj; -} -const getProto = Object.getPrototypeOf; -const _hasOwn = {}.hasOwnProperty; -function hasOwn(obj, prop) { - return _hasOwn.call(obj, prop); -} -function props(proto, extension) { - if (typeof extension === 'function') - extension = extension(getProto(proto)); - (typeof Reflect === "undefined" ? keys : Reflect.ownKeys)(extension).forEach(key => { - setProp(proto, key, extension[key]); - }); -} -const defineProperty = Object.defineProperty; -function setProp(obj, prop, functionOrGetSet, options) { - defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, "get") && typeof functionOrGetSet.get === 'function' ? - { get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true } : - { value: functionOrGetSet, configurable: true, writable: true }, options)); -} -function derive(Child) { - return { - from: function (Parent) { - Child.prototype = Object.create(Parent.prototype); - setProp(Child.prototype, "constructor", Child); - return { - extend: props.bind(null, Child.prototype) - }; - } - }; -} -const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; -function getPropertyDescriptor(obj, prop) { - const pd = getOwnPropertyDescriptor(obj, prop); - let proto; - return pd || (proto = getProto(obj)) && getPropertyDescriptor(proto, prop); -} -const _slice = [].slice; -function slice(args, start, end) { - return _slice.call(args, start, end); -} -function override(origFunc, overridedFactory) { - return overridedFactory(origFunc); -} -function assert(b) { - if (!b) - throw new Error("Assertion Failed"); -} -function asap$1(fn) { - if (_global.setImmediate) - setImmediate(fn); - else - setTimeout(fn, 0); -} -function arrayToObject(array, extractor) { - return array.reduce((result, item, i) => { - var nameAndValue = extractor(item, i); - if (nameAndValue) - result[nameAndValue[0]] = nameAndValue[1]; - return result; - }, {}); -} -function getByKeyPath(obj, keyPath) { - if (typeof keyPath === 'string' && hasOwn(obj, keyPath)) - return obj[keyPath]; - if (!keyPath) - return obj; - if (typeof keyPath !== 'string') { - var rv = []; - for (var i = 0, l = keyPath.length; i < l; ++i) { - var val = getByKeyPath(obj, keyPath[i]); - rv.push(val); - } - return rv; - } - var period = keyPath.indexOf('.'); - if (period !== -1) { - var innerObj = obj[keyPath.substr(0, period)]; - return innerObj == null ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1)); - } - return undefined; -} -function setByKeyPath(obj, keyPath, value) { - if (!obj || keyPath === undefined) - return; - if ('isFrozen' in Object && Object.isFrozen(obj)) - return; - if (typeof keyPath !== 'string' && 'length' in keyPath) { - assert(typeof value !== 'string' && 'length' in value); - for (var i = 0, l = keyPath.length; i < l; ++i) { - setByKeyPath(obj, keyPath[i], value[i]); - } - } - else { - var period = keyPath.indexOf('.'); - if (period !== -1) { - var currentKeyPath = keyPath.substr(0, period); - var remainingKeyPath = keyPath.substr(period + 1); - if (remainingKeyPath === "") - if (value === undefined) { - if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) - obj.splice(currentKeyPath, 1); - else - delete obj[currentKeyPath]; - } - else - obj[currentKeyPath] = value; - else { - var innerObj = obj[currentKeyPath]; - if (!innerObj || !hasOwn(obj, currentKeyPath)) - innerObj = (obj[currentKeyPath] = {}); - setByKeyPath(innerObj, remainingKeyPath, value); - } - } - else { - if (value === undefined) { - if (isArray(obj) && !isNaN(parseInt(keyPath))) - obj.splice(keyPath, 1); - else - delete obj[keyPath]; - } - else - obj[keyPath] = value; - } - } -} -function delByKeyPath(obj, keyPath) { - if (typeof keyPath === 'string') - setByKeyPath(obj, keyPath, undefined); - else if ('length' in keyPath) - [].map.call(keyPath, function (kp) { - setByKeyPath(obj, kp, undefined); - }); -} -function shallowClone(obj) { - var rv = {}; - for (var m in obj) { - if (hasOwn(obj, m)) - rv[m] = obj[m]; - } - return rv; -} -const concat = [].concat; -function flatten(a) { - return concat.apply([], a); -} -const intrinsicTypeNames = "BigUint64Array,BigInt64Array,Array,Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,FileSystemDirectoryHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey" - .split(',').concat(flatten([8, 16, 32, 64].map(num => ["Int", "Uint", "Float"].map(t => t + num + "Array")))).filter(t => _global[t]); -const intrinsicTypes = new Set(intrinsicTypeNames.map(t => _global[t])); -function cloneSimpleObjectTree(o) { - const rv = {}; - for (const k in o) - if (hasOwn(o, k)) { - const v = o[k]; - rv[k] = !v || typeof v !== 'object' || intrinsicTypes.has(v.constructor) ? v : cloneSimpleObjectTree(v); - } - return rv; -} -function objectIsEmpty(o) { - for (const k in o) - if (hasOwn(o, k)) - return false; - return true; -} -let circularRefs = null; -function deepClone(any) { - circularRefs = new WeakMap(); - const rv = innerDeepClone(any); - circularRefs = null; - return rv; -} -function innerDeepClone(x) { - if (!x || typeof x !== 'object') - return x; - let rv = circularRefs.get(x); - if (rv) - return rv; - if (isArray(x)) { - rv = []; - circularRefs.set(x, rv); - for (var i = 0, l = x.length; i < l; ++i) { - rv.push(innerDeepClone(x[i])); - } - } - else if (intrinsicTypes.has(x.constructor)) { - rv = x; - } - else { - const proto = getProto(x); - rv = proto === Object.prototype ? {} : Object.create(proto); - circularRefs.set(x, rv); - for (var prop in x) { - if (hasOwn(x, prop)) { - rv[prop] = innerDeepClone(x[prop]); - } - } - } - return rv; -} -const { toString } = {}; -function toStringTag(o) { - return toString.call(o).slice(8, -1); -} -const iteratorSymbol = typeof Symbol !== 'undefined' ? - Symbol.iterator : - '@@iterator'; -const getIteratorOf = typeof iteratorSymbol === "symbol" ? function (x) { - var i; - return x != null && (i = x[iteratorSymbol]) && i.apply(x); -} : function () { return null; }; -function delArrayItem(a, x) { - const i = a.indexOf(x); - if (i >= 0) - a.splice(i, 1); - return i >= 0; -} -const NO_CHAR_ARRAY = {}; -function getArrayOf(arrayLike) { - var i, a, x, it; - if (arguments.length === 1) { - if (isArray(arrayLike)) - return arrayLike.slice(); - if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') - return [arrayLike]; - if ((it = getIteratorOf(arrayLike))) { - a = []; - while ((x = it.next()), !x.done) - a.push(x.value); - return a; - } - if (arrayLike == null) - return [arrayLike]; - i = arrayLike.length; - if (typeof i === 'number') { - a = new Array(i); - while (i--) - a[i] = arrayLike[i]; - return a; - } - return [arrayLike]; - } - i = arguments.length; - a = new Array(i); - while (i--) - a[i] = arguments[i]; - return a; -} -const isAsyncFunction = typeof Symbol !== 'undefined' - ? (fn) => fn[Symbol.toStringTag] === 'AsyncFunction' - : () => false; - -var dexieErrorNames = [ - 'Modify', - 'Bulk', - 'OpenFailed', - 'VersionChange', - 'Schema', - 'Upgrade', - 'InvalidTable', - 'MissingAPI', - 'NoSuchDatabase', - 'InvalidArgument', - 'SubTransaction', - 'Unsupported', - 'Internal', - 'DatabaseClosed', - 'PrematureCommit', - 'ForeignAwait' -]; -var idbDomErrorNames = [ - 'Unknown', - 'Constraint', - 'Data', - 'TransactionInactive', - 'ReadOnly', - 'Version', - 'NotFound', - 'InvalidState', - 'InvalidAccess', - 'Abort', - 'Timeout', - 'QuotaExceeded', - 'Syntax', - 'DataClone' -]; -var errorList = dexieErrorNames.concat(idbDomErrorNames); -var defaultTexts = { - VersionChanged: "Database version changed by other database connection", - DatabaseClosed: "Database has been closed", - Abort: "Transaction aborted", - TransactionInactive: "Transaction has already completed or failed", - MissingAPI: "IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb" -}; -function DexieError(name, msg) { - this.name = name; - this.message = msg; -} -derive(DexieError).from(Error).extend({ - toString: function () { return this.name + ": " + this.message; } -}); -function getMultiErrorMessage(msg, failures) { - return msg + ". Errors: " + Object.keys(failures) - .map(key => failures[key].toString()) - .filter((v, i, s) => s.indexOf(v) === i) - .join('\n'); -} -function ModifyError(msg, failures, successCount, failedKeys) { - this.failures = failures; - this.failedKeys = failedKeys; - this.successCount = successCount; - this.message = getMultiErrorMessage(msg, failures); -} -derive(ModifyError).from(DexieError); -function BulkError(msg, failures) { - this.name = "BulkError"; - this.failures = Object.keys(failures).map(pos => failures[pos]); - this.failuresByPos = failures; - this.message = getMultiErrorMessage(msg, this.failures); -} -derive(BulkError).from(DexieError); -var errnames = errorList.reduce((obj, name) => (obj[name] = name + "Error", obj), {}); -const BaseException = DexieError; -var exceptions = errorList.reduce((obj, name) => { - var fullName = name + "Error"; - function DexieError(msgOrInner, inner) { - this.name = fullName; - if (!msgOrInner) { - this.message = defaultTexts[name] || fullName; - this.inner = null; - } - else if (typeof msgOrInner === 'string') { - this.message = `${msgOrInner}${!inner ? '' : '\n ' + inner}`; - this.inner = inner || null; - } - else if (typeof msgOrInner === 'object') { - this.message = `${msgOrInner.name} ${msgOrInner.message}`; - this.inner = msgOrInner; - } - } - derive(DexieError).from(BaseException); - obj[name] = DexieError; - return obj; -}, {}); -exceptions.Syntax = SyntaxError; -exceptions.Type = TypeError; -exceptions.Range = RangeError; -var exceptionMap = idbDomErrorNames.reduce((obj, name) => { - obj[name + "Error"] = exceptions[name]; - return obj; -}, {}); -function mapError(domError, message) { - if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name]) - return domError; - var rv = new exceptionMap[domError.name](message || domError.message, domError); - if ("stack" in domError) { - setProp(rv, "stack", { get: function () { - return this.inner.stack; - } }); - } - return rv; -} -var fullNameExceptions = errorList.reduce((obj, name) => { - if (["Syntax", "Type", "Range"].indexOf(name) === -1) - obj[name + "Error"] = exceptions[name]; - return obj; -}, {}); -fullNameExceptions.ModifyError = ModifyError; -fullNameExceptions.DexieError = DexieError; -fullNameExceptions.BulkError = BulkError; - -function nop() { } -function mirror(val) { return val; } -function pureFunctionChain(f1, f2) { - if (f1 == null || f1 === mirror) - return f2; - return function (val) { - return f2(f1(val)); - }; -} -function callBoth(on1, on2) { - return function () { - on1.apply(this, arguments); - on2.apply(this, arguments); - }; -} -function hookCreatingChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - var res = f1.apply(this, arguments); - if (res !== undefined) - arguments[0] = res; - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = null; - this.onerror = null; - var res2 = f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - return res2 !== undefined ? res2 : res; - }; -} -function hookDeletingChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - f1.apply(this, arguments); - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = this.onerror = null; - f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - }; -} -function hookUpdatingChain(f1, f2) { - if (f1 === nop) - return f2; - return function (modifications) { - var res = f1.apply(this, arguments); - extend(modifications, res); - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = null; - this.onerror = null; - var res2 = f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - return res === undefined ? - (res2 === undefined ? undefined : res2) : - (extend(res, res2)); - }; -} -function reverseStoppableEventChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - if (f2.apply(this, arguments) === false) - return false; - return f1.apply(this, arguments); - }; -} -function promisableChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - var res = f1.apply(this, arguments); - if (res && typeof res.then === 'function') { - var thiz = this, i = arguments.length, args = new Array(i); - while (i--) - args[i] = arguments[i]; - return res.then(function () { - return f2.apply(thiz, args); - }); - } - return f2.apply(this, arguments); - }; -} - -var debug = typeof location !== 'undefined' && - /^(http|https):\/\/(localhost|127\.0\.0\.1)/.test(location.href); -function setDebug(value, filter) { - debug = value; -} - -var INTERNAL = {}; -const ZONE_ECHO_LIMIT = 100, [resolvedNativePromise, nativePromiseProto, resolvedGlobalPromise] = typeof Promise === 'undefined' ? - [] : - (() => { - let globalP = Promise.resolve(); - if (typeof crypto === 'undefined' || !crypto.subtle) - return [globalP, getProto(globalP), globalP]; - const nativeP = crypto.subtle.digest("SHA-512", new Uint8Array([0])); - return [ - nativeP, - getProto(nativeP), - globalP - ]; - })(), nativePromiseThen = nativePromiseProto && nativePromiseProto.then; -const NativePromise = resolvedNativePromise && resolvedNativePromise.constructor; -const patchGlobalPromise = !!resolvedGlobalPromise; -function schedulePhysicalTick() { - queueMicrotask(physicalTick); -} -var asap = function (callback, args) { - microtickQueue.push([callback, args]); - if (needsNewPhysicalTick) { - schedulePhysicalTick(); - needsNewPhysicalTick = false; - } -}; -var isOutsideMicroTick = true, -needsNewPhysicalTick = true, -unhandledErrors = [], -rejectingErrors = [], -rejectionMapper = mirror; -var globalPSD = { - id: 'global', - global: true, - ref: 0, - unhandleds: [], - onunhandled: nop, - pgp: false, - env: {}, - finalize: nop -}; -var PSD = globalPSD; -var microtickQueue = []; -var numScheduledCalls = 0; -var tickFinalizers = []; -function DexiePromise(fn) { - if (typeof this !== 'object') - throw new TypeError('Promises must be constructed via new'); - this._listeners = []; - this._lib = false; - var psd = (this._PSD = PSD); - if (typeof fn !== 'function') { - if (fn !== INTERNAL) - throw new TypeError('Not a function'); - this._state = arguments[1]; - this._value = arguments[2]; - if (this._state === false) - handleRejection(this, this._value); - return; - } - this._state = null; - this._value = null; - ++psd.ref; - executePromiseTask(this, fn); -} -const thenProp = { - get: function () { - var psd = PSD, microTaskId = totalEchoes; - function then(onFulfilled, onRejected) { - var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes); - const cleanup = possibleAwait && !decrementExpectedAwaits(); - var rv = new DexiePromise((resolve, reject) => { - propagateToListener(this, new Listener(nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup), nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup), resolve, reject, psd)); - }); - if (this._consoleTask) - rv._consoleTask = this._consoleTask; - return rv; - } - then.prototype = INTERNAL; - return then; - }, - set: function (value) { - setProp(this, 'then', value && value.prototype === INTERNAL ? - thenProp : - { - get: function () { - return value; - }, - set: thenProp.set - }); - } -}; -props(DexiePromise.prototype, { - then: thenProp, - _then: function (onFulfilled, onRejected) { - propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); - }, - catch: function (onRejected) { - if (arguments.length === 1) - return this.then(null, onRejected); - var type = arguments[0], handler = arguments[1]; - return typeof type === 'function' ? this.then(null, err => - err instanceof type ? handler(err) : PromiseReject(err)) - : this.then(null, err => - err && err.name === type ? handler(err) : PromiseReject(err)); - }, - finally: function (onFinally) { - return this.then(value => { - return DexiePromise.resolve(onFinally()).then(() => value); - }, err => { - return DexiePromise.resolve(onFinally()).then(() => PromiseReject(err)); - }); - }, - timeout: function (ms, msg) { - return ms < Infinity ? - new DexiePromise((resolve, reject) => { - var handle = setTimeout(() => reject(new exceptions.Timeout(msg)), ms); - this.then(resolve, reject).finally(clearTimeout.bind(null, handle)); - }) : this; - } -}); -if (typeof Symbol !== 'undefined' && Symbol.toStringTag) - setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise'); -globalPSD.env = snapShot(); -function Listener(onFulfilled, onRejected, resolve, reject, zone) { - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; - this.onRejected = typeof onRejected === 'function' ? onRejected : null; - this.resolve = resolve; - this.reject = reject; - this.psd = zone; -} -props(DexiePromise, { - all: function () { - var values = getArrayOf.apply(null, arguments) - .map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - if (values.length === 0) - resolve([]); - var remaining = values.length; - values.forEach((a, i) => DexiePromise.resolve(a).then(x => { - values[i] = x; - if (!--remaining) - resolve(values); - }, reject)); - }); - }, - resolve: value => { - if (value instanceof DexiePromise) - return value; - if (value && typeof value.then === 'function') - return new DexiePromise((resolve, reject) => { - value.then(resolve, reject); - }); - var rv = new DexiePromise(INTERNAL, true, value); - return rv; - }, - reject: PromiseReject, - race: function () { - var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise((resolve, reject) => { - values.map(value => DexiePromise.resolve(value).then(resolve, reject)); - }); - }, - PSD: { - get: () => PSD, - set: value => PSD = value - }, - totalEchoes: { get: () => totalEchoes }, - newPSD: newScope, - usePSD: usePSD, - scheduler: { - get: () => asap, - set: value => { asap = value; } - }, - rejectionMapper: { - get: () => rejectionMapper, - set: value => { rejectionMapper = value; } - }, - follow: (fn, zoneProps) => { - return new DexiePromise((resolve, reject) => { - return newScope((resolve, reject) => { - var psd = PSD; - psd.unhandleds = []; - psd.onunhandled = reject; - psd.finalize = callBoth(function () { - run_at_end_of_this_or_next_physical_tick(() => { - this.unhandleds.length === 0 ? resolve() : reject(this.unhandleds[0]); - }); - }, psd.finalize); - fn(); - }, zoneProps, resolve, reject); - }); - } -}); -if (NativePromise) { - if (NativePromise.allSettled) - setProp(DexiePromise, "allSettled", function () { - const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(resolve => { - if (possiblePromises.length === 0) - resolve([]); - let remaining = possiblePromises.length; - const results = new Array(remaining); - possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(value => results[i] = { status: "fulfilled", value }, reason => results[i] = { status: "rejected", reason }) - .then(() => --remaining || resolve(results))); - }); - }); - if (NativePromise.any && typeof AggregateError !== 'undefined') - setProp(DexiePromise, "any", function () { - const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise((resolve, reject) => { - if (possiblePromises.length === 0) - reject(new AggregateError([])); - let remaining = possiblePromises.length; - const failures = new Array(remaining); - possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(value => resolve(value), failure => { - failures[i] = failure; - if (!--remaining) - reject(new AggregateError(failures)); - })); - }); - }); -} -function executePromiseTask(promise, fn) { - try { - fn(value => { - if (promise._state !== null) - return; - if (value === promise) - throw new TypeError('A promise cannot be resolved with itself.'); - var shouldExecuteTick = promise._lib && beginMicroTickScope(); - if (value && typeof value.then === 'function') { - executePromiseTask(promise, (resolve, reject) => { - value instanceof DexiePromise ? - value._then(resolve, reject) : - value.then(resolve, reject); - }); - } - else { - promise._state = true; - promise._value = value; - propagateAllListeners(promise); - } - if (shouldExecuteTick) - endMicroTickScope(); - }, handleRejection.bind(null, promise)); - } - catch (ex) { - handleRejection(promise, ex); - } -} -function handleRejection(promise, reason) { - rejectingErrors.push(reason); - if (promise._state !== null) - return; - var shouldExecuteTick = promise._lib && beginMicroTickScope(); - reason = rejectionMapper(reason); - promise._state = false; - promise._value = reason; - addPossiblyUnhandledError(promise); - propagateAllListeners(promise); - if (shouldExecuteTick) - endMicroTickScope(); -} -function propagateAllListeners(promise) { - var listeners = promise._listeners; - promise._listeners = []; - for (var i = 0, len = listeners.length; i < len; ++i) { - propagateToListener(promise, listeners[i]); - } - var psd = promise._PSD; - --psd.ref || psd.finalize(); - if (numScheduledCalls === 0) { - ++numScheduledCalls; - asap(() => { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - }, []); - } -} -function propagateToListener(promise, listener) { - if (promise._state === null) { - promise._listeners.push(listener); - return; - } - var cb = promise._state ? listener.onFulfilled : listener.onRejected; - if (cb === null) { - return (promise._state ? listener.resolve : listener.reject)(promise._value); - } - ++listener.psd.ref; - ++numScheduledCalls; - asap(callListener, [cb, promise, listener]); -} -function callListener(cb, promise, listener) { - try { - var ret, value = promise._value; - if (!promise._state && rejectingErrors.length) - rejectingErrors = []; - ret = debug && promise._consoleTask ? promise._consoleTask.run(() => cb(value)) : cb(value); - if (!promise._state && rejectingErrors.indexOf(value) === -1) { - markErrorAsHandled(promise); - } - listener.resolve(ret); - } - catch (e) { - listener.reject(e); - } - finally { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - --listener.psd.ref || listener.psd.finalize(); - } -} -function physicalTick() { - usePSD(globalPSD, () => { - beginMicroTickScope() && endMicroTickScope(); - }); -} -function beginMicroTickScope() { - var wasRootExec = isOutsideMicroTick; - isOutsideMicroTick = false; - needsNewPhysicalTick = false; - return wasRootExec; -} -function endMicroTickScope() { - var callbacks, i, l; - do { - while (microtickQueue.length > 0) { - callbacks = microtickQueue; - microtickQueue = []; - l = callbacks.length; - for (i = 0; i < l; ++i) { - var item = callbacks[i]; - item[0].apply(null, item[1]); - } - } - } while (microtickQueue.length > 0); - isOutsideMicroTick = true; - needsNewPhysicalTick = true; -} -function finalizePhysicalTick() { - var unhandledErrs = unhandledErrors; - unhandledErrors = []; - unhandledErrs.forEach(p => { - p._PSD.onunhandled.call(null, p._value, p); - }); - var finalizers = tickFinalizers.slice(0); - var i = finalizers.length; - while (i) - finalizers[--i](); -} -function run_at_end_of_this_or_next_physical_tick(fn) { - function finalizer() { - fn(); - tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1); - } - tickFinalizers.push(finalizer); - ++numScheduledCalls; - asap(() => { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - }, []); -} -function addPossiblyUnhandledError(promise) { - if (!unhandledErrors.some(p => p._value === promise._value)) - unhandledErrors.push(promise); -} -function markErrorAsHandled(promise) { - var i = unhandledErrors.length; - while (i) - if (unhandledErrors[--i]._value === promise._value) { - unhandledErrors.splice(i, 1); - return; - } -} -function PromiseReject(reason) { - return new DexiePromise(INTERNAL, false, reason); -} -function wrap(fn, errorCatcher) { - var psd = PSD; - return function () { - var wasRootExec = beginMicroTickScope(), outerScope = PSD; - try { - switchToZone(psd, true); - return fn.apply(this, arguments); - } - catch (e) { - errorCatcher && errorCatcher(e); - } - finally { - switchToZone(outerScope, false); - if (wasRootExec) - endMicroTickScope(); - } - }; -} -const task = { awaits: 0, echoes: 0, id: 0 }; -var taskCounter = 0; -var zoneStack = []; -var zoneEchoes = 0; -var totalEchoes = 0; -var zone_id_counter = 0; -function newScope(fn, props, a1, a2) { - var parent = PSD, psd = Object.create(parent); - psd.parent = parent; - psd.ref = 0; - psd.global = false; - psd.id = ++zone_id_counter; - globalPSD.env; - psd.env = patchGlobalPromise ? { - Promise: DexiePromise, - PromiseProp: { value: DexiePromise, configurable: true, writable: true }, - all: DexiePromise.all, - race: DexiePromise.race, - allSettled: DexiePromise.allSettled, - any: DexiePromise.any, - resolve: DexiePromise.resolve, - reject: DexiePromise.reject, - } : {}; - if (props) - extend(psd, props); - ++parent.ref; - psd.finalize = function () { - --this.parent.ref || this.parent.finalize(); - }; - var rv = usePSD(psd, fn, a1, a2); - if (psd.ref === 0) - psd.finalize(); - return rv; -} -function incrementExpectedAwaits() { - if (!task.id) - task.id = ++taskCounter; - ++task.awaits; - task.echoes += ZONE_ECHO_LIMIT; - return task.id; -} -function decrementExpectedAwaits() { - if (!task.awaits) - return false; - if (--task.awaits === 0) - task.id = 0; - task.echoes = task.awaits * ZONE_ECHO_LIMIT; - return true; -} -if (('' + nativePromiseThen).indexOf('[native code]') === -1) { - incrementExpectedAwaits = decrementExpectedAwaits = nop; -} -function onPossibleParallellAsync(possiblePromise) { - if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) { - incrementExpectedAwaits(); - return possiblePromise.then(x => { - decrementExpectedAwaits(); - return x; - }, e => { - decrementExpectedAwaits(); - return rejection(e); - }); - } - return possiblePromise; -} -function zoneEnterEcho(targetZone) { - ++totalEchoes; - if (!task.echoes || --task.echoes === 0) { - task.echoes = task.awaits = task.id = 0; - } - zoneStack.push(PSD); - switchToZone(targetZone, true); -} -function zoneLeaveEcho() { - var zone = zoneStack[zoneStack.length - 1]; - zoneStack.pop(); - switchToZone(zone, false); -} -function switchToZone(targetZone, bEnteringZone) { - var currentZone = PSD; - if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) { - queueMicrotask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho); - } - if (targetZone === PSD) - return; - PSD = targetZone; - if (currentZone === globalPSD) - globalPSD.env = snapShot(); - if (patchGlobalPromise) { - var GlobalPromise = globalPSD.env.Promise; - var targetEnv = targetZone.env; - if (currentZone.global || targetZone.global) { - Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp); - GlobalPromise.all = targetEnv.all; - GlobalPromise.race = targetEnv.race; - GlobalPromise.resolve = targetEnv.resolve; - GlobalPromise.reject = targetEnv.reject; - if (targetEnv.allSettled) - GlobalPromise.allSettled = targetEnv.allSettled; - if (targetEnv.any) - GlobalPromise.any = targetEnv.any; - } - } -} -function snapShot() { - var GlobalPromise = _global.Promise; - return patchGlobalPromise ? { - Promise: GlobalPromise, - PromiseProp: Object.getOwnPropertyDescriptor(_global, "Promise"), - all: GlobalPromise.all, - race: GlobalPromise.race, - allSettled: GlobalPromise.allSettled, - any: GlobalPromise.any, - resolve: GlobalPromise.resolve, - reject: GlobalPromise.reject, - } : {}; -} -function usePSD(psd, fn, a1, a2, a3) { - var outerScope = PSD; - try { - switchToZone(psd, true); - return fn(a1, a2, a3); - } - finally { - switchToZone(outerScope, false); - } -} -function nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) { - return typeof fn !== 'function' ? fn : function () { - var outerZone = PSD; - if (possibleAwait) - incrementExpectedAwaits(); - switchToZone(zone, true); - try { - return fn.apply(this, arguments); - } - finally { - switchToZone(outerZone, false); - if (cleanup) - queueMicrotask(decrementExpectedAwaits); - } - }; -} -function execInGlobalContext(cb) { - if (Promise === NativePromise && task.echoes === 0) { - if (zoneEchoes === 0) { - cb(); - } - else { - enqueueNativeMicroTask(cb); - } - } - else { - setTimeout(cb, 0); - } -} -var rejection = DexiePromise.reject; - -function tempTransaction(db, mode, storeNames, fn) { - if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) { - if (db._state.openComplete) { - return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError)); - } - if (!db._state.isBeingOpened) { - if (!db._state.autoOpen) - return rejection(new exceptions.DatabaseClosed()); - db.open().catch(nop); - } - return db._state.dbReadyPromise.then(() => tempTransaction(db, mode, storeNames, fn)); - } - else { - var trans = db._createTransaction(mode, storeNames, db._dbSchema); - try { - trans.create(); - db._state.PR1398_maxLoop = 3; - } - catch (ex) { - if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { - console.warn('Dexie: Need to reopen db'); - db.close({ disableAutoOpen: false }); - return db.open().then(() => tempTransaction(db, mode, storeNames, fn)); - } - return rejection(ex); - } - return trans._promise(mode, (resolve, reject) => { - return newScope(() => { - PSD.trans = trans; - return fn(resolve, reject, trans); - }); - }).then(result => { - if (mode === 'readwrite') - try { - trans.idbtrans.commit(); - } - catch { } - return mode === 'readonly' ? result : trans._completion.then(() => result); - }); - } -} - -const DEXIE_VERSION = '4.0.7'; -const maxString = String.fromCharCode(65535); -const minKey = -Infinity; -const INVALID_KEY_ARGUMENT = "Invalid key provided. Keys must be of type string, number, Date or Array."; -const STRING_EXPECTED = "String expected."; -const connections = []; -const DBNAMES_DB = '__dbnames'; -const READONLY = 'readonly'; -const READWRITE = 'readwrite'; - -function combine(filter1, filter2) { - return filter1 ? - filter2 ? - function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } : - filter1 : - filter2; -} - -const AnyRange = { - type: 3 , - lower: -Infinity, - lowerOpen: false, - upper: [[]], - upperOpen: false -}; - -function workaroundForUndefinedPrimKey(keyPath) { - return typeof keyPath === "string" && !/\./.test(keyPath) - ? (obj) => { - if (obj[keyPath] === undefined && (keyPath in obj)) { - obj = deepClone(obj); - delete obj[keyPath]; - } - return obj; - } - : (obj) => obj; -} - -function Entity() { - throw exceptions.Type(); -} - -function cmp(a, b) { - try { - const ta = type(a); - const tb = type(b); - if (ta !== tb) { - if (ta === 'Array') - return 1; - if (tb === 'Array') - return -1; - if (ta === 'binary') - return 1; - if (tb === 'binary') - return -1; - if (ta === 'string') - return 1; - if (tb === 'string') - return -1; - if (ta === 'Date') - return 1; - if (tb !== 'Date') - return NaN; - return -1; - } - switch (ta) { - case 'number': - case 'Date': - case 'string': - return a > b ? 1 : a < b ? -1 : 0; - case 'binary': { - return compareUint8Arrays(getUint8Array(a), getUint8Array(b)); - } - case 'Array': - return compareArrays(a, b); - } - } - catch { } - return NaN; -} -function compareArrays(a, b) { - const al = a.length; - const bl = b.length; - const l = al < bl ? al : bl; - for (let i = 0; i < l; ++i) { - const res = cmp(a[i], b[i]); - if (res !== 0) - return res; - } - return al === bl ? 0 : al < bl ? -1 : 1; -} -function compareUint8Arrays(a, b) { - const al = a.length; - const bl = b.length; - const l = al < bl ? al : bl; - for (let i = 0; i < l; ++i) { - if (a[i] !== b[i]) - return a[i] < b[i] ? -1 : 1; - } - return al === bl ? 0 : al < bl ? -1 : 1; -} -function type(x) { - const t = typeof x; - if (t !== 'object') - return t; - if (ArrayBuffer.isView(x)) - return 'binary'; - const tsTag = toStringTag(x); - return tsTag === 'ArrayBuffer' ? 'binary' : tsTag; -} -function getUint8Array(a) { - if (a instanceof Uint8Array) - return a; - if (ArrayBuffer.isView(a)) - return new Uint8Array(a.buffer, a.byteOffset, a.byteLength); - return new Uint8Array(a); -} - -class Table { - _trans(mode, fn, writeLocked) { - const trans = this._tx || PSD.trans; - const tableName = this.name; - const task = debug && typeof console !== 'undefined' && console.createTask && console.createTask(`Dexie: ${mode === 'readonly' ? 'read' : 'write'} ${this.name}`); - function checkTableInTransaction(resolve, reject, trans) { - if (!trans.schema[tableName]) - throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); - return fn(trans.idbtrans, trans); - } - const wasRootExec = beginMicroTickScope(); - try { - let p = trans && trans.db._novip === this.db._novip ? - trans === PSD.trans ? - trans._promise(mode, checkTableInTransaction, writeLocked) : - newScope(() => trans._promise(mode, checkTableInTransaction, writeLocked), { trans: trans, transless: PSD.transless || PSD }) : - tempTransaction(this.db, mode, [this.name], checkTableInTransaction); - if (task) { - p._consoleTask = task; - p = p.catch(err => { - console.trace(err); - return rejection(err); - }); - } - return p; - } - finally { - if (wasRootExec) - endMicroTickScope(); - } - } - get(keyOrCrit, cb) { - if (keyOrCrit && keyOrCrit.constructor === Object) - return this.where(keyOrCrit).first(cb); - if (keyOrCrit == null) - return rejection(new exceptions.Type(`Invalid argument to Table.get()`)); - return this._trans('readonly', (trans) => { - return this.core.get({ trans, key: keyOrCrit }) - .then(res => this.hook.reading.fire(res)); - }).then(cb); - } - where(indexOrCrit) { - if (typeof indexOrCrit === 'string') - return new this.db.WhereClause(this, indexOrCrit); - if (isArray(indexOrCrit)) - return new this.db.WhereClause(this, `[${indexOrCrit.join('+')}]`); - const keyPaths = keys(indexOrCrit); - if (keyPaths.length === 1) - return this - .where(keyPaths[0]) - .equals(indexOrCrit[keyPaths[0]]); - const compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(ix => { - if (ix.compound && - keyPaths.every(keyPath => ix.keyPath.indexOf(keyPath) >= 0)) { - for (let i = 0; i < keyPaths.length; ++i) { - if (keyPaths.indexOf(ix.keyPath[i]) === -1) - return false; - } - return true; - } - return false; - }).sort((a, b) => a.keyPath.length - b.keyPath.length)[0]; - if (compoundIndex && this.db._maxKey !== maxString) { - const keyPathsInValidOrder = compoundIndex.keyPath.slice(0, keyPaths.length); - return this - .where(keyPathsInValidOrder) - .equals(keyPathsInValidOrder.map(kp => indexOrCrit[kp])); - } - if (!compoundIndex && debug) - console.warn(`The query ${JSON.stringify(indexOrCrit)} on ${this.name} would benefit from a ` + - `compound index [${keyPaths.join('+')}]`); - const { idxByName } = this.schema; - const idb = this.db._deps.indexedDB; - function equals(a, b) { - return idb.cmp(a, b) === 0; - } - const [idx, filterFunction] = keyPaths.reduce(([prevIndex, prevFilterFn], keyPath) => { - const index = idxByName[keyPath]; - const value = indexOrCrit[keyPath]; - return [ - prevIndex || index, - prevIndex || !index ? - combine(prevFilterFn, index && index.multi ? - x => { - const prop = getByKeyPath(x, keyPath); - return isArray(prop) && prop.some(item => equals(value, item)); - } : x => equals(value, getByKeyPath(x, keyPath))) - : prevFilterFn - ]; - }, [null, null]); - return idx ? - this.where(idx.name).equals(indexOrCrit[idx.keyPath]) - .filter(filterFunction) : - compoundIndex ? - this.filter(filterFunction) : - this.where(keyPaths).equals(''); - } - filter(filterFunction) { - return this.toCollection().and(filterFunction); - } - count(thenShortcut) { - return this.toCollection().count(thenShortcut); - } - offset(offset) { - return this.toCollection().offset(offset); - } - limit(numRows) { - return this.toCollection().limit(numRows); - } - each(callback) { - return this.toCollection().each(callback); - } - toArray(thenShortcut) { - return this.toCollection().toArray(thenShortcut); - } - toCollection() { - return new this.db.Collection(new this.db.WhereClause(this)); - } - orderBy(index) { - return new this.db.Collection(new this.db.WhereClause(this, isArray(index) ? - `[${index.join('+')}]` : - index)); - } - reverse() { - return this.toCollection().reverse(); - } - mapToClass(constructor) { - const { db, name: tableName } = this; - this.schema.mappedClass = constructor; - if (constructor.prototype instanceof Entity) { - constructor = class extends constructor { - get db() { return db; } - table() { return tableName; } - }; - } - const inheritedProps = new Set(); - for (let proto = constructor.prototype; proto; proto = getProto(proto)) { - Object.getOwnPropertyNames(proto).forEach(propName => inheritedProps.add(propName)); - } - const readHook = (obj) => { - if (!obj) - return obj; - const res = Object.create(constructor.prototype); - for (let m in obj) - if (!inheritedProps.has(m)) - try { - res[m] = obj[m]; - } - catch (_) { } - return res; - }; - if (this.schema.readHook) { - this.hook.reading.unsubscribe(this.schema.readHook); - } - this.schema.readHook = readHook; - this.hook("reading", readHook); - return constructor; - } - defineClass() { - function Class(content) { - extend(this, content); - } - return this.mapToClass(Class); - } - add(obj, key) { - const { auto, keyPath } = this.schema.primKey; - let objToAdd = obj; - if (keyPath && auto) { - objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); - } - return this._trans('readwrite', trans => { - return this.core.mutate({ trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd] }); - }).then(res => res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult) - .then(lastResult => { - if (keyPath) { - try { - setByKeyPath(obj, keyPath, lastResult); - } - catch (_) { } - } - return lastResult; - }); - } - update(keyOrObject, modifications) { - if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) { - const key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath); - if (key === undefined) - return rejection(new exceptions.InvalidArgument("Given object does not contain its primary key")); - return this.where(":id").equals(key).modify(modifications); - } - else { - return this.where(":id").equals(keyOrObject).modify(modifications); - } - } - put(obj, key) { - const { auto, keyPath } = this.schema.primKey; - let objToAdd = obj; - if (keyPath && auto) { - objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); - } - return this._trans('readwrite', trans => this.core.mutate({ trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null })) - .then(res => res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult) - .then(lastResult => { - if (keyPath) { - try { - setByKeyPath(obj, keyPath, lastResult); - } - catch (_) { } - } - return lastResult; - }); - } - delete(key) { - return this._trans('readwrite', trans => this.core.mutate({ trans, type: 'delete', keys: [key] })) - .then(res => res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined); - } - clear() { - return this._trans('readwrite', trans => this.core.mutate({ trans, type: 'deleteRange', range: AnyRange })) - .then(res => res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined); - } - bulkGet(keys) { - return this._trans('readonly', trans => { - return this.core.getMany({ - keys, - trans - }).then(result => result.map(res => this.hook.reading.fire(res))); - }); - } - bulkAdd(objects, keysOrOptions, options) { - const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; - options = options || (keys ? undefined : keysOrOptions); - const wantResults = options ? options.allKeys : undefined; - return this._trans('readwrite', trans => { - const { auto, keyPath } = this.schema.primKey; - if (keyPath && keys) - throw new exceptions.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys"); - if (keys && keys.length !== objects.length) - throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); - const numObjects = objects.length; - let objectsToAdd = keyPath && auto ? - objects.map(workaroundForUndefinedPrimKey(keyPath)) : - objects; - return this.core.mutate({ trans, type: 'add', keys: keys, values: objectsToAdd, wantResults }) - .then(({ numFailures, results, lastResult, failures }) => { - const result = wantResults ? results : lastResult; - if (numFailures === 0) - return result; - throw new BulkError(`${this.name}.bulkAdd(): ${numFailures} of ${numObjects} operations failed`, failures); - }); - }); - } - bulkPut(objects, keysOrOptions, options) { - const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; - options = options || (keys ? undefined : keysOrOptions); - const wantResults = options ? options.allKeys : undefined; - return this._trans('readwrite', trans => { - const { auto, keyPath } = this.schema.primKey; - if (keyPath && keys) - throw new exceptions.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys"); - if (keys && keys.length !== objects.length) - throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); - const numObjects = objects.length; - let objectsToPut = keyPath && auto ? - objects.map(workaroundForUndefinedPrimKey(keyPath)) : - objects; - return this.core.mutate({ trans, type: 'put', keys: keys, values: objectsToPut, wantResults }) - .then(({ numFailures, results, lastResult, failures }) => { - const result = wantResults ? results : lastResult; - if (numFailures === 0) - return result; - throw new BulkError(`${this.name}.bulkPut(): ${numFailures} of ${numObjects} operations failed`, failures); - }); - }); - } - bulkUpdate(keysAndChanges) { - const coreTable = this.core; - const keys = keysAndChanges.map((entry) => entry.key); - const changeSpecs = keysAndChanges.map((entry) => entry.changes); - const offsetMap = []; - return this._trans('readwrite', (trans) => { - return coreTable.getMany({ trans, keys, cache: 'clone' }).then((objs) => { - const resultKeys = []; - const resultObjs = []; - keysAndChanges.forEach(({ key, changes }, idx) => { - const obj = objs[idx]; - if (obj) { - for (const keyPath of Object.keys(changes)) { - const value = changes[keyPath]; - if (keyPath === this.schema.primKey.keyPath) { - if (cmp(value, key) !== 0) { - throw new exceptions.Constraint(`Cannot update primary key in bulkUpdate()`); - } - } - else { - setByKeyPath(obj, keyPath, value); - } - } - offsetMap.push(idx); - resultKeys.push(key); - resultObjs.push(obj); - } - }); - const numEntries = resultKeys.length; - return coreTable - .mutate({ - trans, - type: 'put', - keys: resultKeys, - values: resultObjs, - updates: { - keys, - changeSpecs - } - }) - .then(({ numFailures, failures }) => { - if (numFailures === 0) - return numEntries; - for (const offset of Object.keys(failures)) { - const mappedOffset = offsetMap[Number(offset)]; - if (mappedOffset != null) { - const failure = failures[offset]; - delete failures[offset]; - failures[mappedOffset] = failure; - } - } - throw new BulkError(`${this.name}.bulkUpdate(): ${numFailures} of ${numEntries} operations failed`, failures); - }); - }); - }); - } - bulkDelete(keys) { - const numKeys = keys.length; - return this._trans('readwrite', trans => { - return this.core.mutate({ trans, type: 'delete', keys: keys }); - }).then(({ numFailures, lastResult, failures }) => { - if (numFailures === 0) - return lastResult; - throw new BulkError(`${this.name}.bulkDelete(): ${numFailures} of ${numKeys} operations failed`, failures); - }); - } -} - -function Events(ctx) { - var evs = {}; - var rv = function (eventName, subscriber) { - if (subscriber) { - var i = arguments.length, args = new Array(i - 1); - while (--i) - args[i - 1] = arguments[i]; - evs[eventName].subscribe.apply(null, args); - return ctx; - } - else if (typeof (eventName) === 'string') { - return evs[eventName]; - } - }; - rv.addEventType = add; - for (var i = 1, l = arguments.length; i < l; ++i) { - add(arguments[i]); - } - return rv; - function add(eventName, chainFunction, defaultFunction) { - if (typeof eventName === 'object') - return addConfiguredEvents(eventName); - if (!chainFunction) - chainFunction = reverseStoppableEventChain; - if (!defaultFunction) - defaultFunction = nop; - var context = { - subscribers: [], - fire: defaultFunction, - subscribe: function (cb) { - if (context.subscribers.indexOf(cb) === -1) { - context.subscribers.push(cb); - context.fire = chainFunction(context.fire, cb); - } - }, - unsubscribe: function (cb) { - context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; }); - context.fire = context.subscribers.reduce(chainFunction, defaultFunction); - } - }; - evs[eventName] = rv[eventName] = context; - return context; - } - function addConfiguredEvents(cfg) { - keys(cfg).forEach(function (eventName) { - var args = cfg[eventName]; - if (isArray(args)) { - add(eventName, cfg[eventName][0], cfg[eventName][1]); - } - else if (args === 'asap') { - var context = add(eventName, mirror, function fire() { - var i = arguments.length, args = new Array(i); - while (i--) - args[i] = arguments[i]; - context.subscribers.forEach(function (fn) { - asap$1(function fireEvent() { - fn.apply(null, args); - }); - }); - }); - } - else - throw new exceptions.InvalidArgument("Invalid event config"); - }); - } -} - -function makeClassConstructor(prototype, constructor) { - derive(constructor).from({ prototype }); - return constructor; -} - -function createTableConstructor(db) { - return makeClassConstructor(Table.prototype, function Table(name, tableSchema, trans) { - this.db = db; - this._tx = trans; - this.name = name; - this.schema = tableSchema; - this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, { - "creating": [hookCreatingChain, nop], - "reading": [pureFunctionChain, mirror], - "updating": [hookUpdatingChain, nop], - "deleting": [hookDeletingChain, nop] - }); - }); -} - -function isPlainKeyRange(ctx, ignoreLimitFilter) { - return !(ctx.filter || ctx.algorithm || ctx.or) && - (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter); -} -function addFilter(ctx, fn) { - ctx.filter = combine(ctx.filter, fn); -} -function addReplayFilter(ctx, factory, isLimitFilter) { - var curr = ctx.replayFilter; - ctx.replayFilter = curr ? () => combine(curr(), factory()) : factory; - ctx.justLimit = isLimitFilter && !curr; -} -function addMatchFilter(ctx, fn) { - ctx.isMatch = combine(ctx.isMatch, fn); -} -function getIndexOrStore(ctx, coreSchema) { - if (ctx.isPrimKey) - return coreSchema.primaryKey; - const index = coreSchema.getIndexByKeyPath(ctx.index); - if (!index) - throw new exceptions.Schema("KeyPath " + ctx.index + " on object store " + coreSchema.name + " is not indexed"); - return index; -} -function openCursor(ctx, coreTable, trans) { - const index = getIndexOrStore(ctx, coreTable.schema); - return coreTable.openCursor({ - trans, - values: !ctx.keysOnly, - reverse: ctx.dir === 'prev', - unique: !!ctx.unique, - query: { - index, - range: ctx.range - } - }); -} -function iter(ctx, fn, coreTrans, coreTable) { - const filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter; - if (!ctx.or) { - return iterate(openCursor(ctx, coreTable, coreTrans), combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper); - } - else { - const set = {}; - const union = (item, cursor, advance) => { - if (!filter || filter(cursor, advance, result => cursor.stop(result), err => cursor.fail(err))) { - var primaryKey = cursor.primaryKey; - var key = '' + primaryKey; - if (key === '[object ArrayBuffer]') - key = '' + new Uint8Array(primaryKey); - if (!hasOwn(set, key)) { - set[key] = true; - fn(item, cursor, advance); - } - } - }; - return Promise.all([ - ctx.or._iterate(union, coreTrans), - iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper) - ]); - } -} -function iterate(cursorPromise, filter, fn, valueMapper) { - var mappedFn = valueMapper ? (x, c, a) => fn(valueMapper(x), c, a) : fn; - var wrappedFn = wrap(mappedFn); - return cursorPromise.then(cursor => { - if (cursor) { - return cursor.start(() => { - var c = () => cursor.continue(); - if (!filter || filter(cursor, advancer => c = advancer, val => { cursor.stop(val); c = nop; }, e => { cursor.fail(e); c = nop; })) - wrappedFn(cursor.value, cursor, advancer => c = advancer); - c(); - }); - } - }); -} - -const PropModSymbol = Symbol(); -class PropModification { - execute(value) { - if (this.add !== undefined) { - const term = this.add; - if (isArray(term)) { - return [...(isArray(value) ? value : []), ...term].sort(); - } - if (typeof term === 'number') - return (Number(value) || 0) + term; - if (typeof term === 'bigint') { - try { - return BigInt(value) + term; - } - catch { - return BigInt(0) + term; - } - } - throw new TypeError(`Invalid term ${term}`); - } - if (this.remove !== undefined) { - const subtrahend = this.remove; - if (isArray(subtrahend)) { - return isArray(value) ? value.filter(item => !subtrahend.includes(item)).sort() : []; - } - if (typeof subtrahend === 'number') - return Number(value) - subtrahend; - if (typeof subtrahend === 'bigint') { - try { - return BigInt(value) - subtrahend; - } - catch { - return BigInt(0) - subtrahend; - } - } - throw new TypeError(`Invalid subtrahend ${subtrahend}`); - } - const prefixToReplace = this.replacePrefix?.[0]; - if (prefixToReplace && typeof value === 'string' && value.startsWith(prefixToReplace)) { - return this.replacePrefix[1] + value.substring(prefixToReplace.length); - } - return value; - } - constructor(spec) { - Object.assign(this, spec); - } -} - -class Collection { - _read(fn, cb) { - var ctx = this._ctx; - return ctx.error ? - ctx.table._trans(null, rejection.bind(null, ctx.error)) : - ctx.table._trans('readonly', fn).then(cb); - } - _write(fn) { - var ctx = this._ctx; - return ctx.error ? - ctx.table._trans(null, rejection.bind(null, ctx.error)) : - ctx.table._trans('readwrite', fn, "locked"); - } - _addAlgorithm(fn) { - var ctx = this._ctx; - ctx.algorithm = combine(ctx.algorithm, fn); - } - _iterate(fn, coreTrans) { - return iter(this._ctx, fn, coreTrans, this._ctx.table.core); - } - clone(props) { - var rv = Object.create(this.constructor.prototype), ctx = Object.create(this._ctx); - if (props) - extend(ctx, props); - rv._ctx = ctx; - return rv; - } - raw() { - this._ctx.valueMapper = null; - return this; - } - each(fn) { - var ctx = this._ctx; - return this._read(trans => iter(ctx, fn, trans, ctx.table.core)); - } - count(cb) { - return this._read(trans => { - const ctx = this._ctx; - const coreTable = ctx.table.core; - if (isPlainKeyRange(ctx, true)) { - return coreTable.count({ - trans, - query: { - index: getIndexOrStore(ctx, coreTable.schema), - range: ctx.range - } - }).then(count => Math.min(count, ctx.limit)); - } - else { - var count = 0; - return iter(ctx, () => { ++count; return false; }, trans, coreTable) - .then(() => count); - } - }).then(cb); - } - sortBy(keyPath, cb) { - const parts = keyPath.split('.').reverse(), lastPart = parts[0], lastIndex = parts.length - 1; - function getval(obj, i) { - if (i) - return getval(obj[parts[i]], i - 1); - return obj[lastPart]; - } - var order = this._ctx.dir === "next" ? 1 : -1; - function sorter(a, b) { - var aVal = getval(a, lastIndex), bVal = getval(b, lastIndex); - return aVal < bVal ? -order : aVal > bVal ? order : 0; - } - return this.toArray(function (a) { - return a.sort(sorter); - }).then(cb); - } - toArray(cb) { - return this._read(trans => { - var ctx = this._ctx; - if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { - const { valueMapper } = ctx; - const index = getIndexOrStore(ctx, ctx.table.core.schema); - return ctx.table.core.query({ - trans, - limit: ctx.limit, - values: true, - query: { - index, - range: ctx.range - } - }).then(({ result }) => valueMapper ? result.map(valueMapper) : result); - } - else { - const a = []; - return iter(ctx, item => a.push(item), trans, ctx.table.core).then(() => a); - } - }, cb); - } - offset(offset) { - var ctx = this._ctx; - if (offset <= 0) - return this; - ctx.offset += offset; - if (isPlainKeyRange(ctx)) { - addReplayFilter(ctx, () => { - var offsetLeft = offset; - return (cursor, advance) => { - if (offsetLeft === 0) - return true; - if (offsetLeft === 1) { - --offsetLeft; - return false; - } - advance(() => { - cursor.advance(offsetLeft); - offsetLeft = 0; - }); - return false; - }; - }); - } - else { - addReplayFilter(ctx, () => { - var offsetLeft = offset; - return () => (--offsetLeft < 0); - }); - } - return this; - } - limit(numRows) { - this._ctx.limit = Math.min(this._ctx.limit, numRows); - addReplayFilter(this._ctx, () => { - var rowsLeft = numRows; - return function (cursor, advance, resolve) { - if (--rowsLeft <= 0) - advance(resolve); - return rowsLeft >= 0; - }; - }, true); - return this; - } - until(filterFunction, bIncludeStopEntry) { - addFilter(this._ctx, function (cursor, advance, resolve) { - if (filterFunction(cursor.value)) { - advance(resolve); - return bIncludeStopEntry; - } - else { - return true; - } - }); - return this; - } - first(cb) { - return this.limit(1).toArray(function (a) { return a[0]; }).then(cb); - } - last(cb) { - return this.reverse().first(cb); - } - filter(filterFunction) { - addFilter(this._ctx, function (cursor) { - return filterFunction(cursor.value); - }); - addMatchFilter(this._ctx, filterFunction); - return this; - } - and(filter) { - return this.filter(filter); - } - or(indexName) { - return new this.db.WhereClause(this._ctx.table, indexName, this); - } - reverse() { - this._ctx.dir = (this._ctx.dir === "prev" ? "next" : "prev"); - if (this._ondirectionchange) - this._ondirectionchange(this._ctx.dir); - return this; - } - desc() { - return this.reverse(); - } - eachKey(cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - return this.each(function (val, cursor) { cb(cursor.key, cursor); }); - } - eachUniqueKey(cb) { - this._ctx.unique = "unique"; - return this.eachKey(cb); - } - eachPrimaryKey(cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); }); - } - keys(cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - var a = []; - return this.each(function (item, cursor) { - a.push(cursor.key); - }).then(function () { - return a; - }).then(cb); - } - primaryKeys(cb) { - var ctx = this._ctx; - if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { - return this._read(trans => { - var index = getIndexOrStore(ctx, ctx.table.core.schema); - return ctx.table.core.query({ - trans, - values: false, - limit: ctx.limit, - query: { - index, - range: ctx.range - } - }); - }).then(({ result }) => result).then(cb); - } - ctx.keysOnly = !ctx.isMatch; - var a = []; - return this.each(function (item, cursor) { - a.push(cursor.primaryKey); - }).then(function () { - return a; - }).then(cb); - } - uniqueKeys(cb) { - this._ctx.unique = "unique"; - return this.keys(cb); - } - firstKey(cb) { - return this.limit(1).keys(function (a) { return a[0]; }).then(cb); - } - lastKey(cb) { - return this.reverse().firstKey(cb); - } - distinct() { - var ctx = this._ctx, idx = ctx.index && ctx.table.schema.idxByName[ctx.index]; - if (!idx || !idx.multi) - return this; - var set = {}; - addFilter(this._ctx, function (cursor) { - var strKey = cursor.primaryKey.toString(); - var found = hasOwn(set, strKey); - set[strKey] = true; - return !found; - }); - return this; - } - modify(changes) { - var ctx = this._ctx; - return this._write(trans => { - var modifyer; - if (typeof changes === 'function') { - modifyer = changes; - } - else { - var keyPaths = keys(changes); - var numKeys = keyPaths.length; - modifyer = function (item) { - let anythingModified = false; - for (let i = 0; i < numKeys; ++i) { - let keyPath = keyPaths[i]; - let val = changes[keyPath]; - let origVal = getByKeyPath(item, keyPath); - if (val instanceof PropModification) { - setByKeyPath(item, keyPath, val.execute(origVal)); - anythingModified = true; - } - else if (origVal !== val) { - setByKeyPath(item, keyPath, val); - anythingModified = true; - } - } - return anythingModified; - }; - } - const coreTable = ctx.table.core; - const { outbound, extractKey } = coreTable.schema.primaryKey; - const limit = this.db._options.modifyChunkSize || 200; - const totalFailures = []; - let successCount = 0; - const failedKeys = []; - const applyMutateResult = (expectedCount, res) => { - const { failures, numFailures } = res; - successCount += expectedCount - numFailures; - for (let pos of keys(failures)) { - totalFailures.push(failures[pos]); - } - }; - return this.clone().primaryKeys().then(keys => { - const criteria = isPlainKeyRange(ctx) && - ctx.limit === Infinity && - (typeof changes !== 'function' || changes === deleteCallback) && { - index: ctx.index, - range: ctx.range - }; - const nextChunk = (offset) => { - const count = Math.min(limit, keys.length - offset); - return coreTable.getMany({ - trans, - keys: keys.slice(offset, offset + count), - cache: "immutable" - }).then(values => { - const addValues = []; - const putValues = []; - const putKeys = outbound ? [] : null; - const deleteKeys = []; - for (let i = 0; i < count; ++i) { - const origValue = values[i]; - const ctx = { - value: deepClone(origValue), - primKey: keys[offset + i] - }; - if (modifyer.call(ctx, ctx.value, ctx) !== false) { - if (ctx.value == null) { - deleteKeys.push(keys[offset + i]); - } - else if (!outbound && cmp(extractKey(origValue), extractKey(ctx.value)) !== 0) { - deleteKeys.push(keys[offset + i]); - addValues.push(ctx.value); - } - else { - putValues.push(ctx.value); - if (outbound) - putKeys.push(keys[offset + i]); - } - } - } - return Promise.resolve(addValues.length > 0 && - coreTable.mutate({ trans, type: 'add', values: addValues }) - .then(res => { - for (let pos in res.failures) { - deleteKeys.splice(parseInt(pos), 1); - } - applyMutateResult(addValues.length, res); - })).then(() => (putValues.length > 0 || (criteria && typeof changes === 'object')) && - coreTable.mutate({ - trans, - type: 'put', - keys: putKeys, - values: putValues, - criteria, - changeSpec: typeof changes !== 'function' - && changes, - isAdditionalChunk: offset > 0 - }).then(res => applyMutateResult(putValues.length, res))).then(() => (deleteKeys.length > 0 || (criteria && changes === deleteCallback)) && - coreTable.mutate({ - trans, - type: 'delete', - keys: deleteKeys, - criteria, - isAdditionalChunk: offset > 0 - }).then(res => applyMutateResult(deleteKeys.length, res))).then(() => { - return keys.length > offset + count && nextChunk(offset + limit); - }); - }); - }; - return nextChunk(0).then(() => { - if (totalFailures.length > 0) - throw new ModifyError("Error modifying one or more objects", totalFailures, successCount, failedKeys); - return keys.length; - }); - }); - }); - } - delete() { - var ctx = this._ctx, range = ctx.range; - if (isPlainKeyRange(ctx) && - (ctx.isPrimKey || range.type === 3 )) - { - return this._write(trans => { - const { primaryKey } = ctx.table.core.schema; - const coreRange = range; - return ctx.table.core.count({ trans, query: { index: primaryKey, range: coreRange } }).then(count => { - return ctx.table.core.mutate({ trans, type: 'deleteRange', range: coreRange }) - .then(({ failures, lastResult, results, numFailures }) => { - if (numFailures) - throw new ModifyError("Could not delete some values", Object.keys(failures).map(pos => failures[pos]), count - numFailures); - return count - numFailures; - }); - }); - }); - } - return this.modify(deleteCallback); - } -} -const deleteCallback = (value, ctx) => ctx.value = null; - -function createCollectionConstructor(db) { - return makeClassConstructor(Collection.prototype, function Collection(whereClause, keyRangeGenerator) { - this.db = db; - let keyRange = AnyRange, error = null; - if (keyRangeGenerator) - try { - keyRange = keyRangeGenerator(); - } - catch (ex) { - error = ex; - } - const whereCtx = whereClause._ctx; - const table = whereCtx.table; - const readingHook = table.hook.reading.fire; - this._ctx = { - table: table, - index: whereCtx.index, - isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)), - range: keyRange, - keysOnly: false, - dir: "next", - unique: "", - algorithm: null, - filter: null, - replayFilter: null, - justLimit: true, - isMatch: null, - offset: 0, - limit: Infinity, - error: error, - or: whereCtx.or, - valueMapper: readingHook !== mirror ? readingHook : null - }; - }); -} - -function simpleCompare(a, b) { - return a < b ? -1 : a === b ? 0 : 1; -} -function simpleCompareReverse(a, b) { - return a > b ? -1 : a === b ? 0 : 1; -} - -function fail(collectionOrWhereClause, err, T) { - var collection = collectionOrWhereClause instanceof WhereClause ? - new collectionOrWhereClause.Collection(collectionOrWhereClause) : - collectionOrWhereClause; - collection._ctx.error = T ? new T(err) : new TypeError(err); - return collection; -} -function emptyCollection(whereClause) { - return new whereClause.Collection(whereClause, () => rangeEqual("")).limit(0); -} -function upperFactory(dir) { - return dir === "next" ? - (s) => s.toUpperCase() : - (s) => s.toLowerCase(); -} -function lowerFactory(dir) { - return dir === "next" ? - (s) => s.toLowerCase() : - (s) => s.toUpperCase(); -} -function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) { - var length = Math.min(key.length, lowerNeedle.length); - var llp = -1; - for (var i = 0; i < length; ++i) { - var lwrKeyChar = lowerKey[i]; - if (lwrKeyChar !== lowerNeedle[i]) { - if (cmp(key[i], upperNeedle[i]) < 0) - return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1); - if (cmp(key[i], lowerNeedle[i]) < 0) - return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1); - if (llp >= 0) - return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1); - return null; - } - if (cmp(key[i], lwrKeyChar) < 0) - llp = i; - } - if (length < lowerNeedle.length && dir === "next") - return key + upperNeedle.substr(key.length); - if (length < key.length && dir === "prev") - return key.substr(0, upperNeedle.length); - return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1)); -} -function addIgnoreCaseAlgorithm(whereClause, match, needles, suffix) { - var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix, needlesLen = needles.length; - if (!needles.every(s => typeof s === 'string')) { - return fail(whereClause, STRING_EXPECTED); - } - function initDirection(dir) { - upper = upperFactory(dir); - lower = lowerFactory(dir); - compare = (dir === "next" ? simpleCompare : simpleCompareReverse); - var needleBounds = needles.map(function (needle) { - return { lower: lower(needle), upper: upper(needle) }; - }).sort(function (a, b) { - return compare(a.lower, b.lower); - }); - upperNeedles = needleBounds.map(function (nb) { return nb.upper; }); - lowerNeedles = needleBounds.map(function (nb) { return nb.lower; }); - direction = dir; - nextKeySuffix = (dir === "next" ? "" : suffix); - } - initDirection("next"); - var c = new whereClause.Collection(whereClause, () => createRange(upperNeedles[0], lowerNeedles[needlesLen - 1] + suffix)); - c._ondirectionchange = function (direction) { - initDirection(direction); - }; - var firstPossibleNeedle = 0; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - if (typeof key !== 'string') - return false; - var lowerKey = lower(key); - if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) { - return true; - } - else { - var lowestPossibleCasing = null; - for (var i = firstPossibleNeedle; i < needlesLen; ++i) { - var casing = nextCasing(key, lowerKey, upperNeedles[i], lowerNeedles[i], compare, direction); - if (casing === null && lowestPossibleCasing === null) - firstPossibleNeedle = i + 1; - else if (lowestPossibleCasing === null || compare(lowestPossibleCasing, casing) > 0) { - lowestPossibleCasing = casing; - } - } - if (lowestPossibleCasing !== null) { - advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); }); - } - else { - advance(resolve); - } - return false; - } - }); - return c; -} -function createRange(lower, upper, lowerOpen, upperOpen) { - return { - type: 2 , - lower, - upper, - lowerOpen, - upperOpen - }; -} -function rangeEqual(value) { - return { - type: 1 , - lower: value, - upper: value - }; -} - -class WhereClause { - get Collection() { - return this._ctx.table.db.Collection; - } - between(lower, upper, includeLower, includeUpper) { - includeLower = includeLower !== false; - includeUpper = includeUpper === true; - try { - if ((this._cmp(lower, upper) > 0) || - (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper))) - return emptyCollection(this); - return new this.Collection(this, () => createRange(lower, upper, !includeLower, !includeUpper)); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - } - equals(value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, () => rangeEqual(value)); - } - above(value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, () => createRange(value, undefined, true)); - } - aboveOrEqual(value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, () => createRange(value, undefined, false)); - } - below(value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, () => createRange(undefined, value, false, true)); - } - belowOrEqual(value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, () => createRange(undefined, value)); - } - startsWith(str) { - if (typeof str !== 'string') - return fail(this, STRING_EXPECTED); - return this.between(str, str + maxString, true, true); - } - startsWithIgnoreCase(str) { - if (str === "") - return this.startsWith(str); - return addIgnoreCaseAlgorithm(this, (x, a) => x.indexOf(a[0]) === 0, [str], maxString); - } - equalsIgnoreCase(str) { - return addIgnoreCaseAlgorithm(this, (x, a) => x === a[0], [str], ""); - } - anyOfIgnoreCase() { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return emptyCollection(this); - return addIgnoreCaseAlgorithm(this, (x, a) => a.indexOf(x) !== -1, set, ""); - } - startsWithAnyOfIgnoreCase() { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return emptyCollection(this); - return addIgnoreCaseAlgorithm(this, (x, a) => a.some(n => x.indexOf(n) === 0), set, maxString); - } - anyOf() { - const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - let compare = this._cmp; - try { - set.sort(compare); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - if (set.length === 0) - return emptyCollection(this); - const c = new this.Collection(this, () => createRange(set[0], set[set.length - 1])); - c._ondirectionchange = direction => { - compare = (direction === "next" ? - this._ascending : - this._descending); - set.sort(compare); - }; - let i = 0; - c._addAlgorithm((cursor, advance, resolve) => { - const key = cursor.key; - while (compare(key, set[i]) > 0) { - ++i; - if (i === set.length) { - advance(resolve); - return false; - } - } - if (compare(key, set[i]) === 0) { - return true; - } - else { - advance(() => { cursor.continue(set[i]); }); - return false; - } - }); - return c; - } - notEqual(value) { - return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false }); - } - noneOf() { - const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return new this.Collection(this); - try { - set.sort(this._ascending); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - const ranges = set.reduce((res, val) => res ? - res.concat([[res[res.length - 1][1], val]]) : - [[minKey, val]], null); - ranges.push([set[set.length - 1], this.db._maxKey]); - return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false }); - } - inAnyRange(ranges, options) { - const cmp = this._cmp, ascending = this._ascending, descending = this._descending, min = this._min, max = this._max; - if (ranges.length === 0) - return emptyCollection(this); - if (!ranges.every(range => range[0] !== undefined && - range[1] !== undefined && - ascending(range[0], range[1]) <= 0)) { - return fail(this, "First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower", exceptions.InvalidArgument); - } - const includeLowers = !options || options.includeLowers !== false; - const includeUppers = options && options.includeUppers === true; - function addRange(ranges, newRange) { - let i = 0, l = ranges.length; - for (; i < l; ++i) { - const range = ranges[i]; - if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) { - range[0] = min(range[0], newRange[0]); - range[1] = max(range[1], newRange[1]); - break; - } - } - if (i === l) - ranges.push(newRange); - return ranges; - } - let sortDirection = ascending; - function rangeSorter(a, b) { return sortDirection(a[0], b[0]); } - let set; - try { - set = ranges.reduce(addRange, []); - set.sort(rangeSorter); - } - catch (ex) { - return fail(this, INVALID_KEY_ARGUMENT); - } - let rangePos = 0; - const keyIsBeyondCurrentEntry = includeUppers ? - key => ascending(key, set[rangePos][1]) > 0 : - key => ascending(key, set[rangePos][1]) >= 0; - const keyIsBeforeCurrentEntry = includeLowers ? - key => descending(key, set[rangePos][0]) > 0 : - key => descending(key, set[rangePos][0]) >= 0; - function keyWithinCurrentRange(key) { - return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key); - } - let checkKey = keyIsBeyondCurrentEntry; - const c = new this.Collection(this, () => createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers)); - c._ondirectionchange = direction => { - if (direction === "next") { - checkKey = keyIsBeyondCurrentEntry; - sortDirection = ascending; - } - else { - checkKey = keyIsBeforeCurrentEntry; - sortDirection = descending; - } - set.sort(rangeSorter); - }; - c._addAlgorithm((cursor, advance, resolve) => { - var key = cursor.key; - while (checkKey(key)) { - ++rangePos; - if (rangePos === set.length) { - advance(resolve); - return false; - } - } - if (keyWithinCurrentRange(key)) { - return true; - } - else if (this._cmp(key, set[rangePos][1]) === 0 || this._cmp(key, set[rangePos][0]) === 0) { - return false; - } - else { - advance(() => { - if (sortDirection === ascending) - cursor.continue(set[rangePos][0]); - else - cursor.continue(set[rangePos][1]); - }); - return false; - } - }); - return c; - } - startsWithAnyOf() { - const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (!set.every(s => typeof s === 'string')) { - return fail(this, "startsWithAnyOf() only works with strings"); - } - if (set.length === 0) - return emptyCollection(this); - return this.inAnyRange(set.map((str) => [str, str + maxString])); - } -} - -function createWhereClauseConstructor(db) { - return makeClassConstructor(WhereClause.prototype, function WhereClause(table, index, orCollection) { - this.db = db; - this._ctx = { - table: table, - index: index === ":id" ? null : index, - or: orCollection - }; - this._cmp = this._ascending = cmp; - this._descending = (a, b) => cmp(b, a); - this._max = (a, b) => cmp(a, b) > 0 ? a : b; - this._min = (a, b) => cmp(a, b) < 0 ? a : b; - this._IDBKeyRange = db._deps.IDBKeyRange; - if (!this._IDBKeyRange) - throw new exceptions.MissingAPI(); - }); -} - -function eventRejectHandler(reject) { - return wrap(function (event) { - preventDefault(event); - reject(event.target.error); - return false; - }); -} -function preventDefault(event) { - if (event.stopPropagation) - event.stopPropagation(); - if (event.preventDefault) - event.preventDefault(); -} - -const DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated'; -const STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1'; -const globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME); - -class Transaction { - _lock() { - assert(!PSD.global); - ++this._reculock; - if (this._reculock === 1 && !PSD.global) - PSD.lockOwnerFor = this; - return this; - } - _unlock() { - assert(!PSD.global); - if (--this._reculock === 0) { - if (!PSD.global) - PSD.lockOwnerFor = null; - while (this._blockedFuncs.length > 0 && !this._locked()) { - var fnAndPSD = this._blockedFuncs.shift(); - try { - usePSD(fnAndPSD[1], fnAndPSD[0]); - } - catch (e) { } - } - } - return this; - } - _locked() { - return this._reculock && PSD.lockOwnerFor !== this; - } - create(idbtrans) { - if (!this.mode) - return this; - const idbdb = this.db.idbdb; - const dbOpenError = this.db._state.dbOpenError; - assert(!this.idbtrans); - if (!idbtrans && !idbdb) { - switch (dbOpenError && dbOpenError.name) { - case "DatabaseClosedError": - throw new exceptions.DatabaseClosed(dbOpenError); - case "MissingAPIError": - throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError); - default: - throw new exceptions.OpenFailed(dbOpenError); - } - } - if (!this.active) - throw new exceptions.TransactionInactive(); - assert(this._completion._state === null); - idbtrans = this.idbtrans = idbtrans || - (this.db.core - ? this.db.core.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability }) - : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })); - idbtrans.onerror = wrap(ev => { - preventDefault(ev); - this._reject(idbtrans.error); - }); - idbtrans.onabort = wrap(ev => { - preventDefault(ev); - this.active && this._reject(new exceptions.Abort(idbtrans.error)); - this.active = false; - this.on("abort").fire(ev); - }); - idbtrans.oncomplete = wrap(() => { - this.active = false; - this._resolve(); - if ('mutatedParts' in idbtrans) { - globalEvents.storagemutated.fire(idbtrans["mutatedParts"]); - } - }); - return this; - } - _promise(mode, fn, bWriteLock) { - if (mode === 'readwrite' && this.mode !== 'readwrite') - return rejection(new exceptions.ReadOnly("Transaction is readonly")); - if (!this.active) - return rejection(new exceptions.TransactionInactive()); - if (this._locked()) { - return new DexiePromise((resolve, reject) => { - this._blockedFuncs.push([() => { - this._promise(mode, fn, bWriteLock).then(resolve, reject); - }, PSD]); - }); - } - else if (bWriteLock) { - return newScope(() => { - var p = new DexiePromise((resolve, reject) => { - this._lock(); - const rv = fn(resolve, reject, this); - if (rv && rv.then) - rv.then(resolve, reject); - }); - p.finally(() => this._unlock()); - p._lib = true; - return p; - }); - } - else { - var p = new DexiePromise((resolve, reject) => { - var rv = fn(resolve, reject, this); - if (rv && rv.then) - rv.then(resolve, reject); - }); - p._lib = true; - return p; - } - } - _root() { - return this.parent ? this.parent._root() : this; - } - waitFor(promiseLike) { - var root = this._root(); - const promise = DexiePromise.resolve(promiseLike); - if (root._waitingFor) { - root._waitingFor = root._waitingFor.then(() => promise); - } - else { - root._waitingFor = promise; - root._waitingQueue = []; - var store = root.idbtrans.objectStore(root.storeNames[0]); - (function spin() { - ++root._spinCount; - while (root._waitingQueue.length) - (root._waitingQueue.shift())(); - if (root._waitingFor) - store.get(-Infinity).onsuccess = spin; - }()); - } - var currentWaitPromise = root._waitingFor; - return new DexiePromise((resolve, reject) => { - promise.then(res => root._waitingQueue.push(wrap(resolve.bind(null, res))), err => root._waitingQueue.push(wrap(reject.bind(null, err)))).finally(() => { - if (root._waitingFor === currentWaitPromise) { - root._waitingFor = null; - } - }); - }); - } - abort() { - if (this.active) { - this.active = false; - if (this.idbtrans) - this.idbtrans.abort(); - this._reject(new exceptions.Abort()); - } - } - table(tableName) { - const memoizedTables = (this._memoizedTables || (this._memoizedTables = {})); - if (hasOwn(memoizedTables, tableName)) - return memoizedTables[tableName]; - const tableSchema = this.schema[tableName]; - if (!tableSchema) { - throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); - } - const transactionBoundTable = new this.db.Table(tableName, tableSchema, this); - transactionBoundTable.core = this.db.core.table(tableName); - memoizedTables[tableName] = transactionBoundTable; - return transactionBoundTable; - } -} - -function createTransactionConstructor(db) { - return makeClassConstructor(Transaction.prototype, function Transaction(mode, storeNames, dbschema, chromeTransactionDurability, parent) { - this.db = db; - this.mode = mode; - this.storeNames = storeNames; - this.schema = dbschema; - this.chromeTransactionDurability = chromeTransactionDurability; - this.idbtrans = null; - this.on = Events(this, "complete", "error", "abort"); - this.parent = parent || null; - this.active = true; - this._reculock = 0; - this._blockedFuncs = []; - this._resolve = null; - this._reject = null; - this._waitingFor = null; - this._waitingQueue = null; - this._spinCount = 0; - this._completion = new DexiePromise((resolve, reject) => { - this._resolve = resolve; - this._reject = reject; - }); - this._completion.then(() => { - this.active = false; - this.on.complete.fire(); - }, e => { - var wasActive = this.active; - this.active = false; - this.on.error.fire(e); - this.parent ? - this.parent._reject(e) : - wasActive && this.idbtrans && this.idbtrans.abort(); - return rejection(e); - }); - }); -} - -function createIndexSpec(name, keyPath, unique, multi, auto, compound, isPrimKey) { - return { - name, - keyPath, - unique, - multi, - auto, - compound, - src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? "++" : "") + nameFromKeyPath(keyPath) - }; -} -function nameFromKeyPath(keyPath) { - return typeof keyPath === 'string' ? - keyPath : - keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : ""; -} - -function createTableSchema(name, primKey, indexes) { - return { - name, - primKey, - indexes, - mappedClass: null, - idxByName: arrayToObject(indexes, index => [index.name, index]) - }; -} - -function safariMultiStoreFix(storeNames) { - return storeNames.length === 1 ? storeNames[0] : storeNames; -} -let getMaxKey = (IdbKeyRange) => { - try { - IdbKeyRange.only([[]]); - getMaxKey = () => [[]]; - return [[]]; - } - catch (e) { - getMaxKey = () => maxString; - return maxString; - } -}; - -function getKeyExtractor(keyPath) { - if (keyPath == null) { - return () => undefined; - } - else if (typeof keyPath === 'string') { - return getSinglePathKeyExtractor(keyPath); - } - else { - return obj => getByKeyPath(obj, keyPath); - } -} -function getSinglePathKeyExtractor(keyPath) { - const split = keyPath.split('.'); - if (split.length === 1) { - return obj => obj[keyPath]; - } - else { - return obj => getByKeyPath(obj, keyPath); - } -} - -function arrayify(arrayLike) { - return [].slice.call(arrayLike); -} -let _id_counter = 0; -function getKeyPathAlias(keyPath) { - return keyPath == null ? - ":id" : - typeof keyPath === 'string' ? - keyPath : - `[${keyPath.join('+')}]`; -} -function createDBCore(db, IdbKeyRange, tmpTrans) { - function extractSchema(db, trans) { - const tables = arrayify(db.objectStoreNames); - return { - schema: { - name: db.name, - tables: tables.map(table => trans.objectStore(table)).map(store => { - const { keyPath, autoIncrement } = store; - const compound = isArray(keyPath); - const outbound = keyPath == null; - const indexByKeyPath = {}; - const result = { - name: store.name, - primaryKey: { - name: null, - isPrimaryKey: true, - outbound, - compound, - keyPath, - autoIncrement, - unique: true, - extractKey: getKeyExtractor(keyPath) - }, - indexes: arrayify(store.indexNames).map(indexName => store.index(indexName)) - .map(index => { - const { name, unique, multiEntry, keyPath } = index; - const compound = isArray(keyPath); - const result = { - name, - compound, - keyPath, - unique, - multiEntry, - extractKey: getKeyExtractor(keyPath) - }; - indexByKeyPath[getKeyPathAlias(keyPath)] = result; - return result; - }), - getIndexByKeyPath: (keyPath) => indexByKeyPath[getKeyPathAlias(keyPath)] - }; - indexByKeyPath[":id"] = result.primaryKey; - if (keyPath != null) { - indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey; - } - return result; - }) - }, - hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) && - !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && - !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && - [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) - }; - } - function makeIDBKeyRange(range) { - if (range.type === 3 ) - return null; - if (range.type === 4 ) - throw new Error("Cannot convert never type to IDBKeyRange"); - const { lower, upper, lowerOpen, upperOpen } = range; - const idbRange = lower === undefined ? - upper === undefined ? - null : - IdbKeyRange.upperBound(upper, !!upperOpen) : - upper === undefined ? - IdbKeyRange.lowerBound(lower, !!lowerOpen) : - IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen); - return idbRange; - } - function createDbCoreTable(tableSchema) { - const tableName = tableSchema.name; - function mutate({ trans, type, keys, values, range }) { - return new Promise((resolve, reject) => { - resolve = wrap(resolve); - const store = trans.objectStore(tableName); - const outbound = store.keyPath == null; - const isAddOrPut = type === "put" || type === "add"; - if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange') - throw new Error("Invalid operation type: " + type); - const { length } = keys || values || { length: 1 }; - if (keys && values && keys.length !== values.length) { - throw new Error("Given keys array must have same length as given values array."); - } - if (length === 0) - return resolve({ numFailures: 0, failures: {}, results: [], lastResult: undefined }); - let req; - const reqs = []; - const failures = []; - let numFailures = 0; - const errorHandler = event => { - ++numFailures; - preventDefault(event); - }; - if (type === 'deleteRange') { - if (range.type === 4 ) - return resolve({ numFailures, failures, results: [], lastResult: undefined }); - if (range.type === 3 ) - reqs.push(req = store.clear()); - else - reqs.push(req = store.delete(makeIDBKeyRange(range))); - } - else { - const [args1, args2] = isAddOrPut ? - outbound ? - [values, keys] : - [values, null] : - [keys, null]; - if (isAddOrPut) { - for (let i = 0; i < length; ++i) { - reqs.push(req = (args2 && args2[i] !== undefined ? - store[type](args1[i], args2[i]) : - store[type](args1[i]))); - req.onerror = errorHandler; - } - } - else { - for (let i = 0; i < length; ++i) { - reqs.push(req = store[type](args1[i])); - req.onerror = errorHandler; - } - } - } - const done = event => { - const lastResult = event.target.result; - reqs.forEach((req, i) => req.error != null && (failures[i] = req.error)); - resolve({ - numFailures, - failures, - results: type === "delete" ? keys : reqs.map(req => req.result), - lastResult - }); - }; - req.onerror = event => { - errorHandler(event); - done(event); - }; - req.onsuccess = done; - }); - } - function openCursor({ trans, values, query, reverse, unique }) { - return new Promise((resolve, reject) => { - resolve = wrap(resolve); - const { index, range } = query; - const store = trans.objectStore(tableName); - const source = index.isPrimaryKey ? - store : - store.index(index.name); - const direction = reverse ? - unique ? - "prevunique" : - "prev" : - unique ? - "nextunique" : - "next"; - const req = values || !('openKeyCursor' in source) ? - source.openCursor(makeIDBKeyRange(range), direction) : - source.openKeyCursor(makeIDBKeyRange(range), direction); - req.onerror = eventRejectHandler(reject); - req.onsuccess = wrap(ev => { - const cursor = req.result; - if (!cursor) { - resolve(null); - return; - } - cursor.___id = ++_id_counter; - cursor.done = false; - const _cursorContinue = cursor.continue.bind(cursor); - let _cursorContinuePrimaryKey = cursor.continuePrimaryKey; - if (_cursorContinuePrimaryKey) - _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor); - const _cursorAdvance = cursor.advance.bind(cursor); - const doThrowCursorIsNotStarted = () => { throw new Error("Cursor not started"); }; - const doThrowCursorIsStopped = () => { throw new Error("Cursor not stopped"); }; - cursor.trans = trans; - cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted; - cursor.fail = wrap(reject); - cursor.next = function () { - let gotOne = 1; - return this.start(() => gotOne-- ? this.continue() : this.stop()).then(() => this); - }; - cursor.start = (callback) => { - const iterationPromise = new Promise((resolveIteration, rejectIteration) => { - resolveIteration = wrap(resolveIteration); - req.onerror = eventRejectHandler(rejectIteration); - cursor.fail = rejectIteration; - cursor.stop = value => { - cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped; - resolveIteration(value); - }; - }); - const guardedCallback = () => { - if (req.result) { - try { - callback(); - } - catch (err) { - cursor.fail(err); - } - } - else { - cursor.done = true; - cursor.start = () => { throw new Error("Cursor behind last entry"); }; - cursor.stop(); - } - }; - req.onsuccess = wrap(ev => { - req.onsuccess = guardedCallback; - guardedCallback(); - }); - cursor.continue = _cursorContinue; - cursor.continuePrimaryKey = _cursorContinuePrimaryKey; - cursor.advance = _cursorAdvance; - guardedCallback(); - return iterationPromise; - }; - resolve(cursor); - }, reject); - }); - } - function query(hasGetAll) { - return (request) => { - return new Promise((resolve, reject) => { - resolve = wrap(resolve); - const { trans, values, limit, query } = request; - const nonInfinitLimit = limit === Infinity ? undefined : limit; - const { index, range } = query; - const store = trans.objectStore(tableName); - const source = index.isPrimaryKey ? store : store.index(index.name); - const idbKeyRange = makeIDBKeyRange(range); - if (limit === 0) - return resolve({ result: [] }); - if (hasGetAll) { - const req = values ? - source.getAll(idbKeyRange, nonInfinitLimit) : - source.getAllKeys(idbKeyRange, nonInfinitLimit); - req.onsuccess = event => resolve({ result: event.target.result }); - req.onerror = eventRejectHandler(reject); - } - else { - let count = 0; - const req = values || !('openKeyCursor' in source) ? - source.openCursor(idbKeyRange) : - source.openKeyCursor(idbKeyRange); - const result = []; - req.onsuccess = event => { - const cursor = req.result; - if (!cursor) - return resolve({ result }); - result.push(values ? cursor.value : cursor.primaryKey); - if (++count === limit) - return resolve({ result }); - cursor.continue(); - }; - req.onerror = eventRejectHandler(reject); - } - }); - }; - } - return { - name: tableName, - schema: tableSchema, - mutate, - getMany({ trans, keys }) { - return new Promise((resolve, reject) => { - resolve = wrap(resolve); - const store = trans.objectStore(tableName); - const length = keys.length; - const result = new Array(length); - let keyCount = 0; - let callbackCount = 0; - let req; - const successHandler = event => { - const req = event.target; - if ((result[req._pos] = req.result) != null) - ; - if (++callbackCount === keyCount) - resolve(result); - }; - const errorHandler = eventRejectHandler(reject); - for (let i = 0; i < length; ++i) { - const key = keys[i]; - if (key != null) { - req = store.get(keys[i]); - req._pos = i; - req.onsuccess = successHandler; - req.onerror = errorHandler; - ++keyCount; - } - } - if (keyCount === 0) - resolve(result); - }); - }, - get({ trans, key }) { - return new Promise((resolve, reject) => { - resolve = wrap(resolve); - const store = trans.objectStore(tableName); - const req = store.get(key); - req.onsuccess = event => resolve(event.target.result); - req.onerror = eventRejectHandler(reject); - }); - }, - query: query(hasGetAll), - openCursor, - count({ query, trans }) { - const { index, range } = query; - return new Promise((resolve, reject) => { - const store = trans.objectStore(tableName); - const source = index.isPrimaryKey ? store : store.index(index.name); - const idbKeyRange = makeIDBKeyRange(range); - const req = idbKeyRange ? source.count(idbKeyRange) : source.count(); - req.onsuccess = wrap(ev => resolve(ev.target.result)); - req.onerror = eventRejectHandler(reject); - }); - } - }; - } - const { schema, hasGetAll } = extractSchema(db, tmpTrans); - const tables = schema.tables.map(tableSchema => createDbCoreTable(tableSchema)); - const tableMap = {}; - tables.forEach(table => tableMap[table.name] = table); - return { - stack: "dbcore", - transaction: db.transaction.bind(db), - table(name) { - const result = tableMap[name]; - if (!result) - throw new Error(`Table '${name}' not found`); - return tableMap[name]; - }, - MIN_KEY: -Infinity, - MAX_KEY: getMaxKey(IdbKeyRange), - schema - }; -} - -function createMiddlewareStack(stackImpl, middlewares) { - return middlewares.reduce((down, { create }) => ({ ...down, ...create(down) }), stackImpl); -} -function createMiddlewareStacks(middlewares, idbdb, { IDBKeyRange, indexedDB }, tmpTrans) { - const dbcore = createMiddlewareStack(createDBCore(idbdb, IDBKeyRange, tmpTrans), middlewares.dbcore); - return { - dbcore - }; -} -function generateMiddlewareStacks(db, tmpTrans) { - const idbdb = tmpTrans.db; - const stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans); - db.core = stacks.dbcore; - db.tables.forEach(table => { - const tableName = table.name; - if (db.core.schema.tables.some(tbl => tbl.name === tableName)) { - table.core = db.core.table(tableName); - if (db[tableName] instanceof db.Table) { - db[tableName].core = table.core; - } - } - }); -} - -function setApiOnPlace(db, objs, tableNames, dbschema) { - tableNames.forEach(tableName => { - const schema = dbschema[tableName]; - objs.forEach(obj => { - const propDesc = getPropertyDescriptor(obj, tableName); - if (!propDesc || ("value" in propDesc && propDesc.value === undefined)) { - if (obj === db.Transaction.prototype || obj instanceof db.Transaction) { - setProp(obj, tableName, { - get() { return this.table(tableName); }, - set(value) { - defineProperty(this, tableName, { value, writable: true, configurable: true, enumerable: true }); - } - }); - } - else { - obj[tableName] = new db.Table(tableName, schema); - } - } - }); - }); -} -function removeTablesApi(db, objs) { - objs.forEach(obj => { - for (let key in obj) { - if (obj[key] instanceof db.Table) - delete obj[key]; - } - }); -} -function lowerVersionFirst(a, b) { - return a._cfg.version - b._cfg.version; -} -function runUpgraders(db, oldVersion, idbUpgradeTrans, reject) { - const globalSchema = db._dbSchema; - if (idbUpgradeTrans.objectStoreNames.contains('$meta') && !globalSchema.$meta) { - globalSchema.$meta = createTableSchema("$meta", parseIndexSyntax("")[0], []); - db._storeNames.push('$meta'); - } - const trans = db._createTransaction('readwrite', db._storeNames, globalSchema); - trans.create(idbUpgradeTrans); - trans._completion.catch(reject); - const rejectTransaction = trans._reject.bind(trans); - const transless = PSD.transless || PSD; - newScope(() => { - PSD.trans = trans; - PSD.transless = transless; - if (oldVersion === 0) { - keys(globalSchema).forEach(tableName => { - createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes); - }); - generateMiddlewareStacks(db, idbUpgradeTrans); - DexiePromise.follow(() => db.on.populate.fire(trans)).catch(rejectTransaction); - } - else { - generateMiddlewareStacks(db, idbUpgradeTrans); - return getExistingVersion(db, trans, oldVersion) - .then(oldVersion => updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans)) - .catch(rejectTransaction); - } - }); -} -function patchCurrentVersion(db, idbUpgradeTrans) { - createMissingTables(db._dbSchema, idbUpgradeTrans); - if (idbUpgradeTrans.db.version % 10 === 0 && !idbUpgradeTrans.objectStoreNames.contains('$meta')) { - idbUpgradeTrans.db.createObjectStore('$meta').add(Math.ceil((idbUpgradeTrans.db.version / 10) - 1), 'version'); - } - const globalSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); - adjustToExistingIndexNames(db, db._dbSchema, idbUpgradeTrans); - const diff = getSchemaDiff(globalSchema, db._dbSchema); - for (const tableChange of diff.change) { - if (tableChange.change.length || tableChange.recreate) { - console.warn(`Unable to patch indexes of table ${tableChange.name} because it has changes on the type of index or primary key.`); - return; - } - const store = idbUpgradeTrans.objectStore(tableChange.name); - tableChange.add.forEach(idx => { - if (debug) - console.debug(`Dexie upgrade patch: Creating missing index ${tableChange.name}.${idx.src}`); - addIndex(store, idx); - }); - } -} -function getExistingVersion(db, trans, oldVersion) { - if (trans.storeNames.includes('$meta')) { - return trans.table('$meta').get('version').then(metaVersion => { - return metaVersion != null ? metaVersion : oldVersion; - }); - } - else { - return DexiePromise.resolve(oldVersion); - } -} -function updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans) { - const queue = []; - const versions = db._versions; - let globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); - const versToRun = versions.filter(v => v._cfg.version >= oldVersion); - if (versToRun.length === 0) { - return DexiePromise.resolve(); - } - versToRun.forEach(version => { - queue.push(() => { - const oldSchema = globalSchema; - const newSchema = version._cfg.dbschema; - adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans); - adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans); - globalSchema = db._dbSchema = newSchema; - const diff = getSchemaDiff(oldSchema, newSchema); - diff.add.forEach(tuple => { - createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes); - }); - diff.change.forEach(change => { - if (change.recreate) { - throw new exceptions.Upgrade("Not yet support for changing primary key"); - } - else { - const store = idbUpgradeTrans.objectStore(change.name); - change.add.forEach(idx => addIndex(store, idx)); - change.change.forEach(idx => { - store.deleteIndex(idx.name); - addIndex(store, idx); - }); - change.del.forEach(idxName => store.deleteIndex(idxName)); - } - }); - const contentUpgrade = version._cfg.contentUpgrade; - if (contentUpgrade && version._cfg.version > oldVersion) { - generateMiddlewareStacks(db, idbUpgradeTrans); - trans._memoizedTables = {}; - let upgradeSchema = shallowClone(newSchema); - diff.del.forEach(table => { - upgradeSchema[table] = oldSchema[table]; - }); - removeTablesApi(db, [db.Transaction.prototype]); - setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema), upgradeSchema); - trans.schema = upgradeSchema; - const contentUpgradeIsAsync = isAsyncFunction(contentUpgrade); - if (contentUpgradeIsAsync) { - incrementExpectedAwaits(); - } - let returnValue; - const promiseFollowed = DexiePromise.follow(() => { - returnValue = contentUpgrade(trans); - if (returnValue) { - if (contentUpgradeIsAsync) { - var decrementor = decrementExpectedAwaits.bind(null, null); - returnValue.then(decrementor, decrementor); - } - } - }); - return (returnValue && typeof returnValue.then === 'function' ? - DexiePromise.resolve(returnValue) : promiseFollowed.then(() => returnValue)); - } - }); - queue.push(idbtrans => { - const newSchema = version._cfg.dbschema; - deleteRemovedTables(newSchema, idbtrans); - removeTablesApi(db, [db.Transaction.prototype]); - setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema); - trans.schema = db._dbSchema; - }); - queue.push(idbtrans => { - if (db.idbdb.objectStoreNames.contains('$meta')) { - if (Math.ceil(db.idbdb.version / 10) === version._cfg.version) { - db.idbdb.deleteObjectStore('$meta'); - delete db._dbSchema.$meta; - db._storeNames = db._storeNames.filter(name => name !== '$meta'); - } - else { - idbtrans.objectStore('$meta').put(version._cfg.version, 'version'); - } - } - }); - }); - function runQueue() { - return queue.length ? DexiePromise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) : - DexiePromise.resolve(); - } - return runQueue().then(() => { - createMissingTables(globalSchema, idbUpgradeTrans); - }); -} -function getSchemaDiff(oldSchema, newSchema) { - const diff = { - del: [], - add: [], - change: [] - }; - let table; - for (table in oldSchema) { - if (!newSchema[table]) - diff.del.push(table); - } - for (table in newSchema) { - const oldDef = oldSchema[table], newDef = newSchema[table]; - if (!oldDef) { - diff.add.push([table, newDef]); - } - else { - const change = { - name: table, - def: newDef, - recreate: false, - del: [], - add: [], - change: [] - }; - if (( - '' + (oldDef.primKey.keyPath || '')) !== ('' + (newDef.primKey.keyPath || '')) || - (oldDef.primKey.auto !== newDef.primKey.auto)) { - change.recreate = true; - diff.change.push(change); - } - else { - const oldIndexes = oldDef.idxByName; - const newIndexes = newDef.idxByName; - let idxName; - for (idxName in oldIndexes) { - if (!newIndexes[idxName]) - change.del.push(idxName); - } - for (idxName in newIndexes) { - const oldIdx = oldIndexes[idxName], newIdx = newIndexes[idxName]; - if (!oldIdx) - change.add.push(newIdx); - else if (oldIdx.src !== newIdx.src) - change.change.push(newIdx); - } - if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) { - diff.change.push(change); - } - } - } - } - return diff; -} -function createTable(idbtrans, tableName, primKey, indexes) { - const store = idbtrans.db.createObjectStore(tableName, primKey.keyPath ? - { keyPath: primKey.keyPath, autoIncrement: primKey.auto } : - { autoIncrement: primKey.auto }); - indexes.forEach(idx => addIndex(store, idx)); - return store; -} -function createMissingTables(newSchema, idbtrans) { - keys(newSchema).forEach(tableName => { - if (!idbtrans.db.objectStoreNames.contains(tableName)) { - if (debug) - console.debug('Dexie: Creating missing table', tableName); - createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes); - } - }); -} -function deleteRemovedTables(newSchema, idbtrans) { - [].slice.call(idbtrans.db.objectStoreNames).forEach(storeName => newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName)); -} -function addIndex(store, idx) { - store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi }); -} -function buildGlobalSchema(db, idbdb, tmpTrans) { - const globalSchema = {}; - const dbStoreNames = slice(idbdb.objectStoreNames, 0); - dbStoreNames.forEach(storeName => { - const store = tmpTrans.objectStore(storeName); - let keyPath = store.keyPath; - const primKey = createIndexSpec(nameFromKeyPath(keyPath), keyPath || "", true, false, !!store.autoIncrement, keyPath && typeof keyPath !== "string", true); - const indexes = []; - for (let j = 0; j < store.indexNames.length; ++j) { - const idbindex = store.index(store.indexNames[j]); - keyPath = idbindex.keyPath; - var index = createIndexSpec(idbindex.name, keyPath, !!idbindex.unique, !!idbindex.multiEntry, false, keyPath && typeof keyPath !== "string", false); - indexes.push(index); - } - globalSchema[storeName] = createTableSchema(storeName, primKey, indexes); - }); - return globalSchema; -} -function readGlobalSchema(db, idbdb, tmpTrans) { - db.verno = idbdb.version / 10; - const globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans); - db._storeNames = slice(idbdb.objectStoreNames, 0); - setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema); -} -function verifyInstalledSchema(db, tmpTrans) { - const installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans); - const diff = getSchemaDiff(installedSchema, db._dbSchema); - return !(diff.add.length || diff.change.some(ch => ch.add.length || ch.change.length)); -} -function adjustToExistingIndexNames(db, schema, idbtrans) { - const storeNames = idbtrans.db.objectStoreNames; - for (let i = 0; i < storeNames.length; ++i) { - const storeName = storeNames[i]; - const store = idbtrans.objectStore(storeName); - db._hasGetAll = 'getAll' in store; - for (let j = 0; j < store.indexNames.length; ++j) { - const indexName = store.indexNames[j]; - const keyPath = store.index(indexName).keyPath; - const dexieName = typeof keyPath === 'string' ? keyPath : "[" + slice(keyPath).join('+') + "]"; - if (schema[storeName]) { - const indexSpec = schema[storeName].idxByName[dexieName]; - if (indexSpec) { - indexSpec.name = indexName; - delete schema[storeName].idxByName[dexieName]; - schema[storeName].idxByName[indexName] = indexSpec; - } - } - } - } - if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && - !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && - _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope && - [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) { - db._hasGetAll = false; - } -} -function parseIndexSyntax(primKeyAndIndexes) { - return primKeyAndIndexes.split(',').map((index, indexNum) => { - index = index.trim(); - const name = index.replace(/([&*]|\+\+)/g, ""); - const keyPath = /^\[/.test(name) ? name.match(/^\[(.*)\]$/)[1].split('+') : name; - return createIndexSpec(name, keyPath || null, /\&/.test(index), /\*/.test(index), /\+\+/.test(index), isArray(keyPath), indexNum === 0); - }); -} - -class Version { - _parseStoresSpec(stores, outSchema) { - keys(stores).forEach(tableName => { - if (stores[tableName] !== null) { - var indexes = parseIndexSyntax(stores[tableName]); - var primKey = indexes.shift(); - primKey.unique = true; - if (primKey.multi) - throw new exceptions.Schema("Primary key cannot be multi-valued"); - indexes.forEach(idx => { - if (idx.auto) - throw new exceptions.Schema("Only primary key can be marked as autoIncrement (++)"); - if (!idx.keyPath) - throw new exceptions.Schema("Index must have a name and cannot be an empty string"); - }); - outSchema[tableName] = createTableSchema(tableName, primKey, indexes); - } - }); - } - stores(stores) { - const db = this.db; - this._cfg.storesSource = this._cfg.storesSource ? - extend(this._cfg.storesSource, stores) : - stores; - const versions = db._versions; - const storesSpec = {}; - let dbschema = {}; - versions.forEach(version => { - extend(storesSpec, version._cfg.storesSource); - dbschema = (version._cfg.dbschema = {}); - version._parseStoresSpec(storesSpec, dbschema); - }); - db._dbSchema = dbschema; - removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]); - setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema); - db._storeNames = keys(dbschema); - return this; - } - upgrade(upgradeFunction) { - this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction); - return this; - } -} - -function createVersionConstructor(db) { - return makeClassConstructor(Version.prototype, function Version(versionNumber) { - this.db = db; - this._cfg = { - version: versionNumber, - storesSource: null, - dbschema: {}, - tables: {}, - contentUpgrade: null - }; - }); -} - -function getDbNamesTable(indexedDB, IDBKeyRange) { - let dbNamesDB = indexedDB["_dbNamesDB"]; - if (!dbNamesDB) { - dbNamesDB = indexedDB["_dbNamesDB"] = new Dexie$1(DBNAMES_DB, { - addons: [], - indexedDB, - IDBKeyRange, - }); - dbNamesDB.version(1).stores({ dbnames: "name" }); - } - return dbNamesDB.table("dbnames"); -} -function hasDatabasesNative(indexedDB) { - return indexedDB && typeof indexedDB.databases === "function"; -} -function getDatabaseNames({ indexedDB, IDBKeyRange, }) { - return hasDatabasesNative(indexedDB) - ? Promise.resolve(indexedDB.databases()).then((infos) => infos - .map((info) => info.name) - .filter((name) => name !== DBNAMES_DB)) - : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys(); -} -function _onDatabaseCreated({ indexedDB, IDBKeyRange }, name) { - !hasDatabasesNative(indexedDB) && - name !== DBNAMES_DB && - getDbNamesTable(indexedDB, IDBKeyRange).put({ name }).catch(nop); -} -function _onDatabaseDeleted({ indexedDB, IDBKeyRange }, name) { - !hasDatabasesNative(indexedDB) && - name !== DBNAMES_DB && - getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop); -} - -function vip(fn) { - return newScope(function () { - PSD.letThrough = true; - return fn(); - }); -} - -function idbReady() { - var isSafari = !navigator.userAgentData && - /Safari\//.test(navigator.userAgent) && - !/Chrom(e|ium)\//.test(navigator.userAgent); - if (!isSafari || !indexedDB.databases) - return Promise.resolve(); - var intervalId; - return new Promise(function (resolve) { - var tryIdb = function () { return indexedDB.databases().finally(resolve); }; - intervalId = setInterval(tryIdb, 100); - tryIdb(); - }).finally(function () { return clearInterval(intervalId); }); -} - -function isEmptyRange(node) { - return !("from" in node); -} -const RangeSet = function (fromOrTree, to) { - if (this) { - extend(this, arguments.length ? { d: 1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree } : { d: 0 }); - } - else { - const rv = new RangeSet(); - if (fromOrTree && ("d" in fromOrTree)) { - extend(rv, fromOrTree); - } - return rv; - } -}; -props(RangeSet.prototype, { - add(rangeSet) { - mergeRanges(this, rangeSet); - return this; - }, - addKey(key) { - addRange(this, key, key); - return this; - }, - addKeys(keys) { - keys.forEach(key => addRange(this, key, key)); - return this; - }, - [iteratorSymbol]() { - return getRangeSetIterator(this); - } -}); -function addRange(target, from, to) { - const diff = cmp(from, to); - if (isNaN(diff)) - return; - if (diff > 0) - throw RangeError(); - if (isEmptyRange(target)) - return extend(target, { from, to, d: 1 }); - const left = target.l; - const right = target.r; - if (cmp(to, target.from) < 0) { - left - ? addRange(left, from, to) - : (target.l = { from, to, d: 1, l: null, r: null }); - return rebalance(target); - } - if (cmp(from, target.to) > 0) { - right - ? addRange(right, from, to) - : (target.r = { from, to, d: 1, l: null, r: null }); - return rebalance(target); - } - if (cmp(from, target.from) < 0) { - target.from = from; - target.l = null; - target.d = right ? right.d + 1 : 1; - } - if (cmp(to, target.to) > 0) { - target.to = to; - target.r = null; - target.d = target.l ? target.l.d + 1 : 1; - } - const rightWasCutOff = !target.r; - if (left && !target.l) { - mergeRanges(target, left); - } - if (right && rightWasCutOff) { - mergeRanges(target, right); - } -} -function mergeRanges(target, newSet) { - function _addRangeSet(target, { from, to, l, r }) { - addRange(target, from, to); - if (l) - _addRangeSet(target, l); - if (r) - _addRangeSet(target, r); - } - if (!isEmptyRange(newSet)) - _addRangeSet(target, newSet); -} -function rangesOverlap(rangeSet1, rangeSet2) { - const i1 = getRangeSetIterator(rangeSet2); - let nextResult1 = i1.next(); - if (nextResult1.done) - return false; - let a = nextResult1.value; - const i2 = getRangeSetIterator(rangeSet1); - let nextResult2 = i2.next(a.from); - let b = nextResult2.value; - while (!nextResult1.done && !nextResult2.done) { - if (cmp(b.from, a.to) <= 0 && cmp(b.to, a.from) >= 0) - return true; - cmp(a.from, b.from) < 0 - ? (a = (nextResult1 = i1.next(b.from)).value) - : (b = (nextResult2 = i2.next(a.from)).value); - } - return false; -} -function getRangeSetIterator(node) { - let state = isEmptyRange(node) ? null : { s: 0, n: node }; - return { - next(key) { - const keyProvided = arguments.length > 0; - while (state) { - switch (state.s) { - case 0: - state.s = 1; - if (keyProvided) { - while (state.n.l && cmp(key, state.n.from) < 0) - state = { up: state, n: state.n.l, s: 1 }; - } - else { - while (state.n.l) - state = { up: state, n: state.n.l, s: 1 }; - } - case 1: - state.s = 2; - if (!keyProvided || cmp(key, state.n.to) <= 0) - return { value: state.n, done: false }; - case 2: - if (state.n.r) { - state.s = 3; - state = { up: state, n: state.n.r, s: 0 }; - continue; - } - case 3: - state = state.up; - } - } - return { done: true }; - }, - }; -} -function rebalance(target) { - const diff = (target.r?.d || 0) - (target.l?.d || 0); - const r = diff > 1 ? "r" : diff < -1 ? "l" : ""; - if (r) { - const l = r === "r" ? "l" : "r"; - const rootClone = { ...target }; - const oldRootRight = target[r]; - target.from = oldRootRight.from; - target.to = oldRootRight.to; - target[r] = oldRootRight[r]; - rootClone[r] = oldRootRight[l]; - target[l] = rootClone; - rootClone.d = computeDepth(rootClone); - } - target.d = computeDepth(target); -} -function computeDepth({ r, l }) { - return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1; -} - -function extendObservabilitySet(target, newSet) { - keys(newSet).forEach(part => { - if (target[part]) - mergeRanges(target[part], newSet[part]); - else - target[part] = cloneSimpleObjectTree(newSet[part]); - }); - return target; -} - -function obsSetsOverlap(os1, os2) { - return os1.all || os2.all || Object.keys(os1).some((key) => os2[key] && rangesOverlap(os2[key], os1[key])); -} - -const cache = {}; - -let unsignaledParts = {}; -let isTaskEnqueued = false; -function signalSubscribersLazily(part, optimistic = false) { - extendObservabilitySet(unsignaledParts, part); - if (!isTaskEnqueued) { - isTaskEnqueued = true; - setTimeout(() => { - isTaskEnqueued = false; - const parts = unsignaledParts; - unsignaledParts = {}; - signalSubscribersNow(parts, false); - }, 0); - } -} -function signalSubscribersNow(updatedParts, deleteAffectedCacheEntries = false) { - const queriesToSignal = new Set(); - if (updatedParts.all) { - for (const tblCache of Object.values(cache)) { - collectTableSubscribers(tblCache, updatedParts, queriesToSignal, deleteAffectedCacheEntries); - } - } - else { - for (const key in updatedParts) { - const parts = /^idb\:\/\/(.*)\/(.*)\//.exec(key); - if (parts) { - const [, dbName, tableName] = parts; - const tblCache = cache[`idb://${dbName}/${tableName}`]; - if (tblCache) - collectTableSubscribers(tblCache, updatedParts, queriesToSignal, deleteAffectedCacheEntries); - } - } - } - queriesToSignal.forEach((requery) => requery()); -} -function collectTableSubscribers(tblCache, updatedParts, outQueriesToSignal, deleteAffectedCacheEntries) { - const updatedEntryLists = []; - for (const [indexName, entries] of Object.entries(tblCache.queries.query)) { - const filteredEntries = []; - for (const entry of entries) { - if (obsSetsOverlap(updatedParts, entry.obsSet)) { - entry.subscribers.forEach((requery) => outQueriesToSignal.add(requery)); - } - else if (deleteAffectedCacheEntries) { - filteredEntries.push(entry); - } - } - if (deleteAffectedCacheEntries) - updatedEntryLists.push([indexName, filteredEntries]); - } - if (deleteAffectedCacheEntries) { - for (const [indexName, filteredEntries] of updatedEntryLists) { - tblCache.queries.query[indexName] = filteredEntries; - } - } -} - -function dexieOpen(db) { - const state = db._state; - const { indexedDB } = db._deps; - if (state.isBeingOpened || db.idbdb) - return state.dbReadyPromise.then(() => state.dbOpenError ? - rejection(state.dbOpenError) : - db); - state.isBeingOpened = true; - state.dbOpenError = null; - state.openComplete = false; - const openCanceller = state.openCanceller; - let nativeVerToOpen = Math.round(db.verno * 10); - let schemaPatchMode = false; - function throwIfCancelled() { - if (state.openCanceller !== openCanceller) - throw new exceptions.DatabaseClosed('db.open() was cancelled'); - } - let resolveDbReady = state.dbReadyResolve, - upgradeTransaction = null, wasCreated = false; - const tryOpenDB = () => new DexiePromise((resolve, reject) => { - throwIfCancelled(); - if (!indexedDB) - throw new exceptions.MissingAPI(); - const dbName = db.name; - const req = state.autoSchema || !nativeVerToOpen ? - indexedDB.open(dbName) : - indexedDB.open(dbName, nativeVerToOpen); - if (!req) - throw new exceptions.MissingAPI(); - req.onerror = eventRejectHandler(reject); - req.onblocked = wrap(db._fireOnBlocked); - req.onupgradeneeded = wrap(e => { - upgradeTransaction = req.transaction; - if (state.autoSchema && !db._options.allowEmptyDB) { - req.onerror = preventDefault; - upgradeTransaction.abort(); - req.result.close(); - const delreq = indexedDB.deleteDatabase(dbName); - delreq.onsuccess = delreq.onerror = wrap(() => { - reject(new exceptions.NoSuchDatabase(`Database ${dbName} doesnt exist`)); - }); - } - else { - upgradeTransaction.onerror = eventRejectHandler(reject); - const oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; - wasCreated = oldVer < 1; - db.idbdb = req.result; - if (schemaPatchMode) { - patchCurrentVersion(db, upgradeTransaction); - } - runUpgraders(db, oldVer / 10, upgradeTransaction, reject); - } - }, reject); - req.onsuccess = wrap(() => { - upgradeTransaction = null; - const idbdb = db.idbdb = req.result; - const objectStoreNames = slice(idbdb.objectStoreNames); - if (objectStoreNames.length > 0) - try { - const tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly'); - if (state.autoSchema) - readGlobalSchema(db, idbdb, tmpTrans); - else { - adjustToExistingIndexNames(db, db._dbSchema, tmpTrans); - if (!verifyInstalledSchema(db, tmpTrans) && !schemaPatchMode) { - console.warn(`Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this.`); - idbdb.close(); - nativeVerToOpen = idbdb.version + 1; - schemaPatchMode = true; - return resolve(tryOpenDB()); - } - } - generateMiddlewareStacks(db, tmpTrans); - } - catch (e) { - } - connections.push(db); - idbdb.onversionchange = wrap(ev => { - state.vcFired = true; - db.on("versionchange").fire(ev); - }); - idbdb.onclose = wrap(ev => { - db.on("close").fire(ev); - }); - if (wasCreated) - _onDatabaseCreated(db._deps, dbName); - resolve(); - }, reject); - }).catch(err => { - switch (err?.name) { - case "UnknownError": - if (state.PR1398_maxLoop > 0) { - state.PR1398_maxLoop--; - console.warn('Dexie: Workaround for Chrome UnknownError on open()'); - return tryOpenDB(); - } - break; - case "VersionError": - if (nativeVerToOpen > 0) { - nativeVerToOpen = 0; - return tryOpenDB(); - } - break; - } - return DexiePromise.reject(err); - }); - return DexiePromise.race([ - openCanceller, - (typeof navigator === 'undefined' ? DexiePromise.resolve() : idbReady()).then(tryOpenDB) - ]).then(() => { - throwIfCancelled(); - state.onReadyBeingFired = []; - return DexiePromise.resolve(vip(() => db.on.ready.fire(db.vip))).then(function fireRemainders() { - if (state.onReadyBeingFired.length > 0) { - let remainders = state.onReadyBeingFired.reduce(promisableChain, nop); - state.onReadyBeingFired = []; - return DexiePromise.resolve(vip(() => remainders(db.vip))).then(fireRemainders); - } - }); - }).finally(() => { - if (state.openCanceller === openCanceller) { - state.onReadyBeingFired = null; - state.isBeingOpened = false; - } - }).catch(err => { - state.dbOpenError = err; - try { - upgradeTransaction && upgradeTransaction.abort(); - } - catch { } - if (openCanceller === state.openCanceller) { - db._close(); - } - return rejection(err); - }).finally(() => { - state.openComplete = true; - resolveDbReady(); - }).then(() => { - if (wasCreated) { - const everything = {}; - db.tables.forEach(table => { - table.schema.indexes.forEach(idx => { - if (idx.name) - everything[`idb://${db.name}/${table.name}/${idx.name}`] = new RangeSet(-Infinity, [[[]]]); - }); - everything[`idb://${db.name}/${table.name}/`] = everything[`idb://${db.name}/${table.name}/:dels`] = new RangeSet(-Infinity, [[[]]]); - }); - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME).fire(everything); - signalSubscribersNow(everything, true); - } - return db; - }); -} - -function awaitIterator(iterator) { - var callNext = result => iterator.next(result), doThrow = error => iterator.throw(error), onSuccess = step(callNext), onError = step(doThrow); - function step(getNext) { - return (val) => { - var next = getNext(val), value = next.value; - return next.done ? value : - (!value || typeof value.then !== 'function' ? - isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) : - value.then(onSuccess, onError)); - }; - } - return step(callNext)(); -} - -function extractTransactionArgs(mode, _tableArgs_, scopeFunc) { - var i = arguments.length; - if (i < 2) - throw new exceptions.InvalidArgument("Too few arguments"); - var args = new Array(i - 1); - while (--i) - args[i - 1] = arguments[i]; - scopeFunc = args.pop(); - var tables = flatten(args); - return [mode, tables, scopeFunc]; -} -function enterTransactionScope(db, mode, storeNames, parentTransaction, scopeFunc) { - return DexiePromise.resolve().then(() => { - const transless = PSD.transless || PSD; - const trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction); - trans.explicit = true; - const zoneProps = { - trans: trans, - transless: transless - }; - if (parentTransaction) { - trans.idbtrans = parentTransaction.idbtrans; - } - else { - try { - trans.create(); - trans.idbtrans._explicit = true; - db._state.PR1398_maxLoop = 3; - } - catch (ex) { - if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { - console.warn('Dexie: Need to reopen db'); - db.close({ disableAutoOpen: false }); - return db.open().then(() => enterTransactionScope(db, mode, storeNames, null, scopeFunc)); - } - return rejection(ex); - } - } - const scopeFuncIsAsync = isAsyncFunction(scopeFunc); - if (scopeFuncIsAsync) { - incrementExpectedAwaits(); - } - let returnValue; - const promiseFollowed = DexiePromise.follow(() => { - returnValue = scopeFunc.call(trans, trans); - if (returnValue) { - if (scopeFuncIsAsync) { - var decrementor = decrementExpectedAwaits.bind(null, null); - returnValue.then(decrementor, decrementor); - } - else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') { - returnValue = awaitIterator(returnValue); - } - } - }, zoneProps); - return (returnValue && typeof returnValue.then === 'function' ? - DexiePromise.resolve(returnValue).then(x => trans.active ? - x - : rejection(new exceptions.PrematureCommit("Transaction committed too early. See http://bit.ly/2kdckMn"))) - : promiseFollowed.then(() => returnValue)).then(x => { - if (parentTransaction) - trans._resolve(); - return trans._completion.then(() => x); - }).catch(e => { - trans._reject(e); - return rejection(e); - }); - }); -} - -function pad(a, value, count) { - const result = isArray(a) ? a.slice() : [a]; - for (let i = 0; i < count; ++i) - result.push(value); - return result; -} -function createVirtualIndexMiddleware(down) { - return { - ...down, - table(tableName) { - const table = down.table(tableName); - const { schema } = table; - const indexLookup = {}; - const allVirtualIndexes = []; - function addVirtualIndexes(keyPath, keyTail, lowLevelIndex) { - const keyPathAlias = getKeyPathAlias(keyPath); - const indexList = (indexLookup[keyPathAlias] = indexLookup[keyPathAlias] || []); - const keyLength = keyPath == null ? 0 : typeof keyPath === 'string' ? 1 : keyPath.length; - const isVirtual = keyTail > 0; - const virtualIndex = { - ...lowLevelIndex, - name: isVirtual - ? `${keyPathAlias}(virtual-from:${lowLevelIndex.name})` - : lowLevelIndex.name, - lowLevelIndex, - isVirtual, - keyTail, - keyLength, - extractKey: getKeyExtractor(keyPath), - unique: !isVirtual && lowLevelIndex.unique - }; - indexList.push(virtualIndex); - if (!virtualIndex.isPrimaryKey) { - allVirtualIndexes.push(virtualIndex); - } - if (keyLength > 1) { - const virtualKeyPath = keyLength === 2 ? - keyPath[0] : - keyPath.slice(0, keyLength - 1); - addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex); - } - indexList.sort((a, b) => a.keyTail - b.keyTail); - return virtualIndex; - } - const primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey); - indexLookup[":id"] = [primaryKey]; - for (const index of schema.indexes) { - addVirtualIndexes(index.keyPath, 0, index); - } - function findBestIndex(keyPath) { - const result = indexLookup[getKeyPathAlias(keyPath)]; - return result && result[0]; - } - function translateRange(range, keyTail) { - return { - type: range.type === 1 ? - 2 : - range.type, - lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail), - lowerOpen: true, - upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail), - upperOpen: true - }; - } - function translateRequest(req) { - const index = req.query.index; - return index.isVirtual ? { - ...req, - query: { - index: index.lowLevelIndex, - range: translateRange(req.query.range, index.keyTail) - } - } : req; - } - const result = { - ...table, - schema: { - ...schema, - primaryKey, - indexes: allVirtualIndexes, - getIndexByKeyPath: findBestIndex - }, - count(req) { - return table.count(translateRequest(req)); - }, - query(req) { - return table.query(translateRequest(req)); - }, - openCursor(req) { - const { keyTail, isVirtual, keyLength } = req.query.index; - if (!isVirtual) - return table.openCursor(req); - function createVirtualCursor(cursor) { - function _continue(key) { - key != null ? - cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) : - req.unique ? - cursor.continue(cursor.key.slice(0, keyLength) - .concat(req.reverse - ? down.MIN_KEY - : down.MAX_KEY, keyTail)) : - cursor.continue(); - } - const virtualCursor = Object.create(cursor, { - continue: { value: _continue }, - continuePrimaryKey: { - value(key, primaryKey) { - cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey); - } - }, - primaryKey: { - get() { - return cursor.primaryKey; - } - }, - key: { - get() { - const key = cursor.key; - return keyLength === 1 ? - key[0] : - key.slice(0, keyLength); - } - }, - value: { - get() { - return cursor.value; - } - } - }); - return virtualCursor; - } - return table.openCursor(translateRequest(req)) - .then(cursor => cursor && createVirtualCursor(cursor)); - } - }; - return result; - } - }; -} -const virtualIndexMiddleware = { - stack: "dbcore", - name: "VirtualIndexMiddleware", - level: 1, - create: createVirtualIndexMiddleware -}; - -function getObjectDiff(a, b, rv, prfx) { - rv = rv || {}; - prfx = prfx || ''; - keys(a).forEach((prop) => { - if (!hasOwn(b, prop)) { - rv[prfx + prop] = undefined; - } - else { - var ap = a[prop], bp = b[prop]; - if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) { - const apTypeName = toStringTag(ap); - const bpTypeName = toStringTag(bp); - if (apTypeName !== bpTypeName) { - rv[prfx + prop] = b[prop]; - } - else if (apTypeName === 'Object') { - getObjectDiff(ap, bp, rv, prfx + prop + '.'); - } - else if (ap !== bp) { - rv[prfx + prop] = b[prop]; - } - } - else if (ap !== bp) - rv[prfx + prop] = b[prop]; - } - }); - keys(b).forEach((prop) => { - if (!hasOwn(a, prop)) { - rv[prfx + prop] = b[prop]; - } - }); - return rv; -} - -function getEffectiveKeys(primaryKey, req) { - if (req.type === 'delete') - return req.keys; - return req.keys || req.values.map(primaryKey.extractKey); -} - -const hooksMiddleware = { - stack: "dbcore", - name: "HooksMiddleware", - level: 2, - create: (downCore) => ({ - ...downCore, - table(tableName) { - const downTable = downCore.table(tableName); - const { primaryKey } = downTable.schema; - const tableMiddleware = { - ...downTable, - mutate(req) { - const dxTrans = PSD.trans; - const { deleting, creating, updating } = dxTrans.table(tableName).hook; - switch (req.type) { - case 'add': - if (creating.fire === nop) - break; - return dxTrans._promise('readwrite', () => addPutOrDelete(req), true); - case 'put': - if (creating.fire === nop && updating.fire === nop) - break; - return dxTrans._promise('readwrite', () => addPutOrDelete(req), true); - case 'delete': - if (deleting.fire === nop) - break; - return dxTrans._promise('readwrite', () => addPutOrDelete(req), true); - case 'deleteRange': - if (deleting.fire === nop) - break; - return dxTrans._promise('readwrite', () => deleteRange(req), true); - } - return downTable.mutate(req); - function addPutOrDelete(req) { - const dxTrans = PSD.trans; - const keys = req.keys || getEffectiveKeys(primaryKey, req); - if (!keys) - throw new Error("Keys missing"); - req = req.type === 'add' || req.type === 'put' ? - { ...req, keys } : - { ...req }; - if (req.type !== 'delete') - req.values = [...req.values]; - if (req.keys) - req.keys = [...req.keys]; - return getExistingValues(downTable, req, keys).then(existingValues => { - const contexts = keys.map((key, i) => { - const existingValue = existingValues[i]; - const ctx = { onerror: null, onsuccess: null }; - if (req.type === 'delete') { - deleting.fire.call(ctx, key, existingValue, dxTrans); - } - else if (req.type === 'add' || existingValue === undefined) { - const generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans); - if (key == null && generatedPrimaryKey != null) { - key = generatedPrimaryKey; - req.keys[i] = key; - if (!primaryKey.outbound) { - setByKeyPath(req.values[i], primaryKey.keyPath, key); - } - } - } - else { - const objectDiff = getObjectDiff(existingValue, req.values[i]); - const additionalChanges = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans); - if (additionalChanges) { - const requestedValue = req.values[i]; - Object.keys(additionalChanges).forEach(keyPath => { - if (hasOwn(requestedValue, keyPath)) { - requestedValue[keyPath] = additionalChanges[keyPath]; - } - else { - setByKeyPath(requestedValue, keyPath, additionalChanges[keyPath]); - } - }); - } - } - return ctx; - }); - return downTable.mutate(req).then(({ failures, results, numFailures, lastResult }) => { - for (let i = 0; i < keys.length; ++i) { - const primKey = results ? results[i] : keys[i]; - const ctx = contexts[i]; - if (primKey == null) { - ctx.onerror && ctx.onerror(failures[i]); - } - else { - ctx.onsuccess && ctx.onsuccess(req.type === 'put' && existingValues[i] ? - req.values[i] : - primKey - ); - } - } - return { failures, results, numFailures, lastResult }; - }).catch(error => { - contexts.forEach(ctx => ctx.onerror && ctx.onerror(error)); - return Promise.reject(error); - }); - }); - } - function deleteRange(req) { - return deleteNextChunk(req.trans, req.range, 10000); - } - function deleteNextChunk(trans, range, limit) { - return downTable.query({ trans, values: false, query: { index: primaryKey, range }, limit }) - .then(({ result }) => { - return addPutOrDelete({ type: 'delete', keys: result, trans }).then(res => { - if (res.numFailures > 0) - return Promise.reject(res.failures[0]); - if (result.length < limit) { - return { failures: [], numFailures: 0, lastResult: undefined }; - } - else { - return deleteNextChunk(trans, { ...range, lower: result[result.length - 1], lowerOpen: true }, limit); - } - }); - }); - } - } - }; - return tableMiddleware; - }, - }) -}; -function getExistingValues(table, req, effectiveKeys) { - return req.type === "add" - ? Promise.resolve([]) - : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: "immutable" }); -} - -function getFromTransactionCache(keys, cache, clone) { - try { - if (!cache) - return null; - if (cache.keys.length < keys.length) - return null; - const result = []; - for (let i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) { - if (cmp(cache.keys[i], keys[j]) !== 0) - continue; - result.push(clone ? deepClone(cache.values[i]) : cache.values[i]); - ++j; - } - return result.length === keys.length ? result : null; - } - catch { - return null; - } -} -const cacheExistingValuesMiddleware = { - stack: "dbcore", - level: -1, - create: (core) => { - return { - table: (tableName) => { - const table = core.table(tableName); - return { - ...table, - getMany: (req) => { - if (!req.cache) { - return table.getMany(req); - } - const cachedResult = getFromTransactionCache(req.keys, req.trans["_cache"], req.cache === "clone"); - if (cachedResult) { - return DexiePromise.resolve(cachedResult); - } - return table.getMany(req).then((res) => { - req.trans["_cache"] = { - keys: req.keys, - values: req.cache === "clone" ? deepClone(res) : res, - }; - return res; - }); - }, - mutate: (req) => { - if (req.type !== "add") - req.trans["_cache"] = null; - return table.mutate(req); - }, - }; - }, - }; - }, -}; - -function isCachableContext(ctx, table) { - return (ctx.trans.mode === 'readonly' && - !!ctx.subscr && - !ctx.trans.explicit && - ctx.trans.db._options.cache !== 'disabled' && - !table.schema.primaryKey.outbound); -} - -function isCachableRequest(type, req) { - switch (type) { - case 'query': - return req.values && !req.unique; - case 'get': - return false; - case 'getMany': - return false; - case 'count': - return false; - case 'openCursor': - return false; - } -} - -const observabilityMiddleware = { - stack: "dbcore", - level: 0, - name: "Observability", - create: (core) => { - const dbName = core.schema.name; - const FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY); - return { - ...core, - transaction: (stores, mode, options) => { - if (PSD.subscr && mode !== 'readonly') { - throw new exceptions.ReadOnly(`Readwrite transaction in liveQuery context. Querier source: ${PSD.querier}`); - } - return core.transaction(stores, mode, options); - }, - table: (tableName) => { - const table = core.table(tableName); - const { schema } = table; - const { primaryKey, indexes } = schema; - const { extractKey, outbound } = primaryKey; - const indexesWithAutoIncPK = primaryKey.autoIncrement && indexes.filter((index) => index.compound && index.keyPath.includes(primaryKey.keyPath)); - const tableClone = { - ...table, - mutate: (req) => { - const trans = req.trans; - const mutatedParts = req.mutatedParts || (req.mutatedParts = {}); - const getRangeSet = (indexName) => { - const part = `idb://${dbName}/${tableName}/${indexName}`; - return (mutatedParts[part] || - (mutatedParts[part] = new RangeSet())); - }; - const pkRangeSet = getRangeSet(""); - const delsRangeSet = getRangeSet(":dels"); - const { type } = req; - let [keys, newObjs] = req.type === "deleteRange" - ? [req.range] - : req.type === "delete" - ? [req.keys] - : req.values.length < 50 - ? [getEffectiveKeys(primaryKey, req).filter(id => id), req.values] - : []; - const oldCache = req.trans["_cache"]; - if (isArray(keys)) { - pkRangeSet.addKeys(keys); - const oldObjs = type === 'delete' || keys.length === newObjs.length ? getFromTransactionCache(keys, oldCache) : null; - if (!oldObjs) { - delsRangeSet.addKeys(keys); - } - if (oldObjs || newObjs) { - trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs); - } - } - else if (keys) { - const range = { from: keys.lower, to: keys.upper }; - delsRangeSet.add(range); - pkRangeSet.add(range); - } - else { - pkRangeSet.add(FULL_RANGE); - delsRangeSet.add(FULL_RANGE); - schema.indexes.forEach(idx => getRangeSet(idx.name).add(FULL_RANGE)); - } - return table.mutate(req).then((res) => { - if (keys && (req.type === 'add' || req.type === 'put')) { - pkRangeSet.addKeys(res.results); - if (indexesWithAutoIncPK) { - indexesWithAutoIncPK.forEach(idx => { - const idxVals = req.values.map(v => idx.extractKey(v)); - const pkPos = idx.keyPath.findIndex(prop => prop === primaryKey.keyPath); - res.results.forEach(pk => idxVals[pkPos] = pk); - getRangeSet(idx.name).addKeys(idxVals); - }); - } - } - trans.mutatedParts = extendObservabilitySet(trans.mutatedParts || {}, mutatedParts); - return res; - }); - }, - }; - const getRange = ({ query: { index, range }, }) => [ - index, - new RangeSet(range.lower ?? core.MIN_KEY, range.upper ?? core.MAX_KEY), - ]; - const readSubscribers = { - get: (req) => [primaryKey, new RangeSet(req.key)], - getMany: (req) => [primaryKey, new RangeSet().addKeys(req.keys)], - count: getRange, - query: getRange, - openCursor: getRange, - }; - keys(readSubscribers).forEach((method) => { - tableClone[method] = function (req) { - const { subscr } = PSD; - const isLiveQuery = !!subscr; - let cachable = isCachableContext(PSD, table) && isCachableRequest(method, req); - const obsSet = cachable - ? req.obsSet = {} - : subscr; - if (isLiveQuery) { - const getRangeSet = (indexName) => { - const part = `idb://${dbName}/${tableName}/${indexName}`; - return (obsSet[part] || - (obsSet[part] = new RangeSet())); - }; - const pkRangeSet = getRangeSet(""); - const delsRangeSet = getRangeSet(":dels"); - const [queriedIndex, queriedRanges] = readSubscribers[method](req); - if (method === 'query' && queriedIndex.isPrimaryKey && !req.values) { - delsRangeSet.add(queriedRanges); - } - else { - getRangeSet(queriedIndex.name || "").add(queriedRanges); - } - if (!queriedIndex.isPrimaryKey) { - if (method === "count") { - delsRangeSet.add(FULL_RANGE); - } - else { - const keysPromise = method === "query" && - outbound && - req.values && - table.query({ - ...req, - values: false, - }); - return table[method].apply(this, arguments).then((res) => { - if (method === "query") { - if (outbound && req.values) { - return keysPromise.then(({ result: resultingKeys }) => { - pkRangeSet.addKeys(resultingKeys); - return res; - }); - } - const pKeys = req.values - ? res.result.map(extractKey) - : res.result; - if (req.values) { - pkRangeSet.addKeys(pKeys); - } - else { - delsRangeSet.addKeys(pKeys); - } - } - else if (method === "openCursor") { - const cursor = res; - const wantValues = req.values; - return (cursor && - Object.create(cursor, { - key: { - get() { - delsRangeSet.addKey(cursor.primaryKey); - return cursor.key; - }, - }, - primaryKey: { - get() { - const pkey = cursor.primaryKey; - delsRangeSet.addKey(pkey); - return pkey; - }, - }, - value: { - get() { - wantValues && pkRangeSet.addKey(cursor.primaryKey); - return cursor.value; - }, - }, - })); - } - return res; - }); - } - } - } - return table[method].apply(this, arguments); - }; - }); - return tableClone; - }, - }; - }, -}; -function trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs) { - function addAffectedIndex(ix) { - const rangeSet = getRangeSet(ix.name || ""); - function extractKey(obj) { - return obj != null ? ix.extractKey(obj) : null; - } - const addKeyOrKeys = (key) => ix.multiEntry && isArray(key) - ? key.forEach(key => rangeSet.addKey(key)) - : rangeSet.addKey(key); - (oldObjs || newObjs).forEach((_, i) => { - const oldKey = oldObjs && extractKey(oldObjs[i]); - const newKey = newObjs && extractKey(newObjs[i]); - if (cmp(oldKey, newKey) !== 0) { - if (oldKey != null) - addKeyOrKeys(oldKey); - if (newKey != null) - addKeyOrKeys(newKey); - } - }); - } - schema.indexes.forEach(addAffectedIndex); -} - -function adjustOptimisticFromFailures(tblCache, req, res) { - if (res.numFailures === 0) - return req; - if (req.type === 'deleteRange') { - return null; - } - const numBulkOps = req.keys - ? req.keys.length - : 'values' in req && req.values - ? req.values.length - : 1; - if (res.numFailures === numBulkOps) { - return null; - } - const clone = { ...req }; - if (isArray(clone.keys)) { - clone.keys = clone.keys.filter((_, i) => !(i in res.failures)); - } - if ('values' in clone && isArray(clone.values)) { - clone.values = clone.values.filter((_, i) => !(i in res.failures)); - } - return clone; -} - -function isAboveLower(key, range) { - return range.lower === undefined - ? true - : range.lowerOpen - ? cmp(key, range.lower) > 0 - : cmp(key, range.lower) >= 0; -} -function isBelowUpper(key, range) { - return range.upper === undefined - ? true - : range.upperOpen - ? cmp(key, range.upper) < 0 - : cmp(key, range.upper) <= 0; -} -function isWithinRange(key, range) { - return isAboveLower(key, range) && isBelowUpper(key, range); -} - -function applyOptimisticOps(result, req, ops, table, cacheEntry, immutable) { - if (!ops || ops.length === 0) - return result; - const index = req.query.index; - const { multiEntry } = index; - const queryRange = req.query.range; - const primaryKey = table.schema.primaryKey; - const extractPrimKey = primaryKey.extractKey; - const extractIndex = index.extractKey; - const extractLowLevelIndex = (index.lowLevelIndex || index).extractKey; - let finalResult = ops.reduce((result, op) => { - let modifedResult = result; - const includedValues = op.type === 'add' || op.type === 'put' - ? op.values.filter((v) => { - const key = extractIndex(v); - return multiEntry && isArray(key) - ? key.some((k) => isWithinRange(k, queryRange)) - : isWithinRange(key, queryRange); - }).map(v => { - v = deepClone(v); - if (immutable) - Object.freeze(v); - return v; - }) - : []; - switch (op.type) { - case 'add': - modifedResult = result.concat(req.values - ? includedValues - : includedValues.map((v) => extractPrimKey(v))); - break; - case 'put': - const keySet = new RangeSet().addKeys(op.values.map((v) => extractPrimKey(v))); - modifedResult = result - .filter((item) => { - const key = req.values ? extractPrimKey(item) : item; - return !rangesOverlap(new RangeSet(key), keySet); - }) - .concat(req.values - ? includedValues - : includedValues.map((v) => extractPrimKey(v))); - break; - case 'delete': - const keysToDelete = new RangeSet().addKeys(op.keys); - modifedResult = result.filter((item) => { - const key = req.values ? extractPrimKey(item) : item; - return !rangesOverlap(new RangeSet(key), keysToDelete); - }); - break; - case 'deleteRange': - const range = op.range; - modifedResult = result.filter((item) => !isWithinRange(extractPrimKey(item), range)); - break; - } - return modifedResult; - }, result); - if (finalResult === result) - return result; - finalResult.sort((a, b) => cmp(extractLowLevelIndex(a), extractLowLevelIndex(b)) || - cmp(extractPrimKey(a), extractPrimKey(b))); - if (req.limit && req.limit < Infinity) { - if (finalResult.length > req.limit) { - finalResult.length = req.limit; - } - else if (result.length === req.limit && finalResult.length < req.limit) { - cacheEntry.dirty = true; - } - } - return immutable ? Object.freeze(finalResult) : finalResult; -} - -function areRangesEqual(r1, r2) { - return (cmp(r1.lower, r2.lower) === 0 && - cmp(r1.upper, r2.upper) === 0 && - !!r1.lowerOpen === !!r2.lowerOpen && - !!r1.upperOpen === !!r2.upperOpen); -} - -function compareLowers(lower1, lower2, lowerOpen1, lowerOpen2) { - if (lower1 === undefined) - return lower2 !== undefined ? -1 : 0; - if (lower2 === undefined) - return 1; - const c = cmp(lower1, lower2); - if (c === 0) { - if (lowerOpen1 && lowerOpen2) - return 0; - if (lowerOpen1) - return 1; - if (lowerOpen2) - return -1; - } - return c; -} -function compareUppers(upper1, upper2, upperOpen1, upperOpen2) { - if (upper1 === undefined) - return upper2 !== undefined ? 1 : 0; - if (upper2 === undefined) - return -1; - const c = cmp(upper1, upper2); - if (c === 0) { - if (upperOpen1 && upperOpen2) - return 0; - if (upperOpen1) - return -1; - if (upperOpen2) - return 1; - } - return c; -} -function isSuperRange(r1, r2) { - return (compareLowers(r1.lower, r2.lower, r1.lowerOpen, r2.lowerOpen) <= 0 && - compareUppers(r1.upper, r2.upper, r1.upperOpen, r2.upperOpen) >= 0); -} - -function findCompatibleQuery(dbName, tableName, type, req) { - const tblCache = cache[`idb://${dbName}/${tableName}`]; - if (!tblCache) - return []; - const queries = tblCache.queries[type]; - if (!queries) - return [null, false, tblCache, null]; - const indexName = req.query ? req.query.index.name : null; - const entries = queries[indexName || '']; - if (!entries) - return [null, false, tblCache, null]; - switch (type) { - case 'query': - const equalEntry = entries.find((entry) => entry.req.limit === req.limit && - entry.req.values === req.values && - areRangesEqual(entry.req.query.range, req.query.range)); - if (equalEntry) - return [ - equalEntry, - true, - tblCache, - entries, - ]; - const superEntry = entries.find((entry) => { - const limit = 'limit' in entry.req ? entry.req.limit : Infinity; - return (limit >= req.limit && - (req.values ? entry.req.values : true) && - isSuperRange(entry.req.query.range, req.query.range)); - }); - return [superEntry, false, tblCache, entries]; - case 'count': - const countQuery = entries.find((entry) => areRangesEqual(entry.req.query.range, req.query.range)); - return [countQuery, !!countQuery, tblCache, entries]; - } -} - -function subscribeToCacheEntry(cacheEntry, container, requery, signal) { - cacheEntry.subscribers.add(requery); - signal.addEventListener("abort", () => { - cacheEntry.subscribers.delete(requery); - if (cacheEntry.subscribers.size === 0) { - enqueForDeletion(cacheEntry, container); - } - }); -} -function enqueForDeletion(cacheEntry, container) { - setTimeout(() => { - if (cacheEntry.subscribers.size === 0) { - delArrayItem(container, cacheEntry); - } - }, 3000); -} - -const cacheMiddleware = { - stack: 'dbcore', - level: 0, - name: 'Cache', - create: (core) => { - const dbName = core.schema.name; - const coreMW = { - ...core, - transaction: (stores, mode, options) => { - const idbtrans = core.transaction(stores, mode, options); - if (mode === 'readwrite') { - const ac = new AbortController(); - const { signal } = ac; - const endTransaction = (wasCommitted) => () => { - ac.abort(); - if (mode === 'readwrite') { - const affectedSubscribers = new Set(); - for (const storeName of stores) { - const tblCache = cache[`idb://${dbName}/${storeName}`]; - if (tblCache) { - const table = core.table(storeName); - const ops = tblCache.optimisticOps.filter((op) => op.trans === idbtrans); - if (idbtrans._explicit && wasCommitted && idbtrans.mutatedParts) { - for (const entries of Object.values(tblCache.queries.query)) { - for (const entry of entries.slice()) { - if (obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)) { - delArrayItem(entries, entry); - entry.subscribers.forEach((requery) => affectedSubscribers.add(requery)); - } - } - } - } - else if (ops.length > 0) { - tblCache.optimisticOps = tblCache.optimisticOps.filter((op) => op.trans !== idbtrans); - for (const entries of Object.values(tblCache.queries.query)) { - for (const entry of entries.slice()) { - if (entry.res != null && - idbtrans.mutatedParts -) { - if (wasCommitted && !entry.dirty) { - const freezeResults = Object.isFrozen(entry.res); - const modRes = applyOptimisticOps(entry.res, entry.req, ops, table, entry, freezeResults); - if (entry.dirty) { - delArrayItem(entries, entry); - entry.subscribers.forEach((requery) => affectedSubscribers.add(requery)); - } - else if (modRes !== entry.res) { - entry.res = modRes; - entry.promise = DexiePromise.resolve({ result: modRes }); - } - } - else { - if (entry.dirty) { - delArrayItem(entries, entry); - } - entry.subscribers.forEach((requery) => affectedSubscribers.add(requery)); - } - } - } - } - } - } - } - affectedSubscribers.forEach((requery) => requery()); - } - }; - idbtrans.addEventListener('abort', endTransaction(false), { - signal, - }); - idbtrans.addEventListener('error', endTransaction(false), { - signal, - }); - idbtrans.addEventListener('complete', endTransaction(true), { - signal, - }); - } - return idbtrans; - }, - table(tableName) { - const downTable = core.table(tableName); - const primKey = downTable.schema.primaryKey; - const tableMW = { - ...downTable, - mutate(req) { - const trans = PSD.trans; - if (primKey.outbound || - trans.db._options.cache === 'disabled' || - trans.explicit - ) { - return downTable.mutate(req); - } - const tblCache = cache[`idb://${dbName}/${tableName}`]; - if (!tblCache) - return downTable.mutate(req); - const promise = downTable.mutate(req); - if ((req.type === 'add' || req.type === 'put') && (req.values.length >= 50 || getEffectiveKeys(primKey, req).some(key => key == null))) { - promise.then((res) => { - const reqWithResolvedKeys = { - ...req, - values: req.values.map((value, i) => { - const valueWithKey = primKey.keyPath?.includes('.') - ? deepClone(value) - : { - ...value, - }; - setByKeyPath(valueWithKey, primKey.keyPath, res.results[i]); - return valueWithKey; - }) - }; - const adjustedReq = adjustOptimisticFromFailures(tblCache, reqWithResolvedKeys, res); - tblCache.optimisticOps.push(adjustedReq); - queueMicrotask(() => req.mutatedParts && signalSubscribersLazily(req.mutatedParts)); - }); - } - else { - tblCache.optimisticOps.push(req); - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - promise.then((res) => { - if (res.numFailures > 0) { - delArrayItem(tblCache.optimisticOps, req); - const adjustedReq = adjustOptimisticFromFailures(tblCache, req, res); - if (adjustedReq) { - tblCache.optimisticOps.push(adjustedReq); - } - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - } - }); - promise.catch(() => { - delArrayItem(tblCache.optimisticOps, req); - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - }); - } - return promise; - }, - query(req) { - if (!isCachableContext(PSD, downTable) || !isCachableRequest("query", req)) - return downTable.query(req); - const freezeResults = PSD.trans?.db._options.cache === 'immutable'; - const { requery, signal } = PSD; - let [cacheEntry, exactMatch, tblCache, container] = findCompatibleQuery(dbName, tableName, 'query', req); - if (cacheEntry && exactMatch) { - cacheEntry.obsSet = req.obsSet; - } - else { - const promise = downTable.query(req).then((res) => { - const result = res.result; - if (cacheEntry) - cacheEntry.res = result; - if (freezeResults) { - for (let i = 0, l = result.length; i < l; ++i) { - Object.freeze(result[i]); - } - Object.freeze(result); - } - else { - res.result = deepClone(result); - } - return res; - }).catch(error => { - if (container && cacheEntry) - delArrayItem(container, cacheEntry); - return Promise.reject(error); - }); - cacheEntry = { - obsSet: req.obsSet, - promise, - subscribers: new Set(), - type: 'query', - req, - dirty: false, - }; - if (container) { - container.push(cacheEntry); - } - else { - container = [cacheEntry]; - if (!tblCache) { - tblCache = cache[`idb://${dbName}/${tableName}`] = { - queries: { - query: {}, - count: {}, - }, - objs: new Map(), - optimisticOps: [], - unsignaledParts: {} - }; - } - tblCache.queries.query[req.query.index.name || ''] = container; - } - } - subscribeToCacheEntry(cacheEntry, container, requery, signal); - return cacheEntry.promise.then((res) => { - return { - result: applyOptimisticOps(res.result, req, tblCache?.optimisticOps, downTable, cacheEntry, freezeResults), - }; - }); - }, - }; - return tableMW; - }, - }; - return coreMW; - }, -}; - -function vipify(target, vipDb) { - return new Proxy(target, { - get(target, prop, receiver) { - if (prop === 'db') - return vipDb; - return Reflect.get(target, prop, receiver); - } - }); -} - -class Dexie$1 { - constructor(name, options) { - this._middlewares = {}; - this.verno = 0; - const deps = Dexie$1.dependencies; - this._options = options = { - addons: Dexie$1.addons, - autoOpen: true, - indexedDB: deps.indexedDB, - IDBKeyRange: deps.IDBKeyRange, - cache: 'cloned', - ...options - }; - this._deps = { - indexedDB: options.indexedDB, - IDBKeyRange: options.IDBKeyRange - }; - const { addons, } = options; - this._dbSchema = {}; - this._versions = []; - this._storeNames = []; - this._allTables = {}; - this.idbdb = null; - this._novip = this; - const state = { - dbOpenError: null, - isBeingOpened: false, - onReadyBeingFired: null, - openComplete: false, - dbReadyResolve: nop, - dbReadyPromise: null, - cancelOpen: nop, - openCanceller: null, - autoSchema: true, - PR1398_maxLoop: 3, - autoOpen: options.autoOpen, - }; - state.dbReadyPromise = new DexiePromise(resolve => { - state.dbReadyResolve = resolve; - }); - state.openCanceller = new DexiePromise((_, reject) => { - state.cancelOpen = reject; - }); - this._state = state; - this.name = name; - this.on = Events(this, "populate", "blocked", "versionchange", "close", { ready: [promisableChain, nop] }); - this.on.ready.subscribe = override(this.on.ready.subscribe, subscribe => { - return (subscriber, bSticky) => { - Dexie$1.vip(() => { - const state = this._state; - if (state.openComplete) { - if (!state.dbOpenError) - DexiePromise.resolve().then(subscriber); - if (bSticky) - subscribe(subscriber); - } - else if (state.onReadyBeingFired) { - state.onReadyBeingFired.push(subscriber); - if (bSticky) - subscribe(subscriber); - } - else { - subscribe(subscriber); - const db = this; - if (!bSticky) - subscribe(function unsubscribe() { - db.on.ready.unsubscribe(subscriber); - db.on.ready.unsubscribe(unsubscribe); - }); - } - }); - }; - }); - this.Collection = createCollectionConstructor(this); - this.Table = createTableConstructor(this); - this.Transaction = createTransactionConstructor(this); - this.Version = createVersionConstructor(this); - this.WhereClause = createWhereClauseConstructor(this); - this.on("versionchange", ev => { - if (ev.newVersion > 0) - console.warn(`Another connection wants to upgrade database '${this.name}'. Closing db now to resume the upgrade.`); - else - console.warn(`Another connection wants to delete database '${this.name}'. Closing db now to resume the delete request.`); - this.close({ disableAutoOpen: false }); - }); - this.on("blocked", ev => { - if (!ev.newVersion || ev.newVersion < ev.oldVersion) - console.warn(`Dexie.delete('${this.name}') was blocked`); - else - console.warn(`Upgrade '${this.name}' blocked by other connection holding version ${ev.oldVersion / 10}`); - }); - this._maxKey = getMaxKey(options.IDBKeyRange); - this._createTransaction = (mode, storeNames, dbschema, parentTransaction) => new this.Transaction(mode, storeNames, dbschema, this._options.chromeTransactionDurability, parentTransaction); - this._fireOnBlocked = ev => { - this.on("blocked").fire(ev); - connections - .filter(c => c.name === this.name && c !== this && !c._state.vcFired) - .map(c => c.on("versionchange").fire(ev)); - }; - this.use(cacheExistingValuesMiddleware); - this.use(cacheMiddleware); - this.use(observabilityMiddleware); - this.use(virtualIndexMiddleware); - this.use(hooksMiddleware); - const vipDB = new Proxy(this, { - get: (_, prop, receiver) => { - if (prop === '_vip') - return true; - if (prop === 'table') - return (tableName) => vipify(this.table(tableName), vipDB); - const rv = Reflect.get(_, prop, receiver); - if (rv instanceof Table) - return vipify(rv, vipDB); - if (prop === 'tables') - return rv.map(t => vipify(t, vipDB)); - if (prop === '_createTransaction') - return function () { - const tx = rv.apply(this, arguments); - return vipify(tx, vipDB); - }; - return rv; - } - }); - this.vip = vipDB; - addons.forEach(addon => addon(this)); - } - version(versionNumber) { - if (isNaN(versionNumber) || versionNumber < 0.1) - throw new exceptions.Type(`Given version is not a positive number`); - versionNumber = Math.round(versionNumber * 10) / 10; - if (this.idbdb || this._state.isBeingOpened) - throw new exceptions.Schema("Cannot add version when database is open"); - this.verno = Math.max(this.verno, versionNumber); - const versions = this._versions; - var versionInstance = versions.filter(v => v._cfg.version === versionNumber)[0]; - if (versionInstance) - return versionInstance; - versionInstance = new this.Version(versionNumber); - versions.push(versionInstance); - versions.sort(lowerVersionFirst); - versionInstance.stores({}); - this._state.autoSchema = false; - return versionInstance; - } - _whenReady(fn) { - return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new DexiePromise((resolve, reject) => { - if (this._state.openComplete) { - return reject(new exceptions.DatabaseClosed(this._state.dbOpenError)); - } - if (!this._state.isBeingOpened) { - if (!this._state.autoOpen) { - reject(new exceptions.DatabaseClosed()); - return; - } - this.open().catch(nop); - } - this._state.dbReadyPromise.then(resolve, reject); - }).then(fn); - } - use({ stack, create, level, name }) { - if (name) - this.unuse({ stack, name }); - const middlewares = this._middlewares[stack] || (this._middlewares[stack] = []); - middlewares.push({ stack, create, level: level == null ? 10 : level, name }); - middlewares.sort((a, b) => a.level - b.level); - return this; - } - unuse({ stack, name, create }) { - if (stack && this._middlewares[stack]) { - this._middlewares[stack] = this._middlewares[stack].filter(mw => create ? mw.create !== create : - name ? mw.name !== name : - false); - } - return this; - } - open() { - return usePSD(globalPSD, - () => dexieOpen(this)); - } - _close() { - const state = this._state; - const idx = connections.indexOf(this); - if (idx >= 0) - connections.splice(idx, 1); - if (this.idbdb) { - try { - this.idbdb.close(); - } - catch (e) { } - this.idbdb = null; - } - if (!state.isBeingOpened) { - state.dbReadyPromise = new DexiePromise(resolve => { - state.dbReadyResolve = resolve; - }); - state.openCanceller = new DexiePromise((_, reject) => { - state.cancelOpen = reject; - }); - } - } - close({ disableAutoOpen } = { disableAutoOpen: true }) { - const state = this._state; - if (disableAutoOpen) { - if (state.isBeingOpened) { - state.cancelOpen(new exceptions.DatabaseClosed()); - } - this._close(); - state.autoOpen = false; - state.dbOpenError = new exceptions.DatabaseClosed(); - } - else { - this._close(); - state.autoOpen = this._options.autoOpen || - state.isBeingOpened; - state.openComplete = false; - state.dbOpenError = null; - } - } - delete(closeOptions = { disableAutoOpen: true }) { - const hasInvalidArguments = arguments.length > 0 && typeof arguments[0] !== 'object'; - const state = this._state; - return new DexiePromise((resolve, reject) => { - const doDelete = () => { - this.close(closeOptions); - var req = this._deps.indexedDB.deleteDatabase(this.name); - req.onsuccess = wrap(() => { - _onDatabaseDeleted(this._deps, this.name); - resolve(); - }); - req.onerror = eventRejectHandler(reject); - req.onblocked = this._fireOnBlocked; - }; - if (hasInvalidArguments) - throw new exceptions.InvalidArgument("Invalid closeOptions argument to db.delete()"); - if (state.isBeingOpened) { - state.dbReadyPromise.then(doDelete); - } - else { - doDelete(); - } - }); - } - backendDB() { - return this.idbdb; - } - isOpen() { - return this.idbdb !== null; - } - hasBeenClosed() { - const dbOpenError = this._state.dbOpenError; - return dbOpenError && (dbOpenError.name === 'DatabaseClosed'); - } - hasFailed() { - return this._state.dbOpenError !== null; - } - dynamicallyOpened() { - return this._state.autoSchema; - } - get tables() { - return keys(this._allTables).map(name => this._allTables[name]); - } - transaction() { - const args = extractTransactionArgs.apply(this, arguments); - return this._transaction.apply(this, args); - } - _transaction(mode, tables, scopeFunc) { - let parentTransaction = PSD.trans; - if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) - parentTransaction = null; - const onlyIfCompatible = mode.indexOf('?') !== -1; - mode = mode.replace('!', '').replace('?', ''); - let idbMode, storeNames; - try { - storeNames = tables.map(table => { - var storeName = table instanceof this.Table ? table.name : table; - if (typeof storeName !== 'string') - throw new TypeError("Invalid table argument to Dexie.transaction(). Only Table or String are allowed"); - return storeName; - }); - if (mode == "r" || mode === READONLY) - idbMode = READONLY; - else if (mode == "rw" || mode == READWRITE) - idbMode = READWRITE; - else - throw new exceptions.InvalidArgument("Invalid transaction mode: " + mode); - if (parentTransaction) { - if (parentTransaction.mode === READONLY && idbMode === READWRITE) { - if (onlyIfCompatible) { - parentTransaction = null; - } - else - throw new exceptions.SubTransaction("Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY"); - } - if (parentTransaction) { - storeNames.forEach(storeName => { - if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) { - if (onlyIfCompatible) { - parentTransaction = null; - } - else - throw new exceptions.SubTransaction("Table " + storeName + - " not included in parent transaction."); - } - }); - } - if (onlyIfCompatible && parentTransaction && !parentTransaction.active) { - parentTransaction = null; - } - } - } - catch (e) { - return parentTransaction ? - parentTransaction._promise(null, (_, reject) => { reject(e); }) : - rejection(e); - } - const enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc); - return (parentTransaction ? - parentTransaction._promise(idbMode, enterTransaction, "lock") : - PSD.trans ? - usePSD(PSD.transless, () => this._whenReady(enterTransaction)) : - this._whenReady(enterTransaction)); - } - table(tableName) { - if (!hasOwn(this._allTables, tableName)) { - throw new exceptions.InvalidTable(`Table ${tableName} does not exist`); - } - return this._allTables[tableName]; - } -} - -const symbolObservable = typeof Symbol !== "undefined" && "observable" in Symbol - ? Symbol.observable - : "@@observable"; -class Observable { - constructor(subscribe) { - this._subscribe = subscribe; - } - subscribe(x, error, complete) { - return this._subscribe(!x || typeof x === "function" ? { next: x, error, complete } : x); - } - [symbolObservable]() { - return this; - } -} - -let domDeps; -try { - domDeps = { - indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB, - IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange - }; -} -catch (e) { - domDeps = { indexedDB: null, IDBKeyRange: null }; -} - -function liveQuery(querier) { - let hasValue = false; - let currentValue; - const observable = new Observable((observer) => { - const scopeFuncIsAsync = isAsyncFunction(querier); - function execute(ctx) { - const wasRootExec = beginMicroTickScope(); - try { - if (scopeFuncIsAsync) { - incrementExpectedAwaits(); - } - let rv = newScope(querier, ctx); - if (scopeFuncIsAsync) { - rv = rv.finally(decrementExpectedAwaits); - } - return rv; - } - finally { - wasRootExec && endMicroTickScope(); - } - } - let closed = false; - let abortController; - let accumMuts = {}; - let currentObs = {}; - const subscription = { - get closed() { - return closed; - }, - unsubscribe: () => { - if (closed) - return; - closed = true; - if (abortController) - abortController.abort(); - if (startedListening) - globalEvents.storagemutated.unsubscribe(mutationListener); - }, - }; - observer.start && observer.start(subscription); - let startedListening = false; - const doQuery = () => execInGlobalContext(_doQuery); - function shouldNotify() { - return obsSetsOverlap(currentObs, accumMuts); - } - const mutationListener = (parts) => { - extendObservabilitySet(accumMuts, parts); - if (shouldNotify()) { - doQuery(); - } - }; - const _doQuery = () => { - if (closed || - !domDeps.indexedDB) - { - return; - } - accumMuts = {}; - const subscr = {}; - if (abortController) - abortController.abort(); - abortController = new AbortController(); - const ctx = { - subscr, - signal: abortController.signal, - requery: doQuery, - querier, - trans: null - }; - const ret = execute(ctx); - Promise.resolve(ret).then((result) => { - hasValue = true; - currentValue = result; - if (closed || ctx.signal.aborted) { - return; - } - accumMuts = {}; - currentObs = subscr; - if (!objectIsEmpty(currentObs) && !startedListening) { - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener); - startedListening = true; - } - execInGlobalContext(() => !closed && observer.next && observer.next(result)); - }, (err) => { - hasValue = false; - if (!['DatabaseClosedError', 'AbortError'].includes(err?.name)) { - if (!closed) - execInGlobalContext(() => { - if (closed) - return; - observer.error && observer.error(err); - }); - } - }); - }; - setTimeout(doQuery, 0); - return subscription; - }); - observable.hasValue = () => hasValue; - observable.getValue = () => currentValue; - return observable; -} - -const Dexie = Dexie$1; -props(Dexie, { - ...fullNameExceptions, - delete(databaseName) { - const db = new Dexie(databaseName, { addons: [] }); - return db.delete(); - }, - exists(name) { - return new Dexie(name, { addons: [] }).open().then(db => { - db.close(); - return true; - }).catch('NoSuchDatabaseError', () => false); - }, - getDatabaseNames(cb) { - try { - return getDatabaseNames(Dexie.dependencies).then(cb); - } - catch { - return rejection(new exceptions.MissingAPI()); - } - }, - defineClass() { - function Class(content) { - extend(this, content); - } - return Class; - }, - ignoreTransaction(scopeFunc) { - return PSD.trans ? - usePSD(PSD.transless, scopeFunc) : - scopeFunc(); - }, - vip, - async: function (generatorFn) { - return function () { - try { - var rv = awaitIterator(generatorFn.apply(this, arguments)); - if (!rv || typeof rv.then !== 'function') - return DexiePromise.resolve(rv); - return rv; - } - catch (e) { - return rejection(e); - } - }; - }, - spawn: function (generatorFn, args, thiz) { - try { - var rv = awaitIterator(generatorFn.apply(thiz, args || [])); - if (!rv || typeof rv.then !== 'function') - return DexiePromise.resolve(rv); - return rv; - } - catch (e) { - return rejection(e); - } - }, - currentTransaction: { - get: () => PSD.trans || null - }, - waitFor: function (promiseOrFunction, optionalTimeout) { - const promise = DexiePromise.resolve(typeof promiseOrFunction === 'function' ? - Dexie.ignoreTransaction(promiseOrFunction) : - promiseOrFunction) - .timeout(optionalTimeout || 60000); - return PSD.trans ? - PSD.trans.waitFor(promise) : - promise; - }, - Promise: DexiePromise, - debug: { - get: () => debug, - set: value => { - setDebug(value); - } - }, - derive: derive, - extend: extend, - props: props, - override: override, - Events: Events, - on: globalEvents, - liveQuery, - extendObservabilitySet, - getByKeyPath: getByKeyPath, - setByKeyPath: setByKeyPath, - delByKeyPath: delByKeyPath, - shallowClone: shallowClone, - deepClone: deepClone, - getObjectDiff: getObjectDiff, - cmp, - asap: asap$1, - minKey: minKey, - addons: [], - connections: connections, - errnames: errnames, - dependencies: domDeps, - cache, - semVer: DEXIE_VERSION, - version: DEXIE_VERSION.split('.') - .map(n => parseInt(n)) - .reduce((p, c, i) => p + (c / Math.pow(10, i * 2))), -}); -Dexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange); - -if (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') { - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, updatedParts => { - if (!propagatingLocally) { - let event; - event = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, { - detail: updatedParts - }); - propagatingLocally = true; - dispatchEvent(event); - propagatingLocally = false; - } - }); - addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, ({ detail }) => { - if (!propagatingLocally) { - propagateLocally(detail); - } - }); -} -function propagateLocally(updateParts) { - let wasMe = propagatingLocally; - try { - propagatingLocally = true; - globalEvents.storagemutated.fire(updateParts); - signalSubscribersNow(updateParts, true); - } - finally { - propagatingLocally = wasMe; - } -} -let propagatingLocally = false; - -let bc; -let createBC = () => { }; -if (typeof BroadcastChannel !== 'undefined') { - createBC = () => { - bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME); - bc.onmessage = ev => ev.data && propagateLocally(ev.data); - }; - createBC(); - if (typeof bc.unref === 'function') { - bc.unref(); - } - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, (changedParts) => { - if (!propagatingLocally) { - bc.postMessage(changedParts); - } - }); -} - -if (typeof addEventListener !== 'undefined') { - addEventListener('pagehide', (event) => { - if (!Dexie$1.disableBfCache && event.persisted) { - if (debug) - console.debug('Dexie: handling persisted pagehide'); - bc?.close(); - for (const db of connections) { - db.close({ disableAutoOpen: false }); - } - } - }); - addEventListener('pageshow', (event) => { - if (!Dexie$1.disableBfCache && event.persisted) { - if (debug) - console.debug('Dexie: handling persisted pageshow'); - createBC(); - propagateLocally({ all: new RangeSet(-Infinity, [[]]) }); - } - }); -} - -function add(value) { - return new PropModification({ add: value }); -} - -function remove(value) { - return new PropModification({ remove: value }); -} - -function replacePrefix(a, b) { - return new PropModification({ replacePrefix: [a, b] }); -} - -DexiePromise.rejectionMapper = mapError; -setDebug(debug); - -export { Dexie$1 as Dexie, Entity, PropModSymbol, PropModification, RangeSet, add, cmp, Dexie$1 as default, liveQuery, mergeRanges, rangesOverlap, remove, replacePrefix }; -//# sourceMappingURL=dexie.mjs.map diff --git a/src/assets/dexie/dist/modern/dexie.mjs.map b/src/assets/dexie/dist/modern/dexie.mjs.map deleted file mode 100644 index b9194d77e..000000000 --- a/src/assets/dexie/dist/modern/dexie.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dexie.mjs","sources":["../../src/globals/global.ts","../../src/functions/utils.ts","../../src/errors/errors.js","../../src/functions/chaining-functions.js","../../src/helpers/debug.ts","../../src/helpers/promise.js","../../src/functions/temp-transaction.ts","../../src/globals/constants.ts","../../src/functions/combine.ts","../../src/dbcore/keyrange.ts","../../src/functions/workaround-undefined-primkey.ts","../../src/classes/entity/Entity.ts","../../src/functions/cmp.ts","../../src/classes/table/table.ts","../../src/helpers/Events.js","../../src/functions/make-class-constructor.ts","../../src/classes/table/table-constructor.ts","../../src/classes/collection/collection-helpers.ts","../../src/helpers/prop-modification.ts","../../src/classes/collection/collection.ts","../../src/classes/collection/collection-constructor.ts","../../src/functions/compare-functions.ts","../../src/classes/where-clause/where-clause-helpers.ts","../../src/classes/where-clause/where-clause.ts","../../src/classes/where-clause/where-clause-constructor.ts","../../src/functions/event-wrappers.ts","../../src/globals/global-events.ts","../../src/classes/transaction/transaction.ts","../../src/classes/transaction/transaction-constructor.ts","../../src/helpers/index-spec.ts","../../src/helpers/table-schema.ts","../../src/functions/quirks.ts","../../src/dbcore/get-key-extractor.ts","../../src/dbcore/dbcore-indexeddb.ts","../../src/classes/dexie/generate-middleware-stacks.ts","../../src/classes/version/schema-helpers.ts","../../src/classes/version/version.ts","../../src/classes/version/version-constructor.ts","../../src/helpers/database-enumerator.ts","../../src/classes/dexie/vip.ts","../../node_modules/.pnpm/safari-14-idb-fix@3.0.0/node_modules/safari-14-idb-fix/dist/index.js","../../src/helpers/rangeset.ts","../../src/live-query/extend-observability-set.ts","../../src/live-query/obs-sets-overlap.ts","../../src/live-query/cache/cache.ts","../../src/live-query/cache/signalSubscribers.ts","../../src/classes/dexie/dexie-open.ts","../../src/helpers/yield-support.ts","../../src/classes/dexie/transaction-helpers.ts","../../src/dbcore/virtual-index-middleware.ts","../../src/functions/get-object-diff.ts","../../src/dbcore/get-effective-keys.ts","../../src/hooks/hooks-middleware.ts","../../src/dbcore/cache-existing-values-middleware.ts","../../src/live-query/cache/is-cachable-context.ts","../../src/live-query/cache/is-cachable-request.ts","../../src/live-query/observability-middleware.ts","../../src/live-query/cache/adjust-optimistic-request-from-failures.ts","../../src/live-query/cache/is-within-range.ts","../../src/live-query/cache/apply-optimistic-ops.ts","../../src/live-query/cache/are-ranges-equal.ts","../../src/live-query/cache/is-super-range.ts","../../src/live-query/cache/find-compatible-query.ts","../../src/live-query/cache/subscribe-cachentry.ts","../../src/live-query/cache/cache-middleware.ts","../../src/helpers/vipify.ts","../../src/classes/dexie/dexie.ts","../../src/classes/observable/observable.ts","../../src/classes/dexie/dexie-dom-dependencies.ts","../../src/live-query/live-query.ts","../../src/classes/dexie/dexie-static-props.ts","../../src/live-query/propagate-locally.ts","../../src/live-query/enable-broadcast.ts","../../src/support-bfcache.ts","../../src/functions/propmods/add.ts","../../src/functions/propmods/remove.ts","../../src/functions/propmods/replace-prefix.ts","../../src/index.ts"],"sourcesContent":["declare var global;\nexport const _global: any =\n typeof globalThis !== 'undefined' ? globalThis :\n typeof self !== 'undefined' ? self :\n typeof window !== 'undefined' ? window :\n global;\n","import { _global } from \"../globals/global\";\nexport const keys = Object.keys;\nexport const isArray = Array.isArray;\nif (typeof Promise !== 'undefined' && !_global.Promise){\n // In jsdom, this it can be the case that Promise is not put on the global object.\n // If so, we need to patch the global object for the rest of the code to work as expected.\n // Other dexie code expects Promise to be on the global object (like normal browser environments)\n _global.Promise = Promise;\n}\nexport { _global }\n\nexport function extend(obj: T, extension: X): T & X {\n if (typeof extension !== 'object') return obj as T & X;\n keys(extension).forEach(function (key) {\n obj[key] = extension[key];\n });\n return obj as T & X;\n}\n\nexport const getProto = Object.getPrototypeOf;\nexport const _hasOwn = {}.hasOwnProperty;\nexport function hasOwn(obj, prop) {\n return _hasOwn.call(obj, prop);\n}\n\nexport function props (proto, extension) {\n if (typeof extension === 'function') extension = extension(getProto(proto));\n (typeof Reflect === \"undefined\" ? keys : Reflect.ownKeys)(extension).forEach(key => {\n setProp(proto, key, extension[key]);\n });\n}\n\nexport const defineProperty = Object.defineProperty;\n\nexport function setProp(obj, prop, functionOrGetSet, options?) {\n defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, \"get\") && typeof functionOrGetSet.get === 'function' ?\n {get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true} :\n {value: functionOrGetSet, configurable: true, writable: true}, options));\n}\n\nexport function derive(Child) {\n return {\n from: function (Parent) {\n Child.prototype = Object.create(Parent.prototype);\n setProp(Child.prototype, \"constructor\", Child);\n return {\n extend: props.bind(null, Child.prototype)\n };\n }\n };\n}\n\nexport const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nexport function getPropertyDescriptor(obj, prop) {\n const pd = getOwnPropertyDescriptor(obj, prop);\n let proto;\n return pd || (proto = getProto(obj)) && getPropertyDescriptor (proto, prop);\n}\n\nconst _slice = [].slice;\nexport function slice(args, start?, end?) {\n return _slice.call(args, start, end);\n}\n\nexport function override(origFunc, overridedFactory) {\n return overridedFactory(origFunc);\n}\n\nexport function assert (b) {\n if (!b) throw new Error(\"Assertion Failed\");\n}\n\nexport function asap(fn) {\n // @ts-ignore\n if (_global.setImmediate) setImmediate(fn); else setTimeout(fn, 0);\n}\n\nexport function getUniqueArray(a) {\n return a.filter((value, index, self) => self.indexOf(value) === index);\n}\n\n/** Generate an object (hash map) based on given array.\n * @param extractor Function taking an array item and its index and returning an array of 2 items ([key, value]) to\n * instert on the resulting object for each item in the array. If this function returns a falsy value, the\n * current item wont affect the resulting object.\n */\nexport function arrayToObject (array: T[], extractor: (x:T, idx: number)=>[string, R]): {[name: string]: R} {\n return array.reduce((result, item, i) => {\n var nameAndValue = extractor(item, i);\n if (nameAndValue) result[nameAndValue[0]] = nameAndValue[1];\n return result;\n }, {});\n}\n\nexport function trycatcher(fn, reject) {\n return function () {\n try {\n fn.apply(this, arguments);\n } catch (e) {\n reject(e);\n }\n };\n}\n\nexport function tryCatch(fn: (...args: any[])=>void, onerror, args?) : void {\n try {\n fn.apply(null, args);\n } catch (ex) {\n onerror && onerror(ex);\n }\n}\n\nexport function getByKeyPath(obj, keyPath) {\n // http://www.w3.org/TR/IndexedDB/#steps-for-extracting-a-key-from-a-value-using-a-key-path\n if (typeof keyPath === 'string' && hasOwn(obj, keyPath)) return obj[keyPath]; // This line is moved from last to first for optimization purpose.\n if (!keyPath) return obj;\n if (typeof keyPath !== 'string') {\n var rv = [];\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n var val = getByKeyPath(obj, keyPath[i]);\n rv.push(val);\n }\n return rv;\n }\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var innerObj = obj[keyPath.substr(0, period)];\n return innerObj == null ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1));\n }\n return undefined;\n}\n\nexport function setByKeyPath(obj, keyPath, value) {\n if (!obj || keyPath === undefined) return;\n if ('isFrozen' in Object && Object.isFrozen(obj)) return;\n if (typeof keyPath !== 'string' && 'length' in keyPath) {\n assert(typeof value !== 'string' && 'length' in value);\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n setByKeyPath(obj, keyPath[i], value[i]);\n }\n } else {\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var currentKeyPath = keyPath.substr(0, period);\n var remainingKeyPath = keyPath.substr(period + 1);\n if (remainingKeyPath === \"\")\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) obj.splice(currentKeyPath, 1);\n else delete obj[currentKeyPath];\n } else obj[currentKeyPath] = value;\n else {\n var innerObj = obj[currentKeyPath];\n if (!innerObj || !hasOwn(obj, currentKeyPath)) innerObj = (obj[currentKeyPath] = {});\n setByKeyPath(innerObj, remainingKeyPath, value);\n }\n } else {\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(keyPath))) obj.splice(keyPath, 1);\n else delete obj[keyPath];\n } else obj[keyPath] = value;\n }\n }\n}\n\nexport function delByKeyPath(obj, keyPath) {\n if (typeof keyPath === 'string')\n setByKeyPath(obj, keyPath, undefined);\n else if ('length' in keyPath)\n [].map.call(keyPath, function(kp) {\n setByKeyPath(obj, kp, undefined);\n });\n}\n\nexport function shallowClone(obj) {\n var rv = {};\n for (var m in obj) {\n if (hasOwn(obj, m)) rv[m] = obj[m];\n }\n return rv;\n}\n\nconst concat = [].concat;\nexport function flatten (a: (T | T[])[]) : T[] {\n return concat.apply([], a);\n}\n\n//https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm\nconst intrinsicTypeNames =\n \"BigUint64Array,BigInt64Array,Array,Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,FileSystemDirectoryHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey\"\n .split(',').concat(\n flatten([8,16,32,64].map(num=>[\"Int\",\"Uint\",\"Float\"].map(t=>t+num+\"Array\")))\n ).filter(t=>_global[t]);\nconst intrinsicTypes = new Set(intrinsicTypeNames.map(t=>_global[t]));\n\n/** Deep clone a simple object tree.\n * \n * Copies object tree deeply, but does not deep-copy arrays,\n * typed arrays, Dates or other intrinsic types.\n * \n * Does not check for cyclic references.\n * \n * This function is 6 times faster than structuredClone() on chromium 111.\n * \n * This function can safely be used for cloning ObservabilitySets and RangeSets.\n * \n * @param o Object to clone\n * @returns Cloned object\n */\nexport function cloneSimpleObjectTree(o: T): T {\n const rv = {} as T;\n for (const k in o) if (hasOwn(o, k)) {\n const v = o[k];\n rv[k] = !v || typeof v !== 'object' || intrinsicTypes.has(v.constructor) ? v : cloneSimpleObjectTree(v);\n }\n return rv;\n}\n\nexport function objectIsEmpty(o: object) {\n for (const k in o) if (hasOwn(o, k)) return false;\n return true;\n}\n\nlet circularRefs: null | WeakMap = null;\n\n/** Deep clone an object or array.\n * \n * \n * @param any \n * @returns \n */\nexport function deepClone(any: T): T {\n circularRefs = new WeakMap();\n const rv = innerDeepClone(any);\n circularRefs = null;\n return rv;\n}\n\nfunction innerDeepClone(x: T): T {\n if (!x || typeof x !== 'object') return x;\n let rv = circularRefs.get(x); // Resolve circular references\n if (rv) return rv;\n if (isArray(x)) {\n rv = [];\n circularRefs.set(x, rv);\n for (var i = 0, l = x.length; i < l; ++i) {\n rv.push(innerDeepClone(x[i]));\n }\n } else if (intrinsicTypes.has(x.constructor)) {\n // For performance, we're less strict than structuredClone - we're only\n // cloning arrays and custom objects.\n // Typed arrays, Dates etc are not cloned.\n rv = x;\n } else {\n // We're nicer to custom classes than what structuredClone() is -\n // we preserve the proto of each object.\n const proto = getProto(x);\n rv = proto === Object.prototype ? {} : Object.create(proto);\n circularRefs.set(x, rv);\n for (var prop in x) {\n if (hasOwn(x, prop)) {\n rv[prop] = innerDeepClone(x[prop]);\n }\n }\n }\n return rv;\n}\n\nconst {toString} = {};\nexport function toStringTag(o: Object) {\n return toString.call(o).slice(8, -1);\n}\n\n// If first argument is iterable or array-like, return it as an array\nexport const iteratorSymbol = typeof Symbol !== 'undefined' ?\n Symbol.iterator :\n '@@iterator';\nexport const getIteratorOf = typeof iteratorSymbol === \"symbol\" ? function(x) {\n var i;\n return x != null && (i = x[iteratorSymbol]) && i.apply(x);\n} : function () { return null; };\nexport const asyncIteratorSymbol = typeof Symbol !== 'undefined'\n ? Symbol.asyncIterator || Symbol.for(\"Symbol.asyncIterator\")\n : '@asyncIterator';\n\nexport function delArrayItem(a: any[], x: any) {\n const i = a.indexOf(x);\n if (i >= 0) a.splice(i, 1);\n return i >= 0;\n}\n\nexport const NO_CHAR_ARRAY = {};\n// Takes one or several arguments and returns an array based on the following criteras:\n// * If several arguments provided, return arguments converted to an array in a way that\n// still allows javascript engine to optimize the code.\n// * If single argument is an array, return a clone of it.\n// * If this-pointer equals NO_CHAR_ARRAY, don't accept strings as valid iterables as a special\n// case to the two bullets below.\n// * If single argument is an iterable, convert it to an array and return the resulting array.\n// * If single argument is array-like (has length of type number), convert it to an array.\nexport function getArrayOf (arrayLike) {\n var i, a, x, it;\n if (arguments.length === 1) {\n if (isArray(arrayLike)) return arrayLike.slice();\n if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') return [arrayLike];\n if ((it = getIteratorOf(arrayLike))) {\n a = [];\n while ((x = it.next()), !x.done) a.push(x.value);\n return a;\n }\n if (arrayLike == null) return [arrayLike];\n i = arrayLike.length;\n if (typeof i === 'number') {\n a = new Array(i);\n while (i--) a[i] = arrayLike[i];\n return a;\n }\n return [arrayLike];\n }\n i = arguments.length;\n a = new Array(i);\n while (i--) a[i] = arguments[i];\n return a;\n}\nexport const isAsyncFunction = typeof Symbol !== 'undefined'\n ? (fn: Function) => fn[Symbol.toStringTag] === 'AsyncFunction'\n : ()=>false;\n","import { derive, setProp } from '../functions/utils';\n\nvar dexieErrorNames = [\n 'Modify',\n 'Bulk',\n 'OpenFailed',\n 'VersionChange',\n 'Schema',\n 'Upgrade',\n 'InvalidTable',\n 'MissingAPI',\n 'NoSuchDatabase',\n 'InvalidArgument',\n 'SubTransaction',\n 'Unsupported',\n 'Internal',\n 'DatabaseClosed',\n 'PrematureCommit',\n 'ForeignAwait'\n];\n\nvar idbDomErrorNames = [\n 'Unknown',\n 'Constraint',\n 'Data',\n 'TransactionInactive',\n 'ReadOnly',\n 'Version',\n 'NotFound',\n 'InvalidState',\n 'InvalidAccess',\n 'Abort',\n 'Timeout',\n 'QuotaExceeded',\n 'Syntax',\n 'DataClone'\n];\n\nvar errorList = dexieErrorNames.concat(idbDomErrorNames);\n\nvar defaultTexts = {\n VersionChanged: \"Database version changed by other database connection\",\n DatabaseClosed: \"Database has been closed\",\n Abort: \"Transaction aborted\",\n TransactionInactive: \"Transaction has already completed or failed\",\n MissingAPI: \"IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb\"\n};\n\n//\n// DexieError - base class of all out exceptions.\n//\nexport function DexieError (name, msg) {\n // Reason we don't use ES6 classes is because:\n // 1. It bloats transpiled code and increases size of minified code.\n // 2. It doesn't give us much in this case.\n // 3. It would require sub classes to call super(), which\n // is not needed when deriving from Error.\n this.name = name;\n this.message = msg;\n}\n\nderive(DexieError).from(Error).extend({\n toString: function(){ return this.name + \": \" + this.message; }\n});\n\nfunction getMultiErrorMessage (msg, failures) {\n return msg + \". Errors: \" + Object.keys(failures)\n .map(key=>failures[key].toString())\n .filter((v,i,s)=>s.indexOf(v) === i) // Only unique error strings\n .join('\\n');\n}\n\n//\n// ModifyError - thrown in Collection.modify()\n// Specific constructor because it contains members failures and failedKeys.\n//\nexport function ModifyError (msg, failures, successCount, failedKeys) {\n this.failures = failures;\n this.failedKeys = failedKeys;\n this.successCount = successCount;\n this.message = getMultiErrorMessage(msg, failures);\n}\nderive(ModifyError).from(DexieError);\n\nexport function BulkError (msg, failures) {\n this.name = \"BulkError\";\n this.failures = Object.keys(failures).map(pos => failures[pos]);\n this.failuresByPos = failures;\n this.message = getMultiErrorMessage(msg, this.failures);\n}\nderive(BulkError).from(DexieError);\n\n//\n//\n// Dynamically generate error names and exception classes based\n// on the names in errorList.\n//\n//\n\n// Map of {ErrorName -> ErrorName + \"Error\"}\nexport var errnames = errorList.reduce((obj,name)=>(obj[name]=name+\"Error\",obj),{});\n\n// Need an alias for DexieError because we're gonna create subclasses with the same name.\nconst BaseException = DexieError;\n// Map of {ErrorName -> exception constructor}\nexport var exceptions = errorList.reduce((obj,name)=>{\n // Let the name be \"DexieError\" because this name may\n // be shown in call stack and when debugging. DexieError is\n // the most true name because it derives from DexieError,\n // and we cannot change Function.name programatically without\n // dynamically create a Function object, which would be considered\n // 'eval-evil'.\n var fullName = name + \"Error\";\n function DexieError (msgOrInner, inner){\n this.name = fullName;\n if (!msgOrInner) {\n this.message = defaultTexts[name] || fullName;\n this.inner = null;\n } else if (typeof msgOrInner === 'string') {\n this.message = `${msgOrInner}${!inner ? '' : '\\n ' + inner}`;\n this.inner = inner || null;\n } else if (typeof msgOrInner === 'object') {\n this.message = `${msgOrInner.name} ${msgOrInner.message}`;\n this.inner = msgOrInner;\n }\n }\n derive(DexieError).from(BaseException);\n obj[name]=DexieError;\n return obj;\n},{});\n\n// Use ECMASCRIPT standard exceptions where applicable:\nexceptions.Syntax = SyntaxError;\nexceptions.Type = TypeError;\nexceptions.Range = RangeError;\n\nexport var exceptionMap = idbDomErrorNames.reduce((obj, name)=>{\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nexport function mapError (domError, message) {\n if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name])\n return domError;\n var rv = new exceptionMap[domError.name](message || domError.message, domError);\n if (\"stack\" in domError) {\n // Derive stack from inner exception if it has a stack\n setProp(rv, \"stack\", {get: function(){\n return this.inner.stack;\n }});\n }\n return rv;\n}\n\nexport var fullNameExceptions = errorList.reduce((obj, name)=>{\n if ([\"Syntax\",\"Type\",\"Range\"].indexOf(name) === -1)\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nfullNameExceptions.ModifyError = ModifyError;\nfullNameExceptions.DexieError = DexieError;\nfullNameExceptions.BulkError = BulkError;\n","import {extend} from './utils';\n\nexport function nop() { }\nexport function mirror(val) { return val; }\nexport function pureFunctionChain(f1, f2) {\n // Enables chained events that takes ONE argument and returns it to the next function in chain.\n // This pattern is used in the hook(\"reading\") event.\n if (f1 == null || f1 === mirror) return f2;\n return function (val) {\n return f2(f1(val));\n };\n}\n\nexport function callBoth(on1, on2) {\n return function () {\n on1.apply(this, arguments);\n on2.apply(this, arguments);\n };\n}\n\nexport function hookCreatingChain(f1, f2) {\n // Enables chained events that takes several arguments and may modify first argument by making a modification and then returning the same instance.\n // This pattern is used in the hook(\"creating\") event.\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res !== undefined) arguments[0] = res;\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res2 !== undefined ? res2 : res;\n };\n}\n\nexport function hookDeletingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = this.onerror = null;\n f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n };\n}\n\nexport function hookUpdatingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function (modifications) {\n var res = f1.apply(this, arguments);\n extend(modifications, res); // If f1 returns new modifications, extend caller's modifications with the result before calling next in chain.\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res === undefined ?\n (res2 === undefined ? undefined : res2) :\n (extend(res, res2));\n };\n}\n\nexport function reverseStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n if (f2.apply(this, arguments) === false) return false;\n return f1.apply(this, arguments);\n };\n}\n\nexport function nonStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n f2.apply(this, arguments);\n };\n}\n\nexport function promisableChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res && typeof res.then === 'function') {\n var thiz = this,\n i = arguments.length,\n args = new Array(i);\n while (i--) args[i] = arguments[i];\n return res.then(function () {\n return f2.apply(thiz, args);\n });\n }\n return f2.apply(this, arguments);\n };\n}\n","// By default, debug will be true only if platform is a web platform and its page is served from localhost.\n// When debug = true, error's stacks will contain asyncronic long stacks.\nexport var debug = typeof location !== 'undefined' &&\n // By default, use debug mode if served from localhost.\n /^(http|https):\\/\\/(localhost|127\\.0\\.0\\.1)/.test(location.href);\n\nexport function setDebug(value, filter) {\n debug = value;\n}\n\nexport function deprecated (what: string, fn: (...args)=>T) {\n return function () {\n console.warn(`${what} is deprecated. See https://dexie.org/docs/Deprecations}`);\n return fn.apply(this, arguments);\n } as (...args)=>T\n}\n","/*\n * Copyright (c) 2014-2017 David Fahlander\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/LICENSE-2.0\n */\nimport { _global } from '../globals/global';\nimport {tryCatch, props, setProp,\n getPropertyDescriptor, getArrayOf, extend, getProto} from '../functions/utils';\nimport {nop, callBoth, mirror} from '../functions/chaining-functions';\nimport {debug} from './debug';\nimport {exceptions} from '../errors';\n\n//\n// Promise and Zone (PSD) for Dexie library\n//\n// I started out writing this Promise class by copying promise-light (https://github.com/taylorhakes/promise-light) by\n// https://github.com/taylorhakes - an A+ and ECMASCRIPT 6 compliant Promise implementation.\n//\n// In previous versions this was fixed by not calling setTimeout when knowing that the resolve() or reject() came from another\n// tick. In Dexie v1.4.0, I've rewritten the Promise class entirely. Just some fragments of promise-light is left. I use\n// another strategy now that simplifies everything a lot: to always execute callbacks in a new micro-task, but have an own micro-task\n// engine that is indexedDB compliant across all browsers.\n// Promise class has also been optimized a lot with inspiration from bluebird - to avoid closures as much as possible.\n//\n// Specific non-standard features of this Promise class:\n// * Custom zone support (a.k.a. PSD) with ability to keep zones also when using native promises as well as\n// native async / await.\n// * Promise.follow() method built upon the custom zone engine, that allows user to track all promises created from current stack frame\n// and below + all promises that those promises creates or awaits.\n// * Detect any unhandled promise in a PSD-scope (PSD.onunhandled). \n//\n// David Fahlander, https://github.com/dfahlander\n//\n\n// Just a pointer that only this module knows about.\n// Used in Promise constructor to emulate a private constructor.\nvar INTERNAL = {};\n\nconst\n ZONE_ECHO_LIMIT = 100,\n [resolvedNativePromise, nativePromiseProto, resolvedGlobalPromise] = typeof Promise === 'undefined' ?\n [] :\n (()=>{\n let globalP = Promise.resolve();\n if (typeof crypto === 'undefined' || !crypto.subtle)\n return [globalP, getProto(globalP), globalP];\n // Generate a native promise (as window.Promise may have been patched)\n const nativeP = crypto.subtle.digest(\"SHA-512\", new Uint8Array([0]));\n return [\n nativeP,\n getProto(nativeP),\n globalP\n ];\n })(),\n nativePromiseThen = nativePromiseProto && nativePromiseProto.then;\n\nexport const NativePromise = resolvedNativePromise && resolvedNativePromise.constructor;\nconst patchGlobalPromise = !!resolvedGlobalPromise;\n\n/* The default function used only for the very first promise in a promise chain.\n As soon as then promise is resolved or rejected, all next tasks will be executed in micro ticks\n emulated in this module. For indexedDB compatibility, this means that every method needs to \n execute at least one promise before doing an indexedDB operation. Dexie will always call \n db.ready().then() for every operation to make sure the indexedDB event is started in an\n indexedDB-compatible emulated micro task loop.\n*/\nfunction schedulePhysicalTick() {\n queueMicrotask(physicalTick);\n}\n\n// Configurable through Promise.scheduler.\n// Don't export because it would be unsafe to let unknown\n// code call it unless they do try..catch within their callback.\n// This function can be retrieved through getter of Promise.scheduler though,\n// but users must not do Promise.scheduler = myFuncThatThrowsException\nvar asap = function (callback, args) {\n microtickQueue.push([callback, args]);\n if (needsNewPhysicalTick) {\n schedulePhysicalTick();\n needsNewPhysicalTick = false;\n }\n};\n\nvar isOutsideMicroTick = true, // True when NOT in a virtual microTick.\n needsNewPhysicalTick = true, // True when a push to microtickQueue must also schedulePhysicalTick()\n unhandledErrors = [], // Rejected promises that has occured. Used for triggering 'unhandledrejection'.\n rejectingErrors = [], // Tracks if errors are being re-rejected during onRejected callback.\n rejectionMapper = mirror; // Remove in next major when removing error mapping of DOMErrors and DOMExceptions\n \nexport var globalPSD = {\n id: 'global',\n global: true,\n ref: 0,\n unhandleds: [],\n onunhandled: nop,\n pgp: false,\n env: {},\n finalize: nop\n};\n\nexport var PSD = globalPSD;\n\nexport var microtickQueue = []; // Callbacks to call in this or next physical tick.\nexport var numScheduledCalls = 0; // Number of listener-calls left to do in this physical tick.\nexport var tickFinalizers = []; // Finalizers to call when there are no more async calls scheduled within current physical tick.\n\nexport default function DexiePromise(fn) {\n if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); \n this._listeners = [];\n \n // A library may set `promise._lib = true;` after promise is created to make resolve() or reject()\n // execute the microtask engine implicitely within the call to resolve() or reject().\n // To remain A+ compliant, a library must only set `_lib=true` if it can guarantee that the stack\n // only contains library code when calling resolve() or reject().\n // RULE OF THUMB: ONLY set _lib = true for promises explicitely resolving/rejecting directly from\n // global scope (event handler, timer etc)!\n this._lib = false;\n // Current async scope\n var psd = (this._PSD = PSD);\n \n if (typeof fn !== 'function') {\n if (fn !== INTERNAL) throw new TypeError('Not a function');\n // Private constructor (INTERNAL, state, value).\n // Used internally by Promise.resolve() and Promise.reject().\n this._state = arguments[1];\n this._value = arguments[2];\n if (this._state === false)\n handleRejection(this, this._value); // Map error, set stack and addPossiblyUnhandledError().\n return;\n }\n \n this._state = null; // null (=pending), false (=rejected) or true (=resolved)\n this._value = null; // error or result\n ++psd.ref; // Refcounting current scope\n executePromiseTask(this, fn);\n}\n\n// Prepare a property descriptor to put onto Promise.prototype.then\nconst thenProp = {\n get: function() {\n var psd = PSD, microTaskId = totalEchoes;\n\n function then (onFulfilled, onRejected) {\n var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes);\n const cleanup = possibleAwait && !decrementExpectedAwaits();\n var rv = new DexiePromise((resolve, reject) => {\n propagateToListener(this, new Listener(\n nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup),\n nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup),\n resolve,\n reject,\n psd));\n });\n if (this._consoleTask) rv._consoleTask = this._consoleTask;\n return rv;\n }\n\n then.prototype = INTERNAL; // For idempotense, see setter below.\n\n return then;\n },\n // Be idempotent and allow another framework (such as zone.js or another instance of a Dexie.Promise module) to replace Promise.prototype.then\n // and when that framework wants to restore the original property, we must identify that and restore the original property descriptor.\n set: function (value) {\n setProp (this, 'then', value && value.prototype === INTERNAL ?\n thenProp : // Restore to original property descriptor.\n {\n get: function(){\n return value; // Getter returning provided value (behaves like value is just changed)\n },\n set: thenProp.set // Keep a setter that is prepared to restore original.\n }\n );\n }\n};\n\nprops(DexiePromise.prototype, {\n then: thenProp, // Defined above.\n _then: function (onFulfilled, onRejected) {\n // A little tinier version of then() that don't have to create a resulting promise.\n propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); \n },\n\n catch: function (onRejected) {\n if (arguments.length === 1) return this.then(null, onRejected);\n // First argument is the Error type to catch\n var type = arguments[0],\n handler = arguments[1];\n return typeof type === 'function' ? this.then(null, err =>\n // Catching errors by its constructor type (similar to java / c++ / c#)\n // Sample: promise.catch(TypeError, function (e) { ... });\n err instanceof type ? handler(err) : PromiseReject(err))\n : this.then(null, err =>\n // Catching errors by the error.name property. Makes sense for indexedDB where error type\n // is always DOMError but where e.name tells the actual error type.\n // Sample: promise.catch('ConstraintError', function (e) { ... });\n err && err.name === type ? handler(err) : PromiseReject(err));\n },\n\n finally: function (onFinally) {\n return this.then(value => {\n return DexiePromise.resolve(onFinally()).then(()=>value);\n }, err => {\n return DexiePromise.resolve(onFinally()).then(()=>PromiseReject(err));\n });\n },\n \n timeout: function (ms, msg) {\n return ms < Infinity ?\n new DexiePromise((resolve, reject) => {\n var handle = setTimeout(() => reject(new exceptions.Timeout(msg)), ms);\n this.then(resolve, reject).finally(clearTimeout.bind(null, handle));\n }) : this;\n }\n});\n\nif (typeof Symbol !== 'undefined' && Symbol.toStringTag)\n setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise');\n\n// Now that Promise.prototype is defined, we have all it takes to set globalPSD.env.\n// Environment globals snapshotted on leaving global zone\nglobalPSD.env = snapShot();\n\nfunction Listener(onFulfilled, onRejected, resolve, reject, zone) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.resolve = resolve;\n this.reject = reject;\n this.psd = zone;\n}\n\n// Promise Static Properties\nprops (DexiePromise, {\n all: function () {\n var values = getArrayOf.apply(null, arguments) // Supports iterables, implicit arguments and array-like.\n .map(onPossibleParallellAsync); // Handle parallell async/awaits \n return new DexiePromise(function (resolve, reject) {\n if (values.length === 0) resolve([]);\n var remaining = values.length;\n values.forEach((a,i) => DexiePromise.resolve(a).then(x => {\n values[i] = x;\n if (!--remaining) resolve(values);\n }, reject));\n });\n },\n \n resolve: value => {\n if (value instanceof DexiePromise) return value;\n if (value && typeof value.then === 'function') return new DexiePromise((resolve, reject)=>{\n value.then(resolve, reject);\n });\n var rv = new DexiePromise(INTERNAL, true, value);\n return rv;\n },\n \n reject: PromiseReject,\n \n race: function () {\n var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n values.map(value => DexiePromise.resolve(value).then(resolve, reject));\n });\n },\n\n PSD: {\n get: ()=>PSD,\n set: value => PSD = value\n },\n\n totalEchoes: {get: ()=>totalEchoes},\n\n //task: {get: ()=>task},\n \n newPSD: newScope,\n \n usePSD: usePSD,\n \n scheduler: {\n get: () => asap,\n set: value => {asap = value}\n },\n \n rejectionMapper: {\n get: () => rejectionMapper,\n set: value => {rejectionMapper = value;} // Map reject failures\n },\n \n follow: (fn, zoneProps) => {\n return new DexiePromise((resolve, reject) => {\n return newScope((resolve, reject) => {\n var psd = PSD;\n psd.unhandleds = []; // For unhandled standard- or 3rd party Promises. Checked at psd.finalize()\n psd.onunhandled = reject; // Triggered directly on unhandled promises of this library.\n psd.finalize = callBoth(function () {\n // Unhandled standard or 3rd part promises are put in PSD.unhandleds and\n // examined upon scope completion while unhandled rejections in this Promise\n // will trigger directly through psd.onunhandled\n run_at_end_of_this_or_next_physical_tick(()=>{\n this.unhandleds.length === 0 ? resolve() : reject(this.unhandleds[0]);\n });\n }, psd.finalize);\n fn();\n }, zoneProps, resolve, reject);\n });\n }\n});\n\nif (NativePromise) {\n if (NativePromise.allSettled) setProp (DexiePromise, \"allSettled\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise(resolve => {\n if (possiblePromises.length === 0) resolve([]);\n let remaining = possiblePromises.length;\n const results = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => results[i] = {status: \"fulfilled\", value},\n reason => results[i] = {status: \"rejected\", reason})\n .then(()=>--remaining || resolve(results)));\n });\n });\n if (NativePromise.any && typeof AggregateError !== 'undefined') setProp(DexiePromise, \"any\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n if (possiblePromises.length === 0) reject(new AggregateError([]));\n let remaining = possiblePromises.length;\n const failures = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => resolve(value),\n failure => {\n failures[i] = failure;\n if (!--remaining) reject(new AggregateError(failures));\n }));\n });\n });\n}\n\n/**\n* Take a potentially misbehaving resolver function and make sure\n* onFulfilled and onRejected are only called once.\n*\n* Makes no guarantees about asynchrony.\n*/\nfunction executePromiseTask (promise, fn) {\n // Promise Resolution Procedure:\n // https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n try {\n fn(value => {\n if (promise._state !== null) return; // Already settled\n if (value === promise) throw new TypeError('A promise cannot be resolved with itself.');\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n if (value && typeof value.then === 'function') {\n executePromiseTask(promise, (resolve, reject) => {\n value instanceof DexiePromise ?\n value._then(resolve, reject) :\n value.then(resolve, reject);\n });\n } else {\n promise._state = true;\n promise._value = value;\n propagateAllListeners(promise);\n }\n if (shouldExecuteTick) endMicroTickScope();\n }, handleRejection.bind(null, promise)); // If Function.bind is not supported. Exception is handled in catch below\n } catch (ex) {\n handleRejection(promise, ex);\n }\n}\n\nfunction handleRejection (promise, reason) {\n rejectingErrors.push(reason);\n if (promise._state !== null) return;\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n reason = rejectionMapper(reason);\n promise._state = false;\n promise._value = reason;\n // Add the failure to a list of possibly uncaught errors\n addPossiblyUnhandledError(promise);\n propagateAllListeners(promise);\n if (shouldExecuteTick) endMicroTickScope();\n}\n\nfunction propagateAllListeners (promise) {\n //debug && linkToPreviousPromise(promise);\n var listeners = promise._listeners;\n promise._listeners = [];\n for (var i = 0, len = listeners.length; i < len; ++i) {\n propagateToListener(promise, listeners[i]);\n }\n var psd = promise._PSD;\n --psd.ref || psd.finalize(); // if psd.ref reaches zero, call psd.finalize();\n if (numScheduledCalls === 0) {\n // If numScheduledCalls is 0, it means that our stack is not in a callback of a scheduled call,\n // and that no deferreds where listening to this rejection or success.\n // Since there is a risk that our stack can contain application code that may\n // do stuff after this code is finished that may generate new calls, we cannot\n // call finalizers here.\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick(); // Will detect unhandled errors\n }, []);\n }\n}\n\nfunction propagateToListener(promise, listener) {\n if (promise._state === null) {\n promise._listeners.push(listener);\n return;\n }\n\n var cb = promise._state ? listener.onFulfilled : listener.onRejected;\n if (cb === null) {\n // This Listener doesnt have a listener for the event being triggered (onFulfilled or onReject) so lets forward the event to any eventual listeners on the Promise instance returned by then() or catch()\n return (promise._state ? listener.resolve : listener.reject) (promise._value);\n }\n ++listener.psd.ref;\n ++numScheduledCalls;\n asap (callListener, [cb, promise, listener]);\n}\n\nfunction callListener (cb, promise, listener) {\n try {\n // Call callback and resolve our listener with it's return value.\n var ret, value = promise._value;\n \n if (!promise._state && rejectingErrors.length) rejectingErrors = [];\n // cb is onResolved\n ret = debug && promise._consoleTask ? promise._consoleTask.run(()=>cb (value)) : cb (value);\n if (!promise._state && rejectingErrors.indexOf(value) === -1) {\n markErrorAsHandled(promise); // Callback didnt do Promise.reject(err) nor reject(err) onto another promise.\n }\n listener.resolve(ret);\n } catch (e) {\n // Exception thrown in callback. Reject our listener.\n listener.reject(e);\n } finally {\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n --listener.psd.ref || listener.psd.finalize();\n }\n}\n\n/* The callback to schedule with queueMicrotask().\n It runs a virtual microtick and executes any callback registered in microtickQueue.\n */\nfunction physicalTick() {\n usePSD(globalPSD, ()=>{\n // Make sure to reset the async context to globalPSD before\n // executing any of the microtick subscribers.\n beginMicroTickScope() && endMicroTickScope();\n });\n}\n\nexport function beginMicroTickScope() {\n var wasRootExec = isOutsideMicroTick;\n isOutsideMicroTick = false;\n needsNewPhysicalTick = false;\n return wasRootExec;\n}\n\n/* Executes micro-ticks without doing try..catch.\n This can be possible because we only use this internally and\n the registered functions are exception-safe (they do try..catch\n internally before calling any external method). If registering\n functions in the microtickQueue that are not exception-safe, this\n would destroy the framework and make it instable. So we don't export\n our asap method.\n*/\nexport function endMicroTickScope() {\n var callbacks, i, l;\n do {\n while (microtickQueue.length > 0) {\n callbacks = microtickQueue;\n microtickQueue = [];\n l = callbacks.length;\n for (i = 0; i < l; ++i) {\n var item = callbacks[i];\n item[0].apply(null, item[1]);\n }\n }\n } while (microtickQueue.length > 0);\n isOutsideMicroTick = true;\n needsNewPhysicalTick = true;\n}\n\nfunction finalizePhysicalTick() {\n var unhandledErrs = unhandledErrors;\n unhandledErrors = [];\n unhandledErrs.forEach(p => {\n p._PSD.onunhandled.call(null, p._value, p);\n });\n var finalizers = tickFinalizers.slice(0); // Clone first because finalizer may remove itself from list.\n var i = finalizers.length;\n while (i) finalizers[--i](); \n}\n\nfunction run_at_end_of_this_or_next_physical_tick (fn) {\n function finalizer() {\n fn();\n tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1);\n }\n tickFinalizers.push(finalizer);\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n }, []);\n}\n\nfunction addPossiblyUnhandledError(promise) {\n // Only add to unhandledErrors if not already there. The first one to add to this list\n // will be upon the first rejection so that the root cause (first promise in the\n // rejection chain) is the one listed.\n if (!unhandledErrors.some(p => p._value === promise._value))\n unhandledErrors.push(promise);\n}\n\nfunction markErrorAsHandled(promise) {\n // Called when a reject handled is actually being called.\n // Search in unhandledErrors for any promise whos _value is this promise_value (list\n // contains only rejected promises, and only one item per error)\n var i = unhandledErrors.length;\n while (i) if (unhandledErrors[--i]._value === promise._value) {\n // Found a promise that failed with this same error object pointer,\n // Remove that since there is a listener that actually takes care of it.\n unhandledErrors.splice(i, 1);\n return;\n }\n}\n\nfunction PromiseReject (reason) {\n return new DexiePromise(INTERNAL, false, reason);\n}\n\nexport function wrap (fn, errorCatcher) {\n var psd = PSD;\n return function() {\n var wasRootExec = beginMicroTickScope(),\n outerScope = PSD;\n\n try {\n switchToZone(psd, true);\n return fn.apply(this, arguments);\n } catch (e) {\n errorCatcher && errorCatcher(e);\n } finally {\n switchToZone(outerScope, false);\n if (wasRootExec) endMicroTickScope();\n }\n };\n}\n\n\n//\n// variables used for native await support\n//\nconst task = { awaits: 0, echoes: 0, id: 0}; // The ongoing macro-task when using zone-echoing.\nvar taskCounter = 0; // ID counter for macro tasks.\nvar zoneStack = []; // Stack of left zones to restore asynchronically.\nvar zoneEchoes = 0; // When > 0, zoneLeaveEcho is queued. When 0 and task.echoes is also 0, nothing is queued.\nvar totalEchoes = 0; // ID counter for micro-tasks. Used to detect possible native await in our Promise.prototype.then.\n\n\nvar zone_id_counter = 0;\nexport function newScope (fn, props, a1, a2) {\n var parent = PSD,\n psd = Object.create(parent);\n psd.parent = parent;\n psd.ref = 0;\n psd.global = false;\n psd.id = ++zone_id_counter;\n // Prepare for promise patching (done in usePSD):\n var globalEnv = globalPSD.env;\n psd.env = patchGlobalPromise ? {\n Promise: DexiePromise, // Changing window.Promise could be omitted for Chrome and Edge, where IDB+Promise plays well!\n PromiseProp: {value: DexiePromise, configurable: true, writable: true},\n all: DexiePromise.all,\n race: DexiePromise.race,\n allSettled: DexiePromise.allSettled,\n any: DexiePromise.any,\n resolve: DexiePromise.resolve,\n reject: DexiePromise.reject,\n } : {};\n if (props) extend(psd, props);\n \n // unhandleds and onunhandled should not be specifically set here.\n // Leave them on parent prototype.\n // unhandleds.push(err) will push to parent's prototype\n // onunhandled() will call parents onunhandled (with this scope's this-pointer though!)\n ++parent.ref;\n psd.finalize = function () {\n --this.parent.ref || this.parent.finalize();\n }\n var rv = usePSD (psd, fn, a1, a2);\n if (psd.ref === 0) psd.finalize();\n return rv;\n}\n\n// Function to call if scopeFunc returns NativePromise\n// Also for each NativePromise in the arguments to Promise.all()\nexport function incrementExpectedAwaits() {\n if (!task.id) task.id = ++taskCounter;\n ++task.awaits;\n task.echoes += ZONE_ECHO_LIMIT;\n return task.id;\n}\n\n// Function to call when 'then' calls back on a native promise where onAwaitExpected() had been called.\n// Also call this when a native await calls then method on a promise. In that case, don't supply\n// sourceTaskId because we already know it refers to current task.\nexport function decrementExpectedAwaits() {\n if (!task.awaits) return false;\n if (--task.awaits === 0) task.id = 0;\n task.echoes = task.awaits * ZONE_ECHO_LIMIT; // Will reset echoes to 0 if awaits is 0.\n return true;\n}\n\nif ((''+nativePromiseThen).indexOf('[native code]') === -1) {\n // If the native promise' prototype is patched, we cannot rely on zone echoing.\n // Disable that here:\n incrementExpectedAwaits = decrementExpectedAwaits = nop;\n}\n\n// Call from Promise.all() and Promise.race()\nexport function onPossibleParallellAsync (possiblePromise) {\n if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) {\n incrementExpectedAwaits(); \n return possiblePromise.then(x => {\n decrementExpectedAwaits();\n return x;\n }, e => {\n decrementExpectedAwaits();\n return rejection(e);\n });\n }\n return possiblePromise;\n}\n\nfunction zoneEnterEcho(targetZone) {\n ++totalEchoes;\n //console.log(\"Total echoes \", totalEchoes);\n //if (task.echoes === 1) console.warn(\"Cancelling echoing of async context.\");\n if (!task.echoes || --task.echoes === 0) {\n task.echoes = task.awaits = task.id = 0; // Cancel echoing.\n }\n\n zoneStack.push(PSD);\n switchToZone(targetZone, true);\n}\n\nfunction zoneLeaveEcho() {\n var zone = zoneStack[zoneStack.length-1];\n zoneStack.pop();\n switchToZone(zone, false);\n}\n\nfunction switchToZone (targetZone, bEnteringZone) {\n var currentZone = PSD;\n if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) {\n // Enter or leave zone asynchronically as well, so that tasks initiated during current tick\n // will be surrounded by the zone when they are invoked.\n queueMicrotask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho);\n }\n if (targetZone === PSD) return;\n\n PSD = targetZone; // The actual zone switch occurs at this line.\n\n // Snapshot on every leave from global zone.\n if (currentZone === globalPSD) globalPSD.env = snapShot();\n\n if (patchGlobalPromise) {\n // Let's patch the global and native Promises (may be same or may be different)\n var GlobalPromise = globalPSD.env.Promise;\n // Swich environments (may be PSD-zone or the global zone. Both apply.)\n var targetEnv = targetZone.env;\n\n if (currentZone.global || targetZone.global) {\n // Leaving or entering global zone. It's time to patch / restore global Promise.\n\n // Set this Promise to window.Promise so that transiled async functions will work on Firefox, Safari and IE, as well as with Zonejs and angular.\n Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp);\n\n // Support Promise.all() etc to work indexedDB-safe also when people are including es6-promise as a module (they might\n // not be accessing global.Promise but a local reference to it)\n GlobalPromise.all = targetEnv.all;\n GlobalPromise.race = targetEnv.race;\n GlobalPromise.resolve = targetEnv.resolve;\n GlobalPromise.reject = targetEnv.reject;\n if (targetEnv.allSettled) GlobalPromise.allSettled = targetEnv.allSettled;\n if (targetEnv.any) GlobalPromise.any = targetEnv.any;\n }\n }\n}\n\nfunction snapShot () {\n var GlobalPromise = _global.Promise;\n return patchGlobalPromise ? {\n Promise: GlobalPromise,\n PromiseProp: Object.getOwnPropertyDescriptor(_global, \"Promise\"),\n all: GlobalPromise.all,\n race: GlobalPromise.race,\n allSettled: GlobalPromise.allSettled,\n any: GlobalPromise.any,\n resolve: GlobalPromise.resolve,\n reject: GlobalPromise.reject,\n } : {};\n}\n\nexport function usePSD (psd, fn, a1, a2, a3) {\n var outerScope = PSD;\n try {\n switchToZone(psd, true);\n return fn(a1, a2, a3);\n } finally {\n switchToZone(outerScope, false);\n }\n}\n\nfunction nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) {\n return typeof fn !== 'function' ? fn : function () {\n var outerZone = PSD;\n if (possibleAwait) incrementExpectedAwaits();\n switchToZone(zone, true);\n try {\n return fn.apply(this, arguments);\n } finally {\n switchToZone(outerZone, false);\n if (cleanup) queueMicrotask(decrementExpectedAwaits);\n }\n };\n}\n\n/** Execute callback in global context */\nexport function execInGlobalContext(cb) {\n if (Promise === NativePromise && task.echoes === 0) {\n if (zoneEchoes === 0) {\n cb();\n } else {\n enqueueNativeMicroTask(cb);\n }\n } else {\n setTimeout(cb, 0);\n }\n}\n\nexport var rejection = DexiePromise.reject;\n\nexport {DexiePromise};\n","import { PSD, rejection, newScope } from \"../helpers/promise\";\nimport { DexieOptions } from \"../public/types/dexie-constructor\";\nimport { errnames, exceptions } from \"../errors\";\nimport { nop } from \"./chaining-functions\";\nimport { Transaction } from \"../classes/transaction\";\nimport { Dexie } from '../classes/dexie';\n\n/* Generate a temporary transaction when db operations are done outside a transaction scope.\n*/\nexport function tempTransaction (\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n fn: (resolve, reject, trans: Transaction) => any)\n // Last argument is \"writeLocked\". But this doesnt apply to oneshot direct db operations, so we ignore it.\n{\n if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) {\n if (db._state.openComplete) {\n // db.idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError));\n }\n if (!db._state.isBeingOpened) {\n if (!db._state.autoOpen)\n return rejection(new exceptions.DatabaseClosed());\n db.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n return db._state.dbReadyPromise.then(() => tempTransaction(db, mode, storeNames, fn));\n } else {\n var trans = db._createTransaction(mode, storeNames, db._dbSchema);\n try {\n trans.create();\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db.close({disableAutoOpen: false});\n return db.open().then(()=>tempTransaction(db, mode, storeNames, fn));\n }\n return rejection(ex);\n }\n return trans._promise(mode, (resolve, reject) => {\n return newScope(() => { // OPTIMIZATION POSSIBLE? newScope() not needed because it's already done in _promise.\n PSD.trans = trans;\n return fn(resolve, reject, trans);\n });\n }).then(result => {\n // Instead of resolving value directly, wait with resolving it until transaction has completed.\n // Otherwise the data would not be in the DB if requesting it in the then() operation.\n // Specifically, to ensure that the following expression will work:\n //\n // db.friends.put({name: \"Arne\"}).then(function () {\n // db.friends.where(\"name\").equals(\"Arne\").count(function(count) {\n // assert (count === 1);\n // });\n // });\n //\n if (mode === 'readwrite') try {trans.idbtrans.commit();} catch {}\n return mode === 'readonly' ? result : trans._completion.then(() => result);\n });/*.catch(err => { // Don't do this as of now. If would affect bulk- and modify methods in a way that could be more intuitive. But wait! Maybe change in next major.\n trans._reject(err);\n return rejection(err);\n });*/\n }\n}\n","import { Dexie } from \"../classes/dexie\";\n\nexport const DEXIE_VERSION = '{version}'; // Replaced by build-script.\nexport const maxString = String.fromCharCode(65535);\nexport const minKey = -Infinity; // minKey can be constant. maxKey must be a prop of Dexie (_maxKey)\nexport const INVALID_KEY_ARGUMENT =\n \"Invalid key provided. Keys must be of type string, number, Date or Array.\";\nexport const STRING_EXPECTED = \"String expected.\";\nexport const connections: Dexie[] = [];\nexport const dexieStackFrameFilter = frame => !/(dexie\\.js|dexie\\.min\\.js)/.test(frame);\nexport const DBNAMES_DB = '__dbnames';\nexport const READONLY = 'readonly';\nexport const READWRITE = 'readwrite';\n","export function combine(filter1, filter2) {\n return filter1 ?\n filter2 ?\n function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } :\n filter1 :\n filter2;\n}\n","import { DBCoreKeyRange, DBCoreRangeType } from '../public/types/dbcore';\n\nexport const AnyRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Any,\n lower: -Infinity,\n lowerOpen: false,\n upper: [[]],\n upperOpen: false\n}\n\nexport const NeverRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Never,\n lower: -Infinity,\n lowerOpen: true,\n upper: -Infinity,\n upperOpen: true\n}\n","import { deepClone, delByKeyPath, getByKeyPath } from './utils';\n\n// This workaround is needed since obj could be a custom-class instance with an\n// uninitialized keyPath. See the following comment for more context:\n// https://github.com/dfahlander/Dexie.js/issues/1280#issuecomment-823557881\nexport function workaroundForUndefinedPrimKey(keyPath: string | ArrayLike) {\n // Workaround only needed for plain non-dotted keyPaths\n return typeof keyPath === \"string\" && !/\\./.test(keyPath) \n ? (obj: object) => {\n if (obj[keyPath] === undefined && (keyPath in obj)) {\n // property exists but is undefined. This will not be liked by Indexeddb.\n // Need to remove the property before adding it but we need to clone it before\n // doing that to not be intrusive.\n obj = deepClone(obj);\n delete obj[keyPath];\n }\n return obj;\n }\n : (obj: object) => obj;\n}","import { exceptions } from \"../../errors\";\n\nexport function Entity(){\n throw exceptions.Type();\n}\n","// Implementation of https://www.w3.org/TR/IndexedDB-3/#compare-two-keys\n\nimport { toStringTag } from './utils';\n\n// ... with the adjustment to return NaN instead of throwing.\nexport function cmp(a: any, b: any): number {\n try {\n const ta = type(a);\n const tb = type(b);\n if (ta !== tb) {\n if (ta === 'Array') return 1;\n if (tb === 'Array') return -1;\n if (ta === 'binary') return 1;\n if (tb === 'binary') return -1;\n if (ta === 'string') return 1;\n if (tb === 'string') return -1;\n if (ta === 'Date') return 1;\n if (tb !== 'Date') return NaN;\n return -1;\n }\n switch (ta) {\n case 'number':\n case 'Date':\n case 'string':\n return a > b ? 1 : a < b ? -1 : 0;\n case 'binary': {\n return compareUint8Arrays(getUint8Array(a), getUint8Array(b));\n }\n case 'Array':\n return compareArrays(a, b);\n }\n } catch {}\n return NaN; // Return value if any given args are valid keys.\n}\n\nexport function compareArrays(a: any[], b: any[]): number {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n const res = cmp(a[i], b[i]);\n if (res !== 0) return res;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\nexport function compareUint8Arrays(\n a: Uint8Array,\n b: Uint8Array\n) {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n if (a[i] !== b[i]) return a[i] < b[i] ? -1 : 1;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\n// Implementation of https://www.w3.org/TR/IndexedDB-3/#key-type\nfunction type(x: any) {\n const t = typeof x;\n if (t !== 'object') return t;\n if (ArrayBuffer.isView(x)) return 'binary';\n const tsTag = toStringTag(x); // Cannot use instanceof in Safari\n return tsTag === 'ArrayBuffer' ? 'binary' : (tsTag as 'Array' | 'Date');\n}\n\ntype BinaryType =\n | ArrayBuffer\n | DataView\n | Uint8ClampedArray\n | ArrayBufferView\n | Uint8Array\n | Int8Array\n | Uint16Array\n | Int16Array\n | Uint32Array\n | Int32Array\n | Float32Array\n | Float64Array\n | BigInt64Array \n | BigUint64Array;\n\nfunction getUint8Array(a: BinaryType): Uint8Array {\n if (a instanceof Uint8Array) return a;\n if (ArrayBuffer.isView(a))\n // TypedArray or DataView\n return new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n return new Uint8Array(a); // ArrayBuffer\n}\n","import { BulkError, exceptions } from '../../errors';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { DexiePromise as Promise, PSD, newScope, rejection, beginMicroTickScope, endMicroTickScope } from '../../helpers/promise';\nimport { Transaction } from '../transaction';\nimport { Dexie } from '../dexie';\nimport { tempTransaction } from '../../functions/temp-transaction';\nimport { Collection } from '../collection';\nimport { isArray, keys, getByKeyPath, setByKeyPath, extend, getProto } from '../../functions/utils';\nimport { maxString } from '../../globals/constants';\nimport { combine } from '../../functions/combine';\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { IndexableType } from '../../public/types/indexable-type';\nimport { debug } from '../../helpers/debug';\nimport { DBCoreTable } from '../../public/types/dbcore';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { workaroundForUndefinedPrimKey } from '../../functions/workaround-undefined-primkey';\nimport { Entity } from '../entity/Entity';\nimport { UpdateSpec } from '../../public';\nimport { cmp } from '../../functions/cmp';\n\n/** class Table\n * \n * https://dexie.org/docs/Table/Table\n */\nexport class Table implements ITable {\n db: Dexie;\n _tx?: Transaction;\n name: string;\n schema: TableSchema;\n hook: TableHooks;\n core: DBCoreTable;\n\n _trans(\n mode: IDBTransactionMode,\n fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike | void,\n writeLocked?: boolean | string) : PromiseExtended\n {\n const trans: Transaction = this._tx || PSD.trans;\n const tableName = this.name;\n // @ts-ignore: Use Chrome's Async Stack Tagging API to allow tracing and simplify debugging for dexie users.\n const task = debug && typeof console !== 'undefined' && console.createTask && console.createTask(`Dexie: ${mode === 'readonly' ? 'read' : 'write' } ${this.name}`);\n \n function checkTableInTransaction(resolve, reject, trans: Transaction) {\n if (!trans.schema[tableName])\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\");\n return fn(trans.idbtrans, trans) as Promise;\n }\n // Surround all in a microtick scope.\n // Reason: Browsers (modern Safari + older others)\n // still as of 2018-10-10 has problems keeping a transaction\n // alive between micro ticks. Safari because if transaction\n // is created but not used in same microtick, it will go\n // away. That specific issue could be solved in DBCore\n // by opening the transaction just before using it instead.\n // But older Firefoxes and IE11 (with Promise polyfills)\n // will still have probs.\n // The beginMicrotickScope()/endMicrotickScope() works\n // in cooperation with Dexie.Promise to orchestrate\n // the micro-ticks in endMicrotickScope() rather than\n // in native engine.\n const wasRootExec = beginMicroTickScope();\n try {\n let p = trans && trans.db._novip === this.db._novip ?\n trans === PSD.trans ?\n trans._promise(mode, checkTableInTransaction, writeLocked) :\n newScope(() => trans._promise(mode, checkTableInTransaction, writeLocked), { trans: trans, transless: PSD.transless || PSD }) :\n tempTransaction(this.db, mode, [this.name], checkTableInTransaction);\n if (task) { // Dexie.debug = true so we trace errors\n p._consoleTask = task;\n p = p.catch(err => {\n console.trace(err);\n return rejection(err);\n });\n }\n return p; \n } finally {\n if (wasRootExec) endMicroTickScope();\n }\n }\n\n /** Table.get()\n * \n * https://dexie.org/docs/Table/Table.get()\n * \n **/\n get(keyOrCrit, cb?) {\n if (keyOrCrit && keyOrCrit.constructor === Object)\n return this.where(keyOrCrit as { [key: string]: IndexableType }).first(cb);\n if (keyOrCrit == null) return rejection(new exceptions.Type(`Invalid argument to Table.get()`));\n\n return this._trans('readonly', (trans) => {\n return this.core.get({trans, key: keyOrCrit})\n .then(res => this.hook.reading.fire(res));\n }).then(cb);\n }\n\n /** Table.where()\n * \n * https://dexie.org/docs/Table/Table.where()\n * \n **/\n where(indexOrCrit: string | string[] | { [key: string]: IndexableType }) {\n if (typeof indexOrCrit === 'string')\n return new this.db.WhereClause(this, indexOrCrit);\n if (isArray(indexOrCrit))\n return new this.db.WhereClause(this, `[${indexOrCrit.join('+')}]`);\n // indexOrCrit is an object map of {[keyPath]:value} \n const keyPaths = keys(indexOrCrit);\n if (keyPaths.length === 1)\n // Only one critera. This was the easy case:\n return this\n .where(keyPaths[0])\n .equals(indexOrCrit[keyPaths[0]]);\n\n // Multiple criterias.\n // Let's try finding a compound index that matches all keyPaths in\n // arbritary order:\n const compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(ix => {\n if (\n ix.compound &&\n keyPaths.every(keyPath => ix.keyPath.indexOf(keyPath) >= 0)) {\n for (let i=0; i a.keyPath.length - b.keyPath.length)[0];\n \n if (compoundIndex && this.db._maxKey !== maxString) {\n // Cool! We found such compound index\n // and this browser supports compound indexes (maxKey !== maxString)!\n const keyPathsInValidOrder = (compoundIndex.keyPath as string[]).slice(0, keyPaths.length);\n return this\n .where(keyPathsInValidOrder)\n .equals(keyPathsInValidOrder.map(kp => indexOrCrit[kp]));\n }\n\n if (!compoundIndex && debug) console.warn(\n `The query ${JSON.stringify(indexOrCrit)} on ${this.name} would benefit from a ` +\n `compound index [${keyPaths.join('+')}]`);\n\n // Ok, now let's fallback to finding at least one matching index\n // and filter the rest.\n const { idxByName } = this.schema;\n const idb = this.db._deps.indexedDB;\n\n function equals (a, b) {\n return idb.cmp(a,b) === 0; // Works with all indexable types including binary keys.\n }\n\n const [idx, filterFunction] = keyPaths.reduce(([prevIndex, prevFilterFn], keyPath) => {\n const index = idxByName[keyPath];\n const value = indexOrCrit[keyPath];\n return [\n prevIndex || index, // idx::=Pick index of first matching keypath\n prevIndex || !index ? // filter::=null if not needed, otherwise combine function filter\n combine(\n prevFilterFn,\n index && index.multi ?\n x => {\n const prop = getByKeyPath(x, keyPath);\n return isArray(prop) && prop.some(item => equals(value, item));\n } : x => equals(value, getByKeyPath(x, keyPath)))\n : prevFilterFn\n ];\n }, [null, null]);\n\n return idx ?\n this.where(idx.name).equals(indexOrCrit[idx.keyPath])\n .filter(filterFunction) :\n compoundIndex ?\n this.filter(filterFunction) : // Has compound but browser bad. Allow filter.\n this.where(keyPaths).equals(''); // No index at all. Fail lazily with \"[a+b+c] is not indexed\"\n }\n\n /** Table.filter()\n * \n * https://dexie.org/docs/Table/Table.filter()\n * \n **/\n filter(filterFunction: (obj: any) => boolean) {\n return this.toCollection().and(filterFunction);\n }\n\n /** Table.count()\n * \n * https://dexie.org/docs/Table/Table.count()\n * \n **/\n count(thenShortcut?: any) {\n return this.toCollection().count(thenShortcut);\n }\n\n /** Table.offset()\n * \n * https://dexie.org/docs/Table/Table.offset()\n * \n **/\n offset(offset: number) {\n return this.toCollection().offset(offset);\n }\n\n /** Table.limit()\n * \n * https://dexie.org/docs/Table/Table.limit()\n * \n **/\n limit(numRows: number) {\n return this.toCollection().limit(numRows);\n }\n\n /** Table.each()\n * \n * https://dexie.org/docs/Table/Table.each()\n * \n **/\n each(callback: (obj: any, cursor: { key: IndexableType, primaryKey: IndexableType }) => any) {\n return this.toCollection().each(callback);\n }\n\n /** Table.toArray()\n * \n * https://dexie.org/docs/Table/Table.toArray()\n * \n **/\n toArray(thenShortcut?: any) {\n return this.toCollection().toArray(thenShortcut);\n }\n\n /** Table.toCollection()\n * \n * https://dexie.org/docs/Table/Table.toCollection()\n * \n **/\n toCollection() {\n return new this.db.Collection(new this.db.WhereClause(this));\n }\n\n /** Table.orderBy()\n * \n * https://dexie.org/docs/Table/Table.orderBy()\n * \n **/\n orderBy(index: string | string[]) {\n return new this.db.Collection(\n new this.db.WhereClause(this, isArray(index) ?\n `[${index.join('+')}]` :\n index));\n }\n\n /** Table.reverse()\n * \n * https://dexie.org/docs/Table/Table.reverse()\n * \n **/\n reverse(): Collection {\n return this.toCollection().reverse();\n }\n\n /** Table.mapToClass()\n * \n * https://dexie.org/docs/Table/Table.mapToClass()\n * \n **/\n mapToClass(constructor: Function) {\n const {db, name: tableName} = this;\n this.schema.mappedClass = constructor;\n if (constructor.prototype instanceof Entity) {\n constructor = class extends (constructor as any) {\n get db () { return db; }\n table() { return tableName; }\n }\n }\n // Collect all inherited property names (including method names) by\n // walking the prototype chain. This is to avoid overwriting them from\n // database data - so application code can rely on inherited props never\n // becoming shadowed by database object props.\n const inheritedProps = new Set();\n for (let proto = constructor.prototype; proto; proto = getProto(proto)) {\n Object.getOwnPropertyNames(proto).forEach(propName => inheritedProps.add(propName));\n }\n \n // Now, subscribe to the when(\"reading\") event to make all objects that come out from this table inherit from given class\n // no matter which method to use for reading (Table.get() or Table.where(...)... )\n const readHook = (obj: Object) => {\n if (!obj) return obj; // No valid object. (Value is null or undefined). Return as is.\n // Create a new object that derives from constructor:\n const res = Object.create(constructor.prototype);\n // Clone members (but never those that collide with a property in the prototype\n // hierchary (MUST BE ABLE TO RELY ON Entity methods and props!)):\n for (let m in obj) if (!inheritedProps.has(m)) try { res[m] = obj[m]; } catch (_) { }\n return res;\n };\n\n if (this.schema.readHook) {\n this.hook.reading.unsubscribe(this.schema.readHook);\n }\n this.schema.readHook = readHook;\n this.hook(\"reading\", readHook);\n return constructor;\n }\n\n /** @deprecated */\n defineClass() {\n function Class (content){\n extend(this, content);\n };\n return this.mapToClass(Class);\n }\n\n /** Table.add()\n * \n * https://dexie.org/docs/Table/Table.add()\n * \n **/\n add(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd]});\n }).then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.update()\n * \n * https://dexie.org/docs/Table/Table.update()\n * \n **/\n update(keyOrObject, modifications: { [keyPath: string]: any; } | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) {\n const key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath);\n if (key === undefined) return rejection(new exceptions.InvalidArgument(\n \"Given object does not contain its primary key\"));\n /*// object to modify. Also modify given object with the modifications:\n // This part should be here for backward compatibility.\n // If ever feeling too bad about mutating given object, please wait to a new major before removing it,\n // and document the change thoroughly. TODO: Document this change!\n if (!Object.isFrozen(keyOrObject)) try {\n if (typeof modifications !== \"function\") {\n keys(modifications).forEach(keyPath => {\n setByKeyPath(keyOrObject, keyPath, modifications[keyPath]);\n });\n } else {\n // Now since we support function argument, we should have a similar behavior here as well\n // (as long as we do this mutability stuff on the given object)\n modifications(keyOrObject, {value: keyOrObject, primKey: key});\n }\n } catch {\n // Maybe given object was frozen.\n // This part is not essential. Just move on as nothing happened...\n }*/\n return this.where(\":id\").equals(key).modify(modifications);\n } else {\n // key to modify\n return this.where(\":id\").equals(keyOrObject).modify(modifications);\n }\n }\n\n /** Table.put()\n * \n * https://dexie.org/docs/Table/Table.put()\n * \n **/\n put(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans(\n 'readwrite',\n trans => this.core.mutate({trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.delete()\n * \n * https://dexie.org/docs/Table/Table.delete()\n * \n **/\n delete(key: IndexableType): PromiseExtended {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'delete', keys: [key]}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.clear()\n * \n * https://dexie.org/docs/Table/Table.clear()\n * \n **/\n clear() {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'deleteRange', range: AnyRange}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.bulkGet()\n * \n * https://dexie.org/docs/Table/Table.bulkGet()\n * \n * @param keys \n */\n bulkGet(keys: IndexableType[]) {\n return this._trans('readonly', trans => {\n return this.core.getMany({\n keys,\n trans\n }).then(result => result.map(res => this.hook.reading.fire(res)));\n });\n }\n\n /** Table.bulkAdd()\n * \n * https://dexie.org/docs/Table/Table.bulkAdd()\n * \n **/\n bulkAdd(\n objects: readonly any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkAdd(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToAdd = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n return this.core.mutate(\n {trans, type: 'add', keys: keys as IndexableType[], values: objectsToAdd, wantResults}\n )\n .then(({numFailures, results,lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkAdd(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkPut()\n * \n * https://dexie.org/docs/Table/Table.bulkPut()\n * \n **/\n bulkPut(\n objects: readonly any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkPut(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToPut = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n\n return this.core.mutate(\n {trans, type: 'put', keys: keys as IndexableType[], values: objectsToPut, wantResults}\n )\n .then(({numFailures, results, lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkPut(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkUpdate()\n *\n * https://dexie.org/docs/Table.Table.bulkUpdate()\n */\n bulkUpdate(\n keysAndChanges: readonly { key: any; changes: UpdateSpec }[]\n ): PromiseExtended {\n const coreTable = this.core;\n const keys = keysAndChanges.map((entry) => entry.key);\n const changeSpecs = keysAndChanges.map((entry) => entry.changes);\n const offsetMap: number[] = [];\n return this._trans('readwrite', (trans) => {\n return coreTable.getMany({ trans, keys, cache: 'clone' }).then((objs) => {\n const resultKeys: any[] = [];\n const resultObjs: any[] = [];\n keysAndChanges.forEach(({ key, changes }, idx) => {\n const obj = objs[idx];\n if (obj) {\n for (const keyPath of Object.keys(changes)) {\n const value = changes[keyPath];\n if (keyPath === this.schema.primKey.keyPath) {\n if (cmp(value, key) !== 0) {\n throw new exceptions.Constraint(\n `Cannot update primary key in bulkUpdate()`\n );\n }\n } else {\n setByKeyPath(obj, keyPath, value);\n }\n }\n offsetMap.push(idx);\n resultKeys.push(key);\n resultObjs.push(obj);\n }\n });\n const numEntries = resultKeys.length;\n return coreTable\n .mutate({\n trans,\n type: 'put',\n keys: resultKeys,\n values: resultObjs,\n updates: {\n keys,\n changeSpecs\n }\n })\n .then(({ numFailures, failures }) => {\n if (numFailures === 0) return numEntries;\n // Failure. bulkPut() may have a subset of keys\n // so we must translate returned 'failutes' into the offsets of given argument:\n for (const offset of Object.keys(failures)) {\n const mappedOffset = offsetMap[Number(offset)];\n if (mappedOffset != null) {\n const failure = failures[offset];\n delete failures[offset];\n failures[mappedOffset] = failure;\n }\n }\n throw new BulkError(\n `${this.name}.bulkUpdate(): ${numFailures} of ${numEntries} operations failed`,\n failures\n );\n });\n });\n });\n }\n\n /** Table.bulkDelete()\n * \n * https://dexie.org/docs/Table/Table.bulkDelete()\n * \n **/\n bulkDelete(keys: ReadonlyArray): PromiseExtended {\n const numKeys = keys.length;\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'delete', keys: keys as IndexableType[]});\n }).then(({numFailures, lastResult, failures}) => {\n if (numFailures === 0) return lastResult;\n throw new BulkError(\n `${this.name}.bulkDelete(): ${numFailures} of ${numKeys} operations failed`, failures);\n });\n }\n}\n","import {keys, isArray, asap} from '../functions/utils';\nimport {nop, mirror, reverseStoppableEventChain} from '../functions/chaining-functions';\nimport {exceptions} from '../errors';\n\nexport default function Events(ctx) {\n var evs = {};\n var rv = function (eventName, subscriber) {\n if (subscriber) {\n // Subscribe. If additional arguments than just the subscriber was provided, forward them as well.\n var i = arguments.length, args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n evs[eventName].subscribe.apply(null, args);\n return ctx;\n } else if (typeof (eventName) === 'string') {\n // Return interface allowing to fire or unsubscribe from event\n return evs[eventName];\n }\n };\n rv.addEventType = add;\n \n for (var i = 1, l = arguments.length; i < l; ++i) {\n add(arguments[i]);\n }\n \n return rv;\n\n function add(eventName, chainFunction, defaultFunction) {\n if (typeof eventName === 'object') return addConfiguredEvents(eventName);\n if (!chainFunction) chainFunction = reverseStoppableEventChain;\n if (!defaultFunction) defaultFunction = nop;\n\n var context = {\n subscribers: [],\n fire: defaultFunction,\n subscribe: function (cb) {\n if (context.subscribers.indexOf(cb) === -1) {\n context.subscribers.push(cb);\n context.fire = chainFunction(context.fire, cb);\n }\n },\n unsubscribe: function (cb) {\n context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; });\n context.fire = context.subscribers.reduce(chainFunction, defaultFunction);\n }\n };\n evs[eventName] = rv[eventName] = context;\n return context;\n }\n\n function addConfiguredEvents(cfg) {\n // events(this, {reading: [functionChain, nop]});\n keys(cfg).forEach(function (eventName) {\n var args = cfg[eventName];\n if (isArray(args)) {\n add(eventName, cfg[eventName][0], cfg[eventName][1]);\n } else if (args === 'asap') {\n // Rather than approaching event subscription using a functional approach, we here do it in a for-loop where subscriber is executed in its own stack\n // enabling that any exception that occur wont disturb the initiator and also not nescessary be catched and forgotten.\n var context = add(eventName, mirror, function fire() {\n // Optimazation-safe cloning of arguments into args.\n var i = arguments.length, args = new Array(i);\n while (i--) args[i] = arguments[i];\n // All each subscriber:\n context.subscribers.forEach(function (fn) {\n asap(function fireEvent() {\n fn.apply(null, args);\n });\n });\n });\n } else throw new exceptions.InvalidArgument(\"Invalid event config\");\n });\n }\n}\n","import { arrayToObject, derive } from './utils';\n\n\nexport function makeClassConstructor (prototype: Object, constructor: Function) {\n /*const propertyDescriptorMap = arrayToObject(\n Object.getOwnPropertyNames(prototype),\n propKey => [propKey, Object.getOwnPropertyDescriptor(prototype, propKey)]);\n\n // Both derive and clone the prototype.\n // derive: So that x instanceof T returns true when T is the class template.\n // clone: Optimizes method access a bit (but actually not nescessary)\n const derivedPrototypeClone = Object.create(prototype, propertyDescriptorMap);\n derivedPrototypeClone.constructor = constructor;\n constructor.prototype = derivedPrototypeClone;\n return constructor as any as TConstructor;*/\n\n // Keep the above code in case we want to clone AND derive the parent prototype.\n // Reason would be optimization of property access.\n // The code below will only create a prototypal inheritance from given constructor function\n // to given prototype.\n derive(constructor).from({prototype});\n return constructor as any as TConstructor; \n}\n","import { Dexie } from '../dexie';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { Transaction } from '../transaction/transaction';\nimport { hookCreatingChain, pureFunctionChain, nop, mirror, hookUpdatingChain, hookDeletingChain } from '../../functions/chaining-functions';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { Table } from './table';\nimport Events from '../../helpers/Events';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\n\nexport interface TableConstructor {\n new (name: string, tableSchema: TableSchema, optionalTrans?: Transaction) : Table;\n prototype: Table;\n}\n\n/** Generates a Table constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTableConstructor (db: Dexie) {\n return makeClassConstructor(\n Table.prototype,\n\n function Table (this: Table, name: string, tableSchema: TableSchema, trans?: Transaction) {\n this.db = db;\n this._tx = trans;\n this.name = name;\n this.schema = tableSchema;\n this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, {\n \"creating\": [hookCreatingChain, nop],\n \"reading\": [pureFunctionChain, mirror],\n \"updating\": [hookUpdatingChain, nop],\n \"deleting\": [hookDeletingChain, nop]\n }) as TableHooks;\n }\n\n );\n}\n","import { combine } from \"../../functions/combine\";\nimport { exceptions } from \"../../errors\";\nimport { hasOwn } from \"../../functions/utils\";\nimport { wrap } from \"../../helpers/promise\";\nimport { Collection } from './';\nimport { DBCoreCursor, DBCoreTable, DBCoreTransaction, DBCoreTableSchema, DBCoreRangeType } from '../../public/types/dbcore';\nimport { nop } from '../../functions/chaining-functions';\n\ntype CollectionContext = Collection[\"_ctx\"];\n\nexport function isPlainKeyRange (ctx: CollectionContext, ignoreLimitFilter?: boolean) {\n return !(ctx.filter || ctx.algorithm || ctx.or) &&\n (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter);\n} \n\nexport function addFilter(ctx: CollectionContext, fn: Function) {\n ctx.filter = combine(ctx.filter, fn);\n}\n\nexport function addReplayFilter (ctx: CollectionContext, factory, isLimitFilter?) {\n var curr = ctx.replayFilter;\n ctx.replayFilter = curr ? ()=>combine(curr(), factory()) : factory;\n ctx.justLimit = isLimitFilter && !curr;\n}\n\nexport function addMatchFilter(ctx: CollectionContext, fn) {\n ctx.isMatch = combine(ctx.isMatch, fn);\n}\n\nexport function getIndexOrStore(ctx: CollectionContext, coreSchema: DBCoreTableSchema) {\n // TODO: Rewrite this. No need to know ctx.isPrimKey. ctx.index should hold the keypath.\n // Still, throw if not found!\n if (ctx.isPrimKey) return coreSchema.primaryKey;\n const index = coreSchema.getIndexByKeyPath(ctx.index);\n if (!index) throw new exceptions.Schema(\"KeyPath \" + ctx.index + \" on object store \" + coreSchema.name + \" is not indexed\");\n return index;\n}\n\nexport function openCursor(ctx: CollectionContext, coreTable: DBCoreTable, trans: DBCoreTransaction) {\n const index = getIndexOrStore(ctx, coreTable.schema);\n return coreTable.openCursor({\n trans,\n values: !ctx.keysOnly,\n reverse: ctx.dir === 'prev',\n unique: !!ctx.unique,\n query: {\n index, \n range: ctx.range\n }\n });\n}\n\nexport function iter (\n ctx: CollectionContext, \n fn: (item, cursor: DBCoreCursor, advance: Function)=>void,\n coreTrans: DBCoreTransaction,\n coreTable: DBCoreTable): Promise\n{\n const filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter;\n if (!ctx.or) {\n return iterate(\n openCursor(ctx, coreTable, coreTrans),\n combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper);\n } else {\n const set = {};\n\n const union = (item: any, cursor: DBCoreCursor, advance) => {\n if (!filter || filter(cursor, advance, result=>cursor.stop(result), err => cursor.fail(err))) {\n var primaryKey = cursor.primaryKey;\n var key = '' + primaryKey;\n if (key === '[object ArrayBuffer]') key = '' + new Uint8Array(primaryKey);\n if (!hasOwn(set, key)) {\n set[key] = true;\n fn(item, cursor, advance);\n }\n }\n }\n\n return Promise.all([\n ctx.or._iterate(union, coreTrans),\n iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper)\n ]);\n }\n}\n\nfunction iterate(cursorPromise: Promise, filter, fn, valueMapper): Promise {\n \n // Apply valueMapper (hook('reading') or mappped class)\n var mappedFn = valueMapper ? (x,c,a) => fn(valueMapper(x),c,a) : fn;\n // Wrap fn with PSD and microtick stuff from Promise.\n var wrappedFn = wrap(mappedFn);\n \n return cursorPromise.then(cursor => {\n if (cursor) {\n return cursor.start(()=>{\n var c = ()=>cursor.continue();\n if (!filter || filter(cursor, advancer => c = advancer, val=>{cursor.stop(val);c=nop}, e => {cursor.fail(e);c = nop;}))\n wrappedFn(cursor.value, cursor, advancer => c = advancer);\n c();\n });\n }\n });\n}\n","import { isArray } from \"../functions/utils\";\nimport { PropModSpec } from \"../public/types/prop-modification\";\n\nexport const PropModSymbol: unique symbol = Symbol();\n\n/** Consistent change propagation across offline synced data.\n * \n * This class is executed client- and server side on sync, making\n * an operation consistent across sync for full consistency and accuracy.\n * \n * Example: An object represents a bank account with a balance.\n * One offline user adds $ 1.00 to the balance.\n * Another user (online) adds $ 2.00 to the balance.\n * When first user syncs, the balance becomes the sum of every operation (3.00).\n * \n * -- initial: balance is 0\n * 1. db.bankAccounts.update(1, { balance: new ProdModification({add: 100})}) // user 1 (offline)\n * 2. db.bankAccounts.update(1, { balance: new ProdModification({add: 200})}) // user 2 (online)\n * -- before user 1 syncs, balance is 200 (representing money with integers * 100 to avoid rounding issues)\n * \n * -- balance is 300\n * \n * When new operations are added, they need to be added to:\n * 1. PropModSpec interface\n * 2. Here in PropModification with the logic they represent\n * 3. (Optionally) a sugar function for it, such as const mathAdd = (amount: number | BigInt) => new PropModification({mathAdd: amount})\n */\nexport class PropModification implements PropModSpec {\n [PropModSymbol]?: true;\n replacePrefix?: [string, string];\n add?: number | BigInt | Array;\n remove?: number | BigInt | Array;\n\n execute(value: any): any {\n // add (mathematical or set-wise)\n if (this.add !== undefined) {\n const term = this.add;\n // Set-addition on array representing a set of primitive types (strings, numbers)\n if (isArray(term)) {\n return [...(isArray(value) ? value : []), ...term].sort();\n }\n // Mathematical addition:\n if (typeof term === 'number') return (Number(value) || 0) + term; // if value is not convertible to number, return 0 + term\n if (typeof term === 'bigint') {\n try {\n return BigInt(value) + term;\n } catch {\n return BigInt(0) + term; // Unlike Number(value) that can return NaN, BigInt(value) throws if value is not BigInt, Number or numeric string\n }\n }\n throw new TypeError(`Invalid term ${term}`);\n }\n\n // remove (mathematical or set-wise)\n if (this.remove !== undefined) {\n const subtrahend = this.remove;\n // Set-addition on array representing a set of primitive types (strings, numbers)\n if (isArray(subtrahend)) {\n return isArray(value) ? value.filter(item => !subtrahend.includes(item)).sort() : [];\n } \n // Mathematical addition:\n if (typeof subtrahend === 'number') return Number(value) - subtrahend;\n if (typeof subtrahend === 'bigint') {\n try {\n return BigInt(value) - subtrahend;\n } catch {\n return BigInt(0) - subtrahend; // Unlike Number(value) that can return NaN, BigInt(value) throws if value is not BigInt, Number or numeric string\n }\n }\n throw new TypeError(`Invalid subtrahend ${subtrahend}`);\n }\n\n // Replace a prefix:\n const prefixToReplace = this.replacePrefix?.[0];\n if (prefixToReplace && typeof value === 'string' && value.startsWith(prefixToReplace)) {\n return this.replacePrefix[1] + value.substring(prefixToReplace.length);\n }\n return value;\n }\n\n constructor(spec: PropModSpec) {\n Object.assign(this, spec);\n }\n}\n","import { Collection as ICollection } from \"../../public/types/collection\";\nimport { Dexie } from \"../dexie\";\nimport { Table } from \"../table\";\nimport { IndexableType, IndexableTypeArrayReadonly } from \"../../public/types/indexable-type\";\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { iter, isPlainKeyRange, getIndexOrStore, addReplayFilter, addFilter, addMatchFilter } from \"./collection-helpers\";\nimport { rejection } from \"../../helpers/promise\";\nimport { combine } from \"../../functions/combine\";\nimport { extend, hasOwn, deepClone, keys, setByKeyPath, getByKeyPath } from \"../../functions/utils\";\nimport { ModifyError } from \"../../errors\";\nimport { ThenShortcut } from \"../../public/types/then-shortcut\";\nimport { Transaction } from '../transaction';\nimport { DBCoreCursor, DBCoreTransaction, DBCoreRangeType, DBCoreMutateResponse, DBCoreKeyRange } from '../../public/types/dbcore';\nimport { cmp } from \"../../functions/cmp\";\nimport { PropModification } from \"../../helpers/prop-modification\";\nimport { UpdateSpec } from \"../../public/types/update-spec\";\n\n/** class Collection\n * \n * https://dexie.org/docs/Collection/Collection\n */\nexport class Collection implements ICollection {\n db: Dexie;\n _ctx: {\n table: Table;\n index?: string | null;\n isPrimKey?: boolean;\n range: DBCoreKeyRange;\n keysOnly: boolean;\n dir: \"next\" | \"prev\";\n unique: \"\" | \"unique\";\n algorithm?: Function | null;\n filter?: Function | null;\n replayFilter: Function | null;\n justLimit: boolean; // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: Function | null;\n offset: number,\n limit: number,\n error: any, // If set, any promise must be rejected with this error\n or: Collection,\n valueMapper: (any) => any\n }\n \n _ondirectionchange?: Function;\n\n _read(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike, cb?): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readonly', fn).then(cb);\n }\n\n _write(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readwrite', fn, \"locked\"); // When doing write operations on collections, always lock the operation so that upcoming operations gets queued.\n }\n\n _addAlgorithm(fn) {\n var ctx = this._ctx;\n ctx.algorithm = combine(ctx.algorithm, fn);\n }\n\n _iterate(\n fn: (item, cursor: DBCoreCursor, advance: Function) => void,\n coreTrans: DBCoreTransaction) : Promise\n {\n return iter(this._ctx, fn, coreTrans, this._ctx.table.core);\n }\n\n /** Collection.clone()\n * \n * https://dexie.org/docs/Collection/Collection.clone()\n * \n **/\n clone(props?): this {\n var rv = Object.create(this.constructor.prototype),\n ctx = Object.create(this._ctx);\n if (props) extend(ctx, props);\n rv._ctx = ctx;\n return rv;\n }\n\n /** Collection.raw()\n * \n * https://dexie.org/docs/Collection/Collection.raw()\n * \n **/\n raw(): this {\n this._ctx.valueMapper = null;\n return this;\n }\n\n /** Collection.each()\n * \n * https://dexie.org/docs/Collection/Collection.each()\n * \n **/\n each(fn: (obj, cursor: DBCoreCursor) => any): PromiseExtended {\n var ctx = this._ctx;\n\n return this._read(trans => iter(ctx, fn, trans, ctx.table.core));\n }\n\n /** Collection.count()\n * \n * https://dexie.org/docs/Collection/Collection.count()\n * \n **/\n count(cb?) {\n return this._read(trans => {\n const ctx = this._ctx;\n const coreTable = ctx.table.core;\n if (isPlainKeyRange(ctx, true)) {\n // This is a plain key range. We can use the count() method if the index.\n return coreTable.count({\n trans,\n query: {\n index: getIndexOrStore(ctx, coreTable.schema),\n range: ctx.range\n }\n }).then(count => Math.min(count, ctx.limit));\n } else {\n // Algorithms, filters or expressions are applied. Need to count manually.\n var count = 0;\n return iter(ctx, () => { ++count; return false; }, trans, coreTable)\n .then(()=>count);\n }\n }).then(cb);\n }\n\n /** Collection.sortBy()\n * \n * https://dexie.org/docs/Collection/Collection.sortBy()\n * \n **/\n sortBy(keyPath: string): PromiseExtended;\n sortBy(keyPath: string, thenShortcut: ThenShortcut) : PromiseExtended;\n sortBy(keyPath: string, cb?: ThenShortcut) {\n const parts = keyPath.split('.').reverse(),\n lastPart = parts[0],\n lastIndex = parts.length - 1;\n function getval(obj, i) {\n if (i) return getval(obj[parts[i]], i - 1);\n return obj[lastPart];\n }\n var order = this._ctx.dir === \"next\" ? 1 : -1;\n\n function sorter(a, b) {\n var aVal = getval(a, lastIndex),\n bVal = getval(b, lastIndex);\n return aVal < bVal ? -order : aVal > bVal ? order : 0;\n }\n return this.toArray(function (a) {\n return a.sort(sorter);\n }).then(cb);\n }\n\n /** Collection.toArray()\n * \n * https://dexie.org/docs/Collection/Collection.toArray()\n * \n **/\n toArray(cb?): PromiseExtended {\n return this._read(trans => {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAll() or\n // IDBKeyRange.getAll():\n const {valueMapper} = ctx;\n const index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n limit: ctx.limit,\n values: true,\n query: {\n index,\n range: ctx.range\n }\n }).then(({result}) => valueMapper ? result.map(valueMapper) : result);\n } else {\n // Getting array through a cursor.\n const a = [];\n return iter(ctx, item => a.push(item), trans, ctx.table.core).then(()=>a);\n }\n }, cb);\n }\n\n /** Collection.offset()\n * \n * https://dexie.org/docs/Collection/Collection.offset()\n * \n **/\n offset(offset: number) : Collection{\n var ctx = this._ctx;\n if (offset <= 0) return this;\n ctx.offset += offset; // For count()\n if (isPlainKeyRange(ctx)) {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return (cursor, advance) => {\n if (offsetLeft === 0) return true;\n if (offsetLeft === 1) { --offsetLeft; return false; }\n advance(() => {\n cursor.advance(offsetLeft);\n offsetLeft = 0;\n });\n return false;\n };\n });\n } else {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return () => (--offsetLeft < 0);\n });\n }\n return this;\n }\n\n /** Collection.limit()\n * \n * https://dexie.org/docs/Collection/Collection.limit()\n * \n **/\n limit(numRows: number) : Collection {\n this._ctx.limit = Math.min(this._ctx.limit, numRows); // For count()\n addReplayFilter(this._ctx, () => {\n var rowsLeft = numRows;\n return function (cursor, advance, resolve) {\n if (--rowsLeft <= 0) advance(resolve); // Stop after this item has been included\n return rowsLeft >= 0; // If numRows is already below 0, return false because then 0 was passed to numRows initially. Otherwise we wouldnt come here.\n };\n }, true);\n return this;\n }\n\n /** Collection.until()\n * \n * https://dexie.org/docs/Collection/Collection.until()\n * \n **/\n until(filterFunction: (x) => boolean, bIncludeStopEntry?) {\n addFilter(this._ctx, function (cursor, advance, resolve) {\n if (filterFunction(cursor.value)) {\n advance(resolve);\n return bIncludeStopEntry;\n } else {\n return true;\n }\n });\n return this;\n }\n\n /** Collection.first()\n * \n * https://dexie.org/docs/Collection/Collection.first()\n * \n **/\n first(cb?) {\n return this.limit(1).toArray(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.last()\n * \n * https://dexie.org/docs/Collection/Collection.last()\n * \n **/\n last(cb?) {\n return this.reverse().first(cb);\n }\n\n /** Collection.filter()\n * \n * https://dexie.org/docs/Collection/Collection.filter()\n * \n **/\n filter(filterFunction: (x) => boolean): Collection {\n /// function(val){return true/false}\n addFilter(this._ctx, function (cursor) {\n return filterFunction(cursor.value);\n });\n // match filters not used in Dexie.js but can be used by 3rd part libraries to test a\n // collection for a match without querying DB. Used by Dexie.Observable.\n addMatchFilter(this._ctx, filterFunction);\n return this;\n }\n\n /** Collection.and()\n * \n * https://dexie.org/docs/Collection/Collection.and()\n * \n **/\n and(filter: (x) => boolean) {\n return this.filter(filter);\n }\n\n /** Collection.or()\n * \n * https://dexie.org/docs/Collection/Collection.or()\n * \n **/\n or(indexName: string) {\n return new this.db.WhereClause(this._ctx.table, indexName, this);\n }\n\n /** Collection.reverse()\n * \n * https://dexie.org/docs/Collection/Collection.reverse()\n * \n **/\n reverse() {\n this._ctx.dir = (this._ctx.dir === \"prev\" ? \"next\" : \"prev\");\n if (this._ondirectionchange) this._ondirectionchange(this._ctx.dir);\n return this;\n }\n\n /** Collection.desc()\n * \n * https://dexie.org/docs/Collection/Collection.desc()\n * \n **/\n desc() {\n return this.reverse();\n }\n\n /** Collection.eachKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachKey()\n * \n **/\n eachKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.key, cursor); });\n }\n\n /** Collection.eachUniqueKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachUniqueKey()\n * \n **/\n eachUniqueKey(cb?) {\n this._ctx.unique = \"unique\";\n return this.eachKey(cb);\n }\n\n /** Collection.eachPrimaryKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachPrimaryKey()\n * \n **/\n eachPrimaryKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); });\n }\n\n /** Collection.keys()\n * \n * https://dexie.org/docs/Collection/Collection.keys()\n * \n **/\n keys(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.key);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.primaryKeys()\n * \n * https://dexie.org/docs/Collection/Collection.primaryKeys()\n * \n **/\n primaryKeys(cb?) : PromiseExtended {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAllKeys() or\n // IDBKeyRange.getAllKeys():\n return this._read(trans => {\n var index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n values: false,\n limit: ctx.limit,\n query: {\n index,\n range: ctx.range\n }});\n }).then(({result})=>result).then(cb);\n }\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.primaryKey);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.uniqueKeys()\n * \n * https://dexie.org/docs/Collection/Collection.uniqueKeys()\n * \n **/\n uniqueKeys(cb?) {\n this._ctx.unique = \"unique\";\n return this.keys(cb);\n }\n\n /** Collection.firstKey()\n * \n * https://dexie.org/docs/Collection/Collection.firstKey()\n * \n **/\n firstKey(cb?) {\n return this.limit(1).keys(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.lastKey()\n * \n * https://dexie.org/docs/Collection/Collection.lastKey()\n * \n **/\n lastKey(cb?) {\n return this.reverse().firstKey(cb);\n }\n\n /** Collection.distinct()\n * \n * https://dexie.org/docs/Collection/Collection.distinct()\n * \n **/\n distinct() {\n var ctx = this._ctx,\n idx = ctx.index && ctx.table.schema.idxByName[ctx.index];\n if (!idx || !idx.multi) return this; // distinct() only makes differencies on multiEntry indexes.\n var set = {};\n addFilter(this._ctx, function (cursor: DBCoreCursor) {\n var strKey = cursor.primaryKey.toString(); // Converts any Date to String, String to String, Number to String and Array to comma-separated string\n var found = hasOwn(set, strKey);\n set[strKey] = true;\n return !found;\n });\n return this;\n }\n\n //\n // Methods that mutate storage\n //\n\n /** Collection.modify()\n * \n * https://dexie.org/docs/Collection/Collection.modify()\n * \n **/\n modify(changes: UpdateSpec | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n var ctx = this._ctx;\n return this._write(trans => {\n var modifyer: (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean\n if (typeof changes === 'function') {\n // Changes is a function that may update, add or delete propterties or even require a deletion the object itself (delete this.item)\n modifyer = changes as (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean;\n } else {\n // changes is a set of {keyPath: value} and no one is listening to the updating hook.\n var keyPaths = keys(changes);\n var numKeys = keyPaths.length;\n modifyer = function (item) {\n let anythingModified = false;\n for (let i = 0; i < numKeys; ++i) {\n let keyPath = keyPaths[i];\n let val = changes[keyPath];\n let origVal = getByKeyPath(item, keyPath);\n\n if (val instanceof PropModification) {\n setByKeyPath(item, keyPath, val.execute(origVal));\n anythingModified = true;\n } else if (origVal !== val) {\n setByKeyPath(item, keyPath, val); // Adding {keyPath: undefined} means that the keyPath should be deleted. Handled by setByKeyPath\n anythingModified = true;\n }\n }\n return anythingModified;\n };\n }\n\n const coreTable = ctx.table.core;\n const {outbound, extractKey} = coreTable.schema.primaryKey;\n const limit = this.db._options.modifyChunkSize || 200;\n const totalFailures = [];\n let successCount = 0;\n const failedKeys: IndexableType[] = [];\n const applyMutateResult = (expectedCount: number, res: DBCoreMutateResponse) => {\n const {failures, numFailures} = res;\n successCount += expectedCount - numFailures;\n for (let pos of keys(failures)) {\n totalFailures.push(failures[pos]);\n }\n }\n return this.clone().primaryKeys().then(keys => {\n const criteria = isPlainKeyRange(ctx) &&\n ctx.limit === Infinity &&\n (typeof changes !== 'function' || changes === deleteCallback) && {\n index: ctx.index,\n range: ctx.range\n };\n\n const nextChunk = (offset: number) => {\n const count = Math.min(limit, keys.length - offset);\n return coreTable.getMany({\n trans,\n keys: keys.slice(offset, offset + count),\n cache: \"immutable\" // Optimize for 2 things:\n // 1) observability-middleware can track changes better.\n // 2) hooks middleware don't have to query the existing values again when tracking changes.\n // We can use \"immutable\" because we promise to not touch the values we retrieve here!\n }).then(values => {\n const addValues = [];\n const putValues = [];\n const putKeys = outbound ? [] : null;\n const deleteKeys = [];\n for (let i=0; i 0 &&\n coreTable.mutate({trans, type: 'add', values: addValues})\n .then(res => {\n for (let pos in res.failures) {\n // Remove from deleteKeys the key of the object that failed to change its primary key\n deleteKeys.splice(parseInt(pos), 1);\n }\n applyMutateResult(addValues.length, res);\n })\n ).then(()=>(putValues.length > 0 || (criteria && typeof changes === 'object')) &&\n coreTable.mutate({\n trans,\n type: 'put',\n keys: putKeys,\n values: putValues,\n criteria,\n changeSpec: typeof changes !== 'function'\n && changes,\n isAdditionalChunk: offset > 0\n }).then(res=>applyMutateResult(putValues.length, res))\n ).then(()=>(deleteKeys.length > 0 || (criteria && changes === deleteCallback)) &&\n coreTable.mutate({\n trans,\n type: 'delete',\n keys: deleteKeys,\n criteria,\n isAdditionalChunk: offset > 0\n }).then(res=>applyMutateResult(deleteKeys.length, res))\n ).then(()=>{\n return keys.length > offset + count && nextChunk(offset + limit);\n });\n });\n }\n\n return nextChunk(0).then(()=>{\n if (totalFailures.length > 0)\n throw new ModifyError(\"Error modifying one or more objects\", totalFailures, successCount, failedKeys as IndexableTypeArrayReadonly);\n\n return keys.length;\n });\n });\n\n });\n }\n\n /** Collection.delete()\n * \n * https://dexie.org/docs/Collection/Collection.delete()\n * \n **/\n delete() : PromiseExtended {\n var ctx = this._ctx,\n range = ctx.range;\n //deletingHook = ctx.table.hook.deleting.fire,\n //hasDeleteHook = deletingHook !== nop;\n if (isPlainKeyRange(ctx) &&\n (ctx.isPrimKey || range.type === DBCoreRangeType.Any)) // if no range, we'll use clear().\n {\n // May use IDBObjectStore.delete(IDBKeyRange) in this case (Issue #208)\n // For chromium, this is the way most optimized version.\n // For IE/Edge, this could hang the indexedDB engine and make operating system instable\n // (https://gist.github.com/dfahlander/5a39328f029de18222cf2125d56c38f7)\n return this._write(trans => {\n // Our API contract is to return a count of deleted items, so we have to count() before delete().\n const {primaryKey} = ctx.table.core.schema;\n const coreRange = range;\n return ctx.table.core.count({trans, query: {index: primaryKey, range: coreRange}}).then(count => {\n return ctx.table.core.mutate({trans, type: 'deleteRange', range: coreRange})\n .then(({failures, lastResult, results, numFailures}) => {\n if (numFailures) throw new ModifyError(\"Could not delete some values\",\n Object.keys(failures).map(pos => failures[pos]),\n count - numFailures);\n return count - numFailures;\n });\n });\n });\n }\n\n return this.modify(deleteCallback);\n }\n}\n\nconst deleteCallback = (value, ctx) => ctx.value = null;\n","import { Dexie } from '../../classes/dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Collection } from './collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\nimport { mirror } from '../../functions/chaining-functions';\n\n/** Constructs a Collection instance. */\nexport interface CollectionConstructor {\n new(whereClause?: WhereClause | null, keyRangeGenerator?: () => DBCoreKeyRange): Collection;\n prototype: Collection;\n}\n\n/** Generates a Collection constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createCollectionConstructor(db: Dexie) {\n return makeClassConstructor(\n Collection.prototype,\n\n function Collection(\n this: Collection,\n whereClause?: WhereClause | null,\n keyRangeGenerator?: () => DBCoreKeyRange)\n {\n this.db = db;\n let keyRange = AnyRange, error = null;\n if (keyRangeGenerator) try {\n keyRange = keyRangeGenerator();\n } catch (ex) {\n error = ex;\n }\n\n const whereCtx = whereClause._ctx;\n const table = whereCtx.table;\n const readingHook = table.hook.reading.fire;\n this._ctx = {\n table: table,\n index: whereCtx.index,\n isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)),\n range: keyRange,\n keysOnly: false,\n dir: \"next\",\n unique: \"\",\n algorithm: null,\n filter: null,\n replayFilter: null,\n justLimit: true, // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: null,\n offset: 0,\n limit: Infinity,\n error: error, // If set, any promise must be rejected with this error\n or: whereCtx.or,\n valueMapper: readingHook !== mirror ? readingHook : null\n };\n }\n );\n}\n","import { IndexableType } from '../public/types/indexable-type';\n\nexport function simpleCompare(a, b) {\n return a < b ? -1 : a === b ? 0 : 1;\n}\n\nexport function simpleCompareReverse(a, b) {\n return a > b ? -1 : a === b ? 0 : 1;\n}\n","import { WhereClause } from './where-clause';\nimport { Collection } from '../collection';\nimport { STRING_EXPECTED } from '../../globals/constants';\nimport { simpleCompare, simpleCompareReverse } from '../../functions/compare-functions';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange, DBCoreRangeType } from '../../public/types/dbcore';\n\nexport function fail(collectionOrWhereClause: Collection | WhereClause, err, T?) {\n var collection = collectionOrWhereClause instanceof WhereClause ?\n new collectionOrWhereClause.Collection (collectionOrWhereClause) :\n collectionOrWhereClause;\n \n collection._ctx.error = T ? new T(err) : new TypeError(err);\n return collection;\n}\n\nexport function emptyCollection(whereClause: WhereClause) {\n return new whereClause.Collection (whereClause, () => rangeEqual(\"\")).limit(0);\n}\n\nexport function upperFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toUpperCase() :\n (s: string) => s.toLowerCase();\n}\n\nexport function lowerFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toLowerCase() :\n (s: string) => s.toUpperCase();\n}\n\nexport function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) {\n var length = Math.min(key.length, lowerNeedle.length);\n var llp = -1;\n for (var i = 0; i < length; ++i) {\n var lwrKeyChar = lowerKey[i];\n if (lwrKeyChar !== lowerNeedle[i]) {\n if (cmp(key[i], upperNeedle[i]) < 0) return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1);\n if (cmp(key[i], lowerNeedle[i]) < 0) return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1);\n if (llp >= 0) return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1);\n return null;\n }\n if (cmp(key[i], lwrKeyChar) < 0) llp = i;\n }\n if (length < lowerNeedle.length && dir === \"next\") return key + upperNeedle.substr(key.length);\n if (length < key.length && dir === \"prev\") return key.substr(0, upperNeedle.length);\n return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1));\n}\n\nexport function addIgnoreCaseAlgorithm(whereClause: WhereClause, match, needles, suffix) {\n /// \n var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix,\n needlesLen = needles.length;\n if (!needles.every(s => typeof s === 'string')) {\n return fail(whereClause, STRING_EXPECTED);\n }\n function initDirection(dir) {\n upper = upperFactory(dir);\n lower = lowerFactory(dir);\n compare = (dir === \"next\" ? simpleCompare : simpleCompareReverse);\n var needleBounds = needles.map(function (needle){\n return {lower: lower(needle), upper: upper(needle)};\n }).sort(function(a,b) {\n return compare(a.lower, b.lower);\n });\n upperNeedles = needleBounds.map(function (nb){ return nb.upper; });\n lowerNeedles = needleBounds.map(function (nb){ return nb.lower; });\n direction = dir;\n nextKeySuffix = (dir === \"next\" ? \"\" : suffix);\n }\n initDirection(\"next\");\n\n var c = new whereClause.Collection (\n whereClause,\n ()=>createRange(upperNeedles[0], lowerNeedles[needlesLen-1] + suffix)\n );\n\n c._ondirectionchange = function (direction) {\n // This event onlys occur before filter is called the first time.\n initDirection(direction);\n };\n\n var firstPossibleNeedle = 0;\n\n c._addAlgorithm(function (cursor, advance, resolve) {\n /// \n /// \n /// \n var key = cursor.key;\n if (typeof key !== 'string') return false;\n var lowerKey = lower(key);\n if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) {\n return true;\n } else {\n var lowestPossibleCasing = null;\n for (var i=firstPossibleNeedle; i 0) {\n lowestPossibleCasing = casing;\n }\n }\n if (lowestPossibleCasing !== null) {\n advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); });\n } else {\n advance(resolve);\n }\n return false;\n }\n });\n return c;\n}\n\nexport function createRange (lower: IndexableType, upper: IndexableType, lowerOpen?: boolean, upperOpen?: boolean): DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Range,\n lower,\n upper,\n lowerOpen,\n upperOpen\n };\n}\n\nexport function rangeEqual (value: IndexableType) : DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Equal,\n lower: value,\n upper: value\n };\n}\n","import { WhereClause as IWhereClause } from \"../../public/types/where-clause\";\nimport { Collection } from \"../collection\";\nimport { Table } from \"../table\";\nimport { IndexableType } from \"../../public/types/indexable-type\";\nimport { emptyCollection, fail, addIgnoreCaseAlgorithm, createRange, rangeEqual } from './where-clause-helpers';\nimport { INVALID_KEY_ARGUMENT, STRING_EXPECTED, maxString, minKey } from '../../globals/constants';\nimport { getArrayOf, NO_CHAR_ARRAY } from '../../functions/utils';\nimport { exceptions } from '../../errors';\nimport { Dexie } from '../dexie';\nimport { Collection as ICollection} from \"../../public/types/collection\";\n\n/** class WhereClause\n * \n * https://dexie.org/docs/WhereClause/WhereClause\n */\nexport class WhereClause implements IWhereClause {\n db: Dexie;\n _IDBKeyRange: typeof IDBKeyRange;\n _ctx: {\n table: Table;\n index: string;\n or: Collection;\n }\n _cmp: (a: IndexableType, b: IndexableType) => number;\n _ascending: (a: IndexableType, b: IndexableType) => number;\n _descending: (a: IndexableType, b: IndexableType) => number;\n _min: (a: IndexableType, b: IndexableType) => IndexableType;\n _max: (a: IndexableType, b: IndexableType) => IndexableType;\n\n get Collection() {\n return this._ctx.table.db.Collection;\n }\n\n /** WhereClause.between()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.between()\n * \n **/\n between(lower: IndexableType, upper: IndexableType, includeLower?: boolean, includeUpper?: boolean) {\n includeLower = includeLower !== false; // Default to true\n includeUpper = includeUpper === true; // Default to false\n try {\n if ((this._cmp(lower, upper) > 0) ||\n (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper)))\n return emptyCollection(this); // Workaround for idiotic W3C Specification that DataError must be thrown if lower > upper. The natural result would be to return an empty collection.\n return new this.Collection(this, ()=>createRange(lower, upper, !includeLower, !includeUpper));\n } catch (e) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n }\n\n /** WhereClause.equals()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equals()\n * \n **/\n equals(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => rangeEqual(value)) as ICollection;\n }\n\n /** WhereClause.above()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.above()\n * \n **/\n above(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, true));\n }\n\n /** WhereClause.aboveOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.aboveOrEqual()\n * \n **/\n aboveOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, false));\n }\n\n /** WhereClause.below()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.below()\n * \n **/\n below(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value, false, true));\n }\n\n /** WhereClause.belowOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.belowOrEqual()\n * \n **/\n belowOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value));\n }\n\n /** WhereClause.startsWith()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWith()\n * \n **/\n startsWith(str: string) {\n if (typeof str !== 'string') return fail(this, STRING_EXPECTED);\n return this.between(str, str + maxString, true, true);\n }\n\n /** WhereClause.startsWithIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithIgnoreCase()\n * \n **/\n startsWithIgnoreCase(str: string) {\n if (str === \"\") return this.startsWith(str);\n return addIgnoreCaseAlgorithm(this, (x, a) => x.indexOf(a[0]) === 0, [str], maxString);\n }\n\n /** WhereClause.equalsIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equalsIgnoreCase()\n * \n **/\n equalsIgnoreCase(str: string) {\n return addIgnoreCaseAlgorithm(this, (x, a) => x === a[0], [str], \"\");\n }\n\n /** WhereClause.anyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOfIgnoreCase()\n * \n **/\n anyOfIgnoreCase(...values: string[]): Collection;\n anyOfIgnoreCase(values: string[]): Collection;\n anyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.indexOf(x) !== -1, set, \"\");\n }\n\n /** WhereClause.startsWithAnyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOfIgnoreCase()\n * \n **/\n startsWithAnyOfIgnoreCase(...values: string[]): Collection;\n startsWithAnyOfIgnoreCase(values: string[]): Collection;\n startsWithAnyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.some(n => x.indexOf(n) === 0), set, maxString);\n }\n\n /** WhereClause.anyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOf()\n * \n **/\n anyOf(...values: string[]): Collection;\n anyOf(values: string[]): Collection;\n anyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n let compare = this._cmp;\n try { set.sort(compare); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n if (set.length === 0) return emptyCollection(this);\n const c = new this.Collection(this, () => createRange(set[0], set[set.length - 1]));\n\n c._ondirectionchange = direction => {\n compare = (direction === \"next\" ?\n this._ascending :\n this._descending);\n set.sort(compare);\n };\n\n let i = 0;\n c._addAlgorithm((cursor, advance, resolve) => {\n const key = cursor.key;\n while (compare(key, set[i]) > 0) {\n // The cursor has passed beyond this key. Check next.\n ++i;\n if (i === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (compare(key, set[i]) === 0) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => { cursor.continue(set[i]); });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.notEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.notEqual()\n * \n **/\n notEqual(value: IndexableType) {\n return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.noneOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.noneOf()\n * \n **/\n noneOf(...values: string[]): Collection;\n noneOf(values: string[]): Collection;\n noneOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return new this.Collection(this); // Return entire collection.\n try { set.sort(this._ascending); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n // Transform [\"a\",\"b\",\"c\"] to a set of ranges for between/above/below: [[minKey,\"a\"], [\"a\",\"b\"], [\"b\",\"c\"], [\"c\",maxKey]]\n const ranges = set.reduce(\n (res, val) => res ?\n res.concat([[res[res.length - 1][1], val]]) :\n [[minKey, val]],\n null);\n ranges.push([set[set.length - 1], this.db._maxKey]);\n return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.inAnyRange()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.inAnyRange()\n * \n **/\n inAnyRange(\n ranges: ReadonlyArray<{ 0: IndexableType, 1: IndexableType }>,\n options?: { includeLowers?: boolean, includeUppers?: boolean })\n {\n const cmp = this._cmp,\n ascending = this._ascending,\n descending = this._descending,\n min = this._min,\n max = this._max;\n\n if (ranges.length === 0) return emptyCollection(this);\n if (!ranges.every(range =>\n range[0] !== undefined &&\n range[1] !== undefined &&\n ascending(range[0], range[1]) <= 0)) {\n return fail(\n this,\n \"First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower\",\n exceptions.InvalidArgument);\n }\n const includeLowers = !options || options.includeLowers !== false; // Default to true\n const includeUppers = options && options.includeUppers === true; // Default to false\n\n function addRange(ranges, newRange) {\n let i = 0, l = ranges.length;\n for (; i < l; ++i) {\n const range = ranges[i];\n if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) {\n range[0] = min(range[0], newRange[0]);\n range[1] = max(range[1], newRange[1]);\n break;\n }\n }\n if (i === l)\n ranges.push(newRange);\n return ranges;\n }\n\n let sortDirection = ascending;\n function rangeSorter(a, b) { return sortDirection(a[0], b[0]); }\n\n // Join overlapping ranges\n let set;\n try {\n set = ranges.reduce(addRange, []);\n set.sort(rangeSorter);\n } catch (ex) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n\n let rangePos = 0;\n const keyIsBeyondCurrentEntry = includeUppers ?\n key => ascending(key, set[rangePos][1]) > 0 :\n key => ascending(key, set[rangePos][1]) >= 0;\n\n const keyIsBeforeCurrentEntry = includeLowers ?\n key => descending(key, set[rangePos][0]) > 0 :\n key => descending(key, set[rangePos][0]) >= 0;\n\n function keyWithinCurrentRange(key) {\n return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key);\n }\n\n let checkKey = keyIsBeyondCurrentEntry;\n\n const c = new this.Collection(\n this,\n () => createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers));\n\n c._ondirectionchange = direction => {\n if (direction === \"next\") {\n checkKey = keyIsBeyondCurrentEntry;\n sortDirection = ascending;\n } else {\n checkKey = keyIsBeforeCurrentEntry;\n sortDirection = descending;\n }\n set.sort(rangeSorter);\n };\n\n c._addAlgorithm((cursor, advance, resolve) => {\n var key = cursor.key;\n while (checkKey(key)) {\n // The cursor has passed beyond this key. Check next.\n ++rangePos;\n if (rangePos === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (keyWithinCurrentRange(key)) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else if (this._cmp(key, set[rangePos][1]) === 0 || this._cmp(key, set[rangePos][0]) === 0) {\n // includeUpper or includeLower is false so keyWithinCurrentRange() returns false even though we are at range border.\n // Continue to next key but don't include this one.\n return false;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => {\n if (sortDirection === ascending) cursor.continue(set[rangePos][0]);\n else cursor.continue(set[rangePos][1]);\n });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.startsWithAnyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOf()\n * \n **/\n startsWithAnyOf(...prefixes: string[]): Collection;\n startsWithAnyOf(prefixes: string[]): Collection;\n startsWithAnyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n\n if (!set.every(s => typeof s === 'string')) {\n return fail(this, \"startsWithAnyOf() only works with strings\");\n }\n if (set.length === 0) return emptyCollection(this);\n\n return this.inAnyRange(set.map((str: string) => [str, str + maxString]));\n }\n\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { WhereClause } from './where-clause';\nimport { Table } from '../table';\nimport { Collection } from '../collection';\nimport { exceptions } from '../../errors';\nimport { cmp } from '../../functions/cmp';\n\nexport interface WhereClauseConstructor {\n new(table: Table, index?: string, orCollection?: Collection): WhereClause;\n prototype: WhereClause;\n}\n\n/** Generates a WhereClause constructor.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createWhereClauseConstructor(db: Dexie) {\n return makeClassConstructor(\n WhereClause.prototype,\n\n function WhereClause(this: WhereClause, table: Table, index?: string, orCollection?: Collection) {\n this.db = db;\n this._ctx = {\n table: table,\n index: index === \":id\" ? null : index,\n or: orCollection\n };\n this._cmp = this._ascending = cmp;\n this._descending = (a, b) => cmp(b, a);\n this._max = (a, b) => cmp(a,b) > 0 ? a : b;\n this._min = (a, b) => cmp(a,b) < 0 ? a : b;\n this._IDBKeyRange = db._deps.IDBKeyRange;\n if (!this._IDBKeyRange) throw new exceptions.MissingAPI();\n }\n );\n}\n","import { wrap } from \"../helpers/promise\";\n\nexport function eventRejectHandler(reject) {\n return wrap(function (event) {\n preventDefault(event);\n reject (event.target.error);\n return false;\n });\n}\n\nexport function eventSuccessHandler (resolve) {\n return wrap(function (event){\n resolve(event.target.result);\n });\n}\n\nexport function hookedEventRejectHandler (reject) {\n return wrap(function (event) {\n // See comment on hookedEventSuccessHandler() why wrap() is needed only when supporting hooks.\n \n var req = event.target,\n err = req.error,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n hookErrorHandler = ctx && ctx.onerror;\n hookErrorHandler && hookErrorHandler(err);\n preventDefault(event);\n reject (err);\n return false;\n });\n}\n\nexport function hookedEventSuccessHandler(resolve) {\n // wrap() is needed when calling hooks because the rare scenario of:\n // * hook does a db operation that fails immediately (IDB throws exception)\n // For calling db operations on correct transaction, wrap makes sure to set PSD correctly.\n // wrap() will also execute in a virtual tick.\n // * If not wrapped in a virtual tick, direct exception will launch a new physical tick.\n // * If this was the last event in the bulk, the promise will resolve after a physical tick\n // and the transaction will have committed already.\n // If no hook, the virtual tick will be executed in the reject()/resolve of the final promise,\n // because it is always marked with _lib = true when created using Transaction._promise().\n return wrap(function(event) {\n var req = event.target,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n result = ctx.value || req.result, // Pass the object value on updates. The result from IDB is the primary key.\n hookSuccessHandler = ctx && ctx.onsuccess;\n hookSuccessHandler && hookSuccessHandler(result);\n resolve && resolve(result);\n }, resolve);\n}\n\n\nexport function preventDefault(event) {\n if (event.stopPropagation) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.stopPropagation();\n if (event.preventDefault) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.preventDefault();\n}\n\nexport function BulkErrorHandlerCatchAll(errorList, done?, supportHooks?) {\n return (supportHooks ? hookedEventRejectHandler : eventRejectHandler)(e => {\n errorList.push(e);\n done && done();\n });\n}\n\n","import Events from '../helpers/Events';\nimport { GlobalDexieEvents } from '../public/types/db-events';\n\nexport const DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated' as 'storagemutated';\n\n// Name of the global event fired using DOM dispatchEvent (if not in node).\n// Reason for propagating this as a DOM event is for getting reactivity across\n// multiple versions of Dexie within the same app (as long as they are\n// compatible with regards to the event data).\n// If the ObservabilitySet protocol change in a way that would not be backward\n// compatible, make sure also update the event name to a new number at the end\n// so that two Dexie instances of different versions continue to work together\n// - maybe not able to communicate but won't fail due to unexpected data in\n// the detail property of the CustomEvent. If so, also make sure to udpate\n// docs and explain at which Dexie version the new name and format of the event\n// is being used.\nexport const STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1';\n\nexport const globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME) as GlobalDexieEvents;\n","import { Transaction as ITransaction } from '../../public/types/transaction';\nimport { DexiePromise, wrap, rejection } from \"../../helpers/promise\";\nimport { DbSchema } from '../../public/types/db-schema';\nimport { assert, hasOwn } from '../../functions/utils';\nimport { PSD, usePSD } from '../../helpers/promise';\nimport { Dexie } from '../dexie';\nimport { exceptions } from '../../errors';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { preventDefault } from '../../functions/event-wrappers';\nimport { newScope } from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { Table } from '../table';\nimport { globalEvents } from '../../globals/global-events';\n\n/** Transaction\n * \n * https://dexie.org/docs/Transaction/Transaction\n * \n **/\nexport class Transaction implements ITransaction {\n db: Dexie;\n active: boolean;\n mode: IDBTransactionMode;\n chromeTransactionDurability: ChromeTransactionDurability;\n idbtrans: IDBTransaction;\n storeNames: string[];\n explicit?: boolean;\n on: any;\n parent?: Transaction;\n schema: DbSchema;\n _memoizedTables: {[tableName: string]: Table};\n\n _reculock: number;\n _blockedFuncs: { 0: () => any, 1: any }[];\n _resolve: () => void;\n _reject: (Error) => void;\n _waitingFor: DexiePromise; // for waitFor()\n _waitingQueue: Function[]; // for waitFor()\n _spinCount: number; // Just for debugging waitFor()\n _completion: DexiePromise;\n\n //\n // Transaction internal methods (not required by API users, but needed internally and eventually by dexie extensions)\n //\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _lock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n // Temporary set all requests into a pending queue if they are called before database is ready.\n ++this._reculock; // Recursive read/write lock pattern using PSD (Promise Specific Data) instead of TLS (Thread Local Storage)\n if (this._reculock === 1 && !PSD.global) PSD.lockOwnerFor = this;\n return this;\n }\n\n /** Transaction._unlock()\n * \n * Internal method.\n */\n _unlock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n if (--this._reculock === 0) {\n if (!PSD.global) PSD.lockOwnerFor = null;\n while (this._blockedFuncs.length > 0 && !this._locked()) {\n var fnAndPSD = this._blockedFuncs.shift();\n try { usePSD(fnAndPSD[1], fnAndPSD[0]); } catch (e) { }\n }\n }\n return this;\n }\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _locked() {\n // Checks if any write-lock is applied on this transaction.\n // To simplify the Dexie API for extension implementations, we support recursive locks.\n // This is accomplished by using \"Promise Specific Data\" (PSD).\n // PSD data is bound to a Promise and any child Promise emitted through then() or resolve( new Promise() ).\n // PSD is local to code executing on top of the call stacks of any of any code executed by Promise():\n // * callback given to the Promise() constructor (function (resolve, reject){...})\n // * callbacks given to then()/catch()/finally() methods (function (value){...})\n // If creating a new independant Promise instance from within a Promise call stack, the new Promise will derive the PSD from the call stack of the parent Promise.\n // Derivation is done so that the inner PSD __proto__ points to the outer PSD.\n // PSD.lockOwnerFor will point to current transaction object if the currently executing PSD scope owns the lock.\n return this._reculock && PSD.lockOwnerFor !== this;\n }\n\n /** Transaction.create()\n * \n * Internal method.\n * \n */\n create(idbtrans?: IDBTransaction & {[prop: string]: any}) {\n if (!this.mode) return this;\n const idbdb = this.db.idbdb;\n const dbOpenError = this.db._state.dbOpenError;\n assert(!this.idbtrans);\n if (!idbtrans && !idbdb) {\n switch (dbOpenError && dbOpenError.name) {\n case \"DatabaseClosedError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.DatabaseClosed(dbOpenError);\n case \"MissingAPIError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError);\n default:\n // Make it clear that the user operation was not what caused the error - the error had occurred earlier on db.open()!\n throw new exceptions.OpenFailed(dbOpenError);\n }\n }\n if (!this.active) throw new exceptions.TransactionInactive();\n assert(this._completion._state === null); // Completion Promise must still be pending.\n\n idbtrans = this.idbtrans = idbtrans ||\n (this.db.core \n ? this.db.core.transaction(this.storeNames, this.mode as 'readwrite' | 'readonly', { durability: this.chromeTransactionDurability })\n : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })\n ) as IDBTransaction;\n\n idbtrans.onerror = wrap(ev => {\n preventDefault(ev);// Prohibit default bubbling to window.error\n this._reject(idbtrans.error);\n });\n idbtrans.onabort = wrap(ev => {\n preventDefault(ev);\n this.active && this._reject(new exceptions.Abort(idbtrans.error));\n this.active = false;\n this.on(\"abort\").fire(ev);\n });\n idbtrans.oncomplete = wrap(() => {\n this.active = false;\n this._resolve();\n if ('mutatedParts' in idbtrans) {\n globalEvents.storagemutated.fire(idbtrans[\"mutatedParts\"]);\n }\n });\n return this;\n }\n\n /** Transaction._promise()\n * \n * Internal method.\n */\n _promise(\n mode: IDBTransactionMode,\n fn: (resolve, reject, trans: Transaction) => PromiseLike | void,\n bWriteLock?: string | boolean): DexiePromise\n {\n if (mode === 'readwrite' && this.mode !== 'readwrite')\n return rejection(new exceptions.ReadOnly(\"Transaction is readonly\"));\n\n if (!this.active)\n return rejection(new exceptions.TransactionInactive());\n\n if (this._locked()) {\n return new DexiePromise((resolve, reject) => {\n this._blockedFuncs.push([() => {\n this._promise(mode, fn, bWriteLock).then(resolve, reject);\n }, PSD]);\n });\n\n } else if (bWriteLock) {\n return newScope(() => {\n var p = new DexiePromise((resolve, reject) => {\n this._lock();\n const rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p.finally(() => this._unlock());\n p._lib = true;\n return p;\n });\n\n } else {\n var p = new DexiePromise((resolve, reject) => {\n var rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p._lib = true;\n return p;\n }\n }\n\n /** Transaction._root()\n * \n * Internal method. Retrieves the root transaction in the tree of sub transactions.\n */\n _root() {\n return this.parent ? this.parent._root() : this;\n }\n\n /** Transaction.waitFor()\n * \n * Internal method. Can be accessed from the public API through\n * Dexie.waitFor(): https://dexie.org/docs/Dexie/Dexie.waitFor()\n * \n **/\n waitFor(promiseLike: PromiseLike) {\n // Always operate on the root transaction (in case this is a sub stransaction)\n var root = this._root();\n // For stability reasons, convert parameter to promise no matter what type is passed to waitFor().\n // (We must be able to call .then() on it.)\n const promise = DexiePromise.resolve(promiseLike);\n if (root._waitingFor) {\n // Already called waitFor(). Wait for both to complete.\n root._waitingFor = root._waitingFor.then(() => promise);\n } else {\n // We're not in waiting state. Start waiting state.\n root._waitingFor = promise;\n root._waitingQueue = [];\n // Start interacting with indexedDB until promise completes:\n var store = root.idbtrans.objectStore(root.storeNames[0]);\n (function spin() {\n ++root._spinCount; // For debugging only\n while (root._waitingQueue.length) (root._waitingQueue.shift())();\n if (root._waitingFor) store.get(-Infinity).onsuccess = spin;\n }());\n }\n var currentWaitPromise = root._waitingFor;\n return new DexiePromise((resolve, reject) => {\n promise.then(\n res => root._waitingQueue.push(wrap(resolve.bind(null, res))),\n err => root._waitingQueue.push(wrap(reject.bind(null, err)))\n ).finally(() => {\n if (root._waitingFor === currentWaitPromise) {\n // No one added a wait after us. Safe to stop the spinning.\n root._waitingFor = null;\n }\n });\n });\n } \n\n /** Transaction.abort()\n * \n * https://dexie.org/docs/Transaction/Transaction.abort()\n */\n abort() {\n if (this.active) {\n this.active = false;\n if (this.idbtrans) this.idbtrans.abort();\n this._reject(new exceptions.Abort());\n }\n }\n\n /** Transaction.table()\n * \n * https://dexie.org/docs/Transaction/Transaction.table()\n */\n table(tableName: string) {\n const memoizedTables = (this._memoizedTables || (this._memoizedTables = {}));\n if (hasOwn(memoizedTables, tableName))\n return memoizedTables[tableName];\n const tableSchema = this.schema[tableName];\n if (!tableSchema) {\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\"); \n }\n\n const transactionBoundTable = new this.db.Table(tableName, tableSchema, this);\n transactionBoundTable.core = this.db.core.table(tableName);\n memoizedTables[tableName] = transactionBoundTable;\n return transactionBoundTable;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Transaction } from './transaction';\nimport { DbSchema } from '../../public/types/db-schema';\nimport Events from '../../helpers/Events';\nimport Promise, { rejection } from '../../helpers/promise';\n\nexport interface TransactionConstructor {\n new (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction) : T;\n prototype: T;\n}\n\n/** Generates a Transaction constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTransactionConstructor(db: Dexie) {\n return makeClassConstructor>(\n Transaction.prototype,\n function Transaction (\n this: Transaction,\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction)\n {\n this.db = db;\n this.mode = mode;\n this.storeNames = storeNames;\n this.schema = dbschema;\n this.chromeTransactionDurability = chromeTransactionDurability;\n this.idbtrans = null;\n this.on = Events(this, \"complete\", \"error\", \"abort\");\n this.parent = parent || null;\n this.active = true;\n this._reculock = 0;\n this._blockedFuncs = [];\n this._resolve = null;\n this._reject = null;\n this._waitingFor = null;\n this._waitingQueue = null;\n this._spinCount = 0; // Just for debugging waitFor()\n this._completion = new Promise ((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n \n this._completion.then(\n ()=> {\n this.active = false;\n this.on.complete.fire();\n },\n e => {\n var wasActive = this.active;\n this.active = false;\n this.on.error.fire(e);\n this.parent ?\n this.parent._reject(e) :\n wasActive && this.idbtrans && this.idbtrans.abort();\n return rejection(e); // Indicate we actually DO NOT catch this error.\n });\n \n });\n}\n","import { IndexSpec } from '../public/types/index-spec';\n\nexport function createIndexSpec(\n name: string,\n keyPath: string | string[],\n unique: boolean,\n multi: boolean,\n auto: boolean,\n compound: boolean,\n isPrimKey: boolean\n): IndexSpec {\n return {\n name,\n keyPath,\n unique,\n multi,\n auto,\n compound,\n src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? \"++\" : \"\") + nameFromKeyPath(keyPath)\n }\n}\n\nexport function nameFromKeyPath (keyPath?: string | string[]): string {\n return typeof keyPath === 'string' ?\n keyPath :\n keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : \"\";\n}\n","import { IndexSpec } from '../public/types/index-spec';\nimport { TableSchema } from '../public/types/table-schema';\nimport { createIndexSpec } from './index-spec';\nimport { arrayToObject } from '../functions/utils';\n\nexport function createTableSchema (\n name: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n): TableSchema {\n return {\n name,\n primKey,\n indexes,\n mappedClass: null,\n idxByName: arrayToObject(indexes, index => [index.name, index])\n };\n}\n","import { maxString } from '../globals/constants';\n\nexport function safariMultiStoreFix(storeNames: string[]) {\n return storeNames.length === 1 ? storeNames[0] : storeNames;\n}\n\nexport function getNativeGetDatabaseNamesFn(indexedDB) {\n var fn = indexedDB && (indexedDB.getDatabaseNames || indexedDB.webkitGetDatabaseNames);\n return fn && fn.bind(indexedDB);\n}\n\nexport let getMaxKey = (IdbKeyRange: typeof IDBKeyRange) => {\n try {\n IdbKeyRange.only([[]]);\n getMaxKey = () => [[]];\n return [[]];\n } catch (e) {\n getMaxKey = () => maxString;\n return maxString;\n }\n}\n","import { getByKeyPath } from '../functions/utils';\n\nexport function getKeyExtractor (keyPath: null | string | string[]) : (a: any) => any {\n if (keyPath == null) {\n return () => undefined;\n } else if (typeof keyPath === 'string') {\n return getSinglePathKeyExtractor(keyPath);\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n\nexport function getSinglePathKeyExtractor(keyPath: string) {\n const split = keyPath.split('.');\n if (split.length === 1) {\n return obj => obj[keyPath];\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n","import {\n DBCore,\n DBCoreCursor,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryResponse,\n DBCoreRangeType,\n DBCoreSchema,\n DBCoreTableSchema,\n DBCoreTable,\n DBCoreMutateResponse,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { eventRejectHandler, preventDefault } from '../functions/event-wrappers';\nimport { wrap } from '../helpers/promise';\nimport { getMaxKey } from '../functions/quirks';\nimport { getKeyExtractor } from './get-key-extractor';\n\nexport function arrayify(arrayLike: {length: number, [index: number]: T}): T[] {\n return [].slice.call(arrayLike);\n}\nexport function pick(obj: T, props: Prop[]): Pick {\n const result = {} as Pick;\n props.forEach(prop => result[prop] = obj[prop]);\n return result;\n}\n\nlet _id_counter = 0;\n\nexport function getKeyPathAlias(keyPath: null | string | string[]) {\n return keyPath == null ?\n \":id\" :\n typeof keyPath === 'string' ?\n keyPath :\n `[${keyPath.join('+')}]`;\n}\n\nexport function createDBCore (\n db: IDBDatabase,\n IdbKeyRange: typeof IDBKeyRange,\n tmpTrans: IDBTransaction) : DBCore\n{\n function extractSchema(db: IDBDatabase, trans: IDBTransaction) : {schema: DBCoreSchema, hasGetAll: boolean} {\n const tables = arrayify(db.objectStoreNames);\n return {\n schema: {\n name: db.name,\n tables: tables.map(table => trans.objectStore(table)).map(store => {\n const {keyPath, autoIncrement} = store;\n const compound = isArray(keyPath);\n const outbound = keyPath == null;\n const indexByKeyPath: {[keyPathAlias: string]: DBCoreIndex} = {};\n const result = {\n name: store.name,\n primaryKey: {\n name: null,\n isPrimaryKey: true,\n outbound,\n compound,\n keyPath,\n autoIncrement,\n unique: true,\n extractKey: getKeyExtractor(keyPath)\n } as DBCoreIndex,\n indexes: arrayify(store.indexNames).map(indexName => store.index(indexName))\n .map(index => {\n const {name, unique, multiEntry, keyPath} = index;\n const compound = isArray(keyPath);\n const result: DBCoreIndex = {\n name,\n compound,\n keyPath,\n unique,\n multiEntry,\n extractKey: getKeyExtractor(keyPath)\n };\n indexByKeyPath[getKeyPathAlias(keyPath)] = result;\n return result;\n }),\n getIndexByKeyPath: (keyPath: null | string | string[]) => indexByKeyPath[getKeyPathAlias(keyPath)]\n };\n indexByKeyPath[\":id\"] = result.primaryKey;\n if (keyPath != null) {\n indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey;\n }\n return result;\n })\n },\n hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) &&\n !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604) // Bug with getAll() on Safari ver<604. See discussion following PR #579\n };\n }\n\n function makeIDBKeyRange (range: DBCoreKeyRange) : IDBKeyRange | null {\n if (range.type === DBCoreRangeType.Any) return null;\n if (range.type === DBCoreRangeType.Never) throw new Error(\"Cannot convert never type to IDBKeyRange\");\n const {lower, upper, lowerOpen, upperOpen} = range;\n const idbRange = lower === undefined ?\n upper === undefined ?\n null : //IDBKeyRange.lowerBound(-Infinity, false) : // Any range (TODO: Should we return null instead?)\n IdbKeyRange.upperBound(upper, !!upperOpen) : // below\n upper === undefined ?\n IdbKeyRange.lowerBound(lower, !!lowerOpen) : // above\n IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen);\n return idbRange;\n }\n\n function createDbCoreTable(tableSchema: DBCoreTableSchema): DBCoreTable {\n const tableName = tableSchema.name;\n\n function mutate ({trans, type, keys, values, range}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const outbound = store.keyPath == null;\n const isAddOrPut = type === \"put\" || type === \"add\";\n if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange')\n throw new Error (\"Invalid operation type: \" + type);\n\n const {length} = keys || values || {length: 1}; // keys.length if keys. values.length if values. 1 if range.\n if (keys && values && keys.length !== values.length) {\n throw new Error(\"Given keys array must have same length as given values array.\");\n }\n if (length === 0)\n // No items to write. Don't even bother!\n return resolve({numFailures: 0, failures: {}, results: [], lastResult: undefined});\n\n let req: IDBRequest;\n const reqs: IDBRequest[] = [];\n \n const failures: {[operationNumber: number]: Error} = [];\n let numFailures = 0;\n const errorHandler = \n event => {\n ++numFailures;\n preventDefault(event);\n };\n \n if (type === 'deleteRange') {\n // Here the argument is the range\n if (range.type === DBCoreRangeType.Never)\n return resolve({numFailures, failures, results: [], lastResult: undefined}); // Deleting the Never range shoulnt do anything.\n if (range.type === DBCoreRangeType.Any)\n reqs.push(req = store.clear()); // Deleting the Any range is equivalent to store.clear()\n else\n reqs.push(req = store.delete(makeIDBKeyRange(range)));\n } else {\n // No matter add, put or delete - find out arrays of first and second arguments to it.\n const [args1, args2] = isAddOrPut ?\n outbound ?\n [values, keys] :\n [values, null] :\n [keys, null];\n\n if (isAddOrPut) {\n for (let i=0; i {\n const lastResult = event.target.result;\n reqs.forEach((req, i) => req.error != null && (failures[i] = req.error));\n resolve({\n numFailures,\n failures,\n results: type === \"delete\" ? keys : reqs.map(req => req.result),\n lastResult\n });\n };\n \n req.onerror = event => { // wrap() not needed. All paths calling outside will wrap!\n errorHandler(event);\n done(event);\n };\n \n req.onsuccess = done;\n });\n }\n \n function openCursor ({trans, values, query, reverse, unique}: DBCoreOpenCursorRequest): Promise\n {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n // source\n const source = index.isPrimaryKey ?\n store :\n store.index(index.name);\n // direction\n const direction = reverse ?\n unique ?\n \"prevunique\" :\n \"prev\" :\n unique ?\n \"nextunique\" :\n \"next\";\n // request\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(makeIDBKeyRange(range), direction) :\n source.openKeyCursor(makeIDBKeyRange(range), direction);\n \n // iteration\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = wrap(ev => {\n\n const cursor = req.result as unknown as DBCoreCursor;\n if (!cursor) {\n resolve(null);\n return;\n }\n (cursor as any).___id = ++_id_counter;\n (cursor as any).done = false;\n const _cursorContinue = cursor.continue.bind(cursor);\n let _cursorContinuePrimaryKey = cursor.continuePrimaryKey;\n if (_cursorContinuePrimaryKey) _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor);\n const _cursorAdvance = cursor.advance.bind(cursor);\n const doThrowCursorIsNotStarted = ()=>{throw new Error(\"Cursor not started\");}\n const doThrowCursorIsStopped = ()=>{throw new Error(\"Cursor not stopped\");}\n (cursor as any).trans = trans;\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted;\n cursor.fail = wrap(reject);\n cursor.next = function (this: DBCoreCursor) {\n // next() must work with \"this\" pointer in order to function correctly for ProxyCursors (derived objects)\n // without having to re-define next() on each child.\n let gotOne = 1;\n return this.start(() => gotOne-- ? this.continue() : this.stop()).then(() => this);\n };\n cursor.start = (callback) => {\n //console.log(\"Starting cursor\", (cursor as any).___id);\n const iterationPromise = new Promise((resolveIteration, rejectIteration) =>{\n resolveIteration = wrap(resolveIteration);\n req.onerror = eventRejectHandler(rejectIteration);\n cursor.fail = rejectIteration;\n cursor.stop = value => {\n //console.log(\"Cursor stop\", cursor);\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped;\n resolveIteration(value);\n };\n });\n // Now change req.onsuccess to a callback that doesn't call initCursor but just observer.next()\n const guardedCallback = () => {\n if (req.result) {\n //console.log(\"Next result\", cursor);\n try {\n callback();\n } catch (err) {\n cursor.fail(err);\n }\n } else {\n (cursor as any).done = true;\n cursor.start = ()=>{throw new Error(\"Cursor behind last entry\");}\n cursor.stop();\n }\n }\n req.onsuccess = wrap(ev => {\n //cursor.continue = _cursorContinue;\n //cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n //cursor.advance = _cursorAdvance;\n req.onsuccess = guardedCallback;\n guardedCallback();\n });\n cursor.continue = _cursorContinue;\n cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n cursor.advance = _cursorAdvance;\n guardedCallback();\n return iterationPromise;\n };\n resolve(cursor);\n }, reject); \n });\n }\n \n function query (hasGetAll: boolean) {\n return (request: DBCoreQueryRequest) => {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {trans, values, limit, query} = request;\n const nonInfinitLimit = limit === Infinity ? undefined : limit;\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n if (limit === 0) return resolve({result: []});\n if (hasGetAll) {\n const req = values ?\n (source as any).getAll(idbKeyRange, nonInfinitLimit) :\n (source as any).getAllKeys(idbKeyRange, nonInfinitLimit);\n req.onsuccess = event => resolve({result: event.target.result});\n req.onerror = eventRejectHandler(reject);\n } else {\n let count = 0;\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(idbKeyRange) :\n source.openKeyCursor(idbKeyRange)\n const result = [];\n req.onsuccess = event => {\n const cursor = req.result as IDBCursorWithValue;\n if (!cursor) return resolve({result});\n result.push(values ? cursor.value : cursor.primaryKey);\n if (++count === limit) return resolve({result});\n cursor.continue();\n };\n req.onerror = eventRejectHandler(reject);\n }\n });\n };\n }\n \n return {\n name: tableName,\n schema: tableSchema,\n \n mutate,\n\n getMany ({trans, keys}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const length = keys.length;\n const result = new Array(length);\n let keyCount = 0;\n let callbackCount = 0;\n let valueCount = 0;\n let req: IDBRequest & {_pos?: number};\n \n const successHandler = event => {\n const req = event.target;\n if ((result[req._pos] = req.result) != null) ++valueCount;\n if (++callbackCount === keyCount) resolve(result);\n };\n const errorHandler = eventRejectHandler(reject);\n \n for (let i=0; i((resolve, reject) => {\n resolve = wrap (resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const req = store.get(key);\n req.onsuccess = event => resolve((event.target as any).result);\n req.onerror = eventRejectHandler(reject);\n });\n },\n\n query: query(hasGetAll),\n \n openCursor,\n\n count ({query, trans}) {\n const {index, range} = query;\n return new Promise((resolve, reject) => {\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n const req = idbKeyRange ? source.count(idbKeyRange) : source.count();\n req.onsuccess = wrap(ev => resolve((ev.target as IDBRequest).result));\n req.onerror = eventRejectHandler(reject);\n });\n }\n };\n }\n\n const {schema, hasGetAll} = extractSchema(db, tmpTrans);\n const tables = schema.tables.map(tableSchema => createDbCoreTable(tableSchema));\n const tableMap: {[name: string]: DBCoreTable} = {};\n tables.forEach(table => tableMap[table.name] = table);\n return {\n stack: \"dbcore\",\n \n transaction: db.transaction.bind(db),\n\n table(name: string) {\n const result = tableMap[name];\n if (!result) throw new Error(`Table '${name}' not found`);\n return tableMap[name];\n },\n\n MIN_KEY: -Infinity,\n\n MAX_KEY: getMaxKey(IdbKeyRange),\n\n schema\n\n };\n}\n","import { Dexie } from './';\nimport { createDBCore } from '../../dbcore/dbcore-indexeddb';\nimport { DBCore } from '../../public/types/dbcore';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { DexieStacks, Middleware } from '../../public/types/middleware';\nimport { exceptions } from '../../errors';\n\nfunction createMiddlewareStack(\n stackImpl: {stack: string},\n middlewares: Middleware<{stack: string}>[]): TStack {\n return middlewares.reduce((down, {create}) => ({...down, ...create(down)}), stackImpl) as TStack;\n} \n\nfunction createMiddlewareStacks(\n middlewares: {[StackName in keyof DexieStacks]?: Middleware[]},\n idbdb: IDBDatabase,\n {IDBKeyRange, indexedDB}: DexieDOMDependencies,\n tmpTrans: IDBTransaction): {[StackName in keyof DexieStacks]?: DexieStacks[StackName]}\n{\n const dbcore = createMiddlewareStack(\n createDBCore(idbdb, IDBKeyRange, tmpTrans),\n middlewares.dbcore);\n \n // TODO: Create other stacks the same way as above. They might be dependant on the result\n // of creating dbcore stack.\n\n return {\n dbcore\n };\n}\n\nexport function generateMiddlewareStacks(db: Dexie, tmpTrans: IDBTransaction) {\n const idbdb = tmpTrans.db;\n const stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans);\n db.core = stacks.dbcore!;\n db.tables.forEach(table => {\n const tableName = table.name;\n if (db.core.schema.tables.some(tbl => tbl.name === tableName)) {\n table.core = db.core.table(tableName);\n if (db[tableName] instanceof db.Table) {\n db[tableName].core = table.core;\n }\n }\n });\n}\n","import { Dexie } from '../dexie';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { _global } from \"../../globals/global\";\nimport { setProp, keys, slice, isArray, shallowClone, isAsyncFunction, defineProperty, getPropertyDescriptor } from '../../functions/utils';\nimport { Transaction } from '../transaction';\nimport { Version } from './version';\nimport Promise, { PSD, newScope, NativePromise, decrementExpectedAwaits, incrementExpectedAwaits } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { IndexSpec } from '../../public/types/index-spec';\nimport { createIndexSpec, nameFromKeyPath } from '../../helpers/index-spec';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { generateMiddlewareStacks } from '../dexie/generate-middleware-stacks';\nimport { debug } from '../../helpers/debug';\nimport { PromiseExtended } from '../../public/types/promise-extended';\n\nexport function setApiOnPlace(db: Dexie, objs: Object[], tableNames: string[], dbschema: DbSchema) {\n tableNames.forEach(tableName => {\n const schema = dbschema[tableName];\n objs.forEach(obj => {\n const propDesc = getPropertyDescriptor(obj, tableName);\n if (!propDesc || (\"value\" in propDesc && propDesc.value === undefined)) {\n // Either the prop is not declared, or it is initialized to undefined.\n if (obj === db.Transaction.prototype || obj instanceof db.Transaction) {\n // obj is a Transaction prototype (or prototype of a subclass to Transaction)\n // Make the API a getter that returns this.table(tableName)\n setProp(obj, tableName, {\n get(this: Transaction) { return this.table(tableName); },\n set(value: any) {\n // Issue #1039\n // Let \"this.schema = dbschema;\" and other props in transaction constructor work even if there's a name collision with the table name.\n defineProperty(this, tableName, {value, writable: true, configurable: true, enumerable: true});\n }\n });\n } else {\n // Table will not be bound to a transaction (will use Dexie.currentTransaction)\n obj[tableName] = new db.Table(tableName, schema);\n }\n }\n });\n });\n}\n\nexport function removeTablesApi(db: Dexie, objs: Object[]) {\n objs.forEach(obj => {\n for (let key in obj) {\n if (obj[key] instanceof db.Table) delete obj[key];\n }\n });\n}\n\nexport function lowerVersionFirst(a: Version, b: Version) {\n return a._cfg.version - b._cfg.version;\n}\n\nexport function runUpgraders(db: Dexie, oldVersion: number, idbUpgradeTrans: IDBTransaction, reject) {\n const globalSchema = db._dbSchema;\n if (idbUpgradeTrans.objectStoreNames.contains('$meta') && !globalSchema.$meta) {\n globalSchema.$meta = createTableSchema(\"$meta\", parseIndexSyntax(\"\")[0], []);\n db._storeNames.push('$meta');\n }\n const trans = db._createTransaction('readwrite', db._storeNames, globalSchema);\n trans.create(idbUpgradeTrans);\n trans._completion.catch(reject);\n const rejectTransaction = trans._reject.bind(trans);\n const transless = PSD.transless || PSD;\n newScope(() => {\n PSD.trans = trans;\n PSD.transless = transless;\n if (oldVersion === 0) {\n // Create tables:\n keys(globalSchema).forEach(tableName => {\n createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes);\n });\n generateMiddlewareStacks(db, idbUpgradeTrans);\n Promise.follow(() => db.on.populate.fire(trans)).catch(rejectTransaction);\n } else {\n generateMiddlewareStacks(db, idbUpgradeTrans);\n return getExistingVersion(db, trans, oldVersion)\n .then(oldVersion => updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans))\n .catch(rejectTransaction);\n }\n });\n}\n\nexport type UpgradeQueueItem = (idbtrans: IDBTransaction) => PromiseLike | void;\n\nexport function patchCurrentVersion(db: Dexie, idbUpgradeTrans: IDBTransaction) {\n createMissingTables(db._dbSchema, idbUpgradeTrans);\n if (idbUpgradeTrans.db.version % 10 === 0 && !idbUpgradeTrans.objectStoreNames.contains('$meta')) {\n // Rolled over to the next 10-ies due to many schema upgrades without bumping version.\n // No problem! We pin the database to its expected version by adding the $meta table so that next\n // time the programmer bumps the version and attaches, an upgrader, that upgrader will indeed run,\n // as well any further upgraders coming after that.\n idbUpgradeTrans.db.createObjectStore('$meta').add(Math.ceil((idbUpgradeTrans.db.version / 10) - 1), 'version');\n }\n const globalSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n adjustToExistingIndexNames(db, db._dbSchema, idbUpgradeTrans);\n const diff = getSchemaDiff(globalSchema, db._dbSchema);\n for (const tableChange of diff.change) {\n if (tableChange.change.length || tableChange.recreate) {\n console.warn(`Unable to patch indexes of table ${tableChange.name} because it has changes on the type of index or primary key.`);\n return;\n }\n const store = idbUpgradeTrans.objectStore(tableChange.name);\n tableChange.add.forEach(idx => {\n if (debug) console.debug(`Dexie upgrade patch: Creating missing index ${tableChange.name}.${idx.src}`);\n addIndex(store, idx);\n });\n }\n}\n\nfunction getExistingVersion(db: Dexie, trans: Transaction, oldVersion: number): PromiseExtended {\n // In normal case, existing version is the native installed version divided by 10.\n // However, in case more than 10 schema changes have been made on the same version (such as while\n // developing an app), the native version may have passed beyond a multiple of 10 within the same version.\n // When that happens, a table $meta will have been created, containing a single entry with key \"version\"\n // and the value of the real old version to use when running upgraders going forward.\n if (trans.storeNames.includes('$meta')) {\n return trans.table('$meta').get('version').then(metaVersion => {\n return metaVersion != null ? metaVersion : oldVersion\n })\n } else {\n return Promise.resolve(oldVersion);\n }\n}\n\nfunction updateTablesAndIndexes(\n db: Dexie,\n oldVersion: number,\n trans: Transaction,\n idbUpgradeTrans: IDBTransaction)\n{\n // Upgrade version to version, step-by-step from oldest to newest version.\n // Each transaction object will contain the table set that was current in that version (but also not-yet-deleted tables from its previous version)\n const queue: UpgradeQueueItem[] = [];\n const versions = db._versions;\n let globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n let anyContentUpgraderHasRun = false;\n \n const versToRun = versions.filter(v => v._cfg.version >= oldVersion);\n if (versToRun.length === 0) {\n // Important not to continue at this point.\n // Coming here means we've already patched schema in patchCurrentVersion() after having\n // incremented native version to a value above the declared highest version.\n // When being in this mode, it means that there might be different versions the db competing\n // about it with different version of the schema. Therefore, we must avoid deleting tables\n // or indexes here so that both versions can co-exist until the application has been upgraded to\n // a version that declares no lower than the native version.\n // If after that, a downgrade happens again, we'll end up here again, accepting both versions\n // And we'll stay in this state until app developer releases a new declared version.\n return Promise.resolve(); \n }\n \n versToRun.forEach(version => {\n queue.push(() => {\n const oldSchema = globalSchema;\n const newSchema = version._cfg.dbschema;\n adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans);\n adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans);\n\n globalSchema = db._dbSchema = newSchema;\n\n const diff = getSchemaDiff(oldSchema, newSchema);\n // Add tables \n diff.add.forEach(tuple => {\n createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes);\n });\n // Change tables\n diff.change.forEach(change => {\n if (change.recreate) {\n throw new exceptions.Upgrade(\"Not yet support for changing primary key\");\n } else {\n const store = idbUpgradeTrans.objectStore(change.name);\n // Add indexes\n change.add.forEach(idx => addIndex(store, idx));\n // Update indexes\n change.change.forEach(idx => {\n store.deleteIndex(idx.name);\n addIndex(store, idx);\n });\n // Delete indexes\n change.del.forEach(idxName => store.deleteIndex(idxName));\n }\n });\n\n const contentUpgrade = version._cfg.contentUpgrade;\n\n if (contentUpgrade && version._cfg.version > oldVersion) {\n // Update db.core with new tables and indexes:\n generateMiddlewareStacks(db, idbUpgradeTrans);\n trans._memoizedTables = {}; // Invalidate memoization as transaction shape may change between versions.\n\n anyContentUpgraderHasRun = true;\n\n // Add to-be-deleted tables to contentUpgrade transaction\n let upgradeSchema = shallowClone(newSchema);\n diff.del.forEach(table => {\n upgradeSchema[table] = oldSchema[table];\n });\n\n // Safe to affect Transaction.prototype globally in this moment,\n // because when this code runs, there may not be any other code\n // that can access any transaction instance, else than this particular\n // upgrader function.\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema), upgradeSchema);\n trans.schema = upgradeSchema;\n\n // Support for native async await.\n const contentUpgradeIsAsync = isAsyncFunction(contentUpgrade);\n if (contentUpgradeIsAsync) {\n incrementExpectedAwaits();\n }\n \n let returnValue: any;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = contentUpgrade(trans);\n if (returnValue) {\n if (contentUpgradeIsAsync) {\n // contentUpgrade is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n }\n }\n });\n return (returnValue && typeof returnValue.then === 'function' ?\n Promise.resolve(returnValue) : promiseFollowed.then(()=>returnValue));\n }\n });\n queue.push(idbtrans => {\n const newSchema = version._cfg.dbschema;\n // Delete old tables\n deleteRemovedTables(newSchema, idbtrans);\n // Restore the final API\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema);\n trans.schema = db._dbSchema;\n });\n // Maintain the $meta table after this version's tables and indexes has been created and content upgraders have run.\n queue.push(idbtrans => {\n if (db.idbdb.objectStoreNames.contains('$meta')) {\n if (Math.ceil(db.idbdb.version / 10) === version._cfg.version) {\n // Remove $meta table if it's no more needed - we are in line with the native version\n db.idbdb.deleteObjectStore('$meta');\n delete db._dbSchema.$meta;\n db._storeNames = db._storeNames.filter(name => name !== '$meta');\n } else {\n // We're still not in line with the native version. Make sure to update the virtual version\n // to the successfully run version\n idbtrans.objectStore('$meta').put(version._cfg.version, 'version');\n }\n }\n }); \n });\n\n // Now, create a queue execution engine\n function runQueue() {\n return queue.length ? Promise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) :\n Promise.resolve();\n }\n\n return runQueue().then(() => {\n createMissingTables(globalSchema, idbUpgradeTrans); // At last, make sure to create any missing tables. (Needed by addons that add stores to DB without specifying version)\n });\n}\n\nexport interface SchemaDiff {\n del: string[],\n add: [string, TableSchema][];\n change: TableSchemaDiff[];\n}\n\nexport interface TableSchemaDiff {\n name: string,\n recreate: boolean,\n del: string[],\n add: IndexSpec[],\n change: IndexSpec[]\n}\n\nexport function getSchemaDiff(oldSchema: DbSchema, newSchema: DbSchema): SchemaDiff {\n const diff: SchemaDiff = {\n del: [], // Array of table names\n add: [], // Array of [tableName, newDefinition]\n change: [] // Array of {name: tableName, recreate: newDefinition, del: delIndexNames, add: newIndexDefs, change: changedIndexDefs}\n };\n let table: string;\n for (table in oldSchema) {\n if (!newSchema[table]) diff.del.push(table);\n }\n for (table in newSchema) {\n const oldDef = oldSchema[table],\n newDef = newSchema[table];\n if (!oldDef) {\n diff.add.push([table, newDef]);\n } else {\n const change = {\n name: table,\n def: newDef,\n recreate: false,\n del: [],\n add: [],\n change: []\n };\n if (\n (\n // compare keyPaths no matter if string or string[]\n // compare falsy keypaths same no matter if they are null or empty string.\n ''+(oldDef.primKey.keyPath||'')\n ) !== (\n ''+(newDef.primKey.keyPath||'')\n ) ||\n // Compare the autoIncrement flag also\n (oldDef.primKey.auto !== newDef.primKey.auto))\n {\n // Primary key has changed. Remove and re-add table.\n change.recreate = true;\n diff.change.push(change);\n } else {\n // Same primary key. Just find out what differs:\n const oldIndexes = oldDef.idxByName;\n const newIndexes = newDef.idxByName;\n let idxName: string;\n for (idxName in oldIndexes) {\n if (!newIndexes[idxName]) change.del.push(idxName);\n }\n for (idxName in newIndexes) {\n const oldIdx = oldIndexes[idxName],\n newIdx = newIndexes[idxName];\n if (!oldIdx) change.add.push(newIdx);\n else if (oldIdx.src !== newIdx.src) change.change.push(newIdx);\n }\n if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) {\n diff.change.push(change);\n }\n }\n }\n }\n return diff;\n}\n\nexport function createTable(\n idbtrans: IDBTransaction,\n tableName: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n) {\n const store = idbtrans.db.createObjectStore(\n tableName,\n primKey.keyPath ?\n { keyPath: primKey.keyPath, autoIncrement: primKey.auto } :\n { autoIncrement: primKey.auto }\n );\n indexes.forEach(idx => addIndex(store, idx));\n return store;\n}\n\nexport function createMissingTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n keys(newSchema).forEach(tableName => {\n if (!idbtrans.db.objectStoreNames.contains(tableName)) {\n if (debug) console.debug('Dexie: Creating missing table', tableName);\n createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes);\n }\n });\n}\n\nexport function deleteRemovedTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n [].slice.call(idbtrans.db.objectStoreNames).forEach(storeName =>\n newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName));\n}\n\nexport function addIndex(store: IDBObjectStore, idx: IndexSpec) {\n store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi });\n}\n\nfunction buildGlobalSchema(\n db: Dexie,\n idbdb: IDBDatabase,\n tmpTrans: IDBTransaction\n) {\n const globalSchema = {};\n const dbStoreNames = slice(idbdb.objectStoreNames, 0);\n dbStoreNames.forEach(storeName => {\n const store = tmpTrans.objectStore(storeName);\n let keyPath = store.keyPath;\n const primKey = createIndexSpec(\n nameFromKeyPath(keyPath),\n keyPath || \"\",\n true,\n false,\n !!store.autoIncrement,\n keyPath && typeof keyPath !== \"string\",\n true\n );\n const indexes: IndexSpec[] = [];\n for (let j = 0; j < store.indexNames.length; ++j) {\n const idbindex = store.index(store.indexNames[j]);\n keyPath = idbindex.keyPath;\n var index = createIndexSpec(\n idbindex.name,\n keyPath,\n !!idbindex.unique,\n !!idbindex.multiEntry,\n false,\n keyPath && typeof keyPath !== \"string\",\n false\n );\n indexes.push(index);\n }\n globalSchema[storeName] = createTableSchema(storeName, primKey, indexes);\n });\n return globalSchema;\n}\n\nexport function readGlobalSchema(db: Dexie, idbdb: IDBDatabase, tmpTrans: IDBTransaction) {\n db.verno = idbdb.version / 10;\n const globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans);\n db._storeNames = slice(idbdb.objectStoreNames, 0);\n setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema);\n}\n\nexport function verifyInstalledSchema(db: Dexie, tmpTrans: IDBTransaction): boolean {\n const installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans);\n const diff = getSchemaDiff(installedSchema, db._dbSchema);\n return !(diff.add.length || diff.change.some(ch => ch.add.length || ch.change.length));\n}\n\nexport function adjustToExistingIndexNames(db: Dexie, schema: DbSchema, idbtrans: IDBTransaction) {\n // Issue #30 Problem with existing db - adjust to existing index names when migrating from non-dexie db\n const storeNames = idbtrans.db.objectStoreNames;\n\n for (let i = 0; i < storeNames.length; ++i) {\n const storeName = storeNames[i];\n const store = idbtrans.objectStore(storeName);\n db._hasGetAll = 'getAll' in store;\n\n for (let j = 0; j < store.indexNames.length; ++j) {\n const indexName = store.indexNames[j];\n const keyPath = store.index(indexName).keyPath;\n const dexieName = typeof keyPath === 'string' ? keyPath : \"[\" + slice(keyPath).join('+') + \"]\";\n if (schema[storeName]) {\n const indexSpec = schema[storeName].idxByName[dexieName];\n if (indexSpec) {\n indexSpec.name = indexName;\n delete schema[storeName].idxByName[dexieName];\n schema[storeName].idxByName[indexName] = indexSpec;\n }\n }\n }\n }\n\n // Bug with getAll() on Safari ver<604 on Workers only, see discussion following PR #579\n if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604)\n {\n db._hasGetAll = false;\n }\n}\n\nexport function parseIndexSyntax(primKeyAndIndexes: string): IndexSpec[] {\n return primKeyAndIndexes.split(',').map((index, indexNum) => {\n index = index.trim();\n const name = index.replace(/([&*]|\\+\\+)/g, \"\"); // Remove \"&\", \"++\" and \"*\"\n // Let keyPath of \"[a+b]\" be [\"a\",\"b\"]:\n const keyPath = /^\\[/.test(name) ? name.match(/^\\[(.*)\\]$/)[1].split('+') : name;\n\n return createIndexSpec(\n name,\n keyPath || null,\n /\\&/.test(index),\n /\\*/.test(index),\n /\\+\\+/.test(index),\n isArray(keyPath),\n indexNum === 0\n );\n });\n}\n","import { Version as IVersion } from '../../public/types/version';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { extend, keys } from '../../functions/utils';\nimport { Dexie } from '../dexie';\nimport { Transaction } from '../transaction';\nimport { removeTablesApi, setApiOnPlace, parseIndexSyntax } from './schema-helpers';\nimport { exceptions } from '../../errors';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\n\n/** class Version\n *\n * https://dexie.org/docs/Version/Version\n */\nexport class Version implements IVersion {\n db: Dexie;\n _cfg: {\n version: number,\n storesSource: { [tableName: string]: string | null },\n dbschema: DbSchema,\n tables: {},\n contentUpgrade: Function | null\n }\n\n _parseStoresSpec(stores: { [tableName: string]: string | null }, outSchema: DbSchema): any {\n keys(stores).forEach(tableName => {\n if (stores[tableName] !== null) {\n var indexes = parseIndexSyntax(stores[tableName]);\n var primKey = indexes.shift();\n primKey.unique = true;\n if (primKey.multi) throw new exceptions.Schema(\"Primary key cannot be multi-valued\");\n indexes.forEach(idx => {\n if (idx.auto) throw new exceptions.Schema(\"Only primary key can be marked as autoIncrement (++)\");\n if (!idx.keyPath) throw new exceptions.Schema(\"Index must have a name and cannot be an empty string\");\n });\n outSchema[tableName] = createTableSchema(tableName, primKey, indexes);\n }\n });\n }\n\n stores(stores: { [key: string]: string | null; }): IVersion {\n const db = this.db;\n this._cfg.storesSource = this._cfg.storesSource ?\n extend(this._cfg.storesSource, stores) :\n stores;\n const versions = db._versions;\n\n // Derive stores from earlier versions if they are not explicitely specified as null or a new syntax.\n const storesSpec: { [key: string]: string; } = {};\n let dbschema = {};\n versions.forEach(version => { // 'versions' is always sorted by lowest version first.\n extend(storesSpec, version._cfg.storesSource);\n dbschema = (version._cfg.dbschema = {});\n version._parseStoresSpec(storesSpec, dbschema);\n });\n // Update the latest schema to this version\n db._dbSchema = dbschema;\n // Update APIs\n removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]);\n setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema);\n db._storeNames = keys(dbschema);\n return this;\n }\n\n upgrade(upgradeFunction: (trans: Transaction) => PromiseLike | void): Version {\n this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction);\n return this;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Version } from './version';\n\nexport interface VersionConstructor {\n new(versionNumber: number): Version;\n prototype: Version;\n}\n\n/** Generates a Version constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createVersionConstructor(db: Dexie) {\n return makeClassConstructor(\n Version.prototype,\n\n function Version(this: Version, versionNumber: number) {\n this.db = db;\n this._cfg = {\n version: versionNumber,\n storesSource: null,\n dbschema: {},\n tables: {},\n contentUpgrade: null\n };\n });\n\n}\n","import { Dexie } from \"../classes/dexie/dexie\";\nimport { Table } from \"../public/types/table\";\nimport { DBNAMES_DB } from \"../globals/constants\";\nimport { DexieDOMDependencies } from \"../public/types/dexie-dom-dependencies\";\nimport { nop } from \"../functions/chaining-functions\";\n\ntype IDBKeyNamesVar = typeof IDBKeyRange;\n\nfunction getDbNamesTable(indexedDB: IDBFactory, IDBKeyRange: IDBKeyNamesVar) {\n let dbNamesDB = indexedDB[\"_dbNamesDB\"];\n if (!dbNamesDB) {\n dbNamesDB = indexedDB[\"_dbNamesDB\"] = new Dexie(DBNAMES_DB, {\n addons: [],\n indexedDB,\n IDBKeyRange,\n });\n dbNamesDB.version(1).stores({ dbnames: \"name\" });\n }\n return dbNamesDB.table(\"dbnames\") as Table<{ name: string }, string>;\n}\n\nfunction hasDatabasesNative(indexedDB: IDBFactory) {\n return indexedDB && typeof indexedDB.databases === \"function\";\n}\n\nexport function getDatabaseNames({\n indexedDB,\n IDBKeyRange,\n}: DexieDOMDependencies) {\n return hasDatabasesNative(indexedDB)\n ? Promise.resolve(indexedDB.databases()).then((infos) =>\n infos\n // Select name prop of infos:\n .map((info) => info.name)\n // Filter out DBNAMES_DB as previous Dexie or browser version would not have included it in the result.\n .filter((name) => name !== DBNAMES_DB)\n )\n : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys();\n}\n\nexport function _onDatabaseCreated(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).put({name}).catch(nop);\n}\n\nexport function _onDatabaseDeleted(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop);\n}\n","import { newScope } from '../../helpers/promise';\nimport { PSD } from '../../helpers/promise';\n\nexport function vip (fn) {\n // To be used by subscribers to the on('ready') event.\n // This will let caller through to access DB even when it is blocked while the db.ready() subscribers are firing.\n // This would have worked automatically if we were certain that the Provider was using Dexie.Promise for all asyncronic operations. The promise PSD\n // from the provider.connect() call would then be derived all the way to when provider would call localDatabase.applyChanges(). But since\n // the provider more likely is using non-promise async APIs or other thenable implementations, we cannot assume that.\n // Note that this method is only useful for on('ready') subscribers that is returning a Promise from the event. If not using vip()\n // the database could deadlock since it wont open until the returned Promise is resolved, and any non-VIPed operation started by\n // the caller will not resolve until database is opened.\n return newScope(function () {\n PSD.letThrough = true; // Make sure we are let through if still blocking db due to onready is firing.\n return fn();\n });\n}\n\n","/**\n * Work around Safari 14 IndexedDB open bug.\n *\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up. https://bugs.webkit.org/show_bug.cgi?id=226547\n * The only solution is to keep nudging it until it's awake.\n */\nfunction idbReady() {\n var isSafari = !navigator.userAgentData &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\//.test(navigator.userAgent);\n // No point putting other browsers or older versions of Safari through this mess.\n if (!isSafari || !indexedDB.databases)\n return Promise.resolve();\n var intervalId;\n return new Promise(function (resolve) {\n var tryIdb = function () { return indexedDB.databases().finally(resolve); };\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(function () { return clearInterval(intervalId); });\n}\n\nexport default idbReady;\n","import { cmp } from \"../functions/cmp\";\nimport { extend, iteratorSymbol, props } from '../functions/utils';\nimport { IndexableType } from '../public';\nimport {\n EmptyRange,\n IntervalTree,\n IntervalTreeNode,\n RangeSetConstructor,\n RangeSetPrototype,\n} from \"../public/types/rangeset\";\n\n/* An interval tree implementation to efficiently detect overlapping ranges of queried indexes.\n *\n * https://en.wikipedia.org/wiki/Interval_tree\n * \n */\n\nfunction isEmptyRange(node: IntervalTree | {from: IndexableType, to: IndexableType}): node is EmptyRange {\n return !(\"from\" in node);\n}\n\nexport type RangeSet = RangeSetPrototype & IntervalTree;\n\nexport const RangeSet = function(fromOrTree: any, to?: any) {\n if (this) {\n // Called with new()\n extend(this, arguments.length ? {d:1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree} : {d:0});\n } else {\n // Called without new()\n const rv = new RangeSet();\n if (fromOrTree && (\"d\" in fromOrTree)) {\n extend(rv, fromOrTree);\n }\n return rv;\n }\n} as RangeSetConstructor;\n\nprops(RangeSet.prototype, {\n add(rangeSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n mergeRanges(this, rangeSet);\n return this;\n },\n addKey(key: IndexableType) {\n addRange(this, key, key);\n return this;\n },\n addKeys(keys: IndexableType[]) {\n keys.forEach(key => addRange(this, key, key));\n return this;\n },\n\n [iteratorSymbol](): Iterator {\n return getRangeSetIterator(this);\n }\n});\n\nfunction addRange(target: IntervalTree, from: IndexableType, to: IndexableType) {\n const diff = cmp(from, to);\n // cmp() returns NaN if one of the args are IDB-invalid keys.\n // Avoid storing invalid keys in rangeset:\n if (isNaN(diff)) return;\n\n // Caller is trying to add a range where from is greater than to:\n if (diff > 0) throw RangeError();\n \n if (isEmptyRange(target)) return extend(target, { from, to, d: 1 });\n const left = target.l;\n const right = target.r;\n if (cmp(to, target.from) < 0) {\n left\n ? addRange(left, from, to)\n : (target.l = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n if (cmp(from, target.to) > 0) {\n right\n ? addRange(right, from, to)\n : (target.r = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n // Now we have some kind of overlap. We will be able to merge the new range into the node or let it be swallowed.\n\n // Grow left?\n if (cmp(from, target.from) < 0) {\n target.from = from;\n target.l = null; // Cut off for now. Re-add later.\n target.d = right ? right.d + 1 : 1;\n }\n // Grow right?\n if (cmp(to, target.to) > 0) {\n target.to = to;\n target.r = null; // Cut off for now. Re-add later.\n target.d = target.l ? target.l.d + 1 : 1;\n }\n const rightWasCutOff = !target.r;\n // Re-add left?\n if (left && !target.l) {\n //Ranges to the left may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, left);\n }\n // Re-add right?\n if (right && rightWasCutOff) {\n //Ranges to the right may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, right);\n }\n}\n\nexport function mergeRanges(target: IntervalTree, newSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n function _addRangeSet(\n target: IntervalTree,\n { from, to, l, r }: IntervalTreeNode | {from: IndexableType, to: IndexableType, l?: undefined, r?: undefined}\n ) {\n addRange(target, from, to);\n if (l) _addRangeSet(target, l);\n if (r) _addRangeSet(target, r);\n }\n\n if(!isEmptyRange(newSet)) _addRangeSet(target, newSet);\n}\n\nexport function rangesOverlap(\n rangeSet1: IntervalTree,\n rangeSet2: IntervalTree\n): boolean {\n // Start iterating other from scratch.\n const i1 = getRangeSetIterator(rangeSet2);\n let nextResult1 = i1.next();\n if (nextResult1.done) return false;\n let a = nextResult1.value;\n\n // Start iterating this from start of other\n const i2 = getRangeSetIterator(rangeSet1);\n let nextResult2 = i2.next(a.from); // Start from beginning of other range\n let b = nextResult2.value;\n\n while (!nextResult1.done && !nextResult2.done) {\n if (cmp(b!.from, a.to) <= 0 && cmp(b!.to, a.from) >= 0) return true;\n cmp(a.from, b!.from) < 0\n ? (a = (nextResult1 = i1.next(b!.from)).value!) // a is behind. forward it to beginning of next b-range\n : (b = (nextResult2 = i2.next(a.from)).value); // b is behind. forward it to beginning of next a-range\n }\n return false;\n}\n\ntype RangeSetIteratorState =\n | {\n up?: RangeSetIteratorState;\n n: IntervalTreeNode;\n s: 0 | 1 | 2 | 3;\n }\n | undefined\n | null;\nexport function getRangeSetIterator(\n node: EmptyRange | IntervalTreeNode\n): Generator {\n let state: RangeSetIteratorState = isEmptyRange(node) ? null : { s: 0, n: node };\n\n return {\n next(key?) {\n const keyProvided = arguments.length > 0;\n while (state) {\n switch (state.s) {\n case 0:\n // Initial state for node.\n // Fast forward to leftmost node.\n state.s = 1;\n if (keyProvided) {\n while (state.n.l && cmp(key, state.n.from) < 0)\n state = { up: state, n: state.n.l, s: 1 };\n } else {\n while (state.n.l) state = { up: state, n: state.n.l, s: 1 };\n }\n // intentionally fall into case 1:\n case 1:\n // We're on a node where it's left part is already handled or does not exist.\n state.s = 2;\n if (!keyProvided || cmp(key, state.n.to) <= 0)\n return { value: state.n, done: false };\n case 2:\n // We've emitted our node and should continue with the right part or let parent take over from it's state 1\n if (state.n.r) {\n state.s = 3; // So when child is done, we know we're done.\n state = { up: state, n: state.n.r, s: 0 };\n continue; // Will fall in to case 0 with fast forward to left leaf of this subtree.\n }\n // intentionally fall into case 3:\n case 3:\n state = state.up;\n }\n }\n return { done: true };\n },\n } as Generator;\n}\n\nfunction rebalance(target: IntervalTreeNode) {\n const diff = (target.r?.d || 0) - (target.l?.d || 0);\n const r = diff > 1 ? \"r\" : diff < -1 ? \"l\" : \"\";\n if (r) {\n\n // Rotate (https://en.wikipedia.org/wiki/Tree_rotation)\n //\n // \n // [OLDROOT]\n // [OLDROOT.L] [NEWROOT]\n // [NEWROOT.L] [NEWROOT.R]\n //\n // Is going to become:\n //\n // \n // [NEWROOT]\n // [OLDROOT] [NEWROOT.R]\n // [OLDROOT.L] [NEWROOT.L] \n\n // * clone now has the props of OLDROOT\n // Plan:\n // * target must be given the props of NEWROOT\n // * target[l] must point to a new OLDROOT\n // * target[r] must point to NEWROOT.R\n // * OLDROOT[r] must point to NEWROOT.L\n const l = r === \"r\" ? \"l\" : \"r\"; // Support both left/right rotation\n const rootClone = { ...target };\n // We're gonna copy props from target's right node into target so that target will\n // have same range as old target[r] (instead of changing pointers, we copy values.\n // that way we do not need to adjust pointers in parents).\n const oldRootRight = target[r]; \n target.from = oldRootRight.from;\n target.to = oldRootRight.to;\n target[r] = oldRootRight[r];\n rootClone[r] = oldRootRight[l];\n target[l] = rootClone;\n rootClone.d = computeDepth(rootClone);\n }\n target.d = computeDepth(target);\n}\n\nfunction computeDepth({ r, l }: Pick) {\n return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1;\n}\n","import { cloneSimpleObjectTree, deepClone, keys, objectIsEmpty } from \"../functions/utils\";\nimport { mergeRanges, RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\n\nexport function extendObservabilitySet(\n target: ObservabilitySet,\n newSet: ObservabilitySet\n): ObservabilitySet {\n keys(newSet).forEach(part => {\n if (target[part]) mergeRanges(target[part], newSet[part]);\n else target[part] = cloneSimpleObjectTree(newSet[part]); // Somewhat faster\n });\n return target;\n}\n","import { rangesOverlap } from '../helpers/rangeset';\nimport { ObservabilitySet } from '../public/types/db-events';\n\nexport function obsSetsOverlap(os1: ObservabilitySet, os2: ObservabilitySet) {\n return os1.all || os2.all || Object.keys(os1).some(\n (key) => os2[key] && rangesOverlap(os2[key], os1[key])\n );\n}\n","import { type GlobalQueryCache } from \"../../public/types/cache\";\n\nexport const cache: GlobalQueryCache = {}\n","import { CacheEntry, TblQueryCache } from '../../public/types/cache';\nimport { ObservabilitySet } from '../../public/types/db-events';\nimport { extendObservabilitySet } from '../extend-observability-set';\nimport { obsSetsOverlap } from '../obs-sets-overlap';\nimport { cache } from './cache';\n\nlet unsignaledParts: ObservabilitySet = {};\nlet isTaskEnqueued = false;\n\nexport function signalSubscribersLazily(part: ObservabilitySet, optimistic = false) {\n extendObservabilitySet(unsignaledParts, part);\n if (!isTaskEnqueued) {\n isTaskEnqueued = true;\n setTimeout(() => {\n isTaskEnqueued = false;\n const parts = unsignaledParts;\n unsignaledParts = {};\n signalSubscribersNow(parts, false);\n }, 0);\n }\n}\n\nexport function signalSubscribersNow(\n updatedParts: ObservabilitySet,\n deleteAffectedCacheEntries = false\n) {\n const queriesToSignal = new Set<() => void>();\n if (updatedParts.all) {\n // Signal all subscribers to requery.\n for (const tblCache of Object.values(cache)) {\n collectTableSubscribers(\n tblCache,\n updatedParts,\n queriesToSignal,\n deleteAffectedCacheEntries\n );\n }\n } else {\n for (const key in updatedParts) {\n const parts = /^idb\\:\\/\\/(.*)\\/(.*)\\//.exec(key);\n if (parts) {\n const [, dbName, tableName] = parts;\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (tblCache)\n collectTableSubscribers(\n tblCache,\n updatedParts,\n queriesToSignal,\n deleteAffectedCacheEntries\n );\n }\n }\n }\n // Now when affected cache entries are removed, signal collected subscribers to requery.\n queriesToSignal.forEach((requery) => requery());\n}\n\nfunction collectTableSubscribers(\n tblCache: TblQueryCache,\n updatedParts: ObservabilitySet,\n outQueriesToSignal: Set<() => void>,\n deleteAffectedCacheEntries: boolean\n) {\n const updatedEntryLists: [string, CacheEntry[]][] = [];\n for (const [indexName, entries] of Object.entries(tblCache.queries.query)) {\n const filteredEntries: CacheEntry[] = [];\n for (const entry of entries) {\n if (obsSetsOverlap(updatedParts, entry.obsSet)) {\n // This query is affected by the mutation. Remove it from cache\n // and signal all subscribers to requery.\n entry.subscribers.forEach((requery) => outQueriesToSignal.add(requery));\n } else if (deleteAffectedCacheEntries) {\n filteredEntries.push(entry);\n }\n }\n // Collect cache entries to be updated\n if (deleteAffectedCacheEntries)\n updatedEntryLists.push([indexName, filteredEntries]);\n }\n if (deleteAffectedCacheEntries) {\n for (const [indexName, filteredEntries] of updatedEntryLists) {\n tblCache.queries.query[indexName] = filteredEntries;\n }\n }\n}\n","import { Dexie } from './dexie';\nimport * as Debug from '../../helpers/debug';\nimport { rejection } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { eventRejectHandler, preventDefault } from '../../functions/event-wrappers';\nimport Promise, { wrap } from '../../helpers/promise';\nimport { connections } from '../../globals/constants';\nimport { runUpgraders, readGlobalSchema, adjustToExistingIndexNames, verifyInstalledSchema, patchCurrentVersion } from '../version/schema-helpers';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { _onDatabaseCreated } from '../../helpers/database-enumerator';\nimport { vip } from './vip';\nimport { promisableChain, nop } from '../../functions/chaining-functions';\nimport { generateMiddlewareStacks } from './generate-middleware-stacks';\nimport { slice } from '../../functions/utils';\nimport safari14Workaround from 'safari-14-idb-fix';\nimport { type ObservabilitySet } from '../../public/types/db-events';\nimport { RangeSet } from '../../helpers/rangeset';\nimport { DEXIE_STORAGE_MUTATED_EVENT_NAME, globalEvents } from '../../globals/global-events';\nimport { signalSubscribersNow } from '../../live-query/cache/signalSubscribers';\n\nexport function dexieOpen (db: Dexie) {\n const state = db._state;\n const {indexedDB} = db._deps;\n if (state.isBeingOpened || db.idbdb)\n return state.dbReadyPromise.then(() => state.dbOpenError ?\n rejection (state.dbOpenError) :\n db);\n state.isBeingOpened = true;\n state.dbOpenError = null;\n state.openComplete = false;\n const openCanceller = state.openCanceller;\n let nativeVerToOpen = Math.round(db.verno * 10);\n let schemaPatchMode = false;\n\n function throwIfCancelled() {\n // If state.openCanceller object reference is replaced, it means db.close() has been called,\n // meaning this open flow should be cancelled.\n if (state.openCanceller !== openCanceller) throw new exceptions.DatabaseClosed('db.open() was cancelled');\n }\n \n // Function pointers to call when the core opening process completes.\n let resolveDbReady = state.dbReadyResolve,\n // upgradeTransaction to abort on failure.\n upgradeTransaction: (IDBTransaction | null) = null,\n wasCreated = false;\n\n const tryOpenDB = () => new Promise((resolve, reject) => {\n throwIfCancelled();\n // If no API, throw!\n if (!indexedDB) throw new exceptions.MissingAPI();\n const dbName = db.name;\n \n const req = state.autoSchema || !nativeVerToOpen ?\n indexedDB.open(dbName) :\n indexedDB.open(dbName, nativeVerToOpen);\n if (!req) throw new exceptions.MissingAPI(); // May happen in Safari private mode, see https://github.com/dfahlander/Dexie.js/issues/134\n req.onerror = eventRejectHandler(reject);\n req.onblocked = wrap(db._fireOnBlocked);\n req.onupgradeneeded = wrap (e => {\n upgradeTransaction = req.transaction;\n if (state.autoSchema && !db._options.allowEmptyDB) { // Unless an addon has specified db._allowEmptyDB, lets make the call fail.\n // Caller did not specify a version or schema. Doing that is only acceptable for opening alread existing databases.\n // If onupgradeneeded is called it means database did not exist. Reject the open() promise and make sure that we\n // do not create a new database by accident here.\n req.onerror = preventDefault; // Prohibit onabort error from firing before we're done!\n upgradeTransaction.abort(); // Abort transaction (would hope that this would make DB disappear but it doesnt.)\n // Close database and delete it.\n req.result.close();\n const delreq = indexedDB.deleteDatabase(dbName); // The upgrade transaction is atomic, and javascript is single threaded - meaning that there is no risk that we delete someone elses database here!\n delreq.onsuccess = delreq.onerror = wrap(() => {\n reject (new exceptions.NoSuchDatabase(`Database ${dbName} doesnt exist`));\n });\n } else {\n upgradeTransaction.onerror = eventRejectHandler(reject);\n const oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; // Safari 8 fix.\n wasCreated = oldVer < 1;\n db.idbdb = req.result;\n if (schemaPatchMode) {\n patchCurrentVersion(db, upgradeTransaction);\n }\n runUpgraders(db, oldVer / 10, upgradeTransaction, reject);\n }\n }, reject);\n \n req.onsuccess = wrap (() => {\n // Core opening procedure complete. Now let's just record some stuff.\n upgradeTransaction = null;\n const idbdb = db.idbdb = req.result;\n\n const objectStoreNames = slice(idbdb.objectStoreNames);\n if (objectStoreNames.length > 0) try {\n const tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly');\n if (state.autoSchema) readGlobalSchema(db, idbdb, tmpTrans);\n else {\n adjustToExistingIndexNames(db, db._dbSchema, tmpTrans);\n if (!verifyInstalledSchema(db, tmpTrans) && !schemaPatchMode) {\n console.warn(`Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this.`);\n idbdb.close();\n nativeVerToOpen = idbdb.version + 1;\n schemaPatchMode = true;\n return resolve (tryOpenDB()); // Try again with new version (nativeVerToOpen\n }\n }\n generateMiddlewareStacks(db, tmpTrans);\n } catch (e) {\n // Safari 8 may bail out if > 1 store names. However, this shouldnt be a showstopper. Issue #120.\n // BUGBUG: It will bail out anyway as of Dexie 3.\n // Should we support Safari 8 anymore? Believe all\n // Dexie users use the shim for that platform anyway?!\n // If removing Safari 8 support, go ahead and remove the safariMultiStoreFix() function\n // as well as absurd upgrade version quirk for Safari.\n }\n \n connections.push(db); // Used for emulating versionchange event on IE/Edge/Safari.\n \n idbdb.onversionchange = wrap(ev => {\n state.vcFired = true; // detect implementations that not support versionchange (IE/Edge/Safari)\n db.on(\"versionchange\").fire(ev);\n });\n \n idbdb.onclose = wrap(ev => {\n db.on(\"close\").fire(ev);\n });\n\n if (wasCreated) _onDatabaseCreated(db._deps, dbName);\n\n resolve();\n\n }, reject);\n }).catch(err => {\n switch (err?.name) {\n case \"UnknownError\":\n if (state.PR1398_maxLoop > 0) {\n // Bug in Chrome after clearing site data\n // https://github.com/dexie/Dexie.js/issues/543#issuecomment-1795736695\n state.PR1398_maxLoop--;\n console.warn('Dexie: Workaround for Chrome UnknownError on open()');\n return tryOpenDB();\n }\n break;\n case \"VersionError\":\n if (nativeVerToOpen > 0) {\n nativeVerToOpen = 0;\n return tryOpenDB();\n }\n break;\n }\n return Promise.reject(err);\n });\n \n // safari14Workaround = Workaround by jakearchibald for new nasty bug in safari 14.\n return Promise.race([\n openCanceller,\n (typeof navigator === 'undefined' ? Promise.resolve() : safari14Workaround()).then(tryOpenDB)\n ]).then(() => {\n // Before finally resolving the dbReadyPromise and this promise,\n // call and await all on('ready') subscribers:\n // Dexie.vip() makes subscribers able to use the database while being opened.\n // This is a must since these subscribers take part of the opening procedure.\n throwIfCancelled();\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>db.on.ready.fire(db.vip))).then(function fireRemainders() {\n if (state.onReadyBeingFired.length > 0) {\n // In case additional subscribers to db.on('ready') were added during the time db.on.ready.fire was executed.\n let remainders = state.onReadyBeingFired.reduce(promisableChain, nop);\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>remainders(db.vip))).then(fireRemainders)\n }\n });\n }).finally(()=>{\n if (state.openCanceller === openCanceller) {\n // Only modify state if not cancelled in the mean time.\n state.onReadyBeingFired = null;\n state.isBeingOpened = false;\n }\n }).catch(err => {\n state.dbOpenError = err; // Record the error. It will be used to reject further promises of db operations.\n try {\n // Did we fail within onupgradeneeded? Make sure to abort the upgrade transaction so it doesnt commit.\n upgradeTransaction && upgradeTransaction.abort();\n } catch { }\n if (openCanceller === state.openCanceller) {\n // Still in the same open flow - The error reason was not due to external call to db.close().\n // Make sure to call db.close() to finalize resources.\n db._close(); // Closes and resets idbdb, removes connections, resets dbReadyPromise and openCanceller so that a later db.open() is fresh.\n }\n return rejection (err);\n }).finally(()=>{\n state.openComplete = true;\n resolveDbReady(); // dbReadyPromise is resolved no matter if open() rejects or resolved. It's just to wake up waiters.\n }).then(()=>{\n if (wasCreated) {\n // Propagate full range on primary keys and indexes on all tables now that the DB is ready and opened,\n // and all upgraders and on('ready') subscribers have run.\n const everything: ObservabilitySet = {};\n db.tables.forEach(table => {\n table.schema.indexes.forEach(idx => {\n if (idx.name) everything[`idb://${db.name}/${table.name}/${idx.name}`] = new RangeSet(-Infinity, [[[]]]);\n });\n everything[`idb://${db.name}/${table.name}/`] = everything[`idb://${db.name}/${table.name}/:dels`] = new RangeSet(-Infinity, [[[]]]);\n });\n // Database was created. If another tab had it open when it was deleted and reopened, that tab must be updated now.\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME).fire(everything);\n // Wipe the cache and trigger optimistic queries:\n signalSubscribersNow(everything, true);\n }\n // Resolve the db.open() with the db instance.\n return db;\n });\n}\n","import { isArray } from '../functions/utils';\n\nexport function awaitIterator (iterator: Iterator) {\n var callNext = result => iterator.next(result),\n doThrow = error => iterator.throw(error),\n onSuccess = step(callNext),\n onError = step(doThrow);\n\n function step(getNext: (any)=>any) {\n return (val?) => {\n var next = getNext(val),\n value = next.value;\n\n return next.done ? value :\n (!value || typeof value.then !== 'function' ?\n isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) :\n value.then(onSuccess, onError));\n };\n }\n\n return step(callNext)();\n}\n","import { TransactionMode } from '../../public/types/transaction-mode';\nimport { errnames, exceptions } from '../../errors';\nimport { flatten, isAsyncFunction } from '../../functions/utils';\nimport { Dexie } from './dexie';\nimport { Transaction } from '../transaction';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise, {\n PSD,\n NativePromise,\n decrementExpectedAwaits,\n rejection,\n incrementExpectedAwaits\n} from '../../helpers/promise';\n\nexport function extractTransactionArgs(mode: TransactionMode, _tableArgs_, scopeFunc) {\n // Let table arguments be all arguments between mode and last argument.\n var i = arguments.length;\n if (i < 2) throw new exceptions.InvalidArgument(\"Too few arguments\");\n // Prevent optimzation killer (https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments)\n // and clone arguments except the first one into local var 'args'.\n var args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n // Let scopeFunc be the last argument and pop it so that args now only contain the table arguments.\n scopeFunc = args.pop();\n var tables = flatten(args); // Support using array as middle argument, or a mix of arrays and non-arrays.\n return [mode, tables, scopeFunc];\n}\n\nexport function enterTransactionScope(\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n parentTransaction: Transaction | undefined,\n scopeFunc: ()=>PromiseLike | any\n) {\n return Promise.resolve().then(() => {\n // Keep a pointer to last non-transactional PSD to use if someone calls Dexie.ignoreTransaction().\n const transless = PSD.transless || PSD;\n // Our transaction.\n //return new Promise((resolve, reject) => {\n const trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction);\n trans.explicit = true;\n // Let the transaction instance be part of a Promise-specific data (PSD) value.\n const zoneProps = {\n trans: trans,\n transless: transless\n };\n\n if (parentTransaction) {\n // Emulate transaction commit awareness for inner transaction (must 'commit' when the inner transaction has no more operations ongoing)\n trans.idbtrans = parentTransaction.idbtrans;\n } else {\n try {\n trans.create(); // Create the native transaction so that complete() or error() will trigger even if no operation is made upon it.\n // @ts-ignore Mark the idbtrans object with \"_explicit\". DBCore middleware won't have access to Dexie trans but will need to have this info.\n trans.idbtrans._explicit = true;\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db.close({disableAutoOpen: false});\n return db.open().then(() => enterTransactionScope(\n db,\n mode,\n storeNames,\n null,\n scopeFunc\n ));\n }\n return rejection(ex);\n }\n }\n\n // Support for native async await.\n const scopeFuncIsAsync = isAsyncFunction(scopeFunc);\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n\n let returnValue;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = scopeFunc.call(trans, trans);\n if (returnValue) {\n if (scopeFuncIsAsync) {\n // scopeFunc is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n } else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') {\n // scopeFunc returned an iterator with throw-support. Handle yield as await.\n returnValue = awaitIterator(returnValue);\n }\n }\n }, zoneProps);\n return (returnValue && typeof returnValue.then === 'function' ?\n // Promise returned. User uses promise-style transactions.\n Promise.resolve(returnValue).then(x => trans.active ?\n x // Transaction still active. Continue.\n : rejection(new exceptions.PrematureCommit(\n \"Transaction committed too early. See http://bit.ly/2kdckMn\")))\n // No promise returned. Wait for all outstanding promises before continuing. \n : promiseFollowed.then(() => returnValue)\n ).then(x => {\n // sub transactions don't react to idbtrans.oncomplete. We must trigger a completion:\n if (parentTransaction) trans._resolve();\n // wait for trans._completion\n // (if root transaction, this means 'complete' event. If sub-transaction, we've just fired it ourselves)\n return trans._completion.then(() => x);\n }).catch(e => {\n trans._reject(e); // Yes, above then-handler were maybe not called because of an unhandled rejection in scopeFunc!\n return rejection(e);\n });\n });\n}\n","import {\n DBCore,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryRequest,\n DBCoreRangeType,\n DBCoreOpenCursorRequest,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreTable,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { getKeyExtractor } from './get-key-extractor';\nimport { getKeyPathAlias } from './dbcore-indexeddb';\nimport { Middleware } from '../public/types/middleware';\n\ninterface VirtualIndex extends DBCoreIndex {\n /** True if this index is virtual, i.e. represents a compound index internally,\n * but makes it act as as having a subset of its keyPaths.\n */\n isVirtual: boolean;\n\n /** Number of keypaths that this index comprises. Can be 0..N.\n * Note: This is the length of the *virtual index*, not the real index.\n */\n keyLength: number;\n\n /** Number of popped keypaths from the real index.\n */\n keyTail: number;\n\n /** LowLevelIndex represents the actual IndexedDB index behind it */\n lowLevelIndex: DBCoreIndex;\n}\n\n// Move into some util:\nexport function pad (a: any | any[], value: any, count: number) {\n const result = isArray(a) ? a.slice() : [a];\n for (let i=0; i 0;\n const virtualIndex = {\n ...lowLevelIndex,\n name: isVirtual\n ? `${keyPathAlias}(virtual-from:${lowLevelIndex.name})`\n : lowLevelIndex.name,\n lowLevelIndex,\n isVirtual,\n keyTail,\n keyLength,\n extractKey: getKeyExtractor(keyPath),\n unique: !isVirtual && lowLevelIndex.unique\n };\n indexList.push(virtualIndex);\n if (!virtualIndex.isPrimaryKey) {\n allVirtualIndexes.push(virtualIndex);\n }\n if (keyLength > 1) {\n const virtualKeyPath = keyLength === 2 ?\n keyPath[0] : // This is a compound [a, b]. Add a virtual normal index a.\n keyPath.slice(0, keyLength - 1); // This is compound [a,b,c]. Add virtual compound [a,b].\n addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex);\n }\n indexList.sort((a,b) => a.keyTail - b.keyTail); // Shortest keyTail is the best one (represents real index)\n return virtualIndex;\n }\n \n const primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey);\n indexLookup[\":id\"] = [primaryKey];\n for (const index of schema.indexes) {\n addVirtualIndexes(index.keyPath, 0, index);\n }\n \n function findBestIndex(keyPath: null | string | string[]): VirtualIndex {\n const result = indexLookup[getKeyPathAlias(keyPath)];\n return result && result[0];\n }\n \n function translateRange (range: DBCoreKeyRange, keyTail: number): DBCoreKeyRange {\n return {\n type: range.type === DBCoreRangeType.Equal ?\n DBCoreRangeType.Range :\n range.type,\n lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail),\n lowerOpen: true, // doesn't matter true or false\n upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail),\n upperOpen: true // doesn't matter true or false\n };\n }\n \n function translateRequest (req: DBCoreQueryRequest): DBCoreQueryRequest;\n function translateRequest (req: DBCoreOpenCursorRequest): DBCoreOpenCursorRequest;\n function translateRequest (req: DBCoreCountRequest): DBCoreCountRequest {\n const index = req.query.index as VirtualIndex;\n return index.isVirtual ? {\n ...req,\n query: {\n index: index.lowLevelIndex,\n range: translateRange(req.query.range, index.keyTail)\n }\n } : req;\n }\n \n const result: DBCoreTable = {\n ...table,\n schema: {\n ...schema,\n primaryKey,\n indexes: allVirtualIndexes,\n getIndexByKeyPath: findBestIndex\n },\n\n count(req) {\n return table.count(translateRequest(req));\n }, \n \n query(req) {\n return table.query(translateRequest(req));\n },\n \n openCursor(req) {\n const {keyTail, isVirtual, keyLength} = (req.query.index as VirtualIndex);\n if (!isVirtual) return table.openCursor(req);\n \n function createVirtualCursor(cursor: DBCoreCursor) : DBCoreCursor {\n function _continue (key?: any) {\n key != null ?\n cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) :\n req.unique ?\n cursor.continue(\n cursor.key.slice(0, keyLength)\n .concat(req.reverse\n ? down.MIN_KEY\n : down.MAX_KEY, keyTail)\n ) :\n cursor.continue()\n }\n const virtualCursor = Object.create(cursor, {\n continue: {value: _continue},\n continuePrimaryKey: {\n value(key: any, primaryKey: any) {\n cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey);\n }\n },\n primaryKey: {\n get() {\n return cursor.primaryKey;\n }\n },\n key: {\n get() {\n const key = cursor.key as any[]; // A virtual cursor always operates on compound key\n return keyLength === 1 ?\n key[0] : // Cursor.key should not be an array.\n key.slice(0, keyLength); // Cursor.key should be first part of array.\n }\n },\n value: {\n get() {\n return cursor.value;\n }\n }\n });\n return virtualCursor;\n }\n \n return table.openCursor(translateRequest(req))\n .then(cursor => cursor && createVirtualCursor(cursor));\n }\n };\n return result;\n }\n }\n}\n\nexport const virtualIndexMiddleware : Middleware = {\n stack: \"dbcore\",\n name: \"VirtualIndexMiddleware\",\n level: 1,\n create: createVirtualIndexMiddleware\n};\n\n","import { keys, hasOwn, toStringTag } from './utils';\n\nexport function getObjectDiff(a: any, b: any, rv?: any, prfx?: string) {\n // Compares objects a and b and produces a diff object.\n rv = rv || {};\n prfx = prfx || '';\n keys(a).forEach((prop) => {\n if (!hasOwn(b, prop)) {\n // Property removed\n rv[prfx + prop] = undefined;\n } else {\n var ap = a[prop],\n bp = b[prop];\n if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) {\n const apTypeName = toStringTag(ap);\n const bpTypeName = toStringTag(bp);\n\n if (apTypeName !== bpTypeName) {\n rv[prfx + prop] = b[prop]; // Property changed to other type\n } else if (apTypeName === 'Object') {\n // Pojo objects (not Date, ArrayBuffer, Array etc). Go deep.\n getObjectDiff(ap, bp, rv, prfx + prop + '.');\n } else if (ap !== bp) {\n // Values differ.\n // Could have checked if Date, arrays or binary types have same\n // content here but I think that would be a suboptimation.\n // Prefer simplicity.\n rv[prfx + prop] = b[prop];\n }\n } else if (ap !== bp) rv[prfx + prop] = b[prop]; // Primitive value changed\n }\n });\n keys(b).forEach((prop) => {\n if (!hasOwn(a, prop)) {\n rv[prfx + prop] = b[prop]; // Property added\n }\n });\n return rv;\n}\n","import {\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreIndex,\n DBCoreTable,\n} from \"../public/types/dbcore\";\n\nexport function getEffectiveKeys (\n primaryKey: DBCoreIndex,\n req: (Pick & {keys?: any[]}) | Pick)\n{\n //const {outbound} = primaryKey;\n if (req.type === 'delete') return req.keys;\n return req.keys || req.values.map(primaryKey.extractKey)\n}\n","import {\n DBCore,\n DBCoreTable,\n DBCoreMutateResponse,\n DBCoreDeleteRangeRequest,\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreTransaction,\n DBCoreKeyRange\n} from \"../public/types/dbcore\";\nimport { nop } from '../functions/chaining-functions';\nimport { hasOwn, setByKeyPath } from '../functions/utils';\nimport { getObjectDiff } from \"../functions/get-object-diff\";\nimport { PSD } from '../helpers/promise';\n//import { LockableTableMiddleware } from '../dbcore/lockable-table-middleware';\nimport { getEffectiveKeys } from '../dbcore/get-effective-keys';\nimport { Middleware } from '../public/types/middleware';\nimport { Transaction } from '../classes/transaction';\n\nexport const hooksMiddleware: Middleware = {\n stack: \"dbcore\",\n name: \"HooksMiddleware\",\n level: 2,\n create: (downCore: DBCore) => ({\n ...downCore,\n table(tableName: string) {\n const downTable = downCore.table(tableName);\n const {primaryKey} = downTable.schema;\n \n const tableMiddleware: DBCoreTable = {\n ...downTable,\n mutate(req):Promise {\n const dxTrans = PSD.trans as Transaction;\n // Hooks can be transaction-bound. Need to grab them from transaction.table and not\n // db.table!\n const {deleting, creating, updating} = dxTrans.table(tableName).hook;\n switch (req.type) {\n case 'add':\n if (creating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'put':\n if (creating.fire === nop && updating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'delete':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'deleteRange':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>deleteRange(req), true);\n }\n // Any of the breaks above happened (no hooks) - do the default:\n return downTable.mutate(req);\n\n\n function addPutOrDelete(req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest): Promise {\n const dxTrans = PSD.trans;\n const keys = req.keys || getEffectiveKeys(primaryKey, req);\n if (!keys) throw new Error(\"Keys missing\");\n // Clone Request and set keys arg\n req = req.type === 'add' || req.type === 'put' ?\n {...req, keys} :\n {...req};\n if (req.type !== 'delete') req.values = [...req.values];\n if (req.keys) req.keys = [...req.keys];\n \n return getExistingValues(downTable, req, keys).then (existingValues => {\n const contexts = keys.map((key, i) => {\n const existingValue = existingValues[i];\n const ctx = { onerror: null, onsuccess: null };\n if (req.type === 'delete') {\n // delete operation\n deleting.fire.call(ctx, key, existingValue, dxTrans);\n } else if (req.type === 'add' || existingValue === undefined) {\n // The add() or put() resulted in a create\n const generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans);\n if (key == null && generatedPrimaryKey != null) {\n key = generatedPrimaryKey;\n req.keys[i] = key;\n if (!primaryKey.outbound) {\n setByKeyPath(req.values[i], primaryKey.keyPath, key);\n }\n }\n } else {\n // The put() operation resulted in an update\n const objectDiff = getObjectDiff(existingValue, req.values[i]);\n const additionalChanges = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans);\n if (additionalChanges) {\n const requestedValue = req.values[i];\n Object.keys(additionalChanges).forEach(keyPath => {\n if (hasOwn(requestedValue, keyPath)) {\n // keyPath is already present as a literal property of the object\n requestedValue[keyPath] = additionalChanges[keyPath];\n } else {\n // keyPath represents a new or existing path into the object\n setByKeyPath(requestedValue, keyPath, additionalChanges[keyPath]);\n }\n });\n }\n }\n return ctx;\n });\n return downTable.mutate(req).then(({failures, results, numFailures, lastResult}) => {\n for (let i=0; i {\n contexts.forEach(ctx => ctx.onerror && ctx.onerror(error));\n return Promise.reject(error);\n });\n });\n }\n \n function deleteRange(req: DBCoreDeleteRangeRequest): Promise {\n return deleteNextChunk(req.trans, req.range, 10000);\n }\n \n function deleteNextChunk(trans: DBCoreTransaction, range: DBCoreKeyRange, limit: number) {\n // Query what keys in the DB within the given range\n return downTable.query({trans, values: false, query: {index: primaryKey, range}, limit})\n .then(({result}) => {\n // Given a set of keys, bulk delete those using the same procedure as in addPutOrDelete().\n // This will make sure that deleting hook is called.\n return addPutOrDelete({type: 'delete', keys: result, trans}).then(res => {\n if (res.numFailures > 0) return Promise.reject(res.failures[0]);\n if (result.length < limit) {\n return {failures: [], numFailures: 0, lastResult: undefined} as DBCoreMutateResponse;\n } else {\n return deleteNextChunk(trans, {...range, lower: result[result.length - 1], lowerOpen: true}, limit);\n }\n });\n })\n }\n }\n };\n //const {lock, lockableMiddleware} = LockableTableMiddleware(tableMiddleware);\n\n return tableMiddleware;\n },\n }) as DBCore\n};\n\nfunction getExistingValues(\n table: DBCoreTable,\n req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest,\n effectiveKeys: any[]\n) {\n return req.type === \"add\"\n ? Promise.resolve([])\n : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: \"immutable\" });\n}\n","import { deepClone } from \"../functions/utils\";\nimport { DBCore } from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport Promise from \"../helpers/promise\";\nimport { cmp } from '../functions/cmp';\n\nexport function getFromTransactionCache(\n keys: readonly any[],\n cache: { keys: any[]; values: any[] } | undefined | null,\n clone?: boolean\n) {\n try {\n if (!cache) return null;\n if (cache.keys.length < keys.length) return null;\n const result: any[] = [];\n // Compare if the exact same order of keys was retrieved in same transaction:\n // Allow some cached keys to be omitted from provided set of keys\n // Use case: 1. getMany(keys) 2. update a subset of those 3. call put with the updated ones ==> middlewares should be able to find old values\n for (let i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) {\n if (cmp(cache.keys[i], keys[j]) !== 0) continue;\n result.push(clone ? deepClone(cache.values[i]) : cache.values[i]);\n ++j;\n }\n // If got all keys caller was looking for, return result.\n return result.length === keys.length ? result : null;\n } catch {\n return null;\n }\n}\n\nexport const cacheExistingValuesMiddleware: Middleware = {\n stack: \"dbcore\",\n level: -1,\n create: (core) => {\n return {\n table: (tableName) => {\n const table = core.table(tableName);\n return {\n ...table,\n getMany: (req) => {\n if (!req.cache) {\n return table.getMany(req);\n }\n const cachedResult = getFromTransactionCache(\n req.keys,\n req.trans[\"_cache\"],\n req.cache === \"clone\"\n );\n if (cachedResult) {\n return Promise.resolve(cachedResult);\n }\n return table.getMany(req).then((res) => {\n req.trans[\"_cache\"] = {\n keys: req.keys,\n values: req.cache === \"clone\" ? deepClone(res) : res,\n };\n return res;\n });\n },\n mutate: (req) => {\n // Invalidate cache on any mutate except \"add\" which can't change existing values:\n if (req.type !== \"add\") req.trans[\"_cache\"] = null;\n return table.mutate(req);\n },\n };\n },\n };\n },\n};\n","import { DBCore, DBCoreTable } from '../../public/types/dbcore';\nimport { LiveQueryContext } from '../live-query';\n\nexport function isCachableContext(ctx: LiveQueryContext, table: DBCoreTable) {\n return (\n ctx.trans.mode === 'readonly' &&\n !!ctx.subscr &&\n !ctx.trans.explicit &&\n ctx.trans.db._options.cache !== 'disabled' &&\n !table.schema.primaryKey.outbound\n );\n}\n\n","import { DBCoreCountRequest, DBCoreGetManyRequest, DBCoreGetRequest, DBCoreOpenCursorRequest, DBCoreQueryRequest } from '../../public/types/dbcore';\n\n\nexport function isCachableRequest(type: string, req: Partial) {\n switch (type) {\n case 'query':\n return req.values && !req.unique;\n case 'get':\n return false;\n case 'getMany':\n return false;\n case 'count':\n return false;\n case 'openCursor':\n return false;\n }\n}\n","import { LiveQueryContext } from \".\";\nimport { getFromTransactionCache } from \"../dbcore/cache-existing-values-middleware\";\nimport { getEffectiveKeys } from \"../dbcore/get-effective-keys\";\nimport { exceptions } from \"../errors\";\nimport { cmp } from \"../functions/cmp\";\nimport { isArray, keys } from \"../functions/utils\";\nimport { PSD } from \"../helpers/promise\";\nimport { RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport {\n DBCore,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreGetManyRequest,\n DBCoreGetRequest,\n DBCoreIndex,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreQueryResponse,\n DBCoreTable,\n DBCoreTableSchema,\n DBCoreTransaction,\n} from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport { isCachableContext } from \"./cache/is-cachable-context\";\nimport { isCachableRequest } from \"./cache/is-cachable-request\";\nimport { extendObservabilitySet } from \"./extend-observability-set\";\n\nexport const observabilityMiddleware: Middleware = {\n stack: \"dbcore\",\n level: 0,\n name: \"Observability\",\n create: (core) => {\n const dbName = core.schema.name;\n const FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY);\n\n return {\n ...core,\n transaction: (stores, mode, options) => {\n if (PSD.subscr && mode !== 'readonly') {\n throw new exceptions.ReadOnly(`Readwrite transaction in liveQuery context. Querier source: ${(PSD as LiveQueryContext).querier}`);\n }\n return core.transaction(stores, mode, options);\n },\n table: (tableName) => {\n const table = core.table(tableName);\n const { schema } = table;\n const { primaryKey, indexes } = schema;\n const { extractKey, outbound } = primaryKey;\n const indexesWithAutoIncPK = primaryKey.autoIncrement && indexes.filter(\n (index) => index.compound && (index.keyPath as string[]).includes(primaryKey.keyPath as string)\n );\n const tableClone: DBCoreTable = {\n ...table,\n mutate: (req) => {\n const trans = req.trans as DBCoreTransaction & {\n mutatedParts?: ObservabilitySet;\n };\n const mutatedParts = req.mutatedParts || (req.mutatedParts = {});\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (mutatedParts[part] ||\n (mutatedParts[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n\n const { type } = req;\n let [keys, newObjs] =\n req.type === \"deleteRange\"\n ? [req.range] // keys will be an DBCoreKeyRange object - transformed later on to a [from,to]-style range.\n : req.type === \"delete\"\n ? [req.keys] // keys known already here. newObjs will be undefined.\n : req.values.length < 50\n ? [getEffectiveKeys(primaryKey, req).filter(id => id), req.values] // keys except autoIncremented - they will be added later on.\n : []; // keys and newObjs will both be undefined - changeSpec will become true (changed for entire table)\n\n const oldCache = req.trans[\"_cache\"];\n\n // Add the mutated table and optionally keys to the mutatedTables set on the transaction.\n // Used by subscribers to txcommit event and for Collection.prototype.subscribe().\n if (isArray(keys)) {\n // keys is an array - delete, add or put of less than 50 rows.\n // Individual keys (add put or delete)\n pkRangeSet.addKeys(keys);\n // Only get oldObjs if they have been cached recently\n // (This applies to Collection.modify() only, but also if updating/deleting hooks have subscribers)\n const oldObjs = type === 'delete' || keys.length === newObjs.length ? getFromTransactionCache(keys, oldCache) : null;\n\n // Supply detailed values per index for both old and new objects:\n if (!oldObjs) {\n // add, delete or put and we don't know old values.\n // Indicate this in the \":dels\" part, for the sake of count() and primaryKeys() queries only!\n delsRangeSet.addKeys(keys);\n }\n if (oldObjs || newObjs) {\n // No matter if knowning oldObjs or not, track the indices if it's a put, add or delete.\n trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs);\n }\n } else if (keys) {\n // keys is a DBCoreKeyRange object. Transform it to [from,to]-style range.\n // As we can't know deleted index ranges, mark index-based subscriptions must trigger.\n const range = { from: keys.lower, to: keys.upper };\n delsRangeSet.add(range);\n // deleteRange. keys is a DBCoreKeyRange objects. Transform it to [from,to]-style range.\n pkRangeSet.add(range);\n } else {\n // Too many requests to record the details without slowing down write performance.\n // Let's just record a generic large range on primary key, the virtual :dels index and\n // all secondary indices:\n pkRangeSet.add(FULL_RANGE);\n delsRangeSet.add(FULL_RANGE);\n schema.indexes.forEach(idx => getRangeSet(idx.name).add(FULL_RANGE));\n }\n\n return table.mutate(req).then((res) => {\n // Merge the mutated parts from the request into the transaction's mutatedParts\n // now when the request went fine.\n if (keys && (req.type === 'add' || req.type === 'put')) {\n // Less than 50 requests (keys truthy) (otherwise we've added full range anyway)\n // autoincrement means we might not have got all keys until now\n pkRangeSet.addKeys(res.results);\n if (indexesWithAutoIncPK) {\n // Dexie Issue 1946:\n // If an auto-incremented primary key is part of a compound index,\n // we need to compute the resulting value of that index after inserting\n // the rows.\n indexesWithAutoIncPK.forEach(idx => {\n // Extract values of this compound index where primary key is not yet set:\n const idxVals = req.values.map(v => idx.extractKey(v));\n // Find the position of the primary key in the index:\n const pkPos = (idx.keyPath as string[]).findIndex(prop => prop === primaryKey.keyPath);\n // Update idxVals with the resulting primary keys to complete the index value:\n res.results!.forEach(pk => idxVals[pkPos] = pk);\n // Add the updated index to the rangeset:\n getRangeSet(idx.name).addKeys(idxVals);\n });\n }\n }\n trans.mutatedParts = extendObservabilitySet (\n trans.mutatedParts || {},\n mutatedParts\n );\n return res;\n });\n },\n };\n\n const getRange: (req: any) => [DBCoreIndex, RangeSet] = ({\n query: { index, range },\n }:\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest) => [\n index,\n new RangeSet(range.lower ?? core.MIN_KEY, range.upper ?? core.MAX_KEY),\n ];\n\n const readSubscribers: {[method in\n Exclude]: \n (req: any) => [DBCoreIndex, RangeSet]\n } = {\n get: (req) => [primaryKey, new RangeSet(req.key)],\n getMany: (req) => [primaryKey, new RangeSet().addKeys(req.keys)],\n count: getRange,\n query: getRange,\n openCursor: getRange,\n }\n\n keys(readSubscribers).forEach((method: 'get' | 'getMany' | 'count' | 'query' | 'openCursor') => {\n tableClone[method] = function (\n req:\n | DBCoreGetRequest\n | DBCoreGetManyRequest\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest\n ) {\n const { subscr } = PSD as LiveQueryContext;\n const isLiveQuery = !!subscr;\n let cachable = isCachableContext(PSD as LiveQueryContext, table) && isCachableRequest(method, req);\n const obsSet = cachable\n ? req.obsSet = {} // Implicit read transaction - track changes for this query only for the request's duration\n : subscr; // Explicit read transaction - track changes across entire live query\n\n if (isLiveQuery) {\n // Current zone want's to track all queries so they can be subscribed to.\n // (The query is executed within a \"liveQuery\" zone)\n // Check whether the query applies to a certain set of ranges:\n // Track what we should be observing:\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (obsSet[part] ||\n (obsSet[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n const [queriedIndex, queriedRanges] = readSubscribers[method](req);\n // A generic rule here: queried ranges should always be subscribed to.\n if (method === 'query' && queriedIndex.isPrimaryKey && !(req as DBCoreQueryRequest).values) {\n // A pure primay-key based Collection where only .primaryKeys() is requested. Don't wakeup on other changes than added or deleted primary keys within queried range.\n delsRangeSet.add(queriedRanges);\n } else {\n getRangeSet(queriedIndex.name || \"\").add(queriedRanges);\n }\n if (!queriedIndex.isPrimaryKey) {\n // Only count(), query() and openCursor() operates on secondary indices.\n // Since put(), delete() and deleteRange() mutations may happen without knowing oldObjs,\n // the mutate() method will be missing what secondary indices that are being deleted from\n // the subscribed range. We are working around this issue by recording all the resulting\n // primary keys from the queries. This only works for those kinds of queries where we can\n // derive the primary key from the result.\n // In this block we are accomplishing this using various strategies depending on the properties\n // of the query result.\n\n if (method === \"count\") {\n // We've got a problem! Delete and put mutations happen without known the oldObjs.\n // Those mutation could change the count.\n // Solution: Dedicated \":dels\" url represends a subscription to all mutations without oldObjs\n // (specially triggered in the mutators put(), delete() and deleteRange() when they don't know oldObject)\n delsRangeSet.add(FULL_RANGE);\n } else {\n // openCursor() or query()\n\n // Prepare a keysPromise in case the we're doing an IDBIndex.getAll() on a store with outbound keys.\n const keysPromise =\n method === \"query\" &&\n outbound &&\n (req as DBCoreQueryRequest).values &&\n table.query({\n ...(req as DBCoreQueryRequest),\n values: false,\n });\n\n return table[method].apply(this, arguments).then((res) => {\n if (method === \"query\") {\n if (outbound && (req as DBCoreQueryRequest).values) {\n // If keys are outbound, we can't use extractKey to map what keys to observe.\n // We've queried an index (like 'dateTime') on an outbound table\n // and retrieve a list of objects\n // from who we cannot know their primary keys.\n // \"Luckily\" though, we've prepared the keysPromise to assist us in exact this condition.\n return keysPromise.then(\n ({ result: resultingKeys }: DBCoreQueryResponse) => {\n pkRangeSet.addKeys(resultingKeys);\n return res;\n }\n );\n }\n // query() inbound values, keys or outbound keys. Secondary indexes only since\n // for primary keys we would only add results within the already registered range.\n const pKeys = (req as DBCoreQueryRequest).values\n ? (res as DBCoreQueryResponse).result.map(extractKey)\n : (res as DBCoreQueryResponse).result;\n if ((req as DBCoreQueryRequest).values) {\n // Subscribe to any mutation made on the returned keys,\n // so that we detect both deletions and updated properties.\n pkRangeSet.addKeys(pKeys);\n } else {\n // Subscribe only to mutations on the returned keys\n // in case the mutator was unable to know oldObjs.\n // If it has oldObj, the mutator won't put anything in \":dels\" because\n // it can more fine-grained put the exact removed and added index value in the correct\n // index range that we subscribe to in the queried range sets.\n // We don't load values so a change on a property outside our index will not\n // require us to re-execute the query.\n delsRangeSet.addKeys(pKeys);\n }\n } else if (method === \"openCursor\") {\n // Caller requests a cursor.\n // For the same reason as when method===\"query\", we only need to observe\n // those keys whose values are possibly used or rendered - which could\n // only happen on keys where they get the cursor's key, primaryKey or value.\n const cursor: DBCoreCursor | null = res;\n const wantValues = (req as DBCoreOpenCursorRequest).values;\n return (\n cursor &&\n Object.create(cursor, {\n key: {\n get() {\n delsRangeSet.addKey(cursor.primaryKey);\n return cursor.key;\n },\n },\n primaryKey: {\n get() {\n const pkey = cursor.primaryKey;\n delsRangeSet.addKey(pkey);\n return pkey;\n },\n },\n value: {\n get() {\n wantValues && pkRangeSet.addKey(cursor.primaryKey);\n return cursor.value;\n },\n },\n })\n );\n }\n return res;\n });\n }\n }\n }\n return table[method].apply(this, arguments);\n };\n });\n return tableClone;\n },\n };\n },\n};\n\nfunction trackAffectedIndexes(\n getRangeSet: (index: string) => RangeSet,\n schema: DBCoreTableSchema,\n oldObjs: readonly any[] | undefined,\n newObjs: readonly any[] | undefined\n) {\n function addAffectedIndex(ix: DBCoreIndex) {\n const rangeSet = getRangeSet(ix.name || \"\");\n function extractKey(obj: any) {\n return obj != null ? ix.extractKey(obj) : null;\n }\n const addKeyOrKeys = (key: any) => ix.multiEntry && isArray(key)\n // multiEntry and the old property was an array - add each array entry to the rangeSet:\n ? key.forEach(key => rangeSet.addKey(key))\n // Not multiEntry or the old property was not an array - add each array entry to the rangeSet:\n : rangeSet.addKey(key);\n\n (oldObjs || newObjs).forEach((_, i) => {\n const oldKey = oldObjs && extractKey(oldObjs[i]);\n const newKey = newObjs && extractKey(newObjs[i]);\n if (cmp(oldKey, newKey) !== 0) {\n // The index has changed. Add both old and new value of the index.\n if (oldKey != null) addKeyOrKeys(oldKey); // If oldKey is invalid key, addKey() will be a noop.\n if (newKey != null) addKeyOrKeys(newKey); // If newKey is invalid key, addKey() will be a noop.\n }\n });\n }\n schema.indexes.forEach(addAffectedIndex);\n}\n","import { delArrayItem, isArray } from '../../functions/utils';\nimport { TblQueryCache } from '../../public/types/cache';\nimport {\n DBCoreMutateRequest,\n DBCoreMutateResponse,\n} from '../../public/types/dbcore';\n\nexport function adjustOptimisticFromFailures(\n tblCache: TblQueryCache,\n req: DBCoreMutateRequest,\n res: DBCoreMutateResponse\n): DBCoreMutateRequest {\n if (res.numFailures === 0) return req;\n if (req.type === 'deleteRange') {\n // numFailures > 0 means the deleteRange operation failed in its whole.\n return null;\n }\n\n const numBulkOps = req.keys\n ? req.keys.length\n : 'values' in req && req.values\n ? req.values.length\n : 1;\n if (res.numFailures === numBulkOps) {\n // Same number of failures as the number of ops. This means that all ops failed.\n return null;\n }\n\n const clone: DBCoreMutateRequest = { ...req };\n\n if (isArray(clone.keys)) {\n clone.keys = clone.keys.filter((_, i) => !(i in res.failures));\n }\n if ('values' in clone && isArray(clone.values)) {\n clone.values = clone.values.filter((_, i) => !(i in res.failures));\n }\n return clone;\n}\n","import { cmp } from '../../functions/cmp';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function isAboveLower(key: IndexableType, range: DBCoreKeyRange) {\n return range.lower === undefined\n ? true // lower is less than anything because it is undefined\n : range.lowerOpen\n ? cmp(key, range.lower) > 0 // lowerOpen: Exclude lower bound\n : cmp(key, range.lower) >= 0; // !lowerOpen: Include lower bound\n}\n\nexport function isBelowUpper(key: IndexableType, range: DBCoreKeyRange) {\n return range.upper === undefined\n ? true // upper is greater than anything because it is undefined\n : range.upperOpen\n ? cmp(key, range.upper) < 0 // upperOpen: Exclude upper bound\n : cmp(key, range.upper) <= 0; // !upperOpen: Include upper bound\n}\n\nexport function isWithinRange(key: IndexableType, range: DBCoreKeyRange) {\n return isAboveLower(key, range) && isBelowUpper(key, range);\n}\n","import { cmp } from '../../functions/cmp';\nimport { deepClone, isArray } from '../../functions/utils';\nimport { RangeSet, rangesOverlap } from '../../helpers/rangeset';\nimport { CacheEntry } from '../../public/types/cache';\nimport {\n DBCoreIndex,\n DBCoreMutateRequest,\n DBCoreQueryRequest,\n DBCoreTable,\n} from '../../public/types/dbcore';\nimport { isWithinRange } from './is-within-range';\n\nexport function applyOptimisticOps(\n result: any[],\n req: DBCoreQueryRequest,\n ops: DBCoreMutateRequest[] | undefined,\n table: DBCoreTable,\n cacheEntry: CacheEntry,\n immutable: boolean\n): any[] {\n if (!ops || ops.length === 0) return result;\n const index = req.query.index;\n const { multiEntry } = index;\n const queryRange = req.query.range;\n const primaryKey = table.schema.primaryKey;\n const extractPrimKey = primaryKey.extractKey!;\n const extractIndex = index.extractKey!;\n const extractLowLevelIndex = (index.lowLevelIndex || index).extractKey!;\n\n let finalResult = ops.reduce((result, op) => {\n let modifedResult = result;\n const includedValues =\n op.type === 'add' || op.type === 'put'\n ? op.values.filter((v) => {\n const key = extractIndex(v);\n return multiEntry && isArray(key) // multiEntry index work like plain index unless key is array\n ? key.some((k) => isWithinRange(k, queryRange)) // multiEntry and array key\n : isWithinRange(key, queryRange); // multiEntry but not array key\n }).map(v => {\n v = deepClone(v);// v might come from user so we can't just freeze it.\n if (immutable) Object.freeze(v);\n return v;\n })\n : [];\n switch (op.type) {\n case 'add':\n modifedResult = result.concat(\n req.values\n ? includedValues\n : includedValues.map((v) => extractPrimKey(v))\n );\n break;\n case 'put':\n const keySet = new RangeSet().addKeys(\n op.values.map((v) => extractPrimKey(v))\n );\n modifedResult = result\n .filter((item) => {\n const key = req.values ? extractPrimKey(item) : item;\n return !rangesOverlap(new RangeSet(key), keySet);\n })\n .concat(\n req.values\n ? includedValues\n : includedValues.map((v) => extractPrimKey(v))\n );\n break;\n case 'delete':\n const keysToDelete = new RangeSet().addKeys(op.keys);\n modifedResult = result.filter((item) => {\n const key = req.values ? extractPrimKey(item) : item;\n return !rangesOverlap(new RangeSet(key), keysToDelete);\n });\n\n break;\n case 'deleteRange':\n const range = op.range;\n modifedResult = result.filter((item) => !isWithinRange(extractPrimKey(item), range));\n break;\n }\n return modifedResult;\n }, result);\n\n // If no changes were made, we can return the original result.\n if (finalResult === result) return result;\n\n // Sort the result on sortIndex:\n finalResult.sort((a, b) =>\n cmp(extractLowLevelIndex(a), extractLowLevelIndex(b)) ||\n cmp(extractPrimKey(a), extractPrimKey(b))\n );\n\n // If we have a limit we need to respect it:\n if (req.limit && req.limit < Infinity) {\n if (finalResult.length > req.limit) {\n finalResult.length = req.limit; // Cut of any extras after sorting correctly.\n } else if (result.length === req.limit && finalResult.length < req.limit) {\n // We're missing some items because of the limit. We need to add them back.\n // The easiest way is to mark the cache entry as dirty, which will cause\n // it to be requeried after the write-transaction successfully completes.\n cacheEntry.dirty = true;\n }\n }\n return immutable ? Object.freeze(finalResult) as any[] : finalResult;\n}\n","import { cmp } from '../../functions/cmp';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function areRangesEqual(r1: DBCoreKeyRange, r2: DBCoreKeyRange) {\n return (\n cmp(r1.lower, r2.lower) === 0 &&\n cmp(r1.upper, r2.upper) === 0 &&\n !!r1.lowerOpen === !!r2.lowerOpen &&\n !!r1.upperOpen === !!r2.upperOpen\n );\n}\n","import { cmp } from '../../functions/cmp';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function compareLowers(lower1: any, lower2: any, lowerOpen1: boolean, lowerOpen2: boolean) {\n if (lower1 === undefined) return lower2 !== undefined ? -1 : 0;\n if (lower2 === undefined) return 1; // since lower1 !== undefined\n const c = cmp(lower1, lower2);\n if (c === 0) {\n if (lowerOpen1 && lowerOpen2) return 0;\n if (lowerOpen1) return 1\n if (lowerOpen2) return -1;\n }\n return c;\n}\n\nexport function compareUppers(upper1: any, upper2: any, upperOpen1: boolean, upperOpen2: boolean) {\n if (upper1 === undefined) return upper2 !== undefined ? 1 : 0;\n if (upper2 === undefined) return -1; // since upper1 !== undefined\n const c = cmp(upper1, upper2);\n if (c === 0) {\n if (upperOpen1 && upperOpen2) return 0;\n if (upperOpen1) return -1\n if (upperOpen2) return 1;\n }\n return c;\n}\n\nexport function isSuperRange(r1: DBCoreKeyRange, r2: DBCoreKeyRange) {\n return (\n compareLowers(r1.lower, r2.lower, r1.lowerOpen, r2.lowerOpen) <= 0 &&\n compareUppers(r1.upper, r2.upper, r1.upperOpen, r2.upperOpen) >= 0\n );\n}","import { CacheEntry, TblQueryCache } from '../../public/types/cache';\nimport {\n DBCoreCountRequest,\n DBCoreQueryRequest,\n} from '../../public/types/dbcore';\nimport { areRangesEqual } from './are-ranges-equal';\nimport { cache } from './cache';\nimport { isSuperRange } from './is-super-range';\n\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'query',\n req: DBCoreQueryRequest\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]];\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'count',\n req: DBCoreCountRequest\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]];\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'query' | 'count',\n req: Partial & Partial\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]] {\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (!tblCache) return [];\n const queries = tblCache.queries[type];\n if (!queries) return [null, false, tblCache, null];\n const indexName = req.query ? req.query.index.name : null;\n const entries = queries[indexName || ''];\n if (!entries) return [null, false, tblCache, null];\n\n switch (type) {\n case 'query':\n const equalEntry = entries.find(\n (entry) =>\n (entry.req as DBCoreQueryRequest).limit === req.limit &&\n (entry.req as DBCoreQueryRequest).values === req.values &&\n areRangesEqual(entry.req.query.range, req.query.range)\n );\n if (equalEntry)\n return [\n equalEntry,\n true, // exact match\n tblCache,\n entries,\n ];\n const superEntry = entries.find((entry) => {\n const limit = 'limit' in entry.req ? entry.req.limit : Infinity;\n return (\n limit >= req.limit &&\n (req.values ? (entry.req as DBCoreQueryRequest).values : true) &&\n isSuperRange(entry.req.query.range, req.query.range)\n );\n });\n return [superEntry, false, tblCache, entries];\n case 'count':\n const countQuery = entries.find((entry) =>\n areRangesEqual(entry.req.query.range, req.query.range)\n );\n return [countQuery, !!countQuery, tblCache, entries];\n }\n}\n","import { delArrayItem } from \"../../functions/utils\";\nimport { CacheEntry } from \"../../public/types/cache\";\n\nexport function subscribeToCacheEntry(cacheEntry: CacheEntry, container: CacheEntry[], requery: ()=>void, signal: AbortSignal) {\n cacheEntry.subscribers.add(requery);\n signal.addEventListener(\"abort\", () => {\n cacheEntry.subscribers.delete(requery);\n if (cacheEntry.subscribers.size === 0) {\n enqueForDeletion(cacheEntry, container);\n }\n });\n}\n\n\nfunction enqueForDeletion(cacheEntry: CacheEntry, container: CacheEntry[]) {\n setTimeout(() => {\n if (cacheEntry.subscribers.size === 0) { // Still empty (no new subscribers readded after grace time)\n delArrayItem(container, cacheEntry);\n }\n }, 3000);\n}\n","import { LiveQueryContext } from '..';\nimport type { Transaction } from '../../classes/transaction';\nimport { getEffectiveKeys } from '../../dbcore/get-effective-keys';\nimport { deepClone, delArrayItem, setByKeyPath } from '../../functions/utils';\nimport DexiePromise, { PSD } from '../../helpers/promise';\nimport { ObservabilitySet } from '../../public/types/db-events';\nimport {\n DBCore, DBCoreMutateRequest, DBCoreMutateResponse, DBCoreQueryRequest,\n DBCoreQueryResponse\n} from '../../public/types/dbcore';\nimport { Middleware } from '../../public/types/middleware';\nimport { obsSetsOverlap } from '../obs-sets-overlap';\nimport { adjustOptimisticFromFailures } from './adjust-optimistic-request-from-failures';\nimport { applyOptimisticOps } from './apply-optimistic-ops';\nimport { cache } from './cache';\nimport { findCompatibleQuery } from './find-compatible-query';\nimport { isCachableContext } from './is-cachable-context';\nimport { isCachableRequest } from './is-cachable-request';\nimport { signalSubscribersLazily } from './signalSubscribers';\nimport { subscribeToCacheEntry } from './subscribe-cachentry';\n\nexport const cacheMiddleware: Middleware = {\n stack: 'dbcore',\n level: 0,\n name: 'Cache',\n create: (core) => {\n const dbName = core.schema.name;\n const coreMW: DBCore = {\n ...core,\n transaction: (stores, mode, options) => {\n const idbtrans = core.transaction(\n stores,\n mode,\n options\n ) as IDBTransaction & {\n mutatedParts?: ObservabilitySet;\n _explicit?: boolean;\n };\n // Maintain TblQueryCache.ops array when transactions commit or abort\n if (mode === 'readwrite') {\n const ac = new AbortController();\n const { signal } = ac;\n const endTransaction = (wasCommitted: boolean) => () => {\n ac.abort();\n if (mode === 'readwrite') {\n // Collect which subscribers to notify:\n const affectedSubscribers = new Set<()=>void>();\n\n // Go through all tables in transaction and check if they have any optimistic updates\n for (const storeName of stores) {\n const tblCache = cache[`idb://${dbName}/${storeName}`];\n if (tblCache) {\n const table = core.table(storeName);\n // Pick optimistic ops that are part of this transaction\n const ops = tblCache.optimisticOps.filter(\n (op) => op.trans === idbtrans\n );\n // Transaction was marked as _explicit in enterTransactionScope(), transaction-helpers.ts.\n if (idbtrans._explicit && wasCommitted && idbtrans.mutatedParts) {\n // Invalidate all queries that overlap with the mutated parts and signal their subscribers\n for (const entries of Object.values(\n tblCache.queries.query\n )) {\n for (const entry of entries.slice()) {\n if (obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)) {\n delArrayItem(entries, entry); // Remove the entry from the cache so it can be refreshed\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n }\n }\n }\n } else if (ops.length > 0) {\n // Remove them from the optimisticOps array\n tblCache.optimisticOps = tblCache.optimisticOps.filter(\n (op) => op.trans !== idbtrans\n );\n // Commit or abort the optimistic updates\n for (const entries of Object.values(\n tblCache.queries.query\n )) {\n for (const entry of entries.slice()) {\n if (\n entry.res != null && // if entry.promise but not entry.res, we're fine. Query will resume now and get the result.\n idbtrans.mutatedParts/* &&\n obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)*/\n ) {\n if (wasCommitted && !entry.dirty) {\n const freezeResults = Object.isFrozen(entry.res);\n const modRes = applyOptimisticOps(\n entry.res as any[],\n entry.req,\n ops,\n table,\n entry,\n freezeResults\n );\n if (entry.dirty) {\n // Found out at this point that the entry is dirty - not to rely on!\n delArrayItem(entries, entry);\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n } else if (modRes !== entry.res) {\n entry.res = modRes;\n // Update promise\n entry.promise = DexiePromise.resolve({result: modRes} satisfies DBCoreQueryResponse);\n \n // No need to notify subscribers. They already have this value.\n // We have just updated the value of the cache without having to\n // requery the database - because we know the result for this\n // query based on computing the operations and applying them\n // to the previous result.\n }\n } else {\n if (entry.dirty) {\n // If the entry is dirty we need to get rid of it so that\n // a new entry will be created when the query is run again.\n delArrayItem(entries, entry);\n }\n // If we're not committing, we need to notify subscribers that the\n // optimistic updates are no longer valid.\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n }\n }\n }\n }\n }\n }\n }\n affectedSubscribers.forEach((requery) => requery());\n }\n };\n idbtrans.addEventListener('abort', endTransaction(false), {\n signal,\n });\n idbtrans.addEventListener('error', endTransaction(false), {\n signal,\n });\n idbtrans.addEventListener('complete', endTransaction(true), {\n signal,\n });\n }\n return idbtrans;\n },\n table(tableName: string) {\n const downTable = core.table(tableName);\n const primKey = downTable.schema.primaryKey;\n const tableMW = {\n ...downTable,\n mutate(req: DBCoreMutateRequest): Promise {\n const trans = PSD.trans as Transaction;\n if (\n primKey.outbound || // Non-inbound tables are harded to apply optimistic updates on because we can't know primary key of results\n trans.db._options.cache === 'disabled' || // User has opted-out from caching\n trans.explicit // It's an explicit write transaction being made. Don't affect cache until transaction commits.\n ) {\n // Just forward the request to the core.\n return downTable.mutate(req);\n }\n // Find the TblQueryCache for this table:\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (!tblCache) return downTable.mutate(req);\n\n const promise = downTable.mutate(req);\n if ((req.type === 'add' || req.type === 'put') && (req.values.length >= 50 || getEffectiveKeys(primKey, req).some(key => key == null))) {\n // There are some autoIncremented keys not set yet. Need to wait for completion before we can reliably enqueue the operation.\n // (or there are too many objects so we lazy out to avoid performance bottleneck for large bulk inserts)\n promise.then((res) => { // We need to extract result keys and generate cloned values with the keys set (so that applyOptimisticOps can work)\n // But we have a problem! The req.mutatedParts is still not complete so we have to actively add the keys to the unsignaledParts set manually.\n const reqWithResolvedKeys = {\n ...req,\n values: req.values.map((value, i) => {\n const valueWithKey = primKey.keyPath?.includes('.')\n ? deepClone(value)\n : {\n ...value,\n };\n setByKeyPath(valueWithKey, primKey.keyPath, res.results![i]);\n return valueWithKey;\n })\n };\n const adjustedReq = adjustOptimisticFromFailures(tblCache, reqWithResolvedKeys, res);\n tblCache.optimisticOps.push(adjustedReq);\n // Signal subscribers after the observability middleware has complemented req.mutatedParts with the new keys.\n // We must queue the task so that we get the req.mutatedParts updated by observability middleware first.\n // If we refactor the dependency between observability middleware and this middleware we might not need to queue the task.\n queueMicrotask(()=>req.mutatedParts && signalSubscribersLazily(req.mutatedParts)); // Reason for double laziness: in user awaits put and then does another put, signal once.\n });\n } else {\n // Enque the operation immediately\n tblCache.optimisticOps.push(req);\n // Signal subscribers that there are mutated parts\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts);\n promise.then((res) => {\n if (res.numFailures > 0) {\n // In case the operation failed, we need to remove it from the optimisticOps array.\n delArrayItem(tblCache.optimisticOps, req);\n const adjustedReq = adjustOptimisticFromFailures(tblCache, req, res);\n if (adjustedReq) {\n tblCache.optimisticOps.push(adjustedReq);\n }\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts); // Signal the rolling back of the operation.\n }\n });\n promise.catch(()=> {\n // In case the operation failed, we need to remove it from the optimisticOps array.\n delArrayItem(tblCache.optimisticOps, req);\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts); // Signal the rolling back of the operation.\n });\n }\n return promise;\n },\n query(req: DBCoreQueryRequest): Promise {\n if (!isCachableContext(PSD, downTable) || !isCachableRequest(\"query\", req)) return downTable.query(req);\n const freezeResults =\n (PSD as LiveQueryContext).trans?.db._options.cache === 'immutable';\n const { requery, signal } = PSD as LiveQueryContext;\n let [cacheEntry, exactMatch, tblCache, container] =\n findCompatibleQuery(dbName, tableName, 'query', req);\n if (cacheEntry && exactMatch) {\n cacheEntry.obsSet = req.obsSet!; // So that optimistic result is monitored.\n // How? - because observability-middleware will track result where optimistic\n // mutations are applied and record it in the cacheEntry.\n // TODO: CHANGE THIS! The difference is resultKeys only.\n // Wanted behavior:\n // * cacheEntry obsSet should represent the obsSet without optimistic updates (so it can be checked when merging ops in tx commit)\n // * cacheEntry optimisticObsSet should represent the obsSet with current optimistic updates. It should be updated when adding an op\n // by adding the primary keys of the put/add/delete operation to the set.\n // * observability-middleware should stop recording req.obsSet when a cache entry exact match is found because it won't be used anyway.\n // I'm thinking of merging observability-middleware with cache-middleware into one single middleware because the dependencies are too\n // tight between them.\n } else {\n // --> TODO here: If not exact match, check if we have a superset to extract\n // the data from.\n\n // No cached result found. We need to query the database and cache the result.\n const promise = downTable.query(req).then((res) => {\n // Freeze or clone results\n const result = res.result;\n if (cacheEntry) cacheEntry.res = result;\n if (freezeResults) {\n // For performance reasons don't deep freeze.\n // Only freeze the top-level array and its items.\n // This is good enough to teach users that the result must be treated as immutable\n // without enforcing it recursively on the entire result (which is not even possible\n // for things like Date objects and typed arrays)\n for (let i = 0, l = result.length; i < l; ++i) {\n Object.freeze(result[i]);\n }\n Object.freeze(result);\n } else {\n // If not frozen, we need to clone the result to avoid user mutating the cache\n // When we do this, user's must feel conformable with the fact that the result\n // can be mutated deeply - user is not expected to have any respect for immutability.\n res.result = deepClone(result);\n }\n return res;\n }).catch(error => {\n // In case the query operation failed, we need to remove it from the cache\n // so that subsequent calls does not get the same error but re-evaluate\n // the query.\n if (container && cacheEntry) delArrayItem(container, cacheEntry);\n return Promise.reject(error);\n });\n cacheEntry = {\n obsSet: req.obsSet!,\n promise,\n subscribers: new Set(),\n type: 'query',\n req,\n dirty: false,\n };\n if (container) {\n container.push(cacheEntry);\n } else {\n container = [cacheEntry];\n if (!tblCache) {\n tblCache = cache[`idb://${dbName}/${tableName}`] = {\n queries: {\n query: {},\n count: {},\n },\n objs: new Map(),\n optimisticOps: [],\n unsignaledParts: {}\n };\n }\n tblCache.queries.query[req.query.index.name || ''] = container;\n }\n }\n subscribeToCacheEntry(cacheEntry, container!, requery, signal);\n return cacheEntry.promise.then((res: DBCoreQueryResponse) => {\n return {\n result: applyOptimisticOps(\n res.result,\n req,\n tblCache?.optimisticOps,\n downTable,\n cacheEntry!,\n freezeResults\n ) as any[], // readonly any[]\n };\n });\n },\n };\n return tableMW;\n },\n };\n return coreMW;\n },\n};\n\n\n","import { type Dexie } from \"../classes/dexie\";\nimport { type Table } from \"../classes/table\";\nimport { type Transaction } from \"../classes/transaction\";\n\nexport function vipify(\n target: T,\n vipDb: Dexie\n): T {\n return new Proxy(target, {\n get (target, prop, receiver) {\n // The \"db\" prop of the table or transaction is the only one we need to\n // override. The rest of the props can be accessed from the original\n // object.\n if (prop === 'db') return vipDb;\n return Reflect.get(target, prop, receiver);\n }\n });\n}\n","// Import types from the public API\nimport { Dexie as IDexie } from \"../../public/types/dexie\";\nimport { DexieOptions, DexieConstructor } from \"../../public/types/dexie-constructor\";\nimport { DbEvents } from \"../../public/types/db-events\";\n//import { PromiseExtended, PromiseExtendedConstructor } from '../../public/types/promise-extended';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from \"../../public/types/table-schema\";\nimport { DbSchema } from '../../public/types/db-schema';\n\n// Internal imports\nimport { Table, TableConstructor, createTableConstructor } from \"../table\";\nimport { Collection, CollectionConstructor, createCollectionConstructor } from '../collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { WhereClauseConstructor, createWhereClauseConstructor } from '../where-clause/where-clause-constructor';\nimport { Transaction } from '../transaction';\nimport { TransactionConstructor, createTransactionConstructor } from '../transaction/transaction-constructor';\nimport { Version } from \"../version/version\";\nimport { VersionConstructor, createVersionConstructor } from '../version/version-constructor';\n\n// Other imports...\nimport { DexieEventSet } from '../../public/types/dexie-event-set';\nimport { DexieExceptionClasses } from '../../public/types/errors';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\nimport Promise, { PSD, globalPSD } from '../../helpers/promise';\nimport { extend, override, keys, hasOwn } from '../../functions/utils';\nimport Events from '../../helpers/Events';\nimport { maxString, connections, READONLY, READWRITE } from '../../globals/constants';\nimport { getMaxKey } from '../../functions/quirks';\nimport { exceptions } from '../../errors';\nimport { lowerVersionFirst } from '../version/schema-helpers';\nimport { dexieOpen } from './dexie-open';\nimport { wrap } from '../../helpers/promise';\nimport { _onDatabaseDeleted } from '../../helpers/database-enumerator';\nimport { eventRejectHandler } from '../../functions/event-wrappers';\nimport { extractTransactionArgs, enterTransactionScope } from './transaction-helpers';\nimport { TransactionMode } from '../../public/types/transaction-mode';\nimport { rejection } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { DBCore } from '../../public/types/dbcore';\nimport { Middleware, DexieStacks } from '../../public/types/middleware';\nimport { virtualIndexMiddleware } from '../../dbcore/virtual-index-middleware';\nimport { hooksMiddleware } from '../../hooks/hooks-middleware';\nimport { IndexableType } from '../../public';\nimport { observabilityMiddleware } from '../../live-query/observability-middleware';\nimport { cacheExistingValuesMiddleware } from '../../dbcore/cache-existing-values-middleware';\nimport { cacheMiddleware } from \"../../live-query/cache/cache-middleware\";\nimport { vipify } from \"../../helpers/vipify\";\n\nexport interface DbReadyState {\n dbOpenError: any;\n isBeingOpened: boolean;\n onReadyBeingFired: undefined | Function[];\n openComplete: boolean;\n dbReadyResolve: () => void;\n dbReadyPromise: Promise;\n cancelOpen: (reason?: Error) => void;\n openCanceller: Promise & { _stackHolder?: Error };\n autoSchema: boolean;\n vcFired?: boolean;\n PR1398_maxLoop?: number;\n autoOpen?: boolean;\n}\n\nexport class Dexie implements IDexie {\n _options: DexieOptions;\n _state: DbReadyState;\n _versions: Version[];\n _storeNames: string[];\n _deps: DexieDOMDependencies;\n _allTables: { [name: string]: Table; };\n _createTransaction: (this: Dexie, mode: IDBTransactionMode, storeNames: ArrayLike, dbschema: { [tableName: string]: TableSchema; }, parentTransaction?: Transaction) => Transaction;\n _dbSchema: { [tableName: string]: TableSchema; };\n _hasGetAll?: boolean;\n _maxKey: IndexableType;\n _fireOnBlocked: (ev: Event) => void;\n _middlewares: {[StackName in keyof DexieStacks]?: Middleware[]} = {};\n _vip?: boolean;\n _novip: Dexie;// db._novip is to escape to orig db from db.vip.\n core: DBCore;\n\n name: string;\n verno: number = 0;\n idbdb: IDBDatabase | null;\n vip: Dexie;\n on: DbEvents;\n\n Table: TableConstructor;\n WhereClause: WhereClauseConstructor;\n Collection: CollectionConstructor;\n Version: VersionConstructor;\n Transaction: TransactionConstructor;\n static disableBfCache?: boolean;\n\n constructor(name: string, options?: DexieOptions) {\n const deps = (Dexie as any as DexieConstructor).dependencies;\n this._options = options = {\n // Default Options\n addons: (Dexie as any as DexieConstructor).addons, // Pick statically registered addons by default\n autoOpen: true, // Don't require db.open() explicitely.\n // Default DOM dependency implementations from static prop.\n indexedDB: deps.indexedDB, // Backend IndexedDB api. Default to browser env.\n IDBKeyRange: deps.IDBKeyRange, // Backend IDBKeyRange api. Default to browser env.\n cache: 'cloned', // Default to cloned for backward compatibility. For best performance and least memory consumption use 'immutable'.\n ...options\n }; \n this._deps = {\n indexedDB: options.indexedDB as IDBFactory,\n IDBKeyRange: options.IDBKeyRange as typeof IDBKeyRange\n };\n const {\n addons,\n } = options;\n this._dbSchema = {};\n this._versions = [];\n this._storeNames = [];\n this._allTables = {};\n this.idbdb = null;\n this._novip = this;\n const state: DbReadyState = {\n dbOpenError: null,\n isBeingOpened: false,\n onReadyBeingFired: null,\n openComplete: false,\n dbReadyResolve: nop,\n dbReadyPromise: null as Promise,\n cancelOpen: nop,\n openCanceller: null as Promise,\n autoSchema: true,\n PR1398_maxLoop: 3,\n autoOpen: options.autoOpen,\n };\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n this._state = state;\n this.name = name;\n this.on = Events(this, \"populate\", \"blocked\", \"versionchange\", \"close\", { ready: [promisableChain, nop] }) as DbEvents;\n this.on.ready.subscribe = override(this.on.ready.subscribe, subscribe => {\n return (subscriber, bSticky) => {\n (Dexie as any as DexieConstructor).vip(() => {\n const state = this._state;\n if (state.openComplete) {\n // Database already open. Call subscriber asap.\n if (!state.dbOpenError) Promise.resolve().then(subscriber);\n // bSticky: Also subscribe to future open sucesses (after close / reopen) \n if (bSticky) subscribe(subscriber);\n } else if (state.onReadyBeingFired) {\n // db.on('ready') subscribers are currently being executed and have not yet resolved or rejected\n state.onReadyBeingFired.push(subscriber);\n if (bSticky) subscribe(subscriber);\n } else {\n // Database not yet open. Subscribe to it.\n subscribe(subscriber);\n // If bSticky is falsy, make sure to unsubscribe subscriber when fired once.\n const db = this;\n if (!bSticky) subscribe(function unsubscribe() {\n db.on.ready.unsubscribe(subscriber);\n db.on.ready.unsubscribe(unsubscribe);\n });\n }\n });\n }\n });\n\n // Create derived classes bound to this instance of Dexie:\n this.Collection = createCollectionConstructor(this);\n this.Table = createTableConstructor(this);\n this.Transaction = createTransactionConstructor(this);\n this.Version = createVersionConstructor(this);\n this.WhereClause = createWhereClauseConstructor(this);\n\n // Default subscribers to \"versionchange\" and \"blocked\".\n // Can be overridden by custom handlers. If custom handlers return false, these default\n // behaviours will be prevented.\n this.on(\"versionchange\", ev => {\n // Default behavior for versionchange event is to close database connection.\n // Caller can override this behavior by doing db.on(\"versionchange\", function(){ return false; });\n // Let's not block the other window from making it's delete() or open() call.\n // NOTE! This event is never fired in IE,Edge or Safari.\n if (ev.newVersion > 0)\n console.warn(`Another connection wants to upgrade database '${this.name}'. Closing db now to resume the upgrade.`);\n else\n console.warn(`Another connection wants to delete database '${this.name}'. Closing db now to resume the delete request.`);\n this.close({disableAutoOpen: false});\n // In many web applications, it would be recommended to force window.reload()\n // when this event occurs. To do that, subscribe to the versionchange event\n // and call window.location.reload(true) if ev.newVersion > 0 (not a deletion)\n // The reason for this is that your current web app obviously has old schema code that needs\n // to be updated. Another window got a newer version of the app and needs to upgrade DB but\n // your window is blocking it unless we close it here.\n });\n this.on(\"blocked\", ev => {\n if (!ev.newVersion || ev.newVersion < ev.oldVersion)\n console.warn(`Dexie.delete('${this.name}') was blocked`);\n else\n console.warn(`Upgrade '${this.name}' blocked by other connection holding version ${ev.oldVersion / 10}`);\n });\n\n this._maxKey = getMaxKey(options.IDBKeyRange as typeof IDBKeyRange);\n\n this._createTransaction = (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n parentTransaction?: Transaction) => new this.Transaction(mode, storeNames, dbschema, this._options.chromeTransactionDurability, parentTransaction);\n\n this._fireOnBlocked = ev => {\n this.on(\"blocked\").fire(ev);\n // Workaround (not fully*) for missing \"versionchange\" event in IE,Edge and Safari:\n connections\n .filter(c => c.name === this.name && c !== this && !c._state.vcFired)\n .map(c => c.on(\"versionchange\").fire(ev));\n }\n\n // Default middlewares:\n this.use(cacheExistingValuesMiddleware);\n this.use(cacheMiddleware);\n this.use(observabilityMiddleware);\n this.use(virtualIndexMiddleware);\n this.use(hooksMiddleware);\n\n const vipDB = new Proxy(this, {\n get: (_, prop, receiver) => {\n if (prop === '_vip') return true;\n if (prop === 'table') return (tableName: string) => vipify(this.table(tableName), vipDB);\n const rv = Reflect.get(_, prop, receiver);\n if (rv instanceof Table) return vipify(rv, vipDB);\n if (prop === 'tables') return (rv as Table[]).map(t => vipify(t, vipDB));\n if (prop === '_createTransaction') return function() {\n const tx: Transaction = (rv as typeof this._createTransaction).apply(this, arguments);\n return vipify(tx, vipDB);\n }\n return rv;\n }\n });\n this.vip = vipDB;\n\n // Call each addon:\n addons.forEach(addon => addon(this));\n }\n\n version(versionNumber: number): Version {\n if (isNaN(versionNumber) || versionNumber < 0.1) throw new exceptions.Type(`Given version is not a positive number`);\n versionNumber = Math.round(versionNumber * 10) / 10;\n if (this.idbdb || this._state.isBeingOpened)\n throw new exceptions.Schema(\"Cannot add version when database is open\");\n this.verno = Math.max(this.verno, versionNumber);\n const versions = this._versions;\n var versionInstance = versions.filter(\n v => v._cfg.version === versionNumber)[0];\n if (versionInstance) return versionInstance;\n versionInstance = new this.Version(versionNumber);\n versions.push(versionInstance);\n versions.sort(lowerVersionFirst);\n versionInstance.stores({}); // Derive earlier schemas by default.\n // Disable autoschema mode, as at least one version is specified.\n this._state.autoSchema = false;\n return versionInstance;\n }\n\n _whenReady(fn: () => Promise): Promise {\n return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new Promise((resolve, reject) => {\n if (this._state.openComplete) {\n // idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return reject(new exceptions.DatabaseClosed(this._state.dbOpenError));\n }\n if (!this._state.isBeingOpened) {\n if (!this._state.autoOpen) {\n reject(new exceptions.DatabaseClosed());\n return;\n }\n this.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n this._state.dbReadyPromise.then(resolve, reject);\n }).then(fn);\n }\n\n use({stack, create, level, name}: Middleware): this {\n if (name) this.unuse({stack, name}); // Be able to replace existing middleware.\n const middlewares = this._middlewares[stack] || (this._middlewares[stack] = []);\n middlewares.push({stack, create, level: level == null ? 10 : level, name});\n middlewares.sort((a, b) => a.level - b.level);\n // Todo update db.core and db.tables...core ? Or should be expect this to have effect\n // only after next open()?\n return this;\n }\n\n unuse({stack, create}: Middleware<{stack: keyof DexieStacks}>): this;\n unuse({stack, name}: {stack: keyof DexieStacks, name: string}): this;\n unuse({stack, name, create}: {stack: keyof DexieStacks, name?: string, create?: Function}) {\n if (stack && this._middlewares[stack]) {\n this._middlewares[stack] = this._middlewares[stack].filter(mw =>\n create ? mw.create !== create : // Given middleware has a create method. Match that exactly.\n name ? mw.name !== name : // Given middleware spec \n false);\n }\n return this;\n }\n\n open() {\n return usePSD(\n globalPSD, // Enforce global scope here since db.open() can be part of a live query or transaction scope\n () => dexieOpen(this)\n );\n }\n\n _close(): void {\n const state = this._state;\n const idx = connections.indexOf(this);\n if (idx >= 0) connections.splice(idx, 1);\n if (this.idbdb) {\n try { this.idbdb.close(); } catch (e) { }\n this.idbdb = null;\n } \n // Reset dbReadyPromise promise:\n if (!state.isBeingOpened) {\n // Only if not being opened, reset these promises.\n // Otherwise, keep them so existing promise consumers will resolve when db\n // db is reopened later on, in case closing for purpose reopening, using {disableAutoOpen: false}.\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n }\n }\n\n close({disableAutoOpen} = {disableAutoOpen: true}): void {\n const state = this._state;\n if (disableAutoOpen) {\n if (state.isBeingOpened) {\n // cancel before the call to this._close() because this._close() will recreate dbReadyPromise and openCanceller.\n state.cancelOpen(new exceptions.DatabaseClosed());\n }\n this._close();\n state.autoOpen = false;\n state.dbOpenError = new exceptions.DatabaseClosed();\n } else {\n this._close();\n state.autoOpen = this._options.autoOpen ||\n state.isBeingOpened; // If an open call is ongoing, that same promise will resolve when db is reopend.\n state.openComplete = false;\n state.dbOpenError = null;\n }\n }\n\n delete(closeOptions = {disableAutoOpen: true}): Promise {\n // Prevent accidentially doing db.delete(1) when intention was to do db.[table].delete(1).\n const hasInvalidArguments = arguments.length > 0 && typeof arguments[0] !== 'object'; \n const state = this._state;\n return new Promise((resolve, reject) => {\n const doDelete = () => {\n this.close(closeOptions);\n var req = this._deps.indexedDB.deleteDatabase(this.name);\n req.onsuccess = wrap(() => {\n _onDatabaseDeleted(this._deps, this.name);\n resolve();\n });\n req.onerror = eventRejectHandler(reject);\n req.onblocked = this._fireOnBlocked;\n }\n // Prevent accidentially doing db.delete(1) when intention was to do db.[table].delete(1).\n if (hasInvalidArguments) throw new exceptions.InvalidArgument(\"Invalid closeOptions argument to db.delete()\");\n if (state.isBeingOpened) {\n state.dbReadyPromise.then(doDelete);\n } else {\n doDelete();\n }\n });\n }\n\n backendDB() {\n return this.idbdb;\n }\n\n isOpen() {\n return this.idbdb !== null;\n }\n\n hasBeenClosed() {\n const dbOpenError = this._state.dbOpenError;\n return dbOpenError && (dbOpenError.name === 'DatabaseClosed');\n }\n\n hasFailed() {\n return this._state.dbOpenError !== null;\n }\n\n dynamicallyOpened() {\n return this._state.autoSchema;\n }\n\n get tables () {\n return keys(this._allTables).map(name => this._allTables[name]);\n }\n\n transaction(): Promise {\n const args = extractTransactionArgs.apply(this, arguments);\n return this._transaction.apply(this, args);\n }\n\n _transaction(mode: TransactionMode, tables: Array, scopeFunc: Function) {\n let parentTransaction = PSD.trans as Transaction | undefined;\n // Check if parent transactions is bound to this db instance, and if caller wants to reuse it\n if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) parentTransaction = null;\n const onlyIfCompatible = mode.indexOf('?') !== -1;\n mode = mode.replace('!', '').replace('?', '') as TransactionMode; // Ok. Will change arguments[0] as well but we wont touch arguments henceforth.\n let idbMode: IDBTransactionMode,\n storeNames;\n\n try {\n //\n // Get storeNames from arguments. Either through given table instances, or through given table names.\n //\n storeNames = tables.map(table => {\n var storeName = table instanceof this.Table ? table.name : table;\n if (typeof storeName !== 'string') throw new TypeError(\"Invalid table argument to Dexie.transaction(). Only Table or String are allowed\");\n return storeName;\n });\n\n //\n // Resolve mode. Allow shortcuts \"r\" and \"rw\".\n //\n if (mode == \"r\" || mode === READONLY)\n idbMode = READONLY;\n else if (mode == \"rw\" || mode == READWRITE)\n idbMode = READWRITE;\n else\n throw new exceptions.InvalidArgument(\"Invalid transaction mode: \" + mode);\n\n if (parentTransaction) {\n // Basic checks\n if (parentTransaction.mode === READONLY && idbMode === READWRITE) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY\");\n }\n if (parentTransaction) {\n storeNames.forEach(storeName => {\n if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Table \" + storeName +\n \" not included in parent transaction.\");\n }\n });\n }\n if (onlyIfCompatible && parentTransaction && !parentTransaction.active) {\n // '?' mode should not keep using an inactive transaction.\n parentTransaction = null;\n }\n }\n } catch (e) {\n return parentTransaction ?\n parentTransaction._promise(null, (_, reject) => {reject(e);}) :\n rejection (e);\n }\n // If this is a sub-transaction, lock the parent and then launch the sub-transaction.\n const enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc);\n return (parentTransaction ?\n parentTransaction._promise(idbMode, enterTransaction, \"lock\") :\n PSD.trans ?\n // no parent transaction despite PSD.trans exists. Make sure also\n // that the zone we create is not a sub-zone of current, because\n // Promise.follow() should not wait for it if so.\n usePSD(PSD.transless, ()=>this._whenReady(enterTransaction)) :\n this._whenReady (enterTransaction));\n }\n\n table(tableName: string): Table;\n table(tableName: string): ITable;\n table(tableName: string): Table {\n if (!hasOwn(this._allTables, tableName)) {\n throw new exceptions.InvalidTable(`Table ${tableName} does not exist`); }\n return this._allTables[tableName];\n }\n}\n","import {\n Observable as IObservable,\n Observer,\n Subscription,\n} from \"../../public/types/observable\";\n\nconst symbolObservable: typeof Symbol.observable =\n typeof Symbol !== \"undefined\" && \"observable\" in Symbol\n ? Symbol.observable\n : \"@@observable\" as any;\n\nexport class Observable implements IObservable {\n private _subscribe: (observer: Observer) => Subscription;\n hasValue?: ()=>boolean;\n getValue?: ()=>T;\n\n constructor(subscribe: (observer: Observer) => Subscription) {\n this._subscribe = subscribe;\n }\n\n subscribe(\n onNext?: ((value: T) => void) | null,\n onError?: ((error: any) => void) | null,\n onComplete?: (() => void) | null\n ): Subscription;\n subscribe(observer?: Observer | null): Subscription;\n subscribe(x?: any, error?: any, complete?: any): Subscription {\n return this._subscribe(\n !x || typeof x === \"function\" ? { next: x, error, complete } : x\n );\n }\n\n [symbolObservable]() {\n return this;\n }\n}\n","import { _global } from '../../globals/global';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\n\nexport let domDeps: DexieDOMDependencies\n\ntry {\n domDeps = {\n // Required:\n indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB,\n IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange\n };\n} catch (e) {\n domDeps = { indexedDB: null, IDBKeyRange: null };\n}\n","import { _global, isAsyncFunction, keys, objectIsEmpty } from '../functions/utils';\nimport {\n globalEvents,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport {\n beginMicroTickScope,\n decrementExpectedAwaits,\n endMicroTickScope,\n execInGlobalContext,\n incrementExpectedAwaits,\n NativePromise,\n newScope,\n PSD,\n usePSD,\n} from '../helpers/promise';\nimport { ObservabilitySet } from '../public/types/db-events';\nimport {\n Observable as IObservable,\n Subscription,\n} from '../public/types/observable';\nimport { Observable } from '../classes/observable/observable';\nimport { extendObservabilitySet } from './extend-observability-set';\nimport { rangesOverlap } from '../helpers/rangeset';\nimport { domDeps } from '../classes/dexie/dexie-dom-dependencies';\nimport { Transaction } from '../classes/transaction';\nimport { obsSetsOverlap } from './obs-sets-overlap';\n\nexport interface LiveQueryContext {\n subscr: ObservabilitySet;\n signal: AbortSignal;\n requery: () => void;\n trans: null | Transaction;\n querier: Function; // For debugging purposes and Error messages\n}\n\nexport function liveQuery(querier: () => T | Promise): IObservable {\n let hasValue = false;\n let currentValue: T;\n const observable = new Observable((observer) => {\n const scopeFuncIsAsync = isAsyncFunction(querier);\n function execute(ctx: LiveQueryContext) {\n const wasRootExec = beginMicroTickScope(); // Performance: Avoid starting a new microtick scope within the async context.\n try {\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n let rv = newScope(querier, ctx);\n if (scopeFuncIsAsync) {\n // Make sure to set rv = rv.finally in order to wait to after decrementExpectedAwaits() has been called.\n // This fixes zone leaking issue that the liveQuery zone can leak to observer's next microtask.\n rv = (rv as Promise).finally(decrementExpectedAwaits);\n }\n return rv;\n } finally {\n wasRootExec && endMicroTickScope(); // Given that we created the microtick scope, we must also end it.\n }\n }\n\n let closed = false;\n let abortController: AbortController;\n\n let accumMuts: ObservabilitySet = {};\n let currentObs: ObservabilitySet = {};\n\n const subscription: Subscription = {\n get closed() {\n return closed;\n },\n unsubscribe: () => {\n if (closed) return;\n closed = true;\n if (abortController) abortController.abort();\n if (startedListening) globalEvents.storagemutated.unsubscribe(mutationListener);\n },\n };\n\n observer.start && observer.start(subscription); // https://github.com/tc39/proposal-observable\n\n let startedListening = false;\n\n const doQuery = () => execInGlobalContext(_doQuery);\n\n function shouldNotify() {\n return obsSetsOverlap(currentObs, accumMuts);\n }\n\n const mutationListener = (parts: ObservabilitySet) => {\n extendObservabilitySet(accumMuts, parts);\n if (shouldNotify()) {\n doQuery();\n }\n };\n\n const _doQuery = () => {\n if (\n closed || // closed - don't run!\n !domDeps.indexedDB) // SSR in sveltekit, nextjs etc\n {\n return;\n }\n accumMuts = {};\n const subscr: ObservabilitySet = {};\n // Abort signal fill three purposes:\n // 1. Abort the query if the observable is unsubscribed.\n // 2. Abort the query if a new query is made before the previous one has completed.\n // 3. For cached queries to know if they should remain in memory or could be enqued for being freed up.\n // (they will remain in memory for a short time and if noone needs them again, they will eventually be freed up)\n if (abortController) abortController.abort(); // Cancel previous query. Last query will be cancelled on unsubscribe().\n abortController = new AbortController();\n \n const ctx: LiveQueryContext = {\n subscr,\n signal: abortController.signal,\n requery: doQuery,\n querier,\n trans: null // Make the scope transactionless (don't reuse transaction from outer scope of the caller of subscribe())\n }\n const ret = execute(ctx);\n Promise.resolve(ret).then(\n (result) => {\n hasValue = true;\n currentValue = result;\n if (closed || ctx.signal.aborted) {\n // closed - no subscriber anymore.\n // signal.aborted - new query was made before this one completed and\n // the querier might have catched AbortError and return successful result.\n // If so, we should not rely in that result because we know we have aborted\n // this run, which means there's another run going on that will handle accumMuts\n // and we must not base currentObs on the half-baked subscr.\n return;\n }\n accumMuts = {};\n // Update what we are subscribing for based on this last run:\n currentObs = subscr;\n if (!objectIsEmpty(currentObs) && !startedListening) {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener);\n startedListening = true;\n }\n execInGlobalContext(()=>!closed && observer.next && observer.next(result));\n },\n (err) => {\n hasValue = false;\n if (!['DatabaseClosedError', 'AbortError'].includes(err?.name)) {\n if (!closed) execInGlobalContext(()=>{\n if (closed) return;\n observer.error && observer.error(err);\n });\n }\n }\n );\n };\n\n // Use setTimeot here to guarantee execution in a private macro task before and\n // after. The helper executeInGlobalContext(_doQuery) is not enough here because\n // caller of `subscribe()` could be anything, such as a frontend framework that will\n // continue in the same tick after subscribe() is called and call other\n // eftects, that could involve dexie operations such as writing to the DB.\n // If that happens, the private zone echoes from a live query tast started here\n // could still be ongoing when the other operations start and make them inherit\n // the async context from a live query.\n setTimeout(doQuery, 0);\n return subscription;\n });\n observable.hasValue = () => hasValue;\n observable.getValue = () => currentValue;\n return observable;\n}\n","import { Dexie as _Dexie } from './dexie';\nimport { _global } from '../../globals/global';\nimport { props, derive, extend, override, getByKeyPath, setByKeyPath, delByKeyPath, shallowClone, deepClone, asap } from '../../functions/utils';\nimport { getObjectDiff } from \"../../functions/get-object-diff\";\nimport { fullNameExceptions } from '../../errors';\nimport { DexieConstructor } from '../../public/types/dexie-constructor';\nimport { getDatabaseNames } from '../../helpers/database-enumerator';\nimport { PSD } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { newScope } from '../../helpers/promise';\nimport { rejection } from '../../helpers/promise';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { dexieStackFrameFilter, minKey, connections, DEXIE_VERSION } from '../../globals/constants';\nimport Events from '../../helpers/Events';\nimport { exceptions } from '../../errors';\nimport { errnames } from '../../errors';\nimport { getMaxKey } from '../../functions/quirks';\nimport { vip } from './vip';\nimport { globalEvents } from '../../globals/global-events';\nimport { liveQuery } from '../../live-query/live-query';\nimport { extendObservabilitySet } from '../../live-query/extend-observability-set';\nimport { domDeps } from './dexie-dom-dependencies';\nimport { cmp } from '../../functions/cmp';\nimport { cache } from '../../live-query/cache/cache';\n\n/* (Dexie) is an instance of DexieConstructor, as defined in public/types/dexie-constructor.d.ts\n* (new Dexie()) is an instance of Dexie, as defined in public/types/dexie.d.ts\n* \n* Why we're doing this?\n\n* Because we've choosen to define the public Dexie API using a DexieConstructor interface\n* rather than declaring a class. On that interface, all static props are defined.\n* In practice, class Dexie's constructor implements DexieConstructor and all member props\n* are defined in interface Dexie. We could say, it's a typescript limitation of not being\n* able to define a static interface that forces us to do the cast below.\n*/\nconst Dexie = _Dexie as any as DexieConstructor;\n\n//\n// Set all static methods and properties onto Dexie:\n// \nprops(Dexie, {\n\n // Dexie.BulkError = class BulkError {...};\n // Dexie.XXXError = class XXXError {...};\n ...fullNameExceptions,\n\n //\n // Static delete() method.\n //\n delete(databaseName: string) {\n const db = new Dexie(databaseName, {addons: []});\n return db.delete();\n },\n\n //\n // Static exists() method.\n //\n exists(name: string) {\n return new Dexie(name, { addons: [] }).open().then(db => {\n db.close();\n return true;\n }).catch('NoSuchDatabaseError', () => false);\n },\n\n //\n // Static method for retrieving a list of all existing databases at current host.\n //\n getDatabaseNames(cb) {\n try {\n return getDatabaseNames(Dexie.dependencies).then(cb);\n } catch {\n return rejection(new exceptions.MissingAPI());\n }\n },\n\n /** @deprecated */\n defineClass() {\n function Class(content) {\n extend(this, content);\n }\n return Class;\n },\n\n ignoreTransaction(scopeFunc) {\n // In case caller is within a transaction but needs to create a separate transaction.\n // Example of usage:\n //\n // Let's say we have a logger function in our app. Other application-logic should be unaware of the\n // logger function and not need to include the 'logentries' table in all transaction it performs.\n // The logging should always be done in a separate transaction and not be dependant on the current\n // running transaction context. Then you could use Dexie.ignoreTransaction() to run code that starts a new transaction.\n //\n // Dexie.ignoreTransaction(function() {\n // db.logentries.add(newLogEntry);\n // });\n //\n // Unless using Dexie.ignoreTransaction(), the above example would try to reuse the current transaction\n // in current Promise-scope.\n //\n // An alternative to Dexie.ignoreTransaction() would be setImmediate() or setTimeout(). The reason we still provide an\n // API for this because\n // 1) The intention of writing the statement could be unclear if using setImmediate() or setTimeout().\n // 2) setTimeout() would wait unnescessary until firing. This is however not the case with setImmediate().\n // 3) setImmediate() is not supported in the ES standard.\n // 4) You might want to keep other PSD state that was set in a parent PSD, such as PSD.letThrough.\n return PSD.trans ?\n usePSD(PSD.transless, scopeFunc) : // Use the closest parent that was non-transactional.\n scopeFunc(); // No need to change scope because there is no ongoing transaction.\n },\n\n vip,\n\n async: function (generatorFn: Function) {\n return function () {\n try {\n var rv = awaitIterator(generatorFn.apply(this, arguments));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n };\n },\n\n spawn: function (generatorFn, args, thiz) {\n try {\n var rv = awaitIterator(generatorFn.apply(thiz, args || []));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n },\n\n // Dexie.currentTransaction property\n currentTransaction: {\n get: () => PSD.trans || null\n },\n\n waitFor: function (promiseOrFunction, optionalTimeout) {\n // If a function is provided, invoke it and pass the returning value to Transaction.waitFor()\n const promise = Promise.resolve(\n typeof promiseOrFunction === 'function' ?\n Dexie.ignoreTransaction(promiseOrFunction) :\n promiseOrFunction)\n .timeout(optionalTimeout || 60000); // Default the timeout to one minute. Caller may specify Infinity if required. \n\n // Run given promise on current transaction. If no current transaction, just return a Dexie promise based\n // on given value.\n return PSD.trans ?\n PSD.trans.waitFor(promise) :\n promise;\n },\n\n // Export our Promise implementation since it can be handy as a standalone Promise implementation\n Promise: Promise,\n\n // Dexie.debug proptery:\n // Dexie.debug = false\n // Dexie.debug = true\n // Dexie.debug = \"dexie\" - don't hide dexie's stack frames.\n debug: {\n get: () => Debug.debug,\n set: value => {\n Debug.setDebug(value, value === 'dexie' ? () => true : dexieStackFrameFilter);\n }\n },\n\n // Export our derive/extend/override methodology\n derive: derive, // Deprecate?\n extend: extend, // Deprecate?\n props: props,\n override: override, // Deprecate?\n // Export our Events() function - can be handy as a toolkit\n Events: Events,\n on: globalEvents,\n liveQuery,\n extendObservabilitySet,\n // Utilities\n getByKeyPath: getByKeyPath,\n setByKeyPath: setByKeyPath,\n delByKeyPath: delByKeyPath,\n shallowClone: shallowClone,\n deepClone: deepClone,\n getObjectDiff: getObjectDiff,\n cmp,\n asap: asap,\n //maxKey: new Dexie('',{addons:[]})._maxKey,\n minKey: minKey,\n // Addon registry\n addons: [],\n // Global DB connection list\n connections: connections,\n\n //MultiModifyError: exceptions.Modify, // Obsolete!\n errnames: errnames,\n\n // Export other static classes\n //IndexSpec: IndexSpec, Obsolete!\n //TableSchema: TableSchema, Obsolete!\n\n //\n // Dependencies\n //\n // These will automatically work in browsers with indexedDB support, or where an indexedDB polyfill has been included.\n //\n // In node.js, however, these properties must be set \"manually\" before instansiating a new Dexie().\n // For node.js, you need to require indexeddb-js or similar and then set these deps.\n //\n dependencies: domDeps,\n cache,\n\n // API Version Number: Type Number, make sure to always set a version number that can be comparable correctly. Example: 0.9, 0.91, 0.92, 1.0, 1.01, 1.1, 1.2, 1.21, etc.\n semVer: DEXIE_VERSION,\n version: DEXIE_VERSION.split('.')\n .map(n => parseInt(n))\n .reduce((p, c, i) => p + (c / Math.pow(10, i * 2))),\n\n // https://github.com/dfahlander/Dexie.js/issues/186\n // typescript compiler tsc in mode ts-->es5 & commonJS, will expect require() to return\n // x.default. Workaround: Set Dexie.default = Dexie.\n // default: Dexie, // Commented because solved in index-umd.ts instead.\n // Make it possible to import {Dexie} (non-default import)\n // Reason 1: May switch to that in future.\n // Reason 2: We declare it both default and named exported in d.ts to make it possible\n // to let addons extend the Dexie interface with Typescript 2.1 (works only when explicitely\n // exporting the symbol, not just default exporting)\n // Dexie: Dexie // Commented because solved in index-umd.ts instead.\n});\n\nDexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange);\n","import { globalEvents, DEXIE_STORAGE_MUTATED_EVENT_NAME, STORAGE_MUTATED_DOM_EVENT_NAME } from '../globals/global-events';\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport { signalSubscribersNow } from './cache/signalSubscribers';\n\nif (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, updatedParts => {\n if (!propagatingLocally) {\n let event: CustomEvent;\n event = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, {\n detail: updatedParts\n });\n propagatingLocally = true;\n dispatchEvent(event);\n propagatingLocally = false;\n }\n });\n addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, ({detail}: CustomEvent) => {\n if (!propagatingLocally) {\n propagateLocally(detail);\n }\n });\n}\n\n/** Called from listeners to BroadcastChannel and DOM event to\n * propagate the event locally into dexie's storagemutated event\n * and invalidate cached queries.\n * \n * This function is only called when the event is not originating\n * from this same Dexie module - either from another redundant dexie import\n * or from a foreign tab or worker. That's why we need to invalidate\n * the cache when this happens.\n */\nexport function propagateLocally(updateParts: ObservabilitySet) {\n let wasMe = propagatingLocally;\n try {\n propagatingLocally = true;\n // Fire the \"storagemutated\" event.\n globalEvents.storagemutated.fire(updateParts);\n // Invalidate cached queries and signal subscribers to requery.\n signalSubscribersNow(updateParts, true);\n } finally {\n propagatingLocally = wasMe;\n }\n}\n\nexport let propagatingLocally = false;\n","import {\n globalEvents,\n STORAGE_MUTATED_DOM_EVENT_NAME,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport { propagateLocally, propagatingLocally } from './propagate-locally';\n\nexport let bc: BroadcastChannel;\n\nexport let createBC = ()=>{};\n\nif (typeof BroadcastChannel !== 'undefined') {\n createBC = () => {\n bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME);\n bc.onmessage = ev => ev.data && propagateLocally(ev.data);\n }\n createBC();\n\n /**\n * The Node.js BroadcastChannel will prevent the node process from exiting\n * if the BroadcastChannel is not closed.\n * Therefore we have to call unref() which allows the process to finish\n * properly even when the BroadcastChannel is never closed.\n * @link https://nodejs.org/api/worker_threads.html#broadcastchannelunref\n * @link https://github.com/dexie/Dexie.js/pull/1576\n */\n if (typeof (bc as any).unref === 'function') {\n (bc as any).unref();\n }\n \n //\n // Propagate local changes to remote tabs, windows and workers via BroadcastChannel\n //\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, (changedParts) => {\n if (!propagatingLocally) {\n bc.postMessage(changedParts);\n }\n });\n}\n","import { Dexie } from \"./classes/dexie\";\nimport { connections } from \"./globals/constants\";\nimport { debug } from \"./helpers/debug\";\nimport { RangeSet } from \"./helpers/rangeset\";\nimport { bc, createBC } from \"./live-query/enable-broadcast\";\nimport { propagateLocally } from \"./live-query/propagate-locally\";\n\n\nif (typeof addEventListener !== 'undefined') {\n addEventListener('pagehide', (event) => {\n if (!Dexie.disableBfCache && event.persisted) {\n if (debug) console.debug('Dexie: handling persisted pagehide');\n bc?.close();\n for (const db of connections) {\n db.close({disableAutoOpen: false});\n }\n }\n });\n addEventListener('pageshow', (event) => {\n if (!Dexie.disableBfCache && event.persisted) {\n if (debug) console.debug('Dexie: handling persisted pageshow');\n createBC();\n propagateLocally({all: new RangeSet(-Infinity, [[]])}); // Trigger all queries to requery\n }\n });\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function add(value: number | BigInt | Array) {\n return new PropModification({add: value});\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function remove(value: number | BigInt | Array) {\n return new PropModification({remove: value});\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function replacePrefix(a: string, b:string) {\n return new PropModification({replacePrefix: [a, b]});\n}\n","import { Dexie } from './classes/dexie';\nimport { DexieConstructor } from './public/types/dexie-constructor';\nimport { DexiePromise } from './helpers/promise';\nimport { mapError } from './errors';\nimport * as Debug from './helpers/debug';\nimport { dexieStackFrameFilter } from './globals/constants';\n\n// Generate all static properties such as Dexie.maxKey etc\n// (implement interface DexieConstructor):\nimport './classes/dexie/dexie-static-props';\nimport './live-query/enable-broadcast';\nimport './support-bfcache';\nimport { liveQuery } from './live-query/live-query';\nimport { Entity } from './classes/entity/Entity';\nimport { cmp } from './functions/cmp';\nimport { PropModification, PropModSymbol } from './helpers/prop-modification';\nimport { replacePrefix, add, remove } from './functions/propmods';\n\n\n// Set rejectionMapper of DexiePromise so that it generally tries to map\n// DOMErrors and DOMExceptions to a DexieError instance with same name but with\n// async stack support and with a prototypal inheritance from DexieError and Error.\n// of Map DOMErrors and DOMExceptions to corresponding Dexie errors.\nDexiePromise.rejectionMapper = mapError;\n\n// Let the async stack filter focus on app code and filter away frames from dexie.min.js:\nDebug.setDebug(Debug.debug, dexieStackFrameFilter);\n\nexport { RangeSet, mergeRanges, rangesOverlap } from \"./helpers/rangeset\";\nexport { Dexie, liveQuery }; // Comply with public/index.d.ts.\nexport { Entity };\nexport { cmp };\nexport { PropModSymbol, PropModification, replacePrefix, add, remove };\nexport default Dexie;\n"],"names":["asap","Promise","Dexie","safari14Workaround","_Dexie","Debug.debug","Debug.setDebug"],"mappings":"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"} \ No newline at end of file diff --git a/src/assets/dexie/import-wrapper-prod.d.mts b/src/assets/dexie/import-wrapper-prod.d.mts deleted file mode 100644 index e6ab49a88..000000000 --- a/src/assets/dexie/import-wrapper-prod.d.mts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/dexie.js'; -export { default } from './dist/dexie.js'; diff --git a/src/assets/dexie/import-wrapper-prod.mjs b/src/assets/dexie/import-wrapper-prod.mjs deleted file mode 100644 index a6556c91a..000000000 --- a/src/assets/dexie/import-wrapper-prod.mjs +++ /dev/null @@ -1,15 +0,0 @@ -// Making the module version consumable via require - to prohibit -// multiple occurrancies of the same module in the same app -// (dual package hazard, https://nodejs.org/api/packages.html#dual-package-hazard) -import _Dexie from "./dist/dexie.min.js"; -const DexieSymbol = Symbol.for("Dexie"); -const Dexie = globalThis[DexieSymbol] || (globalThis[DexieSymbol] = _Dexie); -if (_Dexie.semVer !== Dexie.semVer) { - throw new Error(`Two different versions of Dexie loaded in the same app: ${_Dexie.semVer} and ${Dexie.semVer}`); -} -const { - liveQuery, mergeRanges, rangesOverlap, RangeSet, cmp, Entity, - PropModSymbol, PropModification, replacePrefix, add, remove } = Dexie; -export { liveQuery, mergeRanges, rangesOverlap, RangeSet, cmp, Dexie, Entity, - PropModSymbol, PropModification, replacePrefix, add, remove }; -export default Dexie; diff --git a/src/assets/dexie/import-wrapper.d.mts b/src/assets/dexie/import-wrapper.d.mts deleted file mode 100644 index e6ab49a88..000000000 --- a/src/assets/dexie/import-wrapper.d.mts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/dexie.js'; -export { default } from './dist/dexie.js'; diff --git a/src/assets/dexie/import-wrapper.mjs b/src/assets/dexie/import-wrapper.mjs deleted file mode 100644 index c70c6b72a..000000000 --- a/src/assets/dexie/import-wrapper.mjs +++ /dev/null @@ -1,14 +0,0 @@ -// Making the module version consumable via require - to prohibit -// multiple occurrancies of the same module in the same app -// (dual package hazard, https://nodejs.org/api/packages.html#dual-package-hazard) -import _Dexie from "./dist/dexie.js"; -const DexieSymbol = Symbol.for("Dexie"); -const Dexie = globalThis[DexieSymbol] || (globalThis[DexieSymbol] = _Dexie); -if (_Dexie.semVer !== Dexie.semVer) { - throw new Error(`Two different versions of Dexie loaded in the same app: ${_Dexie.semVer} and ${Dexie.semVer}`); -} -const { liveQuery, mergeRanges, rangesOverlap, RangeSet, cmp, Entity, - PropModSymbol, PropModification, replacePrefix, add, remove } = Dexie; -export { liveQuery, mergeRanges, rangesOverlap, RangeSet, cmp, Dexie, Entity, - PropModSymbol, PropModification, replacePrefix, add, remove }; -export default Dexie; diff --git a/src/assets/dexie/package.json b/src/assets/dexie/package.json deleted file mode 100644 index 16d81e844..000000000 --- a/src/assets/dexie/package.json +++ /dev/null @@ -1,145 +0,0 @@ -{ - "name": "dexie", - "version": "4.0.7", - "description": "A Minimalistic Wrapper for IndexedDB", - "main": "dist/dexie.js", - "module": "dist/dexie.mjs", - "jsnext:main": "dist/dexie.mjs", - "exports": { - ".": { - "production": { - "module": "./import-wrapper-prod.mjs", - "import": "./import-wrapper-prod.mjs", - "require": "./dist/dexie.min.js", - "default": "./dist/dexie.min.js" - }, - "development": { - "module": "./import-wrapper.mjs", - "import": "./import-wrapper.mjs", - "require": "./dist/dexie.js", - "default": "./dist/dexie.js" - }, - "default": { - "module": "./import-wrapper.mjs", - "import": "./import-wrapper.mjs", - "require": "./dist/dexie.js", - "default": "./dist/dexie.js" - } - }, - "./package.json": "./package.json", - "./dist/dexie.mjs": "./dist/dexie.mjs" - }, - "typings": "dist/dexie.d.ts", - "jspm": { - "format": "cjs", - "ignore": [ - "src/" - ] - }, - "repository": { - "type": "git", - "url": "https://github.com/dexie/Dexie.js.git" - }, - "keywords": [ - "indexeddb", - "browser", - "database" - ], - "author": "David Fahlander ", - "contributors": [ - "Christopher Hunt ", - "Nikolas Poniros ", - "Anders Ekdahl ", - "Yury Solovyov ", - "Martin Diphoorn " - ], - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/dexie/Dexie.js/issues" - }, - "just-build": { - "default": [ - "# Build all targets (es5, es6 and test) and minify the default es5 UMD module", - "just-build release test" - ], - "dexie": [ - "# Build dist/dexie.js, dist/dexie.mjs and dist/dexie.d.ts", - "cd src", - "tsc [--watch 'Watching for file changes']", - "tsc --target es2020 --outdir ../tools/tmp/modern/src/", - "rollup -c ../tools/build-configs/rollup.config.js", - "rollup -c ../tools/build-configs/rollup.umd.config.js", - "rollup -c ../tools/build-configs/rollup.modern.config.js", - "node ../tools/replaceVersionAndDate.js ../dist/dexie.js", - "node ../tools/replaceVersionAndDate.js ../dist/dexie.mjs", - "node ../tools/replaceVersionAndDate.js ../dist/modern/dexie.mjs", - "dts-bundle-generator --inline-declare-global --inline-declare-externals -o ../dist/dexie.d.ts public/index.d.ts", - "node ../tools/prepend.js ../dist/dexie.d.ts ../tools/build-configs/banner.txt", - "node ../tools/replaceVersionAndDate.js ../dist/dexie.d.ts" - ], - "release": [ - "# Build ES5 umd module as well as the es6 module.", - "just-build dexie", - "node tools/replaceVersionAndDate.js dist/dexie.d.ts", - "# Minify the default ES5 UMD module", - "cd dist", - "uglifyjs dexie.js -m -c negate_iife=0 -o dexie.min.js --source-map url=dexie.min.js.map", - "# Minify modern bundle", - "cd modern", - "terser --comments false --compress --mangle --module --source-map url=dexie.min.mjs.map -o dexie.min.mjs -- dexie.mjs" - ], - "dev": [ - "# Build ES5 module and the tests", - "just-build dexie test" - ], - "gzip": [ - "# Optionally gzip to find the size of the minified & gzipped version", - "gzip dist/dexie.min.js -k -f -9" - ], - "test": [ - "# Build the test suite.", - "cd test", - "tsc [--watch 'Watching for file changes']", - "rollup -c ../tools/build-configs/rollup.tests.config.js" - ] - }, - "homepage": "https://dexie.org", - "devDependencies": { - "@lambdatest/node-tunnel": "^4.0.7", - "cross-env": "^7.0.3", - "dts-bundle-generator": "^5.9.0", - "just-build": "^0.9.24", - "karma": "^6.1.1", - "karma-chrome-launcher": "^3.1.0", - "karma-firefox-launcher": "^2.1.0", - "karma-mocha-reporter": "^2.2.5", - "karma-qunit": "^4.1.1", - "karma-webdriver-launcher": "^1.0.8", - "qunit": "^2.10.0", - "qunitjs": "^1.23.1", - "rollup": "^2.40.0", - "rollup-plugin-cleanup": "^3.2.1", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-sourcemaps": "^0.6.3", - "rxjs": "^6.6.6", - "safari-14-idb-fix": "^3.0.0", - "serve-static": "^1.14.1", - "sorted-json": "^0.2.6", - "terser": "^5.3.1", - "tslib": "^2.1.0", - "typescript": "^5.3.3", - "uglify-js": "^3.9.2" - }, - "scripts": { - "build": "just-build", - "watch": "just-build --watch", - "clean": "rm -rf tools/tmp && rm dist/*.js && rm dist/*.map && rm dist/*.ts && rm dist/*.mjs", - "test": "pnpm run build && pnpm run test:typings && pnpm run test:unit", - "test:unit": "karma start test/karma.conf.js --single-run", - "test:typings": "tsc -p test/typings-test/", - "test:debug": "karma start test/karma.conf.js --log-level debug", - "test:ltcloud": "cross-env LAMBDATEST=true pnpm run test:ltTunnel & sleep 10 && pnpm run test:unit; UNIT_STATUS=$?; kill $(cat tunnel.pid); exit $UNIT_STATUS", - "test:ltTunnel": "node test/lt-local" - } -} \ No newline at end of file diff --git a/src/dexie/CODE_OF_CONDUCT.md b/src/dexie/CODE_OF_CONDUCT.md deleted file mode 100644 index 0af794b87..000000000 --- a/src/dexie/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at code@dexie.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/src/dexie/CONTRIBUTING.md b/src/dexie/CONTRIBUTING.md deleted file mode 100644 index 68f0fcb16..000000000 --- a/src/dexie/CONTRIBUTING.md +++ /dev/null @@ -1,65 +0,0 @@ -HOW TO CONTRIBUTE -================= - -We appreciate contributions in forms of: - -* issues -* help answering questions in [issues](https://github.com/dexie/Dexie.js/issues) and on [stackoverflow](https://stackexchange.com/filters/233583/dexie-stackoverflow) -* fixing bugs via pull-requests -* developing addons or other [derived work](https://dexie.org/docs/DerivedWork) -* promoting Dexie.js -* sharing ideas - -Contribute while developing your own app -======================================== - -Dexie uses pnpm package manager. Refer to [pnpm.io/installation](https://pnpm.io/installation) for how to install pnpm. - -Here is a little cheat-sheet for how to symlink your app's `node_modules/dexie` to a place where you can edit the source, version control your changes and create pull requests back to Dexie. Assuming you've already ran `npm install dexie` for the app your are developing. - -1. Fork Dexie.js from the web gui on github -2. Clone your fork locally by launching a shell/command window and cd to a neutral place (like `~repos/`, `c:\repos` or whatever) -3. Run the following commands: - - ``` - git clone https://github.com/YOUR-USERNAME/Dexie.js.git dexie - cd dexie - pnpm install - pnpm run build - npm link # Or yarn link or pnpm link --global depending on what package manager you are using. - ``` -3. cd to your app directory and write: - ``` - npm link dexie # Or yarn link dexie / pnpm link dexie depending on your package manager. - ``` - -Your app's `node_modules/dexie/` is now sym-linked to the Dexie.js clone on your hard drive so any change you do there will propagate to your app. Build dexie.js using `pnpm run build` or `pnpm run watch`. The latter will react on any source file change and rebuild the dist files. - -That's it. Now you're up and running to test and commit changes to files under dexie/src/* or dexie/test/* and the changes will instantly affect the app you are developing. - -If you're on yarn or pnpm, do the same procedures using yarn link / pnpm link. - -Pull requests are more than welcome. Some advices are: - -* Run pnpm test before making a pull request. -* If you find an issue, a unit test that reproduces it is lovely ;). If you don't know where to put it, put it in `test/tests-misc.js`. We use qunit. Just look at existing tests in `tests-misc.js` to see how they should be written. Tests are transpiled in the build script so you can use ES6 if you like. - -Build ------ -``` -# To install pnpm, see https://pnpm.io/installation -pnpm install -pnpm run build -``` - -Test ----- -``` -pnpm test -``` - -Watch ------ -``` -pnpm run watch -``` diff --git a/src/dexie/LICENSE b/src/dexie/LICENSE deleted file mode 100644 index e06d20818..000000000 --- a/src/dexie/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/src/dexie/NOTICE b/src/dexie/NOTICE deleted file mode 100644 index 9de226815..000000000 --- a/src/dexie/NOTICE +++ /dev/null @@ -1,15 +0,0 @@ -Dexie.js - -Copyright (c) 2014-2017 David Fahlander - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/src/dexie/README.md b/src/dexie/README.md deleted file mode 100644 index 13b619b4f..000000000 --- a/src/dexie/README.md +++ /dev/null @@ -1,292 +0,0 @@ -# Dexie.js - -[![NPM Version][npm-image]][npm-url] ![Build Status](https://github.com/dexie/Dexie.js/actions/workflows/main.yml/badge.svg) - -Dexie.js is a wrapper library for indexedDB - the standard database in the browser. https://dexie.org. - -#### Why Dexie.js? - -IndexedDB is the portable database for all browser engines. Dexie.js makes it fun and easy to work with. - -But also: - -* Dexie.js is widely used by 100,000 of web sites, apps and other projects and supports all browsers, Electron for Desktop apps, Capacitor for iOS / Android apps and of course pure PWAs. -* Dexie.js works around bugs in the IndexedDB implementations, giving a more stable user experience. -* It's an easy step to [make it sync](https://dexie.org/#sync). - -#### Hello World - -```html - - - - - - - -``` - -Yes, it's that simple. Read [the docs](https://dexie.org/docs/) to get into the details. - -#### Hello World (for modern browsers) - -All modern browsers support ES modules and top-level awaits. No transipler needed. Here's the previous example in a modern flavour: - -```html - - - - - - -``` - -#### Hello World (React + Typescript) - -Real-world apps are often built using components in various frameworks. Here's a version of Hello World written for React and Typescript. There are also links below this sample to more tutorials for different frameworks... - -```tsx -import React from 'react'; -import { Dexie, type EntityTable } from 'dexie'; -import { useLiveQuery } from 'dexie-react-hooks'; - -// Typing for your entities (hint is to move this to its own module) -export interface Friend { - id: number; - name: string; - age: number; -} - -// Database declaration (move this to its own module also) -export const db = new Dexie('FriendDatabase') as Dexie & { - friends: EntityTable; -}; -db.version(1).stores({ - friends: '++id, age', -}); - -// Component: -export function MyDexieReactComponent() { - const youngFriends = useLiveQuery(() => - db.friends - .where('age') - .below(30) - .toArray() - ); - - return ( - <> -

My young friends

-
    - {youngFriends?.map((f) => ( -
  • - Name: {f.name}, Age: {f.age} -
  • - ))} -
- - - ); -} -``` - -[Tutorials for React, Svelte, Vue, Angular and vanilla JS](https://dexie.org/docs/Tutorial/Getting-started) - -[API Reference](https://dexie.org/docs/API-Reference) - -[Samples](https://dexie.org/docs/Samples) - -### Performance - -Dexie has kick-ass performance. Its [bulk methods]() take advantage of a lesser-known feature in IndexedDB that makes it possible to store stuff without listening to every onsuccess event. This speeds up the performance to a maximum. - -#### Supported operations - -```js -above(key): Collection; -aboveOrEqual(key): Collection; -add(item, key?): Promise; -and(filter: (x) => boolean): Collection; -anyOf(keys[]): Collection; -anyOfIgnoreCase(keys: string[]): Collection; -below(key): Collection; -belowOrEqual(key): Collection; -between(lower, upper, includeLower?, includeUpper?): Collection; -bulkAdd(items: Array): Promise; -bulkDelete(keys: Array): Promise; -bulkPut(items: Array): Promise; -clear(): Promise; -count(): Promise; -delete(key): Promise; -distinct(): Collection; -each(callback: (obj) => any): Promise; -eachKey(callback: (key) => any): Promise; -eachPrimaryKey(callback: (key) => any): Promise; -eachUniqueKey(callback: (key) => any): Promise; -equals(key): Collection; -equalsIgnoreCase(key): Collection; -filter(fn: (obj) => boolean): Collection; -first(): Promise; -get(key): Promise; -inAnyRange(ranges): Collection; -keys(): Promise; -last(): Promise; -limit(n: number): Collection; -modify(changeCallback: (obj: T, ctx:{value: T}) => void): Promise; -modify(changes: { [keyPath: string]: any } ): Promise; -noneOf(keys: Array): Collection; -notEqual(key): Collection; -offset(n: number): Collection; -or(indexOrPrimayKey: string): WhereClause; -orderBy(index: string): Collection; -primaryKeys(): Promise; -put(item: T, key?: Key): Promise; -reverse(): Collection; -sortBy(keyPath: string): Promise; -startsWith(key: string): Collection; -startsWithAnyOf(prefixes: string[]): Collection; -startsWithAnyOfIgnoreCase(prefixes: string[]): Collection; -startsWithIgnoreCase(key: string): Collection; -toArray(): Promise; -toCollection(): Collection; -uniqueKeys(): Promise; -until(filter: (value) => boolean, includeStopEntry?: boolean): Collection; -update(key: Key, changes: { [keyPath: string]: any }): Promise; -``` - -This is a mix of methods from [WhereClause](https://dexie.org/docs/WhereClause/WhereClause), [Table](https://dexie.org/docs/Table/Table) and [Collection](https://dexie.org/docs/Collection/Collection). Dive into the [API reference](https://dexie.org/docs/API-Reference) to see the details. - -## Dexie Cloud - -[Dexie Cloud](https://dexie.org/cloud/) is a commercial offering that can be used as an add-on to Dexie.js. It syncs a Dexie database with a server and enables developers to build apps without having to care about backend or database layer else than the frontend code with Dexie.js as the sole database layer. - -Source for a sample Dexie Cloud app: [Dexie Cloud To-do app](https://github.com/dexie/Dexie.js/tree/master/samples/dexie-cloud-todo-app) - -See the sample Dexie Cloud app in action: https://dexie.github.io/Dexie.js/dexie-cloud-todo-app/ - -## Samples - -https://dexie.org/docs/Samples - -https://github.com/dexie/Dexie.js/tree/master/samples - -## Knowledge Base - -[https://dexie.org/docs/Questions-and-Answers](https://dexie.org/docs/Questions-and-Answers) - -## Website - -[https://dexie.org](https://dexie.org) - -## Install via npm - -``` -npm install dexie -``` - -## Download - -For those who don't like package managers, here's the download links: - -### UMD (for legacy script includes as well as commonjs require): - -https://unpkg.com/dexie@latest/dist/dexie.min.js - -https://unpkg.com/dexie@latest/dist/dexie.min.js.map - -### Modern (ES module): - -https://unpkg.com/dexie@latest/dist/modern/dexie.min.mjs - -https://unpkg.com/dexie@latest/dist/modern/dexie.min.mjs.map - -### Typings: - -https://unpkg.com/dexie@latest/dist/dexie.d.ts - -# Contributing - -See [CONTRIBUTING.md](CONTRIBUTING.md) - -## Build - -``` -pnpm install -pnpm run build -``` - -## Test - -``` -pnpm test -``` - -## Watch - -``` -pnpm run watch -``` - -
- -[![Browser testing via LAMDBATEST](https://dexie.org/assets/images/lambdatest2.png)](https://www.lambdatest.com/) - -[npm-image]: https://img.shields.io/npm/v/dexie.svg?style=flat -[npm-url]: https://npmjs.org/package/dexie diff --git a/src/dexie/SECURITY.md b/src/dexie/SECURITY.md deleted file mode 100644 index d3c09d562..000000000 --- a/src/dexie/SECURITY.md +++ /dev/null @@ -1,26 +0,0 @@ -# Security Policy - -## Supported Versions - -| Version | Supported | Branch -| ------- | ------------------ | -------- -| 4.x | :white_check_mark: | master -| 3.x | :white_check_mark: | master-3 -| 2.0.x | :x: | master-2 -| 1.5.x | :x: | master-1 -| < 1.5.1 | :x: | - -## Reporting a Vulnerability - -To report a security vulnerability in Dexie.js, please send an email to code@dexie.org describing the vulnerability and how to reproduce it. - -If we find an issue to be regarded as a security vulnerability, we will patch and release a new version in all the supported versions as soon as possible. -Keep in mind though that this is an uncommercial open source project which means that sometimes you might have to be the one that -*fixes* the issue and not just report it. - -## Fixing a Vulnerability - -Fix the issue in the corresponding branch for the major version according to the table above where it applies and -create pull requests. Make sure that you have the words "security" or "vulnerability" in the title of the Pull Request -in order to get the correct attention for it to be merged and released as soon as possible. - diff --git a/src/dexie/dist/dexie.d.ts b/src/dexie/dist/dexie.d.ts deleted file mode 100644 index 130ee26a6..000000000 --- a/src/dexie/dist/dexie.d.ts +++ /dev/null @@ -1,1174 +0,0 @@ -/* - * Dexie.js - a minimalistic wrapper for IndexedDB - * =============================================== - * - * By David Fahlander, david.fahlander@gmail.com - * - * Version 4.0.7, Sun May 26 2024 - * - * https://dexie.org - * - * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/ - */ - // Generated by dts-bundle-generator v5.9.0 - -export interface IndexSpec { - name: string; - keyPath: string | Array | undefined; - unique: boolean | undefined; - multi: boolean | undefined; - auto: boolean | undefined; - compound: boolean | undefined; - src: string; -} -export interface TableSchema { - name: string; - primKey: IndexSpec; - indexes: IndexSpec[]; - mappedClass: Function; - idxByName: { - [name: string]: IndexSpec; - }; - readHook?: (x: any) => any; -} -export type IndexableTypePart = string | number | Date | ArrayBuffer | ArrayBufferView | DataView | Array>; -export type IndexableTypeArray = Array; -export type IndexableTypeArrayReadonly = ReadonlyArray; -export type IndexableType = IndexableTypePart | IndexableTypeArrayReadonly; -export interface DexieEvent { - subscribers: Function[]; - fire(...args: any[]): any; - subscribe(fn: (...args: any[]) => any): void; - unsubscribe(fn: (...args: any[]) => any): void; -} -export interface DexieEventSet { - (eventName: string): DexieEvent; // To be able to unsubscribe. - addEventType(eventName: string, chainFunction?: (f1: Function, f2: Function) => Function, defaultFunction?: Function): DexieEvent; - addEventType(events: { - [eventName: string]: ("asap" | [ - (f1: Function, f2: Function) => Function, - Function - ]); - }): DexieEvent; -} -export interface TransactionEvents extends DexieEventSet { - (eventName: "complete", subscriber: () => any): void; - (eventName: "abort", subscriber: () => any): void; - (eventName: "error", subscriber: (error: any) => any): void; - complete: DexieEvent; - abort: DexieEvent; - error: DexieEvent; -} -export interface Transaction { - db: Dexie; - active: boolean; - mode: IDBTransactionMode; - idbtrans: IDBTransaction; - //tables: { [type: string]: Table }; Deprecated since 2.0. Obsolete from v3.0. - storeNames: Array; - explicit?: boolean; - parent?: Transaction; - on: TransactionEvents; - abort(): void; - table(tableName: string): Table; - table(tableName: string): Table; - table(tableName: string): Table; - table(tableName: string): Table; -} -export interface CreatingHookContext { - onsuccess?: (primKey: Key) => void; - onerror?: (err: any) => void; -} -export interface UpdatingHookContext { - onsuccess?: (updatedObj: T) => void; - onerror?: (err: any) => void; -} -export interface DeletingHookContext { - onsuccess?: () => void; - onerror?: (err: any) => void; -} -export interface TableHooks extends DexieEventSet { - (eventName: "creating", subscriber: (this: CreatingHookContext, primKey: TKey, obj: T, transaction: Transaction) => void | undefined | TKey): void; - (eventName: "reading", subscriber: (obj: T) => T | any): void; - (eventName: "updating", subscriber: (this: UpdatingHookContext, modifications: Object, primKey: TKey, obj: T, transaction: Transaction) => any): void; - (eventName: "deleting", subscriber: (this: DeletingHookContext, primKey: TKey, obj: T, transaction: Transaction) => any): void; - creating: DexieEvent; - reading: DexieEvent; - updating: DexieEvent; - deleting: DexieEvent; -} -export type ThenShortcut = (value: T) => TResult | PromiseLike; -export interface WhereClause { - above(key: any): Collection; - aboveOrEqual(key: any): Collection; - anyOf(keys: ReadonlyArray): Collection; - anyOf(...keys: Array): Collection; - anyOfIgnoreCase(keys: string[]): Collection; - anyOfIgnoreCase(...keys: string[]): Collection; - below(key: any): Collection; - belowOrEqual(key: any): Collection; - between(lower: any, upper: any, includeLower?: boolean, includeUpper?: boolean): Collection; - equals(key: IndexableType): Collection; - equalsIgnoreCase(key: string): Collection; - inAnyRange(ranges: ReadonlyArray<{ - 0: any; - 1: any; - }>, options?: { - includeLowers?: boolean; - includeUppers?: boolean; - }): Collection; - startsWith(key: string): Collection; - startsWithAnyOf(prefixes: string[]): Collection; - startsWithAnyOf(...prefixes: string[]): Collection; - startsWithIgnoreCase(key: string): Collection; - startsWithAnyOfIgnoreCase(prefixes: string[]): Collection; - startsWithAnyOfIgnoreCase(...prefixes: string[]): Collection; - noneOf(keys: ReadonlyArray): Collection; - notEqual(key: IndexableType): Collection; -} -export interface PromiseExtendedConstructor extends PromiseConstructor { - readonly prototype: PromiseExtended; - new (executor: (resolve: (value?: T | PromiseLike) => void, reject: (reason?: any) => void) => void): PromiseExtended; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike, - T8 | PromiseLike, - T9 | PromiseLike, - T10 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4, - T5, - T6, - T7, - T8, - T9, - T10 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike, - T8 | PromiseLike, - T9 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4, - T5, - T6, - T7, - T8, - T9 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike, - T8 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4, - T5, - T6, - T7, - T8 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4, - T5, - T6, - T7 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4, - T5, - T6 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4, - T5 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3, - T4 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike - ]): PromiseExtended<[ - T1, - T2, - T3 - ]>; - all(values: [ - T1 | PromiseLike, - T2 | PromiseLike - ]): PromiseExtended<[ - T1, - T2 - ]>; - all(values: (T | PromiseLike)[]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike, - T8 | PromiseLike, - T9 | PromiseLike, - T10 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike, - T8 | PromiseLike, - T9 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike, - T8 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike, - T7 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike, - T6 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike, - T5 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike, - T4 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike, - T3 | PromiseLike - ]): PromiseExtended; - race(values: [ - T1 | PromiseLike, - T2 | PromiseLike - ]): PromiseExtended; - race(values: (T | PromiseLike)[]): PromiseExtended; - reject(reason: any): PromiseExtended; - reject(reason: any): PromiseExtended; - resolve(value: T | PromiseLike): PromiseExtended; - resolve(): PromiseExtended; -} -/** The interface of Dexie.Promise, which basically extends standard Promise with methods: - * - * finally() - also subject for standardization - * timeout() - set a completion timeout - * catch(ErrorClass, handler) - java style error catching - * catch(errorName, handler) - cross-domain safe type error catching (checking error.name instead of instanceof) - * - */ -export interface PromiseExtended extends Promise { - then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): PromiseExtended; - catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): PromiseExtended; - catch(ErrorConstructor: Function, onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): PromiseExtended; - catch(errorName: string, onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): PromiseExtended; - finally(onFinally?: () => U | PromiseLike): PromiseExtended; - timeout(ms: number, msg?: string): PromiseExtended; -} -export type KeyPaths = { - [P in keyof T]: P extends string ? T[P] extends Array ? K extends object // only drill into the array element if it's an object - ? P | `${P}.${number}` | `${P}.${number}.${KeyPaths}` : P | `${P}.${number}` : T[P] extends (...args: any[]) => any // Method - ? never : T[P] extends object ? P | `${P}.${KeyPaths}` : P : never; -}[keyof T]; -export type KeyPathValue = PATH extends `${infer R}.${infer S}` ? R extends keyof T ? KeyPathValue : T extends any[] ? PATH extends `${number}.${infer S}` ? KeyPathValue : void : void : PATH extends `${number}` ? T extends any[] ? T[number] : void : PATH extends keyof T ? T[PATH] : void; -export declare const PropModSymbol: unique symbol; -export type PropModSpec = { - replacePrefix?: [ - string, - string - ]; - add?: number | BigInt | Array; - remove?: number | BigInt | Array; -}; -export class PropModification implements PropModSpec { - [PropModSymbol]?: true; - replacePrefix?: [ - string, - string - ]; - add?: number | BigInt | Array; - remove?: number | BigInt | Array; - execute(value: T): T; - constructor(spec: PropModSpec); -} -export type UpdateSpec = { - [KP in KeyPaths]?: KeyPathValue | PropModification; -}; -export interface Collection { - db: Dexie; - and(filter: (x: T) => boolean): Collection; - clone(props?: Object): Collection; - count(): PromiseExtended; - count(thenShortcut: ThenShortcut): PromiseExtended; - distinct(): Collection; - each(callback: (obj: T, cursor: { - key: IndexableType; - primaryKey: TKey; - }) => any): PromiseExtended; - eachKey(callback: (key: IndexableType, cursor: { - key: IndexableType; - primaryKey: TKey; - }) => any): PromiseExtended; - eachPrimaryKey(callback: (key: TKey, cursor: { - key: IndexableType; - primaryKey: TKey; - }) => any): PromiseExtended; - eachUniqueKey(callback: (key: IndexableType, cursor: { - key: IndexableType; - primaryKey: TKey; - }) => any): PromiseExtended; - filter(filter: (x: T) => x is S): Collection; - filter(filter: (x: T) => boolean): Collection; - first(): PromiseExtended; - first(thenShortcut: ThenShortcut): PromiseExtended; - keys(): PromiseExtended; - keys(thenShortcut: ThenShortcut): PromiseExtended; - primaryKeys(): PromiseExtended; - primaryKeys(thenShortcut: ThenShortcut): PromiseExtended; - last(): PromiseExtended; - last(thenShortcut: ThenShortcut): PromiseExtended; - limit(n: number): Collection; - offset(n: number): Collection; - or(indexOrPrimayKey: string): WhereClause; - raw(): Collection; - reverse(): Collection; - sortBy(keyPath: string): PromiseExtended; - sortBy(keyPath: string, thenShortcut: ThenShortcut): PromiseExtended; - toArray(): PromiseExtended>; - toArray(thenShortcut: ThenShortcut): PromiseExtended; - uniqueKeys(): PromiseExtended; - uniqueKeys(thenShortcut: ThenShortcut): PromiseExtended; - until(filter: (value: T) => boolean, includeStopEntry?: boolean): Collection; - // Mutating methods - delete(): PromiseExtended; - modify(changeCallback: (obj: T, ctx: { - value: TInsertType; - }) => void | boolean): PromiseExtended; - modify(changes: UpdateSpec): PromiseExtended; -} -export type IntervalTree = IntervalTreeNode | EmptyRange; -export interface IntervalTreeNode { - from: IndexableType; // lower bound - to: IndexableType; // upper bound - l: IntervalTreeNode | null; // left - r: IntervalTreeNode | null; // right - d: number; // depth -} -export interface EmptyRange { - d: 0; -} -export interface DexieOnReadyEvent { - subscribe(fn: (vipDb: Dexie) => any, bSticky: boolean): void; - unsubscribe(fn: (vipDb: Dexie) => any): void; - fire(vipDb: Dexie): any; -} -export interface DexieVersionChangeEvent { - subscribe(fn: (event: IDBVersionChangeEvent) => any): void; - unsubscribe(fn: (event: IDBVersionChangeEvent) => any): void; - fire(event: IDBVersionChangeEvent): any; -} -export interface DexiePopulateEvent { - subscribe(fn: (trans: Transaction) => any): void; - unsubscribe(fn: (trans: Transaction) => any): void; - fire(trans: Transaction): any; -} -export interface DexieCloseEvent { - subscribe(fn: (event: Event) => any): void; - unsubscribe(fn: (event: Event) => any): void; - fire(event: Event): any; -} -export interface DbEvents extends DexieEventSet { - (eventName: "ready", subscriber: (vipDb: Dexie) => any, bSticky?: boolean): void; - (eventName: "populate", subscriber: (trans: Transaction) => any): void; - (eventName: "blocked", subscriber: (event: IDBVersionChangeEvent) => any): void; - (eventName: "versionchange", subscriber: (event: IDBVersionChangeEvent) => any): void; - (eventName: "close", subscriber: (event: Event) => any): void; - ready: DexieOnReadyEvent; - populate: DexiePopulateEvent; - blocked: DexieEvent; - versionchange: DexieVersionChangeEvent; - close: DexieCloseEvent; -} -/** Set of mutated parts of the database - */ -export type ObservabilitySet = { - /** Database part having been mutated. - * - * This structure is produced in observability-middleware.ts - * and consumed in live-query.ts. - * - * Format of 'part': - * - * `idb://${dbName}/${tableName}/${indexName}` - * - * * dbName is the database name - * * tableName is the table name - * * indexName is any of: - * 1. An empty string - represents the primary keys of the affected objs - * 2. ":dels" - represents primary keys of deleted objects in the table - * 3. The keyPath of an index, such as "name", "age" or "address.city" - - * represents indexes that, if used in a query, might affect the - * result of that query. - * - * IntervalTree - * * See definition of IntervalTree type in rangeset.d.ts - * * See rangesOverlap() in rangeset.ts that can be used to compare two - * IntervalTrees and detect collissions. - * * See RangeSet class that can be used to create an IntervalTree and add - * ranges to it. - */ - [part: string]: IntervalTree; -}; -export interface DexieOnStorageMutatedEvent { - subscribe(fn: (parts: ObservabilitySet) => any): void; - unsubscribe(fn: (parts: ObservabilitySet) => any): void; - fire(parts: ObservabilitySet): any; -} -export interface GlobalDexieEvents extends DexieEventSet { - (eventName: "storagemutated", subscriber: (parts: ObservabilitySet) => any): void; - storagemutated: DexieOnStorageMutatedEvent; -} -export const enum DBCoreRangeType { - Equal = 1, - Range = 2, - Any = 3, - Never = 4 -} -export interface DBCoreKeyRange { - readonly type: DBCoreRangeType; - readonly lower: any; - readonly lowerOpen?: boolean; - readonly upper: any; - readonly upperOpen?: boolean; -} -export interface DBCoreTransaction { - abort(): void; -} -export interface DbCoreTransactionOptions { - durability: ChromeTransactionDurability; -} -export type DBCoreMutateRequest = DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest | DBCoreDeleteRangeRequest; -export interface DBCoreMutateResponse { - numFailures: number; - failures: { - [operationNumber: number]: Error; - }; - lastResult: any; - results?: any[]; // Present on AddRequest and PutRequest. -} -export interface DBCoreAddRequest { - type: "add"; - trans: DBCoreTransaction; - values: readonly any[]; - keys?: any[]; - mutatedParts?: ObservabilitySet; - /** @deprecated Will always get results since 3.1.0-alpha.5 */ - wantResults?: boolean; -} -export interface DBCorePutRequest { - type: "put"; - trans: DBCoreTransaction; - values: readonly any[]; - keys?: any[]; - mutatedParts?: ObservabilitySet; - criteria?: { - index: string | null; - range: DBCoreKeyRange; - }; - changeSpec?: { - [keyPath: string]: any; - }; // Common changeSpec for each key - isAdditionalChunk?: boolean; - updates?: { - keys: any[]; - changeSpecs: { - [keyPath: string]: any; - }[]; // changeSpec per key. - }; - /** @deprecated Will always get results since 3.1.0-alpha.5 */ - wantResults?: boolean; -} -export interface DBCoreDeleteRequest { - type: "delete"; - trans: DBCoreTransaction; - keys: any[]; - mutatedParts?: ObservabilitySet; - criteria?: { - index: string | null; - range: DBCoreKeyRange; - }; - isAdditionalChunk?: boolean; -} -export interface DBCoreDeleteRangeRequest { - type: "deleteRange"; - trans: DBCoreTransaction; - range: DBCoreKeyRange; - mutatedParts?: ObservabilitySet; -} -export interface DBCoreGetManyRequest { - trans: DBCoreTransaction; - keys: any[]; - cache?: "immutable" | "clone"; - obsSet?: ObservabilitySet; -} -export interface DBCoreGetRequest { - trans: DBCoreTransaction; - key: any; - obsSet?: ObservabilitySet; -} -export interface DBCoreQuery { - index: DBCoreIndex; //keyPath: null | string | string[]; // null represents primary key. string a property, string[] several properties. - range: DBCoreKeyRange; -} -export interface DBCoreQueryRequest { - trans: DBCoreTransaction; - values?: boolean; - limit?: number; - query: DBCoreQuery; - obsSet?: ObservabilitySet; -} -export interface DBCoreQueryResponse { - result: any[]; -} -export interface DBCoreOpenCursorRequest { - trans: DBCoreTransaction; - values?: boolean; - unique?: boolean; - reverse?: boolean; - query: DBCoreQuery; - obsSet?: ObservabilitySet; -} -export interface DBCoreCountRequest { - trans: DBCoreTransaction; - query: DBCoreQuery; - obsSet?: ObservabilitySet; -} -export interface DBCoreCursor { - readonly trans: DBCoreTransaction; - readonly key: any; - readonly primaryKey: any; - readonly value?: any; - readonly done?: boolean; - continue(key?: any): void; - continuePrimaryKey(key: any, primaryKey: any): void; - advance(count: number): void; - start(onNext: () => void): Promise; - stop(value?: any | Promise): void; - next(): Promise; - fail(error: Error): void; -} -export interface DBCoreSchema { - name: string; - tables: DBCoreTableSchema[]; -} -export interface DBCoreTableSchema { - readonly name: string; - readonly primaryKey: DBCoreIndex; - readonly indexes: DBCoreIndex[]; - readonly getIndexByKeyPath: (keyPath: null | string | string[]) => DBCoreIndex | undefined; -} -export interface DBCoreIndex { - /** Name of the index, or null for primary key */ - readonly name: string | null; - /** True if this index represents the primary key */ - readonly isPrimaryKey?: boolean; - /** True if this index represents the primary key and is not inbound (https://dexie.org/docs/inbound) */ - readonly outbound?: boolean; - /** True if and only if keyPath is an array (https://dexie.org/docs/Compound-Index) */ - readonly compound?: boolean; - /** keyPath, null for primary key, string for single-property indexes, Array for compound indexes */ - readonly keyPath: null | string | string[]; - /** Auto-generated primary key (does not apply to secondary indexes) */ - readonly autoIncrement?: boolean; - /** Whether index is unique. Also true if index is primary key. */ - readonly unique?: boolean; - /** Whether index is multiEntry. */ - readonly multiEntry?: boolean; - /** Extract (using keyPath) a key from given value (object). Null for outbound primary keys */ - readonly extractKey: ((value: any) => any) | null; - /** If this index is a virtual index, lowLevelIndex represents the actual IndexedDB index behind it */ - readonly lowLevelIndex?: DBCoreIndex; -} -export interface DBCore { - stack: "dbcore"; - // Transaction and Object Store - transaction(stores: string[], mode: "readonly" | "readwrite", options?: DbCoreTransactionOptions): DBCoreTransaction; - // Utility methods - readonly MIN_KEY: any; - readonly MAX_KEY: any; - readonly schema: DBCoreSchema; - table(name: string): DBCoreTable; -} -export interface DBCoreTable { - readonly name: string; - readonly schema: DBCoreTableSchema; - mutate(req: DBCoreMutateRequest): Promise; - get(req: DBCoreGetRequest): Promise; - getMany(req: DBCoreGetManyRequest): Promise; - query(req: DBCoreQueryRequest): Promise; - openCursor(req: DBCoreOpenCursorRequest): Promise; - count(req: DBCoreCountRequest): Promise; -} -export interface Table { - db: Dexie; - name: string; - schema: TableSchema; - hook: TableHooks; - core: DBCoreTable; - get(key: TKey): PromiseExtended; - get(key: TKey, thenShortcut: ThenShortcut): PromiseExtended; - get(equalityCriterias: { - [key: string]: any; - }): PromiseExtended; - get(equalityCriterias: { - [key: string]: any; - }, thenShortcut: ThenShortcut): PromiseExtended; - where(index: string | string[]): WhereClause; - where(equalityCriterias: { - [key: string]: any; - }): Collection; - filter(fn: (obj: T) => boolean): Collection; - count(): PromiseExtended; - count(thenShortcut: ThenShortcut): PromiseExtended; - offset(n: number): Collection; - limit(n: number): Collection; - each(callback: (obj: T, cursor: { - key: any; - primaryKey: TKey; - }) => any): PromiseExtended; - toArray(): PromiseExtended>; - toArray(thenShortcut: ThenShortcut): PromiseExtended; - toCollection(): Collection; - orderBy(index: string | string[]): Collection; - reverse(): Collection; - mapToClass(constructor: Function): Function; - add(item: TInsertType, key?: TKey): PromiseExtended; - update(key: TKey | T, changes: UpdateSpec | ((obj: T, ctx: { - value: any; - primKey: IndexableType; - }) => void | boolean)): PromiseExtended; - put(item: TInsertType, key?: TKey): PromiseExtended; - delete(key: TKey): PromiseExtended; - clear(): PromiseExtended; - bulkGet(keys: TKey[]): PromiseExtended<(T | undefined)[]>; - bulkAdd(items: readonly TInsertType[], keys: IndexableTypeArrayReadonly, options: { - allKeys: B; - }): PromiseExtended; - bulkAdd(items: readonly TInsertType[], options: { - allKeys: B; - }): PromiseExtended; - bulkAdd(items: readonly TInsertType[], keys?: IndexableTypeArrayReadonly, options?: { - allKeys: boolean; - }): PromiseExtended; - bulkPut(items: readonly TInsertType[], keys: IndexableTypeArrayReadonly, options: { - allKeys: B; - }): PromiseExtended; - bulkPut(items: readonly TInsertType[], options: { - allKeys: B; - }): PromiseExtended; - bulkPut(items: readonly TInsertType[], keys?: IndexableTypeArrayReadonly, options?: { - allKeys: boolean; - }): PromiseExtended; - bulkUpdate(keysAndChanges: ReadonlyArray<{ - key: TKey; - changes: UpdateSpec; - }>): PromiseExtended; - bulkDelete(keys: TKey[]): PromiseExtended; -} -export interface Version { - stores(schema: { - [tableName: string]: string | null; - }): Version; - upgrade(fn: (trans: Transaction) => PromiseLike | void): Version; -} -export type TransactionMode = "readonly" | "readwrite" | "r" | "r!" | "r?" | "rw" | "rw!" | "rw?"; -export type DbSchema = { - [tableName: string]: TableSchema; -}; -export interface Middleware { - stack: TStack["stack"]; - create: (down: TStack) => Partial; - level?: number; - name?: string; -} -export interface DexieStacks { - dbcore: DBCore; -} -export type TableProp = { - [K in keyof DX]: DX[K] extends { - schema: any; - get: any; - put: any; - add: any; - where: any; - } ? K : never; -}[keyof DX] & string; -export type TXWithTables = Dexie extends DX ? Transaction // If not subclassed, just expect a Transaction without table props - : Transaction & { - [P in TableProp]: DX[P]; -}; -export interface Dexie { - readonly name: string; - readonly tables: Table[]; - readonly verno: number; - readonly vip: Dexie; - readonly _allTables: { - [name: string]: Table; - }; - readonly core: DBCore; - _createTransaction: (this: Dexie, mode: IDBTransactionMode, storeNames: ArrayLike, dbschema: DbSchema, parentTransaction?: Transaction | null) => Transaction; - readonly _novip: Dexie; - _dbSchema: DbSchema; - version(versionNumber: number): Version; - on: DbEvents; - open(): PromiseExtended; - table(tableName: string): Table; - transaction(mode: TransactionMode, tables: readonly (string | Table)[], scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; - transaction(mode: TransactionMode, table: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; - transaction(mode: TransactionMode, table: string | Table, table2: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; - transaction(mode: TransactionMode, table: string | Table, table2: string | Table, table3: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; - transaction(mode: TransactionMode, table: string | Table, table2: string | Table, table3: string | Table, table4: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; - transaction(mode: TransactionMode, table: string | Table, table2: string | Table, table3: string | Table, table5: string | Table, scope: (trans: TXWithTables) => PromiseLike | U): PromiseExtended; - close(closeOptions?: { - disableAutoOpen: boolean; - }): void; - delete(closeOptions?: { - disableAutoOpen: boolean; - }): PromiseExtended; - isOpen(): boolean; - hasBeenClosed(): boolean; - hasFailed(): boolean; - dynamicallyOpened(): boolean; - backendDB(): IDBDatabase; - use(middleware: Middleware): this; - // Add more supported stacks here... : use(middleware: Middleware): this; - unuse({ stack, create }: Middleware<{ - stack: keyof DexieStacks; - }>): this; - unuse({ stack, name }: { - stack: keyof DexieStacks; - name: string; - }): this; - // Make it possible to touch physical class constructors where they reside - as properties on db instance. - // For example, checking if (x instanceof db.Table). Can't do (x instanceof Dexie.Table because it's just a virtual interface) - Table: { - prototype: Table; - }; - WhereClause: { - prototype: WhereClause; - }; - Version: { - prototype: Version; - }; - Transaction: { - prototype: Transaction; - }; - Collection: { - prototype: Collection; - }; -} -/** DexieError - * - * Common base class for all errors originating from Dexie.js except TypeError, - * SyntaxError and RangeError. - * - * https://dexie.org/docs/DexieErrors/DexieError - * - */ -export interface DexieError extends Error { - name: string; - message: string; - stack: string; - inner: any; - toString(): string; -} -/** - * List of the names of auto-generated error classes that extends DexieError - * and shares the interface of DexieError. - * - * Each error should be documented at https://dexie.org/docs/DexieErrors/Dexie. - * - * The generic type DexieExceptionClasses is a map of full error name to - * error constructor. The DexieExceptionClasses is mixed in into Dexie, - * so that it is always possible to throw or catch certain errors via - * Dexie.ErrorName. Example: - * - * try { - * throw new Dexie.InvalidTableError("Invalid table foo", innerError?); - * } catch (err) { - * if (err instanceof Dexie.InvalidTableError) { - * // Could also have check for err.name === "InvalidTableError", or - * // err.name === Dexie.errnames.InvalidTableError. - * console.log("Seems to be an invalid table here..."); - * } else { - * throw err; - * } - * } - */ -export type DexieErrors = { - // https://dexie.org/docs/DexieErrors/Dexie.OpenFailedError - OpenFailed: "OpenFailedError"; - // https://dexie.org/docs/DexieErrors/Dexie.VersionChangeError - VersionChange: "VersionChangeError"; - // https://dexie.org/docs/DexieErrors/Dexie.SchemaError - Schema: "SchemaError"; - // https://dexie.org/docs/DexieErrors/Dexie.UpgradeError - Upgrade: "UpgradeError"; - // https://dexie.org/docs/DexieErrors/Dexie.InvalidTableError - InvalidTable: "InvalidTableError"; - // https://dexie.org/docs/DexieErrors/Dexie.MissingAPIError - MissingAPI: "MissingAPIError"; - // https://dexie.org/docs/DexieErrors/Dexie.NoSuchDatabaseError - NoSuchDatabase: "NoSuchDatabaseError"; - // https://dexie.org/docs/DexieErrors/Dexie.InvalidArgumentError - InvalidArgument: "InvalidArgumentError"; - // https://dexie.org/docs/DexieErrors/Dexie.SubTransactionError - SubTransaction: "SubTransactionError"; - // https://dexie.org/docs/DexieErrors/Dexie.UnsupportedError - Unsupported: "UnsupportedError"; - // https://dexie.org/docs/DexieErrors/Dexie.InternalError - Internal: "InternalError"; - // https://dexie.org/docs/DexieErrors/Dexie.DatabaseClosedError - DatabaseClosed: "DatabaseClosedError"; - // https://dexie.org/docs/DexieErrors/Dexie.PrematureCommitError - PrematureCommit: "PrematureCommitError"; - // https://dexie.org/docs/DexieErrors/Dexie.ForeignAwaitError - ForeignAwait: "ForeignAwaitError"; - // https://dexie.org/docs/DexieErrors/Dexie.UnknownError - Unknown: "UnknownError"; - // https://dexie.org/docs/DexieErrors/Dexie.ConstraintError - Constraint: "ConstraintError"; - // https://dexie.org/docs/DexieErrors/Dexie.DataError - Data: "DataError"; - // https://dexie.org/docs/DexieErrors/Dexie.TransactionInactiveError - TransactionInactive: "TransactionInactiveError"; - // https://dexie.org/docs/DexieErrors/Dexie.ReadOnlyError - ReadOnly: "ReadOnlyError"; - // https://dexie.org/docs/DexieErrors/Dexie.VersionError - Version: "VersionError"; - // https://dexie.org/docs/DexieErrors/Dexie.NotFoundError - NotFound: "NotFoundError"; - // https://dexie.org/docs/DexieErrors/Dexie.InvalidStateError - InvalidState: "InvalidStateError"; - // https://dexie.org/docs/DexieErrors/Dexie.InvalidAccessError - InvalidAccess: "InvalidAccessError"; - // https://dexie.org/docs/DexieErrors/Dexie.AbortError - Abort: "AbortError"; - // https://dexie.org/docs/DexieErrors/Dexie.TimeoutError - Timeout: "TimeoutError"; - // https://dexie.org/docs/DexieErrors/Dexie.QuotaExceededError - QuotaExceeded: "QuotaExceededError"; - // https://dexie.org/docs/DexieErrors/Dexie.DataCloneError - DataClone: "DataCloneError"; -}; -/** ModifyError - * - * https://dexie.org/docs/DexieErrors/Dexie.ModifyError - */ -export interface ModifyError extends DexieError { - failures: Array; - failedKeys: IndexableTypeArrayReadonly; - successCount: number; -} -/** BulkError - * - * https://dexie.org/docs/DexieErrors/Dexie.BulkError - */ -export interface BulkError extends DexieError { - failures: Error[]; - failuresByPos: { - [operationNumber: number]: Error; - }; -} -export interface DexieErrorConstructor { - new (msg?: string, inner?: Object): DexieError; - new (inner: Object): DexieError; - prototype: DexieError; -} -export interface ModifyErrorConstructor { - new (msg?: string, failures?: any[], successCount?: number, failedKeys?: IndexableTypeArrayReadonly): ModifyError; - prototype: ModifyError; -} -export interface BulkErrorConstructor { - new (msg?: string, failures?: { - [operationNumber: number]: Error; - }): BulkError; - prototype: BulkError; -} -export type ExceptionSet = { - [P in DexieErrors[keyof DexieErrors]]: DexieErrorConstructor; -}; -export type DexieExceptionClasses = ExceptionSet & { - DexieError: DexieErrorConstructor; - ModifyError: ModifyErrorConstructor; - BulkError: BulkErrorConstructor; -}; -export interface DexieDOMDependencies { - indexedDB: IDBFactory; - IDBKeyRange: typeof IDBKeyRange; -} -declare global { - interface SymbolConstructor { - readonly observable: symbol; - } -} -export interface Subscribable { - subscribe(observer: Partial>): Unsubscribable; -} -export interface Unsubscribable { - unsubscribe(): void; -} -export interface Observable { - subscribe(observerOrNext?: Observer | ((value: T) => void)): Subscription; - subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription; - getValue?(): T; - hasValue?(): boolean; - [Symbol.observable]: () => Subscribable; -} -export interface Subscription { - unsubscribe(): void; - readonly closed: boolean; -} -export interface Observer { - start?: (subscription: Subscription) => void; - next?: (value: T) => void; - error?: (error: any) => void; - complete?: () => void; -} -export type GlobalQueryCache = { - // TODO: Change to parts: {[part: string]: TblQueryCache} - // och unsignaledParts: ObservabilitySet; - [part: string]: TblQueryCache; // part is `idb://${dbName}/${tableName}` -}; -export interface TblQueryCache { - queries: { - query: { - [indexName: string]: CacheEntry[]; - }; - count: { - [indexName: string]: CacheEntry[]; - }; - }; - objs: Map; - optimisticOps: DBCoreMutateRequest[]; - unsignaledParts: ObservabilitySet; -} -export interface CacheEntryCommon { - subscribers: Set<() => void>; - obsSet: ObservabilitySet; - //txObsSet: ObservabilitySet; - promise: Promise; - dirty: boolean; -} -export type CacheEntry = CacheEntryCommon & ({ - type: "query"; - req: DBCoreQueryRequest; - res?: readonly any[]; -} | { - type: "count"; - req: DBCoreCountRequest; - res?: number; -}); -export type ChromeTransactionDurability = "default" | "strict" | "relaxed"; -export interface DexieOptions { - addons?: Array<(db: Dexie) => void>; - autoOpen?: boolean; - indexedDB?: { - open: Function; - }; - IDBKeyRange?: { - bound: Function; - lowerBound: Function; - upperBound: Function; - }; - allowEmptyDB?: boolean; - modifyChunkSize?: number; - chromeTransactionDurability?: ChromeTransactionDurability; - cache?: "immutable" | "cloned" | "disabled"; -} -export interface DexieConstructor extends DexieExceptionClasses { - new (databaseName: string, options?: DexieOptions): Dexie; - prototype: Dexie; - addons: Array<(db: Dexie) => void>; - version: number; - semVer: string; - currentTransaction: Transaction; - waitFor(promise: PromiseLike | T, timeoutMilliseconds?: number): Promise; - getDatabaseNames(): Promise; - getDatabaseNames(thenShortcut: ThenShortcut): Promise; - vip(scopeFunction: () => U): U; - ignoreTransaction(fn: () => U): U; - disableBfCache?: boolean; - liveQuery(fn: () => T | Promise): Observable; - extendObservabilitySet(target: ObservabilitySet, newSet: ObservabilitySet): ObservabilitySet; - override(origFunc: F, overridedFactory: (fn: any) => any): F; // ? - getByKeyPath(obj: Object, keyPath: string | string[]): any; - setByKeyPath(obj: Object, keyPath: string | string[], value: any): void; - delByKeyPath(obj: Object, keyPath: string | string[]): void; - shallowClone(obj: T): T; - deepClone(obj: T): T; - asap(fn: Function): void; //? - maxKey: Array> | string; - minKey: number; - exists(dbName: string): Promise; - delete(dbName: string): Promise; - dependencies: DexieDOMDependencies; - default: Dexie; // Work-around for different build tools handling default imports differently. - cache: GlobalQueryCache; - debug: false | true | "dexie"; - Promise: PromiseExtendedConstructor; - //TableSchema: {}; // Deprecate! - //IndexSpec: {new():IndexSpec}; //? Deprecate - Events: (ctx?: any) => DexieEventSet; - on: GlobalDexieEvents; - errnames: DexieErrors; -} -export class Entity { - protected constructor(); - protected readonly db: TDexieSubClass; - table(): TableProp; -} -export type IsStrictlyAny = (T extends never ? true : false) extends false ? false : true; -/** Extract the union of literal method names in T - */ -export type MethodProps = { - [P in keyof T]: IsStrictlyAny extends true ? never // Plain property of type any (not method) - : T[P] extends (...args: any[]) => any ? P // a function (method) - : never; -}[keyof T]; -/** Default insert type of T is a subset of T where: - * * given optional props (such as an auto-generated primary key) are made optional - * * methods are omitted - */ -export type InsertType = Omit> & { - [P in OptionalProps]?: T[P]; -}; -/** IDType extract the actual type of the primary key: - * * If TKey is a literal type that names a property of T, extract the type using T[TKey] - * * Else, use TKey as is. - */ -export type IDType = IsStrictlyAny extends true ? TKeyPropNameOrKeyType : TKeyPropNameOrKeyType extends string ? TKeyPropNameOrKeyType extends keyof T ? T[TKeyPropNameOrKeyType] : TKeyPropNameOrKeyType : TKeyPropNameOrKeyType; -export type EntityTable> = Table, TInsertType>; -export declare var Dexie: DexieConstructor; -export interface _Table extends Table { -} -export interface _Collection extends Collection { -} -export declare module Dexie { - // The "Dexie.Promise" type. - type Promise = PromiseExtended; // Because many samples have been Dexie.Promise. - // The "Dexie.Table" interface. Same as named exported interface Table. - interface Table extends _Table { - } // Because all samples have been Dexie.Table<...> - // The "Dexie.Collection" interface. Same as named exported interface Collection. - interface Collection extends _Collection { - } // Because app-code may declare it. -} -export function liveQuery(querier: () => T | Promise): Observable; -export function mergeRanges(target: IntervalTree, newSet: IntervalTree): void; -export function rangesOverlap(rangeSet1: IntervalTree, rangeSet2: IntervalTree): boolean; -export function cmp(a: any, b: any): number; -export function replacePrefix(a: string, b: string): PropModification; -export function add(num: number | bigint | any[]): PropModification; -export function remove(num: number | bigint | any[]): PropModification; -/** Exporting 'Dexie' as the default export. - **/ -export default Dexie; - -export {}; diff --git a/src/dexie/dist/dexie.js b/src/dexie/dist/dexie.js deleted file mode 100644 index afafcc381..000000000 --- a/src/dexie/dist/dexie.js +++ /dev/null @@ -1,5898 +0,0 @@ -/* - * Dexie.js - a minimalistic wrapper for IndexedDB - * =============================================== - * - * By David Fahlander, david.fahlander@gmail.com - * - * Version 4.0.7, Sun May 26 2024 - * - * https://dexie.org - * - * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/ - */ - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dexie = factory()); -})(this, (function () { 'use strict'; - - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } - var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - function __spreadArray(to, from, pack) { - if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; - } - } - return to.concat(ar || Array.prototype.slice.call(from)); - } - - var _global = typeof globalThis !== 'undefined' ? globalThis : - typeof self !== 'undefined' ? self : - typeof window !== 'undefined' ? window : - global; - - var keys = Object.keys; - var isArray = Array.isArray; - if (typeof Promise !== 'undefined' && !_global.Promise) { - _global.Promise = Promise; - } - function extend(obj, extension) { - if (typeof extension !== 'object') - return obj; - keys(extension).forEach(function (key) { - obj[key] = extension[key]; - }); - return obj; - } - var getProto = Object.getPrototypeOf; - var _hasOwn = {}.hasOwnProperty; - function hasOwn(obj, prop) { - return _hasOwn.call(obj, prop); - } - function props(proto, extension) { - if (typeof extension === 'function') - extension = extension(getProto(proto)); - (typeof Reflect === "undefined" ? keys : Reflect.ownKeys)(extension).forEach(function (key) { - setProp(proto, key, extension[key]); - }); - } - var defineProperty = Object.defineProperty; - function setProp(obj, prop, functionOrGetSet, options) { - defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, "get") && typeof functionOrGetSet.get === 'function' ? - { get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true } : - { value: functionOrGetSet, configurable: true, writable: true }, options)); - } - function derive(Child) { - return { - from: function (Parent) { - Child.prototype = Object.create(Parent.prototype); - setProp(Child.prototype, "constructor", Child); - return { - extend: props.bind(null, Child.prototype) - }; - } - }; - } - var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - function getPropertyDescriptor(obj, prop) { - var pd = getOwnPropertyDescriptor(obj, prop); - var proto; - return pd || (proto = getProto(obj)) && getPropertyDescriptor(proto, prop); - } - var _slice = [].slice; - function slice(args, start, end) { - return _slice.call(args, start, end); - } - function override(origFunc, overridedFactory) { - return overridedFactory(origFunc); - } - function assert(b) { - if (!b) - throw new Error("Assertion Failed"); - } - function asap$1(fn) { - if (_global.setImmediate) - setImmediate(fn); - else - setTimeout(fn, 0); - } - function arrayToObject(array, extractor) { - return array.reduce(function (result, item, i) { - var nameAndValue = extractor(item, i); - if (nameAndValue) - result[nameAndValue[0]] = nameAndValue[1]; - return result; - }, {}); - } - function getByKeyPath(obj, keyPath) { - if (typeof keyPath === 'string' && hasOwn(obj, keyPath)) - return obj[keyPath]; - if (!keyPath) - return obj; - if (typeof keyPath !== 'string') { - var rv = []; - for (var i = 0, l = keyPath.length; i < l; ++i) { - var val = getByKeyPath(obj, keyPath[i]); - rv.push(val); - } - return rv; - } - var period = keyPath.indexOf('.'); - if (period !== -1) { - var innerObj = obj[keyPath.substr(0, period)]; - return innerObj == null ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1)); - } - return undefined; - } - function setByKeyPath(obj, keyPath, value) { - if (!obj || keyPath === undefined) - return; - if ('isFrozen' in Object && Object.isFrozen(obj)) - return; - if (typeof keyPath !== 'string' && 'length' in keyPath) { - assert(typeof value !== 'string' && 'length' in value); - for (var i = 0, l = keyPath.length; i < l; ++i) { - setByKeyPath(obj, keyPath[i], value[i]); - } - } - else { - var period = keyPath.indexOf('.'); - if (period !== -1) { - var currentKeyPath = keyPath.substr(0, period); - var remainingKeyPath = keyPath.substr(period + 1); - if (remainingKeyPath === "") - if (value === undefined) { - if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) - obj.splice(currentKeyPath, 1); - else - delete obj[currentKeyPath]; - } - else - obj[currentKeyPath] = value; - else { - var innerObj = obj[currentKeyPath]; - if (!innerObj || !hasOwn(obj, currentKeyPath)) - innerObj = (obj[currentKeyPath] = {}); - setByKeyPath(innerObj, remainingKeyPath, value); - } - } - else { - if (value === undefined) { - if (isArray(obj) && !isNaN(parseInt(keyPath))) - obj.splice(keyPath, 1); - else - delete obj[keyPath]; - } - else - obj[keyPath] = value; - } - } - } - function delByKeyPath(obj, keyPath) { - if (typeof keyPath === 'string') - setByKeyPath(obj, keyPath, undefined); - else if ('length' in keyPath) - [].map.call(keyPath, function (kp) { - setByKeyPath(obj, kp, undefined); - }); - } - function shallowClone(obj) { - var rv = {}; - for (var m in obj) { - if (hasOwn(obj, m)) - rv[m] = obj[m]; - } - return rv; - } - var concat = [].concat; - function flatten(a) { - return concat.apply([], a); - } - var intrinsicTypeNames = "BigUint64Array,BigInt64Array,Array,Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,FileSystemDirectoryHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey" - .split(',').concat(flatten([8, 16, 32, 64].map(function (num) { return ["Int", "Uint", "Float"].map(function (t) { return t + num + "Array"; }); }))).filter(function (t) { return _global[t]; }); - var intrinsicTypes = new Set(intrinsicTypeNames.map(function (t) { return _global[t]; })); - function cloneSimpleObjectTree(o) { - var rv = {}; - for (var k in o) - if (hasOwn(o, k)) { - var v = o[k]; - rv[k] = !v || typeof v !== 'object' || intrinsicTypes.has(v.constructor) ? v : cloneSimpleObjectTree(v); - } - return rv; - } - function objectIsEmpty(o) { - for (var k in o) - if (hasOwn(o, k)) - return false; - return true; - } - var circularRefs = null; - function deepClone(any) { - circularRefs = new WeakMap(); - var rv = innerDeepClone(any); - circularRefs = null; - return rv; - } - function innerDeepClone(x) { - if (!x || typeof x !== 'object') - return x; - var rv = circularRefs.get(x); - if (rv) - return rv; - if (isArray(x)) { - rv = []; - circularRefs.set(x, rv); - for (var i = 0, l = x.length; i < l; ++i) { - rv.push(innerDeepClone(x[i])); - } - } - else if (intrinsicTypes.has(x.constructor)) { - rv = x; - } - else { - var proto = getProto(x); - rv = proto === Object.prototype ? {} : Object.create(proto); - circularRefs.set(x, rv); - for (var prop in x) { - if (hasOwn(x, prop)) { - rv[prop] = innerDeepClone(x[prop]); - } - } - } - return rv; - } - var toString = {}.toString; - function toStringTag(o) { - return toString.call(o).slice(8, -1); - } - var iteratorSymbol = typeof Symbol !== 'undefined' ? - Symbol.iterator : - '@@iterator'; - var getIteratorOf = typeof iteratorSymbol === "symbol" ? function (x) { - var i; - return x != null && (i = x[iteratorSymbol]) && i.apply(x); - } : function () { return null; }; - function delArrayItem(a, x) { - var i = a.indexOf(x); - if (i >= 0) - a.splice(i, 1); - return i >= 0; - } - var NO_CHAR_ARRAY = {}; - function getArrayOf(arrayLike) { - var i, a, x, it; - if (arguments.length === 1) { - if (isArray(arrayLike)) - return arrayLike.slice(); - if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') - return [arrayLike]; - if ((it = getIteratorOf(arrayLike))) { - a = []; - while ((x = it.next()), !x.done) - a.push(x.value); - return a; - } - if (arrayLike == null) - return [arrayLike]; - i = arrayLike.length; - if (typeof i === 'number') { - a = new Array(i); - while (i--) - a[i] = arrayLike[i]; - return a; - } - return [arrayLike]; - } - i = arguments.length; - a = new Array(i); - while (i--) - a[i] = arguments[i]; - return a; - } - var isAsyncFunction = typeof Symbol !== 'undefined' - ? function (fn) { return fn[Symbol.toStringTag] === 'AsyncFunction'; } - : function () { return false; }; - - var dexieErrorNames = [ - 'Modify', - 'Bulk', - 'OpenFailed', - 'VersionChange', - 'Schema', - 'Upgrade', - 'InvalidTable', - 'MissingAPI', - 'NoSuchDatabase', - 'InvalidArgument', - 'SubTransaction', - 'Unsupported', - 'Internal', - 'DatabaseClosed', - 'PrematureCommit', - 'ForeignAwait' - ]; - var idbDomErrorNames = [ - 'Unknown', - 'Constraint', - 'Data', - 'TransactionInactive', - 'ReadOnly', - 'Version', - 'NotFound', - 'InvalidState', - 'InvalidAccess', - 'Abort', - 'Timeout', - 'QuotaExceeded', - 'Syntax', - 'DataClone' - ]; - var errorList = dexieErrorNames.concat(idbDomErrorNames); - var defaultTexts = { - VersionChanged: "Database version changed by other database connection", - DatabaseClosed: "Database has been closed", - Abort: "Transaction aborted", - TransactionInactive: "Transaction has already completed or failed", - MissingAPI: "IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb" - }; - function DexieError(name, msg) { - this.name = name; - this.message = msg; - } - derive(DexieError).from(Error).extend({ - toString: function () { return this.name + ": " + this.message; } - }); - function getMultiErrorMessage(msg, failures) { - return msg + ". Errors: " + Object.keys(failures) - .map(function (key) { return failures[key].toString(); }) - .filter(function (v, i, s) { return s.indexOf(v) === i; }) - .join('\n'); - } - function ModifyError(msg, failures, successCount, failedKeys) { - this.failures = failures; - this.failedKeys = failedKeys; - this.successCount = successCount; - this.message = getMultiErrorMessage(msg, failures); - } - derive(ModifyError).from(DexieError); - function BulkError(msg, failures) { - this.name = "BulkError"; - this.failures = Object.keys(failures).map(function (pos) { return failures[pos]; }); - this.failuresByPos = failures; - this.message = getMultiErrorMessage(msg, this.failures); - } - derive(BulkError).from(DexieError); - var errnames = errorList.reduce(function (obj, name) { return (obj[name] = name + "Error", obj); }, {}); - var BaseException = DexieError; - var exceptions = errorList.reduce(function (obj, name) { - var fullName = name + "Error"; - function DexieError(msgOrInner, inner) { - this.name = fullName; - if (!msgOrInner) { - this.message = defaultTexts[name] || fullName; - this.inner = null; - } - else if (typeof msgOrInner === 'string') { - this.message = "".concat(msgOrInner).concat(!inner ? '' : '\n ' + inner); - this.inner = inner || null; - } - else if (typeof msgOrInner === 'object') { - this.message = "".concat(msgOrInner.name, " ").concat(msgOrInner.message); - this.inner = msgOrInner; - } - } - derive(DexieError).from(BaseException); - obj[name] = DexieError; - return obj; - }, {}); - exceptions.Syntax = SyntaxError; - exceptions.Type = TypeError; - exceptions.Range = RangeError; - var exceptionMap = idbDomErrorNames.reduce(function (obj, name) { - obj[name + "Error"] = exceptions[name]; - return obj; - }, {}); - function mapError(domError, message) { - if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name]) - return domError; - var rv = new exceptionMap[domError.name](message || domError.message, domError); - if ("stack" in domError) { - setProp(rv, "stack", { get: function () { - return this.inner.stack; - } }); - } - return rv; - } - var fullNameExceptions = errorList.reduce(function (obj, name) { - if (["Syntax", "Type", "Range"].indexOf(name) === -1) - obj[name + "Error"] = exceptions[name]; - return obj; - }, {}); - fullNameExceptions.ModifyError = ModifyError; - fullNameExceptions.DexieError = DexieError; - fullNameExceptions.BulkError = BulkError; - - function nop() { } - function mirror(val) { return val; } - function pureFunctionChain(f1, f2) { - if (f1 == null || f1 === mirror) - return f2; - return function (val) { - return f2(f1(val)); - }; - } - function callBoth(on1, on2) { - return function () { - on1.apply(this, arguments); - on2.apply(this, arguments); - }; - } - function hookCreatingChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - var res = f1.apply(this, arguments); - if (res !== undefined) - arguments[0] = res; - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = null; - this.onerror = null; - var res2 = f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - return res2 !== undefined ? res2 : res; - }; - } - function hookDeletingChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - f1.apply(this, arguments); - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = this.onerror = null; - f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - }; - } - function hookUpdatingChain(f1, f2) { - if (f1 === nop) - return f2; - return function (modifications) { - var res = f1.apply(this, arguments); - extend(modifications, res); - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = null; - this.onerror = null; - var res2 = f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - return res === undefined ? - (res2 === undefined ? undefined : res2) : - (extend(res, res2)); - }; - } - function reverseStoppableEventChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - if (f2.apply(this, arguments) === false) - return false; - return f1.apply(this, arguments); - }; - } - function promisableChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - var res = f1.apply(this, arguments); - if (res && typeof res.then === 'function') { - var thiz = this, i = arguments.length, args = new Array(i); - while (i--) - args[i] = arguments[i]; - return res.then(function () { - return f2.apply(thiz, args); - }); - } - return f2.apply(this, arguments); - }; - } - - var debug = typeof location !== 'undefined' && - /^(http|https):\/\/(localhost|127\.0\.0\.1)/.test(location.href); - function setDebug(value, filter) { - debug = value; - } - - var INTERNAL = {}; - var ZONE_ECHO_LIMIT = 100, _a$1 = typeof Promise === 'undefined' ? - [] : - (function () { - var globalP = Promise.resolve(); - if (typeof crypto === 'undefined' || !crypto.subtle) - return [globalP, getProto(globalP), globalP]; - var nativeP = crypto.subtle.digest("SHA-512", new Uint8Array([0])); - return [ - nativeP, - getProto(nativeP), - globalP - ]; - })(), resolvedNativePromise = _a$1[0], nativePromiseProto = _a$1[1], resolvedGlobalPromise = _a$1[2], nativePromiseThen = nativePromiseProto && nativePromiseProto.then; - var NativePromise = resolvedNativePromise && resolvedNativePromise.constructor; - var patchGlobalPromise = !!resolvedGlobalPromise; - function schedulePhysicalTick() { - queueMicrotask(physicalTick); - } - var asap = function (callback, args) { - microtickQueue.push([callback, args]); - if (needsNewPhysicalTick) { - schedulePhysicalTick(); - needsNewPhysicalTick = false; - } - }; - var isOutsideMicroTick = true, - needsNewPhysicalTick = true, - unhandledErrors = [], - rejectingErrors = [], - rejectionMapper = mirror; - var globalPSD = { - id: 'global', - global: true, - ref: 0, - unhandleds: [], - onunhandled: nop, - pgp: false, - env: {}, - finalize: nop - }; - var PSD = globalPSD; - var microtickQueue = []; - var numScheduledCalls = 0; - var tickFinalizers = []; - function DexiePromise(fn) { - if (typeof this !== 'object') - throw new TypeError('Promises must be constructed via new'); - this._listeners = []; - this._lib = false; - var psd = (this._PSD = PSD); - if (typeof fn !== 'function') { - if (fn !== INTERNAL) - throw new TypeError('Not a function'); - this._state = arguments[1]; - this._value = arguments[2]; - if (this._state === false) - handleRejection(this, this._value); - return; - } - this._state = null; - this._value = null; - ++psd.ref; - executePromiseTask(this, fn); - } - var thenProp = { - get: function () { - var psd = PSD, microTaskId = totalEchoes; - function then(onFulfilled, onRejected) { - var _this = this; - var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes); - var cleanup = possibleAwait && !decrementExpectedAwaits(); - var rv = new DexiePromise(function (resolve, reject) { - propagateToListener(_this, new Listener(nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup), nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup), resolve, reject, psd)); - }); - if (this._consoleTask) - rv._consoleTask = this._consoleTask; - return rv; - } - then.prototype = INTERNAL; - return then; - }, - set: function (value) { - setProp(this, 'then', value && value.prototype === INTERNAL ? - thenProp : - { - get: function () { - return value; - }, - set: thenProp.set - }); - } - }; - props(DexiePromise.prototype, { - then: thenProp, - _then: function (onFulfilled, onRejected) { - propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); - }, - catch: function (onRejected) { - if (arguments.length === 1) - return this.then(null, onRejected); - var type = arguments[0], handler = arguments[1]; - return typeof type === 'function' ? this.then(null, function (err) { - return err instanceof type ? handler(err) : PromiseReject(err); - }) - : this.then(null, function (err) { - return err && err.name === type ? handler(err) : PromiseReject(err); - }); - }, - finally: function (onFinally) { - return this.then(function (value) { - return DexiePromise.resolve(onFinally()).then(function () { return value; }); - }, function (err) { - return DexiePromise.resolve(onFinally()).then(function () { return PromiseReject(err); }); - }); - }, - timeout: function (ms, msg) { - var _this = this; - return ms < Infinity ? - new DexiePromise(function (resolve, reject) { - var handle = setTimeout(function () { return reject(new exceptions.Timeout(msg)); }, ms); - _this.then(resolve, reject).finally(clearTimeout.bind(null, handle)); - }) : this; - } - }); - if (typeof Symbol !== 'undefined' && Symbol.toStringTag) - setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise'); - globalPSD.env = snapShot(); - function Listener(onFulfilled, onRejected, resolve, reject, zone) { - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; - this.onRejected = typeof onRejected === 'function' ? onRejected : null; - this.resolve = resolve; - this.reject = reject; - this.psd = zone; - } - props(DexiePromise, { - all: function () { - var values = getArrayOf.apply(null, arguments) - .map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - if (values.length === 0) - resolve([]); - var remaining = values.length; - values.forEach(function (a, i) { return DexiePromise.resolve(a).then(function (x) { - values[i] = x; - if (!--remaining) - resolve(values); - }, reject); }); - }); - }, - resolve: function (value) { - if (value instanceof DexiePromise) - return value; - if (value && typeof value.then === 'function') - return new DexiePromise(function (resolve, reject) { - value.then(resolve, reject); - }); - var rv = new DexiePromise(INTERNAL, true, value); - return rv; - }, - reject: PromiseReject, - race: function () { - var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - values.map(function (value) { return DexiePromise.resolve(value).then(resolve, reject); }); - }); - }, - PSD: { - get: function () { return PSD; }, - set: function (value) { return PSD = value; } - }, - totalEchoes: { get: function () { return totalEchoes; } }, - newPSD: newScope, - usePSD: usePSD, - scheduler: { - get: function () { return asap; }, - set: function (value) { asap = value; } - }, - rejectionMapper: { - get: function () { return rejectionMapper; }, - set: function (value) { rejectionMapper = value; } - }, - follow: function (fn, zoneProps) { - return new DexiePromise(function (resolve, reject) { - return newScope(function (resolve, reject) { - var psd = PSD; - psd.unhandleds = []; - psd.onunhandled = reject; - psd.finalize = callBoth(function () { - var _this = this; - run_at_end_of_this_or_next_physical_tick(function () { - _this.unhandleds.length === 0 ? resolve() : reject(_this.unhandleds[0]); - }); - }, psd.finalize); - fn(); - }, zoneProps, resolve, reject); - }); - } - }); - if (NativePromise) { - if (NativePromise.allSettled) - setProp(DexiePromise, "allSettled", function () { - var possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(function (resolve) { - if (possiblePromises.length === 0) - resolve([]); - var remaining = possiblePromises.length; - var results = new Array(remaining); - possiblePromises.forEach(function (p, i) { return DexiePromise.resolve(p).then(function (value) { return results[i] = { status: "fulfilled", value: value }; }, function (reason) { return results[i] = { status: "rejected", reason: reason }; }) - .then(function () { return --remaining || resolve(results); }); }); - }); - }); - if (NativePromise.any && typeof AggregateError !== 'undefined') - setProp(DexiePromise, "any", function () { - var possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - if (possiblePromises.length === 0) - reject(new AggregateError([])); - var remaining = possiblePromises.length; - var failures = new Array(remaining); - possiblePromises.forEach(function (p, i) { return DexiePromise.resolve(p).then(function (value) { return resolve(value); }, function (failure) { - failures[i] = failure; - if (!--remaining) - reject(new AggregateError(failures)); - }); }); - }); - }); - } - function executePromiseTask(promise, fn) { - try { - fn(function (value) { - if (promise._state !== null) - return; - if (value === promise) - throw new TypeError('A promise cannot be resolved with itself.'); - var shouldExecuteTick = promise._lib && beginMicroTickScope(); - if (value && typeof value.then === 'function') { - executePromiseTask(promise, function (resolve, reject) { - value instanceof DexiePromise ? - value._then(resolve, reject) : - value.then(resolve, reject); - }); - } - else { - promise._state = true; - promise._value = value; - propagateAllListeners(promise); - } - if (shouldExecuteTick) - endMicroTickScope(); - }, handleRejection.bind(null, promise)); - } - catch (ex) { - handleRejection(promise, ex); - } - } - function handleRejection(promise, reason) { - rejectingErrors.push(reason); - if (promise._state !== null) - return; - var shouldExecuteTick = promise._lib && beginMicroTickScope(); - reason = rejectionMapper(reason); - promise._state = false; - promise._value = reason; - addPossiblyUnhandledError(promise); - propagateAllListeners(promise); - if (shouldExecuteTick) - endMicroTickScope(); - } - function propagateAllListeners(promise) { - var listeners = promise._listeners; - promise._listeners = []; - for (var i = 0, len = listeners.length; i < len; ++i) { - propagateToListener(promise, listeners[i]); - } - var psd = promise._PSD; - --psd.ref || psd.finalize(); - if (numScheduledCalls === 0) { - ++numScheduledCalls; - asap(function () { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - }, []); - } - } - function propagateToListener(promise, listener) { - if (promise._state === null) { - promise._listeners.push(listener); - return; - } - var cb = promise._state ? listener.onFulfilled : listener.onRejected; - if (cb === null) { - return (promise._state ? listener.resolve : listener.reject)(promise._value); - } - ++listener.psd.ref; - ++numScheduledCalls; - asap(callListener, [cb, promise, listener]); - } - function callListener(cb, promise, listener) { - try { - var ret, value = promise._value; - if (!promise._state && rejectingErrors.length) - rejectingErrors = []; - ret = debug && promise._consoleTask ? promise._consoleTask.run(function () { return cb(value); }) : cb(value); - if (!promise._state && rejectingErrors.indexOf(value) === -1) { - markErrorAsHandled(promise); - } - listener.resolve(ret); - } - catch (e) { - listener.reject(e); - } - finally { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - --listener.psd.ref || listener.psd.finalize(); - } - } - function physicalTick() { - usePSD(globalPSD, function () { - beginMicroTickScope() && endMicroTickScope(); - }); - } - function beginMicroTickScope() { - var wasRootExec = isOutsideMicroTick; - isOutsideMicroTick = false; - needsNewPhysicalTick = false; - return wasRootExec; - } - function endMicroTickScope() { - var callbacks, i, l; - do { - while (microtickQueue.length > 0) { - callbacks = microtickQueue; - microtickQueue = []; - l = callbacks.length; - for (i = 0; i < l; ++i) { - var item = callbacks[i]; - item[0].apply(null, item[1]); - } - } - } while (microtickQueue.length > 0); - isOutsideMicroTick = true; - needsNewPhysicalTick = true; - } - function finalizePhysicalTick() { - var unhandledErrs = unhandledErrors; - unhandledErrors = []; - unhandledErrs.forEach(function (p) { - p._PSD.onunhandled.call(null, p._value, p); - }); - var finalizers = tickFinalizers.slice(0); - var i = finalizers.length; - while (i) - finalizers[--i](); - } - function run_at_end_of_this_or_next_physical_tick(fn) { - function finalizer() { - fn(); - tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1); - } - tickFinalizers.push(finalizer); - ++numScheduledCalls; - asap(function () { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - }, []); - } - function addPossiblyUnhandledError(promise) { - if (!unhandledErrors.some(function (p) { return p._value === promise._value; })) - unhandledErrors.push(promise); - } - function markErrorAsHandled(promise) { - var i = unhandledErrors.length; - while (i) - if (unhandledErrors[--i]._value === promise._value) { - unhandledErrors.splice(i, 1); - return; - } - } - function PromiseReject(reason) { - return new DexiePromise(INTERNAL, false, reason); - } - function wrap(fn, errorCatcher) { - var psd = PSD; - return function () { - var wasRootExec = beginMicroTickScope(), outerScope = PSD; - try { - switchToZone(psd, true); - return fn.apply(this, arguments); - } - catch (e) { - errorCatcher && errorCatcher(e); - } - finally { - switchToZone(outerScope, false); - if (wasRootExec) - endMicroTickScope(); - } - }; - } - var task = { awaits: 0, echoes: 0, id: 0 }; - var taskCounter = 0; - var zoneStack = []; - var zoneEchoes = 0; - var totalEchoes = 0; - var zone_id_counter = 0; - function newScope(fn, props, a1, a2) { - var parent = PSD, psd = Object.create(parent); - psd.parent = parent; - psd.ref = 0; - psd.global = false; - psd.id = ++zone_id_counter; - globalPSD.env; - psd.env = patchGlobalPromise ? { - Promise: DexiePromise, - PromiseProp: { value: DexiePromise, configurable: true, writable: true }, - all: DexiePromise.all, - race: DexiePromise.race, - allSettled: DexiePromise.allSettled, - any: DexiePromise.any, - resolve: DexiePromise.resolve, - reject: DexiePromise.reject, - } : {}; - if (props) - extend(psd, props); - ++parent.ref; - psd.finalize = function () { - --this.parent.ref || this.parent.finalize(); - }; - var rv = usePSD(psd, fn, a1, a2); - if (psd.ref === 0) - psd.finalize(); - return rv; - } - function incrementExpectedAwaits() { - if (!task.id) - task.id = ++taskCounter; - ++task.awaits; - task.echoes += ZONE_ECHO_LIMIT; - return task.id; - } - function decrementExpectedAwaits() { - if (!task.awaits) - return false; - if (--task.awaits === 0) - task.id = 0; - task.echoes = task.awaits * ZONE_ECHO_LIMIT; - return true; - } - if (('' + nativePromiseThen).indexOf('[native code]') === -1) { - incrementExpectedAwaits = decrementExpectedAwaits = nop; - } - function onPossibleParallellAsync(possiblePromise) { - if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) { - incrementExpectedAwaits(); - return possiblePromise.then(function (x) { - decrementExpectedAwaits(); - return x; - }, function (e) { - decrementExpectedAwaits(); - return rejection(e); - }); - } - return possiblePromise; - } - function zoneEnterEcho(targetZone) { - ++totalEchoes; - if (!task.echoes || --task.echoes === 0) { - task.echoes = task.awaits = task.id = 0; - } - zoneStack.push(PSD); - switchToZone(targetZone, true); - } - function zoneLeaveEcho() { - var zone = zoneStack[zoneStack.length - 1]; - zoneStack.pop(); - switchToZone(zone, false); - } - function switchToZone(targetZone, bEnteringZone) { - var currentZone = PSD; - if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) { - queueMicrotask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho); - } - if (targetZone === PSD) - return; - PSD = targetZone; - if (currentZone === globalPSD) - globalPSD.env = snapShot(); - if (patchGlobalPromise) { - var GlobalPromise = globalPSD.env.Promise; - var targetEnv = targetZone.env; - if (currentZone.global || targetZone.global) { - Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp); - GlobalPromise.all = targetEnv.all; - GlobalPromise.race = targetEnv.race; - GlobalPromise.resolve = targetEnv.resolve; - GlobalPromise.reject = targetEnv.reject; - if (targetEnv.allSettled) - GlobalPromise.allSettled = targetEnv.allSettled; - if (targetEnv.any) - GlobalPromise.any = targetEnv.any; - } - } - } - function snapShot() { - var GlobalPromise = _global.Promise; - return patchGlobalPromise ? { - Promise: GlobalPromise, - PromiseProp: Object.getOwnPropertyDescriptor(_global, "Promise"), - all: GlobalPromise.all, - race: GlobalPromise.race, - allSettled: GlobalPromise.allSettled, - any: GlobalPromise.any, - resolve: GlobalPromise.resolve, - reject: GlobalPromise.reject, - } : {}; - } - function usePSD(psd, fn, a1, a2, a3) { - var outerScope = PSD; - try { - switchToZone(psd, true); - return fn(a1, a2, a3); - } - finally { - switchToZone(outerScope, false); - } - } - function nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) { - return typeof fn !== 'function' ? fn : function () { - var outerZone = PSD; - if (possibleAwait) - incrementExpectedAwaits(); - switchToZone(zone, true); - try { - return fn.apply(this, arguments); - } - finally { - switchToZone(outerZone, false); - if (cleanup) - queueMicrotask(decrementExpectedAwaits); - } - }; - } - function execInGlobalContext(cb) { - if (Promise === NativePromise && task.echoes === 0) { - if (zoneEchoes === 0) { - cb(); - } - else { - enqueueNativeMicroTask(cb); - } - } - else { - setTimeout(cb, 0); - } - } - var rejection = DexiePromise.reject; - - function tempTransaction(db, mode, storeNames, fn) { - if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) { - if (db._state.openComplete) { - return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError)); - } - if (!db._state.isBeingOpened) { - if (!db._state.autoOpen) - return rejection(new exceptions.DatabaseClosed()); - db.open().catch(nop); - } - return db._state.dbReadyPromise.then(function () { return tempTransaction(db, mode, storeNames, fn); }); - } - else { - var trans = db._createTransaction(mode, storeNames, db._dbSchema); - try { - trans.create(); - db._state.PR1398_maxLoop = 3; - } - catch (ex) { - if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { - console.warn('Dexie: Need to reopen db'); - db.close({ disableAutoOpen: false }); - return db.open().then(function () { return tempTransaction(db, mode, storeNames, fn); }); - } - return rejection(ex); - } - return trans._promise(mode, function (resolve, reject) { - return newScope(function () { - PSD.trans = trans; - return fn(resolve, reject, trans); - }); - }).then(function (result) { - if (mode === 'readwrite') - try { - trans.idbtrans.commit(); - } - catch (_a) { } - return mode === 'readonly' ? result : trans._completion.then(function () { return result; }); - }); - } - } - - var DEXIE_VERSION = '4.0.7'; - var maxString = String.fromCharCode(65535); - var minKey = -Infinity; - var INVALID_KEY_ARGUMENT = "Invalid key provided. Keys must be of type string, number, Date or Array."; - var STRING_EXPECTED = "String expected."; - var connections = []; - var DBNAMES_DB = '__dbnames'; - var READONLY = 'readonly'; - var READWRITE = 'readwrite'; - - function combine(filter1, filter2) { - return filter1 ? - filter2 ? - function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } : - filter1 : - filter2; - } - - var AnyRange = { - type: 3 , - lower: -Infinity, - lowerOpen: false, - upper: [[]], - upperOpen: false - }; - - function workaroundForUndefinedPrimKey(keyPath) { - return typeof keyPath === "string" && !/\./.test(keyPath) - ? function (obj) { - if (obj[keyPath] === undefined && (keyPath in obj)) { - obj = deepClone(obj); - delete obj[keyPath]; - } - return obj; - } - : function (obj) { return obj; }; - } - - function Entity() { - throw exceptions.Type(); - } - - function cmp(a, b) { - try { - var ta = type(a); - var tb = type(b); - if (ta !== tb) { - if (ta === 'Array') - return 1; - if (tb === 'Array') - return -1; - if (ta === 'binary') - return 1; - if (tb === 'binary') - return -1; - if (ta === 'string') - return 1; - if (tb === 'string') - return -1; - if (ta === 'Date') - return 1; - if (tb !== 'Date') - return NaN; - return -1; - } - switch (ta) { - case 'number': - case 'Date': - case 'string': - return a > b ? 1 : a < b ? -1 : 0; - case 'binary': { - return compareUint8Arrays(getUint8Array(a), getUint8Array(b)); - } - case 'Array': - return compareArrays(a, b); - } - } - catch (_a) { } - return NaN; - } - function compareArrays(a, b) { - var al = a.length; - var bl = b.length; - var l = al < bl ? al : bl; - for (var i = 0; i < l; ++i) { - var res = cmp(a[i], b[i]); - if (res !== 0) - return res; - } - return al === bl ? 0 : al < bl ? -1 : 1; - } - function compareUint8Arrays(a, b) { - var al = a.length; - var bl = b.length; - var l = al < bl ? al : bl; - for (var i = 0; i < l; ++i) { - if (a[i] !== b[i]) - return a[i] < b[i] ? -1 : 1; - } - return al === bl ? 0 : al < bl ? -1 : 1; - } - function type(x) { - var t = typeof x; - if (t !== 'object') - return t; - if (ArrayBuffer.isView(x)) - return 'binary'; - var tsTag = toStringTag(x); - return tsTag === 'ArrayBuffer' ? 'binary' : tsTag; - } - function getUint8Array(a) { - if (a instanceof Uint8Array) - return a; - if (ArrayBuffer.isView(a)) - return new Uint8Array(a.buffer, a.byteOffset, a.byteLength); - return new Uint8Array(a); - } - - var Table = (function () { - function Table() { - } - Table.prototype._trans = function (mode, fn, writeLocked) { - var trans = this._tx || PSD.trans; - var tableName = this.name; - var task = debug && typeof console !== 'undefined' && console.createTask && console.createTask("Dexie: ".concat(mode === 'readonly' ? 'read' : 'write', " ").concat(this.name)); - function checkTableInTransaction(resolve, reject, trans) { - if (!trans.schema[tableName]) - throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); - return fn(trans.idbtrans, trans); - } - var wasRootExec = beginMicroTickScope(); - try { - var p = trans && trans.db._novip === this.db._novip ? - trans === PSD.trans ? - trans._promise(mode, checkTableInTransaction, writeLocked) : - newScope(function () { return trans._promise(mode, checkTableInTransaction, writeLocked); }, { trans: trans, transless: PSD.transless || PSD }) : - tempTransaction(this.db, mode, [this.name], checkTableInTransaction); - if (task) { - p._consoleTask = task; - p = p.catch(function (err) { - console.trace(err); - return rejection(err); - }); - } - return p; - } - finally { - if (wasRootExec) - endMicroTickScope(); - } - }; - Table.prototype.get = function (keyOrCrit, cb) { - var _this = this; - if (keyOrCrit && keyOrCrit.constructor === Object) - return this.where(keyOrCrit).first(cb); - if (keyOrCrit == null) - return rejection(new exceptions.Type("Invalid argument to Table.get()")); - return this._trans('readonly', function (trans) { - return _this.core.get({ trans: trans, key: keyOrCrit }) - .then(function (res) { return _this.hook.reading.fire(res); }); - }).then(cb); - }; - Table.prototype.where = function (indexOrCrit) { - if (typeof indexOrCrit === 'string') - return new this.db.WhereClause(this, indexOrCrit); - if (isArray(indexOrCrit)) - return new this.db.WhereClause(this, "[".concat(indexOrCrit.join('+'), "]")); - var keyPaths = keys(indexOrCrit); - if (keyPaths.length === 1) - return this - .where(keyPaths[0]) - .equals(indexOrCrit[keyPaths[0]]); - var compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(function (ix) { - if (ix.compound && - keyPaths.every(function (keyPath) { return ix.keyPath.indexOf(keyPath) >= 0; })) { - for (var i = 0; i < keyPaths.length; ++i) { - if (keyPaths.indexOf(ix.keyPath[i]) === -1) - return false; - } - return true; - } - return false; - }).sort(function (a, b) { return a.keyPath.length - b.keyPath.length; })[0]; - if (compoundIndex && this.db._maxKey !== maxString) { - var keyPathsInValidOrder = compoundIndex.keyPath.slice(0, keyPaths.length); - return this - .where(keyPathsInValidOrder) - .equals(keyPathsInValidOrder.map(function (kp) { return indexOrCrit[kp]; })); - } - if (!compoundIndex && debug) - console.warn("The query ".concat(JSON.stringify(indexOrCrit), " on ").concat(this.name, " would benefit from a ") + - "compound index [".concat(keyPaths.join('+'), "]")); - var idxByName = this.schema.idxByName; - var idb = this.db._deps.indexedDB; - function equals(a, b) { - return idb.cmp(a, b) === 0; - } - var _a = keyPaths.reduce(function (_a, keyPath) { - var prevIndex = _a[0], prevFilterFn = _a[1]; - var index = idxByName[keyPath]; - var value = indexOrCrit[keyPath]; - return [ - prevIndex || index, - prevIndex || !index ? - combine(prevFilterFn, index && index.multi ? - function (x) { - var prop = getByKeyPath(x, keyPath); - return isArray(prop) && prop.some(function (item) { return equals(value, item); }); - } : function (x) { return equals(value, getByKeyPath(x, keyPath)); }) - : prevFilterFn - ]; - }, [null, null]), idx = _a[0], filterFunction = _a[1]; - return idx ? - this.where(idx.name).equals(indexOrCrit[idx.keyPath]) - .filter(filterFunction) : - compoundIndex ? - this.filter(filterFunction) : - this.where(keyPaths).equals(''); - }; - Table.prototype.filter = function (filterFunction) { - return this.toCollection().and(filterFunction); - }; - Table.prototype.count = function (thenShortcut) { - return this.toCollection().count(thenShortcut); - }; - Table.prototype.offset = function (offset) { - return this.toCollection().offset(offset); - }; - Table.prototype.limit = function (numRows) { - return this.toCollection().limit(numRows); - }; - Table.prototype.each = function (callback) { - return this.toCollection().each(callback); - }; - Table.prototype.toArray = function (thenShortcut) { - return this.toCollection().toArray(thenShortcut); - }; - Table.prototype.toCollection = function () { - return new this.db.Collection(new this.db.WhereClause(this)); - }; - Table.prototype.orderBy = function (index) { - return new this.db.Collection(new this.db.WhereClause(this, isArray(index) ? - "[".concat(index.join('+'), "]") : - index)); - }; - Table.prototype.reverse = function () { - return this.toCollection().reverse(); - }; - Table.prototype.mapToClass = function (constructor) { - var _a = this, db = _a.db, tableName = _a.name; - this.schema.mappedClass = constructor; - if (constructor.prototype instanceof Entity) { - constructor = (function (_super) { - __extends(class_1, _super); - function class_1() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(class_1.prototype, "db", { - get: function () { return db; }, - enumerable: false, - configurable: true - }); - class_1.prototype.table = function () { return tableName; }; - return class_1; - }(constructor)); - } - var inheritedProps = new Set(); - for (var proto = constructor.prototype; proto; proto = getProto(proto)) { - Object.getOwnPropertyNames(proto).forEach(function (propName) { return inheritedProps.add(propName); }); - } - var readHook = function (obj) { - if (!obj) - return obj; - var res = Object.create(constructor.prototype); - for (var m in obj) - if (!inheritedProps.has(m)) - try { - res[m] = obj[m]; - } - catch (_) { } - return res; - }; - if (this.schema.readHook) { - this.hook.reading.unsubscribe(this.schema.readHook); - } - this.schema.readHook = readHook; - this.hook("reading", readHook); - return constructor; - }; - Table.prototype.defineClass = function () { - function Class(content) { - extend(this, content); - } - return this.mapToClass(Class); - }; - Table.prototype.add = function (obj, key) { - var _this = this; - var _a = this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - var objToAdd = obj; - if (keyPath && auto) { - objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); - } - return this._trans('readwrite', function (trans) { - return _this.core.mutate({ trans: trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd] }); - }).then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult; }) - .then(function (lastResult) { - if (keyPath) { - try { - setByKeyPath(obj, keyPath, lastResult); - } - catch (_) { } - } - return lastResult; - }); - }; - Table.prototype.update = function (keyOrObject, modifications) { - if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) { - var key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath); - if (key === undefined) - return rejection(new exceptions.InvalidArgument("Given object does not contain its primary key")); - return this.where(":id").equals(key).modify(modifications); - } - else { - return this.where(":id").equals(keyOrObject).modify(modifications); - } - }; - Table.prototype.put = function (obj, key) { - var _this = this; - var _a = this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - var objToAdd = obj; - if (keyPath && auto) { - objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); - } - return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null }); }) - .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult; }) - .then(function (lastResult) { - if (keyPath) { - try { - setByKeyPath(obj, keyPath, lastResult); - } - catch (_) { } - } - return lastResult; - }); - }; - Table.prototype.delete = function (key) { - var _this = this; - return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'delete', keys: [key] }); }) - .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined; }); - }; - Table.prototype.clear = function () { - var _this = this; - return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'deleteRange', range: AnyRange }); }) - .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined; }); - }; - Table.prototype.bulkGet = function (keys) { - var _this = this; - return this._trans('readonly', function (trans) { - return _this.core.getMany({ - keys: keys, - trans: trans - }).then(function (result) { return result.map(function (res) { return _this.hook.reading.fire(res); }); }); - }); - }; - Table.prototype.bulkAdd = function (objects, keysOrOptions, options) { - var _this = this; - var keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; - options = options || (keys ? undefined : keysOrOptions); - var wantResults = options ? options.allKeys : undefined; - return this._trans('readwrite', function (trans) { - var _a = _this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - if (keyPath && keys) - throw new exceptions.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys"); - if (keys && keys.length !== objects.length) - throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); - var numObjects = objects.length; - var objectsToAdd = keyPath && auto ? - objects.map(workaroundForUndefinedPrimKey(keyPath)) : - objects; - return _this.core.mutate({ trans: trans, type: 'add', keys: keys, values: objectsToAdd, wantResults: wantResults }) - .then(function (_a) { - var numFailures = _a.numFailures, results = _a.results, lastResult = _a.lastResult, failures = _a.failures; - var result = wantResults ? results : lastResult; - if (numFailures === 0) - return result; - throw new BulkError("".concat(_this.name, ".bulkAdd(): ").concat(numFailures, " of ").concat(numObjects, " operations failed"), failures); - }); - }); - }; - Table.prototype.bulkPut = function (objects, keysOrOptions, options) { - var _this = this; - var keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; - options = options || (keys ? undefined : keysOrOptions); - var wantResults = options ? options.allKeys : undefined; - return this._trans('readwrite', function (trans) { - var _a = _this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - if (keyPath && keys) - throw new exceptions.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys"); - if (keys && keys.length !== objects.length) - throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); - var numObjects = objects.length; - var objectsToPut = keyPath && auto ? - objects.map(workaroundForUndefinedPrimKey(keyPath)) : - objects; - return _this.core.mutate({ trans: trans, type: 'put', keys: keys, values: objectsToPut, wantResults: wantResults }) - .then(function (_a) { - var numFailures = _a.numFailures, results = _a.results, lastResult = _a.lastResult, failures = _a.failures; - var result = wantResults ? results : lastResult; - if (numFailures === 0) - return result; - throw new BulkError("".concat(_this.name, ".bulkPut(): ").concat(numFailures, " of ").concat(numObjects, " operations failed"), failures); - }); - }); - }; - Table.prototype.bulkUpdate = function (keysAndChanges) { - var _this = this; - var coreTable = this.core; - var keys = keysAndChanges.map(function (entry) { return entry.key; }); - var changeSpecs = keysAndChanges.map(function (entry) { return entry.changes; }); - var offsetMap = []; - return this._trans('readwrite', function (trans) { - return coreTable.getMany({ trans: trans, keys: keys, cache: 'clone' }).then(function (objs) { - var resultKeys = []; - var resultObjs = []; - keysAndChanges.forEach(function (_a, idx) { - var key = _a.key, changes = _a.changes; - var obj = objs[idx]; - if (obj) { - for (var _i = 0, _b = Object.keys(changes); _i < _b.length; _i++) { - var keyPath = _b[_i]; - var value = changes[keyPath]; - if (keyPath === _this.schema.primKey.keyPath) { - if (cmp(value, key) !== 0) { - throw new exceptions.Constraint("Cannot update primary key in bulkUpdate()"); - } - } - else { - setByKeyPath(obj, keyPath, value); - } - } - offsetMap.push(idx); - resultKeys.push(key); - resultObjs.push(obj); - } - }); - var numEntries = resultKeys.length; - return coreTable - .mutate({ - trans: trans, - type: 'put', - keys: resultKeys, - values: resultObjs, - updates: { - keys: keys, - changeSpecs: changeSpecs - } - }) - .then(function (_a) { - var numFailures = _a.numFailures, failures = _a.failures; - if (numFailures === 0) - return numEntries; - for (var _i = 0, _b = Object.keys(failures); _i < _b.length; _i++) { - var offset = _b[_i]; - var mappedOffset = offsetMap[Number(offset)]; - if (mappedOffset != null) { - var failure = failures[offset]; - delete failures[offset]; - failures[mappedOffset] = failure; - } - } - throw new BulkError("".concat(_this.name, ".bulkUpdate(): ").concat(numFailures, " of ").concat(numEntries, " operations failed"), failures); - }); - }); - }); - }; - Table.prototype.bulkDelete = function (keys) { - var _this = this; - var numKeys = keys.length; - return this._trans('readwrite', function (trans) { - return _this.core.mutate({ trans: trans, type: 'delete', keys: keys }); - }).then(function (_a) { - var numFailures = _a.numFailures, lastResult = _a.lastResult, failures = _a.failures; - if (numFailures === 0) - return lastResult; - throw new BulkError("".concat(_this.name, ".bulkDelete(): ").concat(numFailures, " of ").concat(numKeys, " operations failed"), failures); - }); - }; - return Table; - }()); - - function Events(ctx) { - var evs = {}; - var rv = function (eventName, subscriber) { - if (subscriber) { - var i = arguments.length, args = new Array(i - 1); - while (--i) - args[i - 1] = arguments[i]; - evs[eventName].subscribe.apply(null, args); - return ctx; - } - else if (typeof (eventName) === 'string') { - return evs[eventName]; - } - }; - rv.addEventType = add; - for (var i = 1, l = arguments.length; i < l; ++i) { - add(arguments[i]); - } - return rv; - function add(eventName, chainFunction, defaultFunction) { - if (typeof eventName === 'object') - return addConfiguredEvents(eventName); - if (!chainFunction) - chainFunction = reverseStoppableEventChain; - if (!defaultFunction) - defaultFunction = nop; - var context = { - subscribers: [], - fire: defaultFunction, - subscribe: function (cb) { - if (context.subscribers.indexOf(cb) === -1) { - context.subscribers.push(cb); - context.fire = chainFunction(context.fire, cb); - } - }, - unsubscribe: function (cb) { - context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; }); - context.fire = context.subscribers.reduce(chainFunction, defaultFunction); - } - }; - evs[eventName] = rv[eventName] = context; - return context; - } - function addConfiguredEvents(cfg) { - keys(cfg).forEach(function (eventName) { - var args = cfg[eventName]; - if (isArray(args)) { - add(eventName, cfg[eventName][0], cfg[eventName][1]); - } - else if (args === 'asap') { - var context = add(eventName, mirror, function fire() { - var i = arguments.length, args = new Array(i); - while (i--) - args[i] = arguments[i]; - context.subscribers.forEach(function (fn) { - asap$1(function fireEvent() { - fn.apply(null, args); - }); - }); - }); - } - else - throw new exceptions.InvalidArgument("Invalid event config"); - }); - } - } - - function makeClassConstructor(prototype, constructor) { - derive(constructor).from({ prototype: prototype }); - return constructor; - } - - function createTableConstructor(db) { - return makeClassConstructor(Table.prototype, function Table(name, tableSchema, trans) { - this.db = db; - this._tx = trans; - this.name = name; - this.schema = tableSchema; - this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, { - "creating": [hookCreatingChain, nop], - "reading": [pureFunctionChain, mirror], - "updating": [hookUpdatingChain, nop], - "deleting": [hookDeletingChain, nop] - }); - }); - } - - function isPlainKeyRange(ctx, ignoreLimitFilter) { - return !(ctx.filter || ctx.algorithm || ctx.or) && - (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter); - } - function addFilter(ctx, fn) { - ctx.filter = combine(ctx.filter, fn); - } - function addReplayFilter(ctx, factory, isLimitFilter) { - var curr = ctx.replayFilter; - ctx.replayFilter = curr ? function () { return combine(curr(), factory()); } : factory; - ctx.justLimit = isLimitFilter && !curr; - } - function addMatchFilter(ctx, fn) { - ctx.isMatch = combine(ctx.isMatch, fn); - } - function getIndexOrStore(ctx, coreSchema) { - if (ctx.isPrimKey) - return coreSchema.primaryKey; - var index = coreSchema.getIndexByKeyPath(ctx.index); - if (!index) - throw new exceptions.Schema("KeyPath " + ctx.index + " on object store " + coreSchema.name + " is not indexed"); - return index; - } - function openCursor(ctx, coreTable, trans) { - var index = getIndexOrStore(ctx, coreTable.schema); - return coreTable.openCursor({ - trans: trans, - values: !ctx.keysOnly, - reverse: ctx.dir === 'prev', - unique: !!ctx.unique, - query: { - index: index, - range: ctx.range - } - }); - } - function iter(ctx, fn, coreTrans, coreTable) { - var filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter; - if (!ctx.or) { - return iterate(openCursor(ctx, coreTable, coreTrans), combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper); - } - else { - var set_1 = {}; - var union = function (item, cursor, advance) { - if (!filter || filter(cursor, advance, function (result) { return cursor.stop(result); }, function (err) { return cursor.fail(err); })) { - var primaryKey = cursor.primaryKey; - var key = '' + primaryKey; - if (key === '[object ArrayBuffer]') - key = '' + new Uint8Array(primaryKey); - if (!hasOwn(set_1, key)) { - set_1[key] = true; - fn(item, cursor, advance); - } - } - }; - return Promise.all([ - ctx.or._iterate(union, coreTrans), - iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper) - ]); - } - } - function iterate(cursorPromise, filter, fn, valueMapper) { - var mappedFn = valueMapper ? function (x, c, a) { return fn(valueMapper(x), c, a); } : fn; - var wrappedFn = wrap(mappedFn); - return cursorPromise.then(function (cursor) { - if (cursor) { - return cursor.start(function () { - var c = function () { return cursor.continue(); }; - if (!filter || filter(cursor, function (advancer) { return c = advancer; }, function (val) { cursor.stop(val); c = nop; }, function (e) { cursor.fail(e); c = nop; })) - wrappedFn(cursor.value, cursor, function (advancer) { return c = advancer; }); - c(); - }); - } - }); - } - - var PropModSymbol = Symbol(); - var PropModification = (function () { - function PropModification(spec) { - Object.assign(this, spec); - } - PropModification.prototype.execute = function (value) { - var _a; - if (this.add !== undefined) { - var term = this.add; - if (isArray(term)) { - return __spreadArray(__spreadArray([], (isArray(value) ? value : []), true), term, true).sort(); - } - if (typeof term === 'number') - return (Number(value) || 0) + term; - if (typeof term === 'bigint') { - try { - return BigInt(value) + term; - } - catch (_b) { - return BigInt(0) + term; - } - } - throw new TypeError("Invalid term ".concat(term)); - } - if (this.remove !== undefined) { - var subtrahend_1 = this.remove; - if (isArray(subtrahend_1)) { - return isArray(value) ? value.filter(function (item) { return !subtrahend_1.includes(item); }).sort() : []; - } - if (typeof subtrahend_1 === 'number') - return Number(value) - subtrahend_1; - if (typeof subtrahend_1 === 'bigint') { - try { - return BigInt(value) - subtrahend_1; - } - catch (_c) { - return BigInt(0) - subtrahend_1; - } - } - throw new TypeError("Invalid subtrahend ".concat(subtrahend_1)); - } - var prefixToReplace = (_a = this.replacePrefix) === null || _a === void 0 ? void 0 : _a[0]; - if (prefixToReplace && typeof value === 'string' && value.startsWith(prefixToReplace)) { - return this.replacePrefix[1] + value.substring(prefixToReplace.length); - } - return value; - }; - return PropModification; - }()); - - var Collection = (function () { - function Collection() { - } - Collection.prototype._read = function (fn, cb) { - var ctx = this._ctx; - return ctx.error ? - ctx.table._trans(null, rejection.bind(null, ctx.error)) : - ctx.table._trans('readonly', fn).then(cb); - }; - Collection.prototype._write = function (fn) { - var ctx = this._ctx; - return ctx.error ? - ctx.table._trans(null, rejection.bind(null, ctx.error)) : - ctx.table._trans('readwrite', fn, "locked"); - }; - Collection.prototype._addAlgorithm = function (fn) { - var ctx = this._ctx; - ctx.algorithm = combine(ctx.algorithm, fn); - }; - Collection.prototype._iterate = function (fn, coreTrans) { - return iter(this._ctx, fn, coreTrans, this._ctx.table.core); - }; - Collection.prototype.clone = function (props) { - var rv = Object.create(this.constructor.prototype), ctx = Object.create(this._ctx); - if (props) - extend(ctx, props); - rv._ctx = ctx; - return rv; - }; - Collection.prototype.raw = function () { - this._ctx.valueMapper = null; - return this; - }; - Collection.prototype.each = function (fn) { - var ctx = this._ctx; - return this._read(function (trans) { return iter(ctx, fn, trans, ctx.table.core); }); - }; - Collection.prototype.count = function (cb) { - var _this = this; - return this._read(function (trans) { - var ctx = _this._ctx; - var coreTable = ctx.table.core; - if (isPlainKeyRange(ctx, true)) { - return coreTable.count({ - trans: trans, - query: { - index: getIndexOrStore(ctx, coreTable.schema), - range: ctx.range - } - }).then(function (count) { return Math.min(count, ctx.limit); }); - } - else { - var count = 0; - return iter(ctx, function () { ++count; return false; }, trans, coreTable) - .then(function () { return count; }); - } - }).then(cb); - }; - Collection.prototype.sortBy = function (keyPath, cb) { - var parts = keyPath.split('.').reverse(), lastPart = parts[0], lastIndex = parts.length - 1; - function getval(obj, i) { - if (i) - return getval(obj[parts[i]], i - 1); - return obj[lastPart]; - } - var order = this._ctx.dir === "next" ? 1 : -1; - function sorter(a, b) { - var aVal = getval(a, lastIndex), bVal = getval(b, lastIndex); - return aVal < bVal ? -order : aVal > bVal ? order : 0; - } - return this.toArray(function (a) { - return a.sort(sorter); - }).then(cb); - }; - Collection.prototype.toArray = function (cb) { - var _this = this; - return this._read(function (trans) { - var ctx = _this._ctx; - if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { - var valueMapper_1 = ctx.valueMapper; - var index = getIndexOrStore(ctx, ctx.table.core.schema); - return ctx.table.core.query({ - trans: trans, - limit: ctx.limit, - values: true, - query: { - index: index, - range: ctx.range - } - }).then(function (_a) { - var result = _a.result; - return valueMapper_1 ? result.map(valueMapper_1) : result; - }); - } - else { - var a_1 = []; - return iter(ctx, function (item) { return a_1.push(item); }, trans, ctx.table.core).then(function () { return a_1; }); - } - }, cb); - }; - Collection.prototype.offset = function (offset) { - var ctx = this._ctx; - if (offset <= 0) - return this; - ctx.offset += offset; - if (isPlainKeyRange(ctx)) { - addReplayFilter(ctx, function () { - var offsetLeft = offset; - return function (cursor, advance) { - if (offsetLeft === 0) - return true; - if (offsetLeft === 1) { - --offsetLeft; - return false; - } - advance(function () { - cursor.advance(offsetLeft); - offsetLeft = 0; - }); - return false; - }; - }); - } - else { - addReplayFilter(ctx, function () { - var offsetLeft = offset; - return function () { return (--offsetLeft < 0); }; - }); - } - return this; - }; - Collection.prototype.limit = function (numRows) { - this._ctx.limit = Math.min(this._ctx.limit, numRows); - addReplayFilter(this._ctx, function () { - var rowsLeft = numRows; - return function (cursor, advance, resolve) { - if (--rowsLeft <= 0) - advance(resolve); - return rowsLeft >= 0; - }; - }, true); - return this; - }; - Collection.prototype.until = function (filterFunction, bIncludeStopEntry) { - addFilter(this._ctx, function (cursor, advance, resolve) { - if (filterFunction(cursor.value)) { - advance(resolve); - return bIncludeStopEntry; - } - else { - return true; - } - }); - return this; - }; - Collection.prototype.first = function (cb) { - return this.limit(1).toArray(function (a) { return a[0]; }).then(cb); - }; - Collection.prototype.last = function (cb) { - return this.reverse().first(cb); - }; - Collection.prototype.filter = function (filterFunction) { - addFilter(this._ctx, function (cursor) { - return filterFunction(cursor.value); - }); - addMatchFilter(this._ctx, filterFunction); - return this; - }; - Collection.prototype.and = function (filter) { - return this.filter(filter); - }; - Collection.prototype.or = function (indexName) { - return new this.db.WhereClause(this._ctx.table, indexName, this); - }; - Collection.prototype.reverse = function () { - this._ctx.dir = (this._ctx.dir === "prev" ? "next" : "prev"); - if (this._ondirectionchange) - this._ondirectionchange(this._ctx.dir); - return this; - }; - Collection.prototype.desc = function () { - return this.reverse(); - }; - Collection.prototype.eachKey = function (cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - return this.each(function (val, cursor) { cb(cursor.key, cursor); }); - }; - Collection.prototype.eachUniqueKey = function (cb) { - this._ctx.unique = "unique"; - return this.eachKey(cb); - }; - Collection.prototype.eachPrimaryKey = function (cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); }); - }; - Collection.prototype.keys = function (cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - var a = []; - return this.each(function (item, cursor) { - a.push(cursor.key); - }).then(function () { - return a; - }).then(cb); - }; - Collection.prototype.primaryKeys = function (cb) { - var ctx = this._ctx; - if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { - return this._read(function (trans) { - var index = getIndexOrStore(ctx, ctx.table.core.schema); - return ctx.table.core.query({ - trans: trans, - values: false, - limit: ctx.limit, - query: { - index: index, - range: ctx.range - } - }); - }).then(function (_a) { - var result = _a.result; - return result; - }).then(cb); - } - ctx.keysOnly = !ctx.isMatch; - var a = []; - return this.each(function (item, cursor) { - a.push(cursor.primaryKey); - }).then(function () { - return a; - }).then(cb); - }; - Collection.prototype.uniqueKeys = function (cb) { - this._ctx.unique = "unique"; - return this.keys(cb); - }; - Collection.prototype.firstKey = function (cb) { - return this.limit(1).keys(function (a) { return a[0]; }).then(cb); - }; - Collection.prototype.lastKey = function (cb) { - return this.reverse().firstKey(cb); - }; - Collection.prototype.distinct = function () { - var ctx = this._ctx, idx = ctx.index && ctx.table.schema.idxByName[ctx.index]; - if (!idx || !idx.multi) - return this; - var set = {}; - addFilter(this._ctx, function (cursor) { - var strKey = cursor.primaryKey.toString(); - var found = hasOwn(set, strKey); - set[strKey] = true; - return !found; - }); - return this; - }; - Collection.prototype.modify = function (changes) { - var _this = this; - var ctx = this._ctx; - return this._write(function (trans) { - var modifyer; - if (typeof changes === 'function') { - modifyer = changes; - } - else { - var keyPaths = keys(changes); - var numKeys = keyPaths.length; - modifyer = function (item) { - var anythingModified = false; - for (var i = 0; i < numKeys; ++i) { - var keyPath = keyPaths[i]; - var val = changes[keyPath]; - var origVal = getByKeyPath(item, keyPath); - if (val instanceof PropModification) { - setByKeyPath(item, keyPath, val.execute(origVal)); - anythingModified = true; - } - else if (origVal !== val) { - setByKeyPath(item, keyPath, val); - anythingModified = true; - } - } - return anythingModified; - }; - } - var coreTable = ctx.table.core; - var _a = coreTable.schema.primaryKey, outbound = _a.outbound, extractKey = _a.extractKey; - var limit = _this.db._options.modifyChunkSize || 200; - var totalFailures = []; - var successCount = 0; - var failedKeys = []; - var applyMutateResult = function (expectedCount, res) { - var failures = res.failures, numFailures = res.numFailures; - successCount += expectedCount - numFailures; - for (var _i = 0, _a = keys(failures); _i < _a.length; _i++) { - var pos = _a[_i]; - totalFailures.push(failures[pos]); - } - }; - return _this.clone().primaryKeys().then(function (keys) { - var criteria = isPlainKeyRange(ctx) && - ctx.limit === Infinity && - (typeof changes !== 'function' || changes === deleteCallback) && { - index: ctx.index, - range: ctx.range - }; - var nextChunk = function (offset) { - var count = Math.min(limit, keys.length - offset); - return coreTable.getMany({ - trans: trans, - keys: keys.slice(offset, offset + count), - cache: "immutable" - }).then(function (values) { - var addValues = []; - var putValues = []; - var putKeys = outbound ? [] : null; - var deleteKeys = []; - for (var i = 0; i < count; ++i) { - var origValue = values[i]; - var ctx_1 = { - value: deepClone(origValue), - primKey: keys[offset + i] - }; - if (modifyer.call(ctx_1, ctx_1.value, ctx_1) !== false) { - if (ctx_1.value == null) { - deleteKeys.push(keys[offset + i]); - } - else if (!outbound && cmp(extractKey(origValue), extractKey(ctx_1.value)) !== 0) { - deleteKeys.push(keys[offset + i]); - addValues.push(ctx_1.value); - } - else { - putValues.push(ctx_1.value); - if (outbound) - putKeys.push(keys[offset + i]); - } - } - } - return Promise.resolve(addValues.length > 0 && - coreTable.mutate({ trans: trans, type: 'add', values: addValues }) - .then(function (res) { - for (var pos in res.failures) { - deleteKeys.splice(parseInt(pos), 1); - } - applyMutateResult(addValues.length, res); - })).then(function () { return (putValues.length > 0 || (criteria && typeof changes === 'object')) && - coreTable.mutate({ - trans: trans, - type: 'put', - keys: putKeys, - values: putValues, - criteria: criteria, - changeSpec: typeof changes !== 'function' - && changes, - isAdditionalChunk: offset > 0 - }).then(function (res) { return applyMutateResult(putValues.length, res); }); }).then(function () { return (deleteKeys.length > 0 || (criteria && changes === deleteCallback)) && - coreTable.mutate({ - trans: trans, - type: 'delete', - keys: deleteKeys, - criteria: criteria, - isAdditionalChunk: offset > 0 - }).then(function (res) { return applyMutateResult(deleteKeys.length, res); }); }).then(function () { - return keys.length > offset + count && nextChunk(offset + limit); - }); - }); - }; - return nextChunk(0).then(function () { - if (totalFailures.length > 0) - throw new ModifyError("Error modifying one or more objects", totalFailures, successCount, failedKeys); - return keys.length; - }); - }); - }); - }; - Collection.prototype.delete = function () { - var ctx = this._ctx, range = ctx.range; - if (isPlainKeyRange(ctx) && - (ctx.isPrimKey || range.type === 3 )) - { - return this._write(function (trans) { - var primaryKey = ctx.table.core.schema.primaryKey; - var coreRange = range; - return ctx.table.core.count({ trans: trans, query: { index: primaryKey, range: coreRange } }).then(function (count) { - return ctx.table.core.mutate({ trans: trans, type: 'deleteRange', range: coreRange }) - .then(function (_a) { - var failures = _a.failures; _a.lastResult; _a.results; var numFailures = _a.numFailures; - if (numFailures) - throw new ModifyError("Could not delete some values", Object.keys(failures).map(function (pos) { return failures[pos]; }), count - numFailures); - return count - numFailures; - }); - }); - }); - } - return this.modify(deleteCallback); - }; - return Collection; - }()); - var deleteCallback = function (value, ctx) { return ctx.value = null; }; - - function createCollectionConstructor(db) { - return makeClassConstructor(Collection.prototype, function Collection(whereClause, keyRangeGenerator) { - this.db = db; - var keyRange = AnyRange, error = null; - if (keyRangeGenerator) - try { - keyRange = keyRangeGenerator(); - } - catch (ex) { - error = ex; - } - var whereCtx = whereClause._ctx; - var table = whereCtx.table; - var readingHook = table.hook.reading.fire; - this._ctx = { - table: table, - index: whereCtx.index, - isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)), - range: keyRange, - keysOnly: false, - dir: "next", - unique: "", - algorithm: null, - filter: null, - replayFilter: null, - justLimit: true, - isMatch: null, - offset: 0, - limit: Infinity, - error: error, - or: whereCtx.or, - valueMapper: readingHook !== mirror ? readingHook : null - }; - }); - } - - function simpleCompare(a, b) { - return a < b ? -1 : a === b ? 0 : 1; - } - function simpleCompareReverse(a, b) { - return a > b ? -1 : a === b ? 0 : 1; - } - - function fail(collectionOrWhereClause, err, T) { - var collection = collectionOrWhereClause instanceof WhereClause ? - new collectionOrWhereClause.Collection(collectionOrWhereClause) : - collectionOrWhereClause; - collection._ctx.error = T ? new T(err) : new TypeError(err); - return collection; - } - function emptyCollection(whereClause) { - return new whereClause.Collection(whereClause, function () { return rangeEqual(""); }).limit(0); - } - function upperFactory(dir) { - return dir === "next" ? - function (s) { return s.toUpperCase(); } : - function (s) { return s.toLowerCase(); }; - } - function lowerFactory(dir) { - return dir === "next" ? - function (s) { return s.toLowerCase(); } : - function (s) { return s.toUpperCase(); }; - } - function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) { - var length = Math.min(key.length, lowerNeedle.length); - var llp = -1; - for (var i = 0; i < length; ++i) { - var lwrKeyChar = lowerKey[i]; - if (lwrKeyChar !== lowerNeedle[i]) { - if (cmp(key[i], upperNeedle[i]) < 0) - return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1); - if (cmp(key[i], lowerNeedle[i]) < 0) - return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1); - if (llp >= 0) - return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1); - return null; - } - if (cmp(key[i], lwrKeyChar) < 0) - llp = i; - } - if (length < lowerNeedle.length && dir === "next") - return key + upperNeedle.substr(key.length); - if (length < key.length && dir === "prev") - return key.substr(0, upperNeedle.length); - return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1)); - } - function addIgnoreCaseAlgorithm(whereClause, match, needles, suffix) { - var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix, needlesLen = needles.length; - if (!needles.every(function (s) { return typeof s === 'string'; })) { - return fail(whereClause, STRING_EXPECTED); - } - function initDirection(dir) { - upper = upperFactory(dir); - lower = lowerFactory(dir); - compare = (dir === "next" ? simpleCompare : simpleCompareReverse); - var needleBounds = needles.map(function (needle) { - return { lower: lower(needle), upper: upper(needle) }; - }).sort(function (a, b) { - return compare(a.lower, b.lower); - }); - upperNeedles = needleBounds.map(function (nb) { return nb.upper; }); - lowerNeedles = needleBounds.map(function (nb) { return nb.lower; }); - direction = dir; - nextKeySuffix = (dir === "next" ? "" : suffix); - } - initDirection("next"); - var c = new whereClause.Collection(whereClause, function () { return createRange(upperNeedles[0], lowerNeedles[needlesLen - 1] + suffix); }); - c._ondirectionchange = function (direction) { - initDirection(direction); - }; - var firstPossibleNeedle = 0; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - if (typeof key !== 'string') - return false; - var lowerKey = lower(key); - if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) { - return true; - } - else { - var lowestPossibleCasing = null; - for (var i = firstPossibleNeedle; i < needlesLen; ++i) { - var casing = nextCasing(key, lowerKey, upperNeedles[i], lowerNeedles[i], compare, direction); - if (casing === null && lowestPossibleCasing === null) - firstPossibleNeedle = i + 1; - else if (lowestPossibleCasing === null || compare(lowestPossibleCasing, casing) > 0) { - lowestPossibleCasing = casing; - } - } - if (lowestPossibleCasing !== null) { - advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); }); - } - else { - advance(resolve); - } - return false; - } - }); - return c; - } - function createRange(lower, upper, lowerOpen, upperOpen) { - return { - type: 2 , - lower: lower, - upper: upper, - lowerOpen: lowerOpen, - upperOpen: upperOpen - }; - } - function rangeEqual(value) { - return { - type: 1 , - lower: value, - upper: value - }; - } - - var WhereClause = (function () { - function WhereClause() { - } - Object.defineProperty(WhereClause.prototype, "Collection", { - get: function () { - return this._ctx.table.db.Collection; - }, - enumerable: false, - configurable: true - }); - WhereClause.prototype.between = function (lower, upper, includeLower, includeUpper) { - includeLower = includeLower !== false; - includeUpper = includeUpper === true; - try { - if ((this._cmp(lower, upper) > 0) || - (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper))) - return emptyCollection(this); - return new this.Collection(this, function () { return createRange(lower, upper, !includeLower, !includeUpper); }); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - }; - WhereClause.prototype.equals = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return rangeEqual(value); }); - }; - WhereClause.prototype.above = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(value, undefined, true); }); - }; - WhereClause.prototype.aboveOrEqual = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(value, undefined, false); }); - }; - WhereClause.prototype.below = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(undefined, value, false, true); }); - }; - WhereClause.prototype.belowOrEqual = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(undefined, value); }); - }; - WhereClause.prototype.startsWith = function (str) { - if (typeof str !== 'string') - return fail(this, STRING_EXPECTED); - return this.between(str, str + maxString, true, true); - }; - WhereClause.prototype.startsWithIgnoreCase = function (str) { - if (str === "") - return this.startsWith(str); - return addIgnoreCaseAlgorithm(this, function (x, a) { return x.indexOf(a[0]) === 0; }, [str], maxString); - }; - WhereClause.prototype.equalsIgnoreCase = function (str) { - return addIgnoreCaseAlgorithm(this, function (x, a) { return x === a[0]; }, [str], ""); - }; - WhereClause.prototype.anyOfIgnoreCase = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return emptyCollection(this); - return addIgnoreCaseAlgorithm(this, function (x, a) { return a.indexOf(x) !== -1; }, set, ""); - }; - WhereClause.prototype.startsWithAnyOfIgnoreCase = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return emptyCollection(this); - return addIgnoreCaseAlgorithm(this, function (x, a) { return a.some(function (n) { return x.indexOf(n) === 0; }); }, set, maxString); - }; - WhereClause.prototype.anyOf = function () { - var _this = this; - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - var compare = this._cmp; - try { - set.sort(compare); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - if (set.length === 0) - return emptyCollection(this); - var c = new this.Collection(this, function () { return createRange(set[0], set[set.length - 1]); }); - c._ondirectionchange = function (direction) { - compare = (direction === "next" ? - _this._ascending : - _this._descending); - set.sort(compare); - }; - var i = 0; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - while (compare(key, set[i]) > 0) { - ++i; - if (i === set.length) { - advance(resolve); - return false; - } - } - if (compare(key, set[i]) === 0) { - return true; - } - else { - advance(function () { cursor.continue(set[i]); }); - return false; - } - }); - return c; - }; - WhereClause.prototype.notEqual = function (value) { - return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false }); - }; - WhereClause.prototype.noneOf = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return new this.Collection(this); - try { - set.sort(this._ascending); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - var ranges = set.reduce(function (res, val) { return res ? - res.concat([[res[res.length - 1][1], val]]) : - [[minKey, val]]; }, null); - ranges.push([set[set.length - 1], this.db._maxKey]); - return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false }); - }; - WhereClause.prototype.inAnyRange = function (ranges, options) { - var _this = this; - var cmp = this._cmp, ascending = this._ascending, descending = this._descending, min = this._min, max = this._max; - if (ranges.length === 0) - return emptyCollection(this); - if (!ranges.every(function (range) { - return range[0] !== undefined && - range[1] !== undefined && - ascending(range[0], range[1]) <= 0; - })) { - return fail(this, "First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower", exceptions.InvalidArgument); - } - var includeLowers = !options || options.includeLowers !== false; - var includeUppers = options && options.includeUppers === true; - function addRange(ranges, newRange) { - var i = 0, l = ranges.length; - for (; i < l; ++i) { - var range = ranges[i]; - if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) { - range[0] = min(range[0], newRange[0]); - range[1] = max(range[1], newRange[1]); - break; - } - } - if (i === l) - ranges.push(newRange); - return ranges; - } - var sortDirection = ascending; - function rangeSorter(a, b) { return sortDirection(a[0], b[0]); } - var set; - try { - set = ranges.reduce(addRange, []); - set.sort(rangeSorter); - } - catch (ex) { - return fail(this, INVALID_KEY_ARGUMENT); - } - var rangePos = 0; - var keyIsBeyondCurrentEntry = includeUppers ? - function (key) { return ascending(key, set[rangePos][1]) > 0; } : - function (key) { return ascending(key, set[rangePos][1]) >= 0; }; - var keyIsBeforeCurrentEntry = includeLowers ? - function (key) { return descending(key, set[rangePos][0]) > 0; } : - function (key) { return descending(key, set[rangePos][0]) >= 0; }; - function keyWithinCurrentRange(key) { - return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key); - } - var checkKey = keyIsBeyondCurrentEntry; - var c = new this.Collection(this, function () { return createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers); }); - c._ondirectionchange = function (direction) { - if (direction === "next") { - checkKey = keyIsBeyondCurrentEntry; - sortDirection = ascending; - } - else { - checkKey = keyIsBeforeCurrentEntry; - sortDirection = descending; - } - set.sort(rangeSorter); - }; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - while (checkKey(key)) { - ++rangePos; - if (rangePos === set.length) { - advance(resolve); - return false; - } - } - if (keyWithinCurrentRange(key)) { - return true; - } - else if (_this._cmp(key, set[rangePos][1]) === 0 || _this._cmp(key, set[rangePos][0]) === 0) { - return false; - } - else { - advance(function () { - if (sortDirection === ascending) - cursor.continue(set[rangePos][0]); - else - cursor.continue(set[rangePos][1]); - }); - return false; - } - }); - return c; - }; - WhereClause.prototype.startsWithAnyOf = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (!set.every(function (s) { return typeof s === 'string'; })) { - return fail(this, "startsWithAnyOf() only works with strings"); - } - if (set.length === 0) - return emptyCollection(this); - return this.inAnyRange(set.map(function (str) { return [str, str + maxString]; })); - }; - return WhereClause; - }()); - - function createWhereClauseConstructor(db) { - return makeClassConstructor(WhereClause.prototype, function WhereClause(table, index, orCollection) { - this.db = db; - this._ctx = { - table: table, - index: index === ":id" ? null : index, - or: orCollection - }; - this._cmp = this._ascending = cmp; - this._descending = function (a, b) { return cmp(b, a); }; - this._max = function (a, b) { return cmp(a, b) > 0 ? a : b; }; - this._min = function (a, b) { return cmp(a, b) < 0 ? a : b; }; - this._IDBKeyRange = db._deps.IDBKeyRange; - if (!this._IDBKeyRange) - throw new exceptions.MissingAPI(); - }); - } - - function eventRejectHandler(reject) { - return wrap(function (event) { - preventDefault(event); - reject(event.target.error); - return false; - }); - } - function preventDefault(event) { - if (event.stopPropagation) - event.stopPropagation(); - if (event.preventDefault) - event.preventDefault(); - } - - var DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated'; - var STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1'; - var globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME); - - var Transaction = (function () { - function Transaction() { - } - Transaction.prototype._lock = function () { - assert(!PSD.global); - ++this._reculock; - if (this._reculock === 1 && !PSD.global) - PSD.lockOwnerFor = this; - return this; - }; - Transaction.prototype._unlock = function () { - assert(!PSD.global); - if (--this._reculock === 0) { - if (!PSD.global) - PSD.lockOwnerFor = null; - while (this._blockedFuncs.length > 0 && !this._locked()) { - var fnAndPSD = this._blockedFuncs.shift(); - try { - usePSD(fnAndPSD[1], fnAndPSD[0]); - } - catch (e) { } - } - } - return this; - }; - Transaction.prototype._locked = function () { - return this._reculock && PSD.lockOwnerFor !== this; - }; - Transaction.prototype.create = function (idbtrans) { - var _this = this; - if (!this.mode) - return this; - var idbdb = this.db.idbdb; - var dbOpenError = this.db._state.dbOpenError; - assert(!this.idbtrans); - if (!idbtrans && !idbdb) { - switch (dbOpenError && dbOpenError.name) { - case "DatabaseClosedError": - throw new exceptions.DatabaseClosed(dbOpenError); - case "MissingAPIError": - throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError); - default: - throw new exceptions.OpenFailed(dbOpenError); - } - } - if (!this.active) - throw new exceptions.TransactionInactive(); - assert(this._completion._state === null); - idbtrans = this.idbtrans = idbtrans || - (this.db.core - ? this.db.core.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability }) - : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })); - idbtrans.onerror = wrap(function (ev) { - preventDefault(ev); - _this._reject(idbtrans.error); - }); - idbtrans.onabort = wrap(function (ev) { - preventDefault(ev); - _this.active && _this._reject(new exceptions.Abort(idbtrans.error)); - _this.active = false; - _this.on("abort").fire(ev); - }); - idbtrans.oncomplete = wrap(function () { - _this.active = false; - _this._resolve(); - if ('mutatedParts' in idbtrans) { - globalEvents.storagemutated.fire(idbtrans["mutatedParts"]); - } - }); - return this; - }; - Transaction.prototype._promise = function (mode, fn, bWriteLock) { - var _this = this; - if (mode === 'readwrite' && this.mode !== 'readwrite') - return rejection(new exceptions.ReadOnly("Transaction is readonly")); - if (!this.active) - return rejection(new exceptions.TransactionInactive()); - if (this._locked()) { - return new DexiePromise(function (resolve, reject) { - _this._blockedFuncs.push([function () { - _this._promise(mode, fn, bWriteLock).then(resolve, reject); - }, PSD]); - }); - } - else if (bWriteLock) { - return newScope(function () { - var p = new DexiePromise(function (resolve, reject) { - _this._lock(); - var rv = fn(resolve, reject, _this); - if (rv && rv.then) - rv.then(resolve, reject); - }); - p.finally(function () { return _this._unlock(); }); - p._lib = true; - return p; - }); - } - else { - var p = new DexiePromise(function (resolve, reject) { - var rv = fn(resolve, reject, _this); - if (rv && rv.then) - rv.then(resolve, reject); - }); - p._lib = true; - return p; - } - }; - Transaction.prototype._root = function () { - return this.parent ? this.parent._root() : this; - }; - Transaction.prototype.waitFor = function (promiseLike) { - var root = this._root(); - var promise = DexiePromise.resolve(promiseLike); - if (root._waitingFor) { - root._waitingFor = root._waitingFor.then(function () { return promise; }); - } - else { - root._waitingFor = promise; - root._waitingQueue = []; - var store = root.idbtrans.objectStore(root.storeNames[0]); - (function spin() { - ++root._spinCount; - while (root._waitingQueue.length) - (root._waitingQueue.shift())(); - if (root._waitingFor) - store.get(-Infinity).onsuccess = spin; - }()); - } - var currentWaitPromise = root._waitingFor; - return new DexiePromise(function (resolve, reject) { - promise.then(function (res) { return root._waitingQueue.push(wrap(resolve.bind(null, res))); }, function (err) { return root._waitingQueue.push(wrap(reject.bind(null, err))); }).finally(function () { - if (root._waitingFor === currentWaitPromise) { - root._waitingFor = null; - } - }); - }); - }; - Transaction.prototype.abort = function () { - if (this.active) { - this.active = false; - if (this.idbtrans) - this.idbtrans.abort(); - this._reject(new exceptions.Abort()); - } - }; - Transaction.prototype.table = function (tableName) { - var memoizedTables = (this._memoizedTables || (this._memoizedTables = {})); - if (hasOwn(memoizedTables, tableName)) - return memoizedTables[tableName]; - var tableSchema = this.schema[tableName]; - if (!tableSchema) { - throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); - } - var transactionBoundTable = new this.db.Table(tableName, tableSchema, this); - transactionBoundTable.core = this.db.core.table(tableName); - memoizedTables[tableName] = transactionBoundTable; - return transactionBoundTable; - }; - return Transaction; - }()); - - function createTransactionConstructor(db) { - return makeClassConstructor(Transaction.prototype, function Transaction(mode, storeNames, dbschema, chromeTransactionDurability, parent) { - var _this = this; - this.db = db; - this.mode = mode; - this.storeNames = storeNames; - this.schema = dbschema; - this.chromeTransactionDurability = chromeTransactionDurability; - this.idbtrans = null; - this.on = Events(this, "complete", "error", "abort"); - this.parent = parent || null; - this.active = true; - this._reculock = 0; - this._blockedFuncs = []; - this._resolve = null; - this._reject = null; - this._waitingFor = null; - this._waitingQueue = null; - this._spinCount = 0; - this._completion = new DexiePromise(function (resolve, reject) { - _this._resolve = resolve; - _this._reject = reject; - }); - this._completion.then(function () { - _this.active = false; - _this.on.complete.fire(); - }, function (e) { - var wasActive = _this.active; - _this.active = false; - _this.on.error.fire(e); - _this.parent ? - _this.parent._reject(e) : - wasActive && _this.idbtrans && _this.idbtrans.abort(); - return rejection(e); - }); - }); - } - - function createIndexSpec(name, keyPath, unique, multi, auto, compound, isPrimKey) { - return { - name: name, - keyPath: keyPath, - unique: unique, - multi: multi, - auto: auto, - compound: compound, - src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? "++" : "") + nameFromKeyPath(keyPath) - }; - } - function nameFromKeyPath(keyPath) { - return typeof keyPath === 'string' ? - keyPath : - keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : ""; - } - - function createTableSchema(name, primKey, indexes) { - return { - name: name, - primKey: primKey, - indexes: indexes, - mappedClass: null, - idxByName: arrayToObject(indexes, function (index) { return [index.name, index]; }) - }; - } - - function safariMultiStoreFix(storeNames) { - return storeNames.length === 1 ? storeNames[0] : storeNames; - } - var getMaxKey = function (IdbKeyRange) { - try { - IdbKeyRange.only([[]]); - getMaxKey = function () { return [[]]; }; - return [[]]; - } - catch (e) { - getMaxKey = function () { return maxString; }; - return maxString; - } - }; - - function getKeyExtractor(keyPath) { - if (keyPath == null) { - return function () { return undefined; }; - } - else if (typeof keyPath === 'string') { - return getSinglePathKeyExtractor(keyPath); - } - else { - return function (obj) { return getByKeyPath(obj, keyPath); }; - } - } - function getSinglePathKeyExtractor(keyPath) { - var split = keyPath.split('.'); - if (split.length === 1) { - return function (obj) { return obj[keyPath]; }; - } - else { - return function (obj) { return getByKeyPath(obj, keyPath); }; - } - } - - function arrayify(arrayLike) { - return [].slice.call(arrayLike); - } - var _id_counter = 0; - function getKeyPathAlias(keyPath) { - return keyPath == null ? - ":id" : - typeof keyPath === 'string' ? - keyPath : - "[".concat(keyPath.join('+'), "]"); - } - function createDBCore(db, IdbKeyRange, tmpTrans) { - function extractSchema(db, trans) { - var tables = arrayify(db.objectStoreNames); - return { - schema: { - name: db.name, - tables: tables.map(function (table) { return trans.objectStore(table); }).map(function (store) { - var keyPath = store.keyPath, autoIncrement = store.autoIncrement; - var compound = isArray(keyPath); - var outbound = keyPath == null; - var indexByKeyPath = {}; - var result = { - name: store.name, - primaryKey: { - name: null, - isPrimaryKey: true, - outbound: outbound, - compound: compound, - keyPath: keyPath, - autoIncrement: autoIncrement, - unique: true, - extractKey: getKeyExtractor(keyPath) - }, - indexes: arrayify(store.indexNames).map(function (indexName) { return store.index(indexName); }) - .map(function (index) { - var name = index.name, unique = index.unique, multiEntry = index.multiEntry, keyPath = index.keyPath; - var compound = isArray(keyPath); - var result = { - name: name, - compound: compound, - keyPath: keyPath, - unique: unique, - multiEntry: multiEntry, - extractKey: getKeyExtractor(keyPath) - }; - indexByKeyPath[getKeyPathAlias(keyPath)] = result; - return result; - }), - getIndexByKeyPath: function (keyPath) { return indexByKeyPath[getKeyPathAlias(keyPath)]; } - }; - indexByKeyPath[":id"] = result.primaryKey; - if (keyPath != null) { - indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey; - } - return result; - }) - }, - hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) && - !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && - !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && - [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) - }; - } - function makeIDBKeyRange(range) { - if (range.type === 3 ) - return null; - if (range.type === 4 ) - throw new Error("Cannot convert never type to IDBKeyRange"); - var lower = range.lower, upper = range.upper, lowerOpen = range.lowerOpen, upperOpen = range.upperOpen; - var idbRange = lower === undefined ? - upper === undefined ? - null : - IdbKeyRange.upperBound(upper, !!upperOpen) : - upper === undefined ? - IdbKeyRange.lowerBound(lower, !!lowerOpen) : - IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen); - return idbRange; - } - function createDbCoreTable(tableSchema) { - var tableName = tableSchema.name; - function mutate(_a) { - var trans = _a.trans, type = _a.type, keys = _a.keys, values = _a.values, range = _a.range; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var store = trans.objectStore(tableName); - var outbound = store.keyPath == null; - var isAddOrPut = type === "put" || type === "add"; - if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange') - throw new Error("Invalid operation type: " + type); - var length = (keys || values || { length: 1 }).length; - if (keys && values && keys.length !== values.length) { - throw new Error("Given keys array must have same length as given values array."); - } - if (length === 0) - return resolve({ numFailures: 0, failures: {}, results: [], lastResult: undefined }); - var req; - var reqs = []; - var failures = []; - var numFailures = 0; - var errorHandler = function (event) { - ++numFailures; - preventDefault(event); - }; - if (type === 'deleteRange') { - if (range.type === 4 ) - return resolve({ numFailures: numFailures, failures: failures, results: [], lastResult: undefined }); - if (range.type === 3 ) - reqs.push(req = store.clear()); - else - reqs.push(req = store.delete(makeIDBKeyRange(range))); - } - else { - var _a = isAddOrPut ? - outbound ? - [values, keys] : - [values, null] : - [keys, null], args1 = _a[0], args2 = _a[1]; - if (isAddOrPut) { - for (var i = 0; i < length; ++i) { - reqs.push(req = (args2 && args2[i] !== undefined ? - store[type](args1[i], args2[i]) : - store[type](args1[i]))); - req.onerror = errorHandler; - } - } - else { - for (var i = 0; i < length; ++i) { - reqs.push(req = store[type](args1[i])); - req.onerror = errorHandler; - } - } - } - var done = function (event) { - var lastResult = event.target.result; - reqs.forEach(function (req, i) { return req.error != null && (failures[i] = req.error); }); - resolve({ - numFailures: numFailures, - failures: failures, - results: type === "delete" ? keys : reqs.map(function (req) { return req.result; }), - lastResult: lastResult - }); - }; - req.onerror = function (event) { - errorHandler(event); - done(event); - }; - req.onsuccess = done; - }); - } - function openCursor(_a) { - var trans = _a.trans, values = _a.values, query = _a.query, reverse = _a.reverse, unique = _a.unique; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var index = query.index, range = query.range; - var store = trans.objectStore(tableName); - var source = index.isPrimaryKey ? - store : - store.index(index.name); - var direction = reverse ? - unique ? - "prevunique" : - "prev" : - unique ? - "nextunique" : - "next"; - var req = values || !('openKeyCursor' in source) ? - source.openCursor(makeIDBKeyRange(range), direction) : - source.openKeyCursor(makeIDBKeyRange(range), direction); - req.onerror = eventRejectHandler(reject); - req.onsuccess = wrap(function (ev) { - var cursor = req.result; - if (!cursor) { - resolve(null); - return; - } - cursor.___id = ++_id_counter; - cursor.done = false; - var _cursorContinue = cursor.continue.bind(cursor); - var _cursorContinuePrimaryKey = cursor.continuePrimaryKey; - if (_cursorContinuePrimaryKey) - _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor); - var _cursorAdvance = cursor.advance.bind(cursor); - var doThrowCursorIsNotStarted = function () { throw new Error("Cursor not started"); }; - var doThrowCursorIsStopped = function () { throw new Error("Cursor not stopped"); }; - cursor.trans = trans; - cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted; - cursor.fail = wrap(reject); - cursor.next = function () { - var _this = this; - var gotOne = 1; - return this.start(function () { return gotOne-- ? _this.continue() : _this.stop(); }).then(function () { return _this; }); - }; - cursor.start = function (callback) { - var iterationPromise = new Promise(function (resolveIteration, rejectIteration) { - resolveIteration = wrap(resolveIteration); - req.onerror = eventRejectHandler(rejectIteration); - cursor.fail = rejectIteration; - cursor.stop = function (value) { - cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped; - resolveIteration(value); - }; - }); - var guardedCallback = function () { - if (req.result) { - try { - callback(); - } - catch (err) { - cursor.fail(err); - } - } - else { - cursor.done = true; - cursor.start = function () { throw new Error("Cursor behind last entry"); }; - cursor.stop(); - } - }; - req.onsuccess = wrap(function (ev) { - req.onsuccess = guardedCallback; - guardedCallback(); - }); - cursor.continue = _cursorContinue; - cursor.continuePrimaryKey = _cursorContinuePrimaryKey; - cursor.advance = _cursorAdvance; - guardedCallback(); - return iterationPromise; - }; - resolve(cursor); - }, reject); - }); - } - function query(hasGetAll) { - return function (request) { - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var trans = request.trans, values = request.values, limit = request.limit, query = request.query; - var nonInfinitLimit = limit === Infinity ? undefined : limit; - var index = query.index, range = query.range; - var store = trans.objectStore(tableName); - var source = index.isPrimaryKey ? store : store.index(index.name); - var idbKeyRange = makeIDBKeyRange(range); - if (limit === 0) - return resolve({ result: [] }); - if (hasGetAll) { - var req = values ? - source.getAll(idbKeyRange, nonInfinitLimit) : - source.getAllKeys(idbKeyRange, nonInfinitLimit); - req.onsuccess = function (event) { return resolve({ result: event.target.result }); }; - req.onerror = eventRejectHandler(reject); - } - else { - var count_1 = 0; - var req_1 = values || !('openKeyCursor' in source) ? - source.openCursor(idbKeyRange) : - source.openKeyCursor(idbKeyRange); - var result_1 = []; - req_1.onsuccess = function (event) { - var cursor = req_1.result; - if (!cursor) - return resolve({ result: result_1 }); - result_1.push(values ? cursor.value : cursor.primaryKey); - if (++count_1 === limit) - return resolve({ result: result_1 }); - cursor.continue(); - }; - req_1.onerror = eventRejectHandler(reject); - } - }); - }; - } - return { - name: tableName, - schema: tableSchema, - mutate: mutate, - getMany: function (_a) { - var trans = _a.trans, keys = _a.keys; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var store = trans.objectStore(tableName); - var length = keys.length; - var result = new Array(length); - var keyCount = 0; - var callbackCount = 0; - var req; - var successHandler = function (event) { - var req = event.target; - if ((result[req._pos] = req.result) != null) - ; - if (++callbackCount === keyCount) - resolve(result); - }; - var errorHandler = eventRejectHandler(reject); - for (var i = 0; i < length; ++i) { - var key = keys[i]; - if (key != null) { - req = store.get(keys[i]); - req._pos = i; - req.onsuccess = successHandler; - req.onerror = errorHandler; - ++keyCount; - } - } - if (keyCount === 0) - resolve(result); - }); - }, - get: function (_a) { - var trans = _a.trans, key = _a.key; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var store = trans.objectStore(tableName); - var req = store.get(key); - req.onsuccess = function (event) { return resolve(event.target.result); }; - req.onerror = eventRejectHandler(reject); - }); - }, - query: query(hasGetAll), - openCursor: openCursor, - count: function (_a) { - var query = _a.query, trans = _a.trans; - var index = query.index, range = query.range; - return new Promise(function (resolve, reject) { - var store = trans.objectStore(tableName); - var source = index.isPrimaryKey ? store : store.index(index.name); - var idbKeyRange = makeIDBKeyRange(range); - var req = idbKeyRange ? source.count(idbKeyRange) : source.count(); - req.onsuccess = wrap(function (ev) { return resolve(ev.target.result); }); - req.onerror = eventRejectHandler(reject); - }); - } - }; - } - var _a = extractSchema(db, tmpTrans), schema = _a.schema, hasGetAll = _a.hasGetAll; - var tables = schema.tables.map(function (tableSchema) { return createDbCoreTable(tableSchema); }); - var tableMap = {}; - tables.forEach(function (table) { return tableMap[table.name] = table; }); - return { - stack: "dbcore", - transaction: db.transaction.bind(db), - table: function (name) { - var result = tableMap[name]; - if (!result) - throw new Error("Table '".concat(name, "' not found")); - return tableMap[name]; - }, - MIN_KEY: -Infinity, - MAX_KEY: getMaxKey(IdbKeyRange), - schema: schema - }; - } - - function createMiddlewareStack(stackImpl, middlewares) { - return middlewares.reduce(function (down, _a) { - var create = _a.create; - return (__assign(__assign({}, down), create(down))); - }, stackImpl); - } - function createMiddlewareStacks(middlewares, idbdb, _a, tmpTrans) { - var IDBKeyRange = _a.IDBKeyRange; _a.indexedDB; - var dbcore = createMiddlewareStack(createDBCore(idbdb, IDBKeyRange, tmpTrans), middlewares.dbcore); - return { - dbcore: dbcore - }; - } - function generateMiddlewareStacks(db, tmpTrans) { - var idbdb = tmpTrans.db; - var stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans); - db.core = stacks.dbcore; - db.tables.forEach(function (table) { - var tableName = table.name; - if (db.core.schema.tables.some(function (tbl) { return tbl.name === tableName; })) { - table.core = db.core.table(tableName); - if (db[tableName] instanceof db.Table) { - db[tableName].core = table.core; - } - } - }); - } - - function setApiOnPlace(db, objs, tableNames, dbschema) { - tableNames.forEach(function (tableName) { - var schema = dbschema[tableName]; - objs.forEach(function (obj) { - var propDesc = getPropertyDescriptor(obj, tableName); - if (!propDesc || ("value" in propDesc && propDesc.value === undefined)) { - if (obj === db.Transaction.prototype || obj instanceof db.Transaction) { - setProp(obj, tableName, { - get: function () { return this.table(tableName); }, - set: function (value) { - defineProperty(this, tableName, { value: value, writable: true, configurable: true, enumerable: true }); - } - }); - } - else { - obj[tableName] = new db.Table(tableName, schema); - } - } - }); - }); - } - function removeTablesApi(db, objs) { - objs.forEach(function (obj) { - for (var key in obj) { - if (obj[key] instanceof db.Table) - delete obj[key]; - } - }); - } - function lowerVersionFirst(a, b) { - return a._cfg.version - b._cfg.version; - } - function runUpgraders(db, oldVersion, idbUpgradeTrans, reject) { - var globalSchema = db._dbSchema; - if (idbUpgradeTrans.objectStoreNames.contains('$meta') && !globalSchema.$meta) { - globalSchema.$meta = createTableSchema("$meta", parseIndexSyntax("")[0], []); - db._storeNames.push('$meta'); - } - var trans = db._createTransaction('readwrite', db._storeNames, globalSchema); - trans.create(idbUpgradeTrans); - trans._completion.catch(reject); - var rejectTransaction = trans._reject.bind(trans); - var transless = PSD.transless || PSD; - newScope(function () { - PSD.trans = trans; - PSD.transless = transless; - if (oldVersion === 0) { - keys(globalSchema).forEach(function (tableName) { - createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes); - }); - generateMiddlewareStacks(db, idbUpgradeTrans); - DexiePromise.follow(function () { return db.on.populate.fire(trans); }).catch(rejectTransaction); - } - else { - generateMiddlewareStacks(db, idbUpgradeTrans); - return getExistingVersion(db, trans, oldVersion) - .then(function (oldVersion) { return updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans); }) - .catch(rejectTransaction); - } - }); - } - function patchCurrentVersion(db, idbUpgradeTrans) { - createMissingTables(db._dbSchema, idbUpgradeTrans); - if (idbUpgradeTrans.db.version % 10 === 0 && !idbUpgradeTrans.objectStoreNames.contains('$meta')) { - idbUpgradeTrans.db.createObjectStore('$meta').add(Math.ceil((idbUpgradeTrans.db.version / 10) - 1), 'version'); - } - var globalSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); - adjustToExistingIndexNames(db, db._dbSchema, idbUpgradeTrans); - var diff = getSchemaDiff(globalSchema, db._dbSchema); - var _loop_1 = function (tableChange) { - if (tableChange.change.length || tableChange.recreate) { - console.warn("Unable to patch indexes of table ".concat(tableChange.name, " because it has changes on the type of index or primary key.")); - return { value: void 0 }; - } - var store = idbUpgradeTrans.objectStore(tableChange.name); - tableChange.add.forEach(function (idx) { - if (debug) - console.debug("Dexie upgrade patch: Creating missing index ".concat(tableChange.name, ".").concat(idx.src)); - addIndex(store, idx); - }); - }; - for (var _i = 0, _a = diff.change; _i < _a.length; _i++) { - var tableChange = _a[_i]; - var state_1 = _loop_1(tableChange); - if (typeof state_1 === "object") - return state_1.value; - } - } - function getExistingVersion(db, trans, oldVersion) { - if (trans.storeNames.includes('$meta')) { - return trans.table('$meta').get('version').then(function (metaVersion) { - return metaVersion != null ? metaVersion : oldVersion; - }); - } - else { - return DexiePromise.resolve(oldVersion); - } - } - function updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans) { - var queue = []; - var versions = db._versions; - var globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); - var versToRun = versions.filter(function (v) { return v._cfg.version >= oldVersion; }); - if (versToRun.length === 0) { - return DexiePromise.resolve(); - } - versToRun.forEach(function (version) { - queue.push(function () { - var oldSchema = globalSchema; - var newSchema = version._cfg.dbschema; - adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans); - adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans); - globalSchema = db._dbSchema = newSchema; - var diff = getSchemaDiff(oldSchema, newSchema); - diff.add.forEach(function (tuple) { - createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes); - }); - diff.change.forEach(function (change) { - if (change.recreate) { - throw new exceptions.Upgrade("Not yet support for changing primary key"); - } - else { - var store_1 = idbUpgradeTrans.objectStore(change.name); - change.add.forEach(function (idx) { return addIndex(store_1, idx); }); - change.change.forEach(function (idx) { - store_1.deleteIndex(idx.name); - addIndex(store_1, idx); - }); - change.del.forEach(function (idxName) { return store_1.deleteIndex(idxName); }); - } - }); - var contentUpgrade = version._cfg.contentUpgrade; - if (contentUpgrade && version._cfg.version > oldVersion) { - generateMiddlewareStacks(db, idbUpgradeTrans); - trans._memoizedTables = {}; - var upgradeSchema_1 = shallowClone(newSchema); - diff.del.forEach(function (table) { - upgradeSchema_1[table] = oldSchema[table]; - }); - removeTablesApi(db, [db.Transaction.prototype]); - setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema_1), upgradeSchema_1); - trans.schema = upgradeSchema_1; - var contentUpgradeIsAsync_1 = isAsyncFunction(contentUpgrade); - if (contentUpgradeIsAsync_1) { - incrementExpectedAwaits(); - } - var returnValue_1; - var promiseFollowed = DexiePromise.follow(function () { - returnValue_1 = contentUpgrade(trans); - if (returnValue_1) { - if (contentUpgradeIsAsync_1) { - var decrementor = decrementExpectedAwaits.bind(null, null); - returnValue_1.then(decrementor, decrementor); - } - } - }); - return (returnValue_1 && typeof returnValue_1.then === 'function' ? - DexiePromise.resolve(returnValue_1) : promiseFollowed.then(function () { return returnValue_1; })); - } - }); - queue.push(function (idbtrans) { - var newSchema = version._cfg.dbschema; - deleteRemovedTables(newSchema, idbtrans); - removeTablesApi(db, [db.Transaction.prototype]); - setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema); - trans.schema = db._dbSchema; - }); - queue.push(function (idbtrans) { - if (db.idbdb.objectStoreNames.contains('$meta')) { - if (Math.ceil(db.idbdb.version / 10) === version._cfg.version) { - db.idbdb.deleteObjectStore('$meta'); - delete db._dbSchema.$meta; - db._storeNames = db._storeNames.filter(function (name) { return name !== '$meta'; }); - } - else { - idbtrans.objectStore('$meta').put(version._cfg.version, 'version'); - } - } - }); - }); - function runQueue() { - return queue.length ? DexiePromise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) : - DexiePromise.resolve(); - } - return runQueue().then(function () { - createMissingTables(globalSchema, idbUpgradeTrans); - }); - } - function getSchemaDiff(oldSchema, newSchema) { - var diff = { - del: [], - add: [], - change: [] - }; - var table; - for (table in oldSchema) { - if (!newSchema[table]) - diff.del.push(table); - } - for (table in newSchema) { - var oldDef = oldSchema[table], newDef = newSchema[table]; - if (!oldDef) { - diff.add.push([table, newDef]); - } - else { - var change = { - name: table, - def: newDef, - recreate: false, - del: [], - add: [], - change: [] - }; - if (( - '' + (oldDef.primKey.keyPath || '')) !== ('' + (newDef.primKey.keyPath || '')) || - (oldDef.primKey.auto !== newDef.primKey.auto)) { - change.recreate = true; - diff.change.push(change); - } - else { - var oldIndexes = oldDef.idxByName; - var newIndexes = newDef.idxByName; - var idxName = void 0; - for (idxName in oldIndexes) { - if (!newIndexes[idxName]) - change.del.push(idxName); - } - for (idxName in newIndexes) { - var oldIdx = oldIndexes[idxName], newIdx = newIndexes[idxName]; - if (!oldIdx) - change.add.push(newIdx); - else if (oldIdx.src !== newIdx.src) - change.change.push(newIdx); - } - if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) { - diff.change.push(change); - } - } - } - } - return diff; - } - function createTable(idbtrans, tableName, primKey, indexes) { - var store = idbtrans.db.createObjectStore(tableName, primKey.keyPath ? - { keyPath: primKey.keyPath, autoIncrement: primKey.auto } : - { autoIncrement: primKey.auto }); - indexes.forEach(function (idx) { return addIndex(store, idx); }); - return store; - } - function createMissingTables(newSchema, idbtrans) { - keys(newSchema).forEach(function (tableName) { - if (!idbtrans.db.objectStoreNames.contains(tableName)) { - if (debug) - console.debug('Dexie: Creating missing table', tableName); - createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes); - } - }); - } - function deleteRemovedTables(newSchema, idbtrans) { - [].slice.call(idbtrans.db.objectStoreNames).forEach(function (storeName) { - return newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName); - }); - } - function addIndex(store, idx) { - store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi }); - } - function buildGlobalSchema(db, idbdb, tmpTrans) { - var globalSchema = {}; - var dbStoreNames = slice(idbdb.objectStoreNames, 0); - dbStoreNames.forEach(function (storeName) { - var store = tmpTrans.objectStore(storeName); - var keyPath = store.keyPath; - var primKey = createIndexSpec(nameFromKeyPath(keyPath), keyPath || "", true, false, !!store.autoIncrement, keyPath && typeof keyPath !== "string", true); - var indexes = []; - for (var j = 0; j < store.indexNames.length; ++j) { - var idbindex = store.index(store.indexNames[j]); - keyPath = idbindex.keyPath; - var index = createIndexSpec(idbindex.name, keyPath, !!idbindex.unique, !!idbindex.multiEntry, false, keyPath && typeof keyPath !== "string", false); - indexes.push(index); - } - globalSchema[storeName] = createTableSchema(storeName, primKey, indexes); - }); - return globalSchema; - } - function readGlobalSchema(db, idbdb, tmpTrans) { - db.verno = idbdb.version / 10; - var globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans); - db._storeNames = slice(idbdb.objectStoreNames, 0); - setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema); - } - function verifyInstalledSchema(db, tmpTrans) { - var installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans); - var diff = getSchemaDiff(installedSchema, db._dbSchema); - return !(diff.add.length || diff.change.some(function (ch) { return ch.add.length || ch.change.length; })); - } - function adjustToExistingIndexNames(db, schema, idbtrans) { - var storeNames = idbtrans.db.objectStoreNames; - for (var i = 0; i < storeNames.length; ++i) { - var storeName = storeNames[i]; - var store = idbtrans.objectStore(storeName); - db._hasGetAll = 'getAll' in store; - for (var j = 0; j < store.indexNames.length; ++j) { - var indexName = store.indexNames[j]; - var keyPath = store.index(indexName).keyPath; - var dexieName = typeof keyPath === 'string' ? keyPath : "[" + slice(keyPath).join('+') + "]"; - if (schema[storeName]) { - var indexSpec = schema[storeName].idxByName[dexieName]; - if (indexSpec) { - indexSpec.name = indexName; - delete schema[storeName].idxByName[dexieName]; - schema[storeName].idxByName[indexName] = indexSpec; - } - } - } - } - if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && - !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && - _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope && - [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) { - db._hasGetAll = false; - } - } - function parseIndexSyntax(primKeyAndIndexes) { - return primKeyAndIndexes.split(',').map(function (index, indexNum) { - index = index.trim(); - var name = index.replace(/([&*]|\+\+)/g, ""); - var keyPath = /^\[/.test(name) ? name.match(/^\[(.*)\]$/)[1].split('+') : name; - return createIndexSpec(name, keyPath || null, /\&/.test(index), /\*/.test(index), /\+\+/.test(index), isArray(keyPath), indexNum === 0); - }); - } - - var Version = (function () { - function Version() { - } - Version.prototype._parseStoresSpec = function (stores, outSchema) { - keys(stores).forEach(function (tableName) { - if (stores[tableName] !== null) { - var indexes = parseIndexSyntax(stores[tableName]); - var primKey = indexes.shift(); - primKey.unique = true; - if (primKey.multi) - throw new exceptions.Schema("Primary key cannot be multi-valued"); - indexes.forEach(function (idx) { - if (idx.auto) - throw new exceptions.Schema("Only primary key can be marked as autoIncrement (++)"); - if (!idx.keyPath) - throw new exceptions.Schema("Index must have a name and cannot be an empty string"); - }); - outSchema[tableName] = createTableSchema(tableName, primKey, indexes); - } - }); - }; - Version.prototype.stores = function (stores) { - var db = this.db; - this._cfg.storesSource = this._cfg.storesSource ? - extend(this._cfg.storesSource, stores) : - stores; - var versions = db._versions; - var storesSpec = {}; - var dbschema = {}; - versions.forEach(function (version) { - extend(storesSpec, version._cfg.storesSource); - dbschema = (version._cfg.dbschema = {}); - version._parseStoresSpec(storesSpec, dbschema); - }); - db._dbSchema = dbschema; - removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]); - setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema); - db._storeNames = keys(dbschema); - return this; - }; - Version.prototype.upgrade = function (upgradeFunction) { - this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction); - return this; - }; - return Version; - }()); - - function createVersionConstructor(db) { - return makeClassConstructor(Version.prototype, function Version(versionNumber) { - this.db = db; - this._cfg = { - version: versionNumber, - storesSource: null, - dbschema: {}, - tables: {}, - contentUpgrade: null - }; - }); - } - - function getDbNamesTable(indexedDB, IDBKeyRange) { - var dbNamesDB = indexedDB["_dbNamesDB"]; - if (!dbNamesDB) { - dbNamesDB = indexedDB["_dbNamesDB"] = new Dexie$1(DBNAMES_DB, { - addons: [], - indexedDB: indexedDB, - IDBKeyRange: IDBKeyRange, - }); - dbNamesDB.version(1).stores({ dbnames: "name" }); - } - return dbNamesDB.table("dbnames"); - } - function hasDatabasesNative(indexedDB) { - return indexedDB && typeof indexedDB.databases === "function"; - } - function getDatabaseNames(_a) { - var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; - return hasDatabasesNative(indexedDB) - ? Promise.resolve(indexedDB.databases()).then(function (infos) { - return infos - .map(function (info) { return info.name; }) - .filter(function (name) { return name !== DBNAMES_DB; }); - }) - : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys(); - } - function _onDatabaseCreated(_a, name) { - var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; - !hasDatabasesNative(indexedDB) && - name !== DBNAMES_DB && - getDbNamesTable(indexedDB, IDBKeyRange).put({ name: name }).catch(nop); - } - function _onDatabaseDeleted(_a, name) { - var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; - !hasDatabasesNative(indexedDB) && - name !== DBNAMES_DB && - getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop); - } - - function vip(fn) { - return newScope(function () { - PSD.letThrough = true; - return fn(); - }); - } - - function idbReady() { - var isSafari = !navigator.userAgentData && - /Safari\//.test(navigator.userAgent) && - !/Chrom(e|ium)\//.test(navigator.userAgent); - if (!isSafari || !indexedDB.databases) - return Promise.resolve(); - var intervalId; - return new Promise(function (resolve) { - var tryIdb = function () { return indexedDB.databases().finally(resolve); }; - intervalId = setInterval(tryIdb, 100); - tryIdb(); - }).finally(function () { return clearInterval(intervalId); }); - } - - var _a; - function isEmptyRange(node) { - return !("from" in node); - } - var RangeSet = function (fromOrTree, to) { - if (this) { - extend(this, arguments.length ? { d: 1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree } : { d: 0 }); - } - else { - var rv = new RangeSet(); - if (fromOrTree && ("d" in fromOrTree)) { - extend(rv, fromOrTree); - } - return rv; - } - }; - props(RangeSet.prototype, (_a = { - add: function (rangeSet) { - mergeRanges(this, rangeSet); - return this; - }, - addKey: function (key) { - addRange(this, key, key); - return this; - }, - addKeys: function (keys) { - var _this = this; - keys.forEach(function (key) { return addRange(_this, key, key); }); - return this; - } - }, - _a[iteratorSymbol] = function () { - return getRangeSetIterator(this); - }, - _a)); - function addRange(target, from, to) { - var diff = cmp(from, to); - if (isNaN(diff)) - return; - if (diff > 0) - throw RangeError(); - if (isEmptyRange(target)) - return extend(target, { from: from, to: to, d: 1 }); - var left = target.l; - var right = target.r; - if (cmp(to, target.from) < 0) { - left - ? addRange(left, from, to) - : (target.l = { from: from, to: to, d: 1, l: null, r: null }); - return rebalance(target); - } - if (cmp(from, target.to) > 0) { - right - ? addRange(right, from, to) - : (target.r = { from: from, to: to, d: 1, l: null, r: null }); - return rebalance(target); - } - if (cmp(from, target.from) < 0) { - target.from = from; - target.l = null; - target.d = right ? right.d + 1 : 1; - } - if (cmp(to, target.to) > 0) { - target.to = to; - target.r = null; - target.d = target.l ? target.l.d + 1 : 1; - } - var rightWasCutOff = !target.r; - if (left && !target.l) { - mergeRanges(target, left); - } - if (right && rightWasCutOff) { - mergeRanges(target, right); - } - } - function mergeRanges(target, newSet) { - function _addRangeSet(target, _a) { - var from = _a.from, to = _a.to, l = _a.l, r = _a.r; - addRange(target, from, to); - if (l) - _addRangeSet(target, l); - if (r) - _addRangeSet(target, r); - } - if (!isEmptyRange(newSet)) - _addRangeSet(target, newSet); - } - function rangesOverlap(rangeSet1, rangeSet2) { - var i1 = getRangeSetIterator(rangeSet2); - var nextResult1 = i1.next(); - if (nextResult1.done) - return false; - var a = nextResult1.value; - var i2 = getRangeSetIterator(rangeSet1); - var nextResult2 = i2.next(a.from); - var b = nextResult2.value; - while (!nextResult1.done && !nextResult2.done) { - if (cmp(b.from, a.to) <= 0 && cmp(b.to, a.from) >= 0) - return true; - cmp(a.from, b.from) < 0 - ? (a = (nextResult1 = i1.next(b.from)).value) - : (b = (nextResult2 = i2.next(a.from)).value); - } - return false; - } - function getRangeSetIterator(node) { - var state = isEmptyRange(node) ? null : { s: 0, n: node }; - return { - next: function (key) { - var keyProvided = arguments.length > 0; - while (state) { - switch (state.s) { - case 0: - state.s = 1; - if (keyProvided) { - while (state.n.l && cmp(key, state.n.from) < 0) - state = { up: state, n: state.n.l, s: 1 }; - } - else { - while (state.n.l) - state = { up: state, n: state.n.l, s: 1 }; - } - case 1: - state.s = 2; - if (!keyProvided || cmp(key, state.n.to) <= 0) - return { value: state.n, done: false }; - case 2: - if (state.n.r) { - state.s = 3; - state = { up: state, n: state.n.r, s: 0 }; - continue; - } - case 3: - state = state.up; - } - } - return { done: true }; - }, - }; - } - function rebalance(target) { - var _a, _b; - var diff = (((_a = target.r) === null || _a === void 0 ? void 0 : _a.d) || 0) - (((_b = target.l) === null || _b === void 0 ? void 0 : _b.d) || 0); - var r = diff > 1 ? "r" : diff < -1 ? "l" : ""; - if (r) { - var l = r === "r" ? "l" : "r"; - var rootClone = __assign({}, target); - var oldRootRight = target[r]; - target.from = oldRootRight.from; - target.to = oldRootRight.to; - target[r] = oldRootRight[r]; - rootClone[r] = oldRootRight[l]; - target[l] = rootClone; - rootClone.d = computeDepth(rootClone); - } - target.d = computeDepth(target); - } - function computeDepth(_a) { - var r = _a.r, l = _a.l; - return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1; - } - - function extendObservabilitySet(target, newSet) { - keys(newSet).forEach(function (part) { - if (target[part]) - mergeRanges(target[part], newSet[part]); - else - target[part] = cloneSimpleObjectTree(newSet[part]); - }); - return target; - } - - function obsSetsOverlap(os1, os2) { - return os1.all || os2.all || Object.keys(os1).some(function (key) { return os2[key] && rangesOverlap(os2[key], os1[key]); }); - } - - var cache = {}; - - var unsignaledParts = {}; - var isTaskEnqueued = false; - function signalSubscribersLazily(part, optimistic) { - extendObservabilitySet(unsignaledParts, part); - if (!isTaskEnqueued) { - isTaskEnqueued = true; - setTimeout(function () { - isTaskEnqueued = false; - var parts = unsignaledParts; - unsignaledParts = {}; - signalSubscribersNow(parts, false); - }, 0); - } - } - function signalSubscribersNow(updatedParts, deleteAffectedCacheEntries) { - if (deleteAffectedCacheEntries === void 0) { deleteAffectedCacheEntries = false; } - var queriesToSignal = new Set(); - if (updatedParts.all) { - for (var _i = 0, _a = Object.values(cache); _i < _a.length; _i++) { - var tblCache = _a[_i]; - collectTableSubscribers(tblCache, updatedParts, queriesToSignal, deleteAffectedCacheEntries); - } - } - else { - for (var key in updatedParts) { - var parts = /^idb\:\/\/(.*)\/(.*)\//.exec(key); - if (parts) { - var dbName = parts[1], tableName = parts[2]; - var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)]; - if (tblCache) - collectTableSubscribers(tblCache, updatedParts, queriesToSignal, deleteAffectedCacheEntries); - } - } - } - queriesToSignal.forEach(function (requery) { return requery(); }); - } - function collectTableSubscribers(tblCache, updatedParts, outQueriesToSignal, deleteAffectedCacheEntries) { - var updatedEntryLists = []; - for (var _i = 0, _a = Object.entries(tblCache.queries.query); _i < _a.length; _i++) { - var _b = _a[_i], indexName = _b[0], entries = _b[1]; - var filteredEntries = []; - for (var _c = 0, entries_1 = entries; _c < entries_1.length; _c++) { - var entry = entries_1[_c]; - if (obsSetsOverlap(updatedParts, entry.obsSet)) { - entry.subscribers.forEach(function (requery) { return outQueriesToSignal.add(requery); }); - } - else if (deleteAffectedCacheEntries) { - filteredEntries.push(entry); - } - } - if (deleteAffectedCacheEntries) - updatedEntryLists.push([indexName, filteredEntries]); - } - if (deleteAffectedCacheEntries) { - for (var _d = 0, updatedEntryLists_1 = updatedEntryLists; _d < updatedEntryLists_1.length; _d++) { - var _e = updatedEntryLists_1[_d], indexName = _e[0], filteredEntries = _e[1]; - tblCache.queries.query[indexName] = filteredEntries; - } - } - } - - function dexieOpen(db) { - var state = db._state; - var indexedDB = db._deps.indexedDB; - if (state.isBeingOpened || db.idbdb) - return state.dbReadyPromise.then(function () { return state.dbOpenError ? - rejection(state.dbOpenError) : - db; }); - state.isBeingOpened = true; - state.dbOpenError = null; - state.openComplete = false; - var openCanceller = state.openCanceller; - var nativeVerToOpen = Math.round(db.verno * 10); - var schemaPatchMode = false; - function throwIfCancelled() { - if (state.openCanceller !== openCanceller) - throw new exceptions.DatabaseClosed('db.open() was cancelled'); - } - var resolveDbReady = state.dbReadyResolve, - upgradeTransaction = null, wasCreated = false; - var tryOpenDB = function () { return new DexiePromise(function (resolve, reject) { - throwIfCancelled(); - if (!indexedDB) - throw new exceptions.MissingAPI(); - var dbName = db.name; - var req = state.autoSchema || !nativeVerToOpen ? - indexedDB.open(dbName) : - indexedDB.open(dbName, nativeVerToOpen); - if (!req) - throw new exceptions.MissingAPI(); - req.onerror = eventRejectHandler(reject); - req.onblocked = wrap(db._fireOnBlocked); - req.onupgradeneeded = wrap(function (e) { - upgradeTransaction = req.transaction; - if (state.autoSchema && !db._options.allowEmptyDB) { - req.onerror = preventDefault; - upgradeTransaction.abort(); - req.result.close(); - var delreq = indexedDB.deleteDatabase(dbName); - delreq.onsuccess = delreq.onerror = wrap(function () { - reject(new exceptions.NoSuchDatabase("Database ".concat(dbName, " doesnt exist"))); - }); - } - else { - upgradeTransaction.onerror = eventRejectHandler(reject); - var oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; - wasCreated = oldVer < 1; - db.idbdb = req.result; - if (schemaPatchMode) { - patchCurrentVersion(db, upgradeTransaction); - } - runUpgraders(db, oldVer / 10, upgradeTransaction, reject); - } - }, reject); - req.onsuccess = wrap(function () { - upgradeTransaction = null; - var idbdb = db.idbdb = req.result; - var objectStoreNames = slice(idbdb.objectStoreNames); - if (objectStoreNames.length > 0) - try { - var tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly'); - if (state.autoSchema) - readGlobalSchema(db, idbdb, tmpTrans); - else { - adjustToExistingIndexNames(db, db._dbSchema, tmpTrans); - if (!verifyInstalledSchema(db, tmpTrans) && !schemaPatchMode) { - console.warn("Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this."); - idbdb.close(); - nativeVerToOpen = idbdb.version + 1; - schemaPatchMode = true; - return resolve(tryOpenDB()); - } - } - generateMiddlewareStacks(db, tmpTrans); - } - catch (e) { - } - connections.push(db); - idbdb.onversionchange = wrap(function (ev) { - state.vcFired = true; - db.on("versionchange").fire(ev); - }); - idbdb.onclose = wrap(function (ev) { - db.on("close").fire(ev); - }); - if (wasCreated) - _onDatabaseCreated(db._deps, dbName); - resolve(); - }, reject); - }).catch(function (err) { - switch (err === null || err === void 0 ? void 0 : err.name) { - case "UnknownError": - if (state.PR1398_maxLoop > 0) { - state.PR1398_maxLoop--; - console.warn('Dexie: Workaround for Chrome UnknownError on open()'); - return tryOpenDB(); - } - break; - case "VersionError": - if (nativeVerToOpen > 0) { - nativeVerToOpen = 0; - return tryOpenDB(); - } - break; - } - return DexiePromise.reject(err); - }); }; - return DexiePromise.race([ - openCanceller, - (typeof navigator === 'undefined' ? DexiePromise.resolve() : idbReady()).then(tryOpenDB) - ]).then(function () { - throwIfCancelled(); - state.onReadyBeingFired = []; - return DexiePromise.resolve(vip(function () { return db.on.ready.fire(db.vip); })).then(function fireRemainders() { - if (state.onReadyBeingFired.length > 0) { - var remainders_1 = state.onReadyBeingFired.reduce(promisableChain, nop); - state.onReadyBeingFired = []; - return DexiePromise.resolve(vip(function () { return remainders_1(db.vip); })).then(fireRemainders); - } - }); - }).finally(function () { - if (state.openCanceller === openCanceller) { - state.onReadyBeingFired = null; - state.isBeingOpened = false; - } - }).catch(function (err) { - state.dbOpenError = err; - try { - upgradeTransaction && upgradeTransaction.abort(); - } - catch (_a) { } - if (openCanceller === state.openCanceller) { - db._close(); - } - return rejection(err); - }).finally(function () { - state.openComplete = true; - resolveDbReady(); - }).then(function () { - if (wasCreated) { - var everything_1 = {}; - db.tables.forEach(function (table) { - table.schema.indexes.forEach(function (idx) { - if (idx.name) - everything_1["idb://".concat(db.name, "/").concat(table.name, "/").concat(idx.name)] = new RangeSet(-Infinity, [[[]]]); - }); - everything_1["idb://".concat(db.name, "/").concat(table.name, "/")] = everything_1["idb://".concat(db.name, "/").concat(table.name, "/:dels")] = new RangeSet(-Infinity, [[[]]]); - }); - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME).fire(everything_1); - signalSubscribersNow(everything_1, true); - } - return db; - }); - } - - function awaitIterator(iterator) { - var callNext = function (result) { return iterator.next(result); }, doThrow = function (error) { return iterator.throw(error); }, onSuccess = step(callNext), onError = step(doThrow); - function step(getNext) { - return function (val) { - var next = getNext(val), value = next.value; - return next.done ? value : - (!value || typeof value.then !== 'function' ? - isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) : - value.then(onSuccess, onError)); - }; - } - return step(callNext)(); - } - - function extractTransactionArgs(mode, _tableArgs_, scopeFunc) { - var i = arguments.length; - if (i < 2) - throw new exceptions.InvalidArgument("Too few arguments"); - var args = new Array(i - 1); - while (--i) - args[i - 1] = arguments[i]; - scopeFunc = args.pop(); - var tables = flatten(args); - return [mode, tables, scopeFunc]; - } - function enterTransactionScope(db, mode, storeNames, parentTransaction, scopeFunc) { - return DexiePromise.resolve().then(function () { - var transless = PSD.transless || PSD; - var trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction); - trans.explicit = true; - var zoneProps = { - trans: trans, - transless: transless - }; - if (parentTransaction) { - trans.idbtrans = parentTransaction.idbtrans; - } - else { - try { - trans.create(); - trans.idbtrans._explicit = true; - db._state.PR1398_maxLoop = 3; - } - catch (ex) { - if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { - console.warn('Dexie: Need to reopen db'); - db.close({ disableAutoOpen: false }); - return db.open().then(function () { return enterTransactionScope(db, mode, storeNames, null, scopeFunc); }); - } - return rejection(ex); - } - } - var scopeFuncIsAsync = isAsyncFunction(scopeFunc); - if (scopeFuncIsAsync) { - incrementExpectedAwaits(); - } - var returnValue; - var promiseFollowed = DexiePromise.follow(function () { - returnValue = scopeFunc.call(trans, trans); - if (returnValue) { - if (scopeFuncIsAsync) { - var decrementor = decrementExpectedAwaits.bind(null, null); - returnValue.then(decrementor, decrementor); - } - else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') { - returnValue = awaitIterator(returnValue); - } - } - }, zoneProps); - return (returnValue && typeof returnValue.then === 'function' ? - DexiePromise.resolve(returnValue).then(function (x) { return trans.active ? - x - : rejection(new exceptions.PrematureCommit("Transaction committed too early. See http://bit.ly/2kdckMn")); }) - : promiseFollowed.then(function () { return returnValue; })).then(function (x) { - if (parentTransaction) - trans._resolve(); - return trans._completion.then(function () { return x; }); - }).catch(function (e) { - trans._reject(e); - return rejection(e); - }); - }); - } - - function pad(a, value, count) { - var result = isArray(a) ? a.slice() : [a]; - for (var i = 0; i < count; ++i) - result.push(value); - return result; - } - function createVirtualIndexMiddleware(down) { - return __assign(__assign({}, down), { table: function (tableName) { - var table = down.table(tableName); - var schema = table.schema; - var indexLookup = {}; - var allVirtualIndexes = []; - function addVirtualIndexes(keyPath, keyTail, lowLevelIndex) { - var keyPathAlias = getKeyPathAlias(keyPath); - var indexList = (indexLookup[keyPathAlias] = indexLookup[keyPathAlias] || []); - var keyLength = keyPath == null ? 0 : typeof keyPath === 'string' ? 1 : keyPath.length; - var isVirtual = keyTail > 0; - var virtualIndex = __assign(__assign({}, lowLevelIndex), { name: isVirtual - ? "".concat(keyPathAlias, "(virtual-from:").concat(lowLevelIndex.name, ")") - : lowLevelIndex.name, lowLevelIndex: lowLevelIndex, isVirtual: isVirtual, keyTail: keyTail, keyLength: keyLength, extractKey: getKeyExtractor(keyPath), unique: !isVirtual && lowLevelIndex.unique }); - indexList.push(virtualIndex); - if (!virtualIndex.isPrimaryKey) { - allVirtualIndexes.push(virtualIndex); - } - if (keyLength > 1) { - var virtualKeyPath = keyLength === 2 ? - keyPath[0] : - keyPath.slice(0, keyLength - 1); - addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex); - } - indexList.sort(function (a, b) { return a.keyTail - b.keyTail; }); - return virtualIndex; - } - var primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey); - indexLookup[":id"] = [primaryKey]; - for (var _i = 0, _a = schema.indexes; _i < _a.length; _i++) { - var index = _a[_i]; - addVirtualIndexes(index.keyPath, 0, index); - } - function findBestIndex(keyPath) { - var result = indexLookup[getKeyPathAlias(keyPath)]; - return result && result[0]; - } - function translateRange(range, keyTail) { - return { - type: range.type === 1 ? - 2 : - range.type, - lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail), - lowerOpen: true, - upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail), - upperOpen: true - }; - } - function translateRequest(req) { - var index = req.query.index; - return index.isVirtual ? __assign(__assign({}, req), { query: { - index: index.lowLevelIndex, - range: translateRange(req.query.range, index.keyTail) - } }) : req; - } - var result = __assign(__assign({}, table), { schema: __assign(__assign({}, schema), { primaryKey: primaryKey, indexes: allVirtualIndexes, getIndexByKeyPath: findBestIndex }), count: function (req) { - return table.count(translateRequest(req)); - }, query: function (req) { - return table.query(translateRequest(req)); - }, openCursor: function (req) { - var _a = req.query.index, keyTail = _a.keyTail, isVirtual = _a.isVirtual, keyLength = _a.keyLength; - if (!isVirtual) - return table.openCursor(req); - function createVirtualCursor(cursor) { - function _continue(key) { - key != null ? - cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) : - req.unique ? - cursor.continue(cursor.key.slice(0, keyLength) - .concat(req.reverse - ? down.MIN_KEY - : down.MAX_KEY, keyTail)) : - cursor.continue(); - } - var virtualCursor = Object.create(cursor, { - continue: { value: _continue }, - continuePrimaryKey: { - value: function (key, primaryKey) { - cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey); - } - }, - primaryKey: { - get: function () { - return cursor.primaryKey; - } - }, - key: { - get: function () { - var key = cursor.key; - return keyLength === 1 ? - key[0] : - key.slice(0, keyLength); - } - }, - value: { - get: function () { - return cursor.value; - } - } - }); - return virtualCursor; - } - return table.openCursor(translateRequest(req)) - .then(function (cursor) { return cursor && createVirtualCursor(cursor); }); - } }); - return result; - } }); - } - var virtualIndexMiddleware = { - stack: "dbcore", - name: "VirtualIndexMiddleware", - level: 1, - create: createVirtualIndexMiddleware - }; - - function getObjectDiff(a, b, rv, prfx) { - rv = rv || {}; - prfx = prfx || ''; - keys(a).forEach(function (prop) { - if (!hasOwn(b, prop)) { - rv[prfx + prop] = undefined; - } - else { - var ap = a[prop], bp = b[prop]; - if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) { - var apTypeName = toStringTag(ap); - var bpTypeName = toStringTag(bp); - if (apTypeName !== bpTypeName) { - rv[prfx + prop] = b[prop]; - } - else if (apTypeName === 'Object') { - getObjectDiff(ap, bp, rv, prfx + prop + '.'); - } - else if (ap !== bp) { - rv[prfx + prop] = b[prop]; - } - } - else if (ap !== bp) - rv[prfx + prop] = b[prop]; - } - }); - keys(b).forEach(function (prop) { - if (!hasOwn(a, prop)) { - rv[prfx + prop] = b[prop]; - } - }); - return rv; - } - - function getEffectiveKeys(primaryKey, req) { - if (req.type === 'delete') - return req.keys; - return req.keys || req.values.map(primaryKey.extractKey); - } - - var hooksMiddleware = { - stack: "dbcore", - name: "HooksMiddleware", - level: 2, - create: function (downCore) { return (__assign(__assign({}, downCore), { table: function (tableName) { - var downTable = downCore.table(tableName); - var primaryKey = downTable.schema.primaryKey; - var tableMiddleware = __assign(__assign({}, downTable), { mutate: function (req) { - var dxTrans = PSD.trans; - var _a = dxTrans.table(tableName).hook, deleting = _a.deleting, creating = _a.creating, updating = _a.updating; - switch (req.type) { - case 'add': - if (creating.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); - case 'put': - if (creating.fire === nop && updating.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); - case 'delete': - if (deleting.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); - case 'deleteRange': - if (deleting.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return deleteRange(req); }, true); - } - return downTable.mutate(req); - function addPutOrDelete(req) { - var dxTrans = PSD.trans; - var keys = req.keys || getEffectiveKeys(primaryKey, req); - if (!keys) - throw new Error("Keys missing"); - req = req.type === 'add' || req.type === 'put' ? __assign(__assign({}, req), { keys: keys }) : __assign({}, req); - if (req.type !== 'delete') - req.values = __spreadArray([], req.values, true); - if (req.keys) - req.keys = __spreadArray([], req.keys, true); - return getExistingValues(downTable, req, keys).then(function (existingValues) { - var contexts = keys.map(function (key, i) { - var existingValue = existingValues[i]; - var ctx = { onerror: null, onsuccess: null }; - if (req.type === 'delete') { - deleting.fire.call(ctx, key, existingValue, dxTrans); - } - else if (req.type === 'add' || existingValue === undefined) { - var generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans); - if (key == null && generatedPrimaryKey != null) { - key = generatedPrimaryKey; - req.keys[i] = key; - if (!primaryKey.outbound) { - setByKeyPath(req.values[i], primaryKey.keyPath, key); - } - } - } - else { - var objectDiff = getObjectDiff(existingValue, req.values[i]); - var additionalChanges_1 = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans); - if (additionalChanges_1) { - var requestedValue_1 = req.values[i]; - Object.keys(additionalChanges_1).forEach(function (keyPath) { - if (hasOwn(requestedValue_1, keyPath)) { - requestedValue_1[keyPath] = additionalChanges_1[keyPath]; - } - else { - setByKeyPath(requestedValue_1, keyPath, additionalChanges_1[keyPath]); - } - }); - } - } - return ctx; - }); - return downTable.mutate(req).then(function (_a) { - var failures = _a.failures, results = _a.results, numFailures = _a.numFailures, lastResult = _a.lastResult; - for (var i = 0; i < keys.length; ++i) { - var primKey = results ? results[i] : keys[i]; - var ctx = contexts[i]; - if (primKey == null) { - ctx.onerror && ctx.onerror(failures[i]); - } - else { - ctx.onsuccess && ctx.onsuccess(req.type === 'put' && existingValues[i] ? - req.values[i] : - primKey - ); - } - } - return { failures: failures, results: results, numFailures: numFailures, lastResult: lastResult }; - }).catch(function (error) { - contexts.forEach(function (ctx) { return ctx.onerror && ctx.onerror(error); }); - return Promise.reject(error); - }); - }); - } - function deleteRange(req) { - return deleteNextChunk(req.trans, req.range, 10000); - } - function deleteNextChunk(trans, range, limit) { - return downTable.query({ trans: trans, values: false, query: { index: primaryKey, range: range }, limit: limit }) - .then(function (_a) { - var result = _a.result; - return addPutOrDelete({ type: 'delete', keys: result, trans: trans }).then(function (res) { - if (res.numFailures > 0) - return Promise.reject(res.failures[0]); - if (result.length < limit) { - return { failures: [], numFailures: 0, lastResult: undefined }; - } - else { - return deleteNextChunk(trans, __assign(__assign({}, range), { lower: result[result.length - 1], lowerOpen: true }), limit); - } - }); - }); - } - } }); - return tableMiddleware; - } })); } - }; - function getExistingValues(table, req, effectiveKeys) { - return req.type === "add" - ? Promise.resolve([]) - : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: "immutable" }); - } - - function getFromTransactionCache(keys, cache, clone) { - try { - if (!cache) - return null; - if (cache.keys.length < keys.length) - return null; - var result = []; - for (var i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) { - if (cmp(cache.keys[i], keys[j]) !== 0) - continue; - result.push(clone ? deepClone(cache.values[i]) : cache.values[i]); - ++j; - } - return result.length === keys.length ? result : null; - } - catch (_a) { - return null; - } - } - var cacheExistingValuesMiddleware = { - stack: "dbcore", - level: -1, - create: function (core) { - return { - table: function (tableName) { - var table = core.table(tableName); - return __assign(__assign({}, table), { getMany: function (req) { - if (!req.cache) { - return table.getMany(req); - } - var cachedResult = getFromTransactionCache(req.keys, req.trans["_cache"], req.cache === "clone"); - if (cachedResult) { - return DexiePromise.resolve(cachedResult); - } - return table.getMany(req).then(function (res) { - req.trans["_cache"] = { - keys: req.keys, - values: req.cache === "clone" ? deepClone(res) : res, - }; - return res; - }); - }, mutate: function (req) { - if (req.type !== "add") - req.trans["_cache"] = null; - return table.mutate(req); - } }); - }, - }; - }, - }; - - function isCachableContext(ctx, table) { - return (ctx.trans.mode === 'readonly' && - !!ctx.subscr && - !ctx.trans.explicit && - ctx.trans.db._options.cache !== 'disabled' && - !table.schema.primaryKey.outbound); - } - - function isCachableRequest(type, req) { - switch (type) { - case 'query': - return req.values && !req.unique; - case 'get': - return false; - case 'getMany': - return false; - case 'count': - return false; - case 'openCursor': - return false; - } - } - - var observabilityMiddleware = { - stack: "dbcore", - level: 0, - name: "Observability", - create: function (core) { - var dbName = core.schema.name; - var FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY); - return __assign(__assign({}, core), { transaction: function (stores, mode, options) { - if (PSD.subscr && mode !== 'readonly') { - throw new exceptions.ReadOnly("Readwrite transaction in liveQuery context. Querier source: ".concat(PSD.querier)); - } - return core.transaction(stores, mode, options); - }, table: function (tableName) { - var table = core.table(tableName); - var schema = table.schema; - var primaryKey = schema.primaryKey, indexes = schema.indexes; - var extractKey = primaryKey.extractKey, outbound = primaryKey.outbound; - var indexesWithAutoIncPK = primaryKey.autoIncrement && indexes.filter(function (index) { return index.compound && index.keyPath.includes(primaryKey.keyPath); }); - var tableClone = __assign(__assign({}, table), { mutate: function (req) { - var trans = req.trans; - var mutatedParts = req.mutatedParts || (req.mutatedParts = {}); - var getRangeSet = function (indexName) { - var part = "idb://".concat(dbName, "/").concat(tableName, "/").concat(indexName); - return (mutatedParts[part] || - (mutatedParts[part] = new RangeSet())); - }; - var pkRangeSet = getRangeSet(""); - var delsRangeSet = getRangeSet(":dels"); - var type = req.type; - var _a = req.type === "deleteRange" - ? [req.range] - : req.type === "delete" - ? [req.keys] - : req.values.length < 50 - ? [getEffectiveKeys(primaryKey, req).filter(function (id) { return id; }), req.values] - : [], keys = _a[0], newObjs = _a[1]; - var oldCache = req.trans["_cache"]; - if (isArray(keys)) { - pkRangeSet.addKeys(keys); - var oldObjs = type === 'delete' || keys.length === newObjs.length ? getFromTransactionCache(keys, oldCache) : null; - if (!oldObjs) { - delsRangeSet.addKeys(keys); - } - if (oldObjs || newObjs) { - trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs); - } - } - else if (keys) { - var range = { from: keys.lower, to: keys.upper }; - delsRangeSet.add(range); - pkRangeSet.add(range); - } - else { - pkRangeSet.add(FULL_RANGE); - delsRangeSet.add(FULL_RANGE); - schema.indexes.forEach(function (idx) { return getRangeSet(idx.name).add(FULL_RANGE); }); - } - return table.mutate(req).then(function (res) { - if (keys && (req.type === 'add' || req.type === 'put')) { - pkRangeSet.addKeys(res.results); - if (indexesWithAutoIncPK) { - indexesWithAutoIncPK.forEach(function (idx) { - var idxVals = req.values.map(function (v) { return idx.extractKey(v); }); - var pkPos = idx.keyPath.findIndex(function (prop) { return prop === primaryKey.keyPath; }); - res.results.forEach(function (pk) { return idxVals[pkPos] = pk; }); - getRangeSet(idx.name).addKeys(idxVals); - }); - } - } - trans.mutatedParts = extendObservabilitySet(trans.mutatedParts || {}, mutatedParts); - return res; - }); - } }); - var getRange = function (_a) { - var _b, _c; - var _d = _a.query, index = _d.index, range = _d.range; - return [ - index, - new RangeSet((_b = range.lower) !== null && _b !== void 0 ? _b : core.MIN_KEY, (_c = range.upper) !== null && _c !== void 0 ? _c : core.MAX_KEY), - ]; - }; - var readSubscribers = { - get: function (req) { return [primaryKey, new RangeSet(req.key)]; }, - getMany: function (req) { return [primaryKey, new RangeSet().addKeys(req.keys)]; }, - count: getRange, - query: getRange, - openCursor: getRange, - }; - keys(readSubscribers).forEach(function (method) { - tableClone[method] = function (req) { - var subscr = PSD.subscr; - var isLiveQuery = !!subscr; - var cachable = isCachableContext(PSD, table) && isCachableRequest(method, req); - var obsSet = cachable - ? req.obsSet = {} - : subscr; - if (isLiveQuery) { - var getRangeSet = function (indexName) { - var part = "idb://".concat(dbName, "/").concat(tableName, "/").concat(indexName); - return (obsSet[part] || - (obsSet[part] = new RangeSet())); - }; - var pkRangeSet_1 = getRangeSet(""); - var delsRangeSet_1 = getRangeSet(":dels"); - var _a = readSubscribers[method](req), queriedIndex = _a[0], queriedRanges = _a[1]; - if (method === 'query' && queriedIndex.isPrimaryKey && !req.values) { - delsRangeSet_1.add(queriedRanges); - } - else { - getRangeSet(queriedIndex.name || "").add(queriedRanges); - } - if (!queriedIndex.isPrimaryKey) { - if (method === "count") { - delsRangeSet_1.add(FULL_RANGE); - } - else { - var keysPromise_1 = method === "query" && - outbound && - req.values && - table.query(__assign(__assign({}, req), { values: false })); - return table[method].apply(this, arguments).then(function (res) { - if (method === "query") { - if (outbound && req.values) { - return keysPromise_1.then(function (_a) { - var resultingKeys = _a.result; - pkRangeSet_1.addKeys(resultingKeys); - return res; - }); - } - var pKeys = req.values - ? res.result.map(extractKey) - : res.result; - if (req.values) { - pkRangeSet_1.addKeys(pKeys); - } - else { - delsRangeSet_1.addKeys(pKeys); - } - } - else if (method === "openCursor") { - var cursor_1 = res; - var wantValues_1 = req.values; - return (cursor_1 && - Object.create(cursor_1, { - key: { - get: function () { - delsRangeSet_1.addKey(cursor_1.primaryKey); - return cursor_1.key; - }, - }, - primaryKey: { - get: function () { - var pkey = cursor_1.primaryKey; - delsRangeSet_1.addKey(pkey); - return pkey; - }, - }, - value: { - get: function () { - wantValues_1 && pkRangeSet_1.addKey(cursor_1.primaryKey); - return cursor_1.value; - }, - }, - })); - } - return res; - }); - } - } - } - return table[method].apply(this, arguments); - }; - }); - return tableClone; - } }); - }, - }; - function trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs) { - function addAffectedIndex(ix) { - var rangeSet = getRangeSet(ix.name || ""); - function extractKey(obj) { - return obj != null ? ix.extractKey(obj) : null; - } - var addKeyOrKeys = function (key) { return ix.multiEntry && isArray(key) - ? key.forEach(function (key) { return rangeSet.addKey(key); }) - : rangeSet.addKey(key); }; - (oldObjs || newObjs).forEach(function (_, i) { - var oldKey = oldObjs && extractKey(oldObjs[i]); - var newKey = newObjs && extractKey(newObjs[i]); - if (cmp(oldKey, newKey) !== 0) { - if (oldKey != null) - addKeyOrKeys(oldKey); - if (newKey != null) - addKeyOrKeys(newKey); - } - }); - } - schema.indexes.forEach(addAffectedIndex); - } - - function adjustOptimisticFromFailures(tblCache, req, res) { - if (res.numFailures === 0) - return req; - if (req.type === 'deleteRange') { - return null; - } - var numBulkOps = req.keys - ? req.keys.length - : 'values' in req && req.values - ? req.values.length - : 1; - if (res.numFailures === numBulkOps) { - return null; - } - var clone = __assign({}, req); - if (isArray(clone.keys)) { - clone.keys = clone.keys.filter(function (_, i) { return !(i in res.failures); }); - } - if ('values' in clone && isArray(clone.values)) { - clone.values = clone.values.filter(function (_, i) { return !(i in res.failures); }); - } - return clone; - } - - function isAboveLower(key, range) { - return range.lower === undefined - ? true - : range.lowerOpen - ? cmp(key, range.lower) > 0 - : cmp(key, range.lower) >= 0; - } - function isBelowUpper(key, range) { - return range.upper === undefined - ? true - : range.upperOpen - ? cmp(key, range.upper) < 0 - : cmp(key, range.upper) <= 0; - } - function isWithinRange(key, range) { - return isAboveLower(key, range) && isBelowUpper(key, range); - } - - function applyOptimisticOps(result, req, ops, table, cacheEntry, immutable) { - if (!ops || ops.length === 0) - return result; - var index = req.query.index; - var multiEntry = index.multiEntry; - var queryRange = req.query.range; - var primaryKey = table.schema.primaryKey; - var extractPrimKey = primaryKey.extractKey; - var extractIndex = index.extractKey; - var extractLowLevelIndex = (index.lowLevelIndex || index).extractKey; - var finalResult = ops.reduce(function (result, op) { - var modifedResult = result; - var includedValues = op.type === 'add' || op.type === 'put' - ? op.values.filter(function (v) { - var key = extractIndex(v); - return multiEntry && isArray(key) - ? key.some(function (k) { return isWithinRange(k, queryRange); }) - : isWithinRange(key, queryRange); - }).map(function (v) { - v = deepClone(v); - if (immutable) - Object.freeze(v); - return v; - }) - : []; - switch (op.type) { - case 'add': - modifedResult = result.concat(req.values - ? includedValues - : includedValues.map(function (v) { return extractPrimKey(v); })); - break; - case 'put': - var keySet_1 = new RangeSet().addKeys(op.values.map(function (v) { return extractPrimKey(v); })); - modifedResult = result - .filter(function (item) { - var key = req.values ? extractPrimKey(item) : item; - return !rangesOverlap(new RangeSet(key), keySet_1); - }) - .concat(req.values - ? includedValues - : includedValues.map(function (v) { return extractPrimKey(v); })); - break; - case 'delete': - var keysToDelete_1 = new RangeSet().addKeys(op.keys); - modifedResult = result.filter(function (item) { - var key = req.values ? extractPrimKey(item) : item; - return !rangesOverlap(new RangeSet(key), keysToDelete_1); - }); - break; - case 'deleteRange': - var range_1 = op.range; - modifedResult = result.filter(function (item) { return !isWithinRange(extractPrimKey(item), range_1); }); - break; - } - return modifedResult; - }, result); - if (finalResult === result) - return result; - finalResult.sort(function (a, b) { - return cmp(extractLowLevelIndex(a), extractLowLevelIndex(b)) || - cmp(extractPrimKey(a), extractPrimKey(b)); - }); - if (req.limit && req.limit < Infinity) { - if (finalResult.length > req.limit) { - finalResult.length = req.limit; - } - else if (result.length === req.limit && finalResult.length < req.limit) { - cacheEntry.dirty = true; - } - } - return immutable ? Object.freeze(finalResult) : finalResult; - } - - function areRangesEqual(r1, r2) { - return (cmp(r1.lower, r2.lower) === 0 && - cmp(r1.upper, r2.upper) === 0 && - !!r1.lowerOpen === !!r2.lowerOpen && - !!r1.upperOpen === !!r2.upperOpen); - } - - function compareLowers(lower1, lower2, lowerOpen1, lowerOpen2) { - if (lower1 === undefined) - return lower2 !== undefined ? -1 : 0; - if (lower2 === undefined) - return 1; - var c = cmp(lower1, lower2); - if (c === 0) { - if (lowerOpen1 && lowerOpen2) - return 0; - if (lowerOpen1) - return 1; - if (lowerOpen2) - return -1; - } - return c; - } - function compareUppers(upper1, upper2, upperOpen1, upperOpen2) { - if (upper1 === undefined) - return upper2 !== undefined ? 1 : 0; - if (upper2 === undefined) - return -1; - var c = cmp(upper1, upper2); - if (c === 0) { - if (upperOpen1 && upperOpen2) - return 0; - if (upperOpen1) - return -1; - if (upperOpen2) - return 1; - } - return c; - } - function isSuperRange(r1, r2) { - return (compareLowers(r1.lower, r2.lower, r1.lowerOpen, r2.lowerOpen) <= 0 && - compareUppers(r1.upper, r2.upper, r1.upperOpen, r2.upperOpen) >= 0); - } - - function findCompatibleQuery(dbName, tableName, type, req) { - var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)]; - if (!tblCache) - return []; - var queries = tblCache.queries[type]; - if (!queries) - return [null, false, tblCache, null]; - var indexName = req.query ? req.query.index.name : null; - var entries = queries[indexName || '']; - if (!entries) - return [null, false, tblCache, null]; - switch (type) { - case 'query': - var equalEntry = entries.find(function (entry) { - return entry.req.limit === req.limit && - entry.req.values === req.values && - areRangesEqual(entry.req.query.range, req.query.range); - }); - if (equalEntry) - return [ - equalEntry, - true, - tblCache, - entries, - ]; - var superEntry = entries.find(function (entry) { - var limit = 'limit' in entry.req ? entry.req.limit : Infinity; - return (limit >= req.limit && - (req.values ? entry.req.values : true) && - isSuperRange(entry.req.query.range, req.query.range)); - }); - return [superEntry, false, tblCache, entries]; - case 'count': - var countQuery = entries.find(function (entry) { - return areRangesEqual(entry.req.query.range, req.query.range); - }); - return [countQuery, !!countQuery, tblCache, entries]; - } - } - - function subscribeToCacheEntry(cacheEntry, container, requery, signal) { - cacheEntry.subscribers.add(requery); - signal.addEventListener("abort", function () { - cacheEntry.subscribers.delete(requery); - if (cacheEntry.subscribers.size === 0) { - enqueForDeletion(cacheEntry, container); - } - }); - } - function enqueForDeletion(cacheEntry, container) { - setTimeout(function () { - if (cacheEntry.subscribers.size === 0) { - delArrayItem(container, cacheEntry); - } - }, 3000); - } - - var cacheMiddleware = { - stack: 'dbcore', - level: 0, - name: 'Cache', - create: function (core) { - var dbName = core.schema.name; - var coreMW = __assign(__assign({}, core), { transaction: function (stores, mode, options) { - var idbtrans = core.transaction(stores, mode, options); - if (mode === 'readwrite') { - var ac_1 = new AbortController(); - var signal = ac_1.signal; - var endTransaction = function (wasCommitted) { return function () { - ac_1.abort(); - if (mode === 'readwrite') { - var affectedSubscribers_1 = new Set(); - for (var _i = 0, stores_1 = stores; _i < stores_1.length; _i++) { - var storeName = stores_1[_i]; - var tblCache = cache["idb://".concat(dbName, "/").concat(storeName)]; - if (tblCache) { - var table = core.table(storeName); - var ops = tblCache.optimisticOps.filter(function (op) { return op.trans === idbtrans; }); - if (idbtrans._explicit && wasCommitted && idbtrans.mutatedParts) { - for (var _a = 0, _b = Object.values(tblCache.queries.query); _a < _b.length; _a++) { - var entries = _b[_a]; - for (var _c = 0, _d = entries.slice(); _c < _d.length; _c++) { - var entry = _d[_c]; - if (obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)) { - delArrayItem(entries, entry); - entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); }); - } - } - } - } - else if (ops.length > 0) { - tblCache.optimisticOps = tblCache.optimisticOps.filter(function (op) { return op.trans !== idbtrans; }); - for (var _e = 0, _f = Object.values(tblCache.queries.query); _e < _f.length; _e++) { - var entries = _f[_e]; - for (var _g = 0, _h = entries.slice(); _g < _h.length; _g++) { - var entry = _h[_g]; - if (entry.res != null && - idbtrans.mutatedParts - ) { - if (wasCommitted && !entry.dirty) { - var freezeResults = Object.isFrozen(entry.res); - var modRes = applyOptimisticOps(entry.res, entry.req, ops, table, entry, freezeResults); - if (entry.dirty) { - delArrayItem(entries, entry); - entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); }); - } - else if (modRes !== entry.res) { - entry.res = modRes; - entry.promise = DexiePromise.resolve({ result: modRes }); - } - } - else { - if (entry.dirty) { - delArrayItem(entries, entry); - } - entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); }); - } - } - } - } - } - } - } - affectedSubscribers_1.forEach(function (requery) { return requery(); }); - } - }; }; - idbtrans.addEventListener('abort', endTransaction(false), { - signal: signal, - }); - idbtrans.addEventListener('error', endTransaction(false), { - signal: signal, - }); - idbtrans.addEventListener('complete', endTransaction(true), { - signal: signal, - }); - } - return idbtrans; - }, table: function (tableName) { - var downTable = core.table(tableName); - var primKey = downTable.schema.primaryKey; - var tableMW = __assign(__assign({}, downTable), { mutate: function (req) { - var trans = PSD.trans; - if (primKey.outbound || - trans.db._options.cache === 'disabled' || - trans.explicit - ) { - return downTable.mutate(req); - } - var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)]; - if (!tblCache) - return downTable.mutate(req); - var promise = downTable.mutate(req); - if ((req.type === 'add' || req.type === 'put') && (req.values.length >= 50 || getEffectiveKeys(primKey, req).some(function (key) { return key == null; }))) { - promise.then(function (res) { - var reqWithResolvedKeys = __assign(__assign({}, req), { values: req.values.map(function (value, i) { - var _a; - var valueWithKey = ((_a = primKey.keyPath) === null || _a === void 0 ? void 0 : _a.includes('.')) - ? deepClone(value) - : __assign({}, value); - setByKeyPath(valueWithKey, primKey.keyPath, res.results[i]); - return valueWithKey; - }) }); - var adjustedReq = adjustOptimisticFromFailures(tblCache, reqWithResolvedKeys, res); - tblCache.optimisticOps.push(adjustedReq); - queueMicrotask(function () { return req.mutatedParts && signalSubscribersLazily(req.mutatedParts); }); - }); - } - else { - tblCache.optimisticOps.push(req); - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - promise.then(function (res) { - if (res.numFailures > 0) { - delArrayItem(tblCache.optimisticOps, req); - var adjustedReq = adjustOptimisticFromFailures(tblCache, req, res); - if (adjustedReq) { - tblCache.optimisticOps.push(adjustedReq); - } - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - } - }); - promise.catch(function () { - delArrayItem(tblCache.optimisticOps, req); - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - }); - } - return promise; - }, query: function (req) { - var _a; - if (!isCachableContext(PSD, downTable) || !isCachableRequest("query", req)) - return downTable.query(req); - var freezeResults = ((_a = PSD.trans) === null || _a === void 0 ? void 0 : _a.db._options.cache) === 'immutable'; - var _b = PSD, requery = _b.requery, signal = _b.signal; - var _c = findCompatibleQuery(dbName, tableName, 'query', req), cacheEntry = _c[0], exactMatch = _c[1], tblCache = _c[2], container = _c[3]; - if (cacheEntry && exactMatch) { - cacheEntry.obsSet = req.obsSet; - } - else { - var promise = downTable.query(req).then(function (res) { - var result = res.result; - if (cacheEntry) - cacheEntry.res = result; - if (freezeResults) { - for (var i = 0, l = result.length; i < l; ++i) { - Object.freeze(result[i]); - } - Object.freeze(result); - } - else { - res.result = deepClone(result); - } - return res; - }).catch(function (error) { - if (container && cacheEntry) - delArrayItem(container, cacheEntry); - return Promise.reject(error); - }); - cacheEntry = { - obsSet: req.obsSet, - promise: promise, - subscribers: new Set(), - type: 'query', - req: req, - dirty: false, - }; - if (container) { - container.push(cacheEntry); - } - else { - container = [cacheEntry]; - if (!tblCache) { - tblCache = cache["idb://".concat(dbName, "/").concat(tableName)] = { - queries: { - query: {}, - count: {}, - }, - objs: new Map(), - optimisticOps: [], - unsignaledParts: {} - }; - } - tblCache.queries.query[req.query.index.name || ''] = container; - } - } - subscribeToCacheEntry(cacheEntry, container, requery, signal); - return cacheEntry.promise.then(function (res) { - return { - result: applyOptimisticOps(res.result, req, tblCache === null || tblCache === void 0 ? void 0 : tblCache.optimisticOps, downTable, cacheEntry, freezeResults), - }; - }); - } }); - return tableMW; - } }); - return coreMW; - }, - }; - - function vipify(target, vipDb) { - return new Proxy(target, { - get: function (target, prop, receiver) { - if (prop === 'db') - return vipDb; - return Reflect.get(target, prop, receiver); - } - }); - } - - var Dexie$1 = (function () { - function Dexie(name, options) { - var _this = this; - this._middlewares = {}; - this.verno = 0; - var deps = Dexie.dependencies; - this._options = options = __assign({ - addons: Dexie.addons, autoOpen: true, - indexedDB: deps.indexedDB, IDBKeyRange: deps.IDBKeyRange, cache: 'cloned' }, options); - this._deps = { - indexedDB: options.indexedDB, - IDBKeyRange: options.IDBKeyRange - }; - var addons = options.addons; - this._dbSchema = {}; - this._versions = []; - this._storeNames = []; - this._allTables = {}; - this.idbdb = null; - this._novip = this; - var state = { - dbOpenError: null, - isBeingOpened: false, - onReadyBeingFired: null, - openComplete: false, - dbReadyResolve: nop, - dbReadyPromise: null, - cancelOpen: nop, - openCanceller: null, - autoSchema: true, - PR1398_maxLoop: 3, - autoOpen: options.autoOpen, - }; - state.dbReadyPromise = new DexiePromise(function (resolve) { - state.dbReadyResolve = resolve; - }); - state.openCanceller = new DexiePromise(function (_, reject) { - state.cancelOpen = reject; - }); - this._state = state; - this.name = name; - this.on = Events(this, "populate", "blocked", "versionchange", "close", { ready: [promisableChain, nop] }); - this.on.ready.subscribe = override(this.on.ready.subscribe, function (subscribe) { - return function (subscriber, bSticky) { - Dexie.vip(function () { - var state = _this._state; - if (state.openComplete) { - if (!state.dbOpenError) - DexiePromise.resolve().then(subscriber); - if (bSticky) - subscribe(subscriber); - } - else if (state.onReadyBeingFired) { - state.onReadyBeingFired.push(subscriber); - if (bSticky) - subscribe(subscriber); - } - else { - subscribe(subscriber); - var db_1 = _this; - if (!bSticky) - subscribe(function unsubscribe() { - db_1.on.ready.unsubscribe(subscriber); - db_1.on.ready.unsubscribe(unsubscribe); - }); - } - }); - }; - }); - this.Collection = createCollectionConstructor(this); - this.Table = createTableConstructor(this); - this.Transaction = createTransactionConstructor(this); - this.Version = createVersionConstructor(this); - this.WhereClause = createWhereClauseConstructor(this); - this.on("versionchange", function (ev) { - if (ev.newVersion > 0) - console.warn("Another connection wants to upgrade database '".concat(_this.name, "'. Closing db now to resume the upgrade.")); - else - console.warn("Another connection wants to delete database '".concat(_this.name, "'. Closing db now to resume the delete request.")); - _this.close({ disableAutoOpen: false }); - }); - this.on("blocked", function (ev) { - if (!ev.newVersion || ev.newVersion < ev.oldVersion) - console.warn("Dexie.delete('".concat(_this.name, "') was blocked")); - else - console.warn("Upgrade '".concat(_this.name, "' blocked by other connection holding version ").concat(ev.oldVersion / 10)); - }); - this._maxKey = getMaxKey(options.IDBKeyRange); - this._createTransaction = function (mode, storeNames, dbschema, parentTransaction) { return new _this.Transaction(mode, storeNames, dbschema, _this._options.chromeTransactionDurability, parentTransaction); }; - this._fireOnBlocked = function (ev) { - _this.on("blocked").fire(ev); - connections - .filter(function (c) { return c.name === _this.name && c !== _this && !c._state.vcFired; }) - .map(function (c) { return c.on("versionchange").fire(ev); }); - }; - this.use(cacheExistingValuesMiddleware); - this.use(cacheMiddleware); - this.use(observabilityMiddleware); - this.use(virtualIndexMiddleware); - this.use(hooksMiddleware); - var vipDB = new Proxy(this, { - get: function (_, prop, receiver) { - if (prop === '_vip') - return true; - if (prop === 'table') - return function (tableName) { return vipify(_this.table(tableName), vipDB); }; - var rv = Reflect.get(_, prop, receiver); - if (rv instanceof Table) - return vipify(rv, vipDB); - if (prop === 'tables') - return rv.map(function (t) { return vipify(t, vipDB); }); - if (prop === '_createTransaction') - return function () { - var tx = rv.apply(this, arguments); - return vipify(tx, vipDB); - }; - return rv; - } - }); - this.vip = vipDB; - addons.forEach(function (addon) { return addon(_this); }); - } - Dexie.prototype.version = function (versionNumber) { - if (isNaN(versionNumber) || versionNumber < 0.1) - throw new exceptions.Type("Given version is not a positive number"); - versionNumber = Math.round(versionNumber * 10) / 10; - if (this.idbdb || this._state.isBeingOpened) - throw new exceptions.Schema("Cannot add version when database is open"); - this.verno = Math.max(this.verno, versionNumber); - var versions = this._versions; - var versionInstance = versions.filter(function (v) { return v._cfg.version === versionNumber; })[0]; - if (versionInstance) - return versionInstance; - versionInstance = new this.Version(versionNumber); - versions.push(versionInstance); - versions.sort(lowerVersionFirst); - versionInstance.stores({}); - this._state.autoSchema = false; - return versionInstance; - }; - Dexie.prototype._whenReady = function (fn) { - var _this = this; - return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new DexiePromise(function (resolve, reject) { - if (_this._state.openComplete) { - return reject(new exceptions.DatabaseClosed(_this._state.dbOpenError)); - } - if (!_this._state.isBeingOpened) { - if (!_this._state.autoOpen) { - reject(new exceptions.DatabaseClosed()); - return; - } - _this.open().catch(nop); - } - _this._state.dbReadyPromise.then(resolve, reject); - }).then(fn); - }; - Dexie.prototype.use = function (_a) { - var stack = _a.stack, create = _a.create, level = _a.level, name = _a.name; - if (name) - this.unuse({ stack: stack, name: name }); - var middlewares = this._middlewares[stack] || (this._middlewares[stack] = []); - middlewares.push({ stack: stack, create: create, level: level == null ? 10 : level, name: name }); - middlewares.sort(function (a, b) { return a.level - b.level; }); - return this; - }; - Dexie.prototype.unuse = function (_a) { - var stack = _a.stack, name = _a.name, create = _a.create; - if (stack && this._middlewares[stack]) { - this._middlewares[stack] = this._middlewares[stack].filter(function (mw) { - return create ? mw.create !== create : - name ? mw.name !== name : - false; - }); - } - return this; - }; - Dexie.prototype.open = function () { - var _this = this; - return usePSD(globalPSD, - function () { return dexieOpen(_this); }); - }; - Dexie.prototype._close = function () { - var state = this._state; - var idx = connections.indexOf(this); - if (idx >= 0) - connections.splice(idx, 1); - if (this.idbdb) { - try { - this.idbdb.close(); - } - catch (e) { } - this.idbdb = null; - } - if (!state.isBeingOpened) { - state.dbReadyPromise = new DexiePromise(function (resolve) { - state.dbReadyResolve = resolve; - }); - state.openCanceller = new DexiePromise(function (_, reject) { - state.cancelOpen = reject; - }); - } - }; - Dexie.prototype.close = function (_a) { - var _b = _a === void 0 ? { disableAutoOpen: true } : _a, disableAutoOpen = _b.disableAutoOpen; - var state = this._state; - if (disableAutoOpen) { - if (state.isBeingOpened) { - state.cancelOpen(new exceptions.DatabaseClosed()); - } - this._close(); - state.autoOpen = false; - state.dbOpenError = new exceptions.DatabaseClosed(); - } - else { - this._close(); - state.autoOpen = this._options.autoOpen || - state.isBeingOpened; - state.openComplete = false; - state.dbOpenError = null; - } - }; - Dexie.prototype.delete = function (closeOptions) { - var _this = this; - if (closeOptions === void 0) { closeOptions = { disableAutoOpen: true }; } - var hasInvalidArguments = arguments.length > 0 && typeof arguments[0] !== 'object'; - var state = this._state; - return new DexiePromise(function (resolve, reject) { - var doDelete = function () { - _this.close(closeOptions); - var req = _this._deps.indexedDB.deleteDatabase(_this.name); - req.onsuccess = wrap(function () { - _onDatabaseDeleted(_this._deps, _this.name); - resolve(); - }); - req.onerror = eventRejectHandler(reject); - req.onblocked = _this._fireOnBlocked; - }; - if (hasInvalidArguments) - throw new exceptions.InvalidArgument("Invalid closeOptions argument to db.delete()"); - if (state.isBeingOpened) { - state.dbReadyPromise.then(doDelete); - } - else { - doDelete(); - } - }); - }; - Dexie.prototype.backendDB = function () { - return this.idbdb; - }; - Dexie.prototype.isOpen = function () { - return this.idbdb !== null; - }; - Dexie.prototype.hasBeenClosed = function () { - var dbOpenError = this._state.dbOpenError; - return dbOpenError && (dbOpenError.name === 'DatabaseClosed'); - }; - Dexie.prototype.hasFailed = function () { - return this._state.dbOpenError !== null; - }; - Dexie.prototype.dynamicallyOpened = function () { - return this._state.autoSchema; - }; - Object.defineProperty(Dexie.prototype, "tables", { - get: function () { - var _this = this; - return keys(this._allTables).map(function (name) { return _this._allTables[name]; }); - }, - enumerable: false, - configurable: true - }); - Dexie.prototype.transaction = function () { - var args = extractTransactionArgs.apply(this, arguments); - return this._transaction.apply(this, args); - }; - Dexie.prototype._transaction = function (mode, tables, scopeFunc) { - var _this = this; - var parentTransaction = PSD.trans; - if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) - parentTransaction = null; - var onlyIfCompatible = mode.indexOf('?') !== -1; - mode = mode.replace('!', '').replace('?', ''); - var idbMode, storeNames; - try { - storeNames = tables.map(function (table) { - var storeName = table instanceof _this.Table ? table.name : table; - if (typeof storeName !== 'string') - throw new TypeError("Invalid table argument to Dexie.transaction(). Only Table or String are allowed"); - return storeName; - }); - if (mode == "r" || mode === READONLY) - idbMode = READONLY; - else if (mode == "rw" || mode == READWRITE) - idbMode = READWRITE; - else - throw new exceptions.InvalidArgument("Invalid transaction mode: " + mode); - if (parentTransaction) { - if (parentTransaction.mode === READONLY && idbMode === READWRITE) { - if (onlyIfCompatible) { - parentTransaction = null; - } - else - throw new exceptions.SubTransaction("Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY"); - } - if (parentTransaction) { - storeNames.forEach(function (storeName) { - if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) { - if (onlyIfCompatible) { - parentTransaction = null; - } - else - throw new exceptions.SubTransaction("Table " + storeName + - " not included in parent transaction."); - } - }); - } - if (onlyIfCompatible && parentTransaction && !parentTransaction.active) { - parentTransaction = null; - } - } - } - catch (e) { - return parentTransaction ? - parentTransaction._promise(null, function (_, reject) { reject(e); }) : - rejection(e); - } - var enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc); - return (parentTransaction ? - parentTransaction._promise(idbMode, enterTransaction, "lock") : - PSD.trans ? - usePSD(PSD.transless, function () { return _this._whenReady(enterTransaction); }) : - this._whenReady(enterTransaction)); - }; - Dexie.prototype.table = function (tableName) { - if (!hasOwn(this._allTables, tableName)) { - throw new exceptions.InvalidTable("Table ".concat(tableName, " does not exist")); - } - return this._allTables[tableName]; - }; - return Dexie; - }()); - - var symbolObservable = typeof Symbol !== "undefined" && "observable" in Symbol - ? Symbol.observable - : "@@observable"; - var Observable = (function () { - function Observable(subscribe) { - this._subscribe = subscribe; - } - Observable.prototype.subscribe = function (x, error, complete) { - return this._subscribe(!x || typeof x === "function" ? { next: x, error: error, complete: complete } : x); - }; - Observable.prototype[symbolObservable] = function () { - return this; - }; - return Observable; - }()); - - var domDeps; - try { - domDeps = { - indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB, - IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange - }; - } - catch (e) { - domDeps = { indexedDB: null, IDBKeyRange: null }; - } - - function liveQuery(querier) { - var hasValue = false; - var currentValue; - var observable = new Observable(function (observer) { - var scopeFuncIsAsync = isAsyncFunction(querier); - function execute(ctx) { - var wasRootExec = beginMicroTickScope(); - try { - if (scopeFuncIsAsync) { - incrementExpectedAwaits(); - } - var rv = newScope(querier, ctx); - if (scopeFuncIsAsync) { - rv = rv.finally(decrementExpectedAwaits); - } - return rv; - } - finally { - wasRootExec && endMicroTickScope(); - } - } - var closed = false; - var abortController; - var accumMuts = {}; - var currentObs = {}; - var subscription = { - get closed() { - return closed; - }, - unsubscribe: function () { - if (closed) - return; - closed = true; - if (abortController) - abortController.abort(); - if (startedListening) - globalEvents.storagemutated.unsubscribe(mutationListener); - }, - }; - observer.start && observer.start(subscription); - var startedListening = false; - var doQuery = function () { return execInGlobalContext(_doQuery); }; - function shouldNotify() { - return obsSetsOverlap(currentObs, accumMuts); - } - var mutationListener = function (parts) { - extendObservabilitySet(accumMuts, parts); - if (shouldNotify()) { - doQuery(); - } - }; - var _doQuery = function () { - if (closed || - !domDeps.indexedDB) - { - return; - } - accumMuts = {}; - var subscr = {}; - if (abortController) - abortController.abort(); - abortController = new AbortController(); - var ctx = { - subscr: subscr, - signal: abortController.signal, - requery: doQuery, - querier: querier, - trans: null - }; - var ret = execute(ctx); - Promise.resolve(ret).then(function (result) { - hasValue = true; - currentValue = result; - if (closed || ctx.signal.aborted) { - return; - } - accumMuts = {}; - currentObs = subscr; - if (!objectIsEmpty(currentObs) && !startedListening) { - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener); - startedListening = true; - } - execInGlobalContext(function () { return !closed && observer.next && observer.next(result); }); - }, function (err) { - hasValue = false; - if (!['DatabaseClosedError', 'AbortError'].includes(err === null || err === void 0 ? void 0 : err.name)) { - if (!closed) - execInGlobalContext(function () { - if (closed) - return; - observer.error && observer.error(err); - }); - } - }); - }; - setTimeout(doQuery, 0); - return subscription; - }); - observable.hasValue = function () { return hasValue; }; - observable.getValue = function () { return currentValue; }; - return observable; - } - - var Dexie = Dexie$1; - props(Dexie, __assign(__assign({}, fullNameExceptions), { - delete: function (databaseName) { - var db = new Dexie(databaseName, { addons: [] }); - return db.delete(); - }, - exists: function (name) { - return new Dexie(name, { addons: [] }).open().then(function (db) { - db.close(); - return true; - }).catch('NoSuchDatabaseError', function () { return false; }); - }, - getDatabaseNames: function (cb) { - try { - return getDatabaseNames(Dexie.dependencies).then(cb); - } - catch (_a) { - return rejection(new exceptions.MissingAPI()); - } - }, - defineClass: function () { - function Class(content) { - extend(this, content); - } - return Class; - }, ignoreTransaction: function (scopeFunc) { - return PSD.trans ? - usePSD(PSD.transless, scopeFunc) : - scopeFunc(); - }, vip: vip, async: function (generatorFn) { - return function () { - try { - var rv = awaitIterator(generatorFn.apply(this, arguments)); - if (!rv || typeof rv.then !== 'function') - return DexiePromise.resolve(rv); - return rv; - } - catch (e) { - return rejection(e); - } - }; - }, spawn: function (generatorFn, args, thiz) { - try { - var rv = awaitIterator(generatorFn.apply(thiz, args || [])); - if (!rv || typeof rv.then !== 'function') - return DexiePromise.resolve(rv); - return rv; - } - catch (e) { - return rejection(e); - } - }, - currentTransaction: { - get: function () { return PSD.trans || null; } - }, waitFor: function (promiseOrFunction, optionalTimeout) { - var promise = DexiePromise.resolve(typeof promiseOrFunction === 'function' ? - Dexie.ignoreTransaction(promiseOrFunction) : - promiseOrFunction) - .timeout(optionalTimeout || 60000); - return PSD.trans ? - PSD.trans.waitFor(promise) : - promise; - }, - Promise: DexiePromise, - debug: { - get: function () { return debug; }, - set: function (value) { - setDebug(value); - } - }, - derive: derive, extend: extend, props: props, override: override, - Events: Events, on: globalEvents, liveQuery: liveQuery, extendObservabilitySet: extendObservabilitySet, - getByKeyPath: getByKeyPath, setByKeyPath: setByKeyPath, delByKeyPath: delByKeyPath, shallowClone: shallowClone, deepClone: deepClone, getObjectDiff: getObjectDiff, cmp: cmp, asap: asap$1, - minKey: minKey, - addons: [], - connections: connections, - errnames: errnames, - dependencies: domDeps, cache: cache, - semVer: DEXIE_VERSION, version: DEXIE_VERSION.split('.') - .map(function (n) { return parseInt(n); }) - .reduce(function (p, c, i) { return p + (c / Math.pow(10, i * 2)); }) })); - Dexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange); - - if (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') { - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (updatedParts) { - if (!propagatingLocally) { - var event_1; - event_1 = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, { - detail: updatedParts - }); - propagatingLocally = true; - dispatchEvent(event_1); - propagatingLocally = false; - } - }); - addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, function (_a) { - var detail = _a.detail; - if (!propagatingLocally) { - propagateLocally(detail); - } - }); - } - function propagateLocally(updateParts) { - var wasMe = propagatingLocally; - try { - propagatingLocally = true; - globalEvents.storagemutated.fire(updateParts); - signalSubscribersNow(updateParts, true); - } - finally { - propagatingLocally = wasMe; - } - } - var propagatingLocally = false; - - var bc; - var createBC = function () { }; - if (typeof BroadcastChannel !== 'undefined') { - createBC = function () { - bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME); - bc.onmessage = function (ev) { return ev.data && propagateLocally(ev.data); }; - }; - createBC(); - if (typeof bc.unref === 'function') { - bc.unref(); - } - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (changedParts) { - if (!propagatingLocally) { - bc.postMessage(changedParts); - } - }); - } - - if (typeof addEventListener !== 'undefined') { - addEventListener('pagehide', function (event) { - if (!Dexie$1.disableBfCache && event.persisted) { - if (debug) - console.debug('Dexie: handling persisted pagehide'); - bc === null || bc === void 0 ? void 0 : bc.close(); - for (var _i = 0, connections_1 = connections; _i < connections_1.length; _i++) { - var db = connections_1[_i]; - db.close({ disableAutoOpen: false }); - } - } - }); - addEventListener('pageshow', function (event) { - if (!Dexie$1.disableBfCache && event.persisted) { - if (debug) - console.debug('Dexie: handling persisted pageshow'); - createBC(); - propagateLocally({ all: new RangeSet(-Infinity, [[]]) }); - } - }); - } - - function add(value) { - return new PropModification({ add: value }); - } - - function remove(value) { - return new PropModification({ remove: value }); - } - - function replacePrefix(a, b) { - return new PropModification({ replacePrefix: [a, b] }); - } - - DexiePromise.rejectionMapper = mapError; - setDebug(debug); - - var namedExports = /*#__PURE__*/Object.freeze({ - __proto__: null, - Dexie: Dexie$1, - liveQuery: liveQuery, - Entity: Entity, - cmp: cmp, - PropModSymbol: PropModSymbol, - PropModification: PropModification, - replacePrefix: replacePrefix, - add: add, - remove: remove, - 'default': Dexie$1, - RangeSet: RangeSet, - mergeRanges: mergeRanges, - rangesOverlap: rangesOverlap - }); - - __assign(Dexie$1, namedExports, { default: Dexie$1 }); - - return Dexie$1; - -})); -//# sourceMappingURL=dexie.js.map diff --git a/src/dexie/dist/dexie.js.map b/src/dexie/dist/dexie.js.map deleted file mode 100644 index 29172da0a..000000000 --- a/src/dexie/dist/dexie.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dexie.js","sources":["../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.es6.js","../src/globals/global.ts","../src/functions/utils.ts","../src/errors/errors.js","../src/functions/chaining-functions.js","../src/helpers/debug.ts","../src/helpers/promise.js","../src/functions/temp-transaction.ts","../src/globals/constants.ts","../src/functions/combine.ts","../src/dbcore/keyrange.ts","../src/functions/workaround-undefined-primkey.ts","../src/classes/entity/Entity.ts","../src/functions/cmp.ts","../src/classes/table/table.ts","../src/helpers/Events.js","../src/functions/make-class-constructor.ts","../src/classes/table/table-constructor.ts","../src/classes/collection/collection-helpers.ts","../src/helpers/prop-modification.ts","../src/classes/collection/collection.ts","../src/classes/collection/collection-constructor.ts","../src/functions/compare-functions.ts","../src/classes/where-clause/where-clause-helpers.ts","../src/classes/where-clause/where-clause.ts","../src/classes/where-clause/where-clause-constructor.ts","../src/functions/event-wrappers.ts","../src/globals/global-events.ts","../src/classes/transaction/transaction.ts","../src/classes/transaction/transaction-constructor.ts","../src/helpers/index-spec.ts","../src/helpers/table-schema.ts","../src/functions/quirks.ts","../src/dbcore/get-key-extractor.ts","../src/dbcore/dbcore-indexeddb.ts","../src/classes/dexie/generate-middleware-stacks.ts","../src/classes/version/schema-helpers.ts","../src/classes/version/version.ts","../src/classes/version/version-constructor.ts","../src/helpers/database-enumerator.ts","../src/classes/dexie/vip.ts","../node_modules/.pnpm/safari-14-idb-fix@3.0.0/node_modules/safari-14-idb-fix/dist/index.js","../src/helpers/rangeset.ts","../src/live-query/extend-observability-set.ts","../src/live-query/obs-sets-overlap.ts","../src/live-query/cache/cache.ts","../src/live-query/cache/signalSubscribers.ts","../src/classes/dexie/dexie-open.ts","../src/helpers/yield-support.ts","../src/classes/dexie/transaction-helpers.ts","../src/dbcore/virtual-index-middleware.ts","../src/functions/get-object-diff.ts","../src/dbcore/get-effective-keys.ts","../src/hooks/hooks-middleware.ts","../src/dbcore/cache-existing-values-middleware.ts","../src/live-query/cache/is-cachable-context.ts","../src/live-query/cache/is-cachable-request.ts","../src/live-query/observability-middleware.ts","../src/live-query/cache/adjust-optimistic-request-from-failures.ts","../src/live-query/cache/is-within-range.ts","../src/live-query/cache/apply-optimistic-ops.ts","../src/live-query/cache/are-ranges-equal.ts","../src/live-query/cache/is-super-range.ts","../src/live-query/cache/find-compatible-query.ts","../src/live-query/cache/subscribe-cachentry.ts","../src/live-query/cache/cache-middleware.ts","../src/helpers/vipify.ts","../src/classes/dexie/dexie.ts","../src/classes/observable/observable.ts","../src/classes/dexie/dexie-dom-dependencies.ts","../src/live-query/live-query.ts","../src/classes/dexie/dexie-static-props.ts","../src/live-query/propagate-locally.ts","../src/live-query/enable-broadcast.ts","../src/support-bfcache.ts","../src/functions/propmods/add.ts","../src/functions/propmods/remove.ts","../src/functions/propmods/replace-prefix.ts","../src/index.ts","../src/index-umd.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","declare var global;\nexport const _global: any =\n typeof globalThis !== 'undefined' ? globalThis :\n typeof self !== 'undefined' ? self :\n typeof window !== 'undefined' ? window :\n global;\n","import { _global } from \"../globals/global\";\nexport const keys = Object.keys;\nexport const isArray = Array.isArray;\nif (typeof Promise !== 'undefined' && !_global.Promise){\n // In jsdom, this it can be the case that Promise is not put on the global object.\n // If so, we need to patch the global object for the rest of the code to work as expected.\n // Other dexie code expects Promise to be on the global object (like normal browser environments)\n _global.Promise = Promise;\n}\nexport { _global }\n\nexport function extend(obj: T, extension: X): T & X {\n if (typeof extension !== 'object') return obj as T & X;\n keys(extension).forEach(function (key) {\n obj[key] = extension[key];\n });\n return obj as T & X;\n}\n\nexport const getProto = Object.getPrototypeOf;\nexport const _hasOwn = {}.hasOwnProperty;\nexport function hasOwn(obj, prop) {\n return _hasOwn.call(obj, prop);\n}\n\nexport function props (proto, extension) {\n if (typeof extension === 'function') extension = extension(getProto(proto));\n (typeof Reflect === \"undefined\" ? keys : Reflect.ownKeys)(extension).forEach(key => {\n setProp(proto, key, extension[key]);\n });\n}\n\nexport const defineProperty = Object.defineProperty;\n\nexport function setProp(obj, prop, functionOrGetSet, options?) {\n defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, \"get\") && typeof functionOrGetSet.get === 'function' ?\n {get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true} :\n {value: functionOrGetSet, configurable: true, writable: true}, options));\n}\n\nexport function derive(Child) {\n return {\n from: function (Parent) {\n Child.prototype = Object.create(Parent.prototype);\n setProp(Child.prototype, \"constructor\", Child);\n return {\n extend: props.bind(null, Child.prototype)\n };\n }\n };\n}\n\nexport const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nexport function getPropertyDescriptor(obj, prop) {\n const pd = getOwnPropertyDescriptor(obj, prop);\n let proto;\n return pd || (proto = getProto(obj)) && getPropertyDescriptor (proto, prop);\n}\n\nconst _slice = [].slice;\nexport function slice(args, start?, end?) {\n return _slice.call(args, start, end);\n}\n\nexport function override(origFunc, overridedFactory) {\n return overridedFactory(origFunc);\n}\n\nexport function assert (b) {\n if (!b) throw new Error(\"Assertion Failed\");\n}\n\nexport function asap(fn) {\n // @ts-ignore\n if (_global.setImmediate) setImmediate(fn); else setTimeout(fn, 0);\n}\n\nexport function getUniqueArray(a) {\n return a.filter((value, index, self) => self.indexOf(value) === index);\n}\n\n/** Generate an object (hash map) based on given array.\n * @param extractor Function taking an array item and its index and returning an array of 2 items ([key, value]) to\n * instert on the resulting object for each item in the array. If this function returns a falsy value, the\n * current item wont affect the resulting object.\n */\nexport function arrayToObject (array: T[], extractor: (x:T, idx: number)=>[string, R]): {[name: string]: R} {\n return array.reduce((result, item, i) => {\n var nameAndValue = extractor(item, i);\n if (nameAndValue) result[nameAndValue[0]] = nameAndValue[1];\n return result;\n }, {});\n}\n\nexport function trycatcher(fn, reject) {\n return function () {\n try {\n fn.apply(this, arguments);\n } catch (e) {\n reject(e);\n }\n };\n}\n\nexport function tryCatch(fn: (...args: any[])=>void, onerror, args?) : void {\n try {\n fn.apply(null, args);\n } catch (ex) {\n onerror && onerror(ex);\n }\n}\n\nexport function getByKeyPath(obj, keyPath) {\n // http://www.w3.org/TR/IndexedDB/#steps-for-extracting-a-key-from-a-value-using-a-key-path\n if (typeof keyPath === 'string' && hasOwn(obj, keyPath)) return obj[keyPath]; // This line is moved from last to first for optimization purpose.\n if (!keyPath) return obj;\n if (typeof keyPath !== 'string') {\n var rv = [];\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n var val = getByKeyPath(obj, keyPath[i]);\n rv.push(val);\n }\n return rv;\n }\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var innerObj = obj[keyPath.substr(0, period)];\n return innerObj == null ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1));\n }\n return undefined;\n}\n\nexport function setByKeyPath(obj, keyPath, value) {\n if (!obj || keyPath === undefined) return;\n if ('isFrozen' in Object && Object.isFrozen(obj)) return;\n if (typeof keyPath !== 'string' && 'length' in keyPath) {\n assert(typeof value !== 'string' && 'length' in value);\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n setByKeyPath(obj, keyPath[i], value[i]);\n }\n } else {\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var currentKeyPath = keyPath.substr(0, period);\n var remainingKeyPath = keyPath.substr(period + 1);\n if (remainingKeyPath === \"\")\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) obj.splice(currentKeyPath, 1);\n else delete obj[currentKeyPath];\n } else obj[currentKeyPath] = value;\n else {\n var innerObj = obj[currentKeyPath];\n if (!innerObj || !hasOwn(obj, currentKeyPath)) innerObj = (obj[currentKeyPath] = {});\n setByKeyPath(innerObj, remainingKeyPath, value);\n }\n } else {\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(keyPath))) obj.splice(keyPath, 1);\n else delete obj[keyPath];\n } else obj[keyPath] = value;\n }\n }\n}\n\nexport function delByKeyPath(obj, keyPath) {\n if (typeof keyPath === 'string')\n setByKeyPath(obj, keyPath, undefined);\n else if ('length' in keyPath)\n [].map.call(keyPath, function(kp) {\n setByKeyPath(obj, kp, undefined);\n });\n}\n\nexport function shallowClone(obj) {\n var rv = {};\n for (var m in obj) {\n if (hasOwn(obj, m)) rv[m] = obj[m];\n }\n return rv;\n}\n\nconst concat = [].concat;\nexport function flatten (a: (T | T[])[]) : T[] {\n return concat.apply([], a);\n}\n\n//https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm\nconst intrinsicTypeNames =\n \"BigUint64Array,BigInt64Array,Array,Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,FileSystemDirectoryHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey\"\n .split(',').concat(\n flatten([8,16,32,64].map(num=>[\"Int\",\"Uint\",\"Float\"].map(t=>t+num+\"Array\")))\n ).filter(t=>_global[t]);\nconst intrinsicTypes = new Set(intrinsicTypeNames.map(t=>_global[t]));\n\n/** Deep clone a simple object tree.\n * \n * Copies object tree deeply, but does not deep-copy arrays,\n * typed arrays, Dates or other intrinsic types.\n * \n * Does not check for cyclic references.\n * \n * This function is 6 times faster than structuredClone() on chromium 111.\n * \n * This function can safely be used for cloning ObservabilitySets and RangeSets.\n * \n * @param o Object to clone\n * @returns Cloned object\n */\nexport function cloneSimpleObjectTree(o: T): T {\n const rv = {} as T;\n for (const k in o) if (hasOwn(o, k)) {\n const v = o[k];\n rv[k] = !v || typeof v !== 'object' || intrinsicTypes.has(v.constructor) ? v : cloneSimpleObjectTree(v);\n }\n return rv;\n}\n\nexport function objectIsEmpty(o: object) {\n for (const k in o) if (hasOwn(o, k)) return false;\n return true;\n}\n\nlet circularRefs: null | WeakMap = null;\n\n/** Deep clone an object or array.\n * \n * \n * @param any \n * @returns \n */\nexport function deepClone(any: T): T {\n circularRefs = new WeakMap();\n const rv = innerDeepClone(any);\n circularRefs = null;\n return rv;\n}\n\nfunction innerDeepClone(x: T): T {\n if (!x || typeof x !== 'object') return x;\n let rv = circularRefs.get(x); // Resolve circular references\n if (rv) return rv;\n if (isArray(x)) {\n rv = [];\n circularRefs.set(x, rv);\n for (var i = 0, l = x.length; i < l; ++i) {\n rv.push(innerDeepClone(x[i]));\n }\n } else if (intrinsicTypes.has(x.constructor)) {\n // For performance, we're less strict than structuredClone - we're only\n // cloning arrays and custom objects.\n // Typed arrays, Dates etc are not cloned.\n rv = x;\n } else {\n // We're nicer to custom classes than what structuredClone() is -\n // we preserve the proto of each object.\n const proto = getProto(x);\n rv = proto === Object.prototype ? {} : Object.create(proto);\n circularRefs.set(x, rv);\n for (var prop in x) {\n if (hasOwn(x, prop)) {\n rv[prop] = innerDeepClone(x[prop]);\n }\n }\n }\n return rv;\n}\n\nconst {toString} = {};\nexport function toStringTag(o: Object) {\n return toString.call(o).slice(8, -1);\n}\n\n// If first argument is iterable or array-like, return it as an array\nexport const iteratorSymbol = typeof Symbol !== 'undefined' ?\n Symbol.iterator :\n '@@iterator';\nexport const getIteratorOf = typeof iteratorSymbol === \"symbol\" ? function(x) {\n var i;\n return x != null && (i = x[iteratorSymbol]) && i.apply(x);\n} : function () { return null; };\nexport const asyncIteratorSymbol = typeof Symbol !== 'undefined'\n ? Symbol.asyncIterator || Symbol.for(\"Symbol.asyncIterator\")\n : '@asyncIterator';\n\nexport function delArrayItem(a: any[], x: any) {\n const i = a.indexOf(x);\n if (i >= 0) a.splice(i, 1);\n return i >= 0;\n}\n\nexport const NO_CHAR_ARRAY = {};\n// Takes one or several arguments and returns an array based on the following criteras:\n// * If several arguments provided, return arguments converted to an array in a way that\n// still allows javascript engine to optimize the code.\n// * If single argument is an array, return a clone of it.\n// * If this-pointer equals NO_CHAR_ARRAY, don't accept strings as valid iterables as a special\n// case to the two bullets below.\n// * If single argument is an iterable, convert it to an array and return the resulting array.\n// * If single argument is array-like (has length of type number), convert it to an array.\nexport function getArrayOf (arrayLike) {\n var i, a, x, it;\n if (arguments.length === 1) {\n if (isArray(arrayLike)) return arrayLike.slice();\n if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') return [arrayLike];\n if ((it = getIteratorOf(arrayLike))) {\n a = [];\n while ((x = it.next()), !x.done) a.push(x.value);\n return a;\n }\n if (arrayLike == null) return [arrayLike];\n i = arrayLike.length;\n if (typeof i === 'number') {\n a = new Array(i);\n while (i--) a[i] = arrayLike[i];\n return a;\n }\n return [arrayLike];\n }\n i = arguments.length;\n a = new Array(i);\n while (i--) a[i] = arguments[i];\n return a;\n}\nexport const isAsyncFunction = typeof Symbol !== 'undefined'\n ? (fn: Function) => fn[Symbol.toStringTag] === 'AsyncFunction'\n : ()=>false;\n","import { derive, setProp } from '../functions/utils';\n\nvar dexieErrorNames = [\n 'Modify',\n 'Bulk',\n 'OpenFailed',\n 'VersionChange',\n 'Schema',\n 'Upgrade',\n 'InvalidTable',\n 'MissingAPI',\n 'NoSuchDatabase',\n 'InvalidArgument',\n 'SubTransaction',\n 'Unsupported',\n 'Internal',\n 'DatabaseClosed',\n 'PrematureCommit',\n 'ForeignAwait'\n];\n\nvar idbDomErrorNames = [\n 'Unknown',\n 'Constraint',\n 'Data',\n 'TransactionInactive',\n 'ReadOnly',\n 'Version',\n 'NotFound',\n 'InvalidState',\n 'InvalidAccess',\n 'Abort',\n 'Timeout',\n 'QuotaExceeded',\n 'Syntax',\n 'DataClone'\n];\n\nvar errorList = dexieErrorNames.concat(idbDomErrorNames);\n\nvar defaultTexts = {\n VersionChanged: \"Database version changed by other database connection\",\n DatabaseClosed: \"Database has been closed\",\n Abort: \"Transaction aborted\",\n TransactionInactive: \"Transaction has already completed or failed\",\n MissingAPI: \"IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb\"\n};\n\n//\n// DexieError - base class of all out exceptions.\n//\nexport function DexieError (name, msg) {\n // Reason we don't use ES6 classes is because:\n // 1. It bloats transpiled code and increases size of minified code.\n // 2. It doesn't give us much in this case.\n // 3. It would require sub classes to call super(), which\n // is not needed when deriving from Error.\n this.name = name;\n this.message = msg;\n}\n\nderive(DexieError).from(Error).extend({\n toString: function(){ return this.name + \": \" + this.message; }\n});\n\nfunction getMultiErrorMessage (msg, failures) {\n return msg + \". Errors: \" + Object.keys(failures)\n .map(key=>failures[key].toString())\n .filter((v,i,s)=>s.indexOf(v) === i) // Only unique error strings\n .join('\\n');\n}\n\n//\n// ModifyError - thrown in Collection.modify()\n// Specific constructor because it contains members failures and failedKeys.\n//\nexport function ModifyError (msg, failures, successCount, failedKeys) {\n this.failures = failures;\n this.failedKeys = failedKeys;\n this.successCount = successCount;\n this.message = getMultiErrorMessage(msg, failures);\n}\nderive(ModifyError).from(DexieError);\n\nexport function BulkError (msg, failures) {\n this.name = \"BulkError\";\n this.failures = Object.keys(failures).map(pos => failures[pos]);\n this.failuresByPos = failures;\n this.message = getMultiErrorMessage(msg, this.failures);\n}\nderive(BulkError).from(DexieError);\n\n//\n//\n// Dynamically generate error names and exception classes based\n// on the names in errorList.\n//\n//\n\n// Map of {ErrorName -> ErrorName + \"Error\"}\nexport var errnames = errorList.reduce((obj,name)=>(obj[name]=name+\"Error\",obj),{});\n\n// Need an alias for DexieError because we're gonna create subclasses with the same name.\nconst BaseException = DexieError;\n// Map of {ErrorName -> exception constructor}\nexport var exceptions = errorList.reduce((obj,name)=>{\n // Let the name be \"DexieError\" because this name may\n // be shown in call stack and when debugging. DexieError is\n // the most true name because it derives from DexieError,\n // and we cannot change Function.name programatically without\n // dynamically create a Function object, which would be considered\n // 'eval-evil'.\n var fullName = name + \"Error\";\n function DexieError (msgOrInner, inner){\n this.name = fullName;\n if (!msgOrInner) {\n this.message = defaultTexts[name] || fullName;\n this.inner = null;\n } else if (typeof msgOrInner === 'string') {\n this.message = `${msgOrInner}${!inner ? '' : '\\n ' + inner}`;\n this.inner = inner || null;\n } else if (typeof msgOrInner === 'object') {\n this.message = `${msgOrInner.name} ${msgOrInner.message}`;\n this.inner = msgOrInner;\n }\n }\n derive(DexieError).from(BaseException);\n obj[name]=DexieError;\n return obj;\n},{});\n\n// Use ECMASCRIPT standard exceptions where applicable:\nexceptions.Syntax = SyntaxError;\nexceptions.Type = TypeError;\nexceptions.Range = RangeError;\n\nexport var exceptionMap = idbDomErrorNames.reduce((obj, name)=>{\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nexport function mapError (domError, message) {\n if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name])\n return domError;\n var rv = new exceptionMap[domError.name](message || domError.message, domError);\n if (\"stack\" in domError) {\n // Derive stack from inner exception if it has a stack\n setProp(rv, \"stack\", {get: function(){\n return this.inner.stack;\n }});\n }\n return rv;\n}\n\nexport var fullNameExceptions = errorList.reduce((obj, name)=>{\n if ([\"Syntax\",\"Type\",\"Range\"].indexOf(name) === -1)\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nfullNameExceptions.ModifyError = ModifyError;\nfullNameExceptions.DexieError = DexieError;\nfullNameExceptions.BulkError = BulkError;\n","import {extend} from './utils';\n\nexport function nop() { }\nexport function mirror(val) { return val; }\nexport function pureFunctionChain(f1, f2) {\n // Enables chained events that takes ONE argument and returns it to the next function in chain.\n // This pattern is used in the hook(\"reading\") event.\n if (f1 == null || f1 === mirror) return f2;\n return function (val) {\n return f2(f1(val));\n };\n}\n\nexport function callBoth(on1, on2) {\n return function () {\n on1.apply(this, arguments);\n on2.apply(this, arguments);\n };\n}\n\nexport function hookCreatingChain(f1, f2) {\n // Enables chained events that takes several arguments and may modify first argument by making a modification and then returning the same instance.\n // This pattern is used in the hook(\"creating\") event.\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res !== undefined) arguments[0] = res;\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res2 !== undefined ? res2 : res;\n };\n}\n\nexport function hookDeletingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = this.onerror = null;\n f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n };\n}\n\nexport function hookUpdatingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function (modifications) {\n var res = f1.apply(this, arguments);\n extend(modifications, res); // If f1 returns new modifications, extend caller's modifications with the result before calling next in chain.\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res === undefined ?\n (res2 === undefined ? undefined : res2) :\n (extend(res, res2));\n };\n}\n\nexport function reverseStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n if (f2.apply(this, arguments) === false) return false;\n return f1.apply(this, arguments);\n };\n}\n\nexport function nonStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n f2.apply(this, arguments);\n };\n}\n\nexport function promisableChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res && typeof res.then === 'function') {\n var thiz = this,\n i = arguments.length,\n args = new Array(i);\n while (i--) args[i] = arguments[i];\n return res.then(function () {\n return f2.apply(thiz, args);\n });\n }\n return f2.apply(this, arguments);\n };\n}\n","// By default, debug will be true only if platform is a web platform and its page is served from localhost.\n// When debug = true, error's stacks will contain asyncronic long stacks.\nexport var debug = typeof location !== 'undefined' &&\n // By default, use debug mode if served from localhost.\n /^(http|https):\\/\\/(localhost|127\\.0\\.0\\.1)/.test(location.href);\n\nexport function setDebug(value, filter) {\n debug = value;\n}\n\nexport function deprecated (what: string, fn: (...args)=>T) {\n return function () {\n console.warn(`${what} is deprecated. See https://dexie.org/docs/Deprecations}`);\n return fn.apply(this, arguments);\n } as (...args)=>T\n}\n","/*\n * Copyright (c) 2014-2017 David Fahlander\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/LICENSE-2.0\n */\nimport { _global } from '../globals/global';\nimport {tryCatch, props, setProp,\n getPropertyDescriptor, getArrayOf, extend, getProto} from '../functions/utils';\nimport {nop, callBoth, mirror} from '../functions/chaining-functions';\nimport {debug} from './debug';\nimport {exceptions} from '../errors';\n\n//\n// Promise and Zone (PSD) for Dexie library\n//\n// I started out writing this Promise class by copying promise-light (https://github.com/taylorhakes/promise-light) by\n// https://github.com/taylorhakes - an A+ and ECMASCRIPT 6 compliant Promise implementation.\n//\n// In previous versions this was fixed by not calling setTimeout when knowing that the resolve() or reject() came from another\n// tick. In Dexie v1.4.0, I've rewritten the Promise class entirely. Just some fragments of promise-light is left. I use\n// another strategy now that simplifies everything a lot: to always execute callbacks in a new micro-task, but have an own micro-task\n// engine that is indexedDB compliant across all browsers.\n// Promise class has also been optimized a lot with inspiration from bluebird - to avoid closures as much as possible.\n//\n// Specific non-standard features of this Promise class:\n// * Custom zone support (a.k.a. PSD) with ability to keep zones also when using native promises as well as\n// native async / await.\n// * Promise.follow() method built upon the custom zone engine, that allows user to track all promises created from current stack frame\n// and below + all promises that those promises creates or awaits.\n// * Detect any unhandled promise in a PSD-scope (PSD.onunhandled). \n//\n// David Fahlander, https://github.com/dfahlander\n//\n\n// Just a pointer that only this module knows about.\n// Used in Promise constructor to emulate a private constructor.\nvar INTERNAL = {};\n\nconst\n ZONE_ECHO_LIMIT = 100,\n [resolvedNativePromise, nativePromiseProto, resolvedGlobalPromise] = typeof Promise === 'undefined' ?\n [] :\n (()=>{\n let globalP = Promise.resolve();\n if (typeof crypto === 'undefined' || !crypto.subtle)\n return [globalP, getProto(globalP), globalP];\n // Generate a native promise (as window.Promise may have been patched)\n const nativeP = crypto.subtle.digest(\"SHA-512\", new Uint8Array([0]));\n return [\n nativeP,\n getProto(nativeP),\n globalP\n ];\n })(),\n nativePromiseThen = nativePromiseProto && nativePromiseProto.then;\n\nexport const NativePromise = resolvedNativePromise && resolvedNativePromise.constructor;\nconst patchGlobalPromise = !!resolvedGlobalPromise;\n\n/* The default function used only for the very first promise in a promise chain.\n As soon as then promise is resolved or rejected, all next tasks will be executed in micro ticks\n emulated in this module. For indexedDB compatibility, this means that every method needs to \n execute at least one promise before doing an indexedDB operation. Dexie will always call \n db.ready().then() for every operation to make sure the indexedDB event is started in an\n indexedDB-compatible emulated micro task loop.\n*/\nfunction schedulePhysicalTick() {\n queueMicrotask(physicalTick);\n}\n\n// Configurable through Promise.scheduler.\n// Don't export because it would be unsafe to let unknown\n// code call it unless they do try..catch within their callback.\n// This function can be retrieved through getter of Promise.scheduler though,\n// but users must not do Promise.scheduler = myFuncThatThrowsException\nvar asap = function (callback, args) {\n microtickQueue.push([callback, args]);\n if (needsNewPhysicalTick) {\n schedulePhysicalTick();\n needsNewPhysicalTick = false;\n }\n};\n\nvar isOutsideMicroTick = true, // True when NOT in a virtual microTick.\n needsNewPhysicalTick = true, // True when a push to microtickQueue must also schedulePhysicalTick()\n unhandledErrors = [], // Rejected promises that has occured. Used for triggering 'unhandledrejection'.\n rejectingErrors = [], // Tracks if errors are being re-rejected during onRejected callback.\n rejectionMapper = mirror; // Remove in next major when removing error mapping of DOMErrors and DOMExceptions\n \nexport var globalPSD = {\n id: 'global',\n global: true,\n ref: 0,\n unhandleds: [],\n onunhandled: nop,\n pgp: false,\n env: {},\n finalize: nop\n};\n\nexport var PSD = globalPSD;\n\nexport var microtickQueue = []; // Callbacks to call in this or next physical tick.\nexport var numScheduledCalls = 0; // Number of listener-calls left to do in this physical tick.\nexport var tickFinalizers = []; // Finalizers to call when there are no more async calls scheduled within current physical tick.\n\nexport default function DexiePromise(fn) {\n if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); \n this._listeners = [];\n \n // A library may set `promise._lib = true;` after promise is created to make resolve() or reject()\n // execute the microtask engine implicitely within the call to resolve() or reject().\n // To remain A+ compliant, a library must only set `_lib=true` if it can guarantee that the stack\n // only contains library code when calling resolve() or reject().\n // RULE OF THUMB: ONLY set _lib = true for promises explicitely resolving/rejecting directly from\n // global scope (event handler, timer etc)!\n this._lib = false;\n // Current async scope\n var psd = (this._PSD = PSD);\n \n if (typeof fn !== 'function') {\n if (fn !== INTERNAL) throw new TypeError('Not a function');\n // Private constructor (INTERNAL, state, value).\n // Used internally by Promise.resolve() and Promise.reject().\n this._state = arguments[1];\n this._value = arguments[2];\n if (this._state === false)\n handleRejection(this, this._value); // Map error, set stack and addPossiblyUnhandledError().\n return;\n }\n \n this._state = null; // null (=pending), false (=rejected) or true (=resolved)\n this._value = null; // error or result\n ++psd.ref; // Refcounting current scope\n executePromiseTask(this, fn);\n}\n\n// Prepare a property descriptor to put onto Promise.prototype.then\nconst thenProp = {\n get: function() {\n var psd = PSD, microTaskId = totalEchoes;\n\n function then (onFulfilled, onRejected) {\n var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes);\n const cleanup = possibleAwait && !decrementExpectedAwaits();\n var rv = new DexiePromise((resolve, reject) => {\n propagateToListener(this, new Listener(\n nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup),\n nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup),\n resolve,\n reject,\n psd));\n });\n if (this._consoleTask) rv._consoleTask = this._consoleTask;\n return rv;\n }\n\n then.prototype = INTERNAL; // For idempotense, see setter below.\n\n return then;\n },\n // Be idempotent and allow another framework (such as zone.js or another instance of a Dexie.Promise module) to replace Promise.prototype.then\n // and when that framework wants to restore the original property, we must identify that and restore the original property descriptor.\n set: function (value) {\n setProp (this, 'then', value && value.prototype === INTERNAL ?\n thenProp : // Restore to original property descriptor.\n {\n get: function(){\n return value; // Getter returning provided value (behaves like value is just changed)\n },\n set: thenProp.set // Keep a setter that is prepared to restore original.\n }\n );\n }\n};\n\nprops(DexiePromise.prototype, {\n then: thenProp, // Defined above.\n _then: function (onFulfilled, onRejected) {\n // A little tinier version of then() that don't have to create a resulting promise.\n propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); \n },\n\n catch: function (onRejected) {\n if (arguments.length === 1) return this.then(null, onRejected);\n // First argument is the Error type to catch\n var type = arguments[0],\n handler = arguments[1];\n return typeof type === 'function' ? this.then(null, err =>\n // Catching errors by its constructor type (similar to java / c++ / c#)\n // Sample: promise.catch(TypeError, function (e) { ... });\n err instanceof type ? handler(err) : PromiseReject(err))\n : this.then(null, err =>\n // Catching errors by the error.name property. Makes sense for indexedDB where error type\n // is always DOMError but where e.name tells the actual error type.\n // Sample: promise.catch('ConstraintError', function (e) { ... });\n err && err.name === type ? handler(err) : PromiseReject(err));\n },\n\n finally: function (onFinally) {\n return this.then(value => {\n return DexiePromise.resolve(onFinally()).then(()=>value);\n }, err => {\n return DexiePromise.resolve(onFinally()).then(()=>PromiseReject(err));\n });\n },\n \n timeout: function (ms, msg) {\n return ms < Infinity ?\n new DexiePromise((resolve, reject) => {\n var handle = setTimeout(() => reject(new exceptions.Timeout(msg)), ms);\n this.then(resolve, reject).finally(clearTimeout.bind(null, handle));\n }) : this;\n }\n});\n\nif (typeof Symbol !== 'undefined' && Symbol.toStringTag)\n setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise');\n\n// Now that Promise.prototype is defined, we have all it takes to set globalPSD.env.\n// Environment globals snapshotted on leaving global zone\nglobalPSD.env = snapShot();\n\nfunction Listener(onFulfilled, onRejected, resolve, reject, zone) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.resolve = resolve;\n this.reject = reject;\n this.psd = zone;\n}\n\n// Promise Static Properties\nprops (DexiePromise, {\n all: function () {\n var values = getArrayOf.apply(null, arguments) // Supports iterables, implicit arguments and array-like.\n .map(onPossibleParallellAsync); // Handle parallell async/awaits \n return new DexiePromise(function (resolve, reject) {\n if (values.length === 0) resolve([]);\n var remaining = values.length;\n values.forEach((a,i) => DexiePromise.resolve(a).then(x => {\n values[i] = x;\n if (!--remaining) resolve(values);\n }, reject));\n });\n },\n \n resolve: value => {\n if (value instanceof DexiePromise) return value;\n if (value && typeof value.then === 'function') return new DexiePromise((resolve, reject)=>{\n value.then(resolve, reject);\n });\n var rv = new DexiePromise(INTERNAL, true, value);\n return rv;\n },\n \n reject: PromiseReject,\n \n race: function () {\n var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n values.map(value => DexiePromise.resolve(value).then(resolve, reject));\n });\n },\n\n PSD: {\n get: ()=>PSD,\n set: value => PSD = value\n },\n\n totalEchoes: {get: ()=>totalEchoes},\n\n //task: {get: ()=>task},\n \n newPSD: newScope,\n \n usePSD: usePSD,\n \n scheduler: {\n get: () => asap,\n set: value => {asap = value}\n },\n \n rejectionMapper: {\n get: () => rejectionMapper,\n set: value => {rejectionMapper = value;} // Map reject failures\n },\n \n follow: (fn, zoneProps) => {\n return new DexiePromise((resolve, reject) => {\n return newScope((resolve, reject) => {\n var psd = PSD;\n psd.unhandleds = []; // For unhandled standard- or 3rd party Promises. Checked at psd.finalize()\n psd.onunhandled = reject; // Triggered directly on unhandled promises of this library.\n psd.finalize = callBoth(function () {\n // Unhandled standard or 3rd part promises are put in PSD.unhandleds and\n // examined upon scope completion while unhandled rejections in this Promise\n // will trigger directly through psd.onunhandled\n run_at_end_of_this_or_next_physical_tick(()=>{\n this.unhandleds.length === 0 ? resolve() : reject(this.unhandleds[0]);\n });\n }, psd.finalize);\n fn();\n }, zoneProps, resolve, reject);\n });\n }\n});\n\nif (NativePromise) {\n if (NativePromise.allSettled) setProp (DexiePromise, \"allSettled\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise(resolve => {\n if (possiblePromises.length === 0) resolve([]);\n let remaining = possiblePromises.length;\n const results = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => results[i] = {status: \"fulfilled\", value},\n reason => results[i] = {status: \"rejected\", reason})\n .then(()=>--remaining || resolve(results)));\n });\n });\n if (NativePromise.any && typeof AggregateError !== 'undefined') setProp(DexiePromise, \"any\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n if (possiblePromises.length === 0) reject(new AggregateError([]));\n let remaining = possiblePromises.length;\n const failures = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => resolve(value),\n failure => {\n failures[i] = failure;\n if (!--remaining) reject(new AggregateError(failures));\n }));\n });\n });\n}\n\n/**\n* Take a potentially misbehaving resolver function and make sure\n* onFulfilled and onRejected are only called once.\n*\n* Makes no guarantees about asynchrony.\n*/\nfunction executePromiseTask (promise, fn) {\n // Promise Resolution Procedure:\n // https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n try {\n fn(value => {\n if (promise._state !== null) return; // Already settled\n if (value === promise) throw new TypeError('A promise cannot be resolved with itself.');\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n if (value && typeof value.then === 'function') {\n executePromiseTask(promise, (resolve, reject) => {\n value instanceof DexiePromise ?\n value._then(resolve, reject) :\n value.then(resolve, reject);\n });\n } else {\n promise._state = true;\n promise._value = value;\n propagateAllListeners(promise);\n }\n if (shouldExecuteTick) endMicroTickScope();\n }, handleRejection.bind(null, promise)); // If Function.bind is not supported. Exception is handled in catch below\n } catch (ex) {\n handleRejection(promise, ex);\n }\n}\n\nfunction handleRejection (promise, reason) {\n rejectingErrors.push(reason);\n if (promise._state !== null) return;\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n reason = rejectionMapper(reason);\n promise._state = false;\n promise._value = reason;\n // Add the failure to a list of possibly uncaught errors\n addPossiblyUnhandledError(promise);\n propagateAllListeners(promise);\n if (shouldExecuteTick) endMicroTickScope();\n}\n\nfunction propagateAllListeners (promise) {\n //debug && linkToPreviousPromise(promise);\n var listeners = promise._listeners;\n promise._listeners = [];\n for (var i = 0, len = listeners.length; i < len; ++i) {\n propagateToListener(promise, listeners[i]);\n }\n var psd = promise._PSD;\n --psd.ref || psd.finalize(); // if psd.ref reaches zero, call psd.finalize();\n if (numScheduledCalls === 0) {\n // If numScheduledCalls is 0, it means that our stack is not in a callback of a scheduled call,\n // and that no deferreds where listening to this rejection or success.\n // Since there is a risk that our stack can contain application code that may\n // do stuff after this code is finished that may generate new calls, we cannot\n // call finalizers here.\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick(); // Will detect unhandled errors\n }, []);\n }\n}\n\nfunction propagateToListener(promise, listener) {\n if (promise._state === null) {\n promise._listeners.push(listener);\n return;\n }\n\n var cb = promise._state ? listener.onFulfilled : listener.onRejected;\n if (cb === null) {\n // This Listener doesnt have a listener for the event being triggered (onFulfilled or onReject) so lets forward the event to any eventual listeners on the Promise instance returned by then() or catch()\n return (promise._state ? listener.resolve : listener.reject) (promise._value);\n }\n ++listener.psd.ref;\n ++numScheduledCalls;\n asap (callListener, [cb, promise, listener]);\n}\n\nfunction callListener (cb, promise, listener) {\n try {\n // Call callback and resolve our listener with it's return value.\n var ret, value = promise._value;\n \n if (!promise._state && rejectingErrors.length) rejectingErrors = [];\n // cb is onResolved\n ret = debug && promise._consoleTask ? promise._consoleTask.run(()=>cb (value)) : cb (value);\n if (!promise._state && rejectingErrors.indexOf(value) === -1) {\n markErrorAsHandled(promise); // Callback didnt do Promise.reject(err) nor reject(err) onto another promise.\n }\n listener.resolve(ret);\n } catch (e) {\n // Exception thrown in callback. Reject our listener.\n listener.reject(e);\n } finally {\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n --listener.psd.ref || listener.psd.finalize();\n }\n}\n\n/* The callback to schedule with queueMicrotask().\n It runs a virtual microtick and executes any callback registered in microtickQueue.\n */\nfunction physicalTick() {\n usePSD(globalPSD, ()=>{\n // Make sure to reset the async context to globalPSD before\n // executing any of the microtick subscribers.\n beginMicroTickScope() && endMicroTickScope();\n });\n}\n\nexport function beginMicroTickScope() {\n var wasRootExec = isOutsideMicroTick;\n isOutsideMicroTick = false;\n needsNewPhysicalTick = false;\n return wasRootExec;\n}\n\n/* Executes micro-ticks without doing try..catch.\n This can be possible because we only use this internally and\n the registered functions are exception-safe (they do try..catch\n internally before calling any external method). If registering\n functions in the microtickQueue that are not exception-safe, this\n would destroy the framework and make it instable. So we don't export\n our asap method.\n*/\nexport function endMicroTickScope() {\n var callbacks, i, l;\n do {\n while (microtickQueue.length > 0) {\n callbacks = microtickQueue;\n microtickQueue = [];\n l = callbacks.length;\n for (i = 0; i < l; ++i) {\n var item = callbacks[i];\n item[0].apply(null, item[1]);\n }\n }\n } while (microtickQueue.length > 0);\n isOutsideMicroTick = true;\n needsNewPhysicalTick = true;\n}\n\nfunction finalizePhysicalTick() {\n var unhandledErrs = unhandledErrors;\n unhandledErrors = [];\n unhandledErrs.forEach(p => {\n p._PSD.onunhandled.call(null, p._value, p);\n });\n var finalizers = tickFinalizers.slice(0); // Clone first because finalizer may remove itself from list.\n var i = finalizers.length;\n while (i) finalizers[--i](); \n}\n\nfunction run_at_end_of_this_or_next_physical_tick (fn) {\n function finalizer() {\n fn();\n tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1);\n }\n tickFinalizers.push(finalizer);\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n }, []);\n}\n\nfunction addPossiblyUnhandledError(promise) {\n // Only add to unhandledErrors if not already there. The first one to add to this list\n // will be upon the first rejection so that the root cause (first promise in the\n // rejection chain) is the one listed.\n if (!unhandledErrors.some(p => p._value === promise._value))\n unhandledErrors.push(promise);\n}\n\nfunction markErrorAsHandled(promise) {\n // Called when a reject handled is actually being called.\n // Search in unhandledErrors for any promise whos _value is this promise_value (list\n // contains only rejected promises, and only one item per error)\n var i = unhandledErrors.length;\n while (i) if (unhandledErrors[--i]._value === promise._value) {\n // Found a promise that failed with this same error object pointer,\n // Remove that since there is a listener that actually takes care of it.\n unhandledErrors.splice(i, 1);\n return;\n }\n}\n\nfunction PromiseReject (reason) {\n return new DexiePromise(INTERNAL, false, reason);\n}\n\nexport function wrap (fn, errorCatcher) {\n var psd = PSD;\n return function() {\n var wasRootExec = beginMicroTickScope(),\n outerScope = PSD;\n\n try {\n switchToZone(psd, true);\n return fn.apply(this, arguments);\n } catch (e) {\n errorCatcher && errorCatcher(e);\n } finally {\n switchToZone(outerScope, false);\n if (wasRootExec) endMicroTickScope();\n }\n };\n}\n\n\n//\n// variables used for native await support\n//\nconst task = { awaits: 0, echoes: 0, id: 0}; // The ongoing macro-task when using zone-echoing.\nvar taskCounter = 0; // ID counter for macro tasks.\nvar zoneStack = []; // Stack of left zones to restore asynchronically.\nvar zoneEchoes = 0; // When > 0, zoneLeaveEcho is queued. When 0 and task.echoes is also 0, nothing is queued.\nvar totalEchoes = 0; // ID counter for micro-tasks. Used to detect possible native await in our Promise.prototype.then.\n\n\nvar zone_id_counter = 0;\nexport function newScope (fn, props, a1, a2) {\n var parent = PSD,\n psd = Object.create(parent);\n psd.parent = parent;\n psd.ref = 0;\n psd.global = false;\n psd.id = ++zone_id_counter;\n // Prepare for promise patching (done in usePSD):\n var globalEnv = globalPSD.env;\n psd.env = patchGlobalPromise ? {\n Promise: DexiePromise, // Changing window.Promise could be omitted for Chrome and Edge, where IDB+Promise plays well!\n PromiseProp: {value: DexiePromise, configurable: true, writable: true},\n all: DexiePromise.all,\n race: DexiePromise.race,\n allSettled: DexiePromise.allSettled,\n any: DexiePromise.any,\n resolve: DexiePromise.resolve,\n reject: DexiePromise.reject,\n } : {};\n if (props) extend(psd, props);\n \n // unhandleds and onunhandled should not be specifically set here.\n // Leave them on parent prototype.\n // unhandleds.push(err) will push to parent's prototype\n // onunhandled() will call parents onunhandled (with this scope's this-pointer though!)\n ++parent.ref;\n psd.finalize = function () {\n --this.parent.ref || this.parent.finalize();\n }\n var rv = usePSD (psd, fn, a1, a2);\n if (psd.ref === 0) psd.finalize();\n return rv;\n}\n\n// Function to call if scopeFunc returns NativePromise\n// Also for each NativePromise in the arguments to Promise.all()\nexport function incrementExpectedAwaits() {\n if (!task.id) task.id = ++taskCounter;\n ++task.awaits;\n task.echoes += ZONE_ECHO_LIMIT;\n return task.id;\n}\n\n// Function to call when 'then' calls back on a native promise where onAwaitExpected() had been called.\n// Also call this when a native await calls then method on a promise. In that case, don't supply\n// sourceTaskId because we already know it refers to current task.\nexport function decrementExpectedAwaits() {\n if (!task.awaits) return false;\n if (--task.awaits === 0) task.id = 0;\n task.echoes = task.awaits * ZONE_ECHO_LIMIT; // Will reset echoes to 0 if awaits is 0.\n return true;\n}\n\nif ((''+nativePromiseThen).indexOf('[native code]') === -1) {\n // If the native promise' prototype is patched, we cannot rely on zone echoing.\n // Disable that here:\n incrementExpectedAwaits = decrementExpectedAwaits = nop;\n}\n\n// Call from Promise.all() and Promise.race()\nexport function onPossibleParallellAsync (possiblePromise) {\n if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) {\n incrementExpectedAwaits(); \n return possiblePromise.then(x => {\n decrementExpectedAwaits();\n return x;\n }, e => {\n decrementExpectedAwaits();\n return rejection(e);\n });\n }\n return possiblePromise;\n}\n\nfunction zoneEnterEcho(targetZone) {\n ++totalEchoes;\n //console.log(\"Total echoes \", totalEchoes);\n //if (task.echoes === 1) console.warn(\"Cancelling echoing of async context.\");\n if (!task.echoes || --task.echoes === 0) {\n task.echoes = task.awaits = task.id = 0; // Cancel echoing.\n }\n\n zoneStack.push(PSD);\n switchToZone(targetZone, true);\n}\n\nfunction zoneLeaveEcho() {\n var zone = zoneStack[zoneStack.length-1];\n zoneStack.pop();\n switchToZone(zone, false);\n}\n\nfunction switchToZone (targetZone, bEnteringZone) {\n var currentZone = PSD;\n if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) {\n // Enter or leave zone asynchronically as well, so that tasks initiated during current tick\n // will be surrounded by the zone when they are invoked.\n queueMicrotask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho);\n }\n if (targetZone === PSD) return;\n\n PSD = targetZone; // The actual zone switch occurs at this line.\n\n // Snapshot on every leave from global zone.\n if (currentZone === globalPSD) globalPSD.env = snapShot();\n\n if (patchGlobalPromise) {\n // Let's patch the global and native Promises (may be same or may be different)\n var GlobalPromise = globalPSD.env.Promise;\n // Swich environments (may be PSD-zone or the global zone. Both apply.)\n var targetEnv = targetZone.env;\n\n if (currentZone.global || targetZone.global) {\n // Leaving or entering global zone. It's time to patch / restore global Promise.\n\n // Set this Promise to window.Promise so that transiled async functions will work on Firefox, Safari and IE, as well as with Zonejs and angular.\n Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp);\n\n // Support Promise.all() etc to work indexedDB-safe also when people are including es6-promise as a module (they might\n // not be accessing global.Promise but a local reference to it)\n GlobalPromise.all = targetEnv.all;\n GlobalPromise.race = targetEnv.race;\n GlobalPromise.resolve = targetEnv.resolve;\n GlobalPromise.reject = targetEnv.reject;\n if (targetEnv.allSettled) GlobalPromise.allSettled = targetEnv.allSettled;\n if (targetEnv.any) GlobalPromise.any = targetEnv.any;\n }\n }\n}\n\nfunction snapShot () {\n var GlobalPromise = _global.Promise;\n return patchGlobalPromise ? {\n Promise: GlobalPromise,\n PromiseProp: Object.getOwnPropertyDescriptor(_global, \"Promise\"),\n all: GlobalPromise.all,\n race: GlobalPromise.race,\n allSettled: GlobalPromise.allSettled,\n any: GlobalPromise.any,\n resolve: GlobalPromise.resolve,\n reject: GlobalPromise.reject,\n } : {};\n}\n\nexport function usePSD (psd, fn, a1, a2, a3) {\n var outerScope = PSD;\n try {\n switchToZone(psd, true);\n return fn(a1, a2, a3);\n } finally {\n switchToZone(outerScope, false);\n }\n}\n\nfunction nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) {\n return typeof fn !== 'function' ? fn : function () {\n var outerZone = PSD;\n if (possibleAwait) incrementExpectedAwaits();\n switchToZone(zone, true);\n try {\n return fn.apply(this, arguments);\n } finally {\n switchToZone(outerZone, false);\n if (cleanup) queueMicrotask(decrementExpectedAwaits);\n }\n };\n}\n\n/** Execute callback in global context */\nexport function execInGlobalContext(cb) {\n if (Promise === NativePromise && task.echoes === 0) {\n if (zoneEchoes === 0) {\n cb();\n } else {\n enqueueNativeMicroTask(cb);\n }\n } else {\n setTimeout(cb, 0);\n }\n}\n\nexport var rejection = DexiePromise.reject;\n\nexport {DexiePromise};\n","import { PSD, rejection, newScope } from \"../helpers/promise\";\nimport { DexieOptions } from \"../public/types/dexie-constructor\";\nimport { errnames, exceptions } from \"../errors\";\nimport { nop } from \"./chaining-functions\";\nimport { Transaction } from \"../classes/transaction\";\nimport { Dexie } from '../classes/dexie';\n\n/* Generate a temporary transaction when db operations are done outside a transaction scope.\n*/\nexport function tempTransaction (\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n fn: (resolve, reject, trans: Transaction) => any)\n // Last argument is \"writeLocked\". But this doesnt apply to oneshot direct db operations, so we ignore it.\n{\n if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) {\n if (db._state.openComplete) {\n // db.idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError));\n }\n if (!db._state.isBeingOpened) {\n if (!db._state.autoOpen)\n return rejection(new exceptions.DatabaseClosed());\n db.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n return db._state.dbReadyPromise.then(() => tempTransaction(db, mode, storeNames, fn));\n } else {\n var trans = db._createTransaction(mode, storeNames, db._dbSchema);\n try {\n trans.create();\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db.close({disableAutoOpen: false});\n return db.open().then(()=>tempTransaction(db, mode, storeNames, fn));\n }\n return rejection(ex);\n }\n return trans._promise(mode, (resolve, reject) => {\n return newScope(() => { // OPTIMIZATION POSSIBLE? newScope() not needed because it's already done in _promise.\n PSD.trans = trans;\n return fn(resolve, reject, trans);\n });\n }).then(result => {\n // Instead of resolving value directly, wait with resolving it until transaction has completed.\n // Otherwise the data would not be in the DB if requesting it in the then() operation.\n // Specifically, to ensure that the following expression will work:\n //\n // db.friends.put({name: \"Arne\"}).then(function () {\n // db.friends.where(\"name\").equals(\"Arne\").count(function(count) {\n // assert (count === 1);\n // });\n // });\n //\n if (mode === 'readwrite') try {trans.idbtrans.commit();} catch {}\n return mode === 'readonly' ? result : trans._completion.then(() => result);\n });/*.catch(err => { // Don't do this as of now. If would affect bulk- and modify methods in a way that could be more intuitive. But wait! Maybe change in next major.\n trans._reject(err);\n return rejection(err);\n });*/\n }\n}\n","import { Dexie } from \"../classes/dexie\";\n\nexport const DEXIE_VERSION = '{version}'; // Replaced by build-script.\nexport const maxString = String.fromCharCode(65535);\nexport const minKey = -Infinity; // minKey can be constant. maxKey must be a prop of Dexie (_maxKey)\nexport const INVALID_KEY_ARGUMENT =\n \"Invalid key provided. Keys must be of type string, number, Date or Array.\";\nexport const STRING_EXPECTED = \"String expected.\";\nexport const connections: Dexie[] = [];\nexport const dexieStackFrameFilter = frame => !/(dexie\\.js|dexie\\.min\\.js)/.test(frame);\nexport const DBNAMES_DB = '__dbnames';\nexport const READONLY = 'readonly';\nexport const READWRITE = 'readwrite';\n","export function combine(filter1, filter2) {\n return filter1 ?\n filter2 ?\n function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } :\n filter1 :\n filter2;\n}\n","import { DBCoreKeyRange, DBCoreRangeType } from '../public/types/dbcore';\n\nexport const AnyRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Any,\n lower: -Infinity,\n lowerOpen: false,\n upper: [[]],\n upperOpen: false\n}\n\nexport const NeverRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Never,\n lower: -Infinity,\n lowerOpen: true,\n upper: -Infinity,\n upperOpen: true\n}\n","import { deepClone, delByKeyPath, getByKeyPath } from './utils';\n\n// This workaround is needed since obj could be a custom-class instance with an\n// uninitialized keyPath. See the following comment for more context:\n// https://github.com/dfahlander/Dexie.js/issues/1280#issuecomment-823557881\nexport function workaroundForUndefinedPrimKey(keyPath: string | ArrayLike) {\n // Workaround only needed for plain non-dotted keyPaths\n return typeof keyPath === \"string\" && !/\\./.test(keyPath) \n ? (obj: object) => {\n if (obj[keyPath] === undefined && (keyPath in obj)) {\n // property exists but is undefined. This will not be liked by Indexeddb.\n // Need to remove the property before adding it but we need to clone it before\n // doing that to not be intrusive.\n obj = deepClone(obj);\n delete obj[keyPath];\n }\n return obj;\n }\n : (obj: object) => obj;\n}","import { exceptions } from \"../../errors\";\n\nexport function Entity(){\n throw exceptions.Type();\n}\n","// Implementation of https://www.w3.org/TR/IndexedDB-3/#compare-two-keys\n\nimport { toStringTag } from './utils';\n\n// ... with the adjustment to return NaN instead of throwing.\nexport function cmp(a: any, b: any): number {\n try {\n const ta = type(a);\n const tb = type(b);\n if (ta !== tb) {\n if (ta === 'Array') return 1;\n if (tb === 'Array') return -1;\n if (ta === 'binary') return 1;\n if (tb === 'binary') return -1;\n if (ta === 'string') return 1;\n if (tb === 'string') return -1;\n if (ta === 'Date') return 1;\n if (tb !== 'Date') return NaN;\n return -1;\n }\n switch (ta) {\n case 'number':\n case 'Date':\n case 'string':\n return a > b ? 1 : a < b ? -1 : 0;\n case 'binary': {\n return compareUint8Arrays(getUint8Array(a), getUint8Array(b));\n }\n case 'Array':\n return compareArrays(a, b);\n }\n } catch {}\n return NaN; // Return value if any given args are valid keys.\n}\n\nexport function compareArrays(a: any[], b: any[]): number {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n const res = cmp(a[i], b[i]);\n if (res !== 0) return res;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\nexport function compareUint8Arrays(\n a: Uint8Array,\n b: Uint8Array\n) {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n if (a[i] !== b[i]) return a[i] < b[i] ? -1 : 1;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\n// Implementation of https://www.w3.org/TR/IndexedDB-3/#key-type\nfunction type(x: any) {\n const t = typeof x;\n if (t !== 'object') return t;\n if (ArrayBuffer.isView(x)) return 'binary';\n const tsTag = toStringTag(x); // Cannot use instanceof in Safari\n return tsTag === 'ArrayBuffer' ? 'binary' : (tsTag as 'Array' | 'Date');\n}\n\ntype BinaryType =\n | ArrayBuffer\n | DataView\n | Uint8ClampedArray\n | ArrayBufferView\n | Uint8Array\n | Int8Array\n | Uint16Array\n | Int16Array\n | Uint32Array\n | Int32Array\n | Float32Array\n | Float64Array\n | BigInt64Array \n | BigUint64Array;\n\nfunction getUint8Array(a: BinaryType): Uint8Array {\n if (a instanceof Uint8Array) return a;\n if (ArrayBuffer.isView(a))\n // TypedArray or DataView\n return new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n return new Uint8Array(a); // ArrayBuffer\n}\n","import { BulkError, exceptions } from '../../errors';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { DexiePromise as Promise, PSD, newScope, rejection, beginMicroTickScope, endMicroTickScope } from '../../helpers/promise';\nimport { Transaction } from '../transaction';\nimport { Dexie } from '../dexie';\nimport { tempTransaction } from '../../functions/temp-transaction';\nimport { Collection } from '../collection';\nimport { isArray, keys, getByKeyPath, setByKeyPath, extend, getProto } from '../../functions/utils';\nimport { maxString } from '../../globals/constants';\nimport { combine } from '../../functions/combine';\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { IndexableType } from '../../public/types/indexable-type';\nimport { debug } from '../../helpers/debug';\nimport { DBCoreTable } from '../../public/types/dbcore';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { workaroundForUndefinedPrimKey } from '../../functions/workaround-undefined-primkey';\nimport { Entity } from '../entity/Entity';\nimport { UpdateSpec } from '../../public';\nimport { cmp } from '../../functions/cmp';\n\n/** class Table\n * \n * https://dexie.org/docs/Table/Table\n */\nexport class Table implements ITable {\n db: Dexie;\n _tx?: Transaction;\n name: string;\n schema: TableSchema;\n hook: TableHooks;\n core: DBCoreTable;\n\n _trans(\n mode: IDBTransactionMode,\n fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike | void,\n writeLocked?: boolean | string) : PromiseExtended\n {\n const trans: Transaction = this._tx || PSD.trans;\n const tableName = this.name;\n // @ts-ignore: Use Chrome's Async Stack Tagging API to allow tracing and simplify debugging for dexie users.\n const task = debug && typeof console !== 'undefined' && console.createTask && console.createTask(`Dexie: ${mode === 'readonly' ? 'read' : 'write' } ${this.name}`);\n \n function checkTableInTransaction(resolve, reject, trans: Transaction) {\n if (!trans.schema[tableName])\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\");\n return fn(trans.idbtrans, trans) as Promise;\n }\n // Surround all in a microtick scope.\n // Reason: Browsers (modern Safari + older others)\n // still as of 2018-10-10 has problems keeping a transaction\n // alive between micro ticks. Safari because if transaction\n // is created but not used in same microtick, it will go\n // away. That specific issue could be solved in DBCore\n // by opening the transaction just before using it instead.\n // But older Firefoxes and IE11 (with Promise polyfills)\n // will still have probs.\n // The beginMicrotickScope()/endMicrotickScope() works\n // in cooperation with Dexie.Promise to orchestrate\n // the micro-ticks in endMicrotickScope() rather than\n // in native engine.\n const wasRootExec = beginMicroTickScope();\n try {\n let p = trans && trans.db._novip === this.db._novip ?\n trans === PSD.trans ?\n trans._promise(mode, checkTableInTransaction, writeLocked) :\n newScope(() => trans._promise(mode, checkTableInTransaction, writeLocked), { trans: trans, transless: PSD.transless || PSD }) :\n tempTransaction(this.db, mode, [this.name], checkTableInTransaction);\n if (task) { // Dexie.debug = true so we trace errors\n p._consoleTask = task;\n p = p.catch(err => {\n console.trace(err);\n return rejection(err);\n });\n }\n return p; \n } finally {\n if (wasRootExec) endMicroTickScope();\n }\n }\n\n /** Table.get()\n * \n * https://dexie.org/docs/Table/Table.get()\n * \n **/\n get(keyOrCrit, cb?) {\n if (keyOrCrit && keyOrCrit.constructor === Object)\n return this.where(keyOrCrit as { [key: string]: IndexableType }).first(cb);\n if (keyOrCrit == null) return rejection(new exceptions.Type(`Invalid argument to Table.get()`));\n\n return this._trans('readonly', (trans) => {\n return this.core.get({trans, key: keyOrCrit})\n .then(res => this.hook.reading.fire(res));\n }).then(cb);\n }\n\n /** Table.where()\n * \n * https://dexie.org/docs/Table/Table.where()\n * \n **/\n where(indexOrCrit: string | string[] | { [key: string]: IndexableType }) {\n if (typeof indexOrCrit === 'string')\n return new this.db.WhereClause(this, indexOrCrit);\n if (isArray(indexOrCrit))\n return new this.db.WhereClause(this, `[${indexOrCrit.join('+')}]`);\n // indexOrCrit is an object map of {[keyPath]:value} \n const keyPaths = keys(indexOrCrit);\n if (keyPaths.length === 1)\n // Only one critera. This was the easy case:\n return this\n .where(keyPaths[0])\n .equals(indexOrCrit[keyPaths[0]]);\n\n // Multiple criterias.\n // Let's try finding a compound index that matches all keyPaths in\n // arbritary order:\n const compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(ix => {\n if (\n ix.compound &&\n keyPaths.every(keyPath => ix.keyPath.indexOf(keyPath) >= 0)) {\n for (let i=0; i a.keyPath.length - b.keyPath.length)[0];\n \n if (compoundIndex && this.db._maxKey !== maxString) {\n // Cool! We found such compound index\n // and this browser supports compound indexes (maxKey !== maxString)!\n const keyPathsInValidOrder = (compoundIndex.keyPath as string[]).slice(0, keyPaths.length);\n return this\n .where(keyPathsInValidOrder)\n .equals(keyPathsInValidOrder.map(kp => indexOrCrit[kp]));\n }\n\n if (!compoundIndex && debug) console.warn(\n `The query ${JSON.stringify(indexOrCrit)} on ${this.name} would benefit from a ` +\n `compound index [${keyPaths.join('+')}]`);\n\n // Ok, now let's fallback to finding at least one matching index\n // and filter the rest.\n const { idxByName } = this.schema;\n const idb = this.db._deps.indexedDB;\n\n function equals (a, b) {\n return idb.cmp(a,b) === 0; // Works with all indexable types including binary keys.\n }\n\n const [idx, filterFunction] = keyPaths.reduce(([prevIndex, prevFilterFn], keyPath) => {\n const index = idxByName[keyPath];\n const value = indexOrCrit[keyPath];\n return [\n prevIndex || index, // idx::=Pick index of first matching keypath\n prevIndex || !index ? // filter::=null if not needed, otherwise combine function filter\n combine(\n prevFilterFn,\n index && index.multi ?\n x => {\n const prop = getByKeyPath(x, keyPath);\n return isArray(prop) && prop.some(item => equals(value, item));\n } : x => equals(value, getByKeyPath(x, keyPath)))\n : prevFilterFn\n ];\n }, [null, null]);\n\n return idx ?\n this.where(idx.name).equals(indexOrCrit[idx.keyPath])\n .filter(filterFunction) :\n compoundIndex ?\n this.filter(filterFunction) : // Has compound but browser bad. Allow filter.\n this.where(keyPaths).equals(''); // No index at all. Fail lazily with \"[a+b+c] is not indexed\"\n }\n\n /** Table.filter()\n * \n * https://dexie.org/docs/Table/Table.filter()\n * \n **/\n filter(filterFunction: (obj: any) => boolean) {\n return this.toCollection().and(filterFunction);\n }\n\n /** Table.count()\n * \n * https://dexie.org/docs/Table/Table.count()\n * \n **/\n count(thenShortcut?: any) {\n return this.toCollection().count(thenShortcut);\n }\n\n /** Table.offset()\n * \n * https://dexie.org/docs/Table/Table.offset()\n * \n **/\n offset(offset: number) {\n return this.toCollection().offset(offset);\n }\n\n /** Table.limit()\n * \n * https://dexie.org/docs/Table/Table.limit()\n * \n **/\n limit(numRows: number) {\n return this.toCollection().limit(numRows);\n }\n\n /** Table.each()\n * \n * https://dexie.org/docs/Table/Table.each()\n * \n **/\n each(callback: (obj: any, cursor: { key: IndexableType, primaryKey: IndexableType }) => any) {\n return this.toCollection().each(callback);\n }\n\n /** Table.toArray()\n * \n * https://dexie.org/docs/Table/Table.toArray()\n * \n **/\n toArray(thenShortcut?: any) {\n return this.toCollection().toArray(thenShortcut);\n }\n\n /** Table.toCollection()\n * \n * https://dexie.org/docs/Table/Table.toCollection()\n * \n **/\n toCollection() {\n return new this.db.Collection(new this.db.WhereClause(this));\n }\n\n /** Table.orderBy()\n * \n * https://dexie.org/docs/Table/Table.orderBy()\n * \n **/\n orderBy(index: string | string[]) {\n return new this.db.Collection(\n new this.db.WhereClause(this, isArray(index) ?\n `[${index.join('+')}]` :\n index));\n }\n\n /** Table.reverse()\n * \n * https://dexie.org/docs/Table/Table.reverse()\n * \n **/\n reverse(): Collection {\n return this.toCollection().reverse();\n }\n\n /** Table.mapToClass()\n * \n * https://dexie.org/docs/Table/Table.mapToClass()\n * \n **/\n mapToClass(constructor: Function) {\n const {db, name: tableName} = this;\n this.schema.mappedClass = constructor;\n if (constructor.prototype instanceof Entity) {\n constructor = class extends (constructor as any) {\n get db () { return db; }\n table() { return tableName; }\n }\n }\n // Collect all inherited property names (including method names) by\n // walking the prototype chain. This is to avoid overwriting them from\n // database data - so application code can rely on inherited props never\n // becoming shadowed by database object props.\n const inheritedProps = new Set();\n for (let proto = constructor.prototype; proto; proto = getProto(proto)) {\n Object.getOwnPropertyNames(proto).forEach(propName => inheritedProps.add(propName));\n }\n \n // Now, subscribe to the when(\"reading\") event to make all objects that come out from this table inherit from given class\n // no matter which method to use for reading (Table.get() or Table.where(...)... )\n const readHook = (obj: Object) => {\n if (!obj) return obj; // No valid object. (Value is null or undefined). Return as is.\n // Create a new object that derives from constructor:\n const res = Object.create(constructor.prototype);\n // Clone members (but never those that collide with a property in the prototype\n // hierchary (MUST BE ABLE TO RELY ON Entity methods and props!)):\n for (let m in obj) if (!inheritedProps.has(m)) try { res[m] = obj[m]; } catch (_) { }\n return res;\n };\n\n if (this.schema.readHook) {\n this.hook.reading.unsubscribe(this.schema.readHook);\n }\n this.schema.readHook = readHook;\n this.hook(\"reading\", readHook);\n return constructor;\n }\n\n /** @deprecated */\n defineClass() {\n function Class (content){\n extend(this, content);\n };\n return this.mapToClass(Class);\n }\n\n /** Table.add()\n * \n * https://dexie.org/docs/Table/Table.add()\n * \n **/\n add(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd]});\n }).then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.update()\n * \n * https://dexie.org/docs/Table/Table.update()\n * \n **/\n update(keyOrObject, modifications: { [keyPath: string]: any; } | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) {\n const key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath);\n if (key === undefined) return rejection(new exceptions.InvalidArgument(\n \"Given object does not contain its primary key\"));\n /*// object to modify. Also modify given object with the modifications:\n // This part should be here for backward compatibility.\n // If ever feeling too bad about mutating given object, please wait to a new major before removing it,\n // and document the change thoroughly. TODO: Document this change!\n if (!Object.isFrozen(keyOrObject)) try {\n if (typeof modifications !== \"function\") {\n keys(modifications).forEach(keyPath => {\n setByKeyPath(keyOrObject, keyPath, modifications[keyPath]);\n });\n } else {\n // Now since we support function argument, we should have a similar behavior here as well\n // (as long as we do this mutability stuff on the given object)\n modifications(keyOrObject, {value: keyOrObject, primKey: key});\n }\n } catch {\n // Maybe given object was frozen.\n // This part is not essential. Just move on as nothing happened...\n }*/\n return this.where(\":id\").equals(key).modify(modifications);\n } else {\n // key to modify\n return this.where(\":id\").equals(keyOrObject).modify(modifications);\n }\n }\n\n /** Table.put()\n * \n * https://dexie.org/docs/Table/Table.put()\n * \n **/\n put(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans(\n 'readwrite',\n trans => this.core.mutate({trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.delete()\n * \n * https://dexie.org/docs/Table/Table.delete()\n * \n **/\n delete(key: IndexableType): PromiseExtended {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'delete', keys: [key]}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.clear()\n * \n * https://dexie.org/docs/Table/Table.clear()\n * \n **/\n clear() {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'deleteRange', range: AnyRange}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.bulkGet()\n * \n * https://dexie.org/docs/Table/Table.bulkGet()\n * \n * @param keys \n */\n bulkGet(keys: IndexableType[]) {\n return this._trans('readonly', trans => {\n return this.core.getMany({\n keys,\n trans\n }).then(result => result.map(res => this.hook.reading.fire(res)));\n });\n }\n\n /** Table.bulkAdd()\n * \n * https://dexie.org/docs/Table/Table.bulkAdd()\n * \n **/\n bulkAdd(\n objects: readonly any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkAdd(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToAdd = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n return this.core.mutate(\n {trans, type: 'add', keys: keys as IndexableType[], values: objectsToAdd, wantResults}\n )\n .then(({numFailures, results,lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkAdd(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkPut()\n * \n * https://dexie.org/docs/Table/Table.bulkPut()\n * \n **/\n bulkPut(\n objects: readonly any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkPut(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToPut = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n\n return this.core.mutate(\n {trans, type: 'put', keys: keys as IndexableType[], values: objectsToPut, wantResults}\n )\n .then(({numFailures, results, lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkPut(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkUpdate()\n *\n * https://dexie.org/docs/Table.Table.bulkUpdate()\n */\n bulkUpdate(\n keysAndChanges: readonly { key: any; changes: UpdateSpec }[]\n ): PromiseExtended {\n const coreTable = this.core;\n const keys = keysAndChanges.map((entry) => entry.key);\n const changeSpecs = keysAndChanges.map((entry) => entry.changes);\n const offsetMap: number[] = [];\n return this._trans('readwrite', (trans) => {\n return coreTable.getMany({ trans, keys, cache: 'clone' }).then((objs) => {\n const resultKeys: any[] = [];\n const resultObjs: any[] = [];\n keysAndChanges.forEach(({ key, changes }, idx) => {\n const obj = objs[idx];\n if (obj) {\n for (const keyPath of Object.keys(changes)) {\n const value = changes[keyPath];\n if (keyPath === this.schema.primKey.keyPath) {\n if (cmp(value, key) !== 0) {\n throw new exceptions.Constraint(\n `Cannot update primary key in bulkUpdate()`\n );\n }\n } else {\n setByKeyPath(obj, keyPath, value);\n }\n }\n offsetMap.push(idx);\n resultKeys.push(key);\n resultObjs.push(obj);\n }\n });\n const numEntries = resultKeys.length;\n return coreTable\n .mutate({\n trans,\n type: 'put',\n keys: resultKeys,\n values: resultObjs,\n updates: {\n keys,\n changeSpecs\n }\n })\n .then(({ numFailures, failures }) => {\n if (numFailures === 0) return numEntries;\n // Failure. bulkPut() may have a subset of keys\n // so we must translate returned 'failutes' into the offsets of given argument:\n for (const offset of Object.keys(failures)) {\n const mappedOffset = offsetMap[Number(offset)];\n if (mappedOffset != null) {\n const failure = failures[offset];\n delete failures[offset];\n failures[mappedOffset] = failure;\n }\n }\n throw new BulkError(\n `${this.name}.bulkUpdate(): ${numFailures} of ${numEntries} operations failed`,\n failures\n );\n });\n });\n });\n }\n\n /** Table.bulkDelete()\n * \n * https://dexie.org/docs/Table/Table.bulkDelete()\n * \n **/\n bulkDelete(keys: ReadonlyArray): PromiseExtended {\n const numKeys = keys.length;\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'delete', keys: keys as IndexableType[]});\n }).then(({numFailures, lastResult, failures}) => {\n if (numFailures === 0) return lastResult;\n throw new BulkError(\n `${this.name}.bulkDelete(): ${numFailures} of ${numKeys} operations failed`, failures);\n });\n }\n}\n","import {keys, isArray, asap} from '../functions/utils';\nimport {nop, mirror, reverseStoppableEventChain} from '../functions/chaining-functions';\nimport {exceptions} from '../errors';\n\nexport default function Events(ctx) {\n var evs = {};\n var rv = function (eventName, subscriber) {\n if (subscriber) {\n // Subscribe. If additional arguments than just the subscriber was provided, forward them as well.\n var i = arguments.length, args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n evs[eventName].subscribe.apply(null, args);\n return ctx;\n } else if (typeof (eventName) === 'string') {\n // Return interface allowing to fire or unsubscribe from event\n return evs[eventName];\n }\n };\n rv.addEventType = add;\n \n for (var i = 1, l = arguments.length; i < l; ++i) {\n add(arguments[i]);\n }\n \n return rv;\n\n function add(eventName, chainFunction, defaultFunction) {\n if (typeof eventName === 'object') return addConfiguredEvents(eventName);\n if (!chainFunction) chainFunction = reverseStoppableEventChain;\n if (!defaultFunction) defaultFunction = nop;\n\n var context = {\n subscribers: [],\n fire: defaultFunction,\n subscribe: function (cb) {\n if (context.subscribers.indexOf(cb) === -1) {\n context.subscribers.push(cb);\n context.fire = chainFunction(context.fire, cb);\n }\n },\n unsubscribe: function (cb) {\n context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; });\n context.fire = context.subscribers.reduce(chainFunction, defaultFunction);\n }\n };\n evs[eventName] = rv[eventName] = context;\n return context;\n }\n\n function addConfiguredEvents(cfg) {\n // events(this, {reading: [functionChain, nop]});\n keys(cfg).forEach(function (eventName) {\n var args = cfg[eventName];\n if (isArray(args)) {\n add(eventName, cfg[eventName][0], cfg[eventName][1]);\n } else if (args === 'asap') {\n // Rather than approaching event subscription using a functional approach, we here do it in a for-loop where subscriber is executed in its own stack\n // enabling that any exception that occur wont disturb the initiator and also not nescessary be catched and forgotten.\n var context = add(eventName, mirror, function fire() {\n // Optimazation-safe cloning of arguments into args.\n var i = arguments.length, args = new Array(i);\n while (i--) args[i] = arguments[i];\n // All each subscriber:\n context.subscribers.forEach(function (fn) {\n asap(function fireEvent() {\n fn.apply(null, args);\n });\n });\n });\n } else throw new exceptions.InvalidArgument(\"Invalid event config\");\n });\n }\n}\n","import { arrayToObject, derive } from './utils';\n\n\nexport function makeClassConstructor (prototype: Object, constructor: Function) {\n /*const propertyDescriptorMap = arrayToObject(\n Object.getOwnPropertyNames(prototype),\n propKey => [propKey, Object.getOwnPropertyDescriptor(prototype, propKey)]);\n\n // Both derive and clone the prototype.\n // derive: So that x instanceof T returns true when T is the class template.\n // clone: Optimizes method access a bit (but actually not nescessary)\n const derivedPrototypeClone = Object.create(prototype, propertyDescriptorMap);\n derivedPrototypeClone.constructor = constructor;\n constructor.prototype = derivedPrototypeClone;\n return constructor as any as TConstructor;*/\n\n // Keep the above code in case we want to clone AND derive the parent prototype.\n // Reason would be optimization of property access.\n // The code below will only create a prototypal inheritance from given constructor function\n // to given prototype.\n derive(constructor).from({prototype});\n return constructor as any as TConstructor; \n}\n","import { Dexie } from '../dexie';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { Transaction } from '../transaction/transaction';\nimport { hookCreatingChain, pureFunctionChain, nop, mirror, hookUpdatingChain, hookDeletingChain } from '../../functions/chaining-functions';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { Table } from './table';\nimport Events from '../../helpers/Events';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\n\nexport interface TableConstructor {\n new (name: string, tableSchema: TableSchema, optionalTrans?: Transaction) : Table;\n prototype: Table;\n}\n\n/** Generates a Table constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTableConstructor (db: Dexie) {\n return makeClassConstructor(\n Table.prototype,\n\n function Table (this: Table, name: string, tableSchema: TableSchema, trans?: Transaction) {\n this.db = db;\n this._tx = trans;\n this.name = name;\n this.schema = tableSchema;\n this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, {\n \"creating\": [hookCreatingChain, nop],\n \"reading\": [pureFunctionChain, mirror],\n \"updating\": [hookUpdatingChain, nop],\n \"deleting\": [hookDeletingChain, nop]\n }) as TableHooks;\n }\n\n );\n}\n","import { combine } from \"../../functions/combine\";\nimport { exceptions } from \"../../errors\";\nimport { hasOwn } from \"../../functions/utils\";\nimport { wrap } from \"../../helpers/promise\";\nimport { Collection } from './';\nimport { DBCoreCursor, DBCoreTable, DBCoreTransaction, DBCoreTableSchema, DBCoreRangeType } from '../../public/types/dbcore';\nimport { nop } from '../../functions/chaining-functions';\n\ntype CollectionContext = Collection[\"_ctx\"];\n\nexport function isPlainKeyRange (ctx: CollectionContext, ignoreLimitFilter?: boolean) {\n return !(ctx.filter || ctx.algorithm || ctx.or) &&\n (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter);\n} \n\nexport function addFilter(ctx: CollectionContext, fn: Function) {\n ctx.filter = combine(ctx.filter, fn);\n}\n\nexport function addReplayFilter (ctx: CollectionContext, factory, isLimitFilter?) {\n var curr = ctx.replayFilter;\n ctx.replayFilter = curr ? ()=>combine(curr(), factory()) : factory;\n ctx.justLimit = isLimitFilter && !curr;\n}\n\nexport function addMatchFilter(ctx: CollectionContext, fn) {\n ctx.isMatch = combine(ctx.isMatch, fn);\n}\n\nexport function getIndexOrStore(ctx: CollectionContext, coreSchema: DBCoreTableSchema) {\n // TODO: Rewrite this. No need to know ctx.isPrimKey. ctx.index should hold the keypath.\n // Still, throw if not found!\n if (ctx.isPrimKey) return coreSchema.primaryKey;\n const index = coreSchema.getIndexByKeyPath(ctx.index);\n if (!index) throw new exceptions.Schema(\"KeyPath \" + ctx.index + \" on object store \" + coreSchema.name + \" is not indexed\");\n return index;\n}\n\nexport function openCursor(ctx: CollectionContext, coreTable: DBCoreTable, trans: DBCoreTransaction) {\n const index = getIndexOrStore(ctx, coreTable.schema);\n return coreTable.openCursor({\n trans,\n values: !ctx.keysOnly,\n reverse: ctx.dir === 'prev',\n unique: !!ctx.unique,\n query: {\n index, \n range: ctx.range\n }\n });\n}\n\nexport function iter (\n ctx: CollectionContext, \n fn: (item, cursor: DBCoreCursor, advance: Function)=>void,\n coreTrans: DBCoreTransaction,\n coreTable: DBCoreTable): Promise\n{\n const filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter;\n if (!ctx.or) {\n return iterate(\n openCursor(ctx, coreTable, coreTrans),\n combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper);\n } else {\n const set = {};\n\n const union = (item: any, cursor: DBCoreCursor, advance) => {\n if (!filter || filter(cursor, advance, result=>cursor.stop(result), err => cursor.fail(err))) {\n var primaryKey = cursor.primaryKey;\n var key = '' + primaryKey;\n if (key === '[object ArrayBuffer]') key = '' + new Uint8Array(primaryKey);\n if (!hasOwn(set, key)) {\n set[key] = true;\n fn(item, cursor, advance);\n }\n }\n }\n\n return Promise.all([\n ctx.or._iterate(union, coreTrans),\n iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper)\n ]);\n }\n}\n\nfunction iterate(cursorPromise: Promise, filter, fn, valueMapper): Promise {\n \n // Apply valueMapper (hook('reading') or mappped class)\n var mappedFn = valueMapper ? (x,c,a) => fn(valueMapper(x),c,a) : fn;\n // Wrap fn with PSD and microtick stuff from Promise.\n var wrappedFn = wrap(mappedFn);\n \n return cursorPromise.then(cursor => {\n if (cursor) {\n return cursor.start(()=>{\n var c = ()=>cursor.continue();\n if (!filter || filter(cursor, advancer => c = advancer, val=>{cursor.stop(val);c=nop}, e => {cursor.fail(e);c = nop;}))\n wrappedFn(cursor.value, cursor, advancer => c = advancer);\n c();\n });\n }\n });\n}\n","import { isArray } from \"../functions/utils\";\nimport { PropModSpec } from \"../public/types/prop-modification\";\n\nexport const PropModSymbol: unique symbol = Symbol();\n\n/** Consistent change propagation across offline synced data.\n * \n * This class is executed client- and server side on sync, making\n * an operation consistent across sync for full consistency and accuracy.\n * \n * Example: An object represents a bank account with a balance.\n * One offline user adds $ 1.00 to the balance.\n * Another user (online) adds $ 2.00 to the balance.\n * When first user syncs, the balance becomes the sum of every operation (3.00).\n * \n * -- initial: balance is 0\n * 1. db.bankAccounts.update(1, { balance: new ProdModification({add: 100})}) // user 1 (offline)\n * 2. db.bankAccounts.update(1, { balance: new ProdModification({add: 200})}) // user 2 (online)\n * -- before user 1 syncs, balance is 200 (representing money with integers * 100 to avoid rounding issues)\n * \n * -- balance is 300\n * \n * When new operations are added, they need to be added to:\n * 1. PropModSpec interface\n * 2. Here in PropModification with the logic they represent\n * 3. (Optionally) a sugar function for it, such as const mathAdd = (amount: number | BigInt) => new PropModification({mathAdd: amount})\n */\nexport class PropModification implements PropModSpec {\n [PropModSymbol]?: true;\n replacePrefix?: [string, string];\n add?: number | BigInt | Array;\n remove?: number | BigInt | Array;\n\n execute(value: any): any {\n // add (mathematical or set-wise)\n if (this.add !== undefined) {\n const term = this.add;\n // Set-addition on array representing a set of primitive types (strings, numbers)\n if (isArray(term)) {\n return [...(isArray(value) ? value : []), ...term].sort();\n }\n // Mathematical addition:\n if (typeof term === 'number') return (Number(value) || 0) + term; // if value is not convertible to number, return 0 + term\n if (typeof term === 'bigint') {\n try {\n return BigInt(value) + term;\n } catch {\n return BigInt(0) + term; // Unlike Number(value) that can return NaN, BigInt(value) throws if value is not BigInt, Number or numeric string\n }\n }\n throw new TypeError(`Invalid term ${term}`);\n }\n\n // remove (mathematical or set-wise)\n if (this.remove !== undefined) {\n const subtrahend = this.remove;\n // Set-addition on array representing a set of primitive types (strings, numbers)\n if (isArray(subtrahend)) {\n return isArray(value) ? value.filter(item => !subtrahend.includes(item)).sort() : [];\n } \n // Mathematical addition:\n if (typeof subtrahend === 'number') return Number(value) - subtrahend;\n if (typeof subtrahend === 'bigint') {\n try {\n return BigInt(value) - subtrahend;\n } catch {\n return BigInt(0) - subtrahend; // Unlike Number(value) that can return NaN, BigInt(value) throws if value is not BigInt, Number or numeric string\n }\n }\n throw new TypeError(`Invalid subtrahend ${subtrahend}`);\n }\n\n // Replace a prefix:\n const prefixToReplace = this.replacePrefix?.[0];\n if (prefixToReplace && typeof value === 'string' && value.startsWith(prefixToReplace)) {\n return this.replacePrefix[1] + value.substring(prefixToReplace.length);\n }\n return value;\n }\n\n constructor(spec: PropModSpec) {\n Object.assign(this, spec);\n }\n}\n","import { Collection as ICollection } from \"../../public/types/collection\";\nimport { Dexie } from \"../dexie\";\nimport { Table } from \"../table\";\nimport { IndexableType, IndexableTypeArrayReadonly } from \"../../public/types/indexable-type\";\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { iter, isPlainKeyRange, getIndexOrStore, addReplayFilter, addFilter, addMatchFilter } from \"./collection-helpers\";\nimport { rejection } from \"../../helpers/promise\";\nimport { combine } from \"../../functions/combine\";\nimport { extend, hasOwn, deepClone, keys, setByKeyPath, getByKeyPath } from \"../../functions/utils\";\nimport { ModifyError } from \"../../errors\";\nimport { ThenShortcut } from \"../../public/types/then-shortcut\";\nimport { Transaction } from '../transaction';\nimport { DBCoreCursor, DBCoreTransaction, DBCoreRangeType, DBCoreMutateResponse, DBCoreKeyRange } from '../../public/types/dbcore';\nimport { cmp } from \"../../functions/cmp\";\nimport { PropModification } from \"../../helpers/prop-modification\";\nimport { UpdateSpec } from \"../../public/types/update-spec\";\n\n/** class Collection\n * \n * https://dexie.org/docs/Collection/Collection\n */\nexport class Collection implements ICollection {\n db: Dexie;\n _ctx: {\n table: Table;\n index?: string | null;\n isPrimKey?: boolean;\n range: DBCoreKeyRange;\n keysOnly: boolean;\n dir: \"next\" | \"prev\";\n unique: \"\" | \"unique\";\n algorithm?: Function | null;\n filter?: Function | null;\n replayFilter: Function | null;\n justLimit: boolean; // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: Function | null;\n offset: number,\n limit: number,\n error: any, // If set, any promise must be rejected with this error\n or: Collection,\n valueMapper: (any) => any\n }\n \n _ondirectionchange?: Function;\n\n _read(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike, cb?): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readonly', fn).then(cb);\n }\n\n _write(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readwrite', fn, \"locked\"); // When doing write operations on collections, always lock the operation so that upcoming operations gets queued.\n }\n\n _addAlgorithm(fn) {\n var ctx = this._ctx;\n ctx.algorithm = combine(ctx.algorithm, fn);\n }\n\n _iterate(\n fn: (item, cursor: DBCoreCursor, advance: Function) => void,\n coreTrans: DBCoreTransaction) : Promise\n {\n return iter(this._ctx, fn, coreTrans, this._ctx.table.core);\n }\n\n /** Collection.clone()\n * \n * https://dexie.org/docs/Collection/Collection.clone()\n * \n **/\n clone(props?): this {\n var rv = Object.create(this.constructor.prototype),\n ctx = Object.create(this._ctx);\n if (props) extend(ctx, props);\n rv._ctx = ctx;\n return rv;\n }\n\n /** Collection.raw()\n * \n * https://dexie.org/docs/Collection/Collection.raw()\n * \n **/\n raw(): this {\n this._ctx.valueMapper = null;\n return this;\n }\n\n /** Collection.each()\n * \n * https://dexie.org/docs/Collection/Collection.each()\n * \n **/\n each(fn: (obj, cursor: DBCoreCursor) => any): PromiseExtended {\n var ctx = this._ctx;\n\n return this._read(trans => iter(ctx, fn, trans, ctx.table.core));\n }\n\n /** Collection.count()\n * \n * https://dexie.org/docs/Collection/Collection.count()\n * \n **/\n count(cb?) {\n return this._read(trans => {\n const ctx = this._ctx;\n const coreTable = ctx.table.core;\n if (isPlainKeyRange(ctx, true)) {\n // This is a plain key range. We can use the count() method if the index.\n return coreTable.count({\n trans,\n query: {\n index: getIndexOrStore(ctx, coreTable.schema),\n range: ctx.range\n }\n }).then(count => Math.min(count, ctx.limit));\n } else {\n // Algorithms, filters or expressions are applied. Need to count manually.\n var count = 0;\n return iter(ctx, () => { ++count; return false; }, trans, coreTable)\n .then(()=>count);\n }\n }).then(cb);\n }\n\n /** Collection.sortBy()\n * \n * https://dexie.org/docs/Collection/Collection.sortBy()\n * \n **/\n sortBy(keyPath: string): PromiseExtended;\n sortBy(keyPath: string, thenShortcut: ThenShortcut) : PromiseExtended;\n sortBy(keyPath: string, cb?: ThenShortcut) {\n const parts = keyPath.split('.').reverse(),\n lastPart = parts[0],\n lastIndex = parts.length - 1;\n function getval(obj, i) {\n if (i) return getval(obj[parts[i]], i - 1);\n return obj[lastPart];\n }\n var order = this._ctx.dir === \"next\" ? 1 : -1;\n\n function sorter(a, b) {\n var aVal = getval(a, lastIndex),\n bVal = getval(b, lastIndex);\n return aVal < bVal ? -order : aVal > bVal ? order : 0;\n }\n return this.toArray(function (a) {\n return a.sort(sorter);\n }).then(cb);\n }\n\n /** Collection.toArray()\n * \n * https://dexie.org/docs/Collection/Collection.toArray()\n * \n **/\n toArray(cb?): PromiseExtended {\n return this._read(trans => {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAll() or\n // IDBKeyRange.getAll():\n const {valueMapper} = ctx;\n const index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n limit: ctx.limit,\n values: true,\n query: {\n index,\n range: ctx.range\n }\n }).then(({result}) => valueMapper ? result.map(valueMapper) : result);\n } else {\n // Getting array through a cursor.\n const a = [];\n return iter(ctx, item => a.push(item), trans, ctx.table.core).then(()=>a);\n }\n }, cb);\n }\n\n /** Collection.offset()\n * \n * https://dexie.org/docs/Collection/Collection.offset()\n * \n **/\n offset(offset: number) : Collection{\n var ctx = this._ctx;\n if (offset <= 0) return this;\n ctx.offset += offset; // For count()\n if (isPlainKeyRange(ctx)) {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return (cursor, advance) => {\n if (offsetLeft === 0) return true;\n if (offsetLeft === 1) { --offsetLeft; return false; }\n advance(() => {\n cursor.advance(offsetLeft);\n offsetLeft = 0;\n });\n return false;\n };\n });\n } else {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return () => (--offsetLeft < 0);\n });\n }\n return this;\n }\n\n /** Collection.limit()\n * \n * https://dexie.org/docs/Collection/Collection.limit()\n * \n **/\n limit(numRows: number) : Collection {\n this._ctx.limit = Math.min(this._ctx.limit, numRows); // For count()\n addReplayFilter(this._ctx, () => {\n var rowsLeft = numRows;\n return function (cursor, advance, resolve) {\n if (--rowsLeft <= 0) advance(resolve); // Stop after this item has been included\n return rowsLeft >= 0; // If numRows is already below 0, return false because then 0 was passed to numRows initially. Otherwise we wouldnt come here.\n };\n }, true);\n return this;\n }\n\n /** Collection.until()\n * \n * https://dexie.org/docs/Collection/Collection.until()\n * \n **/\n until(filterFunction: (x) => boolean, bIncludeStopEntry?) {\n addFilter(this._ctx, function (cursor, advance, resolve) {\n if (filterFunction(cursor.value)) {\n advance(resolve);\n return bIncludeStopEntry;\n } else {\n return true;\n }\n });\n return this;\n }\n\n /** Collection.first()\n * \n * https://dexie.org/docs/Collection/Collection.first()\n * \n **/\n first(cb?) {\n return this.limit(1).toArray(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.last()\n * \n * https://dexie.org/docs/Collection/Collection.last()\n * \n **/\n last(cb?) {\n return this.reverse().first(cb);\n }\n\n /** Collection.filter()\n * \n * https://dexie.org/docs/Collection/Collection.filter()\n * \n **/\n filter(filterFunction: (x) => boolean): Collection {\n /// function(val){return true/false}\n addFilter(this._ctx, function (cursor) {\n return filterFunction(cursor.value);\n });\n // match filters not used in Dexie.js but can be used by 3rd part libraries to test a\n // collection for a match without querying DB. Used by Dexie.Observable.\n addMatchFilter(this._ctx, filterFunction);\n return this;\n }\n\n /** Collection.and()\n * \n * https://dexie.org/docs/Collection/Collection.and()\n * \n **/\n and(filter: (x) => boolean) {\n return this.filter(filter);\n }\n\n /** Collection.or()\n * \n * https://dexie.org/docs/Collection/Collection.or()\n * \n **/\n or(indexName: string) {\n return new this.db.WhereClause(this._ctx.table, indexName, this);\n }\n\n /** Collection.reverse()\n * \n * https://dexie.org/docs/Collection/Collection.reverse()\n * \n **/\n reverse() {\n this._ctx.dir = (this._ctx.dir === \"prev\" ? \"next\" : \"prev\");\n if (this._ondirectionchange) this._ondirectionchange(this._ctx.dir);\n return this;\n }\n\n /** Collection.desc()\n * \n * https://dexie.org/docs/Collection/Collection.desc()\n * \n **/\n desc() {\n return this.reverse();\n }\n\n /** Collection.eachKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachKey()\n * \n **/\n eachKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.key, cursor); });\n }\n\n /** Collection.eachUniqueKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachUniqueKey()\n * \n **/\n eachUniqueKey(cb?) {\n this._ctx.unique = \"unique\";\n return this.eachKey(cb);\n }\n\n /** Collection.eachPrimaryKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachPrimaryKey()\n * \n **/\n eachPrimaryKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); });\n }\n\n /** Collection.keys()\n * \n * https://dexie.org/docs/Collection/Collection.keys()\n * \n **/\n keys(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.key);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.primaryKeys()\n * \n * https://dexie.org/docs/Collection/Collection.primaryKeys()\n * \n **/\n primaryKeys(cb?) : PromiseExtended {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAllKeys() or\n // IDBKeyRange.getAllKeys():\n return this._read(trans => {\n var index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n values: false,\n limit: ctx.limit,\n query: {\n index,\n range: ctx.range\n }});\n }).then(({result})=>result).then(cb);\n }\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.primaryKey);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.uniqueKeys()\n * \n * https://dexie.org/docs/Collection/Collection.uniqueKeys()\n * \n **/\n uniqueKeys(cb?) {\n this._ctx.unique = \"unique\";\n return this.keys(cb);\n }\n\n /** Collection.firstKey()\n * \n * https://dexie.org/docs/Collection/Collection.firstKey()\n * \n **/\n firstKey(cb?) {\n return this.limit(1).keys(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.lastKey()\n * \n * https://dexie.org/docs/Collection/Collection.lastKey()\n * \n **/\n lastKey(cb?) {\n return this.reverse().firstKey(cb);\n }\n\n /** Collection.distinct()\n * \n * https://dexie.org/docs/Collection/Collection.distinct()\n * \n **/\n distinct() {\n var ctx = this._ctx,\n idx = ctx.index && ctx.table.schema.idxByName[ctx.index];\n if (!idx || !idx.multi) return this; // distinct() only makes differencies on multiEntry indexes.\n var set = {};\n addFilter(this._ctx, function (cursor: DBCoreCursor) {\n var strKey = cursor.primaryKey.toString(); // Converts any Date to String, String to String, Number to String and Array to comma-separated string\n var found = hasOwn(set, strKey);\n set[strKey] = true;\n return !found;\n });\n return this;\n }\n\n //\n // Methods that mutate storage\n //\n\n /** Collection.modify()\n * \n * https://dexie.org/docs/Collection/Collection.modify()\n * \n **/\n modify(changes: UpdateSpec | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n var ctx = this._ctx;\n return this._write(trans => {\n var modifyer: (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean\n if (typeof changes === 'function') {\n // Changes is a function that may update, add or delete propterties or even require a deletion the object itself (delete this.item)\n modifyer = changes as (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean;\n } else {\n // changes is a set of {keyPath: value} and no one is listening to the updating hook.\n var keyPaths = keys(changes);\n var numKeys = keyPaths.length;\n modifyer = function (item) {\n let anythingModified = false;\n for (let i = 0; i < numKeys; ++i) {\n let keyPath = keyPaths[i];\n let val = changes[keyPath];\n let origVal = getByKeyPath(item, keyPath);\n\n if (val instanceof PropModification) {\n setByKeyPath(item, keyPath, val.execute(origVal));\n anythingModified = true;\n } else if (origVal !== val) {\n setByKeyPath(item, keyPath, val); // Adding {keyPath: undefined} means that the keyPath should be deleted. Handled by setByKeyPath\n anythingModified = true;\n }\n }\n return anythingModified;\n };\n }\n\n const coreTable = ctx.table.core;\n const {outbound, extractKey} = coreTable.schema.primaryKey;\n const limit = this.db._options.modifyChunkSize || 200;\n const totalFailures = [];\n let successCount = 0;\n const failedKeys: IndexableType[] = [];\n const applyMutateResult = (expectedCount: number, res: DBCoreMutateResponse) => {\n const {failures, numFailures} = res;\n successCount += expectedCount - numFailures;\n for (let pos of keys(failures)) {\n totalFailures.push(failures[pos]);\n }\n }\n return this.clone().primaryKeys().then(keys => {\n const criteria = isPlainKeyRange(ctx) &&\n ctx.limit === Infinity &&\n (typeof changes !== 'function' || changes === deleteCallback) && {\n index: ctx.index,\n range: ctx.range\n };\n\n const nextChunk = (offset: number) => {\n const count = Math.min(limit, keys.length - offset);\n return coreTable.getMany({\n trans,\n keys: keys.slice(offset, offset + count),\n cache: \"immutable\" // Optimize for 2 things:\n // 1) observability-middleware can track changes better.\n // 2) hooks middleware don't have to query the existing values again when tracking changes.\n // We can use \"immutable\" because we promise to not touch the values we retrieve here!\n }).then(values => {\n const addValues = [];\n const putValues = [];\n const putKeys = outbound ? [] : null;\n const deleteKeys = [];\n for (let i=0; i 0 &&\n coreTable.mutate({trans, type: 'add', values: addValues})\n .then(res => {\n for (let pos in res.failures) {\n // Remove from deleteKeys the key of the object that failed to change its primary key\n deleteKeys.splice(parseInt(pos), 1);\n }\n applyMutateResult(addValues.length, res);\n })\n ).then(()=>(putValues.length > 0 || (criteria && typeof changes === 'object')) &&\n coreTable.mutate({\n trans,\n type: 'put',\n keys: putKeys,\n values: putValues,\n criteria,\n changeSpec: typeof changes !== 'function'\n && changes,\n isAdditionalChunk: offset > 0\n }).then(res=>applyMutateResult(putValues.length, res))\n ).then(()=>(deleteKeys.length > 0 || (criteria && changes === deleteCallback)) &&\n coreTable.mutate({\n trans,\n type: 'delete',\n keys: deleteKeys,\n criteria,\n isAdditionalChunk: offset > 0\n }).then(res=>applyMutateResult(deleteKeys.length, res))\n ).then(()=>{\n return keys.length > offset + count && nextChunk(offset + limit);\n });\n });\n }\n\n return nextChunk(0).then(()=>{\n if (totalFailures.length > 0)\n throw new ModifyError(\"Error modifying one or more objects\", totalFailures, successCount, failedKeys as IndexableTypeArrayReadonly);\n\n return keys.length;\n });\n });\n\n });\n }\n\n /** Collection.delete()\n * \n * https://dexie.org/docs/Collection/Collection.delete()\n * \n **/\n delete() : PromiseExtended {\n var ctx = this._ctx,\n range = ctx.range;\n //deletingHook = ctx.table.hook.deleting.fire,\n //hasDeleteHook = deletingHook !== nop;\n if (isPlainKeyRange(ctx) &&\n (ctx.isPrimKey || range.type === DBCoreRangeType.Any)) // if no range, we'll use clear().\n {\n // May use IDBObjectStore.delete(IDBKeyRange) in this case (Issue #208)\n // For chromium, this is the way most optimized version.\n // For IE/Edge, this could hang the indexedDB engine and make operating system instable\n // (https://gist.github.com/dfahlander/5a39328f029de18222cf2125d56c38f7)\n return this._write(trans => {\n // Our API contract is to return a count of deleted items, so we have to count() before delete().\n const {primaryKey} = ctx.table.core.schema;\n const coreRange = range;\n return ctx.table.core.count({trans, query: {index: primaryKey, range: coreRange}}).then(count => {\n return ctx.table.core.mutate({trans, type: 'deleteRange', range: coreRange})\n .then(({failures, lastResult, results, numFailures}) => {\n if (numFailures) throw new ModifyError(\"Could not delete some values\",\n Object.keys(failures).map(pos => failures[pos]),\n count - numFailures);\n return count - numFailures;\n });\n });\n });\n }\n\n return this.modify(deleteCallback);\n }\n}\n\nconst deleteCallback = (value, ctx) => ctx.value = null;\n","import { Dexie } from '../../classes/dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Collection } from './collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\nimport { mirror } from '../../functions/chaining-functions';\n\n/** Constructs a Collection instance. */\nexport interface CollectionConstructor {\n new(whereClause?: WhereClause | null, keyRangeGenerator?: () => DBCoreKeyRange): Collection;\n prototype: Collection;\n}\n\n/** Generates a Collection constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createCollectionConstructor(db: Dexie) {\n return makeClassConstructor(\n Collection.prototype,\n\n function Collection(\n this: Collection,\n whereClause?: WhereClause | null,\n keyRangeGenerator?: () => DBCoreKeyRange)\n {\n this.db = db;\n let keyRange = AnyRange, error = null;\n if (keyRangeGenerator) try {\n keyRange = keyRangeGenerator();\n } catch (ex) {\n error = ex;\n }\n\n const whereCtx = whereClause._ctx;\n const table = whereCtx.table;\n const readingHook = table.hook.reading.fire;\n this._ctx = {\n table: table,\n index: whereCtx.index,\n isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)),\n range: keyRange,\n keysOnly: false,\n dir: \"next\",\n unique: \"\",\n algorithm: null,\n filter: null,\n replayFilter: null,\n justLimit: true, // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: null,\n offset: 0,\n limit: Infinity,\n error: error, // If set, any promise must be rejected with this error\n or: whereCtx.or,\n valueMapper: readingHook !== mirror ? readingHook : null\n };\n }\n );\n}\n","import { IndexableType } from '../public/types/indexable-type';\n\nexport function simpleCompare(a, b) {\n return a < b ? -1 : a === b ? 0 : 1;\n}\n\nexport function simpleCompareReverse(a, b) {\n return a > b ? -1 : a === b ? 0 : 1;\n}\n","import { WhereClause } from './where-clause';\nimport { Collection } from '../collection';\nimport { STRING_EXPECTED } from '../../globals/constants';\nimport { simpleCompare, simpleCompareReverse } from '../../functions/compare-functions';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange, DBCoreRangeType } from '../../public/types/dbcore';\n\nexport function fail(collectionOrWhereClause: Collection | WhereClause, err, T?) {\n var collection = collectionOrWhereClause instanceof WhereClause ?\n new collectionOrWhereClause.Collection (collectionOrWhereClause) :\n collectionOrWhereClause;\n \n collection._ctx.error = T ? new T(err) : new TypeError(err);\n return collection;\n}\n\nexport function emptyCollection(whereClause: WhereClause) {\n return new whereClause.Collection (whereClause, () => rangeEqual(\"\")).limit(0);\n}\n\nexport function upperFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toUpperCase() :\n (s: string) => s.toLowerCase();\n}\n\nexport function lowerFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toLowerCase() :\n (s: string) => s.toUpperCase();\n}\n\nexport function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) {\n var length = Math.min(key.length, lowerNeedle.length);\n var llp = -1;\n for (var i = 0; i < length; ++i) {\n var lwrKeyChar = lowerKey[i];\n if (lwrKeyChar !== lowerNeedle[i]) {\n if (cmp(key[i], upperNeedle[i]) < 0) return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1);\n if (cmp(key[i], lowerNeedle[i]) < 0) return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1);\n if (llp >= 0) return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1);\n return null;\n }\n if (cmp(key[i], lwrKeyChar) < 0) llp = i;\n }\n if (length < lowerNeedle.length && dir === \"next\") return key + upperNeedle.substr(key.length);\n if (length < key.length && dir === \"prev\") return key.substr(0, upperNeedle.length);\n return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1));\n}\n\nexport function addIgnoreCaseAlgorithm(whereClause: WhereClause, match, needles, suffix) {\n /// \n var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix,\n needlesLen = needles.length;\n if (!needles.every(s => typeof s === 'string')) {\n return fail(whereClause, STRING_EXPECTED);\n }\n function initDirection(dir) {\n upper = upperFactory(dir);\n lower = lowerFactory(dir);\n compare = (dir === \"next\" ? simpleCompare : simpleCompareReverse);\n var needleBounds = needles.map(function (needle){\n return {lower: lower(needle), upper: upper(needle)};\n }).sort(function(a,b) {\n return compare(a.lower, b.lower);\n });\n upperNeedles = needleBounds.map(function (nb){ return nb.upper; });\n lowerNeedles = needleBounds.map(function (nb){ return nb.lower; });\n direction = dir;\n nextKeySuffix = (dir === \"next\" ? \"\" : suffix);\n }\n initDirection(\"next\");\n\n var c = new whereClause.Collection (\n whereClause,\n ()=>createRange(upperNeedles[0], lowerNeedles[needlesLen-1] + suffix)\n );\n\n c._ondirectionchange = function (direction) {\n // This event onlys occur before filter is called the first time.\n initDirection(direction);\n };\n\n var firstPossibleNeedle = 0;\n\n c._addAlgorithm(function (cursor, advance, resolve) {\n /// \n /// \n /// \n var key = cursor.key;\n if (typeof key !== 'string') return false;\n var lowerKey = lower(key);\n if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) {\n return true;\n } else {\n var lowestPossibleCasing = null;\n for (var i=firstPossibleNeedle; i 0) {\n lowestPossibleCasing = casing;\n }\n }\n if (lowestPossibleCasing !== null) {\n advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); });\n } else {\n advance(resolve);\n }\n return false;\n }\n });\n return c;\n}\n\nexport function createRange (lower: IndexableType, upper: IndexableType, lowerOpen?: boolean, upperOpen?: boolean): DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Range,\n lower,\n upper,\n lowerOpen,\n upperOpen\n };\n}\n\nexport function rangeEqual (value: IndexableType) : DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Equal,\n lower: value,\n upper: value\n };\n}\n","import { WhereClause as IWhereClause } from \"../../public/types/where-clause\";\nimport { Collection } from \"../collection\";\nimport { Table } from \"../table\";\nimport { IndexableType } from \"../../public/types/indexable-type\";\nimport { emptyCollection, fail, addIgnoreCaseAlgorithm, createRange, rangeEqual } from './where-clause-helpers';\nimport { INVALID_KEY_ARGUMENT, STRING_EXPECTED, maxString, minKey } from '../../globals/constants';\nimport { getArrayOf, NO_CHAR_ARRAY } from '../../functions/utils';\nimport { exceptions } from '../../errors';\nimport { Dexie } from '../dexie';\nimport { Collection as ICollection} from \"../../public/types/collection\";\n\n/** class WhereClause\n * \n * https://dexie.org/docs/WhereClause/WhereClause\n */\nexport class WhereClause implements IWhereClause {\n db: Dexie;\n _IDBKeyRange: typeof IDBKeyRange;\n _ctx: {\n table: Table;\n index: string;\n or: Collection;\n }\n _cmp: (a: IndexableType, b: IndexableType) => number;\n _ascending: (a: IndexableType, b: IndexableType) => number;\n _descending: (a: IndexableType, b: IndexableType) => number;\n _min: (a: IndexableType, b: IndexableType) => IndexableType;\n _max: (a: IndexableType, b: IndexableType) => IndexableType;\n\n get Collection() {\n return this._ctx.table.db.Collection;\n }\n\n /** WhereClause.between()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.between()\n * \n **/\n between(lower: IndexableType, upper: IndexableType, includeLower?: boolean, includeUpper?: boolean) {\n includeLower = includeLower !== false; // Default to true\n includeUpper = includeUpper === true; // Default to false\n try {\n if ((this._cmp(lower, upper) > 0) ||\n (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper)))\n return emptyCollection(this); // Workaround for idiotic W3C Specification that DataError must be thrown if lower > upper. The natural result would be to return an empty collection.\n return new this.Collection(this, ()=>createRange(lower, upper, !includeLower, !includeUpper));\n } catch (e) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n }\n\n /** WhereClause.equals()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equals()\n * \n **/\n equals(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => rangeEqual(value)) as ICollection;\n }\n\n /** WhereClause.above()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.above()\n * \n **/\n above(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, true));\n }\n\n /** WhereClause.aboveOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.aboveOrEqual()\n * \n **/\n aboveOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, false));\n }\n\n /** WhereClause.below()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.below()\n * \n **/\n below(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value, false, true));\n }\n\n /** WhereClause.belowOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.belowOrEqual()\n * \n **/\n belowOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value));\n }\n\n /** WhereClause.startsWith()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWith()\n * \n **/\n startsWith(str: string) {\n if (typeof str !== 'string') return fail(this, STRING_EXPECTED);\n return this.between(str, str + maxString, true, true);\n }\n\n /** WhereClause.startsWithIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithIgnoreCase()\n * \n **/\n startsWithIgnoreCase(str: string) {\n if (str === \"\") return this.startsWith(str);\n return addIgnoreCaseAlgorithm(this, (x, a) => x.indexOf(a[0]) === 0, [str], maxString);\n }\n\n /** WhereClause.equalsIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equalsIgnoreCase()\n * \n **/\n equalsIgnoreCase(str: string) {\n return addIgnoreCaseAlgorithm(this, (x, a) => x === a[0], [str], \"\");\n }\n\n /** WhereClause.anyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOfIgnoreCase()\n * \n **/\n anyOfIgnoreCase(...values: string[]): Collection;\n anyOfIgnoreCase(values: string[]): Collection;\n anyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.indexOf(x) !== -1, set, \"\");\n }\n\n /** WhereClause.startsWithAnyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOfIgnoreCase()\n * \n **/\n startsWithAnyOfIgnoreCase(...values: string[]): Collection;\n startsWithAnyOfIgnoreCase(values: string[]): Collection;\n startsWithAnyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.some(n => x.indexOf(n) === 0), set, maxString);\n }\n\n /** WhereClause.anyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOf()\n * \n **/\n anyOf(...values: string[]): Collection;\n anyOf(values: string[]): Collection;\n anyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n let compare = this._cmp;\n try { set.sort(compare); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n if (set.length === 0) return emptyCollection(this);\n const c = new this.Collection(this, () => createRange(set[0], set[set.length - 1]));\n\n c._ondirectionchange = direction => {\n compare = (direction === \"next\" ?\n this._ascending :\n this._descending);\n set.sort(compare);\n };\n\n let i = 0;\n c._addAlgorithm((cursor, advance, resolve) => {\n const key = cursor.key;\n while (compare(key, set[i]) > 0) {\n // The cursor has passed beyond this key. Check next.\n ++i;\n if (i === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (compare(key, set[i]) === 0) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => { cursor.continue(set[i]); });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.notEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.notEqual()\n * \n **/\n notEqual(value: IndexableType) {\n return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.noneOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.noneOf()\n * \n **/\n noneOf(...values: string[]): Collection;\n noneOf(values: string[]): Collection;\n noneOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return new this.Collection(this); // Return entire collection.\n try { set.sort(this._ascending); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n // Transform [\"a\",\"b\",\"c\"] to a set of ranges for between/above/below: [[minKey,\"a\"], [\"a\",\"b\"], [\"b\",\"c\"], [\"c\",maxKey]]\n const ranges = set.reduce(\n (res, val) => res ?\n res.concat([[res[res.length - 1][1], val]]) :\n [[minKey, val]],\n null);\n ranges.push([set[set.length - 1], this.db._maxKey]);\n return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.inAnyRange()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.inAnyRange()\n * \n **/\n inAnyRange(\n ranges: ReadonlyArray<{ 0: IndexableType, 1: IndexableType }>,\n options?: { includeLowers?: boolean, includeUppers?: boolean })\n {\n const cmp = this._cmp,\n ascending = this._ascending,\n descending = this._descending,\n min = this._min,\n max = this._max;\n\n if (ranges.length === 0) return emptyCollection(this);\n if (!ranges.every(range =>\n range[0] !== undefined &&\n range[1] !== undefined &&\n ascending(range[0], range[1]) <= 0)) {\n return fail(\n this,\n \"First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower\",\n exceptions.InvalidArgument);\n }\n const includeLowers = !options || options.includeLowers !== false; // Default to true\n const includeUppers = options && options.includeUppers === true; // Default to false\n\n function addRange(ranges, newRange) {\n let i = 0, l = ranges.length;\n for (; i < l; ++i) {\n const range = ranges[i];\n if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) {\n range[0] = min(range[0], newRange[0]);\n range[1] = max(range[1], newRange[1]);\n break;\n }\n }\n if (i === l)\n ranges.push(newRange);\n return ranges;\n }\n\n let sortDirection = ascending;\n function rangeSorter(a, b) { return sortDirection(a[0], b[0]); }\n\n // Join overlapping ranges\n let set;\n try {\n set = ranges.reduce(addRange, []);\n set.sort(rangeSorter);\n } catch (ex) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n\n let rangePos = 0;\n const keyIsBeyondCurrentEntry = includeUppers ?\n key => ascending(key, set[rangePos][1]) > 0 :\n key => ascending(key, set[rangePos][1]) >= 0;\n\n const keyIsBeforeCurrentEntry = includeLowers ?\n key => descending(key, set[rangePos][0]) > 0 :\n key => descending(key, set[rangePos][0]) >= 0;\n\n function keyWithinCurrentRange(key) {\n return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key);\n }\n\n let checkKey = keyIsBeyondCurrentEntry;\n\n const c = new this.Collection(\n this,\n () => createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers));\n\n c._ondirectionchange = direction => {\n if (direction === \"next\") {\n checkKey = keyIsBeyondCurrentEntry;\n sortDirection = ascending;\n } else {\n checkKey = keyIsBeforeCurrentEntry;\n sortDirection = descending;\n }\n set.sort(rangeSorter);\n };\n\n c._addAlgorithm((cursor, advance, resolve) => {\n var key = cursor.key;\n while (checkKey(key)) {\n // The cursor has passed beyond this key. Check next.\n ++rangePos;\n if (rangePos === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (keyWithinCurrentRange(key)) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else if (this._cmp(key, set[rangePos][1]) === 0 || this._cmp(key, set[rangePos][0]) === 0) {\n // includeUpper or includeLower is false so keyWithinCurrentRange() returns false even though we are at range border.\n // Continue to next key but don't include this one.\n return false;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => {\n if (sortDirection === ascending) cursor.continue(set[rangePos][0]);\n else cursor.continue(set[rangePos][1]);\n });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.startsWithAnyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOf()\n * \n **/\n startsWithAnyOf(...prefixes: string[]): Collection;\n startsWithAnyOf(prefixes: string[]): Collection;\n startsWithAnyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n\n if (!set.every(s => typeof s === 'string')) {\n return fail(this, \"startsWithAnyOf() only works with strings\");\n }\n if (set.length === 0) return emptyCollection(this);\n\n return this.inAnyRange(set.map((str: string) => [str, str + maxString]));\n }\n\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { WhereClause } from './where-clause';\nimport { Table } from '../table';\nimport { Collection } from '../collection';\nimport { exceptions } from '../../errors';\nimport { cmp } from '../../functions/cmp';\n\nexport interface WhereClauseConstructor {\n new(table: Table, index?: string, orCollection?: Collection): WhereClause;\n prototype: WhereClause;\n}\n\n/** Generates a WhereClause constructor.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createWhereClauseConstructor(db: Dexie) {\n return makeClassConstructor(\n WhereClause.prototype,\n\n function WhereClause(this: WhereClause, table: Table, index?: string, orCollection?: Collection) {\n this.db = db;\n this._ctx = {\n table: table,\n index: index === \":id\" ? null : index,\n or: orCollection\n };\n this._cmp = this._ascending = cmp;\n this._descending = (a, b) => cmp(b, a);\n this._max = (a, b) => cmp(a,b) > 0 ? a : b;\n this._min = (a, b) => cmp(a,b) < 0 ? a : b;\n this._IDBKeyRange = db._deps.IDBKeyRange;\n if (!this._IDBKeyRange) throw new exceptions.MissingAPI();\n }\n );\n}\n","import { wrap } from \"../helpers/promise\";\n\nexport function eventRejectHandler(reject) {\n return wrap(function (event) {\n preventDefault(event);\n reject (event.target.error);\n return false;\n });\n}\n\nexport function eventSuccessHandler (resolve) {\n return wrap(function (event){\n resolve(event.target.result);\n });\n}\n\nexport function hookedEventRejectHandler (reject) {\n return wrap(function (event) {\n // See comment on hookedEventSuccessHandler() why wrap() is needed only when supporting hooks.\n \n var req = event.target,\n err = req.error,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n hookErrorHandler = ctx && ctx.onerror;\n hookErrorHandler && hookErrorHandler(err);\n preventDefault(event);\n reject (err);\n return false;\n });\n}\n\nexport function hookedEventSuccessHandler(resolve) {\n // wrap() is needed when calling hooks because the rare scenario of:\n // * hook does a db operation that fails immediately (IDB throws exception)\n // For calling db operations on correct transaction, wrap makes sure to set PSD correctly.\n // wrap() will also execute in a virtual tick.\n // * If not wrapped in a virtual tick, direct exception will launch a new physical tick.\n // * If this was the last event in the bulk, the promise will resolve after a physical tick\n // and the transaction will have committed already.\n // If no hook, the virtual tick will be executed in the reject()/resolve of the final promise,\n // because it is always marked with _lib = true when created using Transaction._promise().\n return wrap(function(event) {\n var req = event.target,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n result = ctx.value || req.result, // Pass the object value on updates. The result from IDB is the primary key.\n hookSuccessHandler = ctx && ctx.onsuccess;\n hookSuccessHandler && hookSuccessHandler(result);\n resolve && resolve(result);\n }, resolve);\n}\n\n\nexport function preventDefault(event) {\n if (event.stopPropagation) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.stopPropagation();\n if (event.preventDefault) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.preventDefault();\n}\n\nexport function BulkErrorHandlerCatchAll(errorList, done?, supportHooks?) {\n return (supportHooks ? hookedEventRejectHandler : eventRejectHandler)(e => {\n errorList.push(e);\n done && done();\n });\n}\n\n","import Events from '../helpers/Events';\nimport { GlobalDexieEvents } from '../public/types/db-events';\n\nexport const DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated' as 'storagemutated';\n\n// Name of the global event fired using DOM dispatchEvent (if not in node).\n// Reason for propagating this as a DOM event is for getting reactivity across\n// multiple versions of Dexie within the same app (as long as they are\n// compatible with regards to the event data).\n// If the ObservabilitySet protocol change in a way that would not be backward\n// compatible, make sure also update the event name to a new number at the end\n// so that two Dexie instances of different versions continue to work together\n// - maybe not able to communicate but won't fail due to unexpected data in\n// the detail property of the CustomEvent. If so, also make sure to udpate\n// docs and explain at which Dexie version the new name and format of the event\n// is being used.\nexport const STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1';\n\nexport const globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME) as GlobalDexieEvents;\n","import { Transaction as ITransaction } from '../../public/types/transaction';\nimport { DexiePromise, wrap, rejection } from \"../../helpers/promise\";\nimport { DbSchema } from '../../public/types/db-schema';\nimport { assert, hasOwn } from '../../functions/utils';\nimport { PSD, usePSD } from '../../helpers/promise';\nimport { Dexie } from '../dexie';\nimport { exceptions } from '../../errors';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { preventDefault } from '../../functions/event-wrappers';\nimport { newScope } from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { Table } from '../table';\nimport { globalEvents } from '../../globals/global-events';\n\n/** Transaction\n * \n * https://dexie.org/docs/Transaction/Transaction\n * \n **/\nexport class Transaction implements ITransaction {\n db: Dexie;\n active: boolean;\n mode: IDBTransactionMode;\n chromeTransactionDurability: ChromeTransactionDurability;\n idbtrans: IDBTransaction;\n storeNames: string[];\n explicit?: boolean;\n on: any;\n parent?: Transaction;\n schema: DbSchema;\n _memoizedTables: {[tableName: string]: Table};\n\n _reculock: number;\n _blockedFuncs: { 0: () => any, 1: any }[];\n _resolve: () => void;\n _reject: (Error) => void;\n _waitingFor: DexiePromise; // for waitFor()\n _waitingQueue: Function[]; // for waitFor()\n _spinCount: number; // Just for debugging waitFor()\n _completion: DexiePromise;\n\n //\n // Transaction internal methods (not required by API users, but needed internally and eventually by dexie extensions)\n //\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _lock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n // Temporary set all requests into a pending queue if they are called before database is ready.\n ++this._reculock; // Recursive read/write lock pattern using PSD (Promise Specific Data) instead of TLS (Thread Local Storage)\n if (this._reculock === 1 && !PSD.global) PSD.lockOwnerFor = this;\n return this;\n }\n\n /** Transaction._unlock()\n * \n * Internal method.\n */\n _unlock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n if (--this._reculock === 0) {\n if (!PSD.global) PSD.lockOwnerFor = null;\n while (this._blockedFuncs.length > 0 && !this._locked()) {\n var fnAndPSD = this._blockedFuncs.shift();\n try { usePSD(fnAndPSD[1], fnAndPSD[0]); } catch (e) { }\n }\n }\n return this;\n }\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _locked() {\n // Checks if any write-lock is applied on this transaction.\n // To simplify the Dexie API for extension implementations, we support recursive locks.\n // This is accomplished by using \"Promise Specific Data\" (PSD).\n // PSD data is bound to a Promise and any child Promise emitted through then() or resolve( new Promise() ).\n // PSD is local to code executing on top of the call stacks of any of any code executed by Promise():\n // * callback given to the Promise() constructor (function (resolve, reject){...})\n // * callbacks given to then()/catch()/finally() methods (function (value){...})\n // If creating a new independant Promise instance from within a Promise call stack, the new Promise will derive the PSD from the call stack of the parent Promise.\n // Derivation is done so that the inner PSD __proto__ points to the outer PSD.\n // PSD.lockOwnerFor will point to current transaction object if the currently executing PSD scope owns the lock.\n return this._reculock && PSD.lockOwnerFor !== this;\n }\n\n /** Transaction.create()\n * \n * Internal method.\n * \n */\n create(idbtrans?: IDBTransaction & {[prop: string]: any}) {\n if (!this.mode) return this;\n const idbdb = this.db.idbdb;\n const dbOpenError = this.db._state.dbOpenError;\n assert(!this.idbtrans);\n if (!idbtrans && !idbdb) {\n switch (dbOpenError && dbOpenError.name) {\n case \"DatabaseClosedError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.DatabaseClosed(dbOpenError);\n case \"MissingAPIError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError);\n default:\n // Make it clear that the user operation was not what caused the error - the error had occurred earlier on db.open()!\n throw new exceptions.OpenFailed(dbOpenError);\n }\n }\n if (!this.active) throw new exceptions.TransactionInactive();\n assert(this._completion._state === null); // Completion Promise must still be pending.\n\n idbtrans = this.idbtrans = idbtrans ||\n (this.db.core \n ? this.db.core.transaction(this.storeNames, this.mode as 'readwrite' | 'readonly', { durability: this.chromeTransactionDurability })\n : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })\n ) as IDBTransaction;\n\n idbtrans.onerror = wrap(ev => {\n preventDefault(ev);// Prohibit default bubbling to window.error\n this._reject(idbtrans.error);\n });\n idbtrans.onabort = wrap(ev => {\n preventDefault(ev);\n this.active && this._reject(new exceptions.Abort(idbtrans.error));\n this.active = false;\n this.on(\"abort\").fire(ev);\n });\n idbtrans.oncomplete = wrap(() => {\n this.active = false;\n this._resolve();\n if ('mutatedParts' in idbtrans) {\n globalEvents.storagemutated.fire(idbtrans[\"mutatedParts\"]);\n }\n });\n return this;\n }\n\n /** Transaction._promise()\n * \n * Internal method.\n */\n _promise(\n mode: IDBTransactionMode,\n fn: (resolve, reject, trans: Transaction) => PromiseLike | void,\n bWriteLock?: string | boolean): DexiePromise\n {\n if (mode === 'readwrite' && this.mode !== 'readwrite')\n return rejection(new exceptions.ReadOnly(\"Transaction is readonly\"));\n\n if (!this.active)\n return rejection(new exceptions.TransactionInactive());\n\n if (this._locked()) {\n return new DexiePromise((resolve, reject) => {\n this._blockedFuncs.push([() => {\n this._promise(mode, fn, bWriteLock).then(resolve, reject);\n }, PSD]);\n });\n\n } else if (bWriteLock) {\n return newScope(() => {\n var p = new DexiePromise((resolve, reject) => {\n this._lock();\n const rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p.finally(() => this._unlock());\n p._lib = true;\n return p;\n });\n\n } else {\n var p = new DexiePromise((resolve, reject) => {\n var rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p._lib = true;\n return p;\n }\n }\n\n /** Transaction._root()\n * \n * Internal method. Retrieves the root transaction in the tree of sub transactions.\n */\n _root() {\n return this.parent ? this.parent._root() : this;\n }\n\n /** Transaction.waitFor()\n * \n * Internal method. Can be accessed from the public API through\n * Dexie.waitFor(): https://dexie.org/docs/Dexie/Dexie.waitFor()\n * \n **/\n waitFor(promiseLike: PromiseLike) {\n // Always operate on the root transaction (in case this is a sub stransaction)\n var root = this._root();\n // For stability reasons, convert parameter to promise no matter what type is passed to waitFor().\n // (We must be able to call .then() on it.)\n const promise = DexiePromise.resolve(promiseLike);\n if (root._waitingFor) {\n // Already called waitFor(). Wait for both to complete.\n root._waitingFor = root._waitingFor.then(() => promise);\n } else {\n // We're not in waiting state. Start waiting state.\n root._waitingFor = promise;\n root._waitingQueue = [];\n // Start interacting with indexedDB until promise completes:\n var store = root.idbtrans.objectStore(root.storeNames[0]);\n (function spin() {\n ++root._spinCount; // For debugging only\n while (root._waitingQueue.length) (root._waitingQueue.shift())();\n if (root._waitingFor) store.get(-Infinity).onsuccess = spin;\n }());\n }\n var currentWaitPromise = root._waitingFor;\n return new DexiePromise((resolve, reject) => {\n promise.then(\n res => root._waitingQueue.push(wrap(resolve.bind(null, res))),\n err => root._waitingQueue.push(wrap(reject.bind(null, err)))\n ).finally(() => {\n if (root._waitingFor === currentWaitPromise) {\n // No one added a wait after us. Safe to stop the spinning.\n root._waitingFor = null;\n }\n });\n });\n } \n\n /** Transaction.abort()\n * \n * https://dexie.org/docs/Transaction/Transaction.abort()\n */\n abort() {\n if (this.active) {\n this.active = false;\n if (this.idbtrans) this.idbtrans.abort();\n this._reject(new exceptions.Abort());\n }\n }\n\n /** Transaction.table()\n * \n * https://dexie.org/docs/Transaction/Transaction.table()\n */\n table(tableName: string) {\n const memoizedTables = (this._memoizedTables || (this._memoizedTables = {}));\n if (hasOwn(memoizedTables, tableName))\n return memoizedTables[tableName];\n const tableSchema = this.schema[tableName];\n if (!tableSchema) {\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\"); \n }\n\n const transactionBoundTable = new this.db.Table(tableName, tableSchema, this);\n transactionBoundTable.core = this.db.core.table(tableName);\n memoizedTables[tableName] = transactionBoundTable;\n return transactionBoundTable;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Transaction } from './transaction';\nimport { DbSchema } from '../../public/types/db-schema';\nimport Events from '../../helpers/Events';\nimport Promise, { rejection } from '../../helpers/promise';\n\nexport interface TransactionConstructor {\n new (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction) : T;\n prototype: T;\n}\n\n/** Generates a Transaction constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTransactionConstructor(db: Dexie) {\n return makeClassConstructor>(\n Transaction.prototype,\n function Transaction (\n this: Transaction,\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction)\n {\n this.db = db;\n this.mode = mode;\n this.storeNames = storeNames;\n this.schema = dbschema;\n this.chromeTransactionDurability = chromeTransactionDurability;\n this.idbtrans = null;\n this.on = Events(this, \"complete\", \"error\", \"abort\");\n this.parent = parent || null;\n this.active = true;\n this._reculock = 0;\n this._blockedFuncs = [];\n this._resolve = null;\n this._reject = null;\n this._waitingFor = null;\n this._waitingQueue = null;\n this._spinCount = 0; // Just for debugging waitFor()\n this._completion = new Promise ((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n \n this._completion.then(\n ()=> {\n this.active = false;\n this.on.complete.fire();\n },\n e => {\n var wasActive = this.active;\n this.active = false;\n this.on.error.fire(e);\n this.parent ?\n this.parent._reject(e) :\n wasActive && this.idbtrans && this.idbtrans.abort();\n return rejection(e); // Indicate we actually DO NOT catch this error.\n });\n \n });\n}\n","import { IndexSpec } from '../public/types/index-spec';\n\nexport function createIndexSpec(\n name: string,\n keyPath: string | string[],\n unique: boolean,\n multi: boolean,\n auto: boolean,\n compound: boolean,\n isPrimKey: boolean\n): IndexSpec {\n return {\n name,\n keyPath,\n unique,\n multi,\n auto,\n compound,\n src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? \"++\" : \"\") + nameFromKeyPath(keyPath)\n }\n}\n\nexport function nameFromKeyPath (keyPath?: string | string[]): string {\n return typeof keyPath === 'string' ?\n keyPath :\n keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : \"\";\n}\n","import { IndexSpec } from '../public/types/index-spec';\nimport { TableSchema } from '../public/types/table-schema';\nimport { createIndexSpec } from './index-spec';\nimport { arrayToObject } from '../functions/utils';\n\nexport function createTableSchema (\n name: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n): TableSchema {\n return {\n name,\n primKey,\n indexes,\n mappedClass: null,\n idxByName: arrayToObject(indexes, index => [index.name, index])\n };\n}\n","import { maxString } from '../globals/constants';\n\nexport function safariMultiStoreFix(storeNames: string[]) {\n return storeNames.length === 1 ? storeNames[0] : storeNames;\n}\n\nexport function getNativeGetDatabaseNamesFn(indexedDB) {\n var fn = indexedDB && (indexedDB.getDatabaseNames || indexedDB.webkitGetDatabaseNames);\n return fn && fn.bind(indexedDB);\n}\n\nexport let getMaxKey = (IdbKeyRange: typeof IDBKeyRange) => {\n try {\n IdbKeyRange.only([[]]);\n getMaxKey = () => [[]];\n return [[]];\n } catch (e) {\n getMaxKey = () => maxString;\n return maxString;\n }\n}\n","import { getByKeyPath } from '../functions/utils';\n\nexport function getKeyExtractor (keyPath: null | string | string[]) : (a: any) => any {\n if (keyPath == null) {\n return () => undefined;\n } else if (typeof keyPath === 'string') {\n return getSinglePathKeyExtractor(keyPath);\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n\nexport function getSinglePathKeyExtractor(keyPath: string) {\n const split = keyPath.split('.');\n if (split.length === 1) {\n return obj => obj[keyPath];\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n","import {\n DBCore,\n DBCoreCursor,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryResponse,\n DBCoreRangeType,\n DBCoreSchema,\n DBCoreTableSchema,\n DBCoreTable,\n DBCoreMutateResponse,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { eventRejectHandler, preventDefault } from '../functions/event-wrappers';\nimport { wrap } from '../helpers/promise';\nimport { getMaxKey } from '../functions/quirks';\nimport { getKeyExtractor } from './get-key-extractor';\n\nexport function arrayify(arrayLike: {length: number, [index: number]: T}): T[] {\n return [].slice.call(arrayLike);\n}\nexport function pick(obj: T, props: Prop[]): Pick {\n const result = {} as Pick;\n props.forEach(prop => result[prop] = obj[prop]);\n return result;\n}\n\nlet _id_counter = 0;\n\nexport function getKeyPathAlias(keyPath: null | string | string[]) {\n return keyPath == null ?\n \":id\" :\n typeof keyPath === 'string' ?\n keyPath :\n `[${keyPath.join('+')}]`;\n}\n\nexport function createDBCore (\n db: IDBDatabase,\n IdbKeyRange: typeof IDBKeyRange,\n tmpTrans: IDBTransaction) : DBCore\n{\n function extractSchema(db: IDBDatabase, trans: IDBTransaction) : {schema: DBCoreSchema, hasGetAll: boolean} {\n const tables = arrayify(db.objectStoreNames);\n return {\n schema: {\n name: db.name,\n tables: tables.map(table => trans.objectStore(table)).map(store => {\n const {keyPath, autoIncrement} = store;\n const compound = isArray(keyPath);\n const outbound = keyPath == null;\n const indexByKeyPath: {[keyPathAlias: string]: DBCoreIndex} = {};\n const result = {\n name: store.name,\n primaryKey: {\n name: null,\n isPrimaryKey: true,\n outbound,\n compound,\n keyPath,\n autoIncrement,\n unique: true,\n extractKey: getKeyExtractor(keyPath)\n } as DBCoreIndex,\n indexes: arrayify(store.indexNames).map(indexName => store.index(indexName))\n .map(index => {\n const {name, unique, multiEntry, keyPath} = index;\n const compound = isArray(keyPath);\n const result: DBCoreIndex = {\n name,\n compound,\n keyPath,\n unique,\n multiEntry,\n extractKey: getKeyExtractor(keyPath)\n };\n indexByKeyPath[getKeyPathAlias(keyPath)] = result;\n return result;\n }),\n getIndexByKeyPath: (keyPath: null | string | string[]) => indexByKeyPath[getKeyPathAlias(keyPath)]\n };\n indexByKeyPath[\":id\"] = result.primaryKey;\n if (keyPath != null) {\n indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey;\n }\n return result;\n })\n },\n hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) &&\n !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604) // Bug with getAll() on Safari ver<604. See discussion following PR #579\n };\n }\n\n function makeIDBKeyRange (range: DBCoreKeyRange) : IDBKeyRange | null {\n if (range.type === DBCoreRangeType.Any) return null;\n if (range.type === DBCoreRangeType.Never) throw new Error(\"Cannot convert never type to IDBKeyRange\");\n const {lower, upper, lowerOpen, upperOpen} = range;\n const idbRange = lower === undefined ?\n upper === undefined ?\n null : //IDBKeyRange.lowerBound(-Infinity, false) : // Any range (TODO: Should we return null instead?)\n IdbKeyRange.upperBound(upper, !!upperOpen) : // below\n upper === undefined ?\n IdbKeyRange.lowerBound(lower, !!lowerOpen) : // above\n IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen);\n return idbRange;\n }\n\n function createDbCoreTable(tableSchema: DBCoreTableSchema): DBCoreTable {\n const tableName = tableSchema.name;\n\n function mutate ({trans, type, keys, values, range}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const outbound = store.keyPath == null;\n const isAddOrPut = type === \"put\" || type === \"add\";\n if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange')\n throw new Error (\"Invalid operation type: \" + type);\n\n const {length} = keys || values || {length: 1}; // keys.length if keys. values.length if values. 1 if range.\n if (keys && values && keys.length !== values.length) {\n throw new Error(\"Given keys array must have same length as given values array.\");\n }\n if (length === 0)\n // No items to write. Don't even bother!\n return resolve({numFailures: 0, failures: {}, results: [], lastResult: undefined});\n\n let req: IDBRequest;\n const reqs: IDBRequest[] = [];\n \n const failures: {[operationNumber: number]: Error} = [];\n let numFailures = 0;\n const errorHandler = \n event => {\n ++numFailures;\n preventDefault(event);\n };\n \n if (type === 'deleteRange') {\n // Here the argument is the range\n if (range.type === DBCoreRangeType.Never)\n return resolve({numFailures, failures, results: [], lastResult: undefined}); // Deleting the Never range shoulnt do anything.\n if (range.type === DBCoreRangeType.Any)\n reqs.push(req = store.clear()); // Deleting the Any range is equivalent to store.clear()\n else\n reqs.push(req = store.delete(makeIDBKeyRange(range)));\n } else {\n // No matter add, put or delete - find out arrays of first and second arguments to it.\n const [args1, args2] = isAddOrPut ?\n outbound ?\n [values, keys] :\n [values, null] :\n [keys, null];\n\n if (isAddOrPut) {\n for (let i=0; i {\n const lastResult = event.target.result;\n reqs.forEach((req, i) => req.error != null && (failures[i] = req.error));\n resolve({\n numFailures,\n failures,\n results: type === \"delete\" ? keys : reqs.map(req => req.result),\n lastResult\n });\n };\n \n req.onerror = event => { // wrap() not needed. All paths calling outside will wrap!\n errorHandler(event);\n done(event);\n };\n \n req.onsuccess = done;\n });\n }\n \n function openCursor ({trans, values, query, reverse, unique}: DBCoreOpenCursorRequest): Promise\n {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n // source\n const source = index.isPrimaryKey ?\n store :\n store.index(index.name);\n // direction\n const direction = reverse ?\n unique ?\n \"prevunique\" :\n \"prev\" :\n unique ?\n \"nextunique\" :\n \"next\";\n // request\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(makeIDBKeyRange(range), direction) :\n source.openKeyCursor(makeIDBKeyRange(range), direction);\n \n // iteration\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = wrap(ev => {\n\n const cursor = req.result as unknown as DBCoreCursor;\n if (!cursor) {\n resolve(null);\n return;\n }\n (cursor as any).___id = ++_id_counter;\n (cursor as any).done = false;\n const _cursorContinue = cursor.continue.bind(cursor);\n let _cursorContinuePrimaryKey = cursor.continuePrimaryKey;\n if (_cursorContinuePrimaryKey) _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor);\n const _cursorAdvance = cursor.advance.bind(cursor);\n const doThrowCursorIsNotStarted = ()=>{throw new Error(\"Cursor not started\");}\n const doThrowCursorIsStopped = ()=>{throw new Error(\"Cursor not stopped\");}\n (cursor as any).trans = trans;\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted;\n cursor.fail = wrap(reject);\n cursor.next = function (this: DBCoreCursor) {\n // next() must work with \"this\" pointer in order to function correctly for ProxyCursors (derived objects)\n // without having to re-define next() on each child.\n let gotOne = 1;\n return this.start(() => gotOne-- ? this.continue() : this.stop()).then(() => this);\n };\n cursor.start = (callback) => {\n //console.log(\"Starting cursor\", (cursor as any).___id);\n const iterationPromise = new Promise((resolveIteration, rejectIteration) =>{\n resolveIteration = wrap(resolveIteration);\n req.onerror = eventRejectHandler(rejectIteration);\n cursor.fail = rejectIteration;\n cursor.stop = value => {\n //console.log(\"Cursor stop\", cursor);\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped;\n resolveIteration(value);\n };\n });\n // Now change req.onsuccess to a callback that doesn't call initCursor but just observer.next()\n const guardedCallback = () => {\n if (req.result) {\n //console.log(\"Next result\", cursor);\n try {\n callback();\n } catch (err) {\n cursor.fail(err);\n }\n } else {\n (cursor as any).done = true;\n cursor.start = ()=>{throw new Error(\"Cursor behind last entry\");}\n cursor.stop();\n }\n }\n req.onsuccess = wrap(ev => {\n //cursor.continue = _cursorContinue;\n //cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n //cursor.advance = _cursorAdvance;\n req.onsuccess = guardedCallback;\n guardedCallback();\n });\n cursor.continue = _cursorContinue;\n cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n cursor.advance = _cursorAdvance;\n guardedCallback();\n return iterationPromise;\n };\n resolve(cursor);\n }, reject); \n });\n }\n \n function query (hasGetAll: boolean) {\n return (request: DBCoreQueryRequest) => {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {trans, values, limit, query} = request;\n const nonInfinitLimit = limit === Infinity ? undefined : limit;\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n if (limit === 0) return resolve({result: []});\n if (hasGetAll) {\n const req = values ?\n (source as any).getAll(idbKeyRange, nonInfinitLimit) :\n (source as any).getAllKeys(idbKeyRange, nonInfinitLimit);\n req.onsuccess = event => resolve({result: event.target.result});\n req.onerror = eventRejectHandler(reject);\n } else {\n let count = 0;\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(idbKeyRange) :\n source.openKeyCursor(idbKeyRange)\n const result = [];\n req.onsuccess = event => {\n const cursor = req.result as IDBCursorWithValue;\n if (!cursor) return resolve({result});\n result.push(values ? cursor.value : cursor.primaryKey);\n if (++count === limit) return resolve({result});\n cursor.continue();\n };\n req.onerror = eventRejectHandler(reject);\n }\n });\n };\n }\n \n return {\n name: tableName,\n schema: tableSchema,\n \n mutate,\n\n getMany ({trans, keys}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const length = keys.length;\n const result = new Array(length);\n let keyCount = 0;\n let callbackCount = 0;\n let valueCount = 0;\n let req: IDBRequest & {_pos?: number};\n \n const successHandler = event => {\n const req = event.target;\n if ((result[req._pos] = req.result) != null) ++valueCount;\n if (++callbackCount === keyCount) resolve(result);\n };\n const errorHandler = eventRejectHandler(reject);\n \n for (let i=0; i((resolve, reject) => {\n resolve = wrap (resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const req = store.get(key);\n req.onsuccess = event => resolve((event.target as any).result);\n req.onerror = eventRejectHandler(reject);\n });\n },\n\n query: query(hasGetAll),\n \n openCursor,\n\n count ({query, trans}) {\n const {index, range} = query;\n return new Promise((resolve, reject) => {\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n const req = idbKeyRange ? source.count(idbKeyRange) : source.count();\n req.onsuccess = wrap(ev => resolve((ev.target as IDBRequest).result));\n req.onerror = eventRejectHandler(reject);\n });\n }\n };\n }\n\n const {schema, hasGetAll} = extractSchema(db, tmpTrans);\n const tables = schema.tables.map(tableSchema => createDbCoreTable(tableSchema));\n const tableMap: {[name: string]: DBCoreTable} = {};\n tables.forEach(table => tableMap[table.name] = table);\n return {\n stack: \"dbcore\",\n \n transaction: db.transaction.bind(db),\n\n table(name: string) {\n const result = tableMap[name];\n if (!result) throw new Error(`Table '${name}' not found`);\n return tableMap[name];\n },\n\n MIN_KEY: -Infinity,\n\n MAX_KEY: getMaxKey(IdbKeyRange),\n\n schema\n\n };\n}\n","import { Dexie } from './';\nimport { createDBCore } from '../../dbcore/dbcore-indexeddb';\nimport { DBCore } from '../../public/types/dbcore';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { DexieStacks, Middleware } from '../../public/types/middleware';\nimport { exceptions } from '../../errors';\n\nfunction createMiddlewareStack(\n stackImpl: {stack: string},\n middlewares: Middleware<{stack: string}>[]): TStack {\n return middlewares.reduce((down, {create}) => ({...down, ...create(down)}), stackImpl) as TStack;\n} \n\nfunction createMiddlewareStacks(\n middlewares: {[StackName in keyof DexieStacks]?: Middleware[]},\n idbdb: IDBDatabase,\n {IDBKeyRange, indexedDB}: DexieDOMDependencies,\n tmpTrans: IDBTransaction): {[StackName in keyof DexieStacks]?: DexieStacks[StackName]}\n{\n const dbcore = createMiddlewareStack(\n createDBCore(idbdb, IDBKeyRange, tmpTrans),\n middlewares.dbcore);\n \n // TODO: Create other stacks the same way as above. They might be dependant on the result\n // of creating dbcore stack.\n\n return {\n dbcore\n };\n}\n\nexport function generateMiddlewareStacks(db: Dexie, tmpTrans: IDBTransaction) {\n const idbdb = tmpTrans.db;\n const stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans);\n db.core = stacks.dbcore!;\n db.tables.forEach(table => {\n const tableName = table.name;\n if (db.core.schema.tables.some(tbl => tbl.name === tableName)) {\n table.core = db.core.table(tableName);\n if (db[tableName] instanceof db.Table) {\n db[tableName].core = table.core;\n }\n }\n });\n}\n","import { Dexie } from '../dexie';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { _global } from \"../../globals/global\";\nimport { setProp, keys, slice, isArray, shallowClone, isAsyncFunction, defineProperty, getPropertyDescriptor } from '../../functions/utils';\nimport { Transaction } from '../transaction';\nimport { Version } from './version';\nimport Promise, { PSD, newScope, NativePromise, decrementExpectedAwaits, incrementExpectedAwaits } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { IndexSpec } from '../../public/types/index-spec';\nimport { createIndexSpec, nameFromKeyPath } from '../../helpers/index-spec';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { generateMiddlewareStacks } from '../dexie/generate-middleware-stacks';\nimport { debug } from '../../helpers/debug';\nimport { PromiseExtended } from '../../public/types/promise-extended';\n\nexport function setApiOnPlace(db: Dexie, objs: Object[], tableNames: string[], dbschema: DbSchema) {\n tableNames.forEach(tableName => {\n const schema = dbschema[tableName];\n objs.forEach(obj => {\n const propDesc = getPropertyDescriptor(obj, tableName);\n if (!propDesc || (\"value\" in propDesc && propDesc.value === undefined)) {\n // Either the prop is not declared, or it is initialized to undefined.\n if (obj === db.Transaction.prototype || obj instanceof db.Transaction) {\n // obj is a Transaction prototype (or prototype of a subclass to Transaction)\n // Make the API a getter that returns this.table(tableName)\n setProp(obj, tableName, {\n get(this: Transaction) { return this.table(tableName); },\n set(value: any) {\n // Issue #1039\n // Let \"this.schema = dbschema;\" and other props in transaction constructor work even if there's a name collision with the table name.\n defineProperty(this, tableName, {value, writable: true, configurable: true, enumerable: true});\n }\n });\n } else {\n // Table will not be bound to a transaction (will use Dexie.currentTransaction)\n obj[tableName] = new db.Table(tableName, schema);\n }\n }\n });\n });\n}\n\nexport function removeTablesApi(db: Dexie, objs: Object[]) {\n objs.forEach(obj => {\n for (let key in obj) {\n if (obj[key] instanceof db.Table) delete obj[key];\n }\n });\n}\n\nexport function lowerVersionFirst(a: Version, b: Version) {\n return a._cfg.version - b._cfg.version;\n}\n\nexport function runUpgraders(db: Dexie, oldVersion: number, idbUpgradeTrans: IDBTransaction, reject) {\n const globalSchema = db._dbSchema;\n if (idbUpgradeTrans.objectStoreNames.contains('$meta') && !globalSchema.$meta) {\n globalSchema.$meta = createTableSchema(\"$meta\", parseIndexSyntax(\"\")[0], []);\n db._storeNames.push('$meta');\n }\n const trans = db._createTransaction('readwrite', db._storeNames, globalSchema);\n trans.create(idbUpgradeTrans);\n trans._completion.catch(reject);\n const rejectTransaction = trans._reject.bind(trans);\n const transless = PSD.transless || PSD;\n newScope(() => {\n PSD.trans = trans;\n PSD.transless = transless;\n if (oldVersion === 0) {\n // Create tables:\n keys(globalSchema).forEach(tableName => {\n createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes);\n });\n generateMiddlewareStacks(db, idbUpgradeTrans);\n Promise.follow(() => db.on.populate.fire(trans)).catch(rejectTransaction);\n } else {\n generateMiddlewareStacks(db, idbUpgradeTrans);\n return getExistingVersion(db, trans, oldVersion)\n .then(oldVersion => updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans))\n .catch(rejectTransaction);\n }\n });\n}\n\nexport type UpgradeQueueItem = (idbtrans: IDBTransaction) => PromiseLike | void;\n\nexport function patchCurrentVersion(db: Dexie, idbUpgradeTrans: IDBTransaction) {\n createMissingTables(db._dbSchema, idbUpgradeTrans);\n if (idbUpgradeTrans.db.version % 10 === 0 && !idbUpgradeTrans.objectStoreNames.contains('$meta')) {\n // Rolled over to the next 10-ies due to many schema upgrades without bumping version.\n // No problem! We pin the database to its expected version by adding the $meta table so that next\n // time the programmer bumps the version and attaches, an upgrader, that upgrader will indeed run,\n // as well any further upgraders coming after that.\n idbUpgradeTrans.db.createObjectStore('$meta').add(Math.ceil((idbUpgradeTrans.db.version / 10) - 1), 'version');\n }\n const globalSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n adjustToExistingIndexNames(db, db._dbSchema, idbUpgradeTrans);\n const diff = getSchemaDiff(globalSchema, db._dbSchema);\n for (const tableChange of diff.change) {\n if (tableChange.change.length || tableChange.recreate) {\n console.warn(`Unable to patch indexes of table ${tableChange.name} because it has changes on the type of index or primary key.`);\n return;\n }\n const store = idbUpgradeTrans.objectStore(tableChange.name);\n tableChange.add.forEach(idx => {\n if (debug) console.debug(`Dexie upgrade patch: Creating missing index ${tableChange.name}.${idx.src}`);\n addIndex(store, idx);\n });\n }\n}\n\nfunction getExistingVersion(db: Dexie, trans: Transaction, oldVersion: number): PromiseExtended {\n // In normal case, existing version is the native installed version divided by 10.\n // However, in case more than 10 schema changes have been made on the same version (such as while\n // developing an app), the native version may have passed beyond a multiple of 10 within the same version.\n // When that happens, a table $meta will have been created, containing a single entry with key \"version\"\n // and the value of the real old version to use when running upgraders going forward.\n if (trans.storeNames.includes('$meta')) {\n return trans.table('$meta').get('version').then(metaVersion => {\n return metaVersion != null ? metaVersion : oldVersion\n })\n } else {\n return Promise.resolve(oldVersion);\n }\n}\n\nfunction updateTablesAndIndexes(\n db: Dexie,\n oldVersion: number,\n trans: Transaction,\n idbUpgradeTrans: IDBTransaction)\n{\n // Upgrade version to version, step-by-step from oldest to newest version.\n // Each transaction object will contain the table set that was current in that version (but also not-yet-deleted tables from its previous version)\n const queue: UpgradeQueueItem[] = [];\n const versions = db._versions;\n let globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n let anyContentUpgraderHasRun = false;\n \n const versToRun = versions.filter(v => v._cfg.version >= oldVersion);\n if (versToRun.length === 0) {\n // Important not to continue at this point.\n // Coming here means we've already patched schema in patchCurrentVersion() after having\n // incremented native version to a value above the declared highest version.\n // When being in this mode, it means that there might be different versions the db competing\n // about it with different version of the schema. Therefore, we must avoid deleting tables\n // or indexes here so that both versions can co-exist until the application has been upgraded to\n // a version that declares no lower than the native version.\n // If after that, a downgrade happens again, we'll end up here again, accepting both versions\n // And we'll stay in this state until app developer releases a new declared version.\n return Promise.resolve(); \n }\n \n versToRun.forEach(version => {\n queue.push(() => {\n const oldSchema = globalSchema;\n const newSchema = version._cfg.dbschema;\n adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans);\n adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans);\n\n globalSchema = db._dbSchema = newSchema;\n\n const diff = getSchemaDiff(oldSchema, newSchema);\n // Add tables \n diff.add.forEach(tuple => {\n createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes);\n });\n // Change tables\n diff.change.forEach(change => {\n if (change.recreate) {\n throw new exceptions.Upgrade(\"Not yet support for changing primary key\");\n } else {\n const store = idbUpgradeTrans.objectStore(change.name);\n // Add indexes\n change.add.forEach(idx => addIndex(store, idx));\n // Update indexes\n change.change.forEach(idx => {\n store.deleteIndex(idx.name);\n addIndex(store, idx);\n });\n // Delete indexes\n change.del.forEach(idxName => store.deleteIndex(idxName));\n }\n });\n\n const contentUpgrade = version._cfg.contentUpgrade;\n\n if (contentUpgrade && version._cfg.version > oldVersion) {\n // Update db.core with new tables and indexes:\n generateMiddlewareStacks(db, idbUpgradeTrans);\n trans._memoizedTables = {}; // Invalidate memoization as transaction shape may change between versions.\n\n anyContentUpgraderHasRun = true;\n\n // Add to-be-deleted tables to contentUpgrade transaction\n let upgradeSchema = shallowClone(newSchema);\n diff.del.forEach(table => {\n upgradeSchema[table] = oldSchema[table];\n });\n\n // Safe to affect Transaction.prototype globally in this moment,\n // because when this code runs, there may not be any other code\n // that can access any transaction instance, else than this particular\n // upgrader function.\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema), upgradeSchema);\n trans.schema = upgradeSchema;\n\n // Support for native async await.\n const contentUpgradeIsAsync = isAsyncFunction(contentUpgrade);\n if (contentUpgradeIsAsync) {\n incrementExpectedAwaits();\n }\n \n let returnValue: any;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = contentUpgrade(trans);\n if (returnValue) {\n if (contentUpgradeIsAsync) {\n // contentUpgrade is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n }\n }\n });\n return (returnValue && typeof returnValue.then === 'function' ?\n Promise.resolve(returnValue) : promiseFollowed.then(()=>returnValue));\n }\n });\n queue.push(idbtrans => {\n const newSchema = version._cfg.dbschema;\n // Delete old tables\n deleteRemovedTables(newSchema, idbtrans);\n // Restore the final API\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema);\n trans.schema = db._dbSchema;\n });\n // Maintain the $meta table after this version's tables and indexes has been created and content upgraders have run.\n queue.push(idbtrans => {\n if (db.idbdb.objectStoreNames.contains('$meta')) {\n if (Math.ceil(db.idbdb.version / 10) === version._cfg.version) {\n // Remove $meta table if it's no more needed - we are in line with the native version\n db.idbdb.deleteObjectStore('$meta');\n delete db._dbSchema.$meta;\n db._storeNames = db._storeNames.filter(name => name !== '$meta');\n } else {\n // We're still not in line with the native version. Make sure to update the virtual version\n // to the successfully run version\n idbtrans.objectStore('$meta').put(version._cfg.version, 'version');\n }\n }\n }); \n });\n\n // Now, create a queue execution engine\n function runQueue() {\n return queue.length ? Promise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) :\n Promise.resolve();\n }\n\n return runQueue().then(() => {\n createMissingTables(globalSchema, idbUpgradeTrans); // At last, make sure to create any missing tables. (Needed by addons that add stores to DB without specifying version)\n });\n}\n\nexport interface SchemaDiff {\n del: string[],\n add: [string, TableSchema][];\n change: TableSchemaDiff[];\n}\n\nexport interface TableSchemaDiff {\n name: string,\n recreate: boolean,\n del: string[],\n add: IndexSpec[],\n change: IndexSpec[]\n}\n\nexport function getSchemaDiff(oldSchema: DbSchema, newSchema: DbSchema): SchemaDiff {\n const diff: SchemaDiff = {\n del: [], // Array of table names\n add: [], // Array of [tableName, newDefinition]\n change: [] // Array of {name: tableName, recreate: newDefinition, del: delIndexNames, add: newIndexDefs, change: changedIndexDefs}\n };\n let table: string;\n for (table in oldSchema) {\n if (!newSchema[table]) diff.del.push(table);\n }\n for (table in newSchema) {\n const oldDef = oldSchema[table],\n newDef = newSchema[table];\n if (!oldDef) {\n diff.add.push([table, newDef]);\n } else {\n const change = {\n name: table,\n def: newDef,\n recreate: false,\n del: [],\n add: [],\n change: []\n };\n if (\n (\n // compare keyPaths no matter if string or string[]\n // compare falsy keypaths same no matter if they are null or empty string.\n ''+(oldDef.primKey.keyPath||'')\n ) !== (\n ''+(newDef.primKey.keyPath||'')\n ) ||\n // Compare the autoIncrement flag also\n (oldDef.primKey.auto !== newDef.primKey.auto))\n {\n // Primary key has changed. Remove and re-add table.\n change.recreate = true;\n diff.change.push(change);\n } else {\n // Same primary key. Just find out what differs:\n const oldIndexes = oldDef.idxByName;\n const newIndexes = newDef.idxByName;\n let idxName: string;\n for (idxName in oldIndexes) {\n if (!newIndexes[idxName]) change.del.push(idxName);\n }\n for (idxName in newIndexes) {\n const oldIdx = oldIndexes[idxName],\n newIdx = newIndexes[idxName];\n if (!oldIdx) change.add.push(newIdx);\n else if (oldIdx.src !== newIdx.src) change.change.push(newIdx);\n }\n if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) {\n diff.change.push(change);\n }\n }\n }\n }\n return diff;\n}\n\nexport function createTable(\n idbtrans: IDBTransaction,\n tableName: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n) {\n const store = idbtrans.db.createObjectStore(\n tableName,\n primKey.keyPath ?\n { keyPath: primKey.keyPath, autoIncrement: primKey.auto } :\n { autoIncrement: primKey.auto }\n );\n indexes.forEach(idx => addIndex(store, idx));\n return store;\n}\n\nexport function createMissingTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n keys(newSchema).forEach(tableName => {\n if (!idbtrans.db.objectStoreNames.contains(tableName)) {\n if (debug) console.debug('Dexie: Creating missing table', tableName);\n createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes);\n }\n });\n}\n\nexport function deleteRemovedTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n [].slice.call(idbtrans.db.objectStoreNames).forEach(storeName =>\n newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName));\n}\n\nexport function addIndex(store: IDBObjectStore, idx: IndexSpec) {\n store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi });\n}\n\nfunction buildGlobalSchema(\n db: Dexie,\n idbdb: IDBDatabase,\n tmpTrans: IDBTransaction\n) {\n const globalSchema = {};\n const dbStoreNames = slice(idbdb.objectStoreNames, 0);\n dbStoreNames.forEach(storeName => {\n const store = tmpTrans.objectStore(storeName);\n let keyPath = store.keyPath;\n const primKey = createIndexSpec(\n nameFromKeyPath(keyPath),\n keyPath || \"\",\n true,\n false,\n !!store.autoIncrement,\n keyPath && typeof keyPath !== \"string\",\n true\n );\n const indexes: IndexSpec[] = [];\n for (let j = 0; j < store.indexNames.length; ++j) {\n const idbindex = store.index(store.indexNames[j]);\n keyPath = idbindex.keyPath;\n var index = createIndexSpec(\n idbindex.name,\n keyPath,\n !!idbindex.unique,\n !!idbindex.multiEntry,\n false,\n keyPath && typeof keyPath !== \"string\",\n false\n );\n indexes.push(index);\n }\n globalSchema[storeName] = createTableSchema(storeName, primKey, indexes);\n });\n return globalSchema;\n}\n\nexport function readGlobalSchema(db: Dexie, idbdb: IDBDatabase, tmpTrans: IDBTransaction) {\n db.verno = idbdb.version / 10;\n const globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans);\n db._storeNames = slice(idbdb.objectStoreNames, 0);\n setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema);\n}\n\nexport function verifyInstalledSchema(db: Dexie, tmpTrans: IDBTransaction): boolean {\n const installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans);\n const diff = getSchemaDiff(installedSchema, db._dbSchema);\n return !(diff.add.length || diff.change.some(ch => ch.add.length || ch.change.length));\n}\n\nexport function adjustToExistingIndexNames(db: Dexie, schema: DbSchema, idbtrans: IDBTransaction) {\n // Issue #30 Problem with existing db - adjust to existing index names when migrating from non-dexie db\n const storeNames = idbtrans.db.objectStoreNames;\n\n for (let i = 0; i < storeNames.length; ++i) {\n const storeName = storeNames[i];\n const store = idbtrans.objectStore(storeName);\n db._hasGetAll = 'getAll' in store;\n\n for (let j = 0; j < store.indexNames.length; ++j) {\n const indexName = store.indexNames[j];\n const keyPath = store.index(indexName).keyPath;\n const dexieName = typeof keyPath === 'string' ? keyPath : \"[\" + slice(keyPath).join('+') + \"]\";\n if (schema[storeName]) {\n const indexSpec = schema[storeName].idxByName[dexieName];\n if (indexSpec) {\n indexSpec.name = indexName;\n delete schema[storeName].idxByName[dexieName];\n schema[storeName].idxByName[indexName] = indexSpec;\n }\n }\n }\n }\n\n // Bug with getAll() on Safari ver<604 on Workers only, see discussion following PR #579\n if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604)\n {\n db._hasGetAll = false;\n }\n}\n\nexport function parseIndexSyntax(primKeyAndIndexes: string): IndexSpec[] {\n return primKeyAndIndexes.split(',').map((index, indexNum) => {\n index = index.trim();\n const name = index.replace(/([&*]|\\+\\+)/g, \"\"); // Remove \"&\", \"++\" and \"*\"\n // Let keyPath of \"[a+b]\" be [\"a\",\"b\"]:\n const keyPath = /^\\[/.test(name) ? name.match(/^\\[(.*)\\]$/)[1].split('+') : name;\n\n return createIndexSpec(\n name,\n keyPath || null,\n /\\&/.test(index),\n /\\*/.test(index),\n /\\+\\+/.test(index),\n isArray(keyPath),\n indexNum === 0\n );\n });\n}\n","import { Version as IVersion } from '../../public/types/version';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { extend, keys } from '../../functions/utils';\nimport { Dexie } from '../dexie';\nimport { Transaction } from '../transaction';\nimport { removeTablesApi, setApiOnPlace, parseIndexSyntax } from './schema-helpers';\nimport { exceptions } from '../../errors';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\n\n/** class Version\n *\n * https://dexie.org/docs/Version/Version\n */\nexport class Version implements IVersion {\n db: Dexie;\n _cfg: {\n version: number,\n storesSource: { [tableName: string]: string | null },\n dbschema: DbSchema,\n tables: {},\n contentUpgrade: Function | null\n }\n\n _parseStoresSpec(stores: { [tableName: string]: string | null }, outSchema: DbSchema): any {\n keys(stores).forEach(tableName => {\n if (stores[tableName] !== null) {\n var indexes = parseIndexSyntax(stores[tableName]);\n var primKey = indexes.shift();\n primKey.unique = true;\n if (primKey.multi) throw new exceptions.Schema(\"Primary key cannot be multi-valued\");\n indexes.forEach(idx => {\n if (idx.auto) throw new exceptions.Schema(\"Only primary key can be marked as autoIncrement (++)\");\n if (!idx.keyPath) throw new exceptions.Schema(\"Index must have a name and cannot be an empty string\");\n });\n outSchema[tableName] = createTableSchema(tableName, primKey, indexes);\n }\n });\n }\n\n stores(stores: { [key: string]: string | null; }): IVersion {\n const db = this.db;\n this._cfg.storesSource = this._cfg.storesSource ?\n extend(this._cfg.storesSource, stores) :\n stores;\n const versions = db._versions;\n\n // Derive stores from earlier versions if they are not explicitely specified as null or a new syntax.\n const storesSpec: { [key: string]: string; } = {};\n let dbschema = {};\n versions.forEach(version => { // 'versions' is always sorted by lowest version first.\n extend(storesSpec, version._cfg.storesSource);\n dbschema = (version._cfg.dbschema = {});\n version._parseStoresSpec(storesSpec, dbschema);\n });\n // Update the latest schema to this version\n db._dbSchema = dbschema;\n // Update APIs\n removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]);\n setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema);\n db._storeNames = keys(dbschema);\n return this;\n }\n\n upgrade(upgradeFunction: (trans: Transaction) => PromiseLike | void): Version {\n this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction);\n return this;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Version } from './version';\n\nexport interface VersionConstructor {\n new(versionNumber: number): Version;\n prototype: Version;\n}\n\n/** Generates a Version constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createVersionConstructor(db: Dexie) {\n return makeClassConstructor(\n Version.prototype,\n\n function Version(this: Version, versionNumber: number) {\n this.db = db;\n this._cfg = {\n version: versionNumber,\n storesSource: null,\n dbschema: {},\n tables: {},\n contentUpgrade: null\n };\n });\n\n}\n","import { Dexie } from \"../classes/dexie/dexie\";\nimport { Table } from \"../public/types/table\";\nimport { DBNAMES_DB } from \"../globals/constants\";\nimport { DexieDOMDependencies } from \"../public/types/dexie-dom-dependencies\";\nimport { nop } from \"../functions/chaining-functions\";\n\ntype IDBKeyNamesVar = typeof IDBKeyRange;\n\nfunction getDbNamesTable(indexedDB: IDBFactory, IDBKeyRange: IDBKeyNamesVar) {\n let dbNamesDB = indexedDB[\"_dbNamesDB\"];\n if (!dbNamesDB) {\n dbNamesDB = indexedDB[\"_dbNamesDB\"] = new Dexie(DBNAMES_DB, {\n addons: [],\n indexedDB,\n IDBKeyRange,\n });\n dbNamesDB.version(1).stores({ dbnames: \"name\" });\n }\n return dbNamesDB.table(\"dbnames\") as Table<{ name: string }, string>;\n}\n\nfunction hasDatabasesNative(indexedDB: IDBFactory) {\n return indexedDB && typeof indexedDB.databases === \"function\";\n}\n\nexport function getDatabaseNames({\n indexedDB,\n IDBKeyRange,\n}: DexieDOMDependencies) {\n return hasDatabasesNative(indexedDB)\n ? Promise.resolve(indexedDB.databases()).then((infos) =>\n infos\n // Select name prop of infos:\n .map((info) => info.name)\n // Filter out DBNAMES_DB as previous Dexie or browser version would not have included it in the result.\n .filter((name) => name !== DBNAMES_DB)\n )\n : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys();\n}\n\nexport function _onDatabaseCreated(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).put({name}).catch(nop);\n}\n\nexport function _onDatabaseDeleted(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop);\n}\n","import { newScope } from '../../helpers/promise';\nimport { PSD } from '../../helpers/promise';\n\nexport function vip (fn) {\n // To be used by subscribers to the on('ready') event.\n // This will let caller through to access DB even when it is blocked while the db.ready() subscribers are firing.\n // This would have worked automatically if we were certain that the Provider was using Dexie.Promise for all asyncronic operations. The promise PSD\n // from the provider.connect() call would then be derived all the way to when provider would call localDatabase.applyChanges(). But since\n // the provider more likely is using non-promise async APIs or other thenable implementations, we cannot assume that.\n // Note that this method is only useful for on('ready') subscribers that is returning a Promise from the event. If not using vip()\n // the database could deadlock since it wont open until the returned Promise is resolved, and any non-VIPed operation started by\n // the caller will not resolve until database is opened.\n return newScope(function () {\n PSD.letThrough = true; // Make sure we are let through if still blocking db due to onready is firing.\n return fn();\n });\n}\n\n","/**\n * Work around Safari 14 IndexedDB open bug.\n *\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up. https://bugs.webkit.org/show_bug.cgi?id=226547\n * The only solution is to keep nudging it until it's awake.\n */\nfunction idbReady() {\n var isSafari = !navigator.userAgentData &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\//.test(navigator.userAgent);\n // No point putting other browsers or older versions of Safari through this mess.\n if (!isSafari || !indexedDB.databases)\n return Promise.resolve();\n var intervalId;\n return new Promise(function (resolve) {\n var tryIdb = function () { return indexedDB.databases().finally(resolve); };\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(function () { return clearInterval(intervalId); });\n}\n\nexport default idbReady;\n","import { cmp } from \"../functions/cmp\";\nimport { extend, iteratorSymbol, props } from '../functions/utils';\nimport { IndexableType } from '../public';\nimport {\n EmptyRange,\n IntervalTree,\n IntervalTreeNode,\n RangeSetConstructor,\n RangeSetPrototype,\n} from \"../public/types/rangeset\";\n\n/* An interval tree implementation to efficiently detect overlapping ranges of queried indexes.\n *\n * https://en.wikipedia.org/wiki/Interval_tree\n * \n */\n\nfunction isEmptyRange(node: IntervalTree | {from: IndexableType, to: IndexableType}): node is EmptyRange {\n return !(\"from\" in node);\n}\n\nexport type RangeSet = RangeSetPrototype & IntervalTree;\n\nexport const RangeSet = function(fromOrTree: any, to?: any) {\n if (this) {\n // Called with new()\n extend(this, arguments.length ? {d:1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree} : {d:0});\n } else {\n // Called without new()\n const rv = new RangeSet();\n if (fromOrTree && (\"d\" in fromOrTree)) {\n extend(rv, fromOrTree);\n }\n return rv;\n }\n} as RangeSetConstructor;\n\nprops(RangeSet.prototype, {\n add(rangeSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n mergeRanges(this, rangeSet);\n return this;\n },\n addKey(key: IndexableType) {\n addRange(this, key, key);\n return this;\n },\n addKeys(keys: IndexableType[]) {\n keys.forEach(key => addRange(this, key, key));\n return this;\n },\n\n [iteratorSymbol](): Iterator {\n return getRangeSetIterator(this);\n }\n});\n\nfunction addRange(target: IntervalTree, from: IndexableType, to: IndexableType) {\n const diff = cmp(from, to);\n // cmp() returns NaN if one of the args are IDB-invalid keys.\n // Avoid storing invalid keys in rangeset:\n if (isNaN(diff)) return;\n\n // Caller is trying to add a range where from is greater than to:\n if (diff > 0) throw RangeError();\n \n if (isEmptyRange(target)) return extend(target, { from, to, d: 1 });\n const left = target.l;\n const right = target.r;\n if (cmp(to, target.from) < 0) {\n left\n ? addRange(left, from, to)\n : (target.l = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n if (cmp(from, target.to) > 0) {\n right\n ? addRange(right, from, to)\n : (target.r = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n // Now we have some kind of overlap. We will be able to merge the new range into the node or let it be swallowed.\n\n // Grow left?\n if (cmp(from, target.from) < 0) {\n target.from = from;\n target.l = null; // Cut off for now. Re-add later.\n target.d = right ? right.d + 1 : 1;\n }\n // Grow right?\n if (cmp(to, target.to) > 0) {\n target.to = to;\n target.r = null; // Cut off for now. Re-add later.\n target.d = target.l ? target.l.d + 1 : 1;\n }\n const rightWasCutOff = !target.r;\n // Re-add left?\n if (left && !target.l) {\n //Ranges to the left may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, left);\n }\n // Re-add right?\n if (right && rightWasCutOff) {\n //Ranges to the right may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, right);\n }\n}\n\nexport function mergeRanges(target: IntervalTree, newSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n function _addRangeSet(\n target: IntervalTree,\n { from, to, l, r }: IntervalTreeNode | {from: IndexableType, to: IndexableType, l?: undefined, r?: undefined}\n ) {\n addRange(target, from, to);\n if (l) _addRangeSet(target, l);\n if (r) _addRangeSet(target, r);\n }\n\n if(!isEmptyRange(newSet)) _addRangeSet(target, newSet);\n}\n\nexport function rangesOverlap(\n rangeSet1: IntervalTree,\n rangeSet2: IntervalTree\n): boolean {\n // Start iterating other from scratch.\n const i1 = getRangeSetIterator(rangeSet2);\n let nextResult1 = i1.next();\n if (nextResult1.done) return false;\n let a = nextResult1.value;\n\n // Start iterating this from start of other\n const i2 = getRangeSetIterator(rangeSet1);\n let nextResult2 = i2.next(a.from); // Start from beginning of other range\n let b = nextResult2.value;\n\n while (!nextResult1.done && !nextResult2.done) {\n if (cmp(b!.from, a.to) <= 0 && cmp(b!.to, a.from) >= 0) return true;\n cmp(a.from, b!.from) < 0\n ? (a = (nextResult1 = i1.next(b!.from)).value!) // a is behind. forward it to beginning of next b-range\n : (b = (nextResult2 = i2.next(a.from)).value); // b is behind. forward it to beginning of next a-range\n }\n return false;\n}\n\ntype RangeSetIteratorState =\n | {\n up?: RangeSetIteratorState;\n n: IntervalTreeNode;\n s: 0 | 1 | 2 | 3;\n }\n | undefined\n | null;\nexport function getRangeSetIterator(\n node: EmptyRange | IntervalTreeNode\n): Generator {\n let state: RangeSetIteratorState = isEmptyRange(node) ? null : { s: 0, n: node };\n\n return {\n next(key?) {\n const keyProvided = arguments.length > 0;\n while (state) {\n switch (state.s) {\n case 0:\n // Initial state for node.\n // Fast forward to leftmost node.\n state.s = 1;\n if (keyProvided) {\n while (state.n.l && cmp(key, state.n.from) < 0)\n state = { up: state, n: state.n.l, s: 1 };\n } else {\n while (state.n.l) state = { up: state, n: state.n.l, s: 1 };\n }\n // intentionally fall into case 1:\n case 1:\n // We're on a node where it's left part is already handled or does not exist.\n state.s = 2;\n if (!keyProvided || cmp(key, state.n.to) <= 0)\n return { value: state.n, done: false };\n case 2:\n // We've emitted our node and should continue with the right part or let parent take over from it's state 1\n if (state.n.r) {\n state.s = 3; // So when child is done, we know we're done.\n state = { up: state, n: state.n.r, s: 0 };\n continue; // Will fall in to case 0 with fast forward to left leaf of this subtree.\n }\n // intentionally fall into case 3:\n case 3:\n state = state.up;\n }\n }\n return { done: true };\n },\n } as Generator;\n}\n\nfunction rebalance(target: IntervalTreeNode) {\n const diff = (target.r?.d || 0) - (target.l?.d || 0);\n const r = diff > 1 ? \"r\" : diff < -1 ? \"l\" : \"\";\n if (r) {\n\n // Rotate (https://en.wikipedia.org/wiki/Tree_rotation)\n //\n // \n // [OLDROOT]\n // [OLDROOT.L] [NEWROOT]\n // [NEWROOT.L] [NEWROOT.R]\n //\n // Is going to become:\n //\n // \n // [NEWROOT]\n // [OLDROOT] [NEWROOT.R]\n // [OLDROOT.L] [NEWROOT.L] \n\n // * clone now has the props of OLDROOT\n // Plan:\n // * target must be given the props of NEWROOT\n // * target[l] must point to a new OLDROOT\n // * target[r] must point to NEWROOT.R\n // * OLDROOT[r] must point to NEWROOT.L\n const l = r === \"r\" ? \"l\" : \"r\"; // Support both left/right rotation\n const rootClone = { ...target };\n // We're gonna copy props from target's right node into target so that target will\n // have same range as old target[r] (instead of changing pointers, we copy values.\n // that way we do not need to adjust pointers in parents).\n const oldRootRight = target[r]; \n target.from = oldRootRight.from;\n target.to = oldRootRight.to;\n target[r] = oldRootRight[r];\n rootClone[r] = oldRootRight[l];\n target[l] = rootClone;\n rootClone.d = computeDepth(rootClone);\n }\n target.d = computeDepth(target);\n}\n\nfunction computeDepth({ r, l }: Pick) {\n return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1;\n}\n","import { cloneSimpleObjectTree, deepClone, keys, objectIsEmpty } from \"../functions/utils\";\nimport { mergeRanges, RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\n\nexport function extendObservabilitySet(\n target: ObservabilitySet,\n newSet: ObservabilitySet\n): ObservabilitySet {\n keys(newSet).forEach(part => {\n if (target[part]) mergeRanges(target[part], newSet[part]);\n else target[part] = cloneSimpleObjectTree(newSet[part]); // Somewhat faster\n });\n return target;\n}\n","import { rangesOverlap } from '../helpers/rangeset';\nimport { ObservabilitySet } from '../public/types/db-events';\n\nexport function obsSetsOverlap(os1: ObservabilitySet, os2: ObservabilitySet) {\n return os1.all || os2.all || Object.keys(os1).some(\n (key) => os2[key] && rangesOverlap(os2[key], os1[key])\n );\n}\n","import { type GlobalQueryCache } from \"../../public/types/cache\";\n\nexport const cache: GlobalQueryCache = {}\n","import { CacheEntry, TblQueryCache } from '../../public/types/cache';\nimport { ObservabilitySet } from '../../public/types/db-events';\nimport { extendObservabilitySet } from '../extend-observability-set';\nimport { obsSetsOverlap } from '../obs-sets-overlap';\nimport { cache } from './cache';\n\nlet unsignaledParts: ObservabilitySet = {};\nlet isTaskEnqueued = false;\n\nexport function signalSubscribersLazily(part: ObservabilitySet, optimistic = false) {\n extendObservabilitySet(unsignaledParts, part);\n if (!isTaskEnqueued) {\n isTaskEnqueued = true;\n setTimeout(() => {\n isTaskEnqueued = false;\n const parts = unsignaledParts;\n unsignaledParts = {};\n signalSubscribersNow(parts, false);\n }, 0);\n }\n}\n\nexport function signalSubscribersNow(\n updatedParts: ObservabilitySet,\n deleteAffectedCacheEntries = false\n) {\n const queriesToSignal = new Set<() => void>();\n if (updatedParts.all) {\n // Signal all subscribers to requery.\n for (const tblCache of Object.values(cache)) {\n collectTableSubscribers(\n tblCache,\n updatedParts,\n queriesToSignal,\n deleteAffectedCacheEntries\n );\n }\n } else {\n for (const key in updatedParts) {\n const parts = /^idb\\:\\/\\/(.*)\\/(.*)\\//.exec(key);\n if (parts) {\n const [, dbName, tableName] = parts;\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (tblCache)\n collectTableSubscribers(\n tblCache,\n updatedParts,\n queriesToSignal,\n deleteAffectedCacheEntries\n );\n }\n }\n }\n // Now when affected cache entries are removed, signal collected subscribers to requery.\n queriesToSignal.forEach((requery) => requery());\n}\n\nfunction collectTableSubscribers(\n tblCache: TblQueryCache,\n updatedParts: ObservabilitySet,\n outQueriesToSignal: Set<() => void>,\n deleteAffectedCacheEntries: boolean\n) {\n const updatedEntryLists: [string, CacheEntry[]][] = [];\n for (const [indexName, entries] of Object.entries(tblCache.queries.query)) {\n const filteredEntries: CacheEntry[] = [];\n for (const entry of entries) {\n if (obsSetsOverlap(updatedParts, entry.obsSet)) {\n // This query is affected by the mutation. Remove it from cache\n // and signal all subscribers to requery.\n entry.subscribers.forEach((requery) => outQueriesToSignal.add(requery));\n } else if (deleteAffectedCacheEntries) {\n filteredEntries.push(entry);\n }\n }\n // Collect cache entries to be updated\n if (deleteAffectedCacheEntries)\n updatedEntryLists.push([indexName, filteredEntries]);\n }\n if (deleteAffectedCacheEntries) {\n for (const [indexName, filteredEntries] of updatedEntryLists) {\n tblCache.queries.query[indexName] = filteredEntries;\n }\n }\n}\n","import { Dexie } from './dexie';\nimport * as Debug from '../../helpers/debug';\nimport { rejection } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { eventRejectHandler, preventDefault } from '../../functions/event-wrappers';\nimport Promise, { wrap } from '../../helpers/promise';\nimport { connections } from '../../globals/constants';\nimport { runUpgraders, readGlobalSchema, adjustToExistingIndexNames, verifyInstalledSchema, patchCurrentVersion } from '../version/schema-helpers';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { _onDatabaseCreated } from '../../helpers/database-enumerator';\nimport { vip } from './vip';\nimport { promisableChain, nop } from '../../functions/chaining-functions';\nimport { generateMiddlewareStacks } from './generate-middleware-stacks';\nimport { slice } from '../../functions/utils';\nimport safari14Workaround from 'safari-14-idb-fix';\nimport { type ObservabilitySet } from '../../public/types/db-events';\nimport { RangeSet } from '../../helpers/rangeset';\nimport { DEXIE_STORAGE_MUTATED_EVENT_NAME, globalEvents } from '../../globals/global-events';\nimport { signalSubscribersNow } from '../../live-query/cache/signalSubscribers';\n\nexport function dexieOpen (db: Dexie) {\n const state = db._state;\n const {indexedDB} = db._deps;\n if (state.isBeingOpened || db.idbdb)\n return state.dbReadyPromise.then(() => state.dbOpenError ?\n rejection (state.dbOpenError) :\n db);\n state.isBeingOpened = true;\n state.dbOpenError = null;\n state.openComplete = false;\n const openCanceller = state.openCanceller;\n let nativeVerToOpen = Math.round(db.verno * 10);\n let schemaPatchMode = false;\n\n function throwIfCancelled() {\n // If state.openCanceller object reference is replaced, it means db.close() has been called,\n // meaning this open flow should be cancelled.\n if (state.openCanceller !== openCanceller) throw new exceptions.DatabaseClosed('db.open() was cancelled');\n }\n \n // Function pointers to call when the core opening process completes.\n let resolveDbReady = state.dbReadyResolve,\n // upgradeTransaction to abort on failure.\n upgradeTransaction: (IDBTransaction | null) = null,\n wasCreated = false;\n\n const tryOpenDB = () => new Promise((resolve, reject) => {\n throwIfCancelled();\n // If no API, throw!\n if (!indexedDB) throw new exceptions.MissingAPI();\n const dbName = db.name;\n \n const req = state.autoSchema || !nativeVerToOpen ?\n indexedDB.open(dbName) :\n indexedDB.open(dbName, nativeVerToOpen);\n if (!req) throw new exceptions.MissingAPI(); // May happen in Safari private mode, see https://github.com/dfahlander/Dexie.js/issues/134\n req.onerror = eventRejectHandler(reject);\n req.onblocked = wrap(db._fireOnBlocked);\n req.onupgradeneeded = wrap (e => {\n upgradeTransaction = req.transaction;\n if (state.autoSchema && !db._options.allowEmptyDB) { // Unless an addon has specified db._allowEmptyDB, lets make the call fail.\n // Caller did not specify a version or schema. Doing that is only acceptable for opening alread existing databases.\n // If onupgradeneeded is called it means database did not exist. Reject the open() promise and make sure that we\n // do not create a new database by accident here.\n req.onerror = preventDefault; // Prohibit onabort error from firing before we're done!\n upgradeTransaction.abort(); // Abort transaction (would hope that this would make DB disappear but it doesnt.)\n // Close database and delete it.\n req.result.close();\n const delreq = indexedDB.deleteDatabase(dbName); // The upgrade transaction is atomic, and javascript is single threaded - meaning that there is no risk that we delete someone elses database here!\n delreq.onsuccess = delreq.onerror = wrap(() => {\n reject (new exceptions.NoSuchDatabase(`Database ${dbName} doesnt exist`));\n });\n } else {\n upgradeTransaction.onerror = eventRejectHandler(reject);\n const oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; // Safari 8 fix.\n wasCreated = oldVer < 1;\n db.idbdb = req.result;\n if (schemaPatchMode) {\n patchCurrentVersion(db, upgradeTransaction);\n }\n runUpgraders(db, oldVer / 10, upgradeTransaction, reject);\n }\n }, reject);\n \n req.onsuccess = wrap (() => {\n // Core opening procedure complete. Now let's just record some stuff.\n upgradeTransaction = null;\n const idbdb = db.idbdb = req.result;\n\n const objectStoreNames = slice(idbdb.objectStoreNames);\n if (objectStoreNames.length > 0) try {\n const tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly');\n if (state.autoSchema) readGlobalSchema(db, idbdb, tmpTrans);\n else {\n adjustToExistingIndexNames(db, db._dbSchema, tmpTrans);\n if (!verifyInstalledSchema(db, tmpTrans) && !schemaPatchMode) {\n console.warn(`Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this.`);\n idbdb.close();\n nativeVerToOpen = idbdb.version + 1;\n schemaPatchMode = true;\n return resolve (tryOpenDB()); // Try again with new version (nativeVerToOpen\n }\n }\n generateMiddlewareStacks(db, tmpTrans);\n } catch (e) {\n // Safari 8 may bail out if > 1 store names. However, this shouldnt be a showstopper. Issue #120.\n // BUGBUG: It will bail out anyway as of Dexie 3.\n // Should we support Safari 8 anymore? Believe all\n // Dexie users use the shim for that platform anyway?!\n // If removing Safari 8 support, go ahead and remove the safariMultiStoreFix() function\n // as well as absurd upgrade version quirk for Safari.\n }\n \n connections.push(db); // Used for emulating versionchange event on IE/Edge/Safari.\n \n idbdb.onversionchange = wrap(ev => {\n state.vcFired = true; // detect implementations that not support versionchange (IE/Edge/Safari)\n db.on(\"versionchange\").fire(ev);\n });\n \n idbdb.onclose = wrap(ev => {\n db.on(\"close\").fire(ev);\n });\n\n if (wasCreated) _onDatabaseCreated(db._deps, dbName);\n\n resolve();\n\n }, reject);\n }).catch(err => {\n switch (err?.name) {\n case \"UnknownError\":\n if (state.PR1398_maxLoop > 0) {\n // Bug in Chrome after clearing site data\n // https://github.com/dexie/Dexie.js/issues/543#issuecomment-1795736695\n state.PR1398_maxLoop--;\n console.warn('Dexie: Workaround for Chrome UnknownError on open()');\n return tryOpenDB();\n }\n break;\n case \"VersionError\":\n if (nativeVerToOpen > 0) {\n nativeVerToOpen = 0;\n return tryOpenDB();\n }\n break;\n }\n return Promise.reject(err);\n });\n \n // safari14Workaround = Workaround by jakearchibald for new nasty bug in safari 14.\n return Promise.race([\n openCanceller,\n (typeof navigator === 'undefined' ? Promise.resolve() : safari14Workaround()).then(tryOpenDB)\n ]).then(() => {\n // Before finally resolving the dbReadyPromise and this promise,\n // call and await all on('ready') subscribers:\n // Dexie.vip() makes subscribers able to use the database while being opened.\n // This is a must since these subscribers take part of the opening procedure.\n throwIfCancelled();\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>db.on.ready.fire(db.vip))).then(function fireRemainders() {\n if (state.onReadyBeingFired.length > 0) {\n // In case additional subscribers to db.on('ready') were added during the time db.on.ready.fire was executed.\n let remainders = state.onReadyBeingFired.reduce(promisableChain, nop);\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>remainders(db.vip))).then(fireRemainders)\n }\n });\n }).finally(()=>{\n if (state.openCanceller === openCanceller) {\n // Only modify state if not cancelled in the mean time.\n state.onReadyBeingFired = null;\n state.isBeingOpened = false;\n }\n }).catch(err => {\n state.dbOpenError = err; // Record the error. It will be used to reject further promises of db operations.\n try {\n // Did we fail within onupgradeneeded? Make sure to abort the upgrade transaction so it doesnt commit.\n upgradeTransaction && upgradeTransaction.abort();\n } catch { }\n if (openCanceller === state.openCanceller) {\n // Still in the same open flow - The error reason was not due to external call to db.close().\n // Make sure to call db.close() to finalize resources.\n db._close(); // Closes and resets idbdb, removes connections, resets dbReadyPromise and openCanceller so that a later db.open() is fresh.\n }\n return rejection (err);\n }).finally(()=>{\n state.openComplete = true;\n resolveDbReady(); // dbReadyPromise is resolved no matter if open() rejects or resolved. It's just to wake up waiters.\n }).then(()=>{\n if (wasCreated) {\n // Propagate full range on primary keys and indexes on all tables now that the DB is ready and opened,\n // and all upgraders and on('ready') subscribers have run.\n const everything: ObservabilitySet = {};\n db.tables.forEach(table => {\n table.schema.indexes.forEach(idx => {\n if (idx.name) everything[`idb://${db.name}/${table.name}/${idx.name}`] = new RangeSet(-Infinity, [[[]]]);\n });\n everything[`idb://${db.name}/${table.name}/`] = everything[`idb://${db.name}/${table.name}/:dels`] = new RangeSet(-Infinity, [[[]]]);\n });\n // Database was created. If another tab had it open when it was deleted and reopened, that tab must be updated now.\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME).fire(everything);\n // Wipe the cache and trigger optimistic queries:\n signalSubscribersNow(everything, true);\n }\n // Resolve the db.open() with the db instance.\n return db;\n });\n}\n","import { isArray } from '../functions/utils';\n\nexport function awaitIterator (iterator: Iterator) {\n var callNext = result => iterator.next(result),\n doThrow = error => iterator.throw(error),\n onSuccess = step(callNext),\n onError = step(doThrow);\n\n function step(getNext: (any)=>any) {\n return (val?) => {\n var next = getNext(val),\n value = next.value;\n\n return next.done ? value :\n (!value || typeof value.then !== 'function' ?\n isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) :\n value.then(onSuccess, onError));\n };\n }\n\n return step(callNext)();\n}\n","import { TransactionMode } from '../../public/types/transaction-mode';\nimport { errnames, exceptions } from '../../errors';\nimport { flatten, isAsyncFunction } from '../../functions/utils';\nimport { Dexie } from './dexie';\nimport { Transaction } from '../transaction';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise, {\n PSD,\n NativePromise,\n decrementExpectedAwaits,\n rejection,\n incrementExpectedAwaits\n} from '../../helpers/promise';\n\nexport function extractTransactionArgs(mode: TransactionMode, _tableArgs_, scopeFunc) {\n // Let table arguments be all arguments between mode and last argument.\n var i = arguments.length;\n if (i < 2) throw new exceptions.InvalidArgument(\"Too few arguments\");\n // Prevent optimzation killer (https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments)\n // and clone arguments except the first one into local var 'args'.\n var args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n // Let scopeFunc be the last argument and pop it so that args now only contain the table arguments.\n scopeFunc = args.pop();\n var tables = flatten(args); // Support using array as middle argument, or a mix of arrays and non-arrays.\n return [mode, tables, scopeFunc];\n}\n\nexport function enterTransactionScope(\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n parentTransaction: Transaction | undefined,\n scopeFunc: ()=>PromiseLike | any\n) {\n return Promise.resolve().then(() => {\n // Keep a pointer to last non-transactional PSD to use if someone calls Dexie.ignoreTransaction().\n const transless = PSD.transless || PSD;\n // Our transaction.\n //return new Promise((resolve, reject) => {\n const trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction);\n trans.explicit = true;\n // Let the transaction instance be part of a Promise-specific data (PSD) value.\n const zoneProps = {\n trans: trans,\n transless: transless\n };\n\n if (parentTransaction) {\n // Emulate transaction commit awareness for inner transaction (must 'commit' when the inner transaction has no more operations ongoing)\n trans.idbtrans = parentTransaction.idbtrans;\n } else {\n try {\n trans.create(); // Create the native transaction so that complete() or error() will trigger even if no operation is made upon it.\n // @ts-ignore Mark the idbtrans object with \"_explicit\". DBCore middleware won't have access to Dexie trans but will need to have this info.\n trans.idbtrans._explicit = true;\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db.close({disableAutoOpen: false});\n return db.open().then(() => enterTransactionScope(\n db,\n mode,\n storeNames,\n null,\n scopeFunc\n ));\n }\n return rejection(ex);\n }\n }\n\n // Support for native async await.\n const scopeFuncIsAsync = isAsyncFunction(scopeFunc);\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n\n let returnValue;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = scopeFunc.call(trans, trans);\n if (returnValue) {\n if (scopeFuncIsAsync) {\n // scopeFunc is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n } else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') {\n // scopeFunc returned an iterator with throw-support. Handle yield as await.\n returnValue = awaitIterator(returnValue);\n }\n }\n }, zoneProps);\n return (returnValue && typeof returnValue.then === 'function' ?\n // Promise returned. User uses promise-style transactions.\n Promise.resolve(returnValue).then(x => trans.active ?\n x // Transaction still active. Continue.\n : rejection(new exceptions.PrematureCommit(\n \"Transaction committed too early. See http://bit.ly/2kdckMn\")))\n // No promise returned. Wait for all outstanding promises before continuing. \n : promiseFollowed.then(() => returnValue)\n ).then(x => {\n // sub transactions don't react to idbtrans.oncomplete. We must trigger a completion:\n if (parentTransaction) trans._resolve();\n // wait for trans._completion\n // (if root transaction, this means 'complete' event. If sub-transaction, we've just fired it ourselves)\n return trans._completion.then(() => x);\n }).catch(e => {\n trans._reject(e); // Yes, above then-handler were maybe not called because of an unhandled rejection in scopeFunc!\n return rejection(e);\n });\n });\n}\n","import {\n DBCore,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryRequest,\n DBCoreRangeType,\n DBCoreOpenCursorRequest,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreTable,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { getKeyExtractor } from './get-key-extractor';\nimport { getKeyPathAlias } from './dbcore-indexeddb';\nimport { Middleware } from '../public/types/middleware';\n\ninterface VirtualIndex extends DBCoreIndex {\n /** True if this index is virtual, i.e. represents a compound index internally,\n * but makes it act as as having a subset of its keyPaths.\n */\n isVirtual: boolean;\n\n /** Number of keypaths that this index comprises. Can be 0..N.\n * Note: This is the length of the *virtual index*, not the real index.\n */\n keyLength: number;\n\n /** Number of popped keypaths from the real index.\n */\n keyTail: number;\n\n /** LowLevelIndex represents the actual IndexedDB index behind it */\n lowLevelIndex: DBCoreIndex;\n}\n\n// Move into some util:\nexport function pad (a: any | any[], value: any, count: number) {\n const result = isArray(a) ? a.slice() : [a];\n for (let i=0; i 0;\n const virtualIndex = {\n ...lowLevelIndex,\n name: isVirtual\n ? `${keyPathAlias}(virtual-from:${lowLevelIndex.name})`\n : lowLevelIndex.name,\n lowLevelIndex,\n isVirtual,\n keyTail,\n keyLength,\n extractKey: getKeyExtractor(keyPath),\n unique: !isVirtual && lowLevelIndex.unique\n };\n indexList.push(virtualIndex);\n if (!virtualIndex.isPrimaryKey) {\n allVirtualIndexes.push(virtualIndex);\n }\n if (keyLength > 1) {\n const virtualKeyPath = keyLength === 2 ?\n keyPath[0] : // This is a compound [a, b]. Add a virtual normal index a.\n keyPath.slice(0, keyLength - 1); // This is compound [a,b,c]. Add virtual compound [a,b].\n addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex);\n }\n indexList.sort((a,b) => a.keyTail - b.keyTail); // Shortest keyTail is the best one (represents real index)\n return virtualIndex;\n }\n \n const primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey);\n indexLookup[\":id\"] = [primaryKey];\n for (const index of schema.indexes) {\n addVirtualIndexes(index.keyPath, 0, index);\n }\n \n function findBestIndex(keyPath: null | string | string[]): VirtualIndex {\n const result = indexLookup[getKeyPathAlias(keyPath)];\n return result && result[0];\n }\n \n function translateRange (range: DBCoreKeyRange, keyTail: number): DBCoreKeyRange {\n return {\n type: range.type === DBCoreRangeType.Equal ?\n DBCoreRangeType.Range :\n range.type,\n lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail),\n lowerOpen: true, // doesn't matter true or false\n upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail),\n upperOpen: true // doesn't matter true or false\n };\n }\n \n function translateRequest (req: DBCoreQueryRequest): DBCoreQueryRequest;\n function translateRequest (req: DBCoreOpenCursorRequest): DBCoreOpenCursorRequest;\n function translateRequest (req: DBCoreCountRequest): DBCoreCountRequest {\n const index = req.query.index as VirtualIndex;\n return index.isVirtual ? {\n ...req,\n query: {\n index: index.lowLevelIndex,\n range: translateRange(req.query.range, index.keyTail)\n }\n } : req;\n }\n \n const result: DBCoreTable = {\n ...table,\n schema: {\n ...schema,\n primaryKey,\n indexes: allVirtualIndexes,\n getIndexByKeyPath: findBestIndex\n },\n\n count(req) {\n return table.count(translateRequest(req));\n }, \n \n query(req) {\n return table.query(translateRequest(req));\n },\n \n openCursor(req) {\n const {keyTail, isVirtual, keyLength} = (req.query.index as VirtualIndex);\n if (!isVirtual) return table.openCursor(req);\n \n function createVirtualCursor(cursor: DBCoreCursor) : DBCoreCursor {\n function _continue (key?: any) {\n key != null ?\n cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) :\n req.unique ?\n cursor.continue(\n cursor.key.slice(0, keyLength)\n .concat(req.reverse\n ? down.MIN_KEY\n : down.MAX_KEY, keyTail)\n ) :\n cursor.continue()\n }\n const virtualCursor = Object.create(cursor, {\n continue: {value: _continue},\n continuePrimaryKey: {\n value(key: any, primaryKey: any) {\n cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey);\n }\n },\n primaryKey: {\n get() {\n return cursor.primaryKey;\n }\n },\n key: {\n get() {\n const key = cursor.key as any[]; // A virtual cursor always operates on compound key\n return keyLength === 1 ?\n key[0] : // Cursor.key should not be an array.\n key.slice(0, keyLength); // Cursor.key should be first part of array.\n }\n },\n value: {\n get() {\n return cursor.value;\n }\n }\n });\n return virtualCursor;\n }\n \n return table.openCursor(translateRequest(req))\n .then(cursor => cursor && createVirtualCursor(cursor));\n }\n };\n return result;\n }\n }\n}\n\nexport const virtualIndexMiddleware : Middleware = {\n stack: \"dbcore\",\n name: \"VirtualIndexMiddleware\",\n level: 1,\n create: createVirtualIndexMiddleware\n};\n\n","import { keys, hasOwn, toStringTag } from './utils';\n\nexport function getObjectDiff(a: any, b: any, rv?: any, prfx?: string) {\n // Compares objects a and b and produces a diff object.\n rv = rv || {};\n prfx = prfx || '';\n keys(a).forEach((prop) => {\n if (!hasOwn(b, prop)) {\n // Property removed\n rv[prfx + prop] = undefined;\n } else {\n var ap = a[prop],\n bp = b[prop];\n if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) {\n const apTypeName = toStringTag(ap);\n const bpTypeName = toStringTag(bp);\n\n if (apTypeName !== bpTypeName) {\n rv[prfx + prop] = b[prop]; // Property changed to other type\n } else if (apTypeName === 'Object') {\n // Pojo objects (not Date, ArrayBuffer, Array etc). Go deep.\n getObjectDiff(ap, bp, rv, prfx + prop + '.');\n } else if (ap !== bp) {\n // Values differ.\n // Could have checked if Date, arrays or binary types have same\n // content here but I think that would be a suboptimation.\n // Prefer simplicity.\n rv[prfx + prop] = b[prop];\n }\n } else if (ap !== bp) rv[prfx + prop] = b[prop]; // Primitive value changed\n }\n });\n keys(b).forEach((prop) => {\n if (!hasOwn(a, prop)) {\n rv[prfx + prop] = b[prop]; // Property added\n }\n });\n return rv;\n}\n","import {\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreIndex,\n DBCoreTable,\n} from \"../public/types/dbcore\";\n\nexport function getEffectiveKeys (\n primaryKey: DBCoreIndex,\n req: (Pick & {keys?: any[]}) | Pick)\n{\n //const {outbound} = primaryKey;\n if (req.type === 'delete') return req.keys;\n return req.keys || req.values.map(primaryKey.extractKey)\n}\n","import {\n DBCore,\n DBCoreTable,\n DBCoreMutateResponse,\n DBCoreDeleteRangeRequest,\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreTransaction,\n DBCoreKeyRange\n} from \"../public/types/dbcore\";\nimport { nop } from '../functions/chaining-functions';\nimport { hasOwn, setByKeyPath } from '../functions/utils';\nimport { getObjectDiff } from \"../functions/get-object-diff\";\nimport { PSD } from '../helpers/promise';\n//import { LockableTableMiddleware } from '../dbcore/lockable-table-middleware';\nimport { getEffectiveKeys } from '../dbcore/get-effective-keys';\nimport { Middleware } from '../public/types/middleware';\nimport { Transaction } from '../classes/transaction';\n\nexport const hooksMiddleware: Middleware = {\n stack: \"dbcore\",\n name: \"HooksMiddleware\",\n level: 2,\n create: (downCore: DBCore) => ({\n ...downCore,\n table(tableName: string) {\n const downTable = downCore.table(tableName);\n const {primaryKey} = downTable.schema;\n \n const tableMiddleware: DBCoreTable = {\n ...downTable,\n mutate(req):Promise {\n const dxTrans = PSD.trans as Transaction;\n // Hooks can be transaction-bound. Need to grab them from transaction.table and not\n // db.table!\n const {deleting, creating, updating} = dxTrans.table(tableName).hook;\n switch (req.type) {\n case 'add':\n if (creating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'put':\n if (creating.fire === nop && updating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'delete':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'deleteRange':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>deleteRange(req), true);\n }\n // Any of the breaks above happened (no hooks) - do the default:\n return downTable.mutate(req);\n\n\n function addPutOrDelete(req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest): Promise {\n const dxTrans = PSD.trans;\n const keys = req.keys || getEffectiveKeys(primaryKey, req);\n if (!keys) throw new Error(\"Keys missing\");\n // Clone Request and set keys arg\n req = req.type === 'add' || req.type === 'put' ?\n {...req, keys} :\n {...req};\n if (req.type !== 'delete') req.values = [...req.values];\n if (req.keys) req.keys = [...req.keys];\n \n return getExistingValues(downTable, req, keys).then (existingValues => {\n const contexts = keys.map((key, i) => {\n const existingValue = existingValues[i];\n const ctx = { onerror: null, onsuccess: null };\n if (req.type === 'delete') {\n // delete operation\n deleting.fire.call(ctx, key, existingValue, dxTrans);\n } else if (req.type === 'add' || existingValue === undefined) {\n // The add() or put() resulted in a create\n const generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans);\n if (key == null && generatedPrimaryKey != null) {\n key = generatedPrimaryKey;\n req.keys[i] = key;\n if (!primaryKey.outbound) {\n setByKeyPath(req.values[i], primaryKey.keyPath, key);\n }\n }\n } else {\n // The put() operation resulted in an update\n const objectDiff = getObjectDiff(existingValue, req.values[i]);\n const additionalChanges = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans);\n if (additionalChanges) {\n const requestedValue = req.values[i];\n Object.keys(additionalChanges).forEach(keyPath => {\n if (hasOwn(requestedValue, keyPath)) {\n // keyPath is already present as a literal property of the object\n requestedValue[keyPath] = additionalChanges[keyPath];\n } else {\n // keyPath represents a new or existing path into the object\n setByKeyPath(requestedValue, keyPath, additionalChanges[keyPath]);\n }\n });\n }\n }\n return ctx;\n });\n return downTable.mutate(req).then(({failures, results, numFailures, lastResult}) => {\n for (let i=0; i {\n contexts.forEach(ctx => ctx.onerror && ctx.onerror(error));\n return Promise.reject(error);\n });\n });\n }\n \n function deleteRange(req: DBCoreDeleteRangeRequest): Promise {\n return deleteNextChunk(req.trans, req.range, 10000);\n }\n \n function deleteNextChunk(trans: DBCoreTransaction, range: DBCoreKeyRange, limit: number) {\n // Query what keys in the DB within the given range\n return downTable.query({trans, values: false, query: {index: primaryKey, range}, limit})\n .then(({result}) => {\n // Given a set of keys, bulk delete those using the same procedure as in addPutOrDelete().\n // This will make sure that deleting hook is called.\n return addPutOrDelete({type: 'delete', keys: result, trans}).then(res => {\n if (res.numFailures > 0) return Promise.reject(res.failures[0]);\n if (result.length < limit) {\n return {failures: [], numFailures: 0, lastResult: undefined} as DBCoreMutateResponse;\n } else {\n return deleteNextChunk(trans, {...range, lower: result[result.length - 1], lowerOpen: true}, limit);\n }\n });\n })\n }\n }\n };\n //const {lock, lockableMiddleware} = LockableTableMiddleware(tableMiddleware);\n\n return tableMiddleware;\n },\n }) as DBCore\n};\n\nfunction getExistingValues(\n table: DBCoreTable,\n req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest,\n effectiveKeys: any[]\n) {\n return req.type === \"add\"\n ? Promise.resolve([])\n : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: \"immutable\" });\n}\n","import { deepClone } from \"../functions/utils\";\nimport { DBCore } from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport Promise from \"../helpers/promise\";\nimport { cmp } from '../functions/cmp';\n\nexport function getFromTransactionCache(\n keys: readonly any[],\n cache: { keys: any[]; values: any[] } | undefined | null,\n clone?: boolean\n) {\n try {\n if (!cache) return null;\n if (cache.keys.length < keys.length) return null;\n const result: any[] = [];\n // Compare if the exact same order of keys was retrieved in same transaction:\n // Allow some cached keys to be omitted from provided set of keys\n // Use case: 1. getMany(keys) 2. update a subset of those 3. call put with the updated ones ==> middlewares should be able to find old values\n for (let i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) {\n if (cmp(cache.keys[i], keys[j]) !== 0) continue;\n result.push(clone ? deepClone(cache.values[i]) : cache.values[i]);\n ++j;\n }\n // If got all keys caller was looking for, return result.\n return result.length === keys.length ? result : null;\n } catch {\n return null;\n }\n}\n\nexport const cacheExistingValuesMiddleware: Middleware = {\n stack: \"dbcore\",\n level: -1,\n create: (core) => {\n return {\n table: (tableName) => {\n const table = core.table(tableName);\n return {\n ...table,\n getMany: (req) => {\n if (!req.cache) {\n return table.getMany(req);\n }\n const cachedResult = getFromTransactionCache(\n req.keys,\n req.trans[\"_cache\"],\n req.cache === \"clone\"\n );\n if (cachedResult) {\n return Promise.resolve(cachedResult);\n }\n return table.getMany(req).then((res) => {\n req.trans[\"_cache\"] = {\n keys: req.keys,\n values: req.cache === \"clone\" ? deepClone(res) : res,\n };\n return res;\n });\n },\n mutate: (req) => {\n // Invalidate cache on any mutate except \"add\" which can't change existing values:\n if (req.type !== \"add\") req.trans[\"_cache\"] = null;\n return table.mutate(req);\n },\n };\n },\n };\n },\n};\n","import { DBCore, DBCoreTable } from '../../public/types/dbcore';\nimport { LiveQueryContext } from '../live-query';\n\nexport function isCachableContext(ctx: LiveQueryContext, table: DBCoreTable) {\n return (\n ctx.trans.mode === 'readonly' &&\n !!ctx.subscr &&\n !ctx.trans.explicit &&\n ctx.trans.db._options.cache !== 'disabled' &&\n !table.schema.primaryKey.outbound\n );\n}\n\n","import { DBCoreCountRequest, DBCoreGetManyRequest, DBCoreGetRequest, DBCoreOpenCursorRequest, DBCoreQueryRequest } from '../../public/types/dbcore';\n\n\nexport function isCachableRequest(type: string, req: Partial) {\n switch (type) {\n case 'query':\n return req.values && !req.unique;\n case 'get':\n return false;\n case 'getMany':\n return false;\n case 'count':\n return false;\n case 'openCursor':\n return false;\n }\n}\n","import { LiveQueryContext } from \".\";\nimport { getFromTransactionCache } from \"../dbcore/cache-existing-values-middleware\";\nimport { getEffectiveKeys } from \"../dbcore/get-effective-keys\";\nimport { exceptions } from \"../errors\";\nimport { cmp } from \"../functions/cmp\";\nimport { isArray, keys } from \"../functions/utils\";\nimport { PSD } from \"../helpers/promise\";\nimport { RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport {\n DBCore,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreGetManyRequest,\n DBCoreGetRequest,\n DBCoreIndex,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreQueryResponse,\n DBCoreTable,\n DBCoreTableSchema,\n DBCoreTransaction,\n} from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport { isCachableContext } from \"./cache/is-cachable-context\";\nimport { isCachableRequest } from \"./cache/is-cachable-request\";\nimport { extendObservabilitySet } from \"./extend-observability-set\";\n\nexport const observabilityMiddleware: Middleware = {\n stack: \"dbcore\",\n level: 0,\n name: \"Observability\",\n create: (core) => {\n const dbName = core.schema.name;\n const FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY);\n\n return {\n ...core,\n transaction: (stores, mode, options) => {\n if (PSD.subscr && mode !== 'readonly') {\n throw new exceptions.ReadOnly(`Readwrite transaction in liveQuery context. Querier source: ${(PSD as LiveQueryContext).querier}`);\n }\n return core.transaction(stores, mode, options);\n },\n table: (tableName) => {\n const table = core.table(tableName);\n const { schema } = table;\n const { primaryKey, indexes } = schema;\n const { extractKey, outbound } = primaryKey;\n const indexesWithAutoIncPK = primaryKey.autoIncrement && indexes.filter(\n (index) => index.compound && (index.keyPath as string[]).includes(primaryKey.keyPath as string)\n );\n const tableClone: DBCoreTable = {\n ...table,\n mutate: (req) => {\n const trans = req.trans as DBCoreTransaction & {\n mutatedParts?: ObservabilitySet;\n };\n const mutatedParts = req.mutatedParts || (req.mutatedParts = {});\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (mutatedParts[part] ||\n (mutatedParts[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n\n const { type } = req;\n let [keys, newObjs] =\n req.type === \"deleteRange\"\n ? [req.range] // keys will be an DBCoreKeyRange object - transformed later on to a [from,to]-style range.\n : req.type === \"delete\"\n ? [req.keys] // keys known already here. newObjs will be undefined.\n : req.values.length < 50\n ? [getEffectiveKeys(primaryKey, req).filter(id => id), req.values] // keys except autoIncremented - they will be added later on.\n : []; // keys and newObjs will both be undefined - changeSpec will become true (changed for entire table)\n\n const oldCache = req.trans[\"_cache\"];\n\n // Add the mutated table and optionally keys to the mutatedTables set on the transaction.\n // Used by subscribers to txcommit event and for Collection.prototype.subscribe().\n if (isArray(keys)) {\n // keys is an array - delete, add or put of less than 50 rows.\n // Individual keys (add put or delete)\n pkRangeSet.addKeys(keys);\n // Only get oldObjs if they have been cached recently\n // (This applies to Collection.modify() only, but also if updating/deleting hooks have subscribers)\n const oldObjs = type === 'delete' || keys.length === newObjs.length ? getFromTransactionCache(keys, oldCache) : null;\n\n // Supply detailed values per index for both old and new objects:\n if (!oldObjs) {\n // add, delete or put and we don't know old values.\n // Indicate this in the \":dels\" part, for the sake of count() and primaryKeys() queries only!\n delsRangeSet.addKeys(keys);\n }\n if (oldObjs || newObjs) {\n // No matter if knowning oldObjs or not, track the indices if it's a put, add or delete.\n trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs);\n }\n } else if (keys) {\n // keys is a DBCoreKeyRange object. Transform it to [from,to]-style range.\n // As we can't know deleted index ranges, mark index-based subscriptions must trigger.\n const range = { from: keys.lower, to: keys.upper };\n delsRangeSet.add(range);\n // deleteRange. keys is a DBCoreKeyRange objects. Transform it to [from,to]-style range.\n pkRangeSet.add(range);\n } else {\n // Too many requests to record the details without slowing down write performance.\n // Let's just record a generic large range on primary key, the virtual :dels index and\n // all secondary indices:\n pkRangeSet.add(FULL_RANGE);\n delsRangeSet.add(FULL_RANGE);\n schema.indexes.forEach(idx => getRangeSet(idx.name).add(FULL_RANGE));\n }\n\n return table.mutate(req).then((res) => {\n // Merge the mutated parts from the request into the transaction's mutatedParts\n // now when the request went fine.\n if (keys && (req.type === 'add' || req.type === 'put')) {\n // Less than 50 requests (keys truthy) (otherwise we've added full range anyway)\n // autoincrement means we might not have got all keys until now\n pkRangeSet.addKeys(res.results);\n if (indexesWithAutoIncPK) {\n // Dexie Issue 1946:\n // If an auto-incremented primary key is part of a compound index,\n // we need to compute the resulting value of that index after inserting\n // the rows.\n indexesWithAutoIncPK.forEach(idx => {\n // Extract values of this compound index where primary key is not yet set:\n const idxVals = req.values.map(v => idx.extractKey(v));\n // Find the position of the primary key in the index:\n const pkPos = (idx.keyPath as string[]).findIndex(prop => prop === primaryKey.keyPath);\n // Update idxVals with the resulting primary keys to complete the index value:\n res.results!.forEach(pk => idxVals[pkPos] = pk);\n // Add the updated index to the rangeset:\n getRangeSet(idx.name).addKeys(idxVals);\n });\n }\n }\n trans.mutatedParts = extendObservabilitySet (\n trans.mutatedParts || {},\n mutatedParts\n );\n return res;\n });\n },\n };\n\n const getRange: (req: any) => [DBCoreIndex, RangeSet] = ({\n query: { index, range },\n }:\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest) => [\n index,\n new RangeSet(range.lower ?? core.MIN_KEY, range.upper ?? core.MAX_KEY),\n ];\n\n const readSubscribers: {[method in\n Exclude]: \n (req: any) => [DBCoreIndex, RangeSet]\n } = {\n get: (req) => [primaryKey, new RangeSet(req.key)],\n getMany: (req) => [primaryKey, new RangeSet().addKeys(req.keys)],\n count: getRange,\n query: getRange,\n openCursor: getRange,\n }\n\n keys(readSubscribers).forEach((method: 'get' | 'getMany' | 'count' | 'query' | 'openCursor') => {\n tableClone[method] = function (\n req:\n | DBCoreGetRequest\n | DBCoreGetManyRequest\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest\n ) {\n const { subscr } = PSD as LiveQueryContext;\n const isLiveQuery = !!subscr;\n let cachable = isCachableContext(PSD as LiveQueryContext, table) && isCachableRequest(method, req);\n const obsSet = cachable\n ? req.obsSet = {} // Implicit read transaction - track changes for this query only for the request's duration\n : subscr; // Explicit read transaction - track changes across entire live query\n\n if (isLiveQuery) {\n // Current zone want's to track all queries so they can be subscribed to.\n // (The query is executed within a \"liveQuery\" zone)\n // Check whether the query applies to a certain set of ranges:\n // Track what we should be observing:\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (obsSet[part] ||\n (obsSet[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n const [queriedIndex, queriedRanges] = readSubscribers[method](req);\n // A generic rule here: queried ranges should always be subscribed to.\n if (method === 'query' && queriedIndex.isPrimaryKey && !(req as DBCoreQueryRequest).values) {\n // A pure primay-key based Collection where only .primaryKeys() is requested. Don't wakeup on other changes than added or deleted primary keys within queried range.\n delsRangeSet.add(queriedRanges);\n } else {\n getRangeSet(queriedIndex.name || \"\").add(queriedRanges);\n }\n if (!queriedIndex.isPrimaryKey) {\n // Only count(), query() and openCursor() operates on secondary indices.\n // Since put(), delete() and deleteRange() mutations may happen without knowing oldObjs,\n // the mutate() method will be missing what secondary indices that are being deleted from\n // the subscribed range. We are working around this issue by recording all the resulting\n // primary keys from the queries. This only works for those kinds of queries where we can\n // derive the primary key from the result.\n // In this block we are accomplishing this using various strategies depending on the properties\n // of the query result.\n\n if (method === \"count\") {\n // We've got a problem! Delete and put mutations happen without known the oldObjs.\n // Those mutation could change the count.\n // Solution: Dedicated \":dels\" url represends a subscription to all mutations without oldObjs\n // (specially triggered in the mutators put(), delete() and deleteRange() when they don't know oldObject)\n delsRangeSet.add(FULL_RANGE);\n } else {\n // openCursor() or query()\n\n // Prepare a keysPromise in case the we're doing an IDBIndex.getAll() on a store with outbound keys.\n const keysPromise =\n method === \"query\" &&\n outbound &&\n (req as DBCoreQueryRequest).values &&\n table.query({\n ...(req as DBCoreQueryRequest),\n values: false,\n });\n\n return table[method].apply(this, arguments).then((res) => {\n if (method === \"query\") {\n if (outbound && (req as DBCoreQueryRequest).values) {\n // If keys are outbound, we can't use extractKey to map what keys to observe.\n // We've queried an index (like 'dateTime') on an outbound table\n // and retrieve a list of objects\n // from who we cannot know their primary keys.\n // \"Luckily\" though, we've prepared the keysPromise to assist us in exact this condition.\n return keysPromise.then(\n ({ result: resultingKeys }: DBCoreQueryResponse) => {\n pkRangeSet.addKeys(resultingKeys);\n return res;\n }\n );\n }\n // query() inbound values, keys or outbound keys. Secondary indexes only since\n // for primary keys we would only add results within the already registered range.\n const pKeys = (req as DBCoreQueryRequest).values\n ? (res as DBCoreQueryResponse).result.map(extractKey)\n : (res as DBCoreQueryResponse).result;\n if ((req as DBCoreQueryRequest).values) {\n // Subscribe to any mutation made on the returned keys,\n // so that we detect both deletions and updated properties.\n pkRangeSet.addKeys(pKeys);\n } else {\n // Subscribe only to mutations on the returned keys\n // in case the mutator was unable to know oldObjs.\n // If it has oldObj, the mutator won't put anything in \":dels\" because\n // it can more fine-grained put the exact removed and added index value in the correct\n // index range that we subscribe to in the queried range sets.\n // We don't load values so a change on a property outside our index will not\n // require us to re-execute the query.\n delsRangeSet.addKeys(pKeys);\n }\n } else if (method === \"openCursor\") {\n // Caller requests a cursor.\n // For the same reason as when method===\"query\", we only need to observe\n // those keys whose values are possibly used or rendered - which could\n // only happen on keys where they get the cursor's key, primaryKey or value.\n const cursor: DBCoreCursor | null = res;\n const wantValues = (req as DBCoreOpenCursorRequest).values;\n return (\n cursor &&\n Object.create(cursor, {\n key: {\n get() {\n delsRangeSet.addKey(cursor.primaryKey);\n return cursor.key;\n },\n },\n primaryKey: {\n get() {\n const pkey = cursor.primaryKey;\n delsRangeSet.addKey(pkey);\n return pkey;\n },\n },\n value: {\n get() {\n wantValues && pkRangeSet.addKey(cursor.primaryKey);\n return cursor.value;\n },\n },\n })\n );\n }\n return res;\n });\n }\n }\n }\n return table[method].apply(this, arguments);\n };\n });\n return tableClone;\n },\n };\n },\n};\n\nfunction trackAffectedIndexes(\n getRangeSet: (index: string) => RangeSet,\n schema: DBCoreTableSchema,\n oldObjs: readonly any[] | undefined,\n newObjs: readonly any[] | undefined\n) {\n function addAffectedIndex(ix: DBCoreIndex) {\n const rangeSet = getRangeSet(ix.name || \"\");\n function extractKey(obj: any) {\n return obj != null ? ix.extractKey(obj) : null;\n }\n const addKeyOrKeys = (key: any) => ix.multiEntry && isArray(key)\n // multiEntry and the old property was an array - add each array entry to the rangeSet:\n ? key.forEach(key => rangeSet.addKey(key))\n // Not multiEntry or the old property was not an array - add each array entry to the rangeSet:\n : rangeSet.addKey(key);\n\n (oldObjs || newObjs).forEach((_, i) => {\n const oldKey = oldObjs && extractKey(oldObjs[i]);\n const newKey = newObjs && extractKey(newObjs[i]);\n if (cmp(oldKey, newKey) !== 0) {\n // The index has changed. Add both old and new value of the index.\n if (oldKey != null) addKeyOrKeys(oldKey); // If oldKey is invalid key, addKey() will be a noop.\n if (newKey != null) addKeyOrKeys(newKey); // If newKey is invalid key, addKey() will be a noop.\n }\n });\n }\n schema.indexes.forEach(addAffectedIndex);\n}\n","import { delArrayItem, isArray } from '../../functions/utils';\nimport { TblQueryCache } from '../../public/types/cache';\nimport {\n DBCoreMutateRequest,\n DBCoreMutateResponse,\n} from '../../public/types/dbcore';\n\nexport function adjustOptimisticFromFailures(\n tblCache: TblQueryCache,\n req: DBCoreMutateRequest,\n res: DBCoreMutateResponse\n): DBCoreMutateRequest {\n if (res.numFailures === 0) return req;\n if (req.type === 'deleteRange') {\n // numFailures > 0 means the deleteRange operation failed in its whole.\n return null;\n }\n\n const numBulkOps = req.keys\n ? req.keys.length\n : 'values' in req && req.values\n ? req.values.length\n : 1;\n if (res.numFailures === numBulkOps) {\n // Same number of failures as the number of ops. This means that all ops failed.\n return null;\n }\n\n const clone: DBCoreMutateRequest = { ...req };\n\n if (isArray(clone.keys)) {\n clone.keys = clone.keys.filter((_, i) => !(i in res.failures));\n }\n if ('values' in clone && isArray(clone.values)) {\n clone.values = clone.values.filter((_, i) => !(i in res.failures));\n }\n return clone;\n}\n","import { cmp } from '../../functions/cmp';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function isAboveLower(key: IndexableType, range: DBCoreKeyRange) {\n return range.lower === undefined\n ? true // lower is less than anything because it is undefined\n : range.lowerOpen\n ? cmp(key, range.lower) > 0 // lowerOpen: Exclude lower bound\n : cmp(key, range.lower) >= 0; // !lowerOpen: Include lower bound\n}\n\nexport function isBelowUpper(key: IndexableType, range: DBCoreKeyRange) {\n return range.upper === undefined\n ? true // upper is greater than anything because it is undefined\n : range.upperOpen\n ? cmp(key, range.upper) < 0 // upperOpen: Exclude upper bound\n : cmp(key, range.upper) <= 0; // !upperOpen: Include upper bound\n}\n\nexport function isWithinRange(key: IndexableType, range: DBCoreKeyRange) {\n return isAboveLower(key, range) && isBelowUpper(key, range);\n}\n","import { cmp } from '../../functions/cmp';\nimport { deepClone, isArray } from '../../functions/utils';\nimport { RangeSet, rangesOverlap } from '../../helpers/rangeset';\nimport { CacheEntry } from '../../public/types/cache';\nimport {\n DBCoreIndex,\n DBCoreMutateRequest,\n DBCoreQueryRequest,\n DBCoreTable,\n} from '../../public/types/dbcore';\nimport { isWithinRange } from './is-within-range';\n\nexport function applyOptimisticOps(\n result: any[],\n req: DBCoreQueryRequest,\n ops: DBCoreMutateRequest[] | undefined,\n table: DBCoreTable,\n cacheEntry: CacheEntry,\n immutable: boolean\n): any[] {\n if (!ops || ops.length === 0) return result;\n const index = req.query.index;\n const { multiEntry } = index;\n const queryRange = req.query.range;\n const primaryKey = table.schema.primaryKey;\n const extractPrimKey = primaryKey.extractKey!;\n const extractIndex = index.extractKey!;\n const extractLowLevelIndex = (index.lowLevelIndex || index).extractKey!;\n\n let finalResult = ops.reduce((result, op) => {\n let modifedResult = result;\n const includedValues =\n op.type === 'add' || op.type === 'put'\n ? op.values.filter((v) => {\n const key = extractIndex(v);\n return multiEntry && isArray(key) // multiEntry index work like plain index unless key is array\n ? key.some((k) => isWithinRange(k, queryRange)) // multiEntry and array key\n : isWithinRange(key, queryRange); // multiEntry but not array key\n }).map(v => {\n v = deepClone(v);// v might come from user so we can't just freeze it.\n if (immutable) Object.freeze(v);\n return v;\n })\n : [];\n switch (op.type) {\n case 'add':\n modifedResult = result.concat(\n req.values\n ? includedValues\n : includedValues.map((v) => extractPrimKey(v))\n );\n break;\n case 'put':\n const keySet = new RangeSet().addKeys(\n op.values.map((v) => extractPrimKey(v))\n );\n modifedResult = result\n .filter((item) => {\n const key = req.values ? extractPrimKey(item) : item;\n return !rangesOverlap(new RangeSet(key), keySet);\n })\n .concat(\n req.values\n ? includedValues\n : includedValues.map((v) => extractPrimKey(v))\n );\n break;\n case 'delete':\n const keysToDelete = new RangeSet().addKeys(op.keys);\n modifedResult = result.filter((item) => {\n const key = req.values ? extractPrimKey(item) : item;\n return !rangesOverlap(new RangeSet(key), keysToDelete);\n });\n\n break;\n case 'deleteRange':\n const range = op.range;\n modifedResult = result.filter((item) => !isWithinRange(extractPrimKey(item), range));\n break;\n }\n return modifedResult;\n }, result);\n\n // If no changes were made, we can return the original result.\n if (finalResult === result) return result;\n\n // Sort the result on sortIndex:\n finalResult.sort((a, b) =>\n cmp(extractLowLevelIndex(a), extractLowLevelIndex(b)) ||\n cmp(extractPrimKey(a), extractPrimKey(b))\n );\n\n // If we have a limit we need to respect it:\n if (req.limit && req.limit < Infinity) {\n if (finalResult.length > req.limit) {\n finalResult.length = req.limit; // Cut of any extras after sorting correctly.\n } else if (result.length === req.limit && finalResult.length < req.limit) {\n // We're missing some items because of the limit. We need to add them back.\n // The easiest way is to mark the cache entry as dirty, which will cause\n // it to be requeried after the write-transaction successfully completes.\n cacheEntry.dirty = true;\n }\n }\n return immutable ? Object.freeze(finalResult) as any[] : finalResult;\n}\n","import { cmp } from '../../functions/cmp';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function areRangesEqual(r1: DBCoreKeyRange, r2: DBCoreKeyRange) {\n return (\n cmp(r1.lower, r2.lower) === 0 &&\n cmp(r1.upper, r2.upper) === 0 &&\n !!r1.lowerOpen === !!r2.lowerOpen &&\n !!r1.upperOpen === !!r2.upperOpen\n );\n}\n","import { cmp } from '../../functions/cmp';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function compareLowers(lower1: any, lower2: any, lowerOpen1: boolean, lowerOpen2: boolean) {\n if (lower1 === undefined) return lower2 !== undefined ? -1 : 0;\n if (lower2 === undefined) return 1; // since lower1 !== undefined\n const c = cmp(lower1, lower2);\n if (c === 0) {\n if (lowerOpen1 && lowerOpen2) return 0;\n if (lowerOpen1) return 1\n if (lowerOpen2) return -1;\n }\n return c;\n}\n\nexport function compareUppers(upper1: any, upper2: any, upperOpen1: boolean, upperOpen2: boolean) {\n if (upper1 === undefined) return upper2 !== undefined ? 1 : 0;\n if (upper2 === undefined) return -1; // since upper1 !== undefined\n const c = cmp(upper1, upper2);\n if (c === 0) {\n if (upperOpen1 && upperOpen2) return 0;\n if (upperOpen1) return -1\n if (upperOpen2) return 1;\n }\n return c;\n}\n\nexport function isSuperRange(r1: DBCoreKeyRange, r2: DBCoreKeyRange) {\n return (\n compareLowers(r1.lower, r2.lower, r1.lowerOpen, r2.lowerOpen) <= 0 &&\n compareUppers(r1.upper, r2.upper, r1.upperOpen, r2.upperOpen) >= 0\n );\n}","import { CacheEntry, TblQueryCache } from '../../public/types/cache';\nimport {\n DBCoreCountRequest,\n DBCoreQueryRequest,\n} from '../../public/types/dbcore';\nimport { areRangesEqual } from './are-ranges-equal';\nimport { cache } from './cache';\nimport { isSuperRange } from './is-super-range';\n\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'query',\n req: DBCoreQueryRequest\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]];\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'count',\n req: DBCoreCountRequest\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]];\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'query' | 'count',\n req: Partial & Partial\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]] {\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (!tblCache) return [];\n const queries = tblCache.queries[type];\n if (!queries) return [null, false, tblCache, null];\n const indexName = req.query ? req.query.index.name : null;\n const entries = queries[indexName || ''];\n if (!entries) return [null, false, tblCache, null];\n\n switch (type) {\n case 'query':\n const equalEntry = entries.find(\n (entry) =>\n (entry.req as DBCoreQueryRequest).limit === req.limit &&\n (entry.req as DBCoreQueryRequest).values === req.values &&\n areRangesEqual(entry.req.query.range, req.query.range)\n );\n if (equalEntry)\n return [\n equalEntry,\n true, // exact match\n tblCache,\n entries,\n ];\n const superEntry = entries.find((entry) => {\n const limit = 'limit' in entry.req ? entry.req.limit : Infinity;\n return (\n limit >= req.limit &&\n (req.values ? (entry.req as DBCoreQueryRequest).values : true) &&\n isSuperRange(entry.req.query.range, req.query.range)\n );\n });\n return [superEntry, false, tblCache, entries];\n case 'count':\n const countQuery = entries.find((entry) =>\n areRangesEqual(entry.req.query.range, req.query.range)\n );\n return [countQuery, !!countQuery, tblCache, entries];\n }\n}\n","import { delArrayItem } from \"../../functions/utils\";\nimport { CacheEntry } from \"../../public/types/cache\";\n\nexport function subscribeToCacheEntry(cacheEntry: CacheEntry, container: CacheEntry[], requery: ()=>void, signal: AbortSignal) {\n cacheEntry.subscribers.add(requery);\n signal.addEventListener(\"abort\", () => {\n cacheEntry.subscribers.delete(requery);\n if (cacheEntry.subscribers.size === 0) {\n enqueForDeletion(cacheEntry, container);\n }\n });\n}\n\n\nfunction enqueForDeletion(cacheEntry: CacheEntry, container: CacheEntry[]) {\n setTimeout(() => {\n if (cacheEntry.subscribers.size === 0) { // Still empty (no new subscribers readded after grace time)\n delArrayItem(container, cacheEntry);\n }\n }, 3000);\n}\n","import { LiveQueryContext } from '..';\nimport type { Transaction } from '../../classes/transaction';\nimport { getEffectiveKeys } from '../../dbcore/get-effective-keys';\nimport { deepClone, delArrayItem, setByKeyPath } from '../../functions/utils';\nimport DexiePromise, { PSD } from '../../helpers/promise';\nimport { ObservabilitySet } from '../../public/types/db-events';\nimport {\n DBCore, DBCoreMutateRequest, DBCoreMutateResponse, DBCoreQueryRequest,\n DBCoreQueryResponse\n} from '../../public/types/dbcore';\nimport { Middleware } from '../../public/types/middleware';\nimport { obsSetsOverlap } from '../obs-sets-overlap';\nimport { adjustOptimisticFromFailures } from './adjust-optimistic-request-from-failures';\nimport { applyOptimisticOps } from './apply-optimistic-ops';\nimport { cache } from './cache';\nimport { findCompatibleQuery } from './find-compatible-query';\nimport { isCachableContext } from './is-cachable-context';\nimport { isCachableRequest } from './is-cachable-request';\nimport { signalSubscribersLazily } from './signalSubscribers';\nimport { subscribeToCacheEntry } from './subscribe-cachentry';\n\nexport const cacheMiddleware: Middleware = {\n stack: 'dbcore',\n level: 0,\n name: 'Cache',\n create: (core) => {\n const dbName = core.schema.name;\n const coreMW: DBCore = {\n ...core,\n transaction: (stores, mode, options) => {\n const idbtrans = core.transaction(\n stores,\n mode,\n options\n ) as IDBTransaction & {\n mutatedParts?: ObservabilitySet;\n _explicit?: boolean;\n };\n // Maintain TblQueryCache.ops array when transactions commit or abort\n if (mode === 'readwrite') {\n const ac = new AbortController();\n const { signal } = ac;\n const endTransaction = (wasCommitted: boolean) => () => {\n ac.abort();\n if (mode === 'readwrite') {\n // Collect which subscribers to notify:\n const affectedSubscribers = new Set<()=>void>();\n\n // Go through all tables in transaction and check if they have any optimistic updates\n for (const storeName of stores) {\n const tblCache = cache[`idb://${dbName}/${storeName}`];\n if (tblCache) {\n const table = core.table(storeName);\n // Pick optimistic ops that are part of this transaction\n const ops = tblCache.optimisticOps.filter(\n (op) => op.trans === idbtrans\n );\n // Transaction was marked as _explicit in enterTransactionScope(), transaction-helpers.ts.\n if (idbtrans._explicit && wasCommitted && idbtrans.mutatedParts) {\n // Invalidate all queries that overlap with the mutated parts and signal their subscribers\n for (const entries of Object.values(\n tblCache.queries.query\n )) {\n for (const entry of entries.slice()) {\n if (obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)) {\n delArrayItem(entries, entry); // Remove the entry from the cache so it can be refreshed\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n }\n }\n }\n } else if (ops.length > 0) {\n // Remove them from the optimisticOps array\n tblCache.optimisticOps = tblCache.optimisticOps.filter(\n (op) => op.trans !== idbtrans\n );\n // Commit or abort the optimistic updates\n for (const entries of Object.values(\n tblCache.queries.query\n )) {\n for (const entry of entries.slice()) {\n if (\n entry.res != null && // if entry.promise but not entry.res, we're fine. Query will resume now and get the result.\n idbtrans.mutatedParts/* &&\n obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)*/\n ) {\n if (wasCommitted && !entry.dirty) {\n const freezeResults = Object.isFrozen(entry.res);\n const modRes = applyOptimisticOps(\n entry.res as any[],\n entry.req,\n ops,\n table,\n entry,\n freezeResults\n );\n if (entry.dirty) {\n // Found out at this point that the entry is dirty - not to rely on!\n delArrayItem(entries, entry);\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n } else if (modRes !== entry.res) {\n entry.res = modRes;\n // Update promise\n entry.promise = DexiePromise.resolve({result: modRes} satisfies DBCoreQueryResponse);\n \n // No need to notify subscribers. They already have this value.\n // We have just updated the value of the cache without having to\n // requery the database - because we know the result for this\n // query based on computing the operations and applying them\n // to the previous result.\n }\n } else {\n if (entry.dirty) {\n // If the entry is dirty we need to get rid of it so that\n // a new entry will be created when the query is run again.\n delArrayItem(entries, entry);\n }\n // If we're not committing, we need to notify subscribers that the\n // optimistic updates are no longer valid.\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n }\n }\n }\n }\n }\n }\n }\n affectedSubscribers.forEach((requery) => requery());\n }\n };\n idbtrans.addEventListener('abort', endTransaction(false), {\n signal,\n });\n idbtrans.addEventListener('error', endTransaction(false), {\n signal,\n });\n idbtrans.addEventListener('complete', endTransaction(true), {\n signal,\n });\n }\n return idbtrans;\n },\n table(tableName: string) {\n const downTable = core.table(tableName);\n const primKey = downTable.schema.primaryKey;\n const tableMW = {\n ...downTable,\n mutate(req: DBCoreMutateRequest): Promise {\n const trans = PSD.trans as Transaction;\n if (\n primKey.outbound || // Non-inbound tables are harded to apply optimistic updates on because we can't know primary key of results\n trans.db._options.cache === 'disabled' || // User has opted-out from caching\n trans.explicit // It's an explicit write transaction being made. Don't affect cache until transaction commits.\n ) {\n // Just forward the request to the core.\n return downTable.mutate(req);\n }\n // Find the TblQueryCache for this table:\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (!tblCache) return downTable.mutate(req);\n\n const promise = downTable.mutate(req);\n if ((req.type === 'add' || req.type === 'put') && (req.values.length >= 50 || getEffectiveKeys(primKey, req).some(key => key == null))) {\n // There are some autoIncremented keys not set yet. Need to wait for completion before we can reliably enqueue the operation.\n // (or there are too many objects so we lazy out to avoid performance bottleneck for large bulk inserts)\n promise.then((res) => { // We need to extract result keys and generate cloned values with the keys set (so that applyOptimisticOps can work)\n // But we have a problem! The req.mutatedParts is still not complete so we have to actively add the keys to the unsignaledParts set manually.\n const reqWithResolvedKeys = {\n ...req,\n values: req.values.map((value, i) => {\n const valueWithKey = primKey.keyPath?.includes('.')\n ? deepClone(value)\n : {\n ...value,\n };\n setByKeyPath(valueWithKey, primKey.keyPath, res.results![i]);\n return valueWithKey;\n })\n };\n const adjustedReq = adjustOptimisticFromFailures(tblCache, reqWithResolvedKeys, res);\n tblCache.optimisticOps.push(adjustedReq);\n // Signal subscribers after the observability middleware has complemented req.mutatedParts with the new keys.\n // We must queue the task so that we get the req.mutatedParts updated by observability middleware first.\n // If we refactor the dependency between observability middleware and this middleware we might not need to queue the task.\n queueMicrotask(()=>req.mutatedParts && signalSubscribersLazily(req.mutatedParts)); // Reason for double laziness: in user awaits put and then does another put, signal once.\n });\n } else {\n // Enque the operation immediately\n tblCache.optimisticOps.push(req);\n // Signal subscribers that there are mutated parts\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts);\n promise.then((res) => {\n if (res.numFailures > 0) {\n // In case the operation failed, we need to remove it from the optimisticOps array.\n delArrayItem(tblCache.optimisticOps, req);\n const adjustedReq = adjustOptimisticFromFailures(tblCache, req, res);\n if (adjustedReq) {\n tblCache.optimisticOps.push(adjustedReq);\n }\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts); // Signal the rolling back of the operation.\n }\n });\n promise.catch(()=> {\n // In case the operation failed, we need to remove it from the optimisticOps array.\n delArrayItem(tblCache.optimisticOps, req);\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts); // Signal the rolling back of the operation.\n });\n }\n return promise;\n },\n query(req: DBCoreQueryRequest): Promise {\n if (!isCachableContext(PSD, downTable) || !isCachableRequest(\"query\", req)) return downTable.query(req);\n const freezeResults =\n (PSD as LiveQueryContext).trans?.db._options.cache === 'immutable';\n const { requery, signal } = PSD as LiveQueryContext;\n let [cacheEntry, exactMatch, tblCache, container] =\n findCompatibleQuery(dbName, tableName, 'query', req);\n if (cacheEntry && exactMatch) {\n cacheEntry.obsSet = req.obsSet!; // So that optimistic result is monitored.\n // How? - because observability-middleware will track result where optimistic\n // mutations are applied and record it in the cacheEntry.\n // TODO: CHANGE THIS! The difference is resultKeys only.\n // Wanted behavior:\n // * cacheEntry obsSet should represent the obsSet without optimistic updates (so it can be checked when merging ops in tx commit)\n // * cacheEntry optimisticObsSet should represent the obsSet with current optimistic updates. It should be updated when adding an op\n // by adding the primary keys of the put/add/delete operation to the set.\n // * observability-middleware should stop recording req.obsSet when a cache entry exact match is found because it won't be used anyway.\n // I'm thinking of merging observability-middleware with cache-middleware into one single middleware because the dependencies are too\n // tight between them.\n } else {\n // --> TODO here: If not exact match, check if we have a superset to extract\n // the data from.\n\n // No cached result found. We need to query the database and cache the result.\n const promise = downTable.query(req).then((res) => {\n // Freeze or clone results\n const result = res.result;\n if (cacheEntry) cacheEntry.res = result;\n if (freezeResults) {\n // For performance reasons don't deep freeze.\n // Only freeze the top-level array and its items.\n // This is good enough to teach users that the result must be treated as immutable\n // without enforcing it recursively on the entire result (which is not even possible\n // for things like Date objects and typed arrays)\n for (let i = 0, l = result.length; i < l; ++i) {\n Object.freeze(result[i]);\n }\n Object.freeze(result);\n } else {\n // If not frozen, we need to clone the result to avoid user mutating the cache\n // When we do this, user's must feel conformable with the fact that the result\n // can be mutated deeply - user is not expected to have any respect for immutability.\n res.result = deepClone(result);\n }\n return res;\n }).catch(error => {\n // In case the query operation failed, we need to remove it from the cache\n // so that subsequent calls does not get the same error but re-evaluate\n // the query.\n if (container && cacheEntry) delArrayItem(container, cacheEntry);\n return Promise.reject(error);\n });\n cacheEntry = {\n obsSet: req.obsSet!,\n promise,\n subscribers: new Set(),\n type: 'query',\n req,\n dirty: false,\n };\n if (container) {\n container.push(cacheEntry);\n } else {\n container = [cacheEntry];\n if (!tblCache) {\n tblCache = cache[`idb://${dbName}/${tableName}`] = {\n queries: {\n query: {},\n count: {},\n },\n objs: new Map(),\n optimisticOps: [],\n unsignaledParts: {}\n };\n }\n tblCache.queries.query[req.query.index.name || ''] = container;\n }\n }\n subscribeToCacheEntry(cacheEntry, container!, requery, signal);\n return cacheEntry.promise.then((res: DBCoreQueryResponse) => {\n return {\n result: applyOptimisticOps(\n res.result,\n req,\n tblCache?.optimisticOps,\n downTable,\n cacheEntry!,\n freezeResults\n ) as any[], // readonly any[]\n };\n });\n },\n };\n return tableMW;\n },\n };\n return coreMW;\n },\n};\n\n\n","import { type Dexie } from \"../classes/dexie\";\nimport { type Table } from \"../classes/table\";\nimport { type Transaction } from \"../classes/transaction\";\n\nexport function vipify(\n target: T,\n vipDb: Dexie\n): T {\n return new Proxy(target, {\n get (target, prop, receiver) {\n // The \"db\" prop of the table or transaction is the only one we need to\n // override. The rest of the props can be accessed from the original\n // object.\n if (prop === 'db') return vipDb;\n return Reflect.get(target, prop, receiver);\n }\n });\n}\n","// Import types from the public API\nimport { Dexie as IDexie } from \"../../public/types/dexie\";\nimport { DexieOptions, DexieConstructor } from \"../../public/types/dexie-constructor\";\nimport { DbEvents } from \"../../public/types/db-events\";\n//import { PromiseExtended, PromiseExtendedConstructor } from '../../public/types/promise-extended';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from \"../../public/types/table-schema\";\nimport { DbSchema } from '../../public/types/db-schema';\n\n// Internal imports\nimport { Table, TableConstructor, createTableConstructor } from \"../table\";\nimport { Collection, CollectionConstructor, createCollectionConstructor } from '../collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { WhereClauseConstructor, createWhereClauseConstructor } from '../where-clause/where-clause-constructor';\nimport { Transaction } from '../transaction';\nimport { TransactionConstructor, createTransactionConstructor } from '../transaction/transaction-constructor';\nimport { Version } from \"../version/version\";\nimport { VersionConstructor, createVersionConstructor } from '../version/version-constructor';\n\n// Other imports...\nimport { DexieEventSet } from '../../public/types/dexie-event-set';\nimport { DexieExceptionClasses } from '../../public/types/errors';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\nimport Promise, { PSD, globalPSD } from '../../helpers/promise';\nimport { extend, override, keys, hasOwn } from '../../functions/utils';\nimport Events from '../../helpers/Events';\nimport { maxString, connections, READONLY, READWRITE } from '../../globals/constants';\nimport { getMaxKey } from '../../functions/quirks';\nimport { exceptions } from '../../errors';\nimport { lowerVersionFirst } from '../version/schema-helpers';\nimport { dexieOpen } from './dexie-open';\nimport { wrap } from '../../helpers/promise';\nimport { _onDatabaseDeleted } from '../../helpers/database-enumerator';\nimport { eventRejectHandler } from '../../functions/event-wrappers';\nimport { extractTransactionArgs, enterTransactionScope } from './transaction-helpers';\nimport { TransactionMode } from '../../public/types/transaction-mode';\nimport { rejection } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { DBCore } from '../../public/types/dbcore';\nimport { Middleware, DexieStacks } from '../../public/types/middleware';\nimport { virtualIndexMiddleware } from '../../dbcore/virtual-index-middleware';\nimport { hooksMiddleware } from '../../hooks/hooks-middleware';\nimport { IndexableType } from '../../public';\nimport { observabilityMiddleware } from '../../live-query/observability-middleware';\nimport { cacheExistingValuesMiddleware } from '../../dbcore/cache-existing-values-middleware';\nimport { cacheMiddleware } from \"../../live-query/cache/cache-middleware\";\nimport { vipify } from \"../../helpers/vipify\";\n\nexport interface DbReadyState {\n dbOpenError: any;\n isBeingOpened: boolean;\n onReadyBeingFired: undefined | Function[];\n openComplete: boolean;\n dbReadyResolve: () => void;\n dbReadyPromise: Promise;\n cancelOpen: (reason?: Error) => void;\n openCanceller: Promise & { _stackHolder?: Error };\n autoSchema: boolean;\n vcFired?: boolean;\n PR1398_maxLoop?: number;\n autoOpen?: boolean;\n}\n\nexport class Dexie implements IDexie {\n _options: DexieOptions;\n _state: DbReadyState;\n _versions: Version[];\n _storeNames: string[];\n _deps: DexieDOMDependencies;\n _allTables: { [name: string]: Table; };\n _createTransaction: (this: Dexie, mode: IDBTransactionMode, storeNames: ArrayLike, dbschema: { [tableName: string]: TableSchema; }, parentTransaction?: Transaction) => Transaction;\n _dbSchema: { [tableName: string]: TableSchema; };\n _hasGetAll?: boolean;\n _maxKey: IndexableType;\n _fireOnBlocked: (ev: Event) => void;\n _middlewares: {[StackName in keyof DexieStacks]?: Middleware[]} = {};\n _vip?: boolean;\n _novip: Dexie;// db._novip is to escape to orig db from db.vip.\n core: DBCore;\n\n name: string;\n verno: number = 0;\n idbdb: IDBDatabase | null;\n vip: Dexie;\n on: DbEvents;\n\n Table: TableConstructor;\n WhereClause: WhereClauseConstructor;\n Collection: CollectionConstructor;\n Version: VersionConstructor;\n Transaction: TransactionConstructor;\n static disableBfCache?: boolean;\n\n constructor(name: string, options?: DexieOptions) {\n const deps = (Dexie as any as DexieConstructor).dependencies;\n this._options = options = {\n // Default Options\n addons: (Dexie as any as DexieConstructor).addons, // Pick statically registered addons by default\n autoOpen: true, // Don't require db.open() explicitely.\n // Default DOM dependency implementations from static prop.\n indexedDB: deps.indexedDB, // Backend IndexedDB api. Default to browser env.\n IDBKeyRange: deps.IDBKeyRange, // Backend IDBKeyRange api. Default to browser env.\n cache: 'cloned', // Default to cloned for backward compatibility. For best performance and least memory consumption use 'immutable'.\n ...options\n }; \n this._deps = {\n indexedDB: options.indexedDB as IDBFactory,\n IDBKeyRange: options.IDBKeyRange as typeof IDBKeyRange\n };\n const {\n addons,\n } = options;\n this._dbSchema = {};\n this._versions = [];\n this._storeNames = [];\n this._allTables = {};\n this.idbdb = null;\n this._novip = this;\n const state: DbReadyState = {\n dbOpenError: null,\n isBeingOpened: false,\n onReadyBeingFired: null,\n openComplete: false,\n dbReadyResolve: nop,\n dbReadyPromise: null as Promise,\n cancelOpen: nop,\n openCanceller: null as Promise,\n autoSchema: true,\n PR1398_maxLoop: 3,\n autoOpen: options.autoOpen,\n };\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n this._state = state;\n this.name = name;\n this.on = Events(this, \"populate\", \"blocked\", \"versionchange\", \"close\", { ready: [promisableChain, nop] }) as DbEvents;\n this.on.ready.subscribe = override(this.on.ready.subscribe, subscribe => {\n return (subscriber, bSticky) => {\n (Dexie as any as DexieConstructor).vip(() => {\n const state = this._state;\n if (state.openComplete) {\n // Database already open. Call subscriber asap.\n if (!state.dbOpenError) Promise.resolve().then(subscriber);\n // bSticky: Also subscribe to future open sucesses (after close / reopen) \n if (bSticky) subscribe(subscriber);\n } else if (state.onReadyBeingFired) {\n // db.on('ready') subscribers are currently being executed and have not yet resolved or rejected\n state.onReadyBeingFired.push(subscriber);\n if (bSticky) subscribe(subscriber);\n } else {\n // Database not yet open. Subscribe to it.\n subscribe(subscriber);\n // If bSticky is falsy, make sure to unsubscribe subscriber when fired once.\n const db = this;\n if (!bSticky) subscribe(function unsubscribe() {\n db.on.ready.unsubscribe(subscriber);\n db.on.ready.unsubscribe(unsubscribe);\n });\n }\n });\n }\n });\n\n // Create derived classes bound to this instance of Dexie:\n this.Collection = createCollectionConstructor(this);\n this.Table = createTableConstructor(this);\n this.Transaction = createTransactionConstructor(this);\n this.Version = createVersionConstructor(this);\n this.WhereClause = createWhereClauseConstructor(this);\n\n // Default subscribers to \"versionchange\" and \"blocked\".\n // Can be overridden by custom handlers. If custom handlers return false, these default\n // behaviours will be prevented.\n this.on(\"versionchange\", ev => {\n // Default behavior for versionchange event is to close database connection.\n // Caller can override this behavior by doing db.on(\"versionchange\", function(){ return false; });\n // Let's not block the other window from making it's delete() or open() call.\n // NOTE! This event is never fired in IE,Edge or Safari.\n if (ev.newVersion > 0)\n console.warn(`Another connection wants to upgrade database '${this.name}'. Closing db now to resume the upgrade.`);\n else\n console.warn(`Another connection wants to delete database '${this.name}'. Closing db now to resume the delete request.`);\n this.close({disableAutoOpen: false});\n // In many web applications, it would be recommended to force window.reload()\n // when this event occurs. To do that, subscribe to the versionchange event\n // and call window.location.reload(true) if ev.newVersion > 0 (not a deletion)\n // The reason for this is that your current web app obviously has old schema code that needs\n // to be updated. Another window got a newer version of the app and needs to upgrade DB but\n // your window is blocking it unless we close it here.\n });\n this.on(\"blocked\", ev => {\n if (!ev.newVersion || ev.newVersion < ev.oldVersion)\n console.warn(`Dexie.delete('${this.name}') was blocked`);\n else\n console.warn(`Upgrade '${this.name}' blocked by other connection holding version ${ev.oldVersion / 10}`);\n });\n\n this._maxKey = getMaxKey(options.IDBKeyRange as typeof IDBKeyRange);\n\n this._createTransaction = (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n parentTransaction?: Transaction) => new this.Transaction(mode, storeNames, dbschema, this._options.chromeTransactionDurability, parentTransaction);\n\n this._fireOnBlocked = ev => {\n this.on(\"blocked\").fire(ev);\n // Workaround (not fully*) for missing \"versionchange\" event in IE,Edge and Safari:\n connections\n .filter(c => c.name === this.name && c !== this && !c._state.vcFired)\n .map(c => c.on(\"versionchange\").fire(ev));\n }\n\n // Default middlewares:\n this.use(cacheExistingValuesMiddleware);\n this.use(cacheMiddleware);\n this.use(observabilityMiddleware);\n this.use(virtualIndexMiddleware);\n this.use(hooksMiddleware);\n\n const vipDB = new Proxy(this, {\n get: (_, prop, receiver) => {\n if (prop === '_vip') return true;\n if (prop === 'table') return (tableName: string) => vipify(this.table(tableName), vipDB);\n const rv = Reflect.get(_, prop, receiver);\n if (rv instanceof Table) return vipify(rv, vipDB);\n if (prop === 'tables') return (rv as Table[]).map(t => vipify(t, vipDB));\n if (prop === '_createTransaction') return function() {\n const tx: Transaction = (rv as typeof this._createTransaction).apply(this, arguments);\n return vipify(tx, vipDB);\n }\n return rv;\n }\n });\n this.vip = vipDB;\n\n // Call each addon:\n addons.forEach(addon => addon(this));\n }\n\n version(versionNumber: number): Version {\n if (isNaN(versionNumber) || versionNumber < 0.1) throw new exceptions.Type(`Given version is not a positive number`);\n versionNumber = Math.round(versionNumber * 10) / 10;\n if (this.idbdb || this._state.isBeingOpened)\n throw new exceptions.Schema(\"Cannot add version when database is open\");\n this.verno = Math.max(this.verno, versionNumber);\n const versions = this._versions;\n var versionInstance = versions.filter(\n v => v._cfg.version === versionNumber)[0];\n if (versionInstance) return versionInstance;\n versionInstance = new this.Version(versionNumber);\n versions.push(versionInstance);\n versions.sort(lowerVersionFirst);\n versionInstance.stores({}); // Derive earlier schemas by default.\n // Disable autoschema mode, as at least one version is specified.\n this._state.autoSchema = false;\n return versionInstance;\n }\n\n _whenReady(fn: () => Promise): Promise {\n return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new Promise((resolve, reject) => {\n if (this._state.openComplete) {\n // idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return reject(new exceptions.DatabaseClosed(this._state.dbOpenError));\n }\n if (!this._state.isBeingOpened) {\n if (!this._state.autoOpen) {\n reject(new exceptions.DatabaseClosed());\n return;\n }\n this.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n this._state.dbReadyPromise.then(resolve, reject);\n }).then(fn);\n }\n\n use({stack, create, level, name}: Middleware): this {\n if (name) this.unuse({stack, name}); // Be able to replace existing middleware.\n const middlewares = this._middlewares[stack] || (this._middlewares[stack] = []);\n middlewares.push({stack, create, level: level == null ? 10 : level, name});\n middlewares.sort((a, b) => a.level - b.level);\n // Todo update db.core and db.tables...core ? Or should be expect this to have effect\n // only after next open()?\n return this;\n }\n\n unuse({stack, create}: Middleware<{stack: keyof DexieStacks}>): this;\n unuse({stack, name}: {stack: keyof DexieStacks, name: string}): this;\n unuse({stack, name, create}: {stack: keyof DexieStacks, name?: string, create?: Function}) {\n if (stack && this._middlewares[stack]) {\n this._middlewares[stack] = this._middlewares[stack].filter(mw =>\n create ? mw.create !== create : // Given middleware has a create method. Match that exactly.\n name ? mw.name !== name : // Given middleware spec \n false);\n }\n return this;\n }\n\n open() {\n return usePSD(\n globalPSD, // Enforce global scope here since db.open() can be part of a live query or transaction scope\n () => dexieOpen(this)\n );\n }\n\n _close(): void {\n const state = this._state;\n const idx = connections.indexOf(this);\n if (idx >= 0) connections.splice(idx, 1);\n if (this.idbdb) {\n try { this.idbdb.close(); } catch (e) { }\n this.idbdb = null;\n } \n // Reset dbReadyPromise promise:\n if (!state.isBeingOpened) {\n // Only if not being opened, reset these promises.\n // Otherwise, keep them so existing promise consumers will resolve when db\n // db is reopened later on, in case closing for purpose reopening, using {disableAutoOpen: false}.\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n }\n }\n\n close({disableAutoOpen} = {disableAutoOpen: true}): void {\n const state = this._state;\n if (disableAutoOpen) {\n if (state.isBeingOpened) {\n // cancel before the call to this._close() because this._close() will recreate dbReadyPromise and openCanceller.\n state.cancelOpen(new exceptions.DatabaseClosed());\n }\n this._close();\n state.autoOpen = false;\n state.dbOpenError = new exceptions.DatabaseClosed();\n } else {\n this._close();\n state.autoOpen = this._options.autoOpen ||\n state.isBeingOpened; // If an open call is ongoing, that same promise will resolve when db is reopend.\n state.openComplete = false;\n state.dbOpenError = null;\n }\n }\n\n delete(closeOptions = {disableAutoOpen: true}): Promise {\n // Prevent accidentially doing db.delete(1) when intention was to do db.[table].delete(1).\n const hasInvalidArguments = arguments.length > 0 && typeof arguments[0] !== 'object'; \n const state = this._state;\n return new Promise((resolve, reject) => {\n const doDelete = () => {\n this.close(closeOptions);\n var req = this._deps.indexedDB.deleteDatabase(this.name);\n req.onsuccess = wrap(() => {\n _onDatabaseDeleted(this._deps, this.name);\n resolve();\n });\n req.onerror = eventRejectHandler(reject);\n req.onblocked = this._fireOnBlocked;\n }\n // Prevent accidentially doing db.delete(1) when intention was to do db.[table].delete(1).\n if (hasInvalidArguments) throw new exceptions.InvalidArgument(\"Invalid closeOptions argument to db.delete()\");\n if (state.isBeingOpened) {\n state.dbReadyPromise.then(doDelete);\n } else {\n doDelete();\n }\n });\n }\n\n backendDB() {\n return this.idbdb;\n }\n\n isOpen() {\n return this.idbdb !== null;\n }\n\n hasBeenClosed() {\n const dbOpenError = this._state.dbOpenError;\n return dbOpenError && (dbOpenError.name === 'DatabaseClosed');\n }\n\n hasFailed() {\n return this._state.dbOpenError !== null;\n }\n\n dynamicallyOpened() {\n return this._state.autoSchema;\n }\n\n get tables () {\n return keys(this._allTables).map(name => this._allTables[name]);\n }\n\n transaction(): Promise {\n const args = extractTransactionArgs.apply(this, arguments);\n return this._transaction.apply(this, args);\n }\n\n _transaction(mode: TransactionMode, tables: Array, scopeFunc: Function) {\n let parentTransaction = PSD.trans as Transaction | undefined;\n // Check if parent transactions is bound to this db instance, and if caller wants to reuse it\n if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) parentTransaction = null;\n const onlyIfCompatible = mode.indexOf('?') !== -1;\n mode = mode.replace('!', '').replace('?', '') as TransactionMode; // Ok. Will change arguments[0] as well but we wont touch arguments henceforth.\n let idbMode: IDBTransactionMode,\n storeNames;\n\n try {\n //\n // Get storeNames from arguments. Either through given table instances, or through given table names.\n //\n storeNames = tables.map(table => {\n var storeName = table instanceof this.Table ? table.name : table;\n if (typeof storeName !== 'string') throw new TypeError(\"Invalid table argument to Dexie.transaction(). Only Table or String are allowed\");\n return storeName;\n });\n\n //\n // Resolve mode. Allow shortcuts \"r\" and \"rw\".\n //\n if (mode == \"r\" || mode === READONLY)\n idbMode = READONLY;\n else if (mode == \"rw\" || mode == READWRITE)\n idbMode = READWRITE;\n else\n throw new exceptions.InvalidArgument(\"Invalid transaction mode: \" + mode);\n\n if (parentTransaction) {\n // Basic checks\n if (parentTransaction.mode === READONLY && idbMode === READWRITE) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY\");\n }\n if (parentTransaction) {\n storeNames.forEach(storeName => {\n if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Table \" + storeName +\n \" not included in parent transaction.\");\n }\n });\n }\n if (onlyIfCompatible && parentTransaction && !parentTransaction.active) {\n // '?' mode should not keep using an inactive transaction.\n parentTransaction = null;\n }\n }\n } catch (e) {\n return parentTransaction ?\n parentTransaction._promise(null, (_, reject) => {reject(e);}) :\n rejection (e);\n }\n // If this is a sub-transaction, lock the parent and then launch the sub-transaction.\n const enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc);\n return (parentTransaction ?\n parentTransaction._promise(idbMode, enterTransaction, \"lock\") :\n PSD.trans ?\n // no parent transaction despite PSD.trans exists. Make sure also\n // that the zone we create is not a sub-zone of current, because\n // Promise.follow() should not wait for it if so.\n usePSD(PSD.transless, ()=>this._whenReady(enterTransaction)) :\n this._whenReady (enterTransaction));\n }\n\n table(tableName: string): Table;\n table(tableName: string): ITable;\n table(tableName: string): Table {\n if (!hasOwn(this._allTables, tableName)) {\n throw new exceptions.InvalidTable(`Table ${tableName} does not exist`); }\n return this._allTables[tableName];\n }\n}\n","import {\n Observable as IObservable,\n Observer,\n Subscription,\n} from \"../../public/types/observable\";\n\nconst symbolObservable: typeof Symbol.observable =\n typeof Symbol !== \"undefined\" && \"observable\" in Symbol\n ? Symbol.observable\n : \"@@observable\" as any;\n\nexport class Observable implements IObservable {\n private _subscribe: (observer: Observer) => Subscription;\n hasValue?: ()=>boolean;\n getValue?: ()=>T;\n\n constructor(subscribe: (observer: Observer) => Subscription) {\n this._subscribe = subscribe;\n }\n\n subscribe(\n onNext?: ((value: T) => void) | null,\n onError?: ((error: any) => void) | null,\n onComplete?: (() => void) | null\n ): Subscription;\n subscribe(observer?: Observer | null): Subscription;\n subscribe(x?: any, error?: any, complete?: any): Subscription {\n return this._subscribe(\n !x || typeof x === \"function\" ? { next: x, error, complete } : x\n );\n }\n\n [symbolObservable]() {\n return this;\n }\n}\n","import { _global } from '../../globals/global';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\n\nexport let domDeps: DexieDOMDependencies\n\ntry {\n domDeps = {\n // Required:\n indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB,\n IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange\n };\n} catch (e) {\n domDeps = { indexedDB: null, IDBKeyRange: null };\n}\n","import { _global, isAsyncFunction, keys, objectIsEmpty } from '../functions/utils';\nimport {\n globalEvents,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport {\n beginMicroTickScope,\n decrementExpectedAwaits,\n endMicroTickScope,\n execInGlobalContext,\n incrementExpectedAwaits,\n NativePromise,\n newScope,\n PSD,\n usePSD,\n} from '../helpers/promise';\nimport { ObservabilitySet } from '../public/types/db-events';\nimport {\n Observable as IObservable,\n Subscription,\n} from '../public/types/observable';\nimport { Observable } from '../classes/observable/observable';\nimport { extendObservabilitySet } from './extend-observability-set';\nimport { rangesOverlap } from '../helpers/rangeset';\nimport { domDeps } from '../classes/dexie/dexie-dom-dependencies';\nimport { Transaction } from '../classes/transaction';\nimport { obsSetsOverlap } from './obs-sets-overlap';\n\nexport interface LiveQueryContext {\n subscr: ObservabilitySet;\n signal: AbortSignal;\n requery: () => void;\n trans: null | Transaction;\n querier: Function; // For debugging purposes and Error messages\n}\n\nexport function liveQuery(querier: () => T | Promise): IObservable {\n let hasValue = false;\n let currentValue: T;\n const observable = new Observable((observer) => {\n const scopeFuncIsAsync = isAsyncFunction(querier);\n function execute(ctx: LiveQueryContext) {\n const wasRootExec = beginMicroTickScope(); // Performance: Avoid starting a new microtick scope within the async context.\n try {\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n let rv = newScope(querier, ctx);\n if (scopeFuncIsAsync) {\n // Make sure to set rv = rv.finally in order to wait to after decrementExpectedAwaits() has been called.\n // This fixes zone leaking issue that the liveQuery zone can leak to observer's next microtask.\n rv = (rv as Promise).finally(decrementExpectedAwaits);\n }\n return rv;\n } finally {\n wasRootExec && endMicroTickScope(); // Given that we created the microtick scope, we must also end it.\n }\n }\n\n let closed = false;\n let abortController: AbortController;\n\n let accumMuts: ObservabilitySet = {};\n let currentObs: ObservabilitySet = {};\n\n const subscription: Subscription = {\n get closed() {\n return closed;\n },\n unsubscribe: () => {\n if (closed) return;\n closed = true;\n if (abortController) abortController.abort();\n if (startedListening) globalEvents.storagemutated.unsubscribe(mutationListener);\n },\n };\n\n observer.start && observer.start(subscription); // https://github.com/tc39/proposal-observable\n\n let startedListening = false;\n\n const doQuery = () => execInGlobalContext(_doQuery);\n\n function shouldNotify() {\n return obsSetsOverlap(currentObs, accumMuts);\n }\n\n const mutationListener = (parts: ObservabilitySet) => {\n extendObservabilitySet(accumMuts, parts);\n if (shouldNotify()) {\n doQuery();\n }\n };\n\n const _doQuery = () => {\n if (\n closed || // closed - don't run!\n !domDeps.indexedDB) // SSR in sveltekit, nextjs etc\n {\n return;\n }\n accumMuts = {};\n const subscr: ObservabilitySet = {};\n // Abort signal fill three purposes:\n // 1. Abort the query if the observable is unsubscribed.\n // 2. Abort the query if a new query is made before the previous one has completed.\n // 3. For cached queries to know if they should remain in memory or could be enqued for being freed up.\n // (they will remain in memory for a short time and if noone needs them again, they will eventually be freed up)\n if (abortController) abortController.abort(); // Cancel previous query. Last query will be cancelled on unsubscribe().\n abortController = new AbortController();\n \n const ctx: LiveQueryContext = {\n subscr,\n signal: abortController.signal,\n requery: doQuery,\n querier,\n trans: null // Make the scope transactionless (don't reuse transaction from outer scope of the caller of subscribe())\n }\n const ret = execute(ctx);\n Promise.resolve(ret).then(\n (result) => {\n hasValue = true;\n currentValue = result;\n if (closed || ctx.signal.aborted) {\n // closed - no subscriber anymore.\n // signal.aborted - new query was made before this one completed and\n // the querier might have catched AbortError and return successful result.\n // If so, we should not rely in that result because we know we have aborted\n // this run, which means there's another run going on that will handle accumMuts\n // and we must not base currentObs on the half-baked subscr.\n return;\n }\n accumMuts = {};\n // Update what we are subscribing for based on this last run:\n currentObs = subscr;\n if (!objectIsEmpty(currentObs) && !startedListening) {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener);\n startedListening = true;\n }\n execInGlobalContext(()=>!closed && observer.next && observer.next(result));\n },\n (err) => {\n hasValue = false;\n if (!['DatabaseClosedError', 'AbortError'].includes(err?.name)) {\n if (!closed) execInGlobalContext(()=>{\n if (closed) return;\n observer.error && observer.error(err);\n });\n }\n }\n );\n };\n\n // Use setTimeot here to guarantee execution in a private macro task before and\n // after. The helper executeInGlobalContext(_doQuery) is not enough here because\n // caller of `subscribe()` could be anything, such as a frontend framework that will\n // continue in the same tick after subscribe() is called and call other\n // eftects, that could involve dexie operations such as writing to the DB.\n // If that happens, the private zone echoes from a live query tast started here\n // could still be ongoing when the other operations start and make them inherit\n // the async context from a live query.\n setTimeout(doQuery, 0);\n return subscription;\n });\n observable.hasValue = () => hasValue;\n observable.getValue = () => currentValue;\n return observable;\n}\n","import { Dexie as _Dexie } from './dexie';\nimport { _global } from '../../globals/global';\nimport { props, derive, extend, override, getByKeyPath, setByKeyPath, delByKeyPath, shallowClone, deepClone, asap } from '../../functions/utils';\nimport { getObjectDiff } from \"../../functions/get-object-diff\";\nimport { fullNameExceptions } from '../../errors';\nimport { DexieConstructor } from '../../public/types/dexie-constructor';\nimport { getDatabaseNames } from '../../helpers/database-enumerator';\nimport { PSD } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { newScope } from '../../helpers/promise';\nimport { rejection } from '../../helpers/promise';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { dexieStackFrameFilter, minKey, connections, DEXIE_VERSION } from '../../globals/constants';\nimport Events from '../../helpers/Events';\nimport { exceptions } from '../../errors';\nimport { errnames } from '../../errors';\nimport { getMaxKey } from '../../functions/quirks';\nimport { vip } from './vip';\nimport { globalEvents } from '../../globals/global-events';\nimport { liveQuery } from '../../live-query/live-query';\nimport { extendObservabilitySet } from '../../live-query/extend-observability-set';\nimport { domDeps } from './dexie-dom-dependencies';\nimport { cmp } from '../../functions/cmp';\nimport { cache } from '../../live-query/cache/cache';\n\n/* (Dexie) is an instance of DexieConstructor, as defined in public/types/dexie-constructor.d.ts\n* (new Dexie()) is an instance of Dexie, as defined in public/types/dexie.d.ts\n* \n* Why we're doing this?\n\n* Because we've choosen to define the public Dexie API using a DexieConstructor interface\n* rather than declaring a class. On that interface, all static props are defined.\n* In practice, class Dexie's constructor implements DexieConstructor and all member props\n* are defined in interface Dexie. We could say, it's a typescript limitation of not being\n* able to define a static interface that forces us to do the cast below.\n*/\nconst Dexie = _Dexie as any as DexieConstructor;\n\n//\n// Set all static methods and properties onto Dexie:\n// \nprops(Dexie, {\n\n // Dexie.BulkError = class BulkError {...};\n // Dexie.XXXError = class XXXError {...};\n ...fullNameExceptions,\n\n //\n // Static delete() method.\n //\n delete(databaseName: string) {\n const db = new Dexie(databaseName, {addons: []});\n return db.delete();\n },\n\n //\n // Static exists() method.\n //\n exists(name: string) {\n return new Dexie(name, { addons: [] }).open().then(db => {\n db.close();\n return true;\n }).catch('NoSuchDatabaseError', () => false);\n },\n\n //\n // Static method for retrieving a list of all existing databases at current host.\n //\n getDatabaseNames(cb) {\n try {\n return getDatabaseNames(Dexie.dependencies).then(cb);\n } catch {\n return rejection(new exceptions.MissingAPI());\n }\n },\n\n /** @deprecated */\n defineClass() {\n function Class(content) {\n extend(this, content);\n }\n return Class;\n },\n\n ignoreTransaction(scopeFunc) {\n // In case caller is within a transaction but needs to create a separate transaction.\n // Example of usage:\n //\n // Let's say we have a logger function in our app. Other application-logic should be unaware of the\n // logger function and not need to include the 'logentries' table in all transaction it performs.\n // The logging should always be done in a separate transaction and not be dependant on the current\n // running transaction context. Then you could use Dexie.ignoreTransaction() to run code that starts a new transaction.\n //\n // Dexie.ignoreTransaction(function() {\n // db.logentries.add(newLogEntry);\n // });\n //\n // Unless using Dexie.ignoreTransaction(), the above example would try to reuse the current transaction\n // in current Promise-scope.\n //\n // An alternative to Dexie.ignoreTransaction() would be setImmediate() or setTimeout(). The reason we still provide an\n // API for this because\n // 1) The intention of writing the statement could be unclear if using setImmediate() or setTimeout().\n // 2) setTimeout() would wait unnescessary until firing. This is however not the case with setImmediate().\n // 3) setImmediate() is not supported in the ES standard.\n // 4) You might want to keep other PSD state that was set in a parent PSD, such as PSD.letThrough.\n return PSD.trans ?\n usePSD(PSD.transless, scopeFunc) : // Use the closest parent that was non-transactional.\n scopeFunc(); // No need to change scope because there is no ongoing transaction.\n },\n\n vip,\n\n async: function (generatorFn: Function) {\n return function () {\n try {\n var rv = awaitIterator(generatorFn.apply(this, arguments));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n };\n },\n\n spawn: function (generatorFn, args, thiz) {\n try {\n var rv = awaitIterator(generatorFn.apply(thiz, args || []));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n },\n\n // Dexie.currentTransaction property\n currentTransaction: {\n get: () => PSD.trans || null\n },\n\n waitFor: function (promiseOrFunction, optionalTimeout) {\n // If a function is provided, invoke it and pass the returning value to Transaction.waitFor()\n const promise = Promise.resolve(\n typeof promiseOrFunction === 'function' ?\n Dexie.ignoreTransaction(promiseOrFunction) :\n promiseOrFunction)\n .timeout(optionalTimeout || 60000); // Default the timeout to one minute. Caller may specify Infinity if required. \n\n // Run given promise on current transaction. If no current transaction, just return a Dexie promise based\n // on given value.\n return PSD.trans ?\n PSD.trans.waitFor(promise) :\n promise;\n },\n\n // Export our Promise implementation since it can be handy as a standalone Promise implementation\n Promise: Promise,\n\n // Dexie.debug proptery:\n // Dexie.debug = false\n // Dexie.debug = true\n // Dexie.debug = \"dexie\" - don't hide dexie's stack frames.\n debug: {\n get: () => Debug.debug,\n set: value => {\n Debug.setDebug(value, value === 'dexie' ? () => true : dexieStackFrameFilter);\n }\n },\n\n // Export our derive/extend/override methodology\n derive: derive, // Deprecate?\n extend: extend, // Deprecate?\n props: props,\n override: override, // Deprecate?\n // Export our Events() function - can be handy as a toolkit\n Events: Events,\n on: globalEvents,\n liveQuery,\n extendObservabilitySet,\n // Utilities\n getByKeyPath: getByKeyPath,\n setByKeyPath: setByKeyPath,\n delByKeyPath: delByKeyPath,\n shallowClone: shallowClone,\n deepClone: deepClone,\n getObjectDiff: getObjectDiff,\n cmp,\n asap: asap,\n //maxKey: new Dexie('',{addons:[]})._maxKey,\n minKey: minKey,\n // Addon registry\n addons: [],\n // Global DB connection list\n connections: connections,\n\n //MultiModifyError: exceptions.Modify, // Obsolete!\n errnames: errnames,\n\n // Export other static classes\n //IndexSpec: IndexSpec, Obsolete!\n //TableSchema: TableSchema, Obsolete!\n\n //\n // Dependencies\n //\n // These will automatically work in browsers with indexedDB support, or where an indexedDB polyfill has been included.\n //\n // In node.js, however, these properties must be set \"manually\" before instansiating a new Dexie().\n // For node.js, you need to require indexeddb-js or similar and then set these deps.\n //\n dependencies: domDeps,\n cache,\n\n // API Version Number: Type Number, make sure to always set a version number that can be comparable correctly. Example: 0.9, 0.91, 0.92, 1.0, 1.01, 1.1, 1.2, 1.21, etc.\n semVer: DEXIE_VERSION,\n version: DEXIE_VERSION.split('.')\n .map(n => parseInt(n))\n .reduce((p, c, i) => p + (c / Math.pow(10, i * 2))),\n\n // https://github.com/dfahlander/Dexie.js/issues/186\n // typescript compiler tsc in mode ts-->es5 & commonJS, will expect require() to return\n // x.default. Workaround: Set Dexie.default = Dexie.\n // default: Dexie, // Commented because solved in index-umd.ts instead.\n // Make it possible to import {Dexie} (non-default import)\n // Reason 1: May switch to that in future.\n // Reason 2: We declare it both default and named exported in d.ts to make it possible\n // to let addons extend the Dexie interface with Typescript 2.1 (works only when explicitely\n // exporting the symbol, not just default exporting)\n // Dexie: Dexie // Commented because solved in index-umd.ts instead.\n});\n\nDexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange);\n","import { globalEvents, DEXIE_STORAGE_MUTATED_EVENT_NAME, STORAGE_MUTATED_DOM_EVENT_NAME } from '../globals/global-events';\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport { signalSubscribersNow } from './cache/signalSubscribers';\n\nif (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, updatedParts => {\n if (!propagatingLocally) {\n let event: CustomEvent;\n event = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, {\n detail: updatedParts\n });\n propagatingLocally = true;\n dispatchEvent(event);\n propagatingLocally = false;\n }\n });\n addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, ({detail}: CustomEvent) => {\n if (!propagatingLocally) {\n propagateLocally(detail);\n }\n });\n}\n\n/** Called from listeners to BroadcastChannel and DOM event to\n * propagate the event locally into dexie's storagemutated event\n * and invalidate cached queries.\n * \n * This function is only called when the event is not originating\n * from this same Dexie module - either from another redundant dexie import\n * or from a foreign tab or worker. That's why we need to invalidate\n * the cache when this happens.\n */\nexport function propagateLocally(updateParts: ObservabilitySet) {\n let wasMe = propagatingLocally;\n try {\n propagatingLocally = true;\n // Fire the \"storagemutated\" event.\n globalEvents.storagemutated.fire(updateParts);\n // Invalidate cached queries and signal subscribers to requery.\n signalSubscribersNow(updateParts, true);\n } finally {\n propagatingLocally = wasMe;\n }\n}\n\nexport let propagatingLocally = false;\n","import {\n globalEvents,\n STORAGE_MUTATED_DOM_EVENT_NAME,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport { propagateLocally, propagatingLocally } from './propagate-locally';\n\nexport let bc: BroadcastChannel;\n\nexport let createBC = ()=>{};\n\nif (typeof BroadcastChannel !== 'undefined') {\n createBC = () => {\n bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME);\n bc.onmessage = ev => ev.data && propagateLocally(ev.data);\n }\n createBC();\n\n /**\n * The Node.js BroadcastChannel will prevent the node process from exiting\n * if the BroadcastChannel is not closed.\n * Therefore we have to call unref() which allows the process to finish\n * properly even when the BroadcastChannel is never closed.\n * @link https://nodejs.org/api/worker_threads.html#broadcastchannelunref\n * @link https://github.com/dexie/Dexie.js/pull/1576\n */\n if (typeof (bc as any).unref === 'function') {\n (bc as any).unref();\n }\n \n //\n // Propagate local changes to remote tabs, windows and workers via BroadcastChannel\n //\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, (changedParts) => {\n if (!propagatingLocally) {\n bc.postMessage(changedParts);\n }\n });\n}\n","import { Dexie } from \"./classes/dexie\";\nimport { connections } from \"./globals/constants\";\nimport { debug } from \"./helpers/debug\";\nimport { RangeSet } from \"./helpers/rangeset\";\nimport { bc, createBC } from \"./live-query/enable-broadcast\";\nimport { propagateLocally } from \"./live-query/propagate-locally\";\n\n\nif (typeof addEventListener !== 'undefined') {\n addEventListener('pagehide', (event) => {\n if (!Dexie.disableBfCache && event.persisted) {\n if (debug) console.debug('Dexie: handling persisted pagehide');\n bc?.close();\n for (const db of connections) {\n db.close({disableAutoOpen: false});\n }\n }\n });\n addEventListener('pageshow', (event) => {\n if (!Dexie.disableBfCache && event.persisted) {\n if (debug) console.debug('Dexie: handling persisted pageshow');\n createBC();\n propagateLocally({all: new RangeSet(-Infinity, [[]])}); // Trigger all queries to requery\n }\n });\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function add(value: number | BigInt | Array) {\n return new PropModification({add: value});\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function remove(value: number | BigInt | Array) {\n return new PropModification({remove: value});\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function replacePrefix(a: string, b:string) {\n return new PropModification({replacePrefix: [a, b]});\n}\n","import { Dexie } from './classes/dexie';\nimport { DexieConstructor } from './public/types/dexie-constructor';\nimport { DexiePromise } from './helpers/promise';\nimport { mapError } from './errors';\nimport * as Debug from './helpers/debug';\nimport { dexieStackFrameFilter } from './globals/constants';\n\n// Generate all static properties such as Dexie.maxKey etc\n// (implement interface DexieConstructor):\nimport './classes/dexie/dexie-static-props';\nimport './live-query/enable-broadcast';\nimport './support-bfcache';\nimport { liveQuery } from './live-query/live-query';\nimport { Entity } from './classes/entity/Entity';\nimport { cmp } from './functions/cmp';\nimport { PropModification, PropModSymbol } from './helpers/prop-modification';\nimport { replacePrefix, add, remove } from './functions/propmods';\n\n\n// Set rejectionMapper of DexiePromise so that it generally tries to map\n// DOMErrors and DOMExceptions to a DexieError instance with same name but with\n// async stack support and with a prototypal inheritance from DexieError and Error.\n// of Map DOMErrors and DOMExceptions to corresponding Dexie errors.\nDexiePromise.rejectionMapper = mapError;\n\n// Let the async stack filter focus on app code and filter away frames from dexie.min.js:\nDebug.setDebug(Debug.debug, dexieStackFrameFilter);\n\nexport { RangeSet, mergeRanges, rangesOverlap } from \"./helpers/rangeset\";\nexport { Dexie, liveQuery }; // Comply with public/index.d.ts.\nexport { Entity };\nexport { cmp };\nexport { PropModSymbol, PropModification, replacePrefix, add, remove };\nexport default Dexie;\n","// Issue #1127. Need another index.ts for the UMD module with only a default export\n// like it was before.\n// In practice though, the UMD export will also export the named export in \n// https://github.com/dfahlander/Dexie.js/blob/c9187ae60c0d7a424f85bab3af179fbbc9901c8e/src/classes/dexie/dexie-static-props.ts#L223-L228\nimport Dexie from \"./index\";\nimport * as namedExports from \"./index\";\nimport { __assign } from 'tslib';\n__assign(Dexie, namedExports, {default: Dexie});\nexport default Dexie;\n"],"names":["asap","_a","Promise","Dexie","safari14Workaround","_Dexie","Debug.debug","Debug.setDebug"],"mappings":"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"} \ No newline at end of file diff --git a/src/dexie/dist/dexie.min.js b/src/dexie/dist/dexie.min.js deleted file mode 100644 index 88e76d734..000000000 --- a/src/dexie/dist/dexie.min.js +++ /dev/null @@ -1,2 +0,0 @@ -(function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Dexie=t()})(this,function(){"use strict";var s=function(e,t){return(s=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};var w=function(){return(w=Object.assign||function(e){for(var t,n=1,r=arguments.length;n.",Ze="String expected.",et=[],tt="__dbnames",nt="readonly",rt="readwrite";function it(e,t){return e?t?function(){return e.apply(this,arguments)&&t.apply(this,arguments)}:e:t}var ot={type:3,lower:-1/0,lowerOpen:!1,upper:[[]],upperOpen:!1};function at(t){return"string"!=typeof t||/\./.test(t)?function(e){return e}:function(e){return void 0===e[t]&&t in e&&delete(e=S(e))[t],e}}function ut(){throw Y.Type()}function st(e,t){try{var n=ct(e),r=ct(t);if(n!==r)return"Array"===n?1:"Array"===r?-1:"binary"===n?1:"binary"===r?-1:"string"===n?1:"string"===r?-1:"Date"===n?1:"Date"!==r?NaN:-1;switch(n){case"number":case"Date":case"string":return ts+c&&f(s+g)})})}var h=yt(r)&&r.limit===1/0&&("function"!=typeof w||w===Et)&&{index:r.index,range:r.range};return f(0).then(function(){if(0=c})).length?(e.forEach(function(u){t.push(function(){var t=h,e=u._cfg.dbschema;fn(s,t,f),fn(s,e,f),h=s._dbSchema=e;var n=an(t,e);n.add.forEach(function(e){un(f,e[0],e[1].primKey,e[1].indexes)}),n.change.forEach(function(e){if(e.recreate)throw new Y.Upgrade("Not yet support for changing primary key");var t=f.objectStore(e.name);e.add.forEach(function(e){return cn(t,e)}),e.change.forEach(function(e){t.deleteIndex(e.name),cn(t,e)}),e.del.forEach(function(e){return t.deleteIndex(e)})});var r=u._cfg.contentUpgrade;if(r&&u._cfg.version>c){Zt(s,f),l._memoizedTables={};var i=g(e);n.del.forEach(function(e){i[e]=t[e]}),tn(s,[s.Transaction.prototype]),en(s,[s.Transaction.prototype],_(i),i),l.schema=i;var o,a=B(r);a&&Le();n=_e.follow(function(){var e;(o=r(l))&&a&&(e=Ue.bind(null,null),o.then(e,e))});return o&&"function"==typeof o.then?_e.resolve(o):n.then(function(){return o})}}),t.push(function(e){var t,n,r=u._cfg.dbschema;t=r,n=e,[].slice.call(n.db.objectStoreNames).forEach(function(e){return null==t[e]&&n.db.deleteObjectStore(e)}),tn(s,[s.Transaction.prototype]),en(s,[s.Transaction.prototype],s._storeNames,s._dbSchema),l.schema=s._dbSchema}),t.push(function(e){s.idbdb.objectStoreNames.contains("$meta")&&(Math.ceil(s.idbdb.version/10)===u._cfg.version?(s.idbdb.deleteObjectStore("$meta"),delete s._dbSchema.$meta,s._storeNames=s._storeNames.filter(function(e){return"$meta"!==e})):e.objectStore("$meta").put(u._cfg.version,"version"))})}),function e(){return t.length?_e.resolve(t.shift()(l.idbtrans)).then(e):_e.resolve()}().then(function(){sn(h,f)})):_e.resolve();var s,c,l,f,t,h}).catch(u)):(_(o).forEach(function(e){un(i,e,o[e].primKey,o[e].indexes)}),Zt(n,i),void _e.follow(function(){return n.on.populate.fire(a)}).catch(u));var e,t})}function on(e,r){sn(e._dbSchema,r),r.db.version%10!=0||r.objectStoreNames.contains("$meta")||r.db.createObjectStore("$meta").add(Math.ceil(r.db.version/10-1),"version");var t=ln(0,e.idbdb,r);fn(e,e._dbSchema,r);for(var n=0,i=an(t,e._dbSchema).change;nMath.pow(2,62)?0:e.oldVersion,m=e<1,f.idbdb=l.result,p&&on(f,v),rn(f,e/10,v,n))},n),l.onsuccess=Te(function(){v=null;var e,t,n,r,i,o=f.idbdb=l.result,a=b(o.objectStoreNames);if(0u.limit?t.length=u.limit:e.length===u.limit&&t.length=r.limit&&(!r.values||e.req.values)&&Xn(e.req.query.range,r.query.range)}),!1,i,o];case"count":a=o.find(function(e){return Gn(e.req.query.range,r.query.range)});return[a,!!a,i,o]}}(O,c,"query",t),a=o[0],e=o[1],u=o[2],s=o[3];return a&&e?a.obsSet=t.obsSet:(e=l.query(t).then(function(e){var t=e.result;if(a&&(a.res=t),i){for(var n=0,r=t.length;n= 0) - a.splice(i, 1); - return i >= 0; -} -var NO_CHAR_ARRAY = {}; -function getArrayOf(arrayLike) { - var i, a, x, it; - if (arguments.length === 1) { - if (isArray(arrayLike)) - return arrayLike.slice(); - if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') - return [arrayLike]; - if ((it = getIteratorOf(arrayLike))) { - a = []; - while ((x = it.next()), !x.done) - a.push(x.value); - return a; - } - if (arrayLike == null) - return [arrayLike]; - i = arrayLike.length; - if (typeof i === 'number') { - a = new Array(i); - while (i--) - a[i] = arrayLike[i]; - return a; - } - return [arrayLike]; - } - i = arguments.length; - a = new Array(i); - while (i--) - a[i] = arguments[i]; - return a; -} -var isAsyncFunction = typeof Symbol !== 'undefined' - ? function (fn) { return fn[Symbol.toStringTag] === 'AsyncFunction'; } - : function () { return false; }; - -var dexieErrorNames = [ - 'Modify', - 'Bulk', - 'OpenFailed', - 'VersionChange', - 'Schema', - 'Upgrade', - 'InvalidTable', - 'MissingAPI', - 'NoSuchDatabase', - 'InvalidArgument', - 'SubTransaction', - 'Unsupported', - 'Internal', - 'DatabaseClosed', - 'PrematureCommit', - 'ForeignAwait' -]; -var idbDomErrorNames = [ - 'Unknown', - 'Constraint', - 'Data', - 'TransactionInactive', - 'ReadOnly', - 'Version', - 'NotFound', - 'InvalidState', - 'InvalidAccess', - 'Abort', - 'Timeout', - 'QuotaExceeded', - 'Syntax', - 'DataClone' -]; -var errorList = dexieErrorNames.concat(idbDomErrorNames); -var defaultTexts = { - VersionChanged: "Database version changed by other database connection", - DatabaseClosed: "Database has been closed", - Abort: "Transaction aborted", - TransactionInactive: "Transaction has already completed or failed", - MissingAPI: "IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb" -}; -function DexieError(name, msg) { - this.name = name; - this.message = msg; -} -derive(DexieError).from(Error).extend({ - toString: function () { return this.name + ": " + this.message; } -}); -function getMultiErrorMessage(msg, failures) { - return msg + ". Errors: " + Object.keys(failures) - .map(function (key) { return failures[key].toString(); }) - .filter(function (v, i, s) { return s.indexOf(v) === i; }) - .join('\n'); -} -function ModifyError(msg, failures, successCount, failedKeys) { - this.failures = failures; - this.failedKeys = failedKeys; - this.successCount = successCount; - this.message = getMultiErrorMessage(msg, failures); -} -derive(ModifyError).from(DexieError); -function BulkError(msg, failures) { - this.name = "BulkError"; - this.failures = Object.keys(failures).map(function (pos) { return failures[pos]; }); - this.failuresByPos = failures; - this.message = getMultiErrorMessage(msg, this.failures); -} -derive(BulkError).from(DexieError); -var errnames = errorList.reduce(function (obj, name) { return (obj[name] = name + "Error", obj); }, {}); -var BaseException = DexieError; -var exceptions = errorList.reduce(function (obj, name) { - var fullName = name + "Error"; - function DexieError(msgOrInner, inner) { - this.name = fullName; - if (!msgOrInner) { - this.message = defaultTexts[name] || fullName; - this.inner = null; - } - else if (typeof msgOrInner === 'string') { - this.message = "".concat(msgOrInner).concat(!inner ? '' : '\n ' + inner); - this.inner = inner || null; - } - else if (typeof msgOrInner === 'object') { - this.message = "".concat(msgOrInner.name, " ").concat(msgOrInner.message); - this.inner = msgOrInner; - } - } - derive(DexieError).from(BaseException); - obj[name] = DexieError; - return obj; -}, {}); -exceptions.Syntax = SyntaxError; -exceptions.Type = TypeError; -exceptions.Range = RangeError; -var exceptionMap = idbDomErrorNames.reduce(function (obj, name) { - obj[name + "Error"] = exceptions[name]; - return obj; -}, {}); -function mapError(domError, message) { - if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name]) - return domError; - var rv = new exceptionMap[domError.name](message || domError.message, domError); - if ("stack" in domError) { - setProp(rv, "stack", { get: function () { - return this.inner.stack; - } }); - } - return rv; -} -var fullNameExceptions = errorList.reduce(function (obj, name) { - if (["Syntax", "Type", "Range"].indexOf(name) === -1) - obj[name + "Error"] = exceptions[name]; - return obj; -}, {}); -fullNameExceptions.ModifyError = ModifyError; -fullNameExceptions.DexieError = DexieError; -fullNameExceptions.BulkError = BulkError; - -function nop() { } -function mirror(val) { return val; } -function pureFunctionChain(f1, f2) { - if (f1 == null || f1 === mirror) - return f2; - return function (val) { - return f2(f1(val)); - }; -} -function callBoth(on1, on2) { - return function () { - on1.apply(this, arguments); - on2.apply(this, arguments); - }; -} -function hookCreatingChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - var res = f1.apply(this, arguments); - if (res !== undefined) - arguments[0] = res; - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = null; - this.onerror = null; - var res2 = f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - return res2 !== undefined ? res2 : res; - }; -} -function hookDeletingChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - f1.apply(this, arguments); - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = this.onerror = null; - f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - }; -} -function hookUpdatingChain(f1, f2) { - if (f1 === nop) - return f2; - return function (modifications) { - var res = f1.apply(this, arguments); - extend(modifications, res); - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = null; - this.onerror = null; - var res2 = f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - return res === undefined ? - (res2 === undefined ? undefined : res2) : - (extend(res, res2)); - }; -} -function reverseStoppableEventChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - if (f2.apply(this, arguments) === false) - return false; - return f1.apply(this, arguments); - }; -} -function promisableChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - var res = f1.apply(this, arguments); - if (res && typeof res.then === 'function') { - var thiz = this, i = arguments.length, args = new Array(i); - while (i--) - args[i] = arguments[i]; - return res.then(function () { - return f2.apply(thiz, args); - }); - } - return f2.apply(this, arguments); - }; -} - -var debug = typeof location !== 'undefined' && - /^(http|https):\/\/(localhost|127\.0\.0\.1)/.test(location.href); -function setDebug(value, filter) { - debug = value; -} - -var INTERNAL = {}; -var ZONE_ECHO_LIMIT = 100, _a$1 = typeof Promise === 'undefined' ? - [] : - (function () { - var globalP = Promise.resolve(); - if (typeof crypto === 'undefined' || !crypto.subtle) - return [globalP, getProto(globalP), globalP]; - var nativeP = crypto.subtle.digest("SHA-512", new Uint8Array([0])); - return [ - nativeP, - getProto(nativeP), - globalP - ]; - })(), resolvedNativePromise = _a$1[0], nativePromiseProto = _a$1[1], resolvedGlobalPromise = _a$1[2], nativePromiseThen = nativePromiseProto && nativePromiseProto.then; -var NativePromise = resolvedNativePromise && resolvedNativePromise.constructor; -var patchGlobalPromise = !!resolvedGlobalPromise; -function schedulePhysicalTick() { - queueMicrotask(physicalTick); -} -var asap = function (callback, args) { - microtickQueue.push([callback, args]); - if (needsNewPhysicalTick) { - schedulePhysicalTick(); - needsNewPhysicalTick = false; - } -}; -var isOutsideMicroTick = true, -needsNewPhysicalTick = true, -unhandledErrors = [], -rejectingErrors = [], -rejectionMapper = mirror; -var globalPSD = { - id: 'global', - global: true, - ref: 0, - unhandleds: [], - onunhandled: nop, - pgp: false, - env: {}, - finalize: nop -}; -var PSD = globalPSD; -var microtickQueue = []; -var numScheduledCalls = 0; -var tickFinalizers = []; -function DexiePromise(fn) { - if (typeof this !== 'object') - throw new TypeError('Promises must be constructed via new'); - this._listeners = []; - this._lib = false; - var psd = (this._PSD = PSD); - if (typeof fn !== 'function') { - if (fn !== INTERNAL) - throw new TypeError('Not a function'); - this._state = arguments[1]; - this._value = arguments[2]; - if (this._state === false) - handleRejection(this, this._value); - return; - } - this._state = null; - this._value = null; - ++psd.ref; - executePromiseTask(this, fn); -} -var thenProp = { - get: function () { - var psd = PSD, microTaskId = totalEchoes; - function then(onFulfilled, onRejected) { - var _this = this; - var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes); - var cleanup = possibleAwait && !decrementExpectedAwaits(); - var rv = new DexiePromise(function (resolve, reject) { - propagateToListener(_this, new Listener(nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup), nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup), resolve, reject, psd)); - }); - if (this._consoleTask) - rv._consoleTask = this._consoleTask; - return rv; - } - then.prototype = INTERNAL; - return then; - }, - set: function (value) { - setProp(this, 'then', value && value.prototype === INTERNAL ? - thenProp : - { - get: function () { - return value; - }, - set: thenProp.set - }); - } -}; -props(DexiePromise.prototype, { - then: thenProp, - _then: function (onFulfilled, onRejected) { - propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); - }, - catch: function (onRejected) { - if (arguments.length === 1) - return this.then(null, onRejected); - var type = arguments[0], handler = arguments[1]; - return typeof type === 'function' ? this.then(null, function (err) { - return err instanceof type ? handler(err) : PromiseReject(err); - }) - : this.then(null, function (err) { - return err && err.name === type ? handler(err) : PromiseReject(err); - }); - }, - finally: function (onFinally) { - return this.then(function (value) { - return DexiePromise.resolve(onFinally()).then(function () { return value; }); - }, function (err) { - return DexiePromise.resolve(onFinally()).then(function () { return PromiseReject(err); }); - }); - }, - timeout: function (ms, msg) { - var _this = this; - return ms < Infinity ? - new DexiePromise(function (resolve, reject) { - var handle = setTimeout(function () { return reject(new exceptions.Timeout(msg)); }, ms); - _this.then(resolve, reject).finally(clearTimeout.bind(null, handle)); - }) : this; - } -}); -if (typeof Symbol !== 'undefined' && Symbol.toStringTag) - setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise'); -globalPSD.env = snapShot(); -function Listener(onFulfilled, onRejected, resolve, reject, zone) { - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; - this.onRejected = typeof onRejected === 'function' ? onRejected : null; - this.resolve = resolve; - this.reject = reject; - this.psd = zone; -} -props(DexiePromise, { - all: function () { - var values = getArrayOf.apply(null, arguments) - .map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - if (values.length === 0) - resolve([]); - var remaining = values.length; - values.forEach(function (a, i) { return DexiePromise.resolve(a).then(function (x) { - values[i] = x; - if (!--remaining) - resolve(values); - }, reject); }); - }); - }, - resolve: function (value) { - if (value instanceof DexiePromise) - return value; - if (value && typeof value.then === 'function') - return new DexiePromise(function (resolve, reject) { - value.then(resolve, reject); - }); - var rv = new DexiePromise(INTERNAL, true, value); - return rv; - }, - reject: PromiseReject, - race: function () { - var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - values.map(function (value) { return DexiePromise.resolve(value).then(resolve, reject); }); - }); - }, - PSD: { - get: function () { return PSD; }, - set: function (value) { return PSD = value; } - }, - totalEchoes: { get: function () { return totalEchoes; } }, - newPSD: newScope, - usePSD: usePSD, - scheduler: { - get: function () { return asap; }, - set: function (value) { asap = value; } - }, - rejectionMapper: { - get: function () { return rejectionMapper; }, - set: function (value) { rejectionMapper = value; } - }, - follow: function (fn, zoneProps) { - return new DexiePromise(function (resolve, reject) { - return newScope(function (resolve, reject) { - var psd = PSD; - psd.unhandleds = []; - psd.onunhandled = reject; - psd.finalize = callBoth(function () { - var _this = this; - run_at_end_of_this_or_next_physical_tick(function () { - _this.unhandleds.length === 0 ? resolve() : reject(_this.unhandleds[0]); - }); - }, psd.finalize); - fn(); - }, zoneProps, resolve, reject); - }); - } -}); -if (NativePromise) { - if (NativePromise.allSettled) - setProp(DexiePromise, "allSettled", function () { - var possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(function (resolve) { - if (possiblePromises.length === 0) - resolve([]); - var remaining = possiblePromises.length; - var results = new Array(remaining); - possiblePromises.forEach(function (p, i) { return DexiePromise.resolve(p).then(function (value) { return results[i] = { status: "fulfilled", value: value }; }, function (reason) { return results[i] = { status: "rejected", reason: reason }; }) - .then(function () { return --remaining || resolve(results); }); }); - }); - }); - if (NativePromise.any && typeof AggregateError !== 'undefined') - setProp(DexiePromise, "any", function () { - var possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - if (possiblePromises.length === 0) - reject(new AggregateError([])); - var remaining = possiblePromises.length; - var failures = new Array(remaining); - possiblePromises.forEach(function (p, i) { return DexiePromise.resolve(p).then(function (value) { return resolve(value); }, function (failure) { - failures[i] = failure; - if (!--remaining) - reject(new AggregateError(failures)); - }); }); - }); - }); -} -function executePromiseTask(promise, fn) { - try { - fn(function (value) { - if (promise._state !== null) - return; - if (value === promise) - throw new TypeError('A promise cannot be resolved with itself.'); - var shouldExecuteTick = promise._lib && beginMicroTickScope(); - if (value && typeof value.then === 'function') { - executePromiseTask(promise, function (resolve, reject) { - value instanceof DexiePromise ? - value._then(resolve, reject) : - value.then(resolve, reject); - }); - } - else { - promise._state = true; - promise._value = value; - propagateAllListeners(promise); - } - if (shouldExecuteTick) - endMicroTickScope(); - }, handleRejection.bind(null, promise)); - } - catch (ex) { - handleRejection(promise, ex); - } -} -function handleRejection(promise, reason) { - rejectingErrors.push(reason); - if (promise._state !== null) - return; - var shouldExecuteTick = promise._lib && beginMicroTickScope(); - reason = rejectionMapper(reason); - promise._state = false; - promise._value = reason; - addPossiblyUnhandledError(promise); - propagateAllListeners(promise); - if (shouldExecuteTick) - endMicroTickScope(); -} -function propagateAllListeners(promise) { - var listeners = promise._listeners; - promise._listeners = []; - for (var i = 0, len = listeners.length; i < len; ++i) { - propagateToListener(promise, listeners[i]); - } - var psd = promise._PSD; - --psd.ref || psd.finalize(); - if (numScheduledCalls === 0) { - ++numScheduledCalls; - asap(function () { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - }, []); - } -} -function propagateToListener(promise, listener) { - if (promise._state === null) { - promise._listeners.push(listener); - return; - } - var cb = promise._state ? listener.onFulfilled : listener.onRejected; - if (cb === null) { - return (promise._state ? listener.resolve : listener.reject)(promise._value); - } - ++listener.psd.ref; - ++numScheduledCalls; - asap(callListener, [cb, promise, listener]); -} -function callListener(cb, promise, listener) { - try { - var ret, value = promise._value; - if (!promise._state && rejectingErrors.length) - rejectingErrors = []; - ret = debug && promise._consoleTask ? promise._consoleTask.run(function () { return cb(value); }) : cb(value); - if (!promise._state && rejectingErrors.indexOf(value) === -1) { - markErrorAsHandled(promise); - } - listener.resolve(ret); - } - catch (e) { - listener.reject(e); - } - finally { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - --listener.psd.ref || listener.psd.finalize(); - } -} -function physicalTick() { - usePSD(globalPSD, function () { - beginMicroTickScope() && endMicroTickScope(); - }); -} -function beginMicroTickScope() { - var wasRootExec = isOutsideMicroTick; - isOutsideMicroTick = false; - needsNewPhysicalTick = false; - return wasRootExec; -} -function endMicroTickScope() { - var callbacks, i, l; - do { - while (microtickQueue.length > 0) { - callbacks = microtickQueue; - microtickQueue = []; - l = callbacks.length; - for (i = 0; i < l; ++i) { - var item = callbacks[i]; - item[0].apply(null, item[1]); - } - } - } while (microtickQueue.length > 0); - isOutsideMicroTick = true; - needsNewPhysicalTick = true; -} -function finalizePhysicalTick() { - var unhandledErrs = unhandledErrors; - unhandledErrors = []; - unhandledErrs.forEach(function (p) { - p._PSD.onunhandled.call(null, p._value, p); - }); - var finalizers = tickFinalizers.slice(0); - var i = finalizers.length; - while (i) - finalizers[--i](); -} -function run_at_end_of_this_or_next_physical_tick(fn) { - function finalizer() { - fn(); - tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1); - } - tickFinalizers.push(finalizer); - ++numScheduledCalls; - asap(function () { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - }, []); -} -function addPossiblyUnhandledError(promise) { - if (!unhandledErrors.some(function (p) { return p._value === promise._value; })) - unhandledErrors.push(promise); -} -function markErrorAsHandled(promise) { - var i = unhandledErrors.length; - while (i) - if (unhandledErrors[--i]._value === promise._value) { - unhandledErrors.splice(i, 1); - return; - } -} -function PromiseReject(reason) { - return new DexiePromise(INTERNAL, false, reason); -} -function wrap(fn, errorCatcher) { - var psd = PSD; - return function () { - var wasRootExec = beginMicroTickScope(), outerScope = PSD; - try { - switchToZone(psd, true); - return fn.apply(this, arguments); - } - catch (e) { - errorCatcher && errorCatcher(e); - } - finally { - switchToZone(outerScope, false); - if (wasRootExec) - endMicroTickScope(); - } - }; -} -var task = { awaits: 0, echoes: 0, id: 0 }; -var taskCounter = 0; -var zoneStack = []; -var zoneEchoes = 0; -var totalEchoes = 0; -var zone_id_counter = 0; -function newScope(fn, props, a1, a2) { - var parent = PSD, psd = Object.create(parent); - psd.parent = parent; - psd.ref = 0; - psd.global = false; - psd.id = ++zone_id_counter; - globalPSD.env; - psd.env = patchGlobalPromise ? { - Promise: DexiePromise, - PromiseProp: { value: DexiePromise, configurable: true, writable: true }, - all: DexiePromise.all, - race: DexiePromise.race, - allSettled: DexiePromise.allSettled, - any: DexiePromise.any, - resolve: DexiePromise.resolve, - reject: DexiePromise.reject, - } : {}; - if (props) - extend(psd, props); - ++parent.ref; - psd.finalize = function () { - --this.parent.ref || this.parent.finalize(); - }; - var rv = usePSD(psd, fn, a1, a2); - if (psd.ref === 0) - psd.finalize(); - return rv; -} -function incrementExpectedAwaits() { - if (!task.id) - task.id = ++taskCounter; - ++task.awaits; - task.echoes += ZONE_ECHO_LIMIT; - return task.id; -} -function decrementExpectedAwaits() { - if (!task.awaits) - return false; - if (--task.awaits === 0) - task.id = 0; - task.echoes = task.awaits * ZONE_ECHO_LIMIT; - return true; -} -if (('' + nativePromiseThen).indexOf('[native code]') === -1) { - incrementExpectedAwaits = decrementExpectedAwaits = nop; -} -function onPossibleParallellAsync(possiblePromise) { - if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) { - incrementExpectedAwaits(); - return possiblePromise.then(function (x) { - decrementExpectedAwaits(); - return x; - }, function (e) { - decrementExpectedAwaits(); - return rejection(e); - }); - } - return possiblePromise; -} -function zoneEnterEcho(targetZone) { - ++totalEchoes; - if (!task.echoes || --task.echoes === 0) { - task.echoes = task.awaits = task.id = 0; - } - zoneStack.push(PSD); - switchToZone(targetZone, true); -} -function zoneLeaveEcho() { - var zone = zoneStack[zoneStack.length - 1]; - zoneStack.pop(); - switchToZone(zone, false); -} -function switchToZone(targetZone, bEnteringZone) { - var currentZone = PSD; - if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) { - queueMicrotask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho); - } - if (targetZone === PSD) - return; - PSD = targetZone; - if (currentZone === globalPSD) - globalPSD.env = snapShot(); - if (patchGlobalPromise) { - var GlobalPromise = globalPSD.env.Promise; - var targetEnv = targetZone.env; - if (currentZone.global || targetZone.global) { - Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp); - GlobalPromise.all = targetEnv.all; - GlobalPromise.race = targetEnv.race; - GlobalPromise.resolve = targetEnv.resolve; - GlobalPromise.reject = targetEnv.reject; - if (targetEnv.allSettled) - GlobalPromise.allSettled = targetEnv.allSettled; - if (targetEnv.any) - GlobalPromise.any = targetEnv.any; - } - } -} -function snapShot() { - var GlobalPromise = _global.Promise; - return patchGlobalPromise ? { - Promise: GlobalPromise, - PromiseProp: Object.getOwnPropertyDescriptor(_global, "Promise"), - all: GlobalPromise.all, - race: GlobalPromise.race, - allSettled: GlobalPromise.allSettled, - any: GlobalPromise.any, - resolve: GlobalPromise.resolve, - reject: GlobalPromise.reject, - } : {}; -} -function usePSD(psd, fn, a1, a2, a3) { - var outerScope = PSD; - try { - switchToZone(psd, true); - return fn(a1, a2, a3); - } - finally { - switchToZone(outerScope, false); - } -} -function nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) { - return typeof fn !== 'function' ? fn : function () { - var outerZone = PSD; - if (possibleAwait) - incrementExpectedAwaits(); - switchToZone(zone, true); - try { - return fn.apply(this, arguments); - } - finally { - switchToZone(outerZone, false); - if (cleanup) - queueMicrotask(decrementExpectedAwaits); - } - }; -} -function execInGlobalContext(cb) { - if (Promise === NativePromise && task.echoes === 0) { - if (zoneEchoes === 0) { - cb(); - } - else { - enqueueNativeMicroTask(cb); - } - } - else { - setTimeout(cb, 0); - } -} -var rejection = DexiePromise.reject; - -function tempTransaction(db, mode, storeNames, fn) { - if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) { - if (db._state.openComplete) { - return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError)); - } - if (!db._state.isBeingOpened) { - if (!db._state.autoOpen) - return rejection(new exceptions.DatabaseClosed()); - db.open().catch(nop); - } - return db._state.dbReadyPromise.then(function () { return tempTransaction(db, mode, storeNames, fn); }); - } - else { - var trans = db._createTransaction(mode, storeNames, db._dbSchema); - try { - trans.create(); - db._state.PR1398_maxLoop = 3; - } - catch (ex) { - if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { - console.warn('Dexie: Need to reopen db'); - db.close({ disableAutoOpen: false }); - return db.open().then(function () { return tempTransaction(db, mode, storeNames, fn); }); - } - return rejection(ex); - } - return trans._promise(mode, function (resolve, reject) { - return newScope(function () { - PSD.trans = trans; - return fn(resolve, reject, trans); - }); - }).then(function (result) { - if (mode === 'readwrite') - try { - trans.idbtrans.commit(); - } - catch (_a) { } - return mode === 'readonly' ? result : trans._completion.then(function () { return result; }); - }); - } -} - -var DEXIE_VERSION = '4.0.7'; -var maxString = String.fromCharCode(65535); -var minKey = -Infinity; -var INVALID_KEY_ARGUMENT = "Invalid key provided. Keys must be of type string, number, Date or Array."; -var STRING_EXPECTED = "String expected."; -var connections = []; -var DBNAMES_DB = '__dbnames'; -var READONLY = 'readonly'; -var READWRITE = 'readwrite'; - -function combine(filter1, filter2) { - return filter1 ? - filter2 ? - function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } : - filter1 : - filter2; -} - -var AnyRange = { - type: 3 , - lower: -Infinity, - lowerOpen: false, - upper: [[]], - upperOpen: false -}; - -function workaroundForUndefinedPrimKey(keyPath) { - return typeof keyPath === "string" && !/\./.test(keyPath) - ? function (obj) { - if (obj[keyPath] === undefined && (keyPath in obj)) { - obj = deepClone(obj); - delete obj[keyPath]; - } - return obj; - } - : function (obj) { return obj; }; -} - -function Entity() { - throw exceptions.Type(); -} - -function cmp(a, b) { - try { - var ta = type(a); - var tb = type(b); - if (ta !== tb) { - if (ta === 'Array') - return 1; - if (tb === 'Array') - return -1; - if (ta === 'binary') - return 1; - if (tb === 'binary') - return -1; - if (ta === 'string') - return 1; - if (tb === 'string') - return -1; - if (ta === 'Date') - return 1; - if (tb !== 'Date') - return NaN; - return -1; - } - switch (ta) { - case 'number': - case 'Date': - case 'string': - return a > b ? 1 : a < b ? -1 : 0; - case 'binary': { - return compareUint8Arrays(getUint8Array(a), getUint8Array(b)); - } - case 'Array': - return compareArrays(a, b); - } - } - catch (_a) { } - return NaN; -} -function compareArrays(a, b) { - var al = a.length; - var bl = b.length; - var l = al < bl ? al : bl; - for (var i = 0; i < l; ++i) { - var res = cmp(a[i], b[i]); - if (res !== 0) - return res; - } - return al === bl ? 0 : al < bl ? -1 : 1; -} -function compareUint8Arrays(a, b) { - var al = a.length; - var bl = b.length; - var l = al < bl ? al : bl; - for (var i = 0; i < l; ++i) { - if (a[i] !== b[i]) - return a[i] < b[i] ? -1 : 1; - } - return al === bl ? 0 : al < bl ? -1 : 1; -} -function type(x) { - var t = typeof x; - if (t !== 'object') - return t; - if (ArrayBuffer.isView(x)) - return 'binary'; - var tsTag = toStringTag(x); - return tsTag === 'ArrayBuffer' ? 'binary' : tsTag; -} -function getUint8Array(a) { - if (a instanceof Uint8Array) - return a; - if (ArrayBuffer.isView(a)) - return new Uint8Array(a.buffer, a.byteOffset, a.byteLength); - return new Uint8Array(a); -} - -var Table = (function () { - function Table() { - } - Table.prototype._trans = function (mode, fn, writeLocked) { - var trans = this._tx || PSD.trans; - var tableName = this.name; - var task = debug && typeof console !== 'undefined' && console.createTask && console.createTask("Dexie: ".concat(mode === 'readonly' ? 'read' : 'write', " ").concat(this.name)); - function checkTableInTransaction(resolve, reject, trans) { - if (!trans.schema[tableName]) - throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); - return fn(trans.idbtrans, trans); - } - var wasRootExec = beginMicroTickScope(); - try { - var p = trans && trans.db._novip === this.db._novip ? - trans === PSD.trans ? - trans._promise(mode, checkTableInTransaction, writeLocked) : - newScope(function () { return trans._promise(mode, checkTableInTransaction, writeLocked); }, { trans: trans, transless: PSD.transless || PSD }) : - tempTransaction(this.db, mode, [this.name], checkTableInTransaction); - if (task) { - p._consoleTask = task; - p = p.catch(function (err) { - console.trace(err); - return rejection(err); - }); - } - return p; - } - finally { - if (wasRootExec) - endMicroTickScope(); - } - }; - Table.prototype.get = function (keyOrCrit, cb) { - var _this = this; - if (keyOrCrit && keyOrCrit.constructor === Object) - return this.where(keyOrCrit).first(cb); - if (keyOrCrit == null) - return rejection(new exceptions.Type("Invalid argument to Table.get()")); - return this._trans('readonly', function (trans) { - return _this.core.get({ trans: trans, key: keyOrCrit }) - .then(function (res) { return _this.hook.reading.fire(res); }); - }).then(cb); - }; - Table.prototype.where = function (indexOrCrit) { - if (typeof indexOrCrit === 'string') - return new this.db.WhereClause(this, indexOrCrit); - if (isArray(indexOrCrit)) - return new this.db.WhereClause(this, "[".concat(indexOrCrit.join('+'), "]")); - var keyPaths = keys(indexOrCrit); - if (keyPaths.length === 1) - return this - .where(keyPaths[0]) - .equals(indexOrCrit[keyPaths[0]]); - var compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(function (ix) { - if (ix.compound && - keyPaths.every(function (keyPath) { return ix.keyPath.indexOf(keyPath) >= 0; })) { - for (var i = 0; i < keyPaths.length; ++i) { - if (keyPaths.indexOf(ix.keyPath[i]) === -1) - return false; - } - return true; - } - return false; - }).sort(function (a, b) { return a.keyPath.length - b.keyPath.length; })[0]; - if (compoundIndex && this.db._maxKey !== maxString) { - var keyPathsInValidOrder = compoundIndex.keyPath.slice(0, keyPaths.length); - return this - .where(keyPathsInValidOrder) - .equals(keyPathsInValidOrder.map(function (kp) { return indexOrCrit[kp]; })); - } - if (!compoundIndex && debug) - console.warn("The query ".concat(JSON.stringify(indexOrCrit), " on ").concat(this.name, " would benefit from a ") + - "compound index [".concat(keyPaths.join('+'), "]")); - var idxByName = this.schema.idxByName; - var idb = this.db._deps.indexedDB; - function equals(a, b) { - return idb.cmp(a, b) === 0; - } - var _a = keyPaths.reduce(function (_a, keyPath) { - var prevIndex = _a[0], prevFilterFn = _a[1]; - var index = idxByName[keyPath]; - var value = indexOrCrit[keyPath]; - return [ - prevIndex || index, - prevIndex || !index ? - combine(prevFilterFn, index && index.multi ? - function (x) { - var prop = getByKeyPath(x, keyPath); - return isArray(prop) && prop.some(function (item) { return equals(value, item); }); - } : function (x) { return equals(value, getByKeyPath(x, keyPath)); }) - : prevFilterFn - ]; - }, [null, null]), idx = _a[0], filterFunction = _a[1]; - return idx ? - this.where(idx.name).equals(indexOrCrit[idx.keyPath]) - .filter(filterFunction) : - compoundIndex ? - this.filter(filterFunction) : - this.where(keyPaths).equals(''); - }; - Table.prototype.filter = function (filterFunction) { - return this.toCollection().and(filterFunction); - }; - Table.prototype.count = function (thenShortcut) { - return this.toCollection().count(thenShortcut); - }; - Table.prototype.offset = function (offset) { - return this.toCollection().offset(offset); - }; - Table.prototype.limit = function (numRows) { - return this.toCollection().limit(numRows); - }; - Table.prototype.each = function (callback) { - return this.toCollection().each(callback); - }; - Table.prototype.toArray = function (thenShortcut) { - return this.toCollection().toArray(thenShortcut); - }; - Table.prototype.toCollection = function () { - return new this.db.Collection(new this.db.WhereClause(this)); - }; - Table.prototype.orderBy = function (index) { - return new this.db.Collection(new this.db.WhereClause(this, isArray(index) ? - "[".concat(index.join('+'), "]") : - index)); - }; - Table.prototype.reverse = function () { - return this.toCollection().reverse(); - }; - Table.prototype.mapToClass = function (constructor) { - var _a = this, db = _a.db, tableName = _a.name; - this.schema.mappedClass = constructor; - if (constructor.prototype instanceof Entity) { - constructor = (function (_super) { - __extends(class_1, _super); - function class_1() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(class_1.prototype, "db", { - get: function () { return db; }, - enumerable: false, - configurable: true - }); - class_1.prototype.table = function () { return tableName; }; - return class_1; - }(constructor)); - } - var inheritedProps = new Set(); - for (var proto = constructor.prototype; proto; proto = getProto(proto)) { - Object.getOwnPropertyNames(proto).forEach(function (propName) { return inheritedProps.add(propName); }); - } - var readHook = function (obj) { - if (!obj) - return obj; - var res = Object.create(constructor.prototype); - for (var m in obj) - if (!inheritedProps.has(m)) - try { - res[m] = obj[m]; - } - catch (_) { } - return res; - }; - if (this.schema.readHook) { - this.hook.reading.unsubscribe(this.schema.readHook); - } - this.schema.readHook = readHook; - this.hook("reading", readHook); - return constructor; - }; - Table.prototype.defineClass = function () { - function Class(content) { - extend(this, content); - } - return this.mapToClass(Class); - }; - Table.prototype.add = function (obj, key) { - var _this = this; - var _a = this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - var objToAdd = obj; - if (keyPath && auto) { - objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); - } - return this._trans('readwrite', function (trans) { - return _this.core.mutate({ trans: trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd] }); - }).then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult; }) - .then(function (lastResult) { - if (keyPath) { - try { - setByKeyPath(obj, keyPath, lastResult); - } - catch (_) { } - } - return lastResult; - }); - }; - Table.prototype.update = function (keyOrObject, modifications) { - if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) { - var key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath); - if (key === undefined) - return rejection(new exceptions.InvalidArgument("Given object does not contain its primary key")); - return this.where(":id").equals(key).modify(modifications); - } - else { - return this.where(":id").equals(keyOrObject).modify(modifications); - } - }; - Table.prototype.put = function (obj, key) { - var _this = this; - var _a = this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - var objToAdd = obj; - if (keyPath && auto) { - objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); - } - return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null }); }) - .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult; }) - .then(function (lastResult) { - if (keyPath) { - try { - setByKeyPath(obj, keyPath, lastResult); - } - catch (_) { } - } - return lastResult; - }); - }; - Table.prototype.delete = function (key) { - var _this = this; - return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'delete', keys: [key] }); }) - .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined; }); - }; - Table.prototype.clear = function () { - var _this = this; - return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'deleteRange', range: AnyRange }); }) - .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined; }); - }; - Table.prototype.bulkGet = function (keys) { - var _this = this; - return this._trans('readonly', function (trans) { - return _this.core.getMany({ - keys: keys, - trans: trans - }).then(function (result) { return result.map(function (res) { return _this.hook.reading.fire(res); }); }); - }); - }; - Table.prototype.bulkAdd = function (objects, keysOrOptions, options) { - var _this = this; - var keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; - options = options || (keys ? undefined : keysOrOptions); - var wantResults = options ? options.allKeys : undefined; - return this._trans('readwrite', function (trans) { - var _a = _this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - if (keyPath && keys) - throw new exceptions.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys"); - if (keys && keys.length !== objects.length) - throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); - var numObjects = objects.length; - var objectsToAdd = keyPath && auto ? - objects.map(workaroundForUndefinedPrimKey(keyPath)) : - objects; - return _this.core.mutate({ trans: trans, type: 'add', keys: keys, values: objectsToAdd, wantResults: wantResults }) - .then(function (_a) { - var numFailures = _a.numFailures, results = _a.results, lastResult = _a.lastResult, failures = _a.failures; - var result = wantResults ? results : lastResult; - if (numFailures === 0) - return result; - throw new BulkError("".concat(_this.name, ".bulkAdd(): ").concat(numFailures, " of ").concat(numObjects, " operations failed"), failures); - }); - }); - }; - Table.prototype.bulkPut = function (objects, keysOrOptions, options) { - var _this = this; - var keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; - options = options || (keys ? undefined : keysOrOptions); - var wantResults = options ? options.allKeys : undefined; - return this._trans('readwrite', function (trans) { - var _a = _this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; - if (keyPath && keys) - throw new exceptions.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys"); - if (keys && keys.length !== objects.length) - throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); - var numObjects = objects.length; - var objectsToPut = keyPath && auto ? - objects.map(workaroundForUndefinedPrimKey(keyPath)) : - objects; - return _this.core.mutate({ trans: trans, type: 'put', keys: keys, values: objectsToPut, wantResults: wantResults }) - .then(function (_a) { - var numFailures = _a.numFailures, results = _a.results, lastResult = _a.lastResult, failures = _a.failures; - var result = wantResults ? results : lastResult; - if (numFailures === 0) - return result; - throw new BulkError("".concat(_this.name, ".bulkPut(): ").concat(numFailures, " of ").concat(numObjects, " operations failed"), failures); - }); - }); - }; - Table.prototype.bulkUpdate = function (keysAndChanges) { - var _this = this; - var coreTable = this.core; - var keys = keysAndChanges.map(function (entry) { return entry.key; }); - var changeSpecs = keysAndChanges.map(function (entry) { return entry.changes; }); - var offsetMap = []; - return this._trans('readwrite', function (trans) { - return coreTable.getMany({ trans: trans, keys: keys, cache: 'clone' }).then(function (objs) { - var resultKeys = []; - var resultObjs = []; - keysAndChanges.forEach(function (_a, idx) { - var key = _a.key, changes = _a.changes; - var obj = objs[idx]; - if (obj) { - for (var _i = 0, _b = Object.keys(changes); _i < _b.length; _i++) { - var keyPath = _b[_i]; - var value = changes[keyPath]; - if (keyPath === _this.schema.primKey.keyPath) { - if (cmp(value, key) !== 0) { - throw new exceptions.Constraint("Cannot update primary key in bulkUpdate()"); - } - } - else { - setByKeyPath(obj, keyPath, value); - } - } - offsetMap.push(idx); - resultKeys.push(key); - resultObjs.push(obj); - } - }); - var numEntries = resultKeys.length; - return coreTable - .mutate({ - trans: trans, - type: 'put', - keys: resultKeys, - values: resultObjs, - updates: { - keys: keys, - changeSpecs: changeSpecs - } - }) - .then(function (_a) { - var numFailures = _a.numFailures, failures = _a.failures; - if (numFailures === 0) - return numEntries; - for (var _i = 0, _b = Object.keys(failures); _i < _b.length; _i++) { - var offset = _b[_i]; - var mappedOffset = offsetMap[Number(offset)]; - if (mappedOffset != null) { - var failure = failures[offset]; - delete failures[offset]; - failures[mappedOffset] = failure; - } - } - throw new BulkError("".concat(_this.name, ".bulkUpdate(): ").concat(numFailures, " of ").concat(numEntries, " operations failed"), failures); - }); - }); - }); - }; - Table.prototype.bulkDelete = function (keys) { - var _this = this; - var numKeys = keys.length; - return this._trans('readwrite', function (trans) { - return _this.core.mutate({ trans: trans, type: 'delete', keys: keys }); - }).then(function (_a) { - var numFailures = _a.numFailures, lastResult = _a.lastResult, failures = _a.failures; - if (numFailures === 0) - return lastResult; - throw new BulkError("".concat(_this.name, ".bulkDelete(): ").concat(numFailures, " of ").concat(numKeys, " operations failed"), failures); - }); - }; - return Table; -}()); - -function Events(ctx) { - var evs = {}; - var rv = function (eventName, subscriber) { - if (subscriber) { - var i = arguments.length, args = new Array(i - 1); - while (--i) - args[i - 1] = arguments[i]; - evs[eventName].subscribe.apply(null, args); - return ctx; - } - else if (typeof (eventName) === 'string') { - return evs[eventName]; - } - }; - rv.addEventType = add; - for (var i = 1, l = arguments.length; i < l; ++i) { - add(arguments[i]); - } - return rv; - function add(eventName, chainFunction, defaultFunction) { - if (typeof eventName === 'object') - return addConfiguredEvents(eventName); - if (!chainFunction) - chainFunction = reverseStoppableEventChain; - if (!defaultFunction) - defaultFunction = nop; - var context = { - subscribers: [], - fire: defaultFunction, - subscribe: function (cb) { - if (context.subscribers.indexOf(cb) === -1) { - context.subscribers.push(cb); - context.fire = chainFunction(context.fire, cb); - } - }, - unsubscribe: function (cb) { - context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; }); - context.fire = context.subscribers.reduce(chainFunction, defaultFunction); - } - }; - evs[eventName] = rv[eventName] = context; - return context; - } - function addConfiguredEvents(cfg) { - keys(cfg).forEach(function (eventName) { - var args = cfg[eventName]; - if (isArray(args)) { - add(eventName, cfg[eventName][0], cfg[eventName][1]); - } - else if (args === 'asap') { - var context = add(eventName, mirror, function fire() { - var i = arguments.length, args = new Array(i); - while (i--) - args[i] = arguments[i]; - context.subscribers.forEach(function (fn) { - asap$1(function fireEvent() { - fn.apply(null, args); - }); - }); - }); - } - else - throw new exceptions.InvalidArgument("Invalid event config"); - }); - } -} - -function makeClassConstructor(prototype, constructor) { - derive(constructor).from({ prototype: prototype }); - return constructor; -} - -function createTableConstructor(db) { - return makeClassConstructor(Table.prototype, function Table(name, tableSchema, trans) { - this.db = db; - this._tx = trans; - this.name = name; - this.schema = tableSchema; - this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, { - "creating": [hookCreatingChain, nop], - "reading": [pureFunctionChain, mirror], - "updating": [hookUpdatingChain, nop], - "deleting": [hookDeletingChain, nop] - }); - }); -} - -function isPlainKeyRange(ctx, ignoreLimitFilter) { - return !(ctx.filter || ctx.algorithm || ctx.or) && - (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter); -} -function addFilter(ctx, fn) { - ctx.filter = combine(ctx.filter, fn); -} -function addReplayFilter(ctx, factory, isLimitFilter) { - var curr = ctx.replayFilter; - ctx.replayFilter = curr ? function () { return combine(curr(), factory()); } : factory; - ctx.justLimit = isLimitFilter && !curr; -} -function addMatchFilter(ctx, fn) { - ctx.isMatch = combine(ctx.isMatch, fn); -} -function getIndexOrStore(ctx, coreSchema) { - if (ctx.isPrimKey) - return coreSchema.primaryKey; - var index = coreSchema.getIndexByKeyPath(ctx.index); - if (!index) - throw new exceptions.Schema("KeyPath " + ctx.index + " on object store " + coreSchema.name + " is not indexed"); - return index; -} -function openCursor(ctx, coreTable, trans) { - var index = getIndexOrStore(ctx, coreTable.schema); - return coreTable.openCursor({ - trans: trans, - values: !ctx.keysOnly, - reverse: ctx.dir === 'prev', - unique: !!ctx.unique, - query: { - index: index, - range: ctx.range - } - }); -} -function iter(ctx, fn, coreTrans, coreTable) { - var filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter; - if (!ctx.or) { - return iterate(openCursor(ctx, coreTable, coreTrans), combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper); - } - else { - var set_1 = {}; - var union = function (item, cursor, advance) { - if (!filter || filter(cursor, advance, function (result) { return cursor.stop(result); }, function (err) { return cursor.fail(err); })) { - var primaryKey = cursor.primaryKey; - var key = '' + primaryKey; - if (key === '[object ArrayBuffer]') - key = '' + new Uint8Array(primaryKey); - if (!hasOwn(set_1, key)) { - set_1[key] = true; - fn(item, cursor, advance); - } - } - }; - return Promise.all([ - ctx.or._iterate(union, coreTrans), - iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper) - ]); - } -} -function iterate(cursorPromise, filter, fn, valueMapper) { - var mappedFn = valueMapper ? function (x, c, a) { return fn(valueMapper(x), c, a); } : fn; - var wrappedFn = wrap(mappedFn); - return cursorPromise.then(function (cursor) { - if (cursor) { - return cursor.start(function () { - var c = function () { return cursor.continue(); }; - if (!filter || filter(cursor, function (advancer) { return c = advancer; }, function (val) { cursor.stop(val); c = nop; }, function (e) { cursor.fail(e); c = nop; })) - wrappedFn(cursor.value, cursor, function (advancer) { return c = advancer; }); - c(); - }); - } - }); -} - -var PropModSymbol = Symbol(); -var PropModification = (function () { - function PropModification(spec) { - Object.assign(this, spec); - } - PropModification.prototype.execute = function (value) { - var _a; - if (this.add !== undefined) { - var term = this.add; - if (isArray(term)) { - return __spreadArray(__spreadArray([], (isArray(value) ? value : []), true), term, true).sort(); - } - if (typeof term === 'number') - return (Number(value) || 0) + term; - if (typeof term === 'bigint') { - try { - return BigInt(value) + term; - } - catch (_b) { - return BigInt(0) + term; - } - } - throw new TypeError("Invalid term ".concat(term)); - } - if (this.remove !== undefined) { - var subtrahend_1 = this.remove; - if (isArray(subtrahend_1)) { - return isArray(value) ? value.filter(function (item) { return !subtrahend_1.includes(item); }).sort() : []; - } - if (typeof subtrahend_1 === 'number') - return Number(value) - subtrahend_1; - if (typeof subtrahend_1 === 'bigint') { - try { - return BigInt(value) - subtrahend_1; - } - catch (_c) { - return BigInt(0) - subtrahend_1; - } - } - throw new TypeError("Invalid subtrahend ".concat(subtrahend_1)); - } - var prefixToReplace = (_a = this.replacePrefix) === null || _a === void 0 ? void 0 : _a[0]; - if (prefixToReplace && typeof value === 'string' && value.startsWith(prefixToReplace)) { - return this.replacePrefix[1] + value.substring(prefixToReplace.length); - } - return value; - }; - return PropModification; -}()); - -var Collection = (function () { - function Collection() { - } - Collection.prototype._read = function (fn, cb) { - var ctx = this._ctx; - return ctx.error ? - ctx.table._trans(null, rejection.bind(null, ctx.error)) : - ctx.table._trans('readonly', fn).then(cb); - }; - Collection.prototype._write = function (fn) { - var ctx = this._ctx; - return ctx.error ? - ctx.table._trans(null, rejection.bind(null, ctx.error)) : - ctx.table._trans('readwrite', fn, "locked"); - }; - Collection.prototype._addAlgorithm = function (fn) { - var ctx = this._ctx; - ctx.algorithm = combine(ctx.algorithm, fn); - }; - Collection.prototype._iterate = function (fn, coreTrans) { - return iter(this._ctx, fn, coreTrans, this._ctx.table.core); - }; - Collection.prototype.clone = function (props) { - var rv = Object.create(this.constructor.prototype), ctx = Object.create(this._ctx); - if (props) - extend(ctx, props); - rv._ctx = ctx; - return rv; - }; - Collection.prototype.raw = function () { - this._ctx.valueMapper = null; - return this; - }; - Collection.prototype.each = function (fn) { - var ctx = this._ctx; - return this._read(function (trans) { return iter(ctx, fn, trans, ctx.table.core); }); - }; - Collection.prototype.count = function (cb) { - var _this = this; - return this._read(function (trans) { - var ctx = _this._ctx; - var coreTable = ctx.table.core; - if (isPlainKeyRange(ctx, true)) { - return coreTable.count({ - trans: trans, - query: { - index: getIndexOrStore(ctx, coreTable.schema), - range: ctx.range - } - }).then(function (count) { return Math.min(count, ctx.limit); }); - } - else { - var count = 0; - return iter(ctx, function () { ++count; return false; }, trans, coreTable) - .then(function () { return count; }); - } - }).then(cb); - }; - Collection.prototype.sortBy = function (keyPath, cb) { - var parts = keyPath.split('.').reverse(), lastPart = parts[0], lastIndex = parts.length - 1; - function getval(obj, i) { - if (i) - return getval(obj[parts[i]], i - 1); - return obj[lastPart]; - } - var order = this._ctx.dir === "next" ? 1 : -1; - function sorter(a, b) { - var aVal = getval(a, lastIndex), bVal = getval(b, lastIndex); - return aVal < bVal ? -order : aVal > bVal ? order : 0; - } - return this.toArray(function (a) { - return a.sort(sorter); - }).then(cb); - }; - Collection.prototype.toArray = function (cb) { - var _this = this; - return this._read(function (trans) { - var ctx = _this._ctx; - if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { - var valueMapper_1 = ctx.valueMapper; - var index = getIndexOrStore(ctx, ctx.table.core.schema); - return ctx.table.core.query({ - trans: trans, - limit: ctx.limit, - values: true, - query: { - index: index, - range: ctx.range - } - }).then(function (_a) { - var result = _a.result; - return valueMapper_1 ? result.map(valueMapper_1) : result; - }); - } - else { - var a_1 = []; - return iter(ctx, function (item) { return a_1.push(item); }, trans, ctx.table.core).then(function () { return a_1; }); - } - }, cb); - }; - Collection.prototype.offset = function (offset) { - var ctx = this._ctx; - if (offset <= 0) - return this; - ctx.offset += offset; - if (isPlainKeyRange(ctx)) { - addReplayFilter(ctx, function () { - var offsetLeft = offset; - return function (cursor, advance) { - if (offsetLeft === 0) - return true; - if (offsetLeft === 1) { - --offsetLeft; - return false; - } - advance(function () { - cursor.advance(offsetLeft); - offsetLeft = 0; - }); - return false; - }; - }); - } - else { - addReplayFilter(ctx, function () { - var offsetLeft = offset; - return function () { return (--offsetLeft < 0); }; - }); - } - return this; - }; - Collection.prototype.limit = function (numRows) { - this._ctx.limit = Math.min(this._ctx.limit, numRows); - addReplayFilter(this._ctx, function () { - var rowsLeft = numRows; - return function (cursor, advance, resolve) { - if (--rowsLeft <= 0) - advance(resolve); - return rowsLeft >= 0; - }; - }, true); - return this; - }; - Collection.prototype.until = function (filterFunction, bIncludeStopEntry) { - addFilter(this._ctx, function (cursor, advance, resolve) { - if (filterFunction(cursor.value)) { - advance(resolve); - return bIncludeStopEntry; - } - else { - return true; - } - }); - return this; - }; - Collection.prototype.first = function (cb) { - return this.limit(1).toArray(function (a) { return a[0]; }).then(cb); - }; - Collection.prototype.last = function (cb) { - return this.reverse().first(cb); - }; - Collection.prototype.filter = function (filterFunction) { - addFilter(this._ctx, function (cursor) { - return filterFunction(cursor.value); - }); - addMatchFilter(this._ctx, filterFunction); - return this; - }; - Collection.prototype.and = function (filter) { - return this.filter(filter); - }; - Collection.prototype.or = function (indexName) { - return new this.db.WhereClause(this._ctx.table, indexName, this); - }; - Collection.prototype.reverse = function () { - this._ctx.dir = (this._ctx.dir === "prev" ? "next" : "prev"); - if (this._ondirectionchange) - this._ondirectionchange(this._ctx.dir); - return this; - }; - Collection.prototype.desc = function () { - return this.reverse(); - }; - Collection.prototype.eachKey = function (cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - return this.each(function (val, cursor) { cb(cursor.key, cursor); }); - }; - Collection.prototype.eachUniqueKey = function (cb) { - this._ctx.unique = "unique"; - return this.eachKey(cb); - }; - Collection.prototype.eachPrimaryKey = function (cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); }); - }; - Collection.prototype.keys = function (cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - var a = []; - return this.each(function (item, cursor) { - a.push(cursor.key); - }).then(function () { - return a; - }).then(cb); - }; - Collection.prototype.primaryKeys = function (cb) { - var ctx = this._ctx; - if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { - return this._read(function (trans) { - var index = getIndexOrStore(ctx, ctx.table.core.schema); - return ctx.table.core.query({ - trans: trans, - values: false, - limit: ctx.limit, - query: { - index: index, - range: ctx.range - } - }); - }).then(function (_a) { - var result = _a.result; - return result; - }).then(cb); - } - ctx.keysOnly = !ctx.isMatch; - var a = []; - return this.each(function (item, cursor) { - a.push(cursor.primaryKey); - }).then(function () { - return a; - }).then(cb); - }; - Collection.prototype.uniqueKeys = function (cb) { - this._ctx.unique = "unique"; - return this.keys(cb); - }; - Collection.prototype.firstKey = function (cb) { - return this.limit(1).keys(function (a) { return a[0]; }).then(cb); - }; - Collection.prototype.lastKey = function (cb) { - return this.reverse().firstKey(cb); - }; - Collection.prototype.distinct = function () { - var ctx = this._ctx, idx = ctx.index && ctx.table.schema.idxByName[ctx.index]; - if (!idx || !idx.multi) - return this; - var set = {}; - addFilter(this._ctx, function (cursor) { - var strKey = cursor.primaryKey.toString(); - var found = hasOwn(set, strKey); - set[strKey] = true; - return !found; - }); - return this; - }; - Collection.prototype.modify = function (changes) { - var _this = this; - var ctx = this._ctx; - return this._write(function (trans) { - var modifyer; - if (typeof changes === 'function') { - modifyer = changes; - } - else { - var keyPaths = keys(changes); - var numKeys = keyPaths.length; - modifyer = function (item) { - var anythingModified = false; - for (var i = 0; i < numKeys; ++i) { - var keyPath = keyPaths[i]; - var val = changes[keyPath]; - var origVal = getByKeyPath(item, keyPath); - if (val instanceof PropModification) { - setByKeyPath(item, keyPath, val.execute(origVal)); - anythingModified = true; - } - else if (origVal !== val) { - setByKeyPath(item, keyPath, val); - anythingModified = true; - } - } - return anythingModified; - }; - } - var coreTable = ctx.table.core; - var _a = coreTable.schema.primaryKey, outbound = _a.outbound, extractKey = _a.extractKey; - var limit = _this.db._options.modifyChunkSize || 200; - var totalFailures = []; - var successCount = 0; - var failedKeys = []; - var applyMutateResult = function (expectedCount, res) { - var failures = res.failures, numFailures = res.numFailures; - successCount += expectedCount - numFailures; - for (var _i = 0, _a = keys(failures); _i < _a.length; _i++) { - var pos = _a[_i]; - totalFailures.push(failures[pos]); - } - }; - return _this.clone().primaryKeys().then(function (keys) { - var criteria = isPlainKeyRange(ctx) && - ctx.limit === Infinity && - (typeof changes !== 'function' || changes === deleteCallback) && { - index: ctx.index, - range: ctx.range - }; - var nextChunk = function (offset) { - var count = Math.min(limit, keys.length - offset); - return coreTable.getMany({ - trans: trans, - keys: keys.slice(offset, offset + count), - cache: "immutable" - }).then(function (values) { - var addValues = []; - var putValues = []; - var putKeys = outbound ? [] : null; - var deleteKeys = []; - for (var i = 0; i < count; ++i) { - var origValue = values[i]; - var ctx_1 = { - value: deepClone(origValue), - primKey: keys[offset + i] - }; - if (modifyer.call(ctx_1, ctx_1.value, ctx_1) !== false) { - if (ctx_1.value == null) { - deleteKeys.push(keys[offset + i]); - } - else if (!outbound && cmp(extractKey(origValue), extractKey(ctx_1.value)) !== 0) { - deleteKeys.push(keys[offset + i]); - addValues.push(ctx_1.value); - } - else { - putValues.push(ctx_1.value); - if (outbound) - putKeys.push(keys[offset + i]); - } - } - } - return Promise.resolve(addValues.length > 0 && - coreTable.mutate({ trans: trans, type: 'add', values: addValues }) - .then(function (res) { - for (var pos in res.failures) { - deleteKeys.splice(parseInt(pos), 1); - } - applyMutateResult(addValues.length, res); - })).then(function () { return (putValues.length > 0 || (criteria && typeof changes === 'object')) && - coreTable.mutate({ - trans: trans, - type: 'put', - keys: putKeys, - values: putValues, - criteria: criteria, - changeSpec: typeof changes !== 'function' - && changes, - isAdditionalChunk: offset > 0 - }).then(function (res) { return applyMutateResult(putValues.length, res); }); }).then(function () { return (deleteKeys.length > 0 || (criteria && changes === deleteCallback)) && - coreTable.mutate({ - trans: trans, - type: 'delete', - keys: deleteKeys, - criteria: criteria, - isAdditionalChunk: offset > 0 - }).then(function (res) { return applyMutateResult(deleteKeys.length, res); }); }).then(function () { - return keys.length > offset + count && nextChunk(offset + limit); - }); - }); - }; - return nextChunk(0).then(function () { - if (totalFailures.length > 0) - throw new ModifyError("Error modifying one or more objects", totalFailures, successCount, failedKeys); - return keys.length; - }); - }); - }); - }; - Collection.prototype.delete = function () { - var ctx = this._ctx, range = ctx.range; - if (isPlainKeyRange(ctx) && - (ctx.isPrimKey || range.type === 3 )) - { - return this._write(function (trans) { - var primaryKey = ctx.table.core.schema.primaryKey; - var coreRange = range; - return ctx.table.core.count({ trans: trans, query: { index: primaryKey, range: coreRange } }).then(function (count) { - return ctx.table.core.mutate({ trans: trans, type: 'deleteRange', range: coreRange }) - .then(function (_a) { - var failures = _a.failures; _a.lastResult; _a.results; var numFailures = _a.numFailures; - if (numFailures) - throw new ModifyError("Could not delete some values", Object.keys(failures).map(function (pos) { return failures[pos]; }), count - numFailures); - return count - numFailures; - }); - }); - }); - } - return this.modify(deleteCallback); - }; - return Collection; -}()); -var deleteCallback = function (value, ctx) { return ctx.value = null; }; - -function createCollectionConstructor(db) { - return makeClassConstructor(Collection.prototype, function Collection(whereClause, keyRangeGenerator) { - this.db = db; - var keyRange = AnyRange, error = null; - if (keyRangeGenerator) - try { - keyRange = keyRangeGenerator(); - } - catch (ex) { - error = ex; - } - var whereCtx = whereClause._ctx; - var table = whereCtx.table; - var readingHook = table.hook.reading.fire; - this._ctx = { - table: table, - index: whereCtx.index, - isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)), - range: keyRange, - keysOnly: false, - dir: "next", - unique: "", - algorithm: null, - filter: null, - replayFilter: null, - justLimit: true, - isMatch: null, - offset: 0, - limit: Infinity, - error: error, - or: whereCtx.or, - valueMapper: readingHook !== mirror ? readingHook : null - }; - }); -} - -function simpleCompare(a, b) { - return a < b ? -1 : a === b ? 0 : 1; -} -function simpleCompareReverse(a, b) { - return a > b ? -1 : a === b ? 0 : 1; -} - -function fail(collectionOrWhereClause, err, T) { - var collection = collectionOrWhereClause instanceof WhereClause ? - new collectionOrWhereClause.Collection(collectionOrWhereClause) : - collectionOrWhereClause; - collection._ctx.error = T ? new T(err) : new TypeError(err); - return collection; -} -function emptyCollection(whereClause) { - return new whereClause.Collection(whereClause, function () { return rangeEqual(""); }).limit(0); -} -function upperFactory(dir) { - return dir === "next" ? - function (s) { return s.toUpperCase(); } : - function (s) { return s.toLowerCase(); }; -} -function lowerFactory(dir) { - return dir === "next" ? - function (s) { return s.toLowerCase(); } : - function (s) { return s.toUpperCase(); }; -} -function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) { - var length = Math.min(key.length, lowerNeedle.length); - var llp = -1; - for (var i = 0; i < length; ++i) { - var lwrKeyChar = lowerKey[i]; - if (lwrKeyChar !== lowerNeedle[i]) { - if (cmp(key[i], upperNeedle[i]) < 0) - return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1); - if (cmp(key[i], lowerNeedle[i]) < 0) - return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1); - if (llp >= 0) - return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1); - return null; - } - if (cmp(key[i], lwrKeyChar) < 0) - llp = i; - } - if (length < lowerNeedle.length && dir === "next") - return key + upperNeedle.substr(key.length); - if (length < key.length && dir === "prev") - return key.substr(0, upperNeedle.length); - return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1)); -} -function addIgnoreCaseAlgorithm(whereClause, match, needles, suffix) { - var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix, needlesLen = needles.length; - if (!needles.every(function (s) { return typeof s === 'string'; })) { - return fail(whereClause, STRING_EXPECTED); - } - function initDirection(dir) { - upper = upperFactory(dir); - lower = lowerFactory(dir); - compare = (dir === "next" ? simpleCompare : simpleCompareReverse); - var needleBounds = needles.map(function (needle) { - return { lower: lower(needle), upper: upper(needle) }; - }).sort(function (a, b) { - return compare(a.lower, b.lower); - }); - upperNeedles = needleBounds.map(function (nb) { return nb.upper; }); - lowerNeedles = needleBounds.map(function (nb) { return nb.lower; }); - direction = dir; - nextKeySuffix = (dir === "next" ? "" : suffix); - } - initDirection("next"); - var c = new whereClause.Collection(whereClause, function () { return createRange(upperNeedles[0], lowerNeedles[needlesLen - 1] + suffix); }); - c._ondirectionchange = function (direction) { - initDirection(direction); - }; - var firstPossibleNeedle = 0; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - if (typeof key !== 'string') - return false; - var lowerKey = lower(key); - if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) { - return true; - } - else { - var lowestPossibleCasing = null; - for (var i = firstPossibleNeedle; i < needlesLen; ++i) { - var casing = nextCasing(key, lowerKey, upperNeedles[i], lowerNeedles[i], compare, direction); - if (casing === null && lowestPossibleCasing === null) - firstPossibleNeedle = i + 1; - else if (lowestPossibleCasing === null || compare(lowestPossibleCasing, casing) > 0) { - lowestPossibleCasing = casing; - } - } - if (lowestPossibleCasing !== null) { - advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); }); - } - else { - advance(resolve); - } - return false; - } - }); - return c; -} -function createRange(lower, upper, lowerOpen, upperOpen) { - return { - type: 2 , - lower: lower, - upper: upper, - lowerOpen: lowerOpen, - upperOpen: upperOpen - }; -} -function rangeEqual(value) { - return { - type: 1 , - lower: value, - upper: value - }; -} - -var WhereClause = (function () { - function WhereClause() { - } - Object.defineProperty(WhereClause.prototype, "Collection", { - get: function () { - return this._ctx.table.db.Collection; - }, - enumerable: false, - configurable: true - }); - WhereClause.prototype.between = function (lower, upper, includeLower, includeUpper) { - includeLower = includeLower !== false; - includeUpper = includeUpper === true; - try { - if ((this._cmp(lower, upper) > 0) || - (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper))) - return emptyCollection(this); - return new this.Collection(this, function () { return createRange(lower, upper, !includeLower, !includeUpper); }); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - }; - WhereClause.prototype.equals = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return rangeEqual(value); }); - }; - WhereClause.prototype.above = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(value, undefined, true); }); - }; - WhereClause.prototype.aboveOrEqual = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(value, undefined, false); }); - }; - WhereClause.prototype.below = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(undefined, value, false, true); }); - }; - WhereClause.prototype.belowOrEqual = function (value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, function () { return createRange(undefined, value); }); - }; - WhereClause.prototype.startsWith = function (str) { - if (typeof str !== 'string') - return fail(this, STRING_EXPECTED); - return this.between(str, str + maxString, true, true); - }; - WhereClause.prototype.startsWithIgnoreCase = function (str) { - if (str === "") - return this.startsWith(str); - return addIgnoreCaseAlgorithm(this, function (x, a) { return x.indexOf(a[0]) === 0; }, [str], maxString); - }; - WhereClause.prototype.equalsIgnoreCase = function (str) { - return addIgnoreCaseAlgorithm(this, function (x, a) { return x === a[0]; }, [str], ""); - }; - WhereClause.prototype.anyOfIgnoreCase = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return emptyCollection(this); - return addIgnoreCaseAlgorithm(this, function (x, a) { return a.indexOf(x) !== -1; }, set, ""); - }; - WhereClause.prototype.startsWithAnyOfIgnoreCase = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return emptyCollection(this); - return addIgnoreCaseAlgorithm(this, function (x, a) { return a.some(function (n) { return x.indexOf(n) === 0; }); }, set, maxString); - }; - WhereClause.prototype.anyOf = function () { - var _this = this; - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - var compare = this._cmp; - try { - set.sort(compare); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - if (set.length === 0) - return emptyCollection(this); - var c = new this.Collection(this, function () { return createRange(set[0], set[set.length - 1]); }); - c._ondirectionchange = function (direction) { - compare = (direction === "next" ? - _this._ascending : - _this._descending); - set.sort(compare); - }; - var i = 0; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - while (compare(key, set[i]) > 0) { - ++i; - if (i === set.length) { - advance(resolve); - return false; - } - } - if (compare(key, set[i]) === 0) { - return true; - } - else { - advance(function () { cursor.continue(set[i]); }); - return false; - } - }); - return c; - }; - WhereClause.prototype.notEqual = function (value) { - return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false }); - }; - WhereClause.prototype.noneOf = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return new this.Collection(this); - try { - set.sort(this._ascending); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - var ranges = set.reduce(function (res, val) { return res ? - res.concat([[res[res.length - 1][1], val]]) : - [[minKey, val]]; }, null); - ranges.push([set[set.length - 1], this.db._maxKey]); - return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false }); - }; - WhereClause.prototype.inAnyRange = function (ranges, options) { - var _this = this; - var cmp = this._cmp, ascending = this._ascending, descending = this._descending, min = this._min, max = this._max; - if (ranges.length === 0) - return emptyCollection(this); - if (!ranges.every(function (range) { - return range[0] !== undefined && - range[1] !== undefined && - ascending(range[0], range[1]) <= 0; - })) { - return fail(this, "First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower", exceptions.InvalidArgument); - } - var includeLowers = !options || options.includeLowers !== false; - var includeUppers = options && options.includeUppers === true; - function addRange(ranges, newRange) { - var i = 0, l = ranges.length; - for (; i < l; ++i) { - var range = ranges[i]; - if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) { - range[0] = min(range[0], newRange[0]); - range[1] = max(range[1], newRange[1]); - break; - } - } - if (i === l) - ranges.push(newRange); - return ranges; - } - var sortDirection = ascending; - function rangeSorter(a, b) { return sortDirection(a[0], b[0]); } - var set; - try { - set = ranges.reduce(addRange, []); - set.sort(rangeSorter); - } - catch (ex) { - return fail(this, INVALID_KEY_ARGUMENT); - } - var rangePos = 0; - var keyIsBeyondCurrentEntry = includeUppers ? - function (key) { return ascending(key, set[rangePos][1]) > 0; } : - function (key) { return ascending(key, set[rangePos][1]) >= 0; }; - var keyIsBeforeCurrentEntry = includeLowers ? - function (key) { return descending(key, set[rangePos][0]) > 0; } : - function (key) { return descending(key, set[rangePos][0]) >= 0; }; - function keyWithinCurrentRange(key) { - return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key); - } - var checkKey = keyIsBeyondCurrentEntry; - var c = new this.Collection(this, function () { return createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers); }); - c._ondirectionchange = function (direction) { - if (direction === "next") { - checkKey = keyIsBeyondCurrentEntry; - sortDirection = ascending; - } - else { - checkKey = keyIsBeforeCurrentEntry; - sortDirection = descending; - } - set.sort(rangeSorter); - }; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - while (checkKey(key)) { - ++rangePos; - if (rangePos === set.length) { - advance(resolve); - return false; - } - } - if (keyWithinCurrentRange(key)) { - return true; - } - else if (_this._cmp(key, set[rangePos][1]) === 0 || _this._cmp(key, set[rangePos][0]) === 0) { - return false; - } - else { - advance(function () { - if (sortDirection === ascending) - cursor.continue(set[rangePos][0]); - else - cursor.continue(set[rangePos][1]); - }); - return false; - } - }); - return c; - }; - WhereClause.prototype.startsWithAnyOf = function () { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (!set.every(function (s) { return typeof s === 'string'; })) { - return fail(this, "startsWithAnyOf() only works with strings"); - } - if (set.length === 0) - return emptyCollection(this); - return this.inAnyRange(set.map(function (str) { return [str, str + maxString]; })); - }; - return WhereClause; -}()); - -function createWhereClauseConstructor(db) { - return makeClassConstructor(WhereClause.prototype, function WhereClause(table, index, orCollection) { - this.db = db; - this._ctx = { - table: table, - index: index === ":id" ? null : index, - or: orCollection - }; - this._cmp = this._ascending = cmp; - this._descending = function (a, b) { return cmp(b, a); }; - this._max = function (a, b) { return cmp(a, b) > 0 ? a : b; }; - this._min = function (a, b) { return cmp(a, b) < 0 ? a : b; }; - this._IDBKeyRange = db._deps.IDBKeyRange; - if (!this._IDBKeyRange) - throw new exceptions.MissingAPI(); - }); -} - -function eventRejectHandler(reject) { - return wrap(function (event) { - preventDefault(event); - reject(event.target.error); - return false; - }); -} -function preventDefault(event) { - if (event.stopPropagation) - event.stopPropagation(); - if (event.preventDefault) - event.preventDefault(); -} - -var DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated'; -var STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1'; -var globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME); - -var Transaction = (function () { - function Transaction() { - } - Transaction.prototype._lock = function () { - assert(!PSD.global); - ++this._reculock; - if (this._reculock === 1 && !PSD.global) - PSD.lockOwnerFor = this; - return this; - }; - Transaction.prototype._unlock = function () { - assert(!PSD.global); - if (--this._reculock === 0) { - if (!PSD.global) - PSD.lockOwnerFor = null; - while (this._blockedFuncs.length > 0 && !this._locked()) { - var fnAndPSD = this._blockedFuncs.shift(); - try { - usePSD(fnAndPSD[1], fnAndPSD[0]); - } - catch (e) { } - } - } - return this; - }; - Transaction.prototype._locked = function () { - return this._reculock && PSD.lockOwnerFor !== this; - }; - Transaction.prototype.create = function (idbtrans) { - var _this = this; - if (!this.mode) - return this; - var idbdb = this.db.idbdb; - var dbOpenError = this.db._state.dbOpenError; - assert(!this.idbtrans); - if (!idbtrans && !idbdb) { - switch (dbOpenError && dbOpenError.name) { - case "DatabaseClosedError": - throw new exceptions.DatabaseClosed(dbOpenError); - case "MissingAPIError": - throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError); - default: - throw new exceptions.OpenFailed(dbOpenError); - } - } - if (!this.active) - throw new exceptions.TransactionInactive(); - assert(this._completion._state === null); - idbtrans = this.idbtrans = idbtrans || - (this.db.core - ? this.db.core.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability }) - : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })); - idbtrans.onerror = wrap(function (ev) { - preventDefault(ev); - _this._reject(idbtrans.error); - }); - idbtrans.onabort = wrap(function (ev) { - preventDefault(ev); - _this.active && _this._reject(new exceptions.Abort(idbtrans.error)); - _this.active = false; - _this.on("abort").fire(ev); - }); - idbtrans.oncomplete = wrap(function () { - _this.active = false; - _this._resolve(); - if ('mutatedParts' in idbtrans) { - globalEvents.storagemutated.fire(idbtrans["mutatedParts"]); - } - }); - return this; - }; - Transaction.prototype._promise = function (mode, fn, bWriteLock) { - var _this = this; - if (mode === 'readwrite' && this.mode !== 'readwrite') - return rejection(new exceptions.ReadOnly("Transaction is readonly")); - if (!this.active) - return rejection(new exceptions.TransactionInactive()); - if (this._locked()) { - return new DexiePromise(function (resolve, reject) { - _this._blockedFuncs.push([function () { - _this._promise(mode, fn, bWriteLock).then(resolve, reject); - }, PSD]); - }); - } - else if (bWriteLock) { - return newScope(function () { - var p = new DexiePromise(function (resolve, reject) { - _this._lock(); - var rv = fn(resolve, reject, _this); - if (rv && rv.then) - rv.then(resolve, reject); - }); - p.finally(function () { return _this._unlock(); }); - p._lib = true; - return p; - }); - } - else { - var p = new DexiePromise(function (resolve, reject) { - var rv = fn(resolve, reject, _this); - if (rv && rv.then) - rv.then(resolve, reject); - }); - p._lib = true; - return p; - } - }; - Transaction.prototype._root = function () { - return this.parent ? this.parent._root() : this; - }; - Transaction.prototype.waitFor = function (promiseLike) { - var root = this._root(); - var promise = DexiePromise.resolve(promiseLike); - if (root._waitingFor) { - root._waitingFor = root._waitingFor.then(function () { return promise; }); - } - else { - root._waitingFor = promise; - root._waitingQueue = []; - var store = root.idbtrans.objectStore(root.storeNames[0]); - (function spin() { - ++root._spinCount; - while (root._waitingQueue.length) - (root._waitingQueue.shift())(); - if (root._waitingFor) - store.get(-Infinity).onsuccess = spin; - }()); - } - var currentWaitPromise = root._waitingFor; - return new DexiePromise(function (resolve, reject) { - promise.then(function (res) { return root._waitingQueue.push(wrap(resolve.bind(null, res))); }, function (err) { return root._waitingQueue.push(wrap(reject.bind(null, err))); }).finally(function () { - if (root._waitingFor === currentWaitPromise) { - root._waitingFor = null; - } - }); - }); - }; - Transaction.prototype.abort = function () { - if (this.active) { - this.active = false; - if (this.idbtrans) - this.idbtrans.abort(); - this._reject(new exceptions.Abort()); - } - }; - Transaction.prototype.table = function (tableName) { - var memoizedTables = (this._memoizedTables || (this._memoizedTables = {})); - if (hasOwn(memoizedTables, tableName)) - return memoizedTables[tableName]; - var tableSchema = this.schema[tableName]; - if (!tableSchema) { - throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); - } - var transactionBoundTable = new this.db.Table(tableName, tableSchema, this); - transactionBoundTable.core = this.db.core.table(tableName); - memoizedTables[tableName] = transactionBoundTable; - return transactionBoundTable; - }; - return Transaction; -}()); - -function createTransactionConstructor(db) { - return makeClassConstructor(Transaction.prototype, function Transaction(mode, storeNames, dbschema, chromeTransactionDurability, parent) { - var _this = this; - this.db = db; - this.mode = mode; - this.storeNames = storeNames; - this.schema = dbschema; - this.chromeTransactionDurability = chromeTransactionDurability; - this.idbtrans = null; - this.on = Events(this, "complete", "error", "abort"); - this.parent = parent || null; - this.active = true; - this._reculock = 0; - this._blockedFuncs = []; - this._resolve = null; - this._reject = null; - this._waitingFor = null; - this._waitingQueue = null; - this._spinCount = 0; - this._completion = new DexiePromise(function (resolve, reject) { - _this._resolve = resolve; - _this._reject = reject; - }); - this._completion.then(function () { - _this.active = false; - _this.on.complete.fire(); - }, function (e) { - var wasActive = _this.active; - _this.active = false; - _this.on.error.fire(e); - _this.parent ? - _this.parent._reject(e) : - wasActive && _this.idbtrans && _this.idbtrans.abort(); - return rejection(e); - }); - }); -} - -function createIndexSpec(name, keyPath, unique, multi, auto, compound, isPrimKey) { - return { - name: name, - keyPath: keyPath, - unique: unique, - multi: multi, - auto: auto, - compound: compound, - src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? "++" : "") + nameFromKeyPath(keyPath) - }; -} -function nameFromKeyPath(keyPath) { - return typeof keyPath === 'string' ? - keyPath : - keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : ""; -} - -function createTableSchema(name, primKey, indexes) { - return { - name: name, - primKey: primKey, - indexes: indexes, - mappedClass: null, - idxByName: arrayToObject(indexes, function (index) { return [index.name, index]; }) - }; -} - -function safariMultiStoreFix(storeNames) { - return storeNames.length === 1 ? storeNames[0] : storeNames; -} -var getMaxKey = function (IdbKeyRange) { - try { - IdbKeyRange.only([[]]); - getMaxKey = function () { return [[]]; }; - return [[]]; - } - catch (e) { - getMaxKey = function () { return maxString; }; - return maxString; - } -}; - -function getKeyExtractor(keyPath) { - if (keyPath == null) { - return function () { return undefined; }; - } - else if (typeof keyPath === 'string') { - return getSinglePathKeyExtractor(keyPath); - } - else { - return function (obj) { return getByKeyPath(obj, keyPath); }; - } -} -function getSinglePathKeyExtractor(keyPath) { - var split = keyPath.split('.'); - if (split.length === 1) { - return function (obj) { return obj[keyPath]; }; - } - else { - return function (obj) { return getByKeyPath(obj, keyPath); }; - } -} - -function arrayify(arrayLike) { - return [].slice.call(arrayLike); -} -var _id_counter = 0; -function getKeyPathAlias(keyPath) { - return keyPath == null ? - ":id" : - typeof keyPath === 'string' ? - keyPath : - "[".concat(keyPath.join('+'), "]"); -} -function createDBCore(db, IdbKeyRange, tmpTrans) { - function extractSchema(db, trans) { - var tables = arrayify(db.objectStoreNames); - return { - schema: { - name: db.name, - tables: tables.map(function (table) { return trans.objectStore(table); }).map(function (store) { - var keyPath = store.keyPath, autoIncrement = store.autoIncrement; - var compound = isArray(keyPath); - var outbound = keyPath == null; - var indexByKeyPath = {}; - var result = { - name: store.name, - primaryKey: { - name: null, - isPrimaryKey: true, - outbound: outbound, - compound: compound, - keyPath: keyPath, - autoIncrement: autoIncrement, - unique: true, - extractKey: getKeyExtractor(keyPath) - }, - indexes: arrayify(store.indexNames).map(function (indexName) { return store.index(indexName); }) - .map(function (index) { - var name = index.name, unique = index.unique, multiEntry = index.multiEntry, keyPath = index.keyPath; - var compound = isArray(keyPath); - var result = { - name: name, - compound: compound, - keyPath: keyPath, - unique: unique, - multiEntry: multiEntry, - extractKey: getKeyExtractor(keyPath) - }; - indexByKeyPath[getKeyPathAlias(keyPath)] = result; - return result; - }), - getIndexByKeyPath: function (keyPath) { return indexByKeyPath[getKeyPathAlias(keyPath)]; } - }; - indexByKeyPath[":id"] = result.primaryKey; - if (keyPath != null) { - indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey; - } - return result; - }) - }, - hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) && - !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && - !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && - [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) - }; - } - function makeIDBKeyRange(range) { - if (range.type === 3 ) - return null; - if (range.type === 4 ) - throw new Error("Cannot convert never type to IDBKeyRange"); - var lower = range.lower, upper = range.upper, lowerOpen = range.lowerOpen, upperOpen = range.upperOpen; - var idbRange = lower === undefined ? - upper === undefined ? - null : - IdbKeyRange.upperBound(upper, !!upperOpen) : - upper === undefined ? - IdbKeyRange.lowerBound(lower, !!lowerOpen) : - IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen); - return idbRange; - } - function createDbCoreTable(tableSchema) { - var tableName = tableSchema.name; - function mutate(_a) { - var trans = _a.trans, type = _a.type, keys = _a.keys, values = _a.values, range = _a.range; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var store = trans.objectStore(tableName); - var outbound = store.keyPath == null; - var isAddOrPut = type === "put" || type === "add"; - if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange') - throw new Error("Invalid operation type: " + type); - var length = (keys || values || { length: 1 }).length; - if (keys && values && keys.length !== values.length) { - throw new Error("Given keys array must have same length as given values array."); - } - if (length === 0) - return resolve({ numFailures: 0, failures: {}, results: [], lastResult: undefined }); - var req; - var reqs = []; - var failures = []; - var numFailures = 0; - var errorHandler = function (event) { - ++numFailures; - preventDefault(event); - }; - if (type === 'deleteRange') { - if (range.type === 4 ) - return resolve({ numFailures: numFailures, failures: failures, results: [], lastResult: undefined }); - if (range.type === 3 ) - reqs.push(req = store.clear()); - else - reqs.push(req = store.delete(makeIDBKeyRange(range))); - } - else { - var _a = isAddOrPut ? - outbound ? - [values, keys] : - [values, null] : - [keys, null], args1 = _a[0], args2 = _a[1]; - if (isAddOrPut) { - for (var i = 0; i < length; ++i) { - reqs.push(req = (args2 && args2[i] !== undefined ? - store[type](args1[i], args2[i]) : - store[type](args1[i]))); - req.onerror = errorHandler; - } - } - else { - for (var i = 0; i < length; ++i) { - reqs.push(req = store[type](args1[i])); - req.onerror = errorHandler; - } - } - } - var done = function (event) { - var lastResult = event.target.result; - reqs.forEach(function (req, i) { return req.error != null && (failures[i] = req.error); }); - resolve({ - numFailures: numFailures, - failures: failures, - results: type === "delete" ? keys : reqs.map(function (req) { return req.result; }), - lastResult: lastResult - }); - }; - req.onerror = function (event) { - errorHandler(event); - done(event); - }; - req.onsuccess = done; - }); - } - function openCursor(_a) { - var trans = _a.trans, values = _a.values, query = _a.query, reverse = _a.reverse, unique = _a.unique; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var index = query.index, range = query.range; - var store = trans.objectStore(tableName); - var source = index.isPrimaryKey ? - store : - store.index(index.name); - var direction = reverse ? - unique ? - "prevunique" : - "prev" : - unique ? - "nextunique" : - "next"; - var req = values || !('openKeyCursor' in source) ? - source.openCursor(makeIDBKeyRange(range), direction) : - source.openKeyCursor(makeIDBKeyRange(range), direction); - req.onerror = eventRejectHandler(reject); - req.onsuccess = wrap(function (ev) { - var cursor = req.result; - if (!cursor) { - resolve(null); - return; - } - cursor.___id = ++_id_counter; - cursor.done = false; - var _cursorContinue = cursor.continue.bind(cursor); - var _cursorContinuePrimaryKey = cursor.continuePrimaryKey; - if (_cursorContinuePrimaryKey) - _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor); - var _cursorAdvance = cursor.advance.bind(cursor); - var doThrowCursorIsNotStarted = function () { throw new Error("Cursor not started"); }; - var doThrowCursorIsStopped = function () { throw new Error("Cursor not stopped"); }; - cursor.trans = trans; - cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted; - cursor.fail = wrap(reject); - cursor.next = function () { - var _this = this; - var gotOne = 1; - return this.start(function () { return gotOne-- ? _this.continue() : _this.stop(); }).then(function () { return _this; }); - }; - cursor.start = function (callback) { - var iterationPromise = new Promise(function (resolveIteration, rejectIteration) { - resolveIteration = wrap(resolveIteration); - req.onerror = eventRejectHandler(rejectIteration); - cursor.fail = rejectIteration; - cursor.stop = function (value) { - cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped; - resolveIteration(value); - }; - }); - var guardedCallback = function () { - if (req.result) { - try { - callback(); - } - catch (err) { - cursor.fail(err); - } - } - else { - cursor.done = true; - cursor.start = function () { throw new Error("Cursor behind last entry"); }; - cursor.stop(); - } - }; - req.onsuccess = wrap(function (ev) { - req.onsuccess = guardedCallback; - guardedCallback(); - }); - cursor.continue = _cursorContinue; - cursor.continuePrimaryKey = _cursorContinuePrimaryKey; - cursor.advance = _cursorAdvance; - guardedCallback(); - return iterationPromise; - }; - resolve(cursor); - }, reject); - }); - } - function query(hasGetAll) { - return function (request) { - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var trans = request.trans, values = request.values, limit = request.limit, query = request.query; - var nonInfinitLimit = limit === Infinity ? undefined : limit; - var index = query.index, range = query.range; - var store = trans.objectStore(tableName); - var source = index.isPrimaryKey ? store : store.index(index.name); - var idbKeyRange = makeIDBKeyRange(range); - if (limit === 0) - return resolve({ result: [] }); - if (hasGetAll) { - var req = values ? - source.getAll(idbKeyRange, nonInfinitLimit) : - source.getAllKeys(idbKeyRange, nonInfinitLimit); - req.onsuccess = function (event) { return resolve({ result: event.target.result }); }; - req.onerror = eventRejectHandler(reject); - } - else { - var count_1 = 0; - var req_1 = values || !('openKeyCursor' in source) ? - source.openCursor(idbKeyRange) : - source.openKeyCursor(idbKeyRange); - var result_1 = []; - req_1.onsuccess = function (event) { - var cursor = req_1.result; - if (!cursor) - return resolve({ result: result_1 }); - result_1.push(values ? cursor.value : cursor.primaryKey); - if (++count_1 === limit) - return resolve({ result: result_1 }); - cursor.continue(); - }; - req_1.onerror = eventRejectHandler(reject); - } - }); - }; - } - return { - name: tableName, - schema: tableSchema, - mutate: mutate, - getMany: function (_a) { - var trans = _a.trans, keys = _a.keys; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var store = trans.objectStore(tableName); - var length = keys.length; - var result = new Array(length); - var keyCount = 0; - var callbackCount = 0; - var req; - var successHandler = function (event) { - var req = event.target; - if ((result[req._pos] = req.result) != null) - ; - if (++callbackCount === keyCount) - resolve(result); - }; - var errorHandler = eventRejectHandler(reject); - for (var i = 0; i < length; ++i) { - var key = keys[i]; - if (key != null) { - req = store.get(keys[i]); - req._pos = i; - req.onsuccess = successHandler; - req.onerror = errorHandler; - ++keyCount; - } - } - if (keyCount === 0) - resolve(result); - }); - }, - get: function (_a) { - var trans = _a.trans, key = _a.key; - return new Promise(function (resolve, reject) { - resolve = wrap(resolve); - var store = trans.objectStore(tableName); - var req = store.get(key); - req.onsuccess = function (event) { return resolve(event.target.result); }; - req.onerror = eventRejectHandler(reject); - }); - }, - query: query(hasGetAll), - openCursor: openCursor, - count: function (_a) { - var query = _a.query, trans = _a.trans; - var index = query.index, range = query.range; - return new Promise(function (resolve, reject) { - var store = trans.objectStore(tableName); - var source = index.isPrimaryKey ? store : store.index(index.name); - var idbKeyRange = makeIDBKeyRange(range); - var req = idbKeyRange ? source.count(idbKeyRange) : source.count(); - req.onsuccess = wrap(function (ev) { return resolve(ev.target.result); }); - req.onerror = eventRejectHandler(reject); - }); - } - }; - } - var _a = extractSchema(db, tmpTrans), schema = _a.schema, hasGetAll = _a.hasGetAll; - var tables = schema.tables.map(function (tableSchema) { return createDbCoreTable(tableSchema); }); - var tableMap = {}; - tables.forEach(function (table) { return tableMap[table.name] = table; }); - return { - stack: "dbcore", - transaction: db.transaction.bind(db), - table: function (name) { - var result = tableMap[name]; - if (!result) - throw new Error("Table '".concat(name, "' not found")); - return tableMap[name]; - }, - MIN_KEY: -Infinity, - MAX_KEY: getMaxKey(IdbKeyRange), - schema: schema - }; -} - -function createMiddlewareStack(stackImpl, middlewares) { - return middlewares.reduce(function (down, _a) { - var create = _a.create; - return (__assign(__assign({}, down), create(down))); - }, stackImpl); -} -function createMiddlewareStacks(middlewares, idbdb, _a, tmpTrans) { - var IDBKeyRange = _a.IDBKeyRange; _a.indexedDB; - var dbcore = createMiddlewareStack(createDBCore(idbdb, IDBKeyRange, tmpTrans), middlewares.dbcore); - return { - dbcore: dbcore - }; -} -function generateMiddlewareStacks(db, tmpTrans) { - var idbdb = tmpTrans.db; - var stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans); - db.core = stacks.dbcore; - db.tables.forEach(function (table) { - var tableName = table.name; - if (db.core.schema.tables.some(function (tbl) { return tbl.name === tableName; })) { - table.core = db.core.table(tableName); - if (db[tableName] instanceof db.Table) { - db[tableName].core = table.core; - } - } - }); -} - -function setApiOnPlace(db, objs, tableNames, dbschema) { - tableNames.forEach(function (tableName) { - var schema = dbschema[tableName]; - objs.forEach(function (obj) { - var propDesc = getPropertyDescriptor(obj, tableName); - if (!propDesc || ("value" in propDesc && propDesc.value === undefined)) { - if (obj === db.Transaction.prototype || obj instanceof db.Transaction) { - setProp(obj, tableName, { - get: function () { return this.table(tableName); }, - set: function (value) { - defineProperty(this, tableName, { value: value, writable: true, configurable: true, enumerable: true }); - } - }); - } - else { - obj[tableName] = new db.Table(tableName, schema); - } - } - }); - }); -} -function removeTablesApi(db, objs) { - objs.forEach(function (obj) { - for (var key in obj) { - if (obj[key] instanceof db.Table) - delete obj[key]; - } - }); -} -function lowerVersionFirst(a, b) { - return a._cfg.version - b._cfg.version; -} -function runUpgraders(db, oldVersion, idbUpgradeTrans, reject) { - var globalSchema = db._dbSchema; - if (idbUpgradeTrans.objectStoreNames.contains('$meta') && !globalSchema.$meta) { - globalSchema.$meta = createTableSchema("$meta", parseIndexSyntax("")[0], []); - db._storeNames.push('$meta'); - } - var trans = db._createTransaction('readwrite', db._storeNames, globalSchema); - trans.create(idbUpgradeTrans); - trans._completion.catch(reject); - var rejectTransaction = trans._reject.bind(trans); - var transless = PSD.transless || PSD; - newScope(function () { - PSD.trans = trans; - PSD.transless = transless; - if (oldVersion === 0) { - keys(globalSchema).forEach(function (tableName) { - createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes); - }); - generateMiddlewareStacks(db, idbUpgradeTrans); - DexiePromise.follow(function () { return db.on.populate.fire(trans); }).catch(rejectTransaction); - } - else { - generateMiddlewareStacks(db, idbUpgradeTrans); - return getExistingVersion(db, trans, oldVersion) - .then(function (oldVersion) { return updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans); }) - .catch(rejectTransaction); - } - }); -} -function patchCurrentVersion(db, idbUpgradeTrans) { - createMissingTables(db._dbSchema, idbUpgradeTrans); - if (idbUpgradeTrans.db.version % 10 === 0 && !idbUpgradeTrans.objectStoreNames.contains('$meta')) { - idbUpgradeTrans.db.createObjectStore('$meta').add(Math.ceil((idbUpgradeTrans.db.version / 10) - 1), 'version'); - } - var globalSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); - adjustToExistingIndexNames(db, db._dbSchema, idbUpgradeTrans); - var diff = getSchemaDiff(globalSchema, db._dbSchema); - var _loop_1 = function (tableChange) { - if (tableChange.change.length || tableChange.recreate) { - console.warn("Unable to patch indexes of table ".concat(tableChange.name, " because it has changes on the type of index or primary key.")); - return { value: void 0 }; - } - var store = idbUpgradeTrans.objectStore(tableChange.name); - tableChange.add.forEach(function (idx) { - if (debug) - console.debug("Dexie upgrade patch: Creating missing index ".concat(tableChange.name, ".").concat(idx.src)); - addIndex(store, idx); - }); - }; - for (var _i = 0, _a = diff.change; _i < _a.length; _i++) { - var tableChange = _a[_i]; - var state_1 = _loop_1(tableChange); - if (typeof state_1 === "object") - return state_1.value; - } -} -function getExistingVersion(db, trans, oldVersion) { - if (trans.storeNames.includes('$meta')) { - return trans.table('$meta').get('version').then(function (metaVersion) { - return metaVersion != null ? metaVersion : oldVersion; - }); - } - else { - return DexiePromise.resolve(oldVersion); - } -} -function updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans) { - var queue = []; - var versions = db._versions; - var globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); - var versToRun = versions.filter(function (v) { return v._cfg.version >= oldVersion; }); - if (versToRun.length === 0) { - return DexiePromise.resolve(); - } - versToRun.forEach(function (version) { - queue.push(function () { - var oldSchema = globalSchema; - var newSchema = version._cfg.dbschema; - adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans); - adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans); - globalSchema = db._dbSchema = newSchema; - var diff = getSchemaDiff(oldSchema, newSchema); - diff.add.forEach(function (tuple) { - createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes); - }); - diff.change.forEach(function (change) { - if (change.recreate) { - throw new exceptions.Upgrade("Not yet support for changing primary key"); - } - else { - var store_1 = idbUpgradeTrans.objectStore(change.name); - change.add.forEach(function (idx) { return addIndex(store_1, idx); }); - change.change.forEach(function (idx) { - store_1.deleteIndex(idx.name); - addIndex(store_1, idx); - }); - change.del.forEach(function (idxName) { return store_1.deleteIndex(idxName); }); - } - }); - var contentUpgrade = version._cfg.contentUpgrade; - if (contentUpgrade && version._cfg.version > oldVersion) { - generateMiddlewareStacks(db, idbUpgradeTrans); - trans._memoizedTables = {}; - var upgradeSchema_1 = shallowClone(newSchema); - diff.del.forEach(function (table) { - upgradeSchema_1[table] = oldSchema[table]; - }); - removeTablesApi(db, [db.Transaction.prototype]); - setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema_1), upgradeSchema_1); - trans.schema = upgradeSchema_1; - var contentUpgradeIsAsync_1 = isAsyncFunction(contentUpgrade); - if (contentUpgradeIsAsync_1) { - incrementExpectedAwaits(); - } - var returnValue_1; - var promiseFollowed = DexiePromise.follow(function () { - returnValue_1 = contentUpgrade(trans); - if (returnValue_1) { - if (contentUpgradeIsAsync_1) { - var decrementor = decrementExpectedAwaits.bind(null, null); - returnValue_1.then(decrementor, decrementor); - } - } - }); - return (returnValue_1 && typeof returnValue_1.then === 'function' ? - DexiePromise.resolve(returnValue_1) : promiseFollowed.then(function () { return returnValue_1; })); - } - }); - queue.push(function (idbtrans) { - var newSchema = version._cfg.dbschema; - deleteRemovedTables(newSchema, idbtrans); - removeTablesApi(db, [db.Transaction.prototype]); - setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema); - trans.schema = db._dbSchema; - }); - queue.push(function (idbtrans) { - if (db.idbdb.objectStoreNames.contains('$meta')) { - if (Math.ceil(db.idbdb.version / 10) === version._cfg.version) { - db.idbdb.deleteObjectStore('$meta'); - delete db._dbSchema.$meta; - db._storeNames = db._storeNames.filter(function (name) { return name !== '$meta'; }); - } - else { - idbtrans.objectStore('$meta').put(version._cfg.version, 'version'); - } - } - }); - }); - function runQueue() { - return queue.length ? DexiePromise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) : - DexiePromise.resolve(); - } - return runQueue().then(function () { - createMissingTables(globalSchema, idbUpgradeTrans); - }); -} -function getSchemaDiff(oldSchema, newSchema) { - var diff = { - del: [], - add: [], - change: [] - }; - var table; - for (table in oldSchema) { - if (!newSchema[table]) - diff.del.push(table); - } - for (table in newSchema) { - var oldDef = oldSchema[table], newDef = newSchema[table]; - if (!oldDef) { - diff.add.push([table, newDef]); - } - else { - var change = { - name: table, - def: newDef, - recreate: false, - del: [], - add: [], - change: [] - }; - if (( - '' + (oldDef.primKey.keyPath || '')) !== ('' + (newDef.primKey.keyPath || '')) || - (oldDef.primKey.auto !== newDef.primKey.auto)) { - change.recreate = true; - diff.change.push(change); - } - else { - var oldIndexes = oldDef.idxByName; - var newIndexes = newDef.idxByName; - var idxName = void 0; - for (idxName in oldIndexes) { - if (!newIndexes[idxName]) - change.del.push(idxName); - } - for (idxName in newIndexes) { - var oldIdx = oldIndexes[idxName], newIdx = newIndexes[idxName]; - if (!oldIdx) - change.add.push(newIdx); - else if (oldIdx.src !== newIdx.src) - change.change.push(newIdx); - } - if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) { - diff.change.push(change); - } - } - } - } - return diff; -} -function createTable(idbtrans, tableName, primKey, indexes) { - var store = idbtrans.db.createObjectStore(tableName, primKey.keyPath ? - { keyPath: primKey.keyPath, autoIncrement: primKey.auto } : - { autoIncrement: primKey.auto }); - indexes.forEach(function (idx) { return addIndex(store, idx); }); - return store; -} -function createMissingTables(newSchema, idbtrans) { - keys(newSchema).forEach(function (tableName) { - if (!idbtrans.db.objectStoreNames.contains(tableName)) { - if (debug) - console.debug('Dexie: Creating missing table', tableName); - createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes); - } - }); -} -function deleteRemovedTables(newSchema, idbtrans) { - [].slice.call(idbtrans.db.objectStoreNames).forEach(function (storeName) { - return newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName); - }); -} -function addIndex(store, idx) { - store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi }); -} -function buildGlobalSchema(db, idbdb, tmpTrans) { - var globalSchema = {}; - var dbStoreNames = slice(idbdb.objectStoreNames, 0); - dbStoreNames.forEach(function (storeName) { - var store = tmpTrans.objectStore(storeName); - var keyPath = store.keyPath; - var primKey = createIndexSpec(nameFromKeyPath(keyPath), keyPath || "", true, false, !!store.autoIncrement, keyPath && typeof keyPath !== "string", true); - var indexes = []; - for (var j = 0; j < store.indexNames.length; ++j) { - var idbindex = store.index(store.indexNames[j]); - keyPath = idbindex.keyPath; - var index = createIndexSpec(idbindex.name, keyPath, !!idbindex.unique, !!idbindex.multiEntry, false, keyPath && typeof keyPath !== "string", false); - indexes.push(index); - } - globalSchema[storeName] = createTableSchema(storeName, primKey, indexes); - }); - return globalSchema; -} -function readGlobalSchema(db, idbdb, tmpTrans) { - db.verno = idbdb.version / 10; - var globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans); - db._storeNames = slice(idbdb.objectStoreNames, 0); - setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema); -} -function verifyInstalledSchema(db, tmpTrans) { - var installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans); - var diff = getSchemaDiff(installedSchema, db._dbSchema); - return !(diff.add.length || diff.change.some(function (ch) { return ch.add.length || ch.change.length; })); -} -function adjustToExistingIndexNames(db, schema, idbtrans) { - var storeNames = idbtrans.db.objectStoreNames; - for (var i = 0; i < storeNames.length; ++i) { - var storeName = storeNames[i]; - var store = idbtrans.objectStore(storeName); - db._hasGetAll = 'getAll' in store; - for (var j = 0; j < store.indexNames.length; ++j) { - var indexName = store.indexNames[j]; - var keyPath = store.index(indexName).keyPath; - var dexieName = typeof keyPath === 'string' ? keyPath : "[" + slice(keyPath).join('+') + "]"; - if (schema[storeName]) { - var indexSpec = schema[storeName].idxByName[dexieName]; - if (indexSpec) { - indexSpec.name = indexName; - delete schema[storeName].idxByName[dexieName]; - schema[storeName].idxByName[indexName] = indexSpec; - } - } - } - } - if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && - !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && - _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope && - [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) { - db._hasGetAll = false; - } -} -function parseIndexSyntax(primKeyAndIndexes) { - return primKeyAndIndexes.split(',').map(function (index, indexNum) { - index = index.trim(); - var name = index.replace(/([&*]|\+\+)/g, ""); - var keyPath = /^\[/.test(name) ? name.match(/^\[(.*)\]$/)[1].split('+') : name; - return createIndexSpec(name, keyPath || null, /\&/.test(index), /\*/.test(index), /\+\+/.test(index), isArray(keyPath), indexNum === 0); - }); -} - -var Version = (function () { - function Version() { - } - Version.prototype._parseStoresSpec = function (stores, outSchema) { - keys(stores).forEach(function (tableName) { - if (stores[tableName] !== null) { - var indexes = parseIndexSyntax(stores[tableName]); - var primKey = indexes.shift(); - primKey.unique = true; - if (primKey.multi) - throw new exceptions.Schema("Primary key cannot be multi-valued"); - indexes.forEach(function (idx) { - if (idx.auto) - throw new exceptions.Schema("Only primary key can be marked as autoIncrement (++)"); - if (!idx.keyPath) - throw new exceptions.Schema("Index must have a name and cannot be an empty string"); - }); - outSchema[tableName] = createTableSchema(tableName, primKey, indexes); - } - }); - }; - Version.prototype.stores = function (stores) { - var db = this.db; - this._cfg.storesSource = this._cfg.storesSource ? - extend(this._cfg.storesSource, stores) : - stores; - var versions = db._versions; - var storesSpec = {}; - var dbschema = {}; - versions.forEach(function (version) { - extend(storesSpec, version._cfg.storesSource); - dbschema = (version._cfg.dbschema = {}); - version._parseStoresSpec(storesSpec, dbschema); - }); - db._dbSchema = dbschema; - removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]); - setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema); - db._storeNames = keys(dbschema); - return this; - }; - Version.prototype.upgrade = function (upgradeFunction) { - this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction); - return this; - }; - return Version; -}()); - -function createVersionConstructor(db) { - return makeClassConstructor(Version.prototype, function Version(versionNumber) { - this.db = db; - this._cfg = { - version: versionNumber, - storesSource: null, - dbschema: {}, - tables: {}, - contentUpgrade: null - }; - }); -} - -function getDbNamesTable(indexedDB, IDBKeyRange) { - var dbNamesDB = indexedDB["_dbNamesDB"]; - if (!dbNamesDB) { - dbNamesDB = indexedDB["_dbNamesDB"] = new Dexie$1(DBNAMES_DB, { - addons: [], - indexedDB: indexedDB, - IDBKeyRange: IDBKeyRange, - }); - dbNamesDB.version(1).stores({ dbnames: "name" }); - } - return dbNamesDB.table("dbnames"); -} -function hasDatabasesNative(indexedDB) { - return indexedDB && typeof indexedDB.databases === "function"; -} -function getDatabaseNames(_a) { - var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; - return hasDatabasesNative(indexedDB) - ? Promise.resolve(indexedDB.databases()).then(function (infos) { - return infos - .map(function (info) { return info.name; }) - .filter(function (name) { return name !== DBNAMES_DB; }); - }) - : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys(); -} -function _onDatabaseCreated(_a, name) { - var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; - !hasDatabasesNative(indexedDB) && - name !== DBNAMES_DB && - getDbNamesTable(indexedDB, IDBKeyRange).put({ name: name }).catch(nop); -} -function _onDatabaseDeleted(_a, name) { - var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; - !hasDatabasesNative(indexedDB) && - name !== DBNAMES_DB && - getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop); -} - -function vip(fn) { - return newScope(function () { - PSD.letThrough = true; - return fn(); - }); -} - -function idbReady() { - var isSafari = !navigator.userAgentData && - /Safari\//.test(navigator.userAgent) && - !/Chrom(e|ium)\//.test(navigator.userAgent); - if (!isSafari || !indexedDB.databases) - return Promise.resolve(); - var intervalId; - return new Promise(function (resolve) { - var tryIdb = function () { return indexedDB.databases().finally(resolve); }; - intervalId = setInterval(tryIdb, 100); - tryIdb(); - }).finally(function () { return clearInterval(intervalId); }); -} - -var _a; -function isEmptyRange(node) { - return !("from" in node); -} -var RangeSet = function (fromOrTree, to) { - if (this) { - extend(this, arguments.length ? { d: 1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree } : { d: 0 }); - } - else { - var rv = new RangeSet(); - if (fromOrTree && ("d" in fromOrTree)) { - extend(rv, fromOrTree); - } - return rv; - } -}; -props(RangeSet.prototype, (_a = { - add: function (rangeSet) { - mergeRanges(this, rangeSet); - return this; - }, - addKey: function (key) { - addRange(this, key, key); - return this; - }, - addKeys: function (keys) { - var _this = this; - keys.forEach(function (key) { return addRange(_this, key, key); }); - return this; - } - }, - _a[iteratorSymbol] = function () { - return getRangeSetIterator(this); - }, - _a)); -function addRange(target, from, to) { - var diff = cmp(from, to); - if (isNaN(diff)) - return; - if (diff > 0) - throw RangeError(); - if (isEmptyRange(target)) - return extend(target, { from: from, to: to, d: 1 }); - var left = target.l; - var right = target.r; - if (cmp(to, target.from) < 0) { - left - ? addRange(left, from, to) - : (target.l = { from: from, to: to, d: 1, l: null, r: null }); - return rebalance(target); - } - if (cmp(from, target.to) > 0) { - right - ? addRange(right, from, to) - : (target.r = { from: from, to: to, d: 1, l: null, r: null }); - return rebalance(target); - } - if (cmp(from, target.from) < 0) { - target.from = from; - target.l = null; - target.d = right ? right.d + 1 : 1; - } - if (cmp(to, target.to) > 0) { - target.to = to; - target.r = null; - target.d = target.l ? target.l.d + 1 : 1; - } - var rightWasCutOff = !target.r; - if (left && !target.l) { - mergeRanges(target, left); - } - if (right && rightWasCutOff) { - mergeRanges(target, right); - } -} -function mergeRanges(target, newSet) { - function _addRangeSet(target, _a) { - var from = _a.from, to = _a.to, l = _a.l, r = _a.r; - addRange(target, from, to); - if (l) - _addRangeSet(target, l); - if (r) - _addRangeSet(target, r); - } - if (!isEmptyRange(newSet)) - _addRangeSet(target, newSet); -} -function rangesOverlap(rangeSet1, rangeSet2) { - var i1 = getRangeSetIterator(rangeSet2); - var nextResult1 = i1.next(); - if (nextResult1.done) - return false; - var a = nextResult1.value; - var i2 = getRangeSetIterator(rangeSet1); - var nextResult2 = i2.next(a.from); - var b = nextResult2.value; - while (!nextResult1.done && !nextResult2.done) { - if (cmp(b.from, a.to) <= 0 && cmp(b.to, a.from) >= 0) - return true; - cmp(a.from, b.from) < 0 - ? (a = (nextResult1 = i1.next(b.from)).value) - : (b = (nextResult2 = i2.next(a.from)).value); - } - return false; -} -function getRangeSetIterator(node) { - var state = isEmptyRange(node) ? null : { s: 0, n: node }; - return { - next: function (key) { - var keyProvided = arguments.length > 0; - while (state) { - switch (state.s) { - case 0: - state.s = 1; - if (keyProvided) { - while (state.n.l && cmp(key, state.n.from) < 0) - state = { up: state, n: state.n.l, s: 1 }; - } - else { - while (state.n.l) - state = { up: state, n: state.n.l, s: 1 }; - } - case 1: - state.s = 2; - if (!keyProvided || cmp(key, state.n.to) <= 0) - return { value: state.n, done: false }; - case 2: - if (state.n.r) { - state.s = 3; - state = { up: state, n: state.n.r, s: 0 }; - continue; - } - case 3: - state = state.up; - } - } - return { done: true }; - }, - }; -} -function rebalance(target) { - var _a, _b; - var diff = (((_a = target.r) === null || _a === void 0 ? void 0 : _a.d) || 0) - (((_b = target.l) === null || _b === void 0 ? void 0 : _b.d) || 0); - var r = diff > 1 ? "r" : diff < -1 ? "l" : ""; - if (r) { - var l = r === "r" ? "l" : "r"; - var rootClone = __assign({}, target); - var oldRootRight = target[r]; - target.from = oldRootRight.from; - target.to = oldRootRight.to; - target[r] = oldRootRight[r]; - rootClone[r] = oldRootRight[l]; - target[l] = rootClone; - rootClone.d = computeDepth(rootClone); - } - target.d = computeDepth(target); -} -function computeDepth(_a) { - var r = _a.r, l = _a.l; - return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1; -} - -function extendObservabilitySet(target, newSet) { - keys(newSet).forEach(function (part) { - if (target[part]) - mergeRanges(target[part], newSet[part]); - else - target[part] = cloneSimpleObjectTree(newSet[part]); - }); - return target; -} - -function obsSetsOverlap(os1, os2) { - return os1.all || os2.all || Object.keys(os1).some(function (key) { return os2[key] && rangesOverlap(os2[key], os1[key]); }); -} - -var cache = {}; - -var unsignaledParts = {}; -var isTaskEnqueued = false; -function signalSubscribersLazily(part, optimistic) { - extendObservabilitySet(unsignaledParts, part); - if (!isTaskEnqueued) { - isTaskEnqueued = true; - setTimeout(function () { - isTaskEnqueued = false; - var parts = unsignaledParts; - unsignaledParts = {}; - signalSubscribersNow(parts, false); - }, 0); - } -} -function signalSubscribersNow(updatedParts, deleteAffectedCacheEntries) { - if (deleteAffectedCacheEntries === void 0) { deleteAffectedCacheEntries = false; } - var queriesToSignal = new Set(); - if (updatedParts.all) { - for (var _i = 0, _a = Object.values(cache); _i < _a.length; _i++) { - var tblCache = _a[_i]; - collectTableSubscribers(tblCache, updatedParts, queriesToSignal, deleteAffectedCacheEntries); - } - } - else { - for (var key in updatedParts) { - var parts = /^idb\:\/\/(.*)\/(.*)\//.exec(key); - if (parts) { - var dbName = parts[1], tableName = parts[2]; - var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)]; - if (tblCache) - collectTableSubscribers(tblCache, updatedParts, queriesToSignal, deleteAffectedCacheEntries); - } - } - } - queriesToSignal.forEach(function (requery) { return requery(); }); -} -function collectTableSubscribers(tblCache, updatedParts, outQueriesToSignal, deleteAffectedCacheEntries) { - var updatedEntryLists = []; - for (var _i = 0, _a = Object.entries(tblCache.queries.query); _i < _a.length; _i++) { - var _b = _a[_i], indexName = _b[0], entries = _b[1]; - var filteredEntries = []; - for (var _c = 0, entries_1 = entries; _c < entries_1.length; _c++) { - var entry = entries_1[_c]; - if (obsSetsOverlap(updatedParts, entry.obsSet)) { - entry.subscribers.forEach(function (requery) { return outQueriesToSignal.add(requery); }); - } - else if (deleteAffectedCacheEntries) { - filteredEntries.push(entry); - } - } - if (deleteAffectedCacheEntries) - updatedEntryLists.push([indexName, filteredEntries]); - } - if (deleteAffectedCacheEntries) { - for (var _d = 0, updatedEntryLists_1 = updatedEntryLists; _d < updatedEntryLists_1.length; _d++) { - var _e = updatedEntryLists_1[_d], indexName = _e[0], filteredEntries = _e[1]; - tblCache.queries.query[indexName] = filteredEntries; - } - } -} - -function dexieOpen(db) { - var state = db._state; - var indexedDB = db._deps.indexedDB; - if (state.isBeingOpened || db.idbdb) - return state.dbReadyPromise.then(function () { return state.dbOpenError ? - rejection(state.dbOpenError) : - db; }); - state.isBeingOpened = true; - state.dbOpenError = null; - state.openComplete = false; - var openCanceller = state.openCanceller; - var nativeVerToOpen = Math.round(db.verno * 10); - var schemaPatchMode = false; - function throwIfCancelled() { - if (state.openCanceller !== openCanceller) - throw new exceptions.DatabaseClosed('db.open() was cancelled'); - } - var resolveDbReady = state.dbReadyResolve, - upgradeTransaction = null, wasCreated = false; - var tryOpenDB = function () { return new DexiePromise(function (resolve, reject) { - throwIfCancelled(); - if (!indexedDB) - throw new exceptions.MissingAPI(); - var dbName = db.name; - var req = state.autoSchema || !nativeVerToOpen ? - indexedDB.open(dbName) : - indexedDB.open(dbName, nativeVerToOpen); - if (!req) - throw new exceptions.MissingAPI(); - req.onerror = eventRejectHandler(reject); - req.onblocked = wrap(db._fireOnBlocked); - req.onupgradeneeded = wrap(function (e) { - upgradeTransaction = req.transaction; - if (state.autoSchema && !db._options.allowEmptyDB) { - req.onerror = preventDefault; - upgradeTransaction.abort(); - req.result.close(); - var delreq = indexedDB.deleteDatabase(dbName); - delreq.onsuccess = delreq.onerror = wrap(function () { - reject(new exceptions.NoSuchDatabase("Database ".concat(dbName, " doesnt exist"))); - }); - } - else { - upgradeTransaction.onerror = eventRejectHandler(reject); - var oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; - wasCreated = oldVer < 1; - db.idbdb = req.result; - if (schemaPatchMode) { - patchCurrentVersion(db, upgradeTransaction); - } - runUpgraders(db, oldVer / 10, upgradeTransaction, reject); - } - }, reject); - req.onsuccess = wrap(function () { - upgradeTransaction = null; - var idbdb = db.idbdb = req.result; - var objectStoreNames = slice(idbdb.objectStoreNames); - if (objectStoreNames.length > 0) - try { - var tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly'); - if (state.autoSchema) - readGlobalSchema(db, idbdb, tmpTrans); - else { - adjustToExistingIndexNames(db, db._dbSchema, tmpTrans); - if (!verifyInstalledSchema(db, tmpTrans) && !schemaPatchMode) { - console.warn("Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this."); - idbdb.close(); - nativeVerToOpen = idbdb.version + 1; - schemaPatchMode = true; - return resolve(tryOpenDB()); - } - } - generateMiddlewareStacks(db, tmpTrans); - } - catch (e) { - } - connections.push(db); - idbdb.onversionchange = wrap(function (ev) { - state.vcFired = true; - db.on("versionchange").fire(ev); - }); - idbdb.onclose = wrap(function (ev) { - db.on("close").fire(ev); - }); - if (wasCreated) - _onDatabaseCreated(db._deps, dbName); - resolve(); - }, reject); - }).catch(function (err) { - switch (err === null || err === void 0 ? void 0 : err.name) { - case "UnknownError": - if (state.PR1398_maxLoop > 0) { - state.PR1398_maxLoop--; - console.warn('Dexie: Workaround for Chrome UnknownError on open()'); - return tryOpenDB(); - } - break; - case "VersionError": - if (nativeVerToOpen > 0) { - nativeVerToOpen = 0; - return tryOpenDB(); - } - break; - } - return DexiePromise.reject(err); - }); }; - return DexiePromise.race([ - openCanceller, - (typeof navigator === 'undefined' ? DexiePromise.resolve() : idbReady()).then(tryOpenDB) - ]).then(function () { - throwIfCancelled(); - state.onReadyBeingFired = []; - return DexiePromise.resolve(vip(function () { return db.on.ready.fire(db.vip); })).then(function fireRemainders() { - if (state.onReadyBeingFired.length > 0) { - var remainders_1 = state.onReadyBeingFired.reduce(promisableChain, nop); - state.onReadyBeingFired = []; - return DexiePromise.resolve(vip(function () { return remainders_1(db.vip); })).then(fireRemainders); - } - }); - }).finally(function () { - if (state.openCanceller === openCanceller) { - state.onReadyBeingFired = null; - state.isBeingOpened = false; - } - }).catch(function (err) { - state.dbOpenError = err; - try { - upgradeTransaction && upgradeTransaction.abort(); - } - catch (_a) { } - if (openCanceller === state.openCanceller) { - db._close(); - } - return rejection(err); - }).finally(function () { - state.openComplete = true; - resolveDbReady(); - }).then(function () { - if (wasCreated) { - var everything_1 = {}; - db.tables.forEach(function (table) { - table.schema.indexes.forEach(function (idx) { - if (idx.name) - everything_1["idb://".concat(db.name, "/").concat(table.name, "/").concat(idx.name)] = new RangeSet(-Infinity, [[[]]]); - }); - everything_1["idb://".concat(db.name, "/").concat(table.name, "/")] = everything_1["idb://".concat(db.name, "/").concat(table.name, "/:dels")] = new RangeSet(-Infinity, [[[]]]); - }); - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME).fire(everything_1); - signalSubscribersNow(everything_1, true); - } - return db; - }); -} - -function awaitIterator(iterator) { - var callNext = function (result) { return iterator.next(result); }, doThrow = function (error) { return iterator.throw(error); }, onSuccess = step(callNext), onError = step(doThrow); - function step(getNext) { - return function (val) { - var next = getNext(val), value = next.value; - return next.done ? value : - (!value || typeof value.then !== 'function' ? - isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) : - value.then(onSuccess, onError)); - }; - } - return step(callNext)(); -} - -function extractTransactionArgs(mode, _tableArgs_, scopeFunc) { - var i = arguments.length; - if (i < 2) - throw new exceptions.InvalidArgument("Too few arguments"); - var args = new Array(i - 1); - while (--i) - args[i - 1] = arguments[i]; - scopeFunc = args.pop(); - var tables = flatten(args); - return [mode, tables, scopeFunc]; -} -function enterTransactionScope(db, mode, storeNames, parentTransaction, scopeFunc) { - return DexiePromise.resolve().then(function () { - var transless = PSD.transless || PSD; - var trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction); - trans.explicit = true; - var zoneProps = { - trans: trans, - transless: transless - }; - if (parentTransaction) { - trans.idbtrans = parentTransaction.idbtrans; - } - else { - try { - trans.create(); - trans.idbtrans._explicit = true; - db._state.PR1398_maxLoop = 3; - } - catch (ex) { - if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { - console.warn('Dexie: Need to reopen db'); - db.close({ disableAutoOpen: false }); - return db.open().then(function () { return enterTransactionScope(db, mode, storeNames, null, scopeFunc); }); - } - return rejection(ex); - } - } - var scopeFuncIsAsync = isAsyncFunction(scopeFunc); - if (scopeFuncIsAsync) { - incrementExpectedAwaits(); - } - var returnValue; - var promiseFollowed = DexiePromise.follow(function () { - returnValue = scopeFunc.call(trans, trans); - if (returnValue) { - if (scopeFuncIsAsync) { - var decrementor = decrementExpectedAwaits.bind(null, null); - returnValue.then(decrementor, decrementor); - } - else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') { - returnValue = awaitIterator(returnValue); - } - } - }, zoneProps); - return (returnValue && typeof returnValue.then === 'function' ? - DexiePromise.resolve(returnValue).then(function (x) { return trans.active ? - x - : rejection(new exceptions.PrematureCommit("Transaction committed too early. See http://bit.ly/2kdckMn")); }) - : promiseFollowed.then(function () { return returnValue; })).then(function (x) { - if (parentTransaction) - trans._resolve(); - return trans._completion.then(function () { return x; }); - }).catch(function (e) { - trans._reject(e); - return rejection(e); - }); - }); -} - -function pad(a, value, count) { - var result = isArray(a) ? a.slice() : [a]; - for (var i = 0; i < count; ++i) - result.push(value); - return result; -} -function createVirtualIndexMiddleware(down) { - return __assign(__assign({}, down), { table: function (tableName) { - var table = down.table(tableName); - var schema = table.schema; - var indexLookup = {}; - var allVirtualIndexes = []; - function addVirtualIndexes(keyPath, keyTail, lowLevelIndex) { - var keyPathAlias = getKeyPathAlias(keyPath); - var indexList = (indexLookup[keyPathAlias] = indexLookup[keyPathAlias] || []); - var keyLength = keyPath == null ? 0 : typeof keyPath === 'string' ? 1 : keyPath.length; - var isVirtual = keyTail > 0; - var virtualIndex = __assign(__assign({}, lowLevelIndex), { name: isVirtual - ? "".concat(keyPathAlias, "(virtual-from:").concat(lowLevelIndex.name, ")") - : lowLevelIndex.name, lowLevelIndex: lowLevelIndex, isVirtual: isVirtual, keyTail: keyTail, keyLength: keyLength, extractKey: getKeyExtractor(keyPath), unique: !isVirtual && lowLevelIndex.unique }); - indexList.push(virtualIndex); - if (!virtualIndex.isPrimaryKey) { - allVirtualIndexes.push(virtualIndex); - } - if (keyLength > 1) { - var virtualKeyPath = keyLength === 2 ? - keyPath[0] : - keyPath.slice(0, keyLength - 1); - addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex); - } - indexList.sort(function (a, b) { return a.keyTail - b.keyTail; }); - return virtualIndex; - } - var primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey); - indexLookup[":id"] = [primaryKey]; - for (var _i = 0, _a = schema.indexes; _i < _a.length; _i++) { - var index = _a[_i]; - addVirtualIndexes(index.keyPath, 0, index); - } - function findBestIndex(keyPath) { - var result = indexLookup[getKeyPathAlias(keyPath)]; - return result && result[0]; - } - function translateRange(range, keyTail) { - return { - type: range.type === 1 ? - 2 : - range.type, - lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail), - lowerOpen: true, - upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail), - upperOpen: true - }; - } - function translateRequest(req) { - var index = req.query.index; - return index.isVirtual ? __assign(__assign({}, req), { query: { - index: index.lowLevelIndex, - range: translateRange(req.query.range, index.keyTail) - } }) : req; - } - var result = __assign(__assign({}, table), { schema: __assign(__assign({}, schema), { primaryKey: primaryKey, indexes: allVirtualIndexes, getIndexByKeyPath: findBestIndex }), count: function (req) { - return table.count(translateRequest(req)); - }, query: function (req) { - return table.query(translateRequest(req)); - }, openCursor: function (req) { - var _a = req.query.index, keyTail = _a.keyTail, isVirtual = _a.isVirtual, keyLength = _a.keyLength; - if (!isVirtual) - return table.openCursor(req); - function createVirtualCursor(cursor) { - function _continue(key) { - key != null ? - cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) : - req.unique ? - cursor.continue(cursor.key.slice(0, keyLength) - .concat(req.reverse - ? down.MIN_KEY - : down.MAX_KEY, keyTail)) : - cursor.continue(); - } - var virtualCursor = Object.create(cursor, { - continue: { value: _continue }, - continuePrimaryKey: { - value: function (key, primaryKey) { - cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey); - } - }, - primaryKey: { - get: function () { - return cursor.primaryKey; - } - }, - key: { - get: function () { - var key = cursor.key; - return keyLength === 1 ? - key[0] : - key.slice(0, keyLength); - } - }, - value: { - get: function () { - return cursor.value; - } - } - }); - return virtualCursor; - } - return table.openCursor(translateRequest(req)) - .then(function (cursor) { return cursor && createVirtualCursor(cursor); }); - } }); - return result; - } }); -} -var virtualIndexMiddleware = { - stack: "dbcore", - name: "VirtualIndexMiddleware", - level: 1, - create: createVirtualIndexMiddleware -}; - -function getObjectDiff(a, b, rv, prfx) { - rv = rv || {}; - prfx = prfx || ''; - keys(a).forEach(function (prop) { - if (!hasOwn(b, prop)) { - rv[prfx + prop] = undefined; - } - else { - var ap = a[prop], bp = b[prop]; - if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) { - var apTypeName = toStringTag(ap); - var bpTypeName = toStringTag(bp); - if (apTypeName !== bpTypeName) { - rv[prfx + prop] = b[prop]; - } - else if (apTypeName === 'Object') { - getObjectDiff(ap, bp, rv, prfx + prop + '.'); - } - else if (ap !== bp) { - rv[prfx + prop] = b[prop]; - } - } - else if (ap !== bp) - rv[prfx + prop] = b[prop]; - } - }); - keys(b).forEach(function (prop) { - if (!hasOwn(a, prop)) { - rv[prfx + prop] = b[prop]; - } - }); - return rv; -} - -function getEffectiveKeys(primaryKey, req) { - if (req.type === 'delete') - return req.keys; - return req.keys || req.values.map(primaryKey.extractKey); -} - -var hooksMiddleware = { - stack: "dbcore", - name: "HooksMiddleware", - level: 2, - create: function (downCore) { return (__assign(__assign({}, downCore), { table: function (tableName) { - var downTable = downCore.table(tableName); - var primaryKey = downTable.schema.primaryKey; - var tableMiddleware = __assign(__assign({}, downTable), { mutate: function (req) { - var dxTrans = PSD.trans; - var _a = dxTrans.table(tableName).hook, deleting = _a.deleting, creating = _a.creating, updating = _a.updating; - switch (req.type) { - case 'add': - if (creating.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); - case 'put': - if (creating.fire === nop && updating.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); - case 'delete': - if (deleting.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); - case 'deleteRange': - if (deleting.fire === nop) - break; - return dxTrans._promise('readwrite', function () { return deleteRange(req); }, true); - } - return downTable.mutate(req); - function addPutOrDelete(req) { - var dxTrans = PSD.trans; - var keys = req.keys || getEffectiveKeys(primaryKey, req); - if (!keys) - throw new Error("Keys missing"); - req = req.type === 'add' || req.type === 'put' ? __assign(__assign({}, req), { keys: keys }) : __assign({}, req); - if (req.type !== 'delete') - req.values = __spreadArray([], req.values, true); - if (req.keys) - req.keys = __spreadArray([], req.keys, true); - return getExistingValues(downTable, req, keys).then(function (existingValues) { - var contexts = keys.map(function (key, i) { - var existingValue = existingValues[i]; - var ctx = { onerror: null, onsuccess: null }; - if (req.type === 'delete') { - deleting.fire.call(ctx, key, existingValue, dxTrans); - } - else if (req.type === 'add' || existingValue === undefined) { - var generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans); - if (key == null && generatedPrimaryKey != null) { - key = generatedPrimaryKey; - req.keys[i] = key; - if (!primaryKey.outbound) { - setByKeyPath(req.values[i], primaryKey.keyPath, key); - } - } - } - else { - var objectDiff = getObjectDiff(existingValue, req.values[i]); - var additionalChanges_1 = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans); - if (additionalChanges_1) { - var requestedValue_1 = req.values[i]; - Object.keys(additionalChanges_1).forEach(function (keyPath) { - if (hasOwn(requestedValue_1, keyPath)) { - requestedValue_1[keyPath] = additionalChanges_1[keyPath]; - } - else { - setByKeyPath(requestedValue_1, keyPath, additionalChanges_1[keyPath]); - } - }); - } - } - return ctx; - }); - return downTable.mutate(req).then(function (_a) { - var failures = _a.failures, results = _a.results, numFailures = _a.numFailures, lastResult = _a.lastResult; - for (var i = 0; i < keys.length; ++i) { - var primKey = results ? results[i] : keys[i]; - var ctx = contexts[i]; - if (primKey == null) { - ctx.onerror && ctx.onerror(failures[i]); - } - else { - ctx.onsuccess && ctx.onsuccess(req.type === 'put' && existingValues[i] ? - req.values[i] : - primKey - ); - } - } - return { failures: failures, results: results, numFailures: numFailures, lastResult: lastResult }; - }).catch(function (error) { - contexts.forEach(function (ctx) { return ctx.onerror && ctx.onerror(error); }); - return Promise.reject(error); - }); - }); - } - function deleteRange(req) { - return deleteNextChunk(req.trans, req.range, 10000); - } - function deleteNextChunk(trans, range, limit) { - return downTable.query({ trans: trans, values: false, query: { index: primaryKey, range: range }, limit: limit }) - .then(function (_a) { - var result = _a.result; - return addPutOrDelete({ type: 'delete', keys: result, trans: trans }).then(function (res) { - if (res.numFailures > 0) - return Promise.reject(res.failures[0]); - if (result.length < limit) { - return { failures: [], numFailures: 0, lastResult: undefined }; - } - else { - return deleteNextChunk(trans, __assign(__assign({}, range), { lower: result[result.length - 1], lowerOpen: true }), limit); - } - }); - }); - } - } }); - return tableMiddleware; - } })); } -}; -function getExistingValues(table, req, effectiveKeys) { - return req.type === "add" - ? Promise.resolve([]) - : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: "immutable" }); -} - -function getFromTransactionCache(keys, cache, clone) { - try { - if (!cache) - return null; - if (cache.keys.length < keys.length) - return null; - var result = []; - for (var i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) { - if (cmp(cache.keys[i], keys[j]) !== 0) - continue; - result.push(clone ? deepClone(cache.values[i]) : cache.values[i]); - ++j; - } - return result.length === keys.length ? result : null; - } - catch (_a) { - return null; - } -} -var cacheExistingValuesMiddleware = { - stack: "dbcore", - level: -1, - create: function (core) { - return { - table: function (tableName) { - var table = core.table(tableName); - return __assign(__assign({}, table), { getMany: function (req) { - if (!req.cache) { - return table.getMany(req); - } - var cachedResult = getFromTransactionCache(req.keys, req.trans["_cache"], req.cache === "clone"); - if (cachedResult) { - return DexiePromise.resolve(cachedResult); - } - return table.getMany(req).then(function (res) { - req.trans["_cache"] = { - keys: req.keys, - values: req.cache === "clone" ? deepClone(res) : res, - }; - return res; - }); - }, mutate: function (req) { - if (req.type !== "add") - req.trans["_cache"] = null; - return table.mutate(req); - } }); - }, - }; - }, -}; - -function isCachableContext(ctx, table) { - return (ctx.trans.mode === 'readonly' && - !!ctx.subscr && - !ctx.trans.explicit && - ctx.trans.db._options.cache !== 'disabled' && - !table.schema.primaryKey.outbound); -} - -function isCachableRequest(type, req) { - switch (type) { - case 'query': - return req.values && !req.unique; - case 'get': - return false; - case 'getMany': - return false; - case 'count': - return false; - case 'openCursor': - return false; - } -} - -var observabilityMiddleware = { - stack: "dbcore", - level: 0, - name: "Observability", - create: function (core) { - var dbName = core.schema.name; - var FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY); - return __assign(__assign({}, core), { transaction: function (stores, mode, options) { - if (PSD.subscr && mode !== 'readonly') { - throw new exceptions.ReadOnly("Readwrite transaction in liveQuery context. Querier source: ".concat(PSD.querier)); - } - return core.transaction(stores, mode, options); - }, table: function (tableName) { - var table = core.table(tableName); - var schema = table.schema; - var primaryKey = schema.primaryKey, indexes = schema.indexes; - var extractKey = primaryKey.extractKey, outbound = primaryKey.outbound; - var indexesWithAutoIncPK = primaryKey.autoIncrement && indexes.filter(function (index) { return index.compound && index.keyPath.includes(primaryKey.keyPath); }); - var tableClone = __assign(__assign({}, table), { mutate: function (req) { - var trans = req.trans; - var mutatedParts = req.mutatedParts || (req.mutatedParts = {}); - var getRangeSet = function (indexName) { - var part = "idb://".concat(dbName, "/").concat(tableName, "/").concat(indexName); - return (mutatedParts[part] || - (mutatedParts[part] = new RangeSet())); - }; - var pkRangeSet = getRangeSet(""); - var delsRangeSet = getRangeSet(":dels"); - var type = req.type; - var _a = req.type === "deleteRange" - ? [req.range] - : req.type === "delete" - ? [req.keys] - : req.values.length < 50 - ? [getEffectiveKeys(primaryKey, req).filter(function (id) { return id; }), req.values] - : [], keys = _a[0], newObjs = _a[1]; - var oldCache = req.trans["_cache"]; - if (isArray(keys)) { - pkRangeSet.addKeys(keys); - var oldObjs = type === 'delete' || keys.length === newObjs.length ? getFromTransactionCache(keys, oldCache) : null; - if (!oldObjs) { - delsRangeSet.addKeys(keys); - } - if (oldObjs || newObjs) { - trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs); - } - } - else if (keys) { - var range = { from: keys.lower, to: keys.upper }; - delsRangeSet.add(range); - pkRangeSet.add(range); - } - else { - pkRangeSet.add(FULL_RANGE); - delsRangeSet.add(FULL_RANGE); - schema.indexes.forEach(function (idx) { return getRangeSet(idx.name).add(FULL_RANGE); }); - } - return table.mutate(req).then(function (res) { - if (keys && (req.type === 'add' || req.type === 'put')) { - pkRangeSet.addKeys(res.results); - if (indexesWithAutoIncPK) { - indexesWithAutoIncPK.forEach(function (idx) { - var idxVals = req.values.map(function (v) { return idx.extractKey(v); }); - var pkPos = idx.keyPath.findIndex(function (prop) { return prop === primaryKey.keyPath; }); - res.results.forEach(function (pk) { return idxVals[pkPos] = pk; }); - getRangeSet(idx.name).addKeys(idxVals); - }); - } - } - trans.mutatedParts = extendObservabilitySet(trans.mutatedParts || {}, mutatedParts); - return res; - }); - } }); - var getRange = function (_a) { - var _b, _c; - var _d = _a.query, index = _d.index, range = _d.range; - return [ - index, - new RangeSet((_b = range.lower) !== null && _b !== void 0 ? _b : core.MIN_KEY, (_c = range.upper) !== null && _c !== void 0 ? _c : core.MAX_KEY), - ]; - }; - var readSubscribers = { - get: function (req) { return [primaryKey, new RangeSet(req.key)]; }, - getMany: function (req) { return [primaryKey, new RangeSet().addKeys(req.keys)]; }, - count: getRange, - query: getRange, - openCursor: getRange, - }; - keys(readSubscribers).forEach(function (method) { - tableClone[method] = function (req) { - var subscr = PSD.subscr; - var isLiveQuery = !!subscr; - var cachable = isCachableContext(PSD, table) && isCachableRequest(method, req); - var obsSet = cachable - ? req.obsSet = {} - : subscr; - if (isLiveQuery) { - var getRangeSet = function (indexName) { - var part = "idb://".concat(dbName, "/").concat(tableName, "/").concat(indexName); - return (obsSet[part] || - (obsSet[part] = new RangeSet())); - }; - var pkRangeSet_1 = getRangeSet(""); - var delsRangeSet_1 = getRangeSet(":dels"); - var _a = readSubscribers[method](req), queriedIndex = _a[0], queriedRanges = _a[1]; - if (method === 'query' && queriedIndex.isPrimaryKey && !req.values) { - delsRangeSet_1.add(queriedRanges); - } - else { - getRangeSet(queriedIndex.name || "").add(queriedRanges); - } - if (!queriedIndex.isPrimaryKey) { - if (method === "count") { - delsRangeSet_1.add(FULL_RANGE); - } - else { - var keysPromise_1 = method === "query" && - outbound && - req.values && - table.query(__assign(__assign({}, req), { values: false })); - return table[method].apply(this, arguments).then(function (res) { - if (method === "query") { - if (outbound && req.values) { - return keysPromise_1.then(function (_a) { - var resultingKeys = _a.result; - pkRangeSet_1.addKeys(resultingKeys); - return res; - }); - } - var pKeys = req.values - ? res.result.map(extractKey) - : res.result; - if (req.values) { - pkRangeSet_1.addKeys(pKeys); - } - else { - delsRangeSet_1.addKeys(pKeys); - } - } - else if (method === "openCursor") { - var cursor_1 = res; - var wantValues_1 = req.values; - return (cursor_1 && - Object.create(cursor_1, { - key: { - get: function () { - delsRangeSet_1.addKey(cursor_1.primaryKey); - return cursor_1.key; - }, - }, - primaryKey: { - get: function () { - var pkey = cursor_1.primaryKey; - delsRangeSet_1.addKey(pkey); - return pkey; - }, - }, - value: { - get: function () { - wantValues_1 && pkRangeSet_1.addKey(cursor_1.primaryKey); - return cursor_1.value; - }, - }, - })); - } - return res; - }); - } - } - } - return table[method].apply(this, arguments); - }; - }); - return tableClone; - } }); - }, -}; -function trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs) { - function addAffectedIndex(ix) { - var rangeSet = getRangeSet(ix.name || ""); - function extractKey(obj) { - return obj != null ? ix.extractKey(obj) : null; - } - var addKeyOrKeys = function (key) { return ix.multiEntry && isArray(key) - ? key.forEach(function (key) { return rangeSet.addKey(key); }) - : rangeSet.addKey(key); }; - (oldObjs || newObjs).forEach(function (_, i) { - var oldKey = oldObjs && extractKey(oldObjs[i]); - var newKey = newObjs && extractKey(newObjs[i]); - if (cmp(oldKey, newKey) !== 0) { - if (oldKey != null) - addKeyOrKeys(oldKey); - if (newKey != null) - addKeyOrKeys(newKey); - } - }); - } - schema.indexes.forEach(addAffectedIndex); -} - -function adjustOptimisticFromFailures(tblCache, req, res) { - if (res.numFailures === 0) - return req; - if (req.type === 'deleteRange') { - return null; - } - var numBulkOps = req.keys - ? req.keys.length - : 'values' in req && req.values - ? req.values.length - : 1; - if (res.numFailures === numBulkOps) { - return null; - } - var clone = __assign({}, req); - if (isArray(clone.keys)) { - clone.keys = clone.keys.filter(function (_, i) { return !(i in res.failures); }); - } - if ('values' in clone && isArray(clone.values)) { - clone.values = clone.values.filter(function (_, i) { return !(i in res.failures); }); - } - return clone; -} - -function isAboveLower(key, range) { - return range.lower === undefined - ? true - : range.lowerOpen - ? cmp(key, range.lower) > 0 - : cmp(key, range.lower) >= 0; -} -function isBelowUpper(key, range) { - return range.upper === undefined - ? true - : range.upperOpen - ? cmp(key, range.upper) < 0 - : cmp(key, range.upper) <= 0; -} -function isWithinRange(key, range) { - return isAboveLower(key, range) && isBelowUpper(key, range); -} - -function applyOptimisticOps(result, req, ops, table, cacheEntry, immutable) { - if (!ops || ops.length === 0) - return result; - var index = req.query.index; - var multiEntry = index.multiEntry; - var queryRange = req.query.range; - var primaryKey = table.schema.primaryKey; - var extractPrimKey = primaryKey.extractKey; - var extractIndex = index.extractKey; - var extractLowLevelIndex = (index.lowLevelIndex || index).extractKey; - var finalResult = ops.reduce(function (result, op) { - var modifedResult = result; - var includedValues = op.type === 'add' || op.type === 'put' - ? op.values.filter(function (v) { - var key = extractIndex(v); - return multiEntry && isArray(key) - ? key.some(function (k) { return isWithinRange(k, queryRange); }) - : isWithinRange(key, queryRange); - }).map(function (v) { - v = deepClone(v); - if (immutable) - Object.freeze(v); - return v; - }) - : []; - switch (op.type) { - case 'add': - modifedResult = result.concat(req.values - ? includedValues - : includedValues.map(function (v) { return extractPrimKey(v); })); - break; - case 'put': - var keySet_1 = new RangeSet().addKeys(op.values.map(function (v) { return extractPrimKey(v); })); - modifedResult = result - .filter(function (item) { - var key = req.values ? extractPrimKey(item) : item; - return !rangesOverlap(new RangeSet(key), keySet_1); - }) - .concat(req.values - ? includedValues - : includedValues.map(function (v) { return extractPrimKey(v); })); - break; - case 'delete': - var keysToDelete_1 = new RangeSet().addKeys(op.keys); - modifedResult = result.filter(function (item) { - var key = req.values ? extractPrimKey(item) : item; - return !rangesOverlap(new RangeSet(key), keysToDelete_1); - }); - break; - case 'deleteRange': - var range_1 = op.range; - modifedResult = result.filter(function (item) { return !isWithinRange(extractPrimKey(item), range_1); }); - break; - } - return modifedResult; - }, result); - if (finalResult === result) - return result; - finalResult.sort(function (a, b) { - return cmp(extractLowLevelIndex(a), extractLowLevelIndex(b)) || - cmp(extractPrimKey(a), extractPrimKey(b)); - }); - if (req.limit && req.limit < Infinity) { - if (finalResult.length > req.limit) { - finalResult.length = req.limit; - } - else if (result.length === req.limit && finalResult.length < req.limit) { - cacheEntry.dirty = true; - } - } - return immutable ? Object.freeze(finalResult) : finalResult; -} - -function areRangesEqual(r1, r2) { - return (cmp(r1.lower, r2.lower) === 0 && - cmp(r1.upper, r2.upper) === 0 && - !!r1.lowerOpen === !!r2.lowerOpen && - !!r1.upperOpen === !!r2.upperOpen); -} - -function compareLowers(lower1, lower2, lowerOpen1, lowerOpen2) { - if (lower1 === undefined) - return lower2 !== undefined ? -1 : 0; - if (lower2 === undefined) - return 1; - var c = cmp(lower1, lower2); - if (c === 0) { - if (lowerOpen1 && lowerOpen2) - return 0; - if (lowerOpen1) - return 1; - if (lowerOpen2) - return -1; - } - return c; -} -function compareUppers(upper1, upper2, upperOpen1, upperOpen2) { - if (upper1 === undefined) - return upper2 !== undefined ? 1 : 0; - if (upper2 === undefined) - return -1; - var c = cmp(upper1, upper2); - if (c === 0) { - if (upperOpen1 && upperOpen2) - return 0; - if (upperOpen1) - return -1; - if (upperOpen2) - return 1; - } - return c; -} -function isSuperRange(r1, r2) { - return (compareLowers(r1.lower, r2.lower, r1.lowerOpen, r2.lowerOpen) <= 0 && - compareUppers(r1.upper, r2.upper, r1.upperOpen, r2.upperOpen) >= 0); -} - -function findCompatibleQuery(dbName, tableName, type, req) { - var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)]; - if (!tblCache) - return []; - var queries = tblCache.queries[type]; - if (!queries) - return [null, false, tblCache, null]; - var indexName = req.query ? req.query.index.name : null; - var entries = queries[indexName || '']; - if (!entries) - return [null, false, tblCache, null]; - switch (type) { - case 'query': - var equalEntry = entries.find(function (entry) { - return entry.req.limit === req.limit && - entry.req.values === req.values && - areRangesEqual(entry.req.query.range, req.query.range); - }); - if (equalEntry) - return [ - equalEntry, - true, - tblCache, - entries, - ]; - var superEntry = entries.find(function (entry) { - var limit = 'limit' in entry.req ? entry.req.limit : Infinity; - return (limit >= req.limit && - (req.values ? entry.req.values : true) && - isSuperRange(entry.req.query.range, req.query.range)); - }); - return [superEntry, false, tblCache, entries]; - case 'count': - var countQuery = entries.find(function (entry) { - return areRangesEqual(entry.req.query.range, req.query.range); - }); - return [countQuery, !!countQuery, tblCache, entries]; - } -} - -function subscribeToCacheEntry(cacheEntry, container, requery, signal) { - cacheEntry.subscribers.add(requery); - signal.addEventListener("abort", function () { - cacheEntry.subscribers.delete(requery); - if (cacheEntry.subscribers.size === 0) { - enqueForDeletion(cacheEntry, container); - } - }); -} -function enqueForDeletion(cacheEntry, container) { - setTimeout(function () { - if (cacheEntry.subscribers.size === 0) { - delArrayItem(container, cacheEntry); - } - }, 3000); -} - -var cacheMiddleware = { - stack: 'dbcore', - level: 0, - name: 'Cache', - create: function (core) { - var dbName = core.schema.name; - var coreMW = __assign(__assign({}, core), { transaction: function (stores, mode, options) { - var idbtrans = core.transaction(stores, mode, options); - if (mode === 'readwrite') { - var ac_1 = new AbortController(); - var signal = ac_1.signal; - var endTransaction = function (wasCommitted) { return function () { - ac_1.abort(); - if (mode === 'readwrite') { - var affectedSubscribers_1 = new Set(); - for (var _i = 0, stores_1 = stores; _i < stores_1.length; _i++) { - var storeName = stores_1[_i]; - var tblCache = cache["idb://".concat(dbName, "/").concat(storeName)]; - if (tblCache) { - var table = core.table(storeName); - var ops = tblCache.optimisticOps.filter(function (op) { return op.trans === idbtrans; }); - if (idbtrans._explicit && wasCommitted && idbtrans.mutatedParts) { - for (var _a = 0, _b = Object.values(tblCache.queries.query); _a < _b.length; _a++) { - var entries = _b[_a]; - for (var _c = 0, _d = entries.slice(); _c < _d.length; _c++) { - var entry = _d[_c]; - if (obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)) { - delArrayItem(entries, entry); - entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); }); - } - } - } - } - else if (ops.length > 0) { - tblCache.optimisticOps = tblCache.optimisticOps.filter(function (op) { return op.trans !== idbtrans; }); - for (var _e = 0, _f = Object.values(tblCache.queries.query); _e < _f.length; _e++) { - var entries = _f[_e]; - for (var _g = 0, _h = entries.slice(); _g < _h.length; _g++) { - var entry = _h[_g]; - if (entry.res != null && - idbtrans.mutatedParts -) { - if (wasCommitted && !entry.dirty) { - var freezeResults = Object.isFrozen(entry.res); - var modRes = applyOptimisticOps(entry.res, entry.req, ops, table, entry, freezeResults); - if (entry.dirty) { - delArrayItem(entries, entry); - entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); }); - } - else if (modRes !== entry.res) { - entry.res = modRes; - entry.promise = DexiePromise.resolve({ result: modRes }); - } - } - else { - if (entry.dirty) { - delArrayItem(entries, entry); - } - entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); }); - } - } - } - } - } - } - } - affectedSubscribers_1.forEach(function (requery) { return requery(); }); - } - }; }; - idbtrans.addEventListener('abort', endTransaction(false), { - signal: signal, - }); - idbtrans.addEventListener('error', endTransaction(false), { - signal: signal, - }); - idbtrans.addEventListener('complete', endTransaction(true), { - signal: signal, - }); - } - return idbtrans; - }, table: function (tableName) { - var downTable = core.table(tableName); - var primKey = downTable.schema.primaryKey; - var tableMW = __assign(__assign({}, downTable), { mutate: function (req) { - var trans = PSD.trans; - if (primKey.outbound || - trans.db._options.cache === 'disabled' || - trans.explicit - ) { - return downTable.mutate(req); - } - var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)]; - if (!tblCache) - return downTable.mutate(req); - var promise = downTable.mutate(req); - if ((req.type === 'add' || req.type === 'put') && (req.values.length >= 50 || getEffectiveKeys(primKey, req).some(function (key) { return key == null; }))) { - promise.then(function (res) { - var reqWithResolvedKeys = __assign(__assign({}, req), { values: req.values.map(function (value, i) { - var _a; - var valueWithKey = ((_a = primKey.keyPath) === null || _a === void 0 ? void 0 : _a.includes('.')) - ? deepClone(value) - : __assign({}, value); - setByKeyPath(valueWithKey, primKey.keyPath, res.results[i]); - return valueWithKey; - }) }); - var adjustedReq = adjustOptimisticFromFailures(tblCache, reqWithResolvedKeys, res); - tblCache.optimisticOps.push(adjustedReq); - queueMicrotask(function () { return req.mutatedParts && signalSubscribersLazily(req.mutatedParts); }); - }); - } - else { - tblCache.optimisticOps.push(req); - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - promise.then(function (res) { - if (res.numFailures > 0) { - delArrayItem(tblCache.optimisticOps, req); - var adjustedReq = adjustOptimisticFromFailures(tblCache, req, res); - if (adjustedReq) { - tblCache.optimisticOps.push(adjustedReq); - } - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - } - }); - promise.catch(function () { - delArrayItem(tblCache.optimisticOps, req); - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - }); - } - return promise; - }, query: function (req) { - var _a; - if (!isCachableContext(PSD, downTable) || !isCachableRequest("query", req)) - return downTable.query(req); - var freezeResults = ((_a = PSD.trans) === null || _a === void 0 ? void 0 : _a.db._options.cache) === 'immutable'; - var _b = PSD, requery = _b.requery, signal = _b.signal; - var _c = findCompatibleQuery(dbName, tableName, 'query', req), cacheEntry = _c[0], exactMatch = _c[1], tblCache = _c[2], container = _c[3]; - if (cacheEntry && exactMatch) { - cacheEntry.obsSet = req.obsSet; - } - else { - var promise = downTable.query(req).then(function (res) { - var result = res.result; - if (cacheEntry) - cacheEntry.res = result; - if (freezeResults) { - for (var i = 0, l = result.length; i < l; ++i) { - Object.freeze(result[i]); - } - Object.freeze(result); - } - else { - res.result = deepClone(result); - } - return res; - }).catch(function (error) { - if (container && cacheEntry) - delArrayItem(container, cacheEntry); - return Promise.reject(error); - }); - cacheEntry = { - obsSet: req.obsSet, - promise: promise, - subscribers: new Set(), - type: 'query', - req: req, - dirty: false, - }; - if (container) { - container.push(cacheEntry); - } - else { - container = [cacheEntry]; - if (!tblCache) { - tblCache = cache["idb://".concat(dbName, "/").concat(tableName)] = { - queries: { - query: {}, - count: {}, - }, - objs: new Map(), - optimisticOps: [], - unsignaledParts: {} - }; - } - tblCache.queries.query[req.query.index.name || ''] = container; - } - } - subscribeToCacheEntry(cacheEntry, container, requery, signal); - return cacheEntry.promise.then(function (res) { - return { - result: applyOptimisticOps(res.result, req, tblCache === null || tblCache === void 0 ? void 0 : tblCache.optimisticOps, downTable, cacheEntry, freezeResults), - }; - }); - } }); - return tableMW; - } }); - return coreMW; - }, -}; - -function vipify(target, vipDb) { - return new Proxy(target, { - get: function (target, prop, receiver) { - if (prop === 'db') - return vipDb; - return Reflect.get(target, prop, receiver); - } - }); -} - -var Dexie$1 = (function () { - function Dexie(name, options) { - var _this = this; - this._middlewares = {}; - this.verno = 0; - var deps = Dexie.dependencies; - this._options = options = __assign({ - addons: Dexie.addons, autoOpen: true, - indexedDB: deps.indexedDB, IDBKeyRange: deps.IDBKeyRange, cache: 'cloned' }, options); - this._deps = { - indexedDB: options.indexedDB, - IDBKeyRange: options.IDBKeyRange - }; - var addons = options.addons; - this._dbSchema = {}; - this._versions = []; - this._storeNames = []; - this._allTables = {}; - this.idbdb = null; - this._novip = this; - var state = { - dbOpenError: null, - isBeingOpened: false, - onReadyBeingFired: null, - openComplete: false, - dbReadyResolve: nop, - dbReadyPromise: null, - cancelOpen: nop, - openCanceller: null, - autoSchema: true, - PR1398_maxLoop: 3, - autoOpen: options.autoOpen, - }; - state.dbReadyPromise = new DexiePromise(function (resolve) { - state.dbReadyResolve = resolve; - }); - state.openCanceller = new DexiePromise(function (_, reject) { - state.cancelOpen = reject; - }); - this._state = state; - this.name = name; - this.on = Events(this, "populate", "blocked", "versionchange", "close", { ready: [promisableChain, nop] }); - this.on.ready.subscribe = override(this.on.ready.subscribe, function (subscribe) { - return function (subscriber, bSticky) { - Dexie.vip(function () { - var state = _this._state; - if (state.openComplete) { - if (!state.dbOpenError) - DexiePromise.resolve().then(subscriber); - if (bSticky) - subscribe(subscriber); - } - else if (state.onReadyBeingFired) { - state.onReadyBeingFired.push(subscriber); - if (bSticky) - subscribe(subscriber); - } - else { - subscribe(subscriber); - var db_1 = _this; - if (!bSticky) - subscribe(function unsubscribe() { - db_1.on.ready.unsubscribe(subscriber); - db_1.on.ready.unsubscribe(unsubscribe); - }); - } - }); - }; - }); - this.Collection = createCollectionConstructor(this); - this.Table = createTableConstructor(this); - this.Transaction = createTransactionConstructor(this); - this.Version = createVersionConstructor(this); - this.WhereClause = createWhereClauseConstructor(this); - this.on("versionchange", function (ev) { - if (ev.newVersion > 0) - console.warn("Another connection wants to upgrade database '".concat(_this.name, "'. Closing db now to resume the upgrade.")); - else - console.warn("Another connection wants to delete database '".concat(_this.name, "'. Closing db now to resume the delete request.")); - _this.close({ disableAutoOpen: false }); - }); - this.on("blocked", function (ev) { - if (!ev.newVersion || ev.newVersion < ev.oldVersion) - console.warn("Dexie.delete('".concat(_this.name, "') was blocked")); - else - console.warn("Upgrade '".concat(_this.name, "' blocked by other connection holding version ").concat(ev.oldVersion / 10)); - }); - this._maxKey = getMaxKey(options.IDBKeyRange); - this._createTransaction = function (mode, storeNames, dbschema, parentTransaction) { return new _this.Transaction(mode, storeNames, dbschema, _this._options.chromeTransactionDurability, parentTransaction); }; - this._fireOnBlocked = function (ev) { - _this.on("blocked").fire(ev); - connections - .filter(function (c) { return c.name === _this.name && c !== _this && !c._state.vcFired; }) - .map(function (c) { return c.on("versionchange").fire(ev); }); - }; - this.use(cacheExistingValuesMiddleware); - this.use(cacheMiddleware); - this.use(observabilityMiddleware); - this.use(virtualIndexMiddleware); - this.use(hooksMiddleware); - var vipDB = new Proxy(this, { - get: function (_, prop, receiver) { - if (prop === '_vip') - return true; - if (prop === 'table') - return function (tableName) { return vipify(_this.table(tableName), vipDB); }; - var rv = Reflect.get(_, prop, receiver); - if (rv instanceof Table) - return vipify(rv, vipDB); - if (prop === 'tables') - return rv.map(function (t) { return vipify(t, vipDB); }); - if (prop === '_createTransaction') - return function () { - var tx = rv.apply(this, arguments); - return vipify(tx, vipDB); - }; - return rv; - } - }); - this.vip = vipDB; - addons.forEach(function (addon) { return addon(_this); }); - } - Dexie.prototype.version = function (versionNumber) { - if (isNaN(versionNumber) || versionNumber < 0.1) - throw new exceptions.Type("Given version is not a positive number"); - versionNumber = Math.round(versionNumber * 10) / 10; - if (this.idbdb || this._state.isBeingOpened) - throw new exceptions.Schema("Cannot add version when database is open"); - this.verno = Math.max(this.verno, versionNumber); - var versions = this._versions; - var versionInstance = versions.filter(function (v) { return v._cfg.version === versionNumber; })[0]; - if (versionInstance) - return versionInstance; - versionInstance = new this.Version(versionNumber); - versions.push(versionInstance); - versions.sort(lowerVersionFirst); - versionInstance.stores({}); - this._state.autoSchema = false; - return versionInstance; - }; - Dexie.prototype._whenReady = function (fn) { - var _this = this; - return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new DexiePromise(function (resolve, reject) { - if (_this._state.openComplete) { - return reject(new exceptions.DatabaseClosed(_this._state.dbOpenError)); - } - if (!_this._state.isBeingOpened) { - if (!_this._state.autoOpen) { - reject(new exceptions.DatabaseClosed()); - return; - } - _this.open().catch(nop); - } - _this._state.dbReadyPromise.then(resolve, reject); - }).then(fn); - }; - Dexie.prototype.use = function (_a) { - var stack = _a.stack, create = _a.create, level = _a.level, name = _a.name; - if (name) - this.unuse({ stack: stack, name: name }); - var middlewares = this._middlewares[stack] || (this._middlewares[stack] = []); - middlewares.push({ stack: stack, create: create, level: level == null ? 10 : level, name: name }); - middlewares.sort(function (a, b) { return a.level - b.level; }); - return this; - }; - Dexie.prototype.unuse = function (_a) { - var stack = _a.stack, name = _a.name, create = _a.create; - if (stack && this._middlewares[stack]) { - this._middlewares[stack] = this._middlewares[stack].filter(function (mw) { - return create ? mw.create !== create : - name ? mw.name !== name : - false; - }); - } - return this; - }; - Dexie.prototype.open = function () { - var _this = this; - return usePSD(globalPSD, - function () { return dexieOpen(_this); }); - }; - Dexie.prototype._close = function () { - var state = this._state; - var idx = connections.indexOf(this); - if (idx >= 0) - connections.splice(idx, 1); - if (this.idbdb) { - try { - this.idbdb.close(); - } - catch (e) { } - this.idbdb = null; - } - if (!state.isBeingOpened) { - state.dbReadyPromise = new DexiePromise(function (resolve) { - state.dbReadyResolve = resolve; - }); - state.openCanceller = new DexiePromise(function (_, reject) { - state.cancelOpen = reject; - }); - } - }; - Dexie.prototype.close = function (_a) { - var _b = _a === void 0 ? { disableAutoOpen: true } : _a, disableAutoOpen = _b.disableAutoOpen; - var state = this._state; - if (disableAutoOpen) { - if (state.isBeingOpened) { - state.cancelOpen(new exceptions.DatabaseClosed()); - } - this._close(); - state.autoOpen = false; - state.dbOpenError = new exceptions.DatabaseClosed(); - } - else { - this._close(); - state.autoOpen = this._options.autoOpen || - state.isBeingOpened; - state.openComplete = false; - state.dbOpenError = null; - } - }; - Dexie.prototype.delete = function (closeOptions) { - var _this = this; - if (closeOptions === void 0) { closeOptions = { disableAutoOpen: true }; } - var hasInvalidArguments = arguments.length > 0 && typeof arguments[0] !== 'object'; - var state = this._state; - return new DexiePromise(function (resolve, reject) { - var doDelete = function () { - _this.close(closeOptions); - var req = _this._deps.indexedDB.deleteDatabase(_this.name); - req.onsuccess = wrap(function () { - _onDatabaseDeleted(_this._deps, _this.name); - resolve(); - }); - req.onerror = eventRejectHandler(reject); - req.onblocked = _this._fireOnBlocked; - }; - if (hasInvalidArguments) - throw new exceptions.InvalidArgument("Invalid closeOptions argument to db.delete()"); - if (state.isBeingOpened) { - state.dbReadyPromise.then(doDelete); - } - else { - doDelete(); - } - }); - }; - Dexie.prototype.backendDB = function () { - return this.idbdb; - }; - Dexie.prototype.isOpen = function () { - return this.idbdb !== null; - }; - Dexie.prototype.hasBeenClosed = function () { - var dbOpenError = this._state.dbOpenError; - return dbOpenError && (dbOpenError.name === 'DatabaseClosed'); - }; - Dexie.prototype.hasFailed = function () { - return this._state.dbOpenError !== null; - }; - Dexie.prototype.dynamicallyOpened = function () { - return this._state.autoSchema; - }; - Object.defineProperty(Dexie.prototype, "tables", { - get: function () { - var _this = this; - return keys(this._allTables).map(function (name) { return _this._allTables[name]; }); - }, - enumerable: false, - configurable: true - }); - Dexie.prototype.transaction = function () { - var args = extractTransactionArgs.apply(this, arguments); - return this._transaction.apply(this, args); - }; - Dexie.prototype._transaction = function (mode, tables, scopeFunc) { - var _this = this; - var parentTransaction = PSD.trans; - if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) - parentTransaction = null; - var onlyIfCompatible = mode.indexOf('?') !== -1; - mode = mode.replace('!', '').replace('?', ''); - var idbMode, storeNames; - try { - storeNames = tables.map(function (table) { - var storeName = table instanceof _this.Table ? table.name : table; - if (typeof storeName !== 'string') - throw new TypeError("Invalid table argument to Dexie.transaction(). Only Table or String are allowed"); - return storeName; - }); - if (mode == "r" || mode === READONLY) - idbMode = READONLY; - else if (mode == "rw" || mode == READWRITE) - idbMode = READWRITE; - else - throw new exceptions.InvalidArgument("Invalid transaction mode: " + mode); - if (parentTransaction) { - if (parentTransaction.mode === READONLY && idbMode === READWRITE) { - if (onlyIfCompatible) { - parentTransaction = null; - } - else - throw new exceptions.SubTransaction("Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY"); - } - if (parentTransaction) { - storeNames.forEach(function (storeName) { - if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) { - if (onlyIfCompatible) { - parentTransaction = null; - } - else - throw new exceptions.SubTransaction("Table " + storeName + - " not included in parent transaction."); - } - }); - } - if (onlyIfCompatible && parentTransaction && !parentTransaction.active) { - parentTransaction = null; - } - } - } - catch (e) { - return parentTransaction ? - parentTransaction._promise(null, function (_, reject) { reject(e); }) : - rejection(e); - } - var enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc); - return (parentTransaction ? - parentTransaction._promise(idbMode, enterTransaction, "lock") : - PSD.trans ? - usePSD(PSD.transless, function () { return _this._whenReady(enterTransaction); }) : - this._whenReady(enterTransaction)); - }; - Dexie.prototype.table = function (tableName) { - if (!hasOwn(this._allTables, tableName)) { - throw new exceptions.InvalidTable("Table ".concat(tableName, " does not exist")); - } - return this._allTables[tableName]; - }; - return Dexie; -}()); - -var symbolObservable = typeof Symbol !== "undefined" && "observable" in Symbol - ? Symbol.observable - : "@@observable"; -var Observable = (function () { - function Observable(subscribe) { - this._subscribe = subscribe; - } - Observable.prototype.subscribe = function (x, error, complete) { - return this._subscribe(!x || typeof x === "function" ? { next: x, error: error, complete: complete } : x); - }; - Observable.prototype[symbolObservable] = function () { - return this; - }; - return Observable; -}()); - -var domDeps; -try { - domDeps = { - indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB, - IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange - }; -} -catch (e) { - domDeps = { indexedDB: null, IDBKeyRange: null }; -} - -function liveQuery(querier) { - var hasValue = false; - var currentValue; - var observable = new Observable(function (observer) { - var scopeFuncIsAsync = isAsyncFunction(querier); - function execute(ctx) { - var wasRootExec = beginMicroTickScope(); - try { - if (scopeFuncIsAsync) { - incrementExpectedAwaits(); - } - var rv = newScope(querier, ctx); - if (scopeFuncIsAsync) { - rv = rv.finally(decrementExpectedAwaits); - } - return rv; - } - finally { - wasRootExec && endMicroTickScope(); - } - } - var closed = false; - var abortController; - var accumMuts = {}; - var currentObs = {}; - var subscription = { - get closed() { - return closed; - }, - unsubscribe: function () { - if (closed) - return; - closed = true; - if (abortController) - abortController.abort(); - if (startedListening) - globalEvents.storagemutated.unsubscribe(mutationListener); - }, - }; - observer.start && observer.start(subscription); - var startedListening = false; - var doQuery = function () { return execInGlobalContext(_doQuery); }; - function shouldNotify() { - return obsSetsOverlap(currentObs, accumMuts); - } - var mutationListener = function (parts) { - extendObservabilitySet(accumMuts, parts); - if (shouldNotify()) { - doQuery(); - } - }; - var _doQuery = function () { - if (closed || - !domDeps.indexedDB) - { - return; - } - accumMuts = {}; - var subscr = {}; - if (abortController) - abortController.abort(); - abortController = new AbortController(); - var ctx = { - subscr: subscr, - signal: abortController.signal, - requery: doQuery, - querier: querier, - trans: null - }; - var ret = execute(ctx); - Promise.resolve(ret).then(function (result) { - hasValue = true; - currentValue = result; - if (closed || ctx.signal.aborted) { - return; - } - accumMuts = {}; - currentObs = subscr; - if (!objectIsEmpty(currentObs) && !startedListening) { - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener); - startedListening = true; - } - execInGlobalContext(function () { return !closed && observer.next && observer.next(result); }); - }, function (err) { - hasValue = false; - if (!['DatabaseClosedError', 'AbortError'].includes(err === null || err === void 0 ? void 0 : err.name)) { - if (!closed) - execInGlobalContext(function () { - if (closed) - return; - observer.error && observer.error(err); - }); - } - }); - }; - setTimeout(doQuery, 0); - return subscription; - }); - observable.hasValue = function () { return hasValue; }; - observable.getValue = function () { return currentValue; }; - return observable; -} - -var Dexie = Dexie$1; -props(Dexie, __assign(__assign({}, fullNameExceptions), { - delete: function (databaseName) { - var db = new Dexie(databaseName, { addons: [] }); - return db.delete(); - }, - exists: function (name) { - return new Dexie(name, { addons: [] }).open().then(function (db) { - db.close(); - return true; - }).catch('NoSuchDatabaseError', function () { return false; }); - }, - getDatabaseNames: function (cb) { - try { - return getDatabaseNames(Dexie.dependencies).then(cb); - } - catch (_a) { - return rejection(new exceptions.MissingAPI()); - } - }, - defineClass: function () { - function Class(content) { - extend(this, content); - } - return Class; - }, ignoreTransaction: function (scopeFunc) { - return PSD.trans ? - usePSD(PSD.transless, scopeFunc) : - scopeFunc(); - }, vip: vip, async: function (generatorFn) { - return function () { - try { - var rv = awaitIterator(generatorFn.apply(this, arguments)); - if (!rv || typeof rv.then !== 'function') - return DexiePromise.resolve(rv); - return rv; - } - catch (e) { - return rejection(e); - } - }; - }, spawn: function (generatorFn, args, thiz) { - try { - var rv = awaitIterator(generatorFn.apply(thiz, args || [])); - if (!rv || typeof rv.then !== 'function') - return DexiePromise.resolve(rv); - return rv; - } - catch (e) { - return rejection(e); - } - }, - currentTransaction: { - get: function () { return PSD.trans || null; } - }, waitFor: function (promiseOrFunction, optionalTimeout) { - var promise = DexiePromise.resolve(typeof promiseOrFunction === 'function' ? - Dexie.ignoreTransaction(promiseOrFunction) : - promiseOrFunction) - .timeout(optionalTimeout || 60000); - return PSD.trans ? - PSD.trans.waitFor(promise) : - promise; - }, - Promise: DexiePromise, - debug: { - get: function () { return debug; }, - set: function (value) { - setDebug(value); - } - }, - derive: derive, extend: extend, props: props, override: override, - Events: Events, on: globalEvents, liveQuery: liveQuery, extendObservabilitySet: extendObservabilitySet, - getByKeyPath: getByKeyPath, setByKeyPath: setByKeyPath, delByKeyPath: delByKeyPath, shallowClone: shallowClone, deepClone: deepClone, getObjectDiff: getObjectDiff, cmp: cmp, asap: asap$1, - minKey: minKey, - addons: [], - connections: connections, - errnames: errnames, - dependencies: domDeps, cache: cache, - semVer: DEXIE_VERSION, version: DEXIE_VERSION.split('.') - .map(function (n) { return parseInt(n); }) - .reduce(function (p, c, i) { return p + (c / Math.pow(10, i * 2)); }) })); -Dexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange); - -if (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') { - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (updatedParts) { - if (!propagatingLocally) { - var event_1; - event_1 = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, { - detail: updatedParts - }); - propagatingLocally = true; - dispatchEvent(event_1); - propagatingLocally = false; - } - }); - addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, function (_a) { - var detail = _a.detail; - if (!propagatingLocally) { - propagateLocally(detail); - } - }); -} -function propagateLocally(updateParts) { - var wasMe = propagatingLocally; - try { - propagatingLocally = true; - globalEvents.storagemutated.fire(updateParts); - signalSubscribersNow(updateParts, true); - } - finally { - propagatingLocally = wasMe; - } -} -var propagatingLocally = false; - -var bc; -var createBC = function () { }; -if (typeof BroadcastChannel !== 'undefined') { - createBC = function () { - bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME); - bc.onmessage = function (ev) { return ev.data && propagateLocally(ev.data); }; - }; - createBC(); - if (typeof bc.unref === 'function') { - bc.unref(); - } - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (changedParts) { - if (!propagatingLocally) { - bc.postMessage(changedParts); - } - }); -} - -if (typeof addEventListener !== 'undefined') { - addEventListener('pagehide', function (event) { - if (!Dexie$1.disableBfCache && event.persisted) { - if (debug) - console.debug('Dexie: handling persisted pagehide'); - bc === null || bc === void 0 ? void 0 : bc.close(); - for (var _i = 0, connections_1 = connections; _i < connections_1.length; _i++) { - var db = connections_1[_i]; - db.close({ disableAutoOpen: false }); - } - } - }); - addEventListener('pageshow', function (event) { - if (!Dexie$1.disableBfCache && event.persisted) { - if (debug) - console.debug('Dexie: handling persisted pageshow'); - createBC(); - propagateLocally({ all: new RangeSet(-Infinity, [[]]) }); - } - }); -} - -function add(value) { - return new PropModification({ add: value }); -} - -function remove(value) { - return new PropModification({ remove: value }); -} - -function replacePrefix(a, b) { - return new PropModification({ replacePrefix: [a, b] }); -} - -DexiePromise.rejectionMapper = mapError; -setDebug(debug); - -export { Dexie$1 as Dexie, Entity, PropModSymbol, PropModification, RangeSet, add, cmp, Dexie$1 as default, liveQuery, mergeRanges, rangesOverlap, remove, replacePrefix }; -//# sourceMappingURL=dexie.mjs.map diff --git a/src/dexie/dist/dexie.mjs.map b/src/dexie/dist/dexie.mjs.map deleted file mode 100644 index ad2b2acf2..000000000 --- a/src/dexie/dist/dexie.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dexie.mjs","sources":["../node_modules/.pnpm/tslib@2.3.1/node_modules/tslib/tslib.es6.js","../src/globals/global.ts","../src/functions/utils.ts","../src/errors/errors.js","../src/functions/chaining-functions.js","../src/helpers/debug.ts","../src/helpers/promise.js","../src/functions/temp-transaction.ts","../src/globals/constants.ts","../src/functions/combine.ts","../src/dbcore/keyrange.ts","../src/functions/workaround-undefined-primkey.ts","../src/classes/entity/Entity.ts","../src/functions/cmp.ts","../src/classes/table/table.ts","../src/helpers/Events.js","../src/functions/make-class-constructor.ts","../src/classes/table/table-constructor.ts","../src/classes/collection/collection-helpers.ts","../src/helpers/prop-modification.ts","../src/classes/collection/collection.ts","../src/classes/collection/collection-constructor.ts","../src/functions/compare-functions.ts","../src/classes/where-clause/where-clause-helpers.ts","../src/classes/where-clause/where-clause.ts","../src/classes/where-clause/where-clause-constructor.ts","../src/functions/event-wrappers.ts","../src/globals/global-events.ts","../src/classes/transaction/transaction.ts","../src/classes/transaction/transaction-constructor.ts","../src/helpers/index-spec.ts","../src/helpers/table-schema.ts","../src/functions/quirks.ts","../src/dbcore/get-key-extractor.ts","../src/dbcore/dbcore-indexeddb.ts","../src/classes/dexie/generate-middleware-stacks.ts","../src/classes/version/schema-helpers.ts","../src/classes/version/version.ts","../src/classes/version/version-constructor.ts","../src/helpers/database-enumerator.ts","../src/classes/dexie/vip.ts","../node_modules/.pnpm/safari-14-idb-fix@3.0.0/node_modules/safari-14-idb-fix/dist/index.js","../src/helpers/rangeset.ts","../src/live-query/extend-observability-set.ts","../src/live-query/obs-sets-overlap.ts","../src/live-query/cache/cache.ts","../src/live-query/cache/signalSubscribers.ts","../src/classes/dexie/dexie-open.ts","../src/helpers/yield-support.ts","../src/classes/dexie/transaction-helpers.ts","../src/dbcore/virtual-index-middleware.ts","../src/functions/get-object-diff.ts","../src/dbcore/get-effective-keys.ts","../src/hooks/hooks-middleware.ts","../src/dbcore/cache-existing-values-middleware.ts","../src/live-query/cache/is-cachable-context.ts","../src/live-query/cache/is-cachable-request.ts","../src/live-query/observability-middleware.ts","../src/live-query/cache/adjust-optimistic-request-from-failures.ts","../src/live-query/cache/is-within-range.ts","../src/live-query/cache/apply-optimistic-ops.ts","../src/live-query/cache/are-ranges-equal.ts","../src/live-query/cache/is-super-range.ts","../src/live-query/cache/find-compatible-query.ts","../src/live-query/cache/subscribe-cachentry.ts","../src/live-query/cache/cache-middleware.ts","../src/helpers/vipify.ts","../src/classes/dexie/dexie.ts","../src/classes/observable/observable.ts","../src/classes/dexie/dexie-dom-dependencies.ts","../src/live-query/live-query.ts","../src/classes/dexie/dexie-static-props.ts","../src/live-query/propagate-locally.ts","../src/live-query/enable-broadcast.ts","../src/support-bfcache.ts","../src/functions/propmods/add.ts","../src/functions/propmods/remove.ts","../src/functions/propmods/replace-prefix.ts","../src/index.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","declare var global;\nexport const _global: any =\n typeof globalThis !== 'undefined' ? globalThis :\n typeof self !== 'undefined' ? self :\n typeof window !== 'undefined' ? window :\n global;\n","import { _global } from \"../globals/global\";\nexport const keys = Object.keys;\nexport const isArray = Array.isArray;\nif (typeof Promise !== 'undefined' && !_global.Promise){\n // In jsdom, this it can be the case that Promise is not put on the global object.\n // If so, we need to patch the global object for the rest of the code to work as expected.\n // Other dexie code expects Promise to be on the global object (like normal browser environments)\n _global.Promise = Promise;\n}\nexport { _global }\n\nexport function extend(obj: T, extension: X): T & X {\n if (typeof extension !== 'object') return obj as T & X;\n keys(extension).forEach(function (key) {\n obj[key] = extension[key];\n });\n return obj as T & X;\n}\n\nexport const getProto = Object.getPrototypeOf;\nexport const _hasOwn = {}.hasOwnProperty;\nexport function hasOwn(obj, prop) {\n return _hasOwn.call(obj, prop);\n}\n\nexport function props (proto, extension) {\n if (typeof extension === 'function') extension = extension(getProto(proto));\n (typeof Reflect === \"undefined\" ? keys : Reflect.ownKeys)(extension).forEach(key => {\n setProp(proto, key, extension[key]);\n });\n}\n\nexport const defineProperty = Object.defineProperty;\n\nexport function setProp(obj, prop, functionOrGetSet, options?) {\n defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, \"get\") && typeof functionOrGetSet.get === 'function' ?\n {get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true} :\n {value: functionOrGetSet, configurable: true, writable: true}, options));\n}\n\nexport function derive(Child) {\n return {\n from: function (Parent) {\n Child.prototype = Object.create(Parent.prototype);\n setProp(Child.prototype, \"constructor\", Child);\n return {\n extend: props.bind(null, Child.prototype)\n };\n }\n };\n}\n\nexport const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nexport function getPropertyDescriptor(obj, prop) {\n const pd = getOwnPropertyDescriptor(obj, prop);\n let proto;\n return pd || (proto = getProto(obj)) && getPropertyDescriptor (proto, prop);\n}\n\nconst _slice = [].slice;\nexport function slice(args, start?, end?) {\n return _slice.call(args, start, end);\n}\n\nexport function override(origFunc, overridedFactory) {\n return overridedFactory(origFunc);\n}\n\nexport function assert (b) {\n if (!b) throw new Error(\"Assertion Failed\");\n}\n\nexport function asap(fn) {\n // @ts-ignore\n if (_global.setImmediate) setImmediate(fn); else setTimeout(fn, 0);\n}\n\nexport function getUniqueArray(a) {\n return a.filter((value, index, self) => self.indexOf(value) === index);\n}\n\n/** Generate an object (hash map) based on given array.\n * @param extractor Function taking an array item and its index and returning an array of 2 items ([key, value]) to\n * instert on the resulting object for each item in the array. If this function returns a falsy value, the\n * current item wont affect the resulting object.\n */\nexport function arrayToObject (array: T[], extractor: (x:T, idx: number)=>[string, R]): {[name: string]: R} {\n return array.reduce((result, item, i) => {\n var nameAndValue = extractor(item, i);\n if (nameAndValue) result[nameAndValue[0]] = nameAndValue[1];\n return result;\n }, {});\n}\n\nexport function trycatcher(fn, reject) {\n return function () {\n try {\n fn.apply(this, arguments);\n } catch (e) {\n reject(e);\n }\n };\n}\n\nexport function tryCatch(fn: (...args: any[])=>void, onerror, args?) : void {\n try {\n fn.apply(null, args);\n } catch (ex) {\n onerror && onerror(ex);\n }\n}\n\nexport function getByKeyPath(obj, keyPath) {\n // http://www.w3.org/TR/IndexedDB/#steps-for-extracting-a-key-from-a-value-using-a-key-path\n if (typeof keyPath === 'string' && hasOwn(obj, keyPath)) return obj[keyPath]; // This line is moved from last to first for optimization purpose.\n if (!keyPath) return obj;\n if (typeof keyPath !== 'string') {\n var rv = [];\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n var val = getByKeyPath(obj, keyPath[i]);\n rv.push(val);\n }\n return rv;\n }\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var innerObj = obj[keyPath.substr(0, period)];\n return innerObj == null ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1));\n }\n return undefined;\n}\n\nexport function setByKeyPath(obj, keyPath, value) {\n if (!obj || keyPath === undefined) return;\n if ('isFrozen' in Object && Object.isFrozen(obj)) return;\n if (typeof keyPath !== 'string' && 'length' in keyPath) {\n assert(typeof value !== 'string' && 'length' in value);\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n setByKeyPath(obj, keyPath[i], value[i]);\n }\n } else {\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var currentKeyPath = keyPath.substr(0, period);\n var remainingKeyPath = keyPath.substr(period + 1);\n if (remainingKeyPath === \"\")\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) obj.splice(currentKeyPath, 1);\n else delete obj[currentKeyPath];\n } else obj[currentKeyPath] = value;\n else {\n var innerObj = obj[currentKeyPath];\n if (!innerObj || !hasOwn(obj, currentKeyPath)) innerObj = (obj[currentKeyPath] = {});\n setByKeyPath(innerObj, remainingKeyPath, value);\n }\n } else {\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(keyPath))) obj.splice(keyPath, 1);\n else delete obj[keyPath];\n } else obj[keyPath] = value;\n }\n }\n}\n\nexport function delByKeyPath(obj, keyPath) {\n if (typeof keyPath === 'string')\n setByKeyPath(obj, keyPath, undefined);\n else if ('length' in keyPath)\n [].map.call(keyPath, function(kp) {\n setByKeyPath(obj, kp, undefined);\n });\n}\n\nexport function shallowClone(obj) {\n var rv = {};\n for (var m in obj) {\n if (hasOwn(obj, m)) rv[m] = obj[m];\n }\n return rv;\n}\n\nconst concat = [].concat;\nexport function flatten (a: (T | T[])[]) : T[] {\n return concat.apply([], a);\n}\n\n//https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm\nconst intrinsicTypeNames =\n \"BigUint64Array,BigInt64Array,Array,Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,FileSystemDirectoryHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey\"\n .split(',').concat(\n flatten([8,16,32,64].map(num=>[\"Int\",\"Uint\",\"Float\"].map(t=>t+num+\"Array\")))\n ).filter(t=>_global[t]);\nconst intrinsicTypes = new Set(intrinsicTypeNames.map(t=>_global[t]));\n\n/** Deep clone a simple object tree.\n * \n * Copies object tree deeply, but does not deep-copy arrays,\n * typed arrays, Dates or other intrinsic types.\n * \n * Does not check for cyclic references.\n * \n * This function is 6 times faster than structuredClone() on chromium 111.\n * \n * This function can safely be used for cloning ObservabilitySets and RangeSets.\n * \n * @param o Object to clone\n * @returns Cloned object\n */\nexport function cloneSimpleObjectTree(o: T): T {\n const rv = {} as T;\n for (const k in o) if (hasOwn(o, k)) {\n const v = o[k];\n rv[k] = !v || typeof v !== 'object' || intrinsicTypes.has(v.constructor) ? v : cloneSimpleObjectTree(v);\n }\n return rv;\n}\n\nexport function objectIsEmpty(o: object) {\n for (const k in o) if (hasOwn(o, k)) return false;\n return true;\n}\n\nlet circularRefs: null | WeakMap = null;\n\n/** Deep clone an object or array.\n * \n * \n * @param any \n * @returns \n */\nexport function deepClone(any: T): T {\n circularRefs = new WeakMap();\n const rv = innerDeepClone(any);\n circularRefs = null;\n return rv;\n}\n\nfunction innerDeepClone(x: T): T {\n if (!x || typeof x !== 'object') return x;\n let rv = circularRefs.get(x); // Resolve circular references\n if (rv) return rv;\n if (isArray(x)) {\n rv = [];\n circularRefs.set(x, rv);\n for (var i = 0, l = x.length; i < l; ++i) {\n rv.push(innerDeepClone(x[i]));\n }\n } else if (intrinsicTypes.has(x.constructor)) {\n // For performance, we're less strict than structuredClone - we're only\n // cloning arrays and custom objects.\n // Typed arrays, Dates etc are not cloned.\n rv = x;\n } else {\n // We're nicer to custom classes than what structuredClone() is -\n // we preserve the proto of each object.\n const proto = getProto(x);\n rv = proto === Object.prototype ? {} : Object.create(proto);\n circularRefs.set(x, rv);\n for (var prop in x) {\n if (hasOwn(x, prop)) {\n rv[prop] = innerDeepClone(x[prop]);\n }\n }\n }\n return rv;\n}\n\nconst {toString} = {};\nexport function toStringTag(o: Object) {\n return toString.call(o).slice(8, -1);\n}\n\n// If first argument is iterable or array-like, return it as an array\nexport const iteratorSymbol = typeof Symbol !== 'undefined' ?\n Symbol.iterator :\n '@@iterator';\nexport const getIteratorOf = typeof iteratorSymbol === \"symbol\" ? function(x) {\n var i;\n return x != null && (i = x[iteratorSymbol]) && i.apply(x);\n} : function () { return null; };\nexport const asyncIteratorSymbol = typeof Symbol !== 'undefined'\n ? Symbol.asyncIterator || Symbol.for(\"Symbol.asyncIterator\")\n : '@asyncIterator';\n\nexport function delArrayItem(a: any[], x: any) {\n const i = a.indexOf(x);\n if (i >= 0) a.splice(i, 1);\n return i >= 0;\n}\n\nexport const NO_CHAR_ARRAY = {};\n// Takes one or several arguments and returns an array based on the following criteras:\n// * If several arguments provided, return arguments converted to an array in a way that\n// still allows javascript engine to optimize the code.\n// * If single argument is an array, return a clone of it.\n// * If this-pointer equals NO_CHAR_ARRAY, don't accept strings as valid iterables as a special\n// case to the two bullets below.\n// * If single argument is an iterable, convert it to an array and return the resulting array.\n// * If single argument is array-like (has length of type number), convert it to an array.\nexport function getArrayOf (arrayLike) {\n var i, a, x, it;\n if (arguments.length === 1) {\n if (isArray(arrayLike)) return arrayLike.slice();\n if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') return [arrayLike];\n if ((it = getIteratorOf(arrayLike))) {\n a = [];\n while ((x = it.next()), !x.done) a.push(x.value);\n return a;\n }\n if (arrayLike == null) return [arrayLike];\n i = arrayLike.length;\n if (typeof i === 'number') {\n a = new Array(i);\n while (i--) a[i] = arrayLike[i];\n return a;\n }\n return [arrayLike];\n }\n i = arguments.length;\n a = new Array(i);\n while (i--) a[i] = arguments[i];\n return a;\n}\nexport const isAsyncFunction = typeof Symbol !== 'undefined'\n ? (fn: Function) => fn[Symbol.toStringTag] === 'AsyncFunction'\n : ()=>false;\n","import { derive, setProp } from '../functions/utils';\n\nvar dexieErrorNames = [\n 'Modify',\n 'Bulk',\n 'OpenFailed',\n 'VersionChange',\n 'Schema',\n 'Upgrade',\n 'InvalidTable',\n 'MissingAPI',\n 'NoSuchDatabase',\n 'InvalidArgument',\n 'SubTransaction',\n 'Unsupported',\n 'Internal',\n 'DatabaseClosed',\n 'PrematureCommit',\n 'ForeignAwait'\n];\n\nvar idbDomErrorNames = [\n 'Unknown',\n 'Constraint',\n 'Data',\n 'TransactionInactive',\n 'ReadOnly',\n 'Version',\n 'NotFound',\n 'InvalidState',\n 'InvalidAccess',\n 'Abort',\n 'Timeout',\n 'QuotaExceeded',\n 'Syntax',\n 'DataClone'\n];\n\nvar errorList = dexieErrorNames.concat(idbDomErrorNames);\n\nvar defaultTexts = {\n VersionChanged: \"Database version changed by other database connection\",\n DatabaseClosed: \"Database has been closed\",\n Abort: \"Transaction aborted\",\n TransactionInactive: \"Transaction has already completed or failed\",\n MissingAPI: \"IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb\"\n};\n\n//\n// DexieError - base class of all out exceptions.\n//\nexport function DexieError (name, msg) {\n // Reason we don't use ES6 classes is because:\n // 1. It bloats transpiled code and increases size of minified code.\n // 2. It doesn't give us much in this case.\n // 3. It would require sub classes to call super(), which\n // is not needed when deriving from Error.\n this.name = name;\n this.message = msg;\n}\n\nderive(DexieError).from(Error).extend({\n toString: function(){ return this.name + \": \" + this.message; }\n});\n\nfunction getMultiErrorMessage (msg, failures) {\n return msg + \". Errors: \" + Object.keys(failures)\n .map(key=>failures[key].toString())\n .filter((v,i,s)=>s.indexOf(v) === i) // Only unique error strings\n .join('\\n');\n}\n\n//\n// ModifyError - thrown in Collection.modify()\n// Specific constructor because it contains members failures and failedKeys.\n//\nexport function ModifyError (msg, failures, successCount, failedKeys) {\n this.failures = failures;\n this.failedKeys = failedKeys;\n this.successCount = successCount;\n this.message = getMultiErrorMessage(msg, failures);\n}\nderive(ModifyError).from(DexieError);\n\nexport function BulkError (msg, failures) {\n this.name = \"BulkError\";\n this.failures = Object.keys(failures).map(pos => failures[pos]);\n this.failuresByPos = failures;\n this.message = getMultiErrorMessage(msg, this.failures);\n}\nderive(BulkError).from(DexieError);\n\n//\n//\n// Dynamically generate error names and exception classes based\n// on the names in errorList.\n//\n//\n\n// Map of {ErrorName -> ErrorName + \"Error\"}\nexport var errnames = errorList.reduce((obj,name)=>(obj[name]=name+\"Error\",obj),{});\n\n// Need an alias for DexieError because we're gonna create subclasses with the same name.\nconst BaseException = DexieError;\n// Map of {ErrorName -> exception constructor}\nexport var exceptions = errorList.reduce((obj,name)=>{\n // Let the name be \"DexieError\" because this name may\n // be shown in call stack and when debugging. DexieError is\n // the most true name because it derives from DexieError,\n // and we cannot change Function.name programatically without\n // dynamically create a Function object, which would be considered\n // 'eval-evil'.\n var fullName = name + \"Error\";\n function DexieError (msgOrInner, inner){\n this.name = fullName;\n if (!msgOrInner) {\n this.message = defaultTexts[name] || fullName;\n this.inner = null;\n } else if (typeof msgOrInner === 'string') {\n this.message = `${msgOrInner}${!inner ? '' : '\\n ' + inner}`;\n this.inner = inner || null;\n } else if (typeof msgOrInner === 'object') {\n this.message = `${msgOrInner.name} ${msgOrInner.message}`;\n this.inner = msgOrInner;\n }\n }\n derive(DexieError).from(BaseException);\n obj[name]=DexieError;\n return obj;\n},{});\n\n// Use ECMASCRIPT standard exceptions where applicable:\nexceptions.Syntax = SyntaxError;\nexceptions.Type = TypeError;\nexceptions.Range = RangeError;\n\nexport var exceptionMap = idbDomErrorNames.reduce((obj, name)=>{\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nexport function mapError (domError, message) {\n if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name])\n return domError;\n var rv = new exceptionMap[domError.name](message || domError.message, domError);\n if (\"stack\" in domError) {\n // Derive stack from inner exception if it has a stack\n setProp(rv, \"stack\", {get: function(){\n return this.inner.stack;\n }});\n }\n return rv;\n}\n\nexport var fullNameExceptions = errorList.reduce((obj, name)=>{\n if ([\"Syntax\",\"Type\",\"Range\"].indexOf(name) === -1)\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nfullNameExceptions.ModifyError = ModifyError;\nfullNameExceptions.DexieError = DexieError;\nfullNameExceptions.BulkError = BulkError;\n","import {extend} from './utils';\n\nexport function nop() { }\nexport function mirror(val) { return val; }\nexport function pureFunctionChain(f1, f2) {\n // Enables chained events that takes ONE argument and returns it to the next function in chain.\n // This pattern is used in the hook(\"reading\") event.\n if (f1 == null || f1 === mirror) return f2;\n return function (val) {\n return f2(f1(val));\n };\n}\n\nexport function callBoth(on1, on2) {\n return function () {\n on1.apply(this, arguments);\n on2.apply(this, arguments);\n };\n}\n\nexport function hookCreatingChain(f1, f2) {\n // Enables chained events that takes several arguments and may modify first argument by making a modification and then returning the same instance.\n // This pattern is used in the hook(\"creating\") event.\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res !== undefined) arguments[0] = res;\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res2 !== undefined ? res2 : res;\n };\n}\n\nexport function hookDeletingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = this.onerror = null;\n f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n };\n}\n\nexport function hookUpdatingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function (modifications) {\n var res = f1.apply(this, arguments);\n extend(modifications, res); // If f1 returns new modifications, extend caller's modifications with the result before calling next in chain.\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res === undefined ?\n (res2 === undefined ? undefined : res2) :\n (extend(res, res2));\n };\n}\n\nexport function reverseStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n if (f2.apply(this, arguments) === false) return false;\n return f1.apply(this, arguments);\n };\n}\n\nexport function nonStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n f2.apply(this, arguments);\n };\n}\n\nexport function promisableChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res && typeof res.then === 'function') {\n var thiz = this,\n i = arguments.length,\n args = new Array(i);\n while (i--) args[i] = arguments[i];\n return res.then(function () {\n return f2.apply(thiz, args);\n });\n }\n return f2.apply(this, arguments);\n };\n}\n","// By default, debug will be true only if platform is a web platform and its page is served from localhost.\n// When debug = true, error's stacks will contain asyncronic long stacks.\nexport var debug = typeof location !== 'undefined' &&\n // By default, use debug mode if served from localhost.\n /^(http|https):\\/\\/(localhost|127\\.0\\.0\\.1)/.test(location.href);\n\nexport function setDebug(value, filter) {\n debug = value;\n}\n\nexport function deprecated (what: string, fn: (...args)=>T) {\n return function () {\n console.warn(`${what} is deprecated. See https://dexie.org/docs/Deprecations}`);\n return fn.apply(this, arguments);\n } as (...args)=>T\n}\n","/*\n * Copyright (c) 2014-2017 David Fahlander\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/LICENSE-2.0\n */\nimport { _global } from '../globals/global';\nimport {tryCatch, props, setProp,\n getPropertyDescriptor, getArrayOf, extend, getProto} from '../functions/utils';\nimport {nop, callBoth, mirror} from '../functions/chaining-functions';\nimport {debug} from './debug';\nimport {exceptions} from '../errors';\n\n//\n// Promise and Zone (PSD) for Dexie library\n//\n// I started out writing this Promise class by copying promise-light (https://github.com/taylorhakes/promise-light) by\n// https://github.com/taylorhakes - an A+ and ECMASCRIPT 6 compliant Promise implementation.\n//\n// In previous versions this was fixed by not calling setTimeout when knowing that the resolve() or reject() came from another\n// tick. In Dexie v1.4.0, I've rewritten the Promise class entirely. Just some fragments of promise-light is left. I use\n// another strategy now that simplifies everything a lot: to always execute callbacks in a new micro-task, but have an own micro-task\n// engine that is indexedDB compliant across all browsers.\n// Promise class has also been optimized a lot with inspiration from bluebird - to avoid closures as much as possible.\n//\n// Specific non-standard features of this Promise class:\n// * Custom zone support (a.k.a. PSD) with ability to keep zones also when using native promises as well as\n// native async / await.\n// * Promise.follow() method built upon the custom zone engine, that allows user to track all promises created from current stack frame\n// and below + all promises that those promises creates or awaits.\n// * Detect any unhandled promise in a PSD-scope (PSD.onunhandled). \n//\n// David Fahlander, https://github.com/dfahlander\n//\n\n// Just a pointer that only this module knows about.\n// Used in Promise constructor to emulate a private constructor.\nvar INTERNAL = {};\n\nconst\n ZONE_ECHO_LIMIT = 100,\n [resolvedNativePromise, nativePromiseProto, resolvedGlobalPromise] = typeof Promise === 'undefined' ?\n [] :\n (()=>{\n let globalP = Promise.resolve();\n if (typeof crypto === 'undefined' || !crypto.subtle)\n return [globalP, getProto(globalP), globalP];\n // Generate a native promise (as window.Promise may have been patched)\n const nativeP = crypto.subtle.digest(\"SHA-512\", new Uint8Array([0]));\n return [\n nativeP,\n getProto(nativeP),\n globalP\n ];\n })(),\n nativePromiseThen = nativePromiseProto && nativePromiseProto.then;\n\nexport const NativePromise = resolvedNativePromise && resolvedNativePromise.constructor;\nconst patchGlobalPromise = !!resolvedGlobalPromise;\n\n/* The default function used only for the very first promise in a promise chain.\n As soon as then promise is resolved or rejected, all next tasks will be executed in micro ticks\n emulated in this module. For indexedDB compatibility, this means that every method needs to \n execute at least one promise before doing an indexedDB operation. Dexie will always call \n db.ready().then() for every operation to make sure the indexedDB event is started in an\n indexedDB-compatible emulated micro task loop.\n*/\nfunction schedulePhysicalTick() {\n queueMicrotask(physicalTick);\n}\n\n// Configurable through Promise.scheduler.\n// Don't export because it would be unsafe to let unknown\n// code call it unless they do try..catch within their callback.\n// This function can be retrieved through getter of Promise.scheduler though,\n// but users must not do Promise.scheduler = myFuncThatThrowsException\nvar asap = function (callback, args) {\n microtickQueue.push([callback, args]);\n if (needsNewPhysicalTick) {\n schedulePhysicalTick();\n needsNewPhysicalTick = false;\n }\n};\n\nvar isOutsideMicroTick = true, // True when NOT in a virtual microTick.\n needsNewPhysicalTick = true, // True when a push to microtickQueue must also schedulePhysicalTick()\n unhandledErrors = [], // Rejected promises that has occured. Used for triggering 'unhandledrejection'.\n rejectingErrors = [], // Tracks if errors are being re-rejected during onRejected callback.\n rejectionMapper = mirror; // Remove in next major when removing error mapping of DOMErrors and DOMExceptions\n \nexport var globalPSD = {\n id: 'global',\n global: true,\n ref: 0,\n unhandleds: [],\n onunhandled: nop,\n pgp: false,\n env: {},\n finalize: nop\n};\n\nexport var PSD = globalPSD;\n\nexport var microtickQueue = []; // Callbacks to call in this or next physical tick.\nexport var numScheduledCalls = 0; // Number of listener-calls left to do in this physical tick.\nexport var tickFinalizers = []; // Finalizers to call when there are no more async calls scheduled within current physical tick.\n\nexport default function DexiePromise(fn) {\n if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); \n this._listeners = [];\n \n // A library may set `promise._lib = true;` after promise is created to make resolve() or reject()\n // execute the microtask engine implicitely within the call to resolve() or reject().\n // To remain A+ compliant, a library must only set `_lib=true` if it can guarantee that the stack\n // only contains library code when calling resolve() or reject().\n // RULE OF THUMB: ONLY set _lib = true for promises explicitely resolving/rejecting directly from\n // global scope (event handler, timer etc)!\n this._lib = false;\n // Current async scope\n var psd = (this._PSD = PSD);\n \n if (typeof fn !== 'function') {\n if (fn !== INTERNAL) throw new TypeError('Not a function');\n // Private constructor (INTERNAL, state, value).\n // Used internally by Promise.resolve() and Promise.reject().\n this._state = arguments[1];\n this._value = arguments[2];\n if (this._state === false)\n handleRejection(this, this._value); // Map error, set stack and addPossiblyUnhandledError().\n return;\n }\n \n this._state = null; // null (=pending), false (=rejected) or true (=resolved)\n this._value = null; // error or result\n ++psd.ref; // Refcounting current scope\n executePromiseTask(this, fn);\n}\n\n// Prepare a property descriptor to put onto Promise.prototype.then\nconst thenProp = {\n get: function() {\n var psd = PSD, microTaskId = totalEchoes;\n\n function then (onFulfilled, onRejected) {\n var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes);\n const cleanup = possibleAwait && !decrementExpectedAwaits();\n var rv = new DexiePromise((resolve, reject) => {\n propagateToListener(this, new Listener(\n nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup),\n nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup),\n resolve,\n reject,\n psd));\n });\n if (this._consoleTask) rv._consoleTask = this._consoleTask;\n return rv;\n }\n\n then.prototype = INTERNAL; // For idempotense, see setter below.\n\n return then;\n },\n // Be idempotent and allow another framework (such as zone.js or another instance of a Dexie.Promise module) to replace Promise.prototype.then\n // and when that framework wants to restore the original property, we must identify that and restore the original property descriptor.\n set: function (value) {\n setProp (this, 'then', value && value.prototype === INTERNAL ?\n thenProp : // Restore to original property descriptor.\n {\n get: function(){\n return value; // Getter returning provided value (behaves like value is just changed)\n },\n set: thenProp.set // Keep a setter that is prepared to restore original.\n }\n );\n }\n};\n\nprops(DexiePromise.prototype, {\n then: thenProp, // Defined above.\n _then: function (onFulfilled, onRejected) {\n // A little tinier version of then() that don't have to create a resulting promise.\n propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); \n },\n\n catch: function (onRejected) {\n if (arguments.length === 1) return this.then(null, onRejected);\n // First argument is the Error type to catch\n var type = arguments[0],\n handler = arguments[1];\n return typeof type === 'function' ? this.then(null, err =>\n // Catching errors by its constructor type (similar to java / c++ / c#)\n // Sample: promise.catch(TypeError, function (e) { ... });\n err instanceof type ? handler(err) : PromiseReject(err))\n : this.then(null, err =>\n // Catching errors by the error.name property. Makes sense for indexedDB where error type\n // is always DOMError but where e.name tells the actual error type.\n // Sample: promise.catch('ConstraintError', function (e) { ... });\n err && err.name === type ? handler(err) : PromiseReject(err));\n },\n\n finally: function (onFinally) {\n return this.then(value => {\n return DexiePromise.resolve(onFinally()).then(()=>value);\n }, err => {\n return DexiePromise.resolve(onFinally()).then(()=>PromiseReject(err));\n });\n },\n \n timeout: function (ms, msg) {\n return ms < Infinity ?\n new DexiePromise((resolve, reject) => {\n var handle = setTimeout(() => reject(new exceptions.Timeout(msg)), ms);\n this.then(resolve, reject).finally(clearTimeout.bind(null, handle));\n }) : this;\n }\n});\n\nif (typeof Symbol !== 'undefined' && Symbol.toStringTag)\n setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise');\n\n// Now that Promise.prototype is defined, we have all it takes to set globalPSD.env.\n// Environment globals snapshotted on leaving global zone\nglobalPSD.env = snapShot();\n\nfunction Listener(onFulfilled, onRejected, resolve, reject, zone) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.resolve = resolve;\n this.reject = reject;\n this.psd = zone;\n}\n\n// Promise Static Properties\nprops (DexiePromise, {\n all: function () {\n var values = getArrayOf.apply(null, arguments) // Supports iterables, implicit arguments and array-like.\n .map(onPossibleParallellAsync); // Handle parallell async/awaits \n return new DexiePromise(function (resolve, reject) {\n if (values.length === 0) resolve([]);\n var remaining = values.length;\n values.forEach((a,i) => DexiePromise.resolve(a).then(x => {\n values[i] = x;\n if (!--remaining) resolve(values);\n }, reject));\n });\n },\n \n resolve: value => {\n if (value instanceof DexiePromise) return value;\n if (value && typeof value.then === 'function') return new DexiePromise((resolve, reject)=>{\n value.then(resolve, reject);\n });\n var rv = new DexiePromise(INTERNAL, true, value);\n return rv;\n },\n \n reject: PromiseReject,\n \n race: function () {\n var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n values.map(value => DexiePromise.resolve(value).then(resolve, reject));\n });\n },\n\n PSD: {\n get: ()=>PSD,\n set: value => PSD = value\n },\n\n totalEchoes: {get: ()=>totalEchoes},\n\n //task: {get: ()=>task},\n \n newPSD: newScope,\n \n usePSD: usePSD,\n \n scheduler: {\n get: () => asap,\n set: value => {asap = value}\n },\n \n rejectionMapper: {\n get: () => rejectionMapper,\n set: value => {rejectionMapper = value;} // Map reject failures\n },\n \n follow: (fn, zoneProps) => {\n return new DexiePromise((resolve, reject) => {\n return newScope((resolve, reject) => {\n var psd = PSD;\n psd.unhandleds = []; // For unhandled standard- or 3rd party Promises. Checked at psd.finalize()\n psd.onunhandled = reject; // Triggered directly on unhandled promises of this library.\n psd.finalize = callBoth(function () {\n // Unhandled standard or 3rd part promises are put in PSD.unhandleds and\n // examined upon scope completion while unhandled rejections in this Promise\n // will trigger directly through psd.onunhandled\n run_at_end_of_this_or_next_physical_tick(()=>{\n this.unhandleds.length === 0 ? resolve() : reject(this.unhandleds[0]);\n });\n }, psd.finalize);\n fn();\n }, zoneProps, resolve, reject);\n });\n }\n});\n\nif (NativePromise) {\n if (NativePromise.allSettled) setProp (DexiePromise, \"allSettled\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise(resolve => {\n if (possiblePromises.length === 0) resolve([]);\n let remaining = possiblePromises.length;\n const results = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => results[i] = {status: \"fulfilled\", value},\n reason => results[i] = {status: \"rejected\", reason})\n .then(()=>--remaining || resolve(results)));\n });\n });\n if (NativePromise.any && typeof AggregateError !== 'undefined') setProp(DexiePromise, \"any\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n if (possiblePromises.length === 0) reject(new AggregateError([]));\n let remaining = possiblePromises.length;\n const failures = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => resolve(value),\n failure => {\n failures[i] = failure;\n if (!--remaining) reject(new AggregateError(failures));\n }));\n });\n });\n}\n\n/**\n* Take a potentially misbehaving resolver function and make sure\n* onFulfilled and onRejected are only called once.\n*\n* Makes no guarantees about asynchrony.\n*/\nfunction executePromiseTask (promise, fn) {\n // Promise Resolution Procedure:\n // https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n try {\n fn(value => {\n if (promise._state !== null) return; // Already settled\n if (value === promise) throw new TypeError('A promise cannot be resolved with itself.');\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n if (value && typeof value.then === 'function') {\n executePromiseTask(promise, (resolve, reject) => {\n value instanceof DexiePromise ?\n value._then(resolve, reject) :\n value.then(resolve, reject);\n });\n } else {\n promise._state = true;\n promise._value = value;\n propagateAllListeners(promise);\n }\n if (shouldExecuteTick) endMicroTickScope();\n }, handleRejection.bind(null, promise)); // If Function.bind is not supported. Exception is handled in catch below\n } catch (ex) {\n handleRejection(promise, ex);\n }\n}\n\nfunction handleRejection (promise, reason) {\n rejectingErrors.push(reason);\n if (promise._state !== null) return;\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n reason = rejectionMapper(reason);\n promise._state = false;\n promise._value = reason;\n // Add the failure to a list of possibly uncaught errors\n addPossiblyUnhandledError(promise);\n propagateAllListeners(promise);\n if (shouldExecuteTick) endMicroTickScope();\n}\n\nfunction propagateAllListeners (promise) {\n //debug && linkToPreviousPromise(promise);\n var listeners = promise._listeners;\n promise._listeners = [];\n for (var i = 0, len = listeners.length; i < len; ++i) {\n propagateToListener(promise, listeners[i]);\n }\n var psd = promise._PSD;\n --psd.ref || psd.finalize(); // if psd.ref reaches zero, call psd.finalize();\n if (numScheduledCalls === 0) {\n // If numScheduledCalls is 0, it means that our stack is not in a callback of a scheduled call,\n // and that no deferreds where listening to this rejection or success.\n // Since there is a risk that our stack can contain application code that may\n // do stuff after this code is finished that may generate new calls, we cannot\n // call finalizers here.\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick(); // Will detect unhandled errors\n }, []);\n }\n}\n\nfunction propagateToListener(promise, listener) {\n if (promise._state === null) {\n promise._listeners.push(listener);\n return;\n }\n\n var cb = promise._state ? listener.onFulfilled : listener.onRejected;\n if (cb === null) {\n // This Listener doesnt have a listener for the event being triggered (onFulfilled or onReject) so lets forward the event to any eventual listeners on the Promise instance returned by then() or catch()\n return (promise._state ? listener.resolve : listener.reject) (promise._value);\n }\n ++listener.psd.ref;\n ++numScheduledCalls;\n asap (callListener, [cb, promise, listener]);\n}\n\nfunction callListener (cb, promise, listener) {\n try {\n // Call callback and resolve our listener with it's return value.\n var ret, value = promise._value;\n \n if (!promise._state && rejectingErrors.length) rejectingErrors = [];\n // cb is onResolved\n ret = debug && promise._consoleTask ? promise._consoleTask.run(()=>cb (value)) : cb (value);\n if (!promise._state && rejectingErrors.indexOf(value) === -1) {\n markErrorAsHandled(promise); // Callback didnt do Promise.reject(err) nor reject(err) onto another promise.\n }\n listener.resolve(ret);\n } catch (e) {\n // Exception thrown in callback. Reject our listener.\n listener.reject(e);\n } finally {\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n --listener.psd.ref || listener.psd.finalize();\n }\n}\n\n/* The callback to schedule with queueMicrotask().\n It runs a virtual microtick and executes any callback registered in microtickQueue.\n */\nfunction physicalTick() {\n usePSD(globalPSD, ()=>{\n // Make sure to reset the async context to globalPSD before\n // executing any of the microtick subscribers.\n beginMicroTickScope() && endMicroTickScope();\n });\n}\n\nexport function beginMicroTickScope() {\n var wasRootExec = isOutsideMicroTick;\n isOutsideMicroTick = false;\n needsNewPhysicalTick = false;\n return wasRootExec;\n}\n\n/* Executes micro-ticks without doing try..catch.\n This can be possible because we only use this internally and\n the registered functions are exception-safe (they do try..catch\n internally before calling any external method). If registering\n functions in the microtickQueue that are not exception-safe, this\n would destroy the framework and make it instable. So we don't export\n our asap method.\n*/\nexport function endMicroTickScope() {\n var callbacks, i, l;\n do {\n while (microtickQueue.length > 0) {\n callbacks = microtickQueue;\n microtickQueue = [];\n l = callbacks.length;\n for (i = 0; i < l; ++i) {\n var item = callbacks[i];\n item[0].apply(null, item[1]);\n }\n }\n } while (microtickQueue.length > 0);\n isOutsideMicroTick = true;\n needsNewPhysicalTick = true;\n}\n\nfunction finalizePhysicalTick() {\n var unhandledErrs = unhandledErrors;\n unhandledErrors = [];\n unhandledErrs.forEach(p => {\n p._PSD.onunhandled.call(null, p._value, p);\n });\n var finalizers = tickFinalizers.slice(0); // Clone first because finalizer may remove itself from list.\n var i = finalizers.length;\n while (i) finalizers[--i](); \n}\n\nfunction run_at_end_of_this_or_next_physical_tick (fn) {\n function finalizer() {\n fn();\n tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1);\n }\n tickFinalizers.push(finalizer);\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n }, []);\n}\n\nfunction addPossiblyUnhandledError(promise) {\n // Only add to unhandledErrors if not already there. The first one to add to this list\n // will be upon the first rejection so that the root cause (first promise in the\n // rejection chain) is the one listed.\n if (!unhandledErrors.some(p => p._value === promise._value))\n unhandledErrors.push(promise);\n}\n\nfunction markErrorAsHandled(promise) {\n // Called when a reject handled is actually being called.\n // Search in unhandledErrors for any promise whos _value is this promise_value (list\n // contains only rejected promises, and only one item per error)\n var i = unhandledErrors.length;\n while (i) if (unhandledErrors[--i]._value === promise._value) {\n // Found a promise that failed with this same error object pointer,\n // Remove that since there is a listener that actually takes care of it.\n unhandledErrors.splice(i, 1);\n return;\n }\n}\n\nfunction PromiseReject (reason) {\n return new DexiePromise(INTERNAL, false, reason);\n}\n\nexport function wrap (fn, errorCatcher) {\n var psd = PSD;\n return function() {\n var wasRootExec = beginMicroTickScope(),\n outerScope = PSD;\n\n try {\n switchToZone(psd, true);\n return fn.apply(this, arguments);\n } catch (e) {\n errorCatcher && errorCatcher(e);\n } finally {\n switchToZone(outerScope, false);\n if (wasRootExec) endMicroTickScope();\n }\n };\n}\n\n\n//\n// variables used for native await support\n//\nconst task = { awaits: 0, echoes: 0, id: 0}; // The ongoing macro-task when using zone-echoing.\nvar taskCounter = 0; // ID counter for macro tasks.\nvar zoneStack = []; // Stack of left zones to restore asynchronically.\nvar zoneEchoes = 0; // When > 0, zoneLeaveEcho is queued. When 0 and task.echoes is also 0, nothing is queued.\nvar totalEchoes = 0; // ID counter for micro-tasks. Used to detect possible native await in our Promise.prototype.then.\n\n\nvar zone_id_counter = 0;\nexport function newScope (fn, props, a1, a2) {\n var parent = PSD,\n psd = Object.create(parent);\n psd.parent = parent;\n psd.ref = 0;\n psd.global = false;\n psd.id = ++zone_id_counter;\n // Prepare for promise patching (done in usePSD):\n var globalEnv = globalPSD.env;\n psd.env = patchGlobalPromise ? {\n Promise: DexiePromise, // Changing window.Promise could be omitted for Chrome and Edge, where IDB+Promise plays well!\n PromiseProp: {value: DexiePromise, configurable: true, writable: true},\n all: DexiePromise.all,\n race: DexiePromise.race,\n allSettled: DexiePromise.allSettled,\n any: DexiePromise.any,\n resolve: DexiePromise.resolve,\n reject: DexiePromise.reject,\n } : {};\n if (props) extend(psd, props);\n \n // unhandleds and onunhandled should not be specifically set here.\n // Leave them on parent prototype.\n // unhandleds.push(err) will push to parent's prototype\n // onunhandled() will call parents onunhandled (with this scope's this-pointer though!)\n ++parent.ref;\n psd.finalize = function () {\n --this.parent.ref || this.parent.finalize();\n }\n var rv = usePSD (psd, fn, a1, a2);\n if (psd.ref === 0) psd.finalize();\n return rv;\n}\n\n// Function to call if scopeFunc returns NativePromise\n// Also for each NativePromise in the arguments to Promise.all()\nexport function incrementExpectedAwaits() {\n if (!task.id) task.id = ++taskCounter;\n ++task.awaits;\n task.echoes += ZONE_ECHO_LIMIT;\n return task.id;\n}\n\n// Function to call when 'then' calls back on a native promise where onAwaitExpected() had been called.\n// Also call this when a native await calls then method on a promise. In that case, don't supply\n// sourceTaskId because we already know it refers to current task.\nexport function decrementExpectedAwaits() {\n if (!task.awaits) return false;\n if (--task.awaits === 0) task.id = 0;\n task.echoes = task.awaits * ZONE_ECHO_LIMIT; // Will reset echoes to 0 if awaits is 0.\n return true;\n}\n\nif ((''+nativePromiseThen).indexOf('[native code]') === -1) {\n // If the native promise' prototype is patched, we cannot rely on zone echoing.\n // Disable that here:\n incrementExpectedAwaits = decrementExpectedAwaits = nop;\n}\n\n// Call from Promise.all() and Promise.race()\nexport function onPossibleParallellAsync (possiblePromise) {\n if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) {\n incrementExpectedAwaits(); \n return possiblePromise.then(x => {\n decrementExpectedAwaits();\n return x;\n }, e => {\n decrementExpectedAwaits();\n return rejection(e);\n });\n }\n return possiblePromise;\n}\n\nfunction zoneEnterEcho(targetZone) {\n ++totalEchoes;\n //console.log(\"Total echoes \", totalEchoes);\n //if (task.echoes === 1) console.warn(\"Cancelling echoing of async context.\");\n if (!task.echoes || --task.echoes === 0) {\n task.echoes = task.awaits = task.id = 0; // Cancel echoing.\n }\n\n zoneStack.push(PSD);\n switchToZone(targetZone, true);\n}\n\nfunction zoneLeaveEcho() {\n var zone = zoneStack[zoneStack.length-1];\n zoneStack.pop();\n switchToZone(zone, false);\n}\n\nfunction switchToZone (targetZone, bEnteringZone) {\n var currentZone = PSD;\n if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) {\n // Enter or leave zone asynchronically as well, so that tasks initiated during current tick\n // will be surrounded by the zone when they are invoked.\n queueMicrotask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho);\n }\n if (targetZone === PSD) return;\n\n PSD = targetZone; // The actual zone switch occurs at this line.\n\n // Snapshot on every leave from global zone.\n if (currentZone === globalPSD) globalPSD.env = snapShot();\n\n if (patchGlobalPromise) {\n // Let's patch the global and native Promises (may be same or may be different)\n var GlobalPromise = globalPSD.env.Promise;\n // Swich environments (may be PSD-zone or the global zone. Both apply.)\n var targetEnv = targetZone.env;\n\n if (currentZone.global || targetZone.global) {\n // Leaving or entering global zone. It's time to patch / restore global Promise.\n\n // Set this Promise to window.Promise so that transiled async functions will work on Firefox, Safari and IE, as well as with Zonejs and angular.\n Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp);\n\n // Support Promise.all() etc to work indexedDB-safe also when people are including es6-promise as a module (they might\n // not be accessing global.Promise but a local reference to it)\n GlobalPromise.all = targetEnv.all;\n GlobalPromise.race = targetEnv.race;\n GlobalPromise.resolve = targetEnv.resolve;\n GlobalPromise.reject = targetEnv.reject;\n if (targetEnv.allSettled) GlobalPromise.allSettled = targetEnv.allSettled;\n if (targetEnv.any) GlobalPromise.any = targetEnv.any;\n }\n }\n}\n\nfunction snapShot () {\n var GlobalPromise = _global.Promise;\n return patchGlobalPromise ? {\n Promise: GlobalPromise,\n PromiseProp: Object.getOwnPropertyDescriptor(_global, \"Promise\"),\n all: GlobalPromise.all,\n race: GlobalPromise.race,\n allSettled: GlobalPromise.allSettled,\n any: GlobalPromise.any,\n resolve: GlobalPromise.resolve,\n reject: GlobalPromise.reject,\n } : {};\n}\n\nexport function usePSD (psd, fn, a1, a2, a3) {\n var outerScope = PSD;\n try {\n switchToZone(psd, true);\n return fn(a1, a2, a3);\n } finally {\n switchToZone(outerScope, false);\n }\n}\n\nfunction nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) {\n return typeof fn !== 'function' ? fn : function () {\n var outerZone = PSD;\n if (possibleAwait) incrementExpectedAwaits();\n switchToZone(zone, true);\n try {\n return fn.apply(this, arguments);\n } finally {\n switchToZone(outerZone, false);\n if (cleanup) queueMicrotask(decrementExpectedAwaits);\n }\n };\n}\n\n/** Execute callback in global context */\nexport function execInGlobalContext(cb) {\n if (Promise === NativePromise && task.echoes === 0) {\n if (zoneEchoes === 0) {\n cb();\n } else {\n enqueueNativeMicroTask(cb);\n }\n } else {\n setTimeout(cb, 0);\n }\n}\n\nexport var rejection = DexiePromise.reject;\n\nexport {DexiePromise};\n","import { PSD, rejection, newScope } from \"../helpers/promise\";\nimport { DexieOptions } from \"../public/types/dexie-constructor\";\nimport { errnames, exceptions } from \"../errors\";\nimport { nop } from \"./chaining-functions\";\nimport { Transaction } from \"../classes/transaction\";\nimport { Dexie } from '../classes/dexie';\n\n/* Generate a temporary transaction when db operations are done outside a transaction scope.\n*/\nexport function tempTransaction (\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n fn: (resolve, reject, trans: Transaction) => any)\n // Last argument is \"writeLocked\". But this doesnt apply to oneshot direct db operations, so we ignore it.\n{\n if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) {\n if (db._state.openComplete) {\n // db.idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError));\n }\n if (!db._state.isBeingOpened) {\n if (!db._state.autoOpen)\n return rejection(new exceptions.DatabaseClosed());\n db.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n return db._state.dbReadyPromise.then(() => tempTransaction(db, mode, storeNames, fn));\n } else {\n var trans = db._createTransaction(mode, storeNames, db._dbSchema);\n try {\n trans.create();\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db.close({disableAutoOpen: false});\n return db.open().then(()=>tempTransaction(db, mode, storeNames, fn));\n }\n return rejection(ex);\n }\n return trans._promise(mode, (resolve, reject) => {\n return newScope(() => { // OPTIMIZATION POSSIBLE? newScope() not needed because it's already done in _promise.\n PSD.trans = trans;\n return fn(resolve, reject, trans);\n });\n }).then(result => {\n // Instead of resolving value directly, wait with resolving it until transaction has completed.\n // Otherwise the data would not be in the DB if requesting it in the then() operation.\n // Specifically, to ensure that the following expression will work:\n //\n // db.friends.put({name: \"Arne\"}).then(function () {\n // db.friends.where(\"name\").equals(\"Arne\").count(function(count) {\n // assert (count === 1);\n // });\n // });\n //\n if (mode === 'readwrite') try {trans.idbtrans.commit();} catch {}\n return mode === 'readonly' ? result : trans._completion.then(() => result);\n });/*.catch(err => { // Don't do this as of now. If would affect bulk- and modify methods in a way that could be more intuitive. But wait! Maybe change in next major.\n trans._reject(err);\n return rejection(err);\n });*/\n }\n}\n","import { Dexie } from \"../classes/dexie\";\n\nexport const DEXIE_VERSION = '{version}'; // Replaced by build-script.\nexport const maxString = String.fromCharCode(65535);\nexport const minKey = -Infinity; // minKey can be constant. maxKey must be a prop of Dexie (_maxKey)\nexport const INVALID_KEY_ARGUMENT =\n \"Invalid key provided. Keys must be of type string, number, Date or Array.\";\nexport const STRING_EXPECTED = \"String expected.\";\nexport const connections: Dexie[] = [];\nexport const dexieStackFrameFilter = frame => !/(dexie\\.js|dexie\\.min\\.js)/.test(frame);\nexport const DBNAMES_DB = '__dbnames';\nexport const READONLY = 'readonly';\nexport const READWRITE = 'readwrite';\n","export function combine(filter1, filter2) {\n return filter1 ?\n filter2 ?\n function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } :\n filter1 :\n filter2;\n}\n","import { DBCoreKeyRange, DBCoreRangeType } from '../public/types/dbcore';\n\nexport const AnyRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Any,\n lower: -Infinity,\n lowerOpen: false,\n upper: [[]],\n upperOpen: false\n}\n\nexport const NeverRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Never,\n lower: -Infinity,\n lowerOpen: true,\n upper: -Infinity,\n upperOpen: true\n}\n","import { deepClone, delByKeyPath, getByKeyPath } from './utils';\n\n// This workaround is needed since obj could be a custom-class instance with an\n// uninitialized keyPath. See the following comment for more context:\n// https://github.com/dfahlander/Dexie.js/issues/1280#issuecomment-823557881\nexport function workaroundForUndefinedPrimKey(keyPath: string | ArrayLike) {\n // Workaround only needed for plain non-dotted keyPaths\n return typeof keyPath === \"string\" && !/\\./.test(keyPath) \n ? (obj: object) => {\n if (obj[keyPath] === undefined && (keyPath in obj)) {\n // property exists but is undefined. This will not be liked by Indexeddb.\n // Need to remove the property before adding it but we need to clone it before\n // doing that to not be intrusive.\n obj = deepClone(obj);\n delete obj[keyPath];\n }\n return obj;\n }\n : (obj: object) => obj;\n}","import { exceptions } from \"../../errors\";\n\nexport function Entity(){\n throw exceptions.Type();\n}\n","// Implementation of https://www.w3.org/TR/IndexedDB-3/#compare-two-keys\n\nimport { toStringTag } from './utils';\n\n// ... with the adjustment to return NaN instead of throwing.\nexport function cmp(a: any, b: any): number {\n try {\n const ta = type(a);\n const tb = type(b);\n if (ta !== tb) {\n if (ta === 'Array') return 1;\n if (tb === 'Array') return -1;\n if (ta === 'binary') return 1;\n if (tb === 'binary') return -1;\n if (ta === 'string') return 1;\n if (tb === 'string') return -1;\n if (ta === 'Date') return 1;\n if (tb !== 'Date') return NaN;\n return -1;\n }\n switch (ta) {\n case 'number':\n case 'Date':\n case 'string':\n return a > b ? 1 : a < b ? -1 : 0;\n case 'binary': {\n return compareUint8Arrays(getUint8Array(a), getUint8Array(b));\n }\n case 'Array':\n return compareArrays(a, b);\n }\n } catch {}\n return NaN; // Return value if any given args are valid keys.\n}\n\nexport function compareArrays(a: any[], b: any[]): number {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n const res = cmp(a[i], b[i]);\n if (res !== 0) return res;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\nexport function compareUint8Arrays(\n a: Uint8Array,\n b: Uint8Array\n) {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n if (a[i] !== b[i]) return a[i] < b[i] ? -1 : 1;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\n// Implementation of https://www.w3.org/TR/IndexedDB-3/#key-type\nfunction type(x: any) {\n const t = typeof x;\n if (t !== 'object') return t;\n if (ArrayBuffer.isView(x)) return 'binary';\n const tsTag = toStringTag(x); // Cannot use instanceof in Safari\n return tsTag === 'ArrayBuffer' ? 'binary' : (tsTag as 'Array' | 'Date');\n}\n\ntype BinaryType =\n | ArrayBuffer\n | DataView\n | Uint8ClampedArray\n | ArrayBufferView\n | Uint8Array\n | Int8Array\n | Uint16Array\n | Int16Array\n | Uint32Array\n | Int32Array\n | Float32Array\n | Float64Array\n | BigInt64Array \n | BigUint64Array;\n\nfunction getUint8Array(a: BinaryType): Uint8Array {\n if (a instanceof Uint8Array) return a;\n if (ArrayBuffer.isView(a))\n // TypedArray or DataView\n return new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n return new Uint8Array(a); // ArrayBuffer\n}\n","import { BulkError, exceptions } from '../../errors';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { DexiePromise as Promise, PSD, newScope, rejection, beginMicroTickScope, endMicroTickScope } from '../../helpers/promise';\nimport { Transaction } from '../transaction';\nimport { Dexie } from '../dexie';\nimport { tempTransaction } from '../../functions/temp-transaction';\nimport { Collection } from '../collection';\nimport { isArray, keys, getByKeyPath, setByKeyPath, extend, getProto } from '../../functions/utils';\nimport { maxString } from '../../globals/constants';\nimport { combine } from '../../functions/combine';\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { IndexableType } from '../../public/types/indexable-type';\nimport { debug } from '../../helpers/debug';\nimport { DBCoreTable } from '../../public/types/dbcore';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { workaroundForUndefinedPrimKey } from '../../functions/workaround-undefined-primkey';\nimport { Entity } from '../entity/Entity';\nimport { UpdateSpec } from '../../public';\nimport { cmp } from '../../functions/cmp';\n\n/** class Table\n * \n * https://dexie.org/docs/Table/Table\n */\nexport class Table implements ITable {\n db: Dexie;\n _tx?: Transaction;\n name: string;\n schema: TableSchema;\n hook: TableHooks;\n core: DBCoreTable;\n\n _trans(\n mode: IDBTransactionMode,\n fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike | void,\n writeLocked?: boolean | string) : PromiseExtended\n {\n const trans: Transaction = this._tx || PSD.trans;\n const tableName = this.name;\n // @ts-ignore: Use Chrome's Async Stack Tagging API to allow tracing and simplify debugging for dexie users.\n const task = debug && typeof console !== 'undefined' && console.createTask && console.createTask(`Dexie: ${mode === 'readonly' ? 'read' : 'write' } ${this.name}`);\n \n function checkTableInTransaction(resolve, reject, trans: Transaction) {\n if (!trans.schema[tableName])\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\");\n return fn(trans.idbtrans, trans) as Promise;\n }\n // Surround all in a microtick scope.\n // Reason: Browsers (modern Safari + older others)\n // still as of 2018-10-10 has problems keeping a transaction\n // alive between micro ticks. Safari because if transaction\n // is created but not used in same microtick, it will go\n // away. That specific issue could be solved in DBCore\n // by opening the transaction just before using it instead.\n // But older Firefoxes and IE11 (with Promise polyfills)\n // will still have probs.\n // The beginMicrotickScope()/endMicrotickScope() works\n // in cooperation with Dexie.Promise to orchestrate\n // the micro-ticks in endMicrotickScope() rather than\n // in native engine.\n const wasRootExec = beginMicroTickScope();\n try {\n let p = trans && trans.db._novip === this.db._novip ?\n trans === PSD.trans ?\n trans._promise(mode, checkTableInTransaction, writeLocked) :\n newScope(() => trans._promise(mode, checkTableInTransaction, writeLocked), { trans: trans, transless: PSD.transless || PSD }) :\n tempTransaction(this.db, mode, [this.name], checkTableInTransaction);\n if (task) { // Dexie.debug = true so we trace errors\n p._consoleTask = task;\n p = p.catch(err => {\n console.trace(err);\n return rejection(err);\n });\n }\n return p; \n } finally {\n if (wasRootExec) endMicroTickScope();\n }\n }\n\n /** Table.get()\n * \n * https://dexie.org/docs/Table/Table.get()\n * \n **/\n get(keyOrCrit, cb?) {\n if (keyOrCrit && keyOrCrit.constructor === Object)\n return this.where(keyOrCrit as { [key: string]: IndexableType }).first(cb);\n if (keyOrCrit == null) return rejection(new exceptions.Type(`Invalid argument to Table.get()`));\n\n return this._trans('readonly', (trans) => {\n return this.core.get({trans, key: keyOrCrit})\n .then(res => this.hook.reading.fire(res));\n }).then(cb);\n }\n\n /** Table.where()\n * \n * https://dexie.org/docs/Table/Table.where()\n * \n **/\n where(indexOrCrit: string | string[] | { [key: string]: IndexableType }) {\n if (typeof indexOrCrit === 'string')\n return new this.db.WhereClause(this, indexOrCrit);\n if (isArray(indexOrCrit))\n return new this.db.WhereClause(this, `[${indexOrCrit.join('+')}]`);\n // indexOrCrit is an object map of {[keyPath]:value} \n const keyPaths = keys(indexOrCrit);\n if (keyPaths.length === 1)\n // Only one critera. This was the easy case:\n return this\n .where(keyPaths[0])\n .equals(indexOrCrit[keyPaths[0]]);\n\n // Multiple criterias.\n // Let's try finding a compound index that matches all keyPaths in\n // arbritary order:\n const compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(ix => {\n if (\n ix.compound &&\n keyPaths.every(keyPath => ix.keyPath.indexOf(keyPath) >= 0)) {\n for (let i=0; i a.keyPath.length - b.keyPath.length)[0];\n \n if (compoundIndex && this.db._maxKey !== maxString) {\n // Cool! We found such compound index\n // and this browser supports compound indexes (maxKey !== maxString)!\n const keyPathsInValidOrder = (compoundIndex.keyPath as string[]).slice(0, keyPaths.length);\n return this\n .where(keyPathsInValidOrder)\n .equals(keyPathsInValidOrder.map(kp => indexOrCrit[kp]));\n }\n\n if (!compoundIndex && debug) console.warn(\n `The query ${JSON.stringify(indexOrCrit)} on ${this.name} would benefit from a ` +\n `compound index [${keyPaths.join('+')}]`);\n\n // Ok, now let's fallback to finding at least one matching index\n // and filter the rest.\n const { idxByName } = this.schema;\n const idb = this.db._deps.indexedDB;\n\n function equals (a, b) {\n return idb.cmp(a,b) === 0; // Works with all indexable types including binary keys.\n }\n\n const [idx, filterFunction] = keyPaths.reduce(([prevIndex, prevFilterFn], keyPath) => {\n const index = idxByName[keyPath];\n const value = indexOrCrit[keyPath];\n return [\n prevIndex || index, // idx::=Pick index of first matching keypath\n prevIndex || !index ? // filter::=null if not needed, otherwise combine function filter\n combine(\n prevFilterFn,\n index && index.multi ?\n x => {\n const prop = getByKeyPath(x, keyPath);\n return isArray(prop) && prop.some(item => equals(value, item));\n } : x => equals(value, getByKeyPath(x, keyPath)))\n : prevFilterFn\n ];\n }, [null, null]);\n\n return idx ?\n this.where(idx.name).equals(indexOrCrit[idx.keyPath])\n .filter(filterFunction) :\n compoundIndex ?\n this.filter(filterFunction) : // Has compound but browser bad. Allow filter.\n this.where(keyPaths).equals(''); // No index at all. Fail lazily with \"[a+b+c] is not indexed\"\n }\n\n /** Table.filter()\n * \n * https://dexie.org/docs/Table/Table.filter()\n * \n **/\n filter(filterFunction: (obj: any) => boolean) {\n return this.toCollection().and(filterFunction);\n }\n\n /** Table.count()\n * \n * https://dexie.org/docs/Table/Table.count()\n * \n **/\n count(thenShortcut?: any) {\n return this.toCollection().count(thenShortcut);\n }\n\n /** Table.offset()\n * \n * https://dexie.org/docs/Table/Table.offset()\n * \n **/\n offset(offset: number) {\n return this.toCollection().offset(offset);\n }\n\n /** Table.limit()\n * \n * https://dexie.org/docs/Table/Table.limit()\n * \n **/\n limit(numRows: number) {\n return this.toCollection().limit(numRows);\n }\n\n /** Table.each()\n * \n * https://dexie.org/docs/Table/Table.each()\n * \n **/\n each(callback: (obj: any, cursor: { key: IndexableType, primaryKey: IndexableType }) => any) {\n return this.toCollection().each(callback);\n }\n\n /** Table.toArray()\n * \n * https://dexie.org/docs/Table/Table.toArray()\n * \n **/\n toArray(thenShortcut?: any) {\n return this.toCollection().toArray(thenShortcut);\n }\n\n /** Table.toCollection()\n * \n * https://dexie.org/docs/Table/Table.toCollection()\n * \n **/\n toCollection() {\n return new this.db.Collection(new this.db.WhereClause(this));\n }\n\n /** Table.orderBy()\n * \n * https://dexie.org/docs/Table/Table.orderBy()\n * \n **/\n orderBy(index: string | string[]) {\n return new this.db.Collection(\n new this.db.WhereClause(this, isArray(index) ?\n `[${index.join('+')}]` :\n index));\n }\n\n /** Table.reverse()\n * \n * https://dexie.org/docs/Table/Table.reverse()\n * \n **/\n reverse(): Collection {\n return this.toCollection().reverse();\n }\n\n /** Table.mapToClass()\n * \n * https://dexie.org/docs/Table/Table.mapToClass()\n * \n **/\n mapToClass(constructor: Function) {\n const {db, name: tableName} = this;\n this.schema.mappedClass = constructor;\n if (constructor.prototype instanceof Entity) {\n constructor = class extends (constructor as any) {\n get db () { return db; }\n table() { return tableName; }\n }\n }\n // Collect all inherited property names (including method names) by\n // walking the prototype chain. This is to avoid overwriting them from\n // database data - so application code can rely on inherited props never\n // becoming shadowed by database object props.\n const inheritedProps = new Set();\n for (let proto = constructor.prototype; proto; proto = getProto(proto)) {\n Object.getOwnPropertyNames(proto).forEach(propName => inheritedProps.add(propName));\n }\n \n // Now, subscribe to the when(\"reading\") event to make all objects that come out from this table inherit from given class\n // no matter which method to use for reading (Table.get() or Table.where(...)... )\n const readHook = (obj: Object) => {\n if (!obj) return obj; // No valid object. (Value is null or undefined). Return as is.\n // Create a new object that derives from constructor:\n const res = Object.create(constructor.prototype);\n // Clone members (but never those that collide with a property in the prototype\n // hierchary (MUST BE ABLE TO RELY ON Entity methods and props!)):\n for (let m in obj) if (!inheritedProps.has(m)) try { res[m] = obj[m]; } catch (_) { }\n return res;\n };\n\n if (this.schema.readHook) {\n this.hook.reading.unsubscribe(this.schema.readHook);\n }\n this.schema.readHook = readHook;\n this.hook(\"reading\", readHook);\n return constructor;\n }\n\n /** @deprecated */\n defineClass() {\n function Class (content){\n extend(this, content);\n };\n return this.mapToClass(Class);\n }\n\n /** Table.add()\n * \n * https://dexie.org/docs/Table/Table.add()\n * \n **/\n add(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd]});\n }).then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.update()\n * \n * https://dexie.org/docs/Table/Table.update()\n * \n **/\n update(keyOrObject, modifications: { [keyPath: string]: any; } | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) {\n const key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath);\n if (key === undefined) return rejection(new exceptions.InvalidArgument(\n \"Given object does not contain its primary key\"));\n /*// object to modify. Also modify given object with the modifications:\n // This part should be here for backward compatibility.\n // If ever feeling too bad about mutating given object, please wait to a new major before removing it,\n // and document the change thoroughly. TODO: Document this change!\n if (!Object.isFrozen(keyOrObject)) try {\n if (typeof modifications !== \"function\") {\n keys(modifications).forEach(keyPath => {\n setByKeyPath(keyOrObject, keyPath, modifications[keyPath]);\n });\n } else {\n // Now since we support function argument, we should have a similar behavior here as well\n // (as long as we do this mutability stuff on the given object)\n modifications(keyOrObject, {value: keyOrObject, primKey: key});\n }\n } catch {\n // Maybe given object was frozen.\n // This part is not essential. Just move on as nothing happened...\n }*/\n return this.where(\":id\").equals(key).modify(modifications);\n } else {\n // key to modify\n return this.where(\":id\").equals(keyOrObject).modify(modifications);\n }\n }\n\n /** Table.put()\n * \n * https://dexie.org/docs/Table/Table.put()\n * \n **/\n put(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans(\n 'readwrite',\n trans => this.core.mutate({trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.delete()\n * \n * https://dexie.org/docs/Table/Table.delete()\n * \n **/\n delete(key: IndexableType): PromiseExtended {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'delete', keys: [key]}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.clear()\n * \n * https://dexie.org/docs/Table/Table.clear()\n * \n **/\n clear() {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'deleteRange', range: AnyRange}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.bulkGet()\n * \n * https://dexie.org/docs/Table/Table.bulkGet()\n * \n * @param keys \n */\n bulkGet(keys: IndexableType[]) {\n return this._trans('readonly', trans => {\n return this.core.getMany({\n keys,\n trans\n }).then(result => result.map(res => this.hook.reading.fire(res)));\n });\n }\n\n /** Table.bulkAdd()\n * \n * https://dexie.org/docs/Table/Table.bulkAdd()\n * \n **/\n bulkAdd(\n objects: readonly any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkAdd(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToAdd = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n return this.core.mutate(\n {trans, type: 'add', keys: keys as IndexableType[], values: objectsToAdd, wantResults}\n )\n .then(({numFailures, results,lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkAdd(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkPut()\n * \n * https://dexie.org/docs/Table/Table.bulkPut()\n * \n **/\n bulkPut(\n objects: readonly any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkPut(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToPut = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n\n return this.core.mutate(\n {trans, type: 'put', keys: keys as IndexableType[], values: objectsToPut, wantResults}\n )\n .then(({numFailures, results, lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkPut(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkUpdate()\n *\n * https://dexie.org/docs/Table.Table.bulkUpdate()\n */\n bulkUpdate(\n keysAndChanges: readonly { key: any; changes: UpdateSpec }[]\n ): PromiseExtended {\n const coreTable = this.core;\n const keys = keysAndChanges.map((entry) => entry.key);\n const changeSpecs = keysAndChanges.map((entry) => entry.changes);\n const offsetMap: number[] = [];\n return this._trans('readwrite', (trans) => {\n return coreTable.getMany({ trans, keys, cache: 'clone' }).then((objs) => {\n const resultKeys: any[] = [];\n const resultObjs: any[] = [];\n keysAndChanges.forEach(({ key, changes }, idx) => {\n const obj = objs[idx];\n if (obj) {\n for (const keyPath of Object.keys(changes)) {\n const value = changes[keyPath];\n if (keyPath === this.schema.primKey.keyPath) {\n if (cmp(value, key) !== 0) {\n throw new exceptions.Constraint(\n `Cannot update primary key in bulkUpdate()`\n );\n }\n } else {\n setByKeyPath(obj, keyPath, value);\n }\n }\n offsetMap.push(idx);\n resultKeys.push(key);\n resultObjs.push(obj);\n }\n });\n const numEntries = resultKeys.length;\n return coreTable\n .mutate({\n trans,\n type: 'put',\n keys: resultKeys,\n values: resultObjs,\n updates: {\n keys,\n changeSpecs\n }\n })\n .then(({ numFailures, failures }) => {\n if (numFailures === 0) return numEntries;\n // Failure. bulkPut() may have a subset of keys\n // so we must translate returned 'failutes' into the offsets of given argument:\n for (const offset of Object.keys(failures)) {\n const mappedOffset = offsetMap[Number(offset)];\n if (mappedOffset != null) {\n const failure = failures[offset];\n delete failures[offset];\n failures[mappedOffset] = failure;\n }\n }\n throw new BulkError(\n `${this.name}.bulkUpdate(): ${numFailures} of ${numEntries} operations failed`,\n failures\n );\n });\n });\n });\n }\n\n /** Table.bulkDelete()\n * \n * https://dexie.org/docs/Table/Table.bulkDelete()\n * \n **/\n bulkDelete(keys: ReadonlyArray): PromiseExtended {\n const numKeys = keys.length;\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'delete', keys: keys as IndexableType[]});\n }).then(({numFailures, lastResult, failures}) => {\n if (numFailures === 0) return lastResult;\n throw new BulkError(\n `${this.name}.bulkDelete(): ${numFailures} of ${numKeys} operations failed`, failures);\n });\n }\n}\n","import {keys, isArray, asap} from '../functions/utils';\nimport {nop, mirror, reverseStoppableEventChain} from '../functions/chaining-functions';\nimport {exceptions} from '../errors';\n\nexport default function Events(ctx) {\n var evs = {};\n var rv = function (eventName, subscriber) {\n if (subscriber) {\n // Subscribe. If additional arguments than just the subscriber was provided, forward them as well.\n var i = arguments.length, args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n evs[eventName].subscribe.apply(null, args);\n return ctx;\n } else if (typeof (eventName) === 'string') {\n // Return interface allowing to fire or unsubscribe from event\n return evs[eventName];\n }\n };\n rv.addEventType = add;\n \n for (var i = 1, l = arguments.length; i < l; ++i) {\n add(arguments[i]);\n }\n \n return rv;\n\n function add(eventName, chainFunction, defaultFunction) {\n if (typeof eventName === 'object') return addConfiguredEvents(eventName);\n if (!chainFunction) chainFunction = reverseStoppableEventChain;\n if (!defaultFunction) defaultFunction = nop;\n\n var context = {\n subscribers: [],\n fire: defaultFunction,\n subscribe: function (cb) {\n if (context.subscribers.indexOf(cb) === -1) {\n context.subscribers.push(cb);\n context.fire = chainFunction(context.fire, cb);\n }\n },\n unsubscribe: function (cb) {\n context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; });\n context.fire = context.subscribers.reduce(chainFunction, defaultFunction);\n }\n };\n evs[eventName] = rv[eventName] = context;\n return context;\n }\n\n function addConfiguredEvents(cfg) {\n // events(this, {reading: [functionChain, nop]});\n keys(cfg).forEach(function (eventName) {\n var args = cfg[eventName];\n if (isArray(args)) {\n add(eventName, cfg[eventName][0], cfg[eventName][1]);\n } else if (args === 'asap') {\n // Rather than approaching event subscription using a functional approach, we here do it in a for-loop where subscriber is executed in its own stack\n // enabling that any exception that occur wont disturb the initiator and also not nescessary be catched and forgotten.\n var context = add(eventName, mirror, function fire() {\n // Optimazation-safe cloning of arguments into args.\n var i = arguments.length, args = new Array(i);\n while (i--) args[i] = arguments[i];\n // All each subscriber:\n context.subscribers.forEach(function (fn) {\n asap(function fireEvent() {\n fn.apply(null, args);\n });\n });\n });\n } else throw new exceptions.InvalidArgument(\"Invalid event config\");\n });\n }\n}\n","import { arrayToObject, derive } from './utils';\n\n\nexport function makeClassConstructor (prototype: Object, constructor: Function) {\n /*const propertyDescriptorMap = arrayToObject(\n Object.getOwnPropertyNames(prototype),\n propKey => [propKey, Object.getOwnPropertyDescriptor(prototype, propKey)]);\n\n // Both derive and clone the prototype.\n // derive: So that x instanceof T returns true when T is the class template.\n // clone: Optimizes method access a bit (but actually not nescessary)\n const derivedPrototypeClone = Object.create(prototype, propertyDescriptorMap);\n derivedPrototypeClone.constructor = constructor;\n constructor.prototype = derivedPrototypeClone;\n return constructor as any as TConstructor;*/\n\n // Keep the above code in case we want to clone AND derive the parent prototype.\n // Reason would be optimization of property access.\n // The code below will only create a prototypal inheritance from given constructor function\n // to given prototype.\n derive(constructor).from({prototype});\n return constructor as any as TConstructor; \n}\n","import { Dexie } from '../dexie';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { Transaction } from '../transaction/transaction';\nimport { hookCreatingChain, pureFunctionChain, nop, mirror, hookUpdatingChain, hookDeletingChain } from '../../functions/chaining-functions';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { Table } from './table';\nimport Events from '../../helpers/Events';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\n\nexport interface TableConstructor {\n new (name: string, tableSchema: TableSchema, optionalTrans?: Transaction) : Table;\n prototype: Table;\n}\n\n/** Generates a Table constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTableConstructor (db: Dexie) {\n return makeClassConstructor(\n Table.prototype,\n\n function Table (this: Table, name: string, tableSchema: TableSchema, trans?: Transaction) {\n this.db = db;\n this._tx = trans;\n this.name = name;\n this.schema = tableSchema;\n this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, {\n \"creating\": [hookCreatingChain, nop],\n \"reading\": [pureFunctionChain, mirror],\n \"updating\": [hookUpdatingChain, nop],\n \"deleting\": [hookDeletingChain, nop]\n }) as TableHooks;\n }\n\n );\n}\n","import { combine } from \"../../functions/combine\";\nimport { exceptions } from \"../../errors\";\nimport { hasOwn } from \"../../functions/utils\";\nimport { wrap } from \"../../helpers/promise\";\nimport { Collection } from './';\nimport { DBCoreCursor, DBCoreTable, DBCoreTransaction, DBCoreTableSchema, DBCoreRangeType } from '../../public/types/dbcore';\nimport { nop } from '../../functions/chaining-functions';\n\ntype CollectionContext = Collection[\"_ctx\"];\n\nexport function isPlainKeyRange (ctx: CollectionContext, ignoreLimitFilter?: boolean) {\n return !(ctx.filter || ctx.algorithm || ctx.or) &&\n (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter);\n} \n\nexport function addFilter(ctx: CollectionContext, fn: Function) {\n ctx.filter = combine(ctx.filter, fn);\n}\n\nexport function addReplayFilter (ctx: CollectionContext, factory, isLimitFilter?) {\n var curr = ctx.replayFilter;\n ctx.replayFilter = curr ? ()=>combine(curr(), factory()) : factory;\n ctx.justLimit = isLimitFilter && !curr;\n}\n\nexport function addMatchFilter(ctx: CollectionContext, fn) {\n ctx.isMatch = combine(ctx.isMatch, fn);\n}\n\nexport function getIndexOrStore(ctx: CollectionContext, coreSchema: DBCoreTableSchema) {\n // TODO: Rewrite this. No need to know ctx.isPrimKey. ctx.index should hold the keypath.\n // Still, throw if not found!\n if (ctx.isPrimKey) return coreSchema.primaryKey;\n const index = coreSchema.getIndexByKeyPath(ctx.index);\n if (!index) throw new exceptions.Schema(\"KeyPath \" + ctx.index + \" on object store \" + coreSchema.name + \" is not indexed\");\n return index;\n}\n\nexport function openCursor(ctx: CollectionContext, coreTable: DBCoreTable, trans: DBCoreTransaction) {\n const index = getIndexOrStore(ctx, coreTable.schema);\n return coreTable.openCursor({\n trans,\n values: !ctx.keysOnly,\n reverse: ctx.dir === 'prev',\n unique: !!ctx.unique,\n query: {\n index, \n range: ctx.range\n }\n });\n}\n\nexport function iter (\n ctx: CollectionContext, \n fn: (item, cursor: DBCoreCursor, advance: Function)=>void,\n coreTrans: DBCoreTransaction,\n coreTable: DBCoreTable): Promise\n{\n const filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter;\n if (!ctx.or) {\n return iterate(\n openCursor(ctx, coreTable, coreTrans),\n combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper);\n } else {\n const set = {};\n\n const union = (item: any, cursor: DBCoreCursor, advance) => {\n if (!filter || filter(cursor, advance, result=>cursor.stop(result), err => cursor.fail(err))) {\n var primaryKey = cursor.primaryKey;\n var key = '' + primaryKey;\n if (key === '[object ArrayBuffer]') key = '' + new Uint8Array(primaryKey);\n if (!hasOwn(set, key)) {\n set[key] = true;\n fn(item, cursor, advance);\n }\n }\n }\n\n return Promise.all([\n ctx.or._iterate(union, coreTrans),\n iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper)\n ]);\n }\n}\n\nfunction iterate(cursorPromise: Promise, filter, fn, valueMapper): Promise {\n \n // Apply valueMapper (hook('reading') or mappped class)\n var mappedFn = valueMapper ? (x,c,a) => fn(valueMapper(x),c,a) : fn;\n // Wrap fn with PSD and microtick stuff from Promise.\n var wrappedFn = wrap(mappedFn);\n \n return cursorPromise.then(cursor => {\n if (cursor) {\n return cursor.start(()=>{\n var c = ()=>cursor.continue();\n if (!filter || filter(cursor, advancer => c = advancer, val=>{cursor.stop(val);c=nop}, e => {cursor.fail(e);c = nop;}))\n wrappedFn(cursor.value, cursor, advancer => c = advancer);\n c();\n });\n }\n });\n}\n","import { isArray } from \"../functions/utils\";\nimport { PropModSpec } from \"../public/types/prop-modification\";\n\nexport const PropModSymbol: unique symbol = Symbol();\n\n/** Consistent change propagation across offline synced data.\n * \n * This class is executed client- and server side on sync, making\n * an operation consistent across sync for full consistency and accuracy.\n * \n * Example: An object represents a bank account with a balance.\n * One offline user adds $ 1.00 to the balance.\n * Another user (online) adds $ 2.00 to the balance.\n * When first user syncs, the balance becomes the sum of every operation (3.00).\n * \n * -- initial: balance is 0\n * 1. db.bankAccounts.update(1, { balance: new ProdModification({add: 100})}) // user 1 (offline)\n * 2. db.bankAccounts.update(1, { balance: new ProdModification({add: 200})}) // user 2 (online)\n * -- before user 1 syncs, balance is 200 (representing money with integers * 100 to avoid rounding issues)\n * \n * -- balance is 300\n * \n * When new operations are added, they need to be added to:\n * 1. PropModSpec interface\n * 2. Here in PropModification with the logic they represent\n * 3. (Optionally) a sugar function for it, such as const mathAdd = (amount: number | BigInt) => new PropModification({mathAdd: amount})\n */\nexport class PropModification implements PropModSpec {\n [PropModSymbol]?: true;\n replacePrefix?: [string, string];\n add?: number | BigInt | Array;\n remove?: number | BigInt | Array;\n\n execute(value: any): any {\n // add (mathematical or set-wise)\n if (this.add !== undefined) {\n const term = this.add;\n // Set-addition on array representing a set of primitive types (strings, numbers)\n if (isArray(term)) {\n return [...(isArray(value) ? value : []), ...term].sort();\n }\n // Mathematical addition:\n if (typeof term === 'number') return (Number(value) || 0) + term; // if value is not convertible to number, return 0 + term\n if (typeof term === 'bigint') {\n try {\n return BigInt(value) + term;\n } catch {\n return BigInt(0) + term; // Unlike Number(value) that can return NaN, BigInt(value) throws if value is not BigInt, Number or numeric string\n }\n }\n throw new TypeError(`Invalid term ${term}`);\n }\n\n // remove (mathematical or set-wise)\n if (this.remove !== undefined) {\n const subtrahend = this.remove;\n // Set-addition on array representing a set of primitive types (strings, numbers)\n if (isArray(subtrahend)) {\n return isArray(value) ? value.filter(item => !subtrahend.includes(item)).sort() : [];\n } \n // Mathematical addition:\n if (typeof subtrahend === 'number') return Number(value) - subtrahend;\n if (typeof subtrahend === 'bigint') {\n try {\n return BigInt(value) - subtrahend;\n } catch {\n return BigInt(0) - subtrahend; // Unlike Number(value) that can return NaN, BigInt(value) throws if value is not BigInt, Number or numeric string\n }\n }\n throw new TypeError(`Invalid subtrahend ${subtrahend}`);\n }\n\n // Replace a prefix:\n const prefixToReplace = this.replacePrefix?.[0];\n if (prefixToReplace && typeof value === 'string' && value.startsWith(prefixToReplace)) {\n return this.replacePrefix[1] + value.substring(prefixToReplace.length);\n }\n return value;\n }\n\n constructor(spec: PropModSpec) {\n Object.assign(this, spec);\n }\n}\n","import { Collection as ICollection } from \"../../public/types/collection\";\nimport { Dexie } from \"../dexie\";\nimport { Table } from \"../table\";\nimport { IndexableType, IndexableTypeArrayReadonly } from \"../../public/types/indexable-type\";\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { iter, isPlainKeyRange, getIndexOrStore, addReplayFilter, addFilter, addMatchFilter } from \"./collection-helpers\";\nimport { rejection } from \"../../helpers/promise\";\nimport { combine } from \"../../functions/combine\";\nimport { extend, hasOwn, deepClone, keys, setByKeyPath, getByKeyPath } from \"../../functions/utils\";\nimport { ModifyError } from \"../../errors\";\nimport { ThenShortcut } from \"../../public/types/then-shortcut\";\nimport { Transaction } from '../transaction';\nimport { DBCoreCursor, DBCoreTransaction, DBCoreRangeType, DBCoreMutateResponse, DBCoreKeyRange } from '../../public/types/dbcore';\nimport { cmp } from \"../../functions/cmp\";\nimport { PropModification } from \"../../helpers/prop-modification\";\nimport { UpdateSpec } from \"../../public/types/update-spec\";\n\n/** class Collection\n * \n * https://dexie.org/docs/Collection/Collection\n */\nexport class Collection implements ICollection {\n db: Dexie;\n _ctx: {\n table: Table;\n index?: string | null;\n isPrimKey?: boolean;\n range: DBCoreKeyRange;\n keysOnly: boolean;\n dir: \"next\" | \"prev\";\n unique: \"\" | \"unique\";\n algorithm?: Function | null;\n filter?: Function | null;\n replayFilter: Function | null;\n justLimit: boolean; // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: Function | null;\n offset: number,\n limit: number,\n error: any, // If set, any promise must be rejected with this error\n or: Collection,\n valueMapper: (any) => any\n }\n \n _ondirectionchange?: Function;\n\n _read(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike, cb?): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readonly', fn).then(cb);\n }\n\n _write(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readwrite', fn, \"locked\"); // When doing write operations on collections, always lock the operation so that upcoming operations gets queued.\n }\n\n _addAlgorithm(fn) {\n var ctx = this._ctx;\n ctx.algorithm = combine(ctx.algorithm, fn);\n }\n\n _iterate(\n fn: (item, cursor: DBCoreCursor, advance: Function) => void,\n coreTrans: DBCoreTransaction) : Promise\n {\n return iter(this._ctx, fn, coreTrans, this._ctx.table.core);\n }\n\n /** Collection.clone()\n * \n * https://dexie.org/docs/Collection/Collection.clone()\n * \n **/\n clone(props?): this {\n var rv = Object.create(this.constructor.prototype),\n ctx = Object.create(this._ctx);\n if (props) extend(ctx, props);\n rv._ctx = ctx;\n return rv;\n }\n\n /** Collection.raw()\n * \n * https://dexie.org/docs/Collection/Collection.raw()\n * \n **/\n raw(): this {\n this._ctx.valueMapper = null;\n return this;\n }\n\n /** Collection.each()\n * \n * https://dexie.org/docs/Collection/Collection.each()\n * \n **/\n each(fn: (obj, cursor: DBCoreCursor) => any): PromiseExtended {\n var ctx = this._ctx;\n\n return this._read(trans => iter(ctx, fn, trans, ctx.table.core));\n }\n\n /** Collection.count()\n * \n * https://dexie.org/docs/Collection/Collection.count()\n * \n **/\n count(cb?) {\n return this._read(trans => {\n const ctx = this._ctx;\n const coreTable = ctx.table.core;\n if (isPlainKeyRange(ctx, true)) {\n // This is a plain key range. We can use the count() method if the index.\n return coreTable.count({\n trans,\n query: {\n index: getIndexOrStore(ctx, coreTable.schema),\n range: ctx.range\n }\n }).then(count => Math.min(count, ctx.limit));\n } else {\n // Algorithms, filters or expressions are applied. Need to count manually.\n var count = 0;\n return iter(ctx, () => { ++count; return false; }, trans, coreTable)\n .then(()=>count);\n }\n }).then(cb);\n }\n\n /** Collection.sortBy()\n * \n * https://dexie.org/docs/Collection/Collection.sortBy()\n * \n **/\n sortBy(keyPath: string): PromiseExtended;\n sortBy(keyPath: string, thenShortcut: ThenShortcut) : PromiseExtended;\n sortBy(keyPath: string, cb?: ThenShortcut) {\n const parts = keyPath.split('.').reverse(),\n lastPart = parts[0],\n lastIndex = parts.length - 1;\n function getval(obj, i) {\n if (i) return getval(obj[parts[i]], i - 1);\n return obj[lastPart];\n }\n var order = this._ctx.dir === \"next\" ? 1 : -1;\n\n function sorter(a, b) {\n var aVal = getval(a, lastIndex),\n bVal = getval(b, lastIndex);\n return aVal < bVal ? -order : aVal > bVal ? order : 0;\n }\n return this.toArray(function (a) {\n return a.sort(sorter);\n }).then(cb);\n }\n\n /** Collection.toArray()\n * \n * https://dexie.org/docs/Collection/Collection.toArray()\n * \n **/\n toArray(cb?): PromiseExtended {\n return this._read(trans => {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAll() or\n // IDBKeyRange.getAll():\n const {valueMapper} = ctx;\n const index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n limit: ctx.limit,\n values: true,\n query: {\n index,\n range: ctx.range\n }\n }).then(({result}) => valueMapper ? result.map(valueMapper) : result);\n } else {\n // Getting array through a cursor.\n const a = [];\n return iter(ctx, item => a.push(item), trans, ctx.table.core).then(()=>a);\n }\n }, cb);\n }\n\n /** Collection.offset()\n * \n * https://dexie.org/docs/Collection/Collection.offset()\n * \n **/\n offset(offset: number) : Collection{\n var ctx = this._ctx;\n if (offset <= 0) return this;\n ctx.offset += offset; // For count()\n if (isPlainKeyRange(ctx)) {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return (cursor, advance) => {\n if (offsetLeft === 0) return true;\n if (offsetLeft === 1) { --offsetLeft; return false; }\n advance(() => {\n cursor.advance(offsetLeft);\n offsetLeft = 0;\n });\n return false;\n };\n });\n } else {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return () => (--offsetLeft < 0);\n });\n }\n return this;\n }\n\n /** Collection.limit()\n * \n * https://dexie.org/docs/Collection/Collection.limit()\n * \n **/\n limit(numRows: number) : Collection {\n this._ctx.limit = Math.min(this._ctx.limit, numRows); // For count()\n addReplayFilter(this._ctx, () => {\n var rowsLeft = numRows;\n return function (cursor, advance, resolve) {\n if (--rowsLeft <= 0) advance(resolve); // Stop after this item has been included\n return rowsLeft >= 0; // If numRows is already below 0, return false because then 0 was passed to numRows initially. Otherwise we wouldnt come here.\n };\n }, true);\n return this;\n }\n\n /** Collection.until()\n * \n * https://dexie.org/docs/Collection/Collection.until()\n * \n **/\n until(filterFunction: (x) => boolean, bIncludeStopEntry?) {\n addFilter(this._ctx, function (cursor, advance, resolve) {\n if (filterFunction(cursor.value)) {\n advance(resolve);\n return bIncludeStopEntry;\n } else {\n return true;\n }\n });\n return this;\n }\n\n /** Collection.first()\n * \n * https://dexie.org/docs/Collection/Collection.first()\n * \n **/\n first(cb?) {\n return this.limit(1).toArray(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.last()\n * \n * https://dexie.org/docs/Collection/Collection.last()\n * \n **/\n last(cb?) {\n return this.reverse().first(cb);\n }\n\n /** Collection.filter()\n * \n * https://dexie.org/docs/Collection/Collection.filter()\n * \n **/\n filter(filterFunction: (x) => boolean): Collection {\n /// function(val){return true/false}\n addFilter(this._ctx, function (cursor) {\n return filterFunction(cursor.value);\n });\n // match filters not used in Dexie.js but can be used by 3rd part libraries to test a\n // collection for a match without querying DB. Used by Dexie.Observable.\n addMatchFilter(this._ctx, filterFunction);\n return this;\n }\n\n /** Collection.and()\n * \n * https://dexie.org/docs/Collection/Collection.and()\n * \n **/\n and(filter: (x) => boolean) {\n return this.filter(filter);\n }\n\n /** Collection.or()\n * \n * https://dexie.org/docs/Collection/Collection.or()\n * \n **/\n or(indexName: string) {\n return new this.db.WhereClause(this._ctx.table, indexName, this);\n }\n\n /** Collection.reverse()\n * \n * https://dexie.org/docs/Collection/Collection.reverse()\n * \n **/\n reverse() {\n this._ctx.dir = (this._ctx.dir === \"prev\" ? \"next\" : \"prev\");\n if (this._ondirectionchange) this._ondirectionchange(this._ctx.dir);\n return this;\n }\n\n /** Collection.desc()\n * \n * https://dexie.org/docs/Collection/Collection.desc()\n * \n **/\n desc() {\n return this.reverse();\n }\n\n /** Collection.eachKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachKey()\n * \n **/\n eachKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.key, cursor); });\n }\n\n /** Collection.eachUniqueKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachUniqueKey()\n * \n **/\n eachUniqueKey(cb?) {\n this._ctx.unique = \"unique\";\n return this.eachKey(cb);\n }\n\n /** Collection.eachPrimaryKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachPrimaryKey()\n * \n **/\n eachPrimaryKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); });\n }\n\n /** Collection.keys()\n * \n * https://dexie.org/docs/Collection/Collection.keys()\n * \n **/\n keys(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.key);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.primaryKeys()\n * \n * https://dexie.org/docs/Collection/Collection.primaryKeys()\n * \n **/\n primaryKeys(cb?) : PromiseExtended {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAllKeys() or\n // IDBKeyRange.getAllKeys():\n return this._read(trans => {\n var index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n values: false,\n limit: ctx.limit,\n query: {\n index,\n range: ctx.range\n }});\n }).then(({result})=>result).then(cb);\n }\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.primaryKey);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.uniqueKeys()\n * \n * https://dexie.org/docs/Collection/Collection.uniqueKeys()\n * \n **/\n uniqueKeys(cb?) {\n this._ctx.unique = \"unique\";\n return this.keys(cb);\n }\n\n /** Collection.firstKey()\n * \n * https://dexie.org/docs/Collection/Collection.firstKey()\n * \n **/\n firstKey(cb?) {\n return this.limit(1).keys(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.lastKey()\n * \n * https://dexie.org/docs/Collection/Collection.lastKey()\n * \n **/\n lastKey(cb?) {\n return this.reverse().firstKey(cb);\n }\n\n /** Collection.distinct()\n * \n * https://dexie.org/docs/Collection/Collection.distinct()\n * \n **/\n distinct() {\n var ctx = this._ctx,\n idx = ctx.index && ctx.table.schema.idxByName[ctx.index];\n if (!idx || !idx.multi) return this; // distinct() only makes differencies on multiEntry indexes.\n var set = {};\n addFilter(this._ctx, function (cursor: DBCoreCursor) {\n var strKey = cursor.primaryKey.toString(); // Converts any Date to String, String to String, Number to String and Array to comma-separated string\n var found = hasOwn(set, strKey);\n set[strKey] = true;\n return !found;\n });\n return this;\n }\n\n //\n // Methods that mutate storage\n //\n\n /** Collection.modify()\n * \n * https://dexie.org/docs/Collection/Collection.modify()\n * \n **/\n modify(changes: UpdateSpec | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n var ctx = this._ctx;\n return this._write(trans => {\n var modifyer: (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean\n if (typeof changes === 'function') {\n // Changes is a function that may update, add or delete propterties or even require a deletion the object itself (delete this.item)\n modifyer = changes as (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean;\n } else {\n // changes is a set of {keyPath: value} and no one is listening to the updating hook.\n var keyPaths = keys(changes);\n var numKeys = keyPaths.length;\n modifyer = function (item) {\n let anythingModified = false;\n for (let i = 0; i < numKeys; ++i) {\n let keyPath = keyPaths[i];\n let val = changes[keyPath];\n let origVal = getByKeyPath(item, keyPath);\n\n if (val instanceof PropModification) {\n setByKeyPath(item, keyPath, val.execute(origVal));\n anythingModified = true;\n } else if (origVal !== val) {\n setByKeyPath(item, keyPath, val); // Adding {keyPath: undefined} means that the keyPath should be deleted. Handled by setByKeyPath\n anythingModified = true;\n }\n }\n return anythingModified;\n };\n }\n\n const coreTable = ctx.table.core;\n const {outbound, extractKey} = coreTable.schema.primaryKey;\n const limit = this.db._options.modifyChunkSize || 200;\n const totalFailures = [];\n let successCount = 0;\n const failedKeys: IndexableType[] = [];\n const applyMutateResult = (expectedCount: number, res: DBCoreMutateResponse) => {\n const {failures, numFailures} = res;\n successCount += expectedCount - numFailures;\n for (let pos of keys(failures)) {\n totalFailures.push(failures[pos]);\n }\n }\n return this.clone().primaryKeys().then(keys => {\n const criteria = isPlainKeyRange(ctx) &&\n ctx.limit === Infinity &&\n (typeof changes !== 'function' || changes === deleteCallback) && {\n index: ctx.index,\n range: ctx.range\n };\n\n const nextChunk = (offset: number) => {\n const count = Math.min(limit, keys.length - offset);\n return coreTable.getMany({\n trans,\n keys: keys.slice(offset, offset + count),\n cache: \"immutable\" // Optimize for 2 things:\n // 1) observability-middleware can track changes better.\n // 2) hooks middleware don't have to query the existing values again when tracking changes.\n // We can use \"immutable\" because we promise to not touch the values we retrieve here!\n }).then(values => {\n const addValues = [];\n const putValues = [];\n const putKeys = outbound ? [] : null;\n const deleteKeys = [];\n for (let i=0; i 0 &&\n coreTable.mutate({trans, type: 'add', values: addValues})\n .then(res => {\n for (let pos in res.failures) {\n // Remove from deleteKeys the key of the object that failed to change its primary key\n deleteKeys.splice(parseInt(pos), 1);\n }\n applyMutateResult(addValues.length, res);\n })\n ).then(()=>(putValues.length > 0 || (criteria && typeof changes === 'object')) &&\n coreTable.mutate({\n trans,\n type: 'put',\n keys: putKeys,\n values: putValues,\n criteria,\n changeSpec: typeof changes !== 'function'\n && changes,\n isAdditionalChunk: offset > 0\n }).then(res=>applyMutateResult(putValues.length, res))\n ).then(()=>(deleteKeys.length > 0 || (criteria && changes === deleteCallback)) &&\n coreTable.mutate({\n trans,\n type: 'delete',\n keys: deleteKeys,\n criteria,\n isAdditionalChunk: offset > 0\n }).then(res=>applyMutateResult(deleteKeys.length, res))\n ).then(()=>{\n return keys.length > offset + count && nextChunk(offset + limit);\n });\n });\n }\n\n return nextChunk(0).then(()=>{\n if (totalFailures.length > 0)\n throw new ModifyError(\"Error modifying one or more objects\", totalFailures, successCount, failedKeys as IndexableTypeArrayReadonly);\n\n return keys.length;\n });\n });\n\n });\n }\n\n /** Collection.delete()\n * \n * https://dexie.org/docs/Collection/Collection.delete()\n * \n **/\n delete() : PromiseExtended {\n var ctx = this._ctx,\n range = ctx.range;\n //deletingHook = ctx.table.hook.deleting.fire,\n //hasDeleteHook = deletingHook !== nop;\n if (isPlainKeyRange(ctx) &&\n (ctx.isPrimKey || range.type === DBCoreRangeType.Any)) // if no range, we'll use clear().\n {\n // May use IDBObjectStore.delete(IDBKeyRange) in this case (Issue #208)\n // For chromium, this is the way most optimized version.\n // For IE/Edge, this could hang the indexedDB engine and make operating system instable\n // (https://gist.github.com/dfahlander/5a39328f029de18222cf2125d56c38f7)\n return this._write(trans => {\n // Our API contract is to return a count of deleted items, so we have to count() before delete().\n const {primaryKey} = ctx.table.core.schema;\n const coreRange = range;\n return ctx.table.core.count({trans, query: {index: primaryKey, range: coreRange}}).then(count => {\n return ctx.table.core.mutate({trans, type: 'deleteRange', range: coreRange})\n .then(({failures, lastResult, results, numFailures}) => {\n if (numFailures) throw new ModifyError(\"Could not delete some values\",\n Object.keys(failures).map(pos => failures[pos]),\n count - numFailures);\n return count - numFailures;\n });\n });\n });\n }\n\n return this.modify(deleteCallback);\n }\n}\n\nconst deleteCallback = (value, ctx) => ctx.value = null;\n","import { Dexie } from '../../classes/dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Collection } from './collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\nimport { mirror } from '../../functions/chaining-functions';\n\n/** Constructs a Collection instance. */\nexport interface CollectionConstructor {\n new(whereClause?: WhereClause | null, keyRangeGenerator?: () => DBCoreKeyRange): Collection;\n prototype: Collection;\n}\n\n/** Generates a Collection constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createCollectionConstructor(db: Dexie) {\n return makeClassConstructor(\n Collection.prototype,\n\n function Collection(\n this: Collection,\n whereClause?: WhereClause | null,\n keyRangeGenerator?: () => DBCoreKeyRange)\n {\n this.db = db;\n let keyRange = AnyRange, error = null;\n if (keyRangeGenerator) try {\n keyRange = keyRangeGenerator();\n } catch (ex) {\n error = ex;\n }\n\n const whereCtx = whereClause._ctx;\n const table = whereCtx.table;\n const readingHook = table.hook.reading.fire;\n this._ctx = {\n table: table,\n index: whereCtx.index,\n isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)),\n range: keyRange,\n keysOnly: false,\n dir: \"next\",\n unique: \"\",\n algorithm: null,\n filter: null,\n replayFilter: null,\n justLimit: true, // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: null,\n offset: 0,\n limit: Infinity,\n error: error, // If set, any promise must be rejected with this error\n or: whereCtx.or,\n valueMapper: readingHook !== mirror ? readingHook : null\n };\n }\n );\n}\n","import { IndexableType } from '../public/types/indexable-type';\n\nexport function simpleCompare(a, b) {\n return a < b ? -1 : a === b ? 0 : 1;\n}\n\nexport function simpleCompareReverse(a, b) {\n return a > b ? -1 : a === b ? 0 : 1;\n}\n","import { WhereClause } from './where-clause';\nimport { Collection } from '../collection';\nimport { STRING_EXPECTED } from '../../globals/constants';\nimport { simpleCompare, simpleCompareReverse } from '../../functions/compare-functions';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange, DBCoreRangeType } from '../../public/types/dbcore';\n\nexport function fail(collectionOrWhereClause: Collection | WhereClause, err, T?) {\n var collection = collectionOrWhereClause instanceof WhereClause ?\n new collectionOrWhereClause.Collection (collectionOrWhereClause) :\n collectionOrWhereClause;\n \n collection._ctx.error = T ? new T(err) : new TypeError(err);\n return collection;\n}\n\nexport function emptyCollection(whereClause: WhereClause) {\n return new whereClause.Collection (whereClause, () => rangeEqual(\"\")).limit(0);\n}\n\nexport function upperFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toUpperCase() :\n (s: string) => s.toLowerCase();\n}\n\nexport function lowerFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toLowerCase() :\n (s: string) => s.toUpperCase();\n}\n\nexport function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) {\n var length = Math.min(key.length, lowerNeedle.length);\n var llp = -1;\n for (var i = 0; i < length; ++i) {\n var lwrKeyChar = lowerKey[i];\n if (lwrKeyChar !== lowerNeedle[i]) {\n if (cmp(key[i], upperNeedle[i]) < 0) return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1);\n if (cmp(key[i], lowerNeedle[i]) < 0) return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1);\n if (llp >= 0) return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1);\n return null;\n }\n if (cmp(key[i], lwrKeyChar) < 0) llp = i;\n }\n if (length < lowerNeedle.length && dir === \"next\") return key + upperNeedle.substr(key.length);\n if (length < key.length && dir === \"prev\") return key.substr(0, upperNeedle.length);\n return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1));\n}\n\nexport function addIgnoreCaseAlgorithm(whereClause: WhereClause, match, needles, suffix) {\n /// \n var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix,\n needlesLen = needles.length;\n if (!needles.every(s => typeof s === 'string')) {\n return fail(whereClause, STRING_EXPECTED);\n }\n function initDirection(dir) {\n upper = upperFactory(dir);\n lower = lowerFactory(dir);\n compare = (dir === \"next\" ? simpleCompare : simpleCompareReverse);\n var needleBounds = needles.map(function (needle){\n return {lower: lower(needle), upper: upper(needle)};\n }).sort(function(a,b) {\n return compare(a.lower, b.lower);\n });\n upperNeedles = needleBounds.map(function (nb){ return nb.upper; });\n lowerNeedles = needleBounds.map(function (nb){ return nb.lower; });\n direction = dir;\n nextKeySuffix = (dir === \"next\" ? \"\" : suffix);\n }\n initDirection(\"next\");\n\n var c = new whereClause.Collection (\n whereClause,\n ()=>createRange(upperNeedles[0], lowerNeedles[needlesLen-1] + suffix)\n );\n\n c._ondirectionchange = function (direction) {\n // This event onlys occur before filter is called the first time.\n initDirection(direction);\n };\n\n var firstPossibleNeedle = 0;\n\n c._addAlgorithm(function (cursor, advance, resolve) {\n /// \n /// \n /// \n var key = cursor.key;\n if (typeof key !== 'string') return false;\n var lowerKey = lower(key);\n if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) {\n return true;\n } else {\n var lowestPossibleCasing = null;\n for (var i=firstPossibleNeedle; i 0) {\n lowestPossibleCasing = casing;\n }\n }\n if (lowestPossibleCasing !== null) {\n advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); });\n } else {\n advance(resolve);\n }\n return false;\n }\n });\n return c;\n}\n\nexport function createRange (lower: IndexableType, upper: IndexableType, lowerOpen?: boolean, upperOpen?: boolean): DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Range,\n lower,\n upper,\n lowerOpen,\n upperOpen\n };\n}\n\nexport function rangeEqual (value: IndexableType) : DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Equal,\n lower: value,\n upper: value\n };\n}\n","import { WhereClause as IWhereClause } from \"../../public/types/where-clause\";\nimport { Collection } from \"../collection\";\nimport { Table } from \"../table\";\nimport { IndexableType } from \"../../public/types/indexable-type\";\nimport { emptyCollection, fail, addIgnoreCaseAlgorithm, createRange, rangeEqual } from './where-clause-helpers';\nimport { INVALID_KEY_ARGUMENT, STRING_EXPECTED, maxString, minKey } from '../../globals/constants';\nimport { getArrayOf, NO_CHAR_ARRAY } from '../../functions/utils';\nimport { exceptions } from '../../errors';\nimport { Dexie } from '../dexie';\nimport { Collection as ICollection} from \"../../public/types/collection\";\n\n/** class WhereClause\n * \n * https://dexie.org/docs/WhereClause/WhereClause\n */\nexport class WhereClause implements IWhereClause {\n db: Dexie;\n _IDBKeyRange: typeof IDBKeyRange;\n _ctx: {\n table: Table;\n index: string;\n or: Collection;\n }\n _cmp: (a: IndexableType, b: IndexableType) => number;\n _ascending: (a: IndexableType, b: IndexableType) => number;\n _descending: (a: IndexableType, b: IndexableType) => number;\n _min: (a: IndexableType, b: IndexableType) => IndexableType;\n _max: (a: IndexableType, b: IndexableType) => IndexableType;\n\n get Collection() {\n return this._ctx.table.db.Collection;\n }\n\n /** WhereClause.between()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.between()\n * \n **/\n between(lower: IndexableType, upper: IndexableType, includeLower?: boolean, includeUpper?: boolean) {\n includeLower = includeLower !== false; // Default to true\n includeUpper = includeUpper === true; // Default to false\n try {\n if ((this._cmp(lower, upper) > 0) ||\n (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper)))\n return emptyCollection(this); // Workaround for idiotic W3C Specification that DataError must be thrown if lower > upper. The natural result would be to return an empty collection.\n return new this.Collection(this, ()=>createRange(lower, upper, !includeLower, !includeUpper));\n } catch (e) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n }\n\n /** WhereClause.equals()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equals()\n * \n **/\n equals(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => rangeEqual(value)) as ICollection;\n }\n\n /** WhereClause.above()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.above()\n * \n **/\n above(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, true));\n }\n\n /** WhereClause.aboveOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.aboveOrEqual()\n * \n **/\n aboveOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, false));\n }\n\n /** WhereClause.below()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.below()\n * \n **/\n below(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value, false, true));\n }\n\n /** WhereClause.belowOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.belowOrEqual()\n * \n **/\n belowOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value));\n }\n\n /** WhereClause.startsWith()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWith()\n * \n **/\n startsWith(str: string) {\n if (typeof str !== 'string') return fail(this, STRING_EXPECTED);\n return this.between(str, str + maxString, true, true);\n }\n\n /** WhereClause.startsWithIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithIgnoreCase()\n * \n **/\n startsWithIgnoreCase(str: string) {\n if (str === \"\") return this.startsWith(str);\n return addIgnoreCaseAlgorithm(this, (x, a) => x.indexOf(a[0]) === 0, [str], maxString);\n }\n\n /** WhereClause.equalsIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equalsIgnoreCase()\n * \n **/\n equalsIgnoreCase(str: string) {\n return addIgnoreCaseAlgorithm(this, (x, a) => x === a[0], [str], \"\");\n }\n\n /** WhereClause.anyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOfIgnoreCase()\n * \n **/\n anyOfIgnoreCase(...values: string[]): Collection;\n anyOfIgnoreCase(values: string[]): Collection;\n anyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.indexOf(x) !== -1, set, \"\");\n }\n\n /** WhereClause.startsWithAnyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOfIgnoreCase()\n * \n **/\n startsWithAnyOfIgnoreCase(...values: string[]): Collection;\n startsWithAnyOfIgnoreCase(values: string[]): Collection;\n startsWithAnyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.some(n => x.indexOf(n) === 0), set, maxString);\n }\n\n /** WhereClause.anyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOf()\n * \n **/\n anyOf(...values: string[]): Collection;\n anyOf(values: string[]): Collection;\n anyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n let compare = this._cmp;\n try { set.sort(compare); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n if (set.length === 0) return emptyCollection(this);\n const c = new this.Collection(this, () => createRange(set[0], set[set.length - 1]));\n\n c._ondirectionchange = direction => {\n compare = (direction === \"next\" ?\n this._ascending :\n this._descending);\n set.sort(compare);\n };\n\n let i = 0;\n c._addAlgorithm((cursor, advance, resolve) => {\n const key = cursor.key;\n while (compare(key, set[i]) > 0) {\n // The cursor has passed beyond this key. Check next.\n ++i;\n if (i === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (compare(key, set[i]) === 0) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => { cursor.continue(set[i]); });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.notEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.notEqual()\n * \n **/\n notEqual(value: IndexableType) {\n return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.noneOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.noneOf()\n * \n **/\n noneOf(...values: string[]): Collection;\n noneOf(values: string[]): Collection;\n noneOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return new this.Collection(this); // Return entire collection.\n try { set.sort(this._ascending); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n // Transform [\"a\",\"b\",\"c\"] to a set of ranges for between/above/below: [[minKey,\"a\"], [\"a\",\"b\"], [\"b\",\"c\"], [\"c\",maxKey]]\n const ranges = set.reduce(\n (res, val) => res ?\n res.concat([[res[res.length - 1][1], val]]) :\n [[minKey, val]],\n null);\n ranges.push([set[set.length - 1], this.db._maxKey]);\n return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.inAnyRange()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.inAnyRange()\n * \n **/\n inAnyRange(\n ranges: ReadonlyArray<{ 0: IndexableType, 1: IndexableType }>,\n options?: { includeLowers?: boolean, includeUppers?: boolean })\n {\n const cmp = this._cmp,\n ascending = this._ascending,\n descending = this._descending,\n min = this._min,\n max = this._max;\n\n if (ranges.length === 0) return emptyCollection(this);\n if (!ranges.every(range =>\n range[0] !== undefined &&\n range[1] !== undefined &&\n ascending(range[0], range[1]) <= 0)) {\n return fail(\n this,\n \"First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower\",\n exceptions.InvalidArgument);\n }\n const includeLowers = !options || options.includeLowers !== false; // Default to true\n const includeUppers = options && options.includeUppers === true; // Default to false\n\n function addRange(ranges, newRange) {\n let i = 0, l = ranges.length;\n for (; i < l; ++i) {\n const range = ranges[i];\n if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) {\n range[0] = min(range[0], newRange[0]);\n range[1] = max(range[1], newRange[1]);\n break;\n }\n }\n if (i === l)\n ranges.push(newRange);\n return ranges;\n }\n\n let sortDirection = ascending;\n function rangeSorter(a, b) { return sortDirection(a[0], b[0]); }\n\n // Join overlapping ranges\n let set;\n try {\n set = ranges.reduce(addRange, []);\n set.sort(rangeSorter);\n } catch (ex) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n\n let rangePos = 0;\n const keyIsBeyondCurrentEntry = includeUppers ?\n key => ascending(key, set[rangePos][1]) > 0 :\n key => ascending(key, set[rangePos][1]) >= 0;\n\n const keyIsBeforeCurrentEntry = includeLowers ?\n key => descending(key, set[rangePos][0]) > 0 :\n key => descending(key, set[rangePos][0]) >= 0;\n\n function keyWithinCurrentRange(key) {\n return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key);\n }\n\n let checkKey = keyIsBeyondCurrentEntry;\n\n const c = new this.Collection(\n this,\n () => createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers));\n\n c._ondirectionchange = direction => {\n if (direction === \"next\") {\n checkKey = keyIsBeyondCurrentEntry;\n sortDirection = ascending;\n } else {\n checkKey = keyIsBeforeCurrentEntry;\n sortDirection = descending;\n }\n set.sort(rangeSorter);\n };\n\n c._addAlgorithm((cursor, advance, resolve) => {\n var key = cursor.key;\n while (checkKey(key)) {\n // The cursor has passed beyond this key. Check next.\n ++rangePos;\n if (rangePos === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (keyWithinCurrentRange(key)) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else if (this._cmp(key, set[rangePos][1]) === 0 || this._cmp(key, set[rangePos][0]) === 0) {\n // includeUpper or includeLower is false so keyWithinCurrentRange() returns false even though we are at range border.\n // Continue to next key but don't include this one.\n return false;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => {\n if (sortDirection === ascending) cursor.continue(set[rangePos][0]);\n else cursor.continue(set[rangePos][1]);\n });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.startsWithAnyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOf()\n * \n **/\n startsWithAnyOf(...prefixes: string[]): Collection;\n startsWithAnyOf(prefixes: string[]): Collection;\n startsWithAnyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n\n if (!set.every(s => typeof s === 'string')) {\n return fail(this, \"startsWithAnyOf() only works with strings\");\n }\n if (set.length === 0) return emptyCollection(this);\n\n return this.inAnyRange(set.map((str: string) => [str, str + maxString]));\n }\n\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { WhereClause } from './where-clause';\nimport { Table } from '../table';\nimport { Collection } from '../collection';\nimport { exceptions } from '../../errors';\nimport { cmp } from '../../functions/cmp';\n\nexport interface WhereClauseConstructor {\n new(table: Table, index?: string, orCollection?: Collection): WhereClause;\n prototype: WhereClause;\n}\n\n/** Generates a WhereClause constructor.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createWhereClauseConstructor(db: Dexie) {\n return makeClassConstructor(\n WhereClause.prototype,\n\n function WhereClause(this: WhereClause, table: Table, index?: string, orCollection?: Collection) {\n this.db = db;\n this._ctx = {\n table: table,\n index: index === \":id\" ? null : index,\n or: orCollection\n };\n this._cmp = this._ascending = cmp;\n this._descending = (a, b) => cmp(b, a);\n this._max = (a, b) => cmp(a,b) > 0 ? a : b;\n this._min = (a, b) => cmp(a,b) < 0 ? a : b;\n this._IDBKeyRange = db._deps.IDBKeyRange;\n if (!this._IDBKeyRange) throw new exceptions.MissingAPI();\n }\n );\n}\n","import { wrap } from \"../helpers/promise\";\n\nexport function eventRejectHandler(reject) {\n return wrap(function (event) {\n preventDefault(event);\n reject (event.target.error);\n return false;\n });\n}\n\nexport function eventSuccessHandler (resolve) {\n return wrap(function (event){\n resolve(event.target.result);\n });\n}\n\nexport function hookedEventRejectHandler (reject) {\n return wrap(function (event) {\n // See comment on hookedEventSuccessHandler() why wrap() is needed only when supporting hooks.\n \n var req = event.target,\n err = req.error,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n hookErrorHandler = ctx && ctx.onerror;\n hookErrorHandler && hookErrorHandler(err);\n preventDefault(event);\n reject (err);\n return false;\n });\n}\n\nexport function hookedEventSuccessHandler(resolve) {\n // wrap() is needed when calling hooks because the rare scenario of:\n // * hook does a db operation that fails immediately (IDB throws exception)\n // For calling db operations on correct transaction, wrap makes sure to set PSD correctly.\n // wrap() will also execute in a virtual tick.\n // * If not wrapped in a virtual tick, direct exception will launch a new physical tick.\n // * If this was the last event in the bulk, the promise will resolve after a physical tick\n // and the transaction will have committed already.\n // If no hook, the virtual tick will be executed in the reject()/resolve of the final promise,\n // because it is always marked with _lib = true when created using Transaction._promise().\n return wrap(function(event) {\n var req = event.target,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n result = ctx.value || req.result, // Pass the object value on updates. The result from IDB is the primary key.\n hookSuccessHandler = ctx && ctx.onsuccess;\n hookSuccessHandler && hookSuccessHandler(result);\n resolve && resolve(result);\n }, resolve);\n}\n\n\nexport function preventDefault(event) {\n if (event.stopPropagation) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.stopPropagation();\n if (event.preventDefault) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.preventDefault();\n}\n\nexport function BulkErrorHandlerCatchAll(errorList, done?, supportHooks?) {\n return (supportHooks ? hookedEventRejectHandler : eventRejectHandler)(e => {\n errorList.push(e);\n done && done();\n });\n}\n\n","import Events from '../helpers/Events';\nimport { GlobalDexieEvents } from '../public/types/db-events';\n\nexport const DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated' as 'storagemutated';\n\n// Name of the global event fired using DOM dispatchEvent (if not in node).\n// Reason for propagating this as a DOM event is for getting reactivity across\n// multiple versions of Dexie within the same app (as long as they are\n// compatible with regards to the event data).\n// If the ObservabilitySet protocol change in a way that would not be backward\n// compatible, make sure also update the event name to a new number at the end\n// so that two Dexie instances of different versions continue to work together\n// - maybe not able to communicate but won't fail due to unexpected data in\n// the detail property of the CustomEvent. If so, also make sure to udpate\n// docs and explain at which Dexie version the new name and format of the event\n// is being used.\nexport const STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1';\n\nexport const globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME) as GlobalDexieEvents;\n","import { Transaction as ITransaction } from '../../public/types/transaction';\nimport { DexiePromise, wrap, rejection } from \"../../helpers/promise\";\nimport { DbSchema } from '../../public/types/db-schema';\nimport { assert, hasOwn } from '../../functions/utils';\nimport { PSD, usePSD } from '../../helpers/promise';\nimport { Dexie } from '../dexie';\nimport { exceptions } from '../../errors';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { preventDefault } from '../../functions/event-wrappers';\nimport { newScope } from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { Table } from '../table';\nimport { globalEvents } from '../../globals/global-events';\n\n/** Transaction\n * \n * https://dexie.org/docs/Transaction/Transaction\n * \n **/\nexport class Transaction implements ITransaction {\n db: Dexie;\n active: boolean;\n mode: IDBTransactionMode;\n chromeTransactionDurability: ChromeTransactionDurability;\n idbtrans: IDBTransaction;\n storeNames: string[];\n explicit?: boolean;\n on: any;\n parent?: Transaction;\n schema: DbSchema;\n _memoizedTables: {[tableName: string]: Table};\n\n _reculock: number;\n _blockedFuncs: { 0: () => any, 1: any }[];\n _resolve: () => void;\n _reject: (Error) => void;\n _waitingFor: DexiePromise; // for waitFor()\n _waitingQueue: Function[]; // for waitFor()\n _spinCount: number; // Just for debugging waitFor()\n _completion: DexiePromise;\n\n //\n // Transaction internal methods (not required by API users, but needed internally and eventually by dexie extensions)\n //\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _lock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n // Temporary set all requests into a pending queue if they are called before database is ready.\n ++this._reculock; // Recursive read/write lock pattern using PSD (Promise Specific Data) instead of TLS (Thread Local Storage)\n if (this._reculock === 1 && !PSD.global) PSD.lockOwnerFor = this;\n return this;\n }\n\n /** Transaction._unlock()\n * \n * Internal method.\n */\n _unlock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n if (--this._reculock === 0) {\n if (!PSD.global) PSD.lockOwnerFor = null;\n while (this._blockedFuncs.length > 0 && !this._locked()) {\n var fnAndPSD = this._blockedFuncs.shift();\n try { usePSD(fnAndPSD[1], fnAndPSD[0]); } catch (e) { }\n }\n }\n return this;\n }\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _locked() {\n // Checks if any write-lock is applied on this transaction.\n // To simplify the Dexie API for extension implementations, we support recursive locks.\n // This is accomplished by using \"Promise Specific Data\" (PSD).\n // PSD data is bound to a Promise and any child Promise emitted through then() or resolve( new Promise() ).\n // PSD is local to code executing on top of the call stacks of any of any code executed by Promise():\n // * callback given to the Promise() constructor (function (resolve, reject){...})\n // * callbacks given to then()/catch()/finally() methods (function (value){...})\n // If creating a new independant Promise instance from within a Promise call stack, the new Promise will derive the PSD from the call stack of the parent Promise.\n // Derivation is done so that the inner PSD __proto__ points to the outer PSD.\n // PSD.lockOwnerFor will point to current transaction object if the currently executing PSD scope owns the lock.\n return this._reculock && PSD.lockOwnerFor !== this;\n }\n\n /** Transaction.create()\n * \n * Internal method.\n * \n */\n create(idbtrans?: IDBTransaction & {[prop: string]: any}) {\n if (!this.mode) return this;\n const idbdb = this.db.idbdb;\n const dbOpenError = this.db._state.dbOpenError;\n assert(!this.idbtrans);\n if (!idbtrans && !idbdb) {\n switch (dbOpenError && dbOpenError.name) {\n case \"DatabaseClosedError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.DatabaseClosed(dbOpenError);\n case \"MissingAPIError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError);\n default:\n // Make it clear that the user operation was not what caused the error - the error had occurred earlier on db.open()!\n throw new exceptions.OpenFailed(dbOpenError);\n }\n }\n if (!this.active) throw new exceptions.TransactionInactive();\n assert(this._completion._state === null); // Completion Promise must still be pending.\n\n idbtrans = this.idbtrans = idbtrans ||\n (this.db.core \n ? this.db.core.transaction(this.storeNames, this.mode as 'readwrite' | 'readonly', { durability: this.chromeTransactionDurability })\n : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })\n ) as IDBTransaction;\n\n idbtrans.onerror = wrap(ev => {\n preventDefault(ev);// Prohibit default bubbling to window.error\n this._reject(idbtrans.error);\n });\n idbtrans.onabort = wrap(ev => {\n preventDefault(ev);\n this.active && this._reject(new exceptions.Abort(idbtrans.error));\n this.active = false;\n this.on(\"abort\").fire(ev);\n });\n idbtrans.oncomplete = wrap(() => {\n this.active = false;\n this._resolve();\n if ('mutatedParts' in idbtrans) {\n globalEvents.storagemutated.fire(idbtrans[\"mutatedParts\"]);\n }\n });\n return this;\n }\n\n /** Transaction._promise()\n * \n * Internal method.\n */\n _promise(\n mode: IDBTransactionMode,\n fn: (resolve, reject, trans: Transaction) => PromiseLike | void,\n bWriteLock?: string | boolean): DexiePromise\n {\n if (mode === 'readwrite' && this.mode !== 'readwrite')\n return rejection(new exceptions.ReadOnly(\"Transaction is readonly\"));\n\n if (!this.active)\n return rejection(new exceptions.TransactionInactive());\n\n if (this._locked()) {\n return new DexiePromise((resolve, reject) => {\n this._blockedFuncs.push([() => {\n this._promise(mode, fn, bWriteLock).then(resolve, reject);\n }, PSD]);\n });\n\n } else if (bWriteLock) {\n return newScope(() => {\n var p = new DexiePromise((resolve, reject) => {\n this._lock();\n const rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p.finally(() => this._unlock());\n p._lib = true;\n return p;\n });\n\n } else {\n var p = new DexiePromise((resolve, reject) => {\n var rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p._lib = true;\n return p;\n }\n }\n\n /** Transaction._root()\n * \n * Internal method. Retrieves the root transaction in the tree of sub transactions.\n */\n _root() {\n return this.parent ? this.parent._root() : this;\n }\n\n /** Transaction.waitFor()\n * \n * Internal method. Can be accessed from the public API through\n * Dexie.waitFor(): https://dexie.org/docs/Dexie/Dexie.waitFor()\n * \n **/\n waitFor(promiseLike: PromiseLike) {\n // Always operate on the root transaction (in case this is a sub stransaction)\n var root = this._root();\n // For stability reasons, convert parameter to promise no matter what type is passed to waitFor().\n // (We must be able to call .then() on it.)\n const promise = DexiePromise.resolve(promiseLike);\n if (root._waitingFor) {\n // Already called waitFor(). Wait for both to complete.\n root._waitingFor = root._waitingFor.then(() => promise);\n } else {\n // We're not in waiting state. Start waiting state.\n root._waitingFor = promise;\n root._waitingQueue = [];\n // Start interacting with indexedDB until promise completes:\n var store = root.idbtrans.objectStore(root.storeNames[0]);\n (function spin() {\n ++root._spinCount; // For debugging only\n while (root._waitingQueue.length) (root._waitingQueue.shift())();\n if (root._waitingFor) store.get(-Infinity).onsuccess = spin;\n }());\n }\n var currentWaitPromise = root._waitingFor;\n return new DexiePromise((resolve, reject) => {\n promise.then(\n res => root._waitingQueue.push(wrap(resolve.bind(null, res))),\n err => root._waitingQueue.push(wrap(reject.bind(null, err)))\n ).finally(() => {\n if (root._waitingFor === currentWaitPromise) {\n // No one added a wait after us. Safe to stop the spinning.\n root._waitingFor = null;\n }\n });\n });\n } \n\n /** Transaction.abort()\n * \n * https://dexie.org/docs/Transaction/Transaction.abort()\n */\n abort() {\n if (this.active) {\n this.active = false;\n if (this.idbtrans) this.idbtrans.abort();\n this._reject(new exceptions.Abort());\n }\n }\n\n /** Transaction.table()\n * \n * https://dexie.org/docs/Transaction/Transaction.table()\n */\n table(tableName: string) {\n const memoizedTables = (this._memoizedTables || (this._memoizedTables = {}));\n if (hasOwn(memoizedTables, tableName))\n return memoizedTables[tableName];\n const tableSchema = this.schema[tableName];\n if (!tableSchema) {\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\"); \n }\n\n const transactionBoundTable = new this.db.Table(tableName, tableSchema, this);\n transactionBoundTable.core = this.db.core.table(tableName);\n memoizedTables[tableName] = transactionBoundTable;\n return transactionBoundTable;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Transaction } from './transaction';\nimport { DbSchema } from '../../public/types/db-schema';\nimport Events from '../../helpers/Events';\nimport Promise, { rejection } from '../../helpers/promise';\n\nexport interface TransactionConstructor {\n new (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction) : T;\n prototype: T;\n}\n\n/** Generates a Transaction constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTransactionConstructor(db: Dexie) {\n return makeClassConstructor>(\n Transaction.prototype,\n function Transaction (\n this: Transaction,\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction)\n {\n this.db = db;\n this.mode = mode;\n this.storeNames = storeNames;\n this.schema = dbschema;\n this.chromeTransactionDurability = chromeTransactionDurability;\n this.idbtrans = null;\n this.on = Events(this, \"complete\", \"error\", \"abort\");\n this.parent = parent || null;\n this.active = true;\n this._reculock = 0;\n this._blockedFuncs = [];\n this._resolve = null;\n this._reject = null;\n this._waitingFor = null;\n this._waitingQueue = null;\n this._spinCount = 0; // Just for debugging waitFor()\n this._completion = new Promise ((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n \n this._completion.then(\n ()=> {\n this.active = false;\n this.on.complete.fire();\n },\n e => {\n var wasActive = this.active;\n this.active = false;\n this.on.error.fire(e);\n this.parent ?\n this.parent._reject(e) :\n wasActive && this.idbtrans && this.idbtrans.abort();\n return rejection(e); // Indicate we actually DO NOT catch this error.\n });\n \n });\n}\n","import { IndexSpec } from '../public/types/index-spec';\n\nexport function createIndexSpec(\n name: string,\n keyPath: string | string[],\n unique: boolean,\n multi: boolean,\n auto: boolean,\n compound: boolean,\n isPrimKey: boolean\n): IndexSpec {\n return {\n name,\n keyPath,\n unique,\n multi,\n auto,\n compound,\n src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? \"++\" : \"\") + nameFromKeyPath(keyPath)\n }\n}\n\nexport function nameFromKeyPath (keyPath?: string | string[]): string {\n return typeof keyPath === 'string' ?\n keyPath :\n keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : \"\";\n}\n","import { IndexSpec } from '../public/types/index-spec';\nimport { TableSchema } from '../public/types/table-schema';\nimport { createIndexSpec } from './index-spec';\nimport { arrayToObject } from '../functions/utils';\n\nexport function createTableSchema (\n name: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n): TableSchema {\n return {\n name,\n primKey,\n indexes,\n mappedClass: null,\n idxByName: arrayToObject(indexes, index => [index.name, index])\n };\n}\n","import { maxString } from '../globals/constants';\n\nexport function safariMultiStoreFix(storeNames: string[]) {\n return storeNames.length === 1 ? storeNames[0] : storeNames;\n}\n\nexport function getNativeGetDatabaseNamesFn(indexedDB) {\n var fn = indexedDB && (indexedDB.getDatabaseNames || indexedDB.webkitGetDatabaseNames);\n return fn && fn.bind(indexedDB);\n}\n\nexport let getMaxKey = (IdbKeyRange: typeof IDBKeyRange) => {\n try {\n IdbKeyRange.only([[]]);\n getMaxKey = () => [[]];\n return [[]];\n } catch (e) {\n getMaxKey = () => maxString;\n return maxString;\n }\n}\n","import { getByKeyPath } from '../functions/utils';\n\nexport function getKeyExtractor (keyPath: null | string | string[]) : (a: any) => any {\n if (keyPath == null) {\n return () => undefined;\n } else if (typeof keyPath === 'string') {\n return getSinglePathKeyExtractor(keyPath);\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n\nexport function getSinglePathKeyExtractor(keyPath: string) {\n const split = keyPath.split('.');\n if (split.length === 1) {\n return obj => obj[keyPath];\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n","import {\n DBCore,\n DBCoreCursor,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryResponse,\n DBCoreRangeType,\n DBCoreSchema,\n DBCoreTableSchema,\n DBCoreTable,\n DBCoreMutateResponse,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { eventRejectHandler, preventDefault } from '../functions/event-wrappers';\nimport { wrap } from '../helpers/promise';\nimport { getMaxKey } from '../functions/quirks';\nimport { getKeyExtractor } from './get-key-extractor';\n\nexport function arrayify(arrayLike: {length: number, [index: number]: T}): T[] {\n return [].slice.call(arrayLike);\n}\nexport function pick(obj: T, props: Prop[]): Pick {\n const result = {} as Pick;\n props.forEach(prop => result[prop] = obj[prop]);\n return result;\n}\n\nlet _id_counter = 0;\n\nexport function getKeyPathAlias(keyPath: null | string | string[]) {\n return keyPath == null ?\n \":id\" :\n typeof keyPath === 'string' ?\n keyPath :\n `[${keyPath.join('+')}]`;\n}\n\nexport function createDBCore (\n db: IDBDatabase,\n IdbKeyRange: typeof IDBKeyRange,\n tmpTrans: IDBTransaction) : DBCore\n{\n function extractSchema(db: IDBDatabase, trans: IDBTransaction) : {schema: DBCoreSchema, hasGetAll: boolean} {\n const tables = arrayify(db.objectStoreNames);\n return {\n schema: {\n name: db.name,\n tables: tables.map(table => trans.objectStore(table)).map(store => {\n const {keyPath, autoIncrement} = store;\n const compound = isArray(keyPath);\n const outbound = keyPath == null;\n const indexByKeyPath: {[keyPathAlias: string]: DBCoreIndex} = {};\n const result = {\n name: store.name,\n primaryKey: {\n name: null,\n isPrimaryKey: true,\n outbound,\n compound,\n keyPath,\n autoIncrement,\n unique: true,\n extractKey: getKeyExtractor(keyPath)\n } as DBCoreIndex,\n indexes: arrayify(store.indexNames).map(indexName => store.index(indexName))\n .map(index => {\n const {name, unique, multiEntry, keyPath} = index;\n const compound = isArray(keyPath);\n const result: DBCoreIndex = {\n name,\n compound,\n keyPath,\n unique,\n multiEntry,\n extractKey: getKeyExtractor(keyPath)\n };\n indexByKeyPath[getKeyPathAlias(keyPath)] = result;\n return result;\n }),\n getIndexByKeyPath: (keyPath: null | string | string[]) => indexByKeyPath[getKeyPathAlias(keyPath)]\n };\n indexByKeyPath[\":id\"] = result.primaryKey;\n if (keyPath != null) {\n indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey;\n }\n return result;\n })\n },\n hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) &&\n !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604) // Bug with getAll() on Safari ver<604. See discussion following PR #579\n };\n }\n\n function makeIDBKeyRange (range: DBCoreKeyRange) : IDBKeyRange | null {\n if (range.type === DBCoreRangeType.Any) return null;\n if (range.type === DBCoreRangeType.Never) throw new Error(\"Cannot convert never type to IDBKeyRange\");\n const {lower, upper, lowerOpen, upperOpen} = range;\n const idbRange = lower === undefined ?\n upper === undefined ?\n null : //IDBKeyRange.lowerBound(-Infinity, false) : // Any range (TODO: Should we return null instead?)\n IdbKeyRange.upperBound(upper, !!upperOpen) : // below\n upper === undefined ?\n IdbKeyRange.lowerBound(lower, !!lowerOpen) : // above\n IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen);\n return idbRange;\n }\n\n function createDbCoreTable(tableSchema: DBCoreTableSchema): DBCoreTable {\n const tableName = tableSchema.name;\n\n function mutate ({trans, type, keys, values, range}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const outbound = store.keyPath == null;\n const isAddOrPut = type === \"put\" || type === \"add\";\n if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange')\n throw new Error (\"Invalid operation type: \" + type);\n\n const {length} = keys || values || {length: 1}; // keys.length if keys. values.length if values. 1 if range.\n if (keys && values && keys.length !== values.length) {\n throw new Error(\"Given keys array must have same length as given values array.\");\n }\n if (length === 0)\n // No items to write. Don't even bother!\n return resolve({numFailures: 0, failures: {}, results: [], lastResult: undefined});\n\n let req: IDBRequest;\n const reqs: IDBRequest[] = [];\n \n const failures: {[operationNumber: number]: Error} = [];\n let numFailures = 0;\n const errorHandler = \n event => {\n ++numFailures;\n preventDefault(event);\n };\n \n if (type === 'deleteRange') {\n // Here the argument is the range\n if (range.type === DBCoreRangeType.Never)\n return resolve({numFailures, failures, results: [], lastResult: undefined}); // Deleting the Never range shoulnt do anything.\n if (range.type === DBCoreRangeType.Any)\n reqs.push(req = store.clear()); // Deleting the Any range is equivalent to store.clear()\n else\n reqs.push(req = store.delete(makeIDBKeyRange(range)));\n } else {\n // No matter add, put or delete - find out arrays of first and second arguments to it.\n const [args1, args2] = isAddOrPut ?\n outbound ?\n [values, keys] :\n [values, null] :\n [keys, null];\n\n if (isAddOrPut) {\n for (let i=0; i {\n const lastResult = event.target.result;\n reqs.forEach((req, i) => req.error != null && (failures[i] = req.error));\n resolve({\n numFailures,\n failures,\n results: type === \"delete\" ? keys : reqs.map(req => req.result),\n lastResult\n });\n };\n \n req.onerror = event => { // wrap() not needed. All paths calling outside will wrap!\n errorHandler(event);\n done(event);\n };\n \n req.onsuccess = done;\n });\n }\n \n function openCursor ({trans, values, query, reverse, unique}: DBCoreOpenCursorRequest): Promise\n {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n // source\n const source = index.isPrimaryKey ?\n store :\n store.index(index.name);\n // direction\n const direction = reverse ?\n unique ?\n \"prevunique\" :\n \"prev\" :\n unique ?\n \"nextunique\" :\n \"next\";\n // request\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(makeIDBKeyRange(range), direction) :\n source.openKeyCursor(makeIDBKeyRange(range), direction);\n \n // iteration\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = wrap(ev => {\n\n const cursor = req.result as unknown as DBCoreCursor;\n if (!cursor) {\n resolve(null);\n return;\n }\n (cursor as any).___id = ++_id_counter;\n (cursor as any).done = false;\n const _cursorContinue = cursor.continue.bind(cursor);\n let _cursorContinuePrimaryKey = cursor.continuePrimaryKey;\n if (_cursorContinuePrimaryKey) _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor);\n const _cursorAdvance = cursor.advance.bind(cursor);\n const doThrowCursorIsNotStarted = ()=>{throw new Error(\"Cursor not started\");}\n const doThrowCursorIsStopped = ()=>{throw new Error(\"Cursor not stopped\");}\n (cursor as any).trans = trans;\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted;\n cursor.fail = wrap(reject);\n cursor.next = function (this: DBCoreCursor) {\n // next() must work with \"this\" pointer in order to function correctly for ProxyCursors (derived objects)\n // without having to re-define next() on each child.\n let gotOne = 1;\n return this.start(() => gotOne-- ? this.continue() : this.stop()).then(() => this);\n };\n cursor.start = (callback) => {\n //console.log(\"Starting cursor\", (cursor as any).___id);\n const iterationPromise = new Promise((resolveIteration, rejectIteration) =>{\n resolveIteration = wrap(resolveIteration);\n req.onerror = eventRejectHandler(rejectIteration);\n cursor.fail = rejectIteration;\n cursor.stop = value => {\n //console.log(\"Cursor stop\", cursor);\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped;\n resolveIteration(value);\n };\n });\n // Now change req.onsuccess to a callback that doesn't call initCursor but just observer.next()\n const guardedCallback = () => {\n if (req.result) {\n //console.log(\"Next result\", cursor);\n try {\n callback();\n } catch (err) {\n cursor.fail(err);\n }\n } else {\n (cursor as any).done = true;\n cursor.start = ()=>{throw new Error(\"Cursor behind last entry\");}\n cursor.stop();\n }\n }\n req.onsuccess = wrap(ev => {\n //cursor.continue = _cursorContinue;\n //cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n //cursor.advance = _cursorAdvance;\n req.onsuccess = guardedCallback;\n guardedCallback();\n });\n cursor.continue = _cursorContinue;\n cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n cursor.advance = _cursorAdvance;\n guardedCallback();\n return iterationPromise;\n };\n resolve(cursor);\n }, reject); \n });\n }\n \n function query (hasGetAll: boolean) {\n return (request: DBCoreQueryRequest) => {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {trans, values, limit, query} = request;\n const nonInfinitLimit = limit === Infinity ? undefined : limit;\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n if (limit === 0) return resolve({result: []});\n if (hasGetAll) {\n const req = values ?\n (source as any).getAll(idbKeyRange, nonInfinitLimit) :\n (source as any).getAllKeys(idbKeyRange, nonInfinitLimit);\n req.onsuccess = event => resolve({result: event.target.result});\n req.onerror = eventRejectHandler(reject);\n } else {\n let count = 0;\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(idbKeyRange) :\n source.openKeyCursor(idbKeyRange)\n const result = [];\n req.onsuccess = event => {\n const cursor = req.result as IDBCursorWithValue;\n if (!cursor) return resolve({result});\n result.push(values ? cursor.value : cursor.primaryKey);\n if (++count === limit) return resolve({result});\n cursor.continue();\n };\n req.onerror = eventRejectHandler(reject);\n }\n });\n };\n }\n \n return {\n name: tableName,\n schema: tableSchema,\n \n mutate,\n\n getMany ({trans, keys}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const length = keys.length;\n const result = new Array(length);\n let keyCount = 0;\n let callbackCount = 0;\n let valueCount = 0;\n let req: IDBRequest & {_pos?: number};\n \n const successHandler = event => {\n const req = event.target;\n if ((result[req._pos] = req.result) != null) ++valueCount;\n if (++callbackCount === keyCount) resolve(result);\n };\n const errorHandler = eventRejectHandler(reject);\n \n for (let i=0; i((resolve, reject) => {\n resolve = wrap (resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const req = store.get(key);\n req.onsuccess = event => resolve((event.target as any).result);\n req.onerror = eventRejectHandler(reject);\n });\n },\n\n query: query(hasGetAll),\n \n openCursor,\n\n count ({query, trans}) {\n const {index, range} = query;\n return new Promise((resolve, reject) => {\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n const req = idbKeyRange ? source.count(idbKeyRange) : source.count();\n req.onsuccess = wrap(ev => resolve((ev.target as IDBRequest).result));\n req.onerror = eventRejectHandler(reject);\n });\n }\n };\n }\n\n const {schema, hasGetAll} = extractSchema(db, tmpTrans);\n const tables = schema.tables.map(tableSchema => createDbCoreTable(tableSchema));\n const tableMap: {[name: string]: DBCoreTable} = {};\n tables.forEach(table => tableMap[table.name] = table);\n return {\n stack: \"dbcore\",\n \n transaction: db.transaction.bind(db),\n\n table(name: string) {\n const result = tableMap[name];\n if (!result) throw new Error(`Table '${name}' not found`);\n return tableMap[name];\n },\n\n MIN_KEY: -Infinity,\n\n MAX_KEY: getMaxKey(IdbKeyRange),\n\n schema\n\n };\n}\n","import { Dexie } from './';\nimport { createDBCore } from '../../dbcore/dbcore-indexeddb';\nimport { DBCore } from '../../public/types/dbcore';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { DexieStacks, Middleware } from '../../public/types/middleware';\nimport { exceptions } from '../../errors';\n\nfunction createMiddlewareStack(\n stackImpl: {stack: string},\n middlewares: Middleware<{stack: string}>[]): TStack {\n return middlewares.reduce((down, {create}) => ({...down, ...create(down)}), stackImpl) as TStack;\n} \n\nfunction createMiddlewareStacks(\n middlewares: {[StackName in keyof DexieStacks]?: Middleware[]},\n idbdb: IDBDatabase,\n {IDBKeyRange, indexedDB}: DexieDOMDependencies,\n tmpTrans: IDBTransaction): {[StackName in keyof DexieStacks]?: DexieStacks[StackName]}\n{\n const dbcore = createMiddlewareStack(\n createDBCore(idbdb, IDBKeyRange, tmpTrans),\n middlewares.dbcore);\n \n // TODO: Create other stacks the same way as above. They might be dependant on the result\n // of creating dbcore stack.\n\n return {\n dbcore\n };\n}\n\nexport function generateMiddlewareStacks(db: Dexie, tmpTrans: IDBTransaction) {\n const idbdb = tmpTrans.db;\n const stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans);\n db.core = stacks.dbcore!;\n db.tables.forEach(table => {\n const tableName = table.name;\n if (db.core.schema.tables.some(tbl => tbl.name === tableName)) {\n table.core = db.core.table(tableName);\n if (db[tableName] instanceof db.Table) {\n db[tableName].core = table.core;\n }\n }\n });\n}\n","import { Dexie } from '../dexie';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { _global } from \"../../globals/global\";\nimport { setProp, keys, slice, isArray, shallowClone, isAsyncFunction, defineProperty, getPropertyDescriptor } from '../../functions/utils';\nimport { Transaction } from '../transaction';\nimport { Version } from './version';\nimport Promise, { PSD, newScope, NativePromise, decrementExpectedAwaits, incrementExpectedAwaits } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { IndexSpec } from '../../public/types/index-spec';\nimport { createIndexSpec, nameFromKeyPath } from '../../helpers/index-spec';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { generateMiddlewareStacks } from '../dexie/generate-middleware-stacks';\nimport { debug } from '../../helpers/debug';\nimport { PromiseExtended } from '../../public/types/promise-extended';\n\nexport function setApiOnPlace(db: Dexie, objs: Object[], tableNames: string[], dbschema: DbSchema) {\n tableNames.forEach(tableName => {\n const schema = dbschema[tableName];\n objs.forEach(obj => {\n const propDesc = getPropertyDescriptor(obj, tableName);\n if (!propDesc || (\"value\" in propDesc && propDesc.value === undefined)) {\n // Either the prop is not declared, or it is initialized to undefined.\n if (obj === db.Transaction.prototype || obj instanceof db.Transaction) {\n // obj is a Transaction prototype (or prototype of a subclass to Transaction)\n // Make the API a getter that returns this.table(tableName)\n setProp(obj, tableName, {\n get(this: Transaction) { return this.table(tableName); },\n set(value: any) {\n // Issue #1039\n // Let \"this.schema = dbschema;\" and other props in transaction constructor work even if there's a name collision with the table name.\n defineProperty(this, tableName, {value, writable: true, configurable: true, enumerable: true});\n }\n });\n } else {\n // Table will not be bound to a transaction (will use Dexie.currentTransaction)\n obj[tableName] = new db.Table(tableName, schema);\n }\n }\n });\n });\n}\n\nexport function removeTablesApi(db: Dexie, objs: Object[]) {\n objs.forEach(obj => {\n for (let key in obj) {\n if (obj[key] instanceof db.Table) delete obj[key];\n }\n });\n}\n\nexport function lowerVersionFirst(a: Version, b: Version) {\n return a._cfg.version - b._cfg.version;\n}\n\nexport function runUpgraders(db: Dexie, oldVersion: number, idbUpgradeTrans: IDBTransaction, reject) {\n const globalSchema = db._dbSchema;\n if (idbUpgradeTrans.objectStoreNames.contains('$meta') && !globalSchema.$meta) {\n globalSchema.$meta = createTableSchema(\"$meta\", parseIndexSyntax(\"\")[0], []);\n db._storeNames.push('$meta');\n }\n const trans = db._createTransaction('readwrite', db._storeNames, globalSchema);\n trans.create(idbUpgradeTrans);\n trans._completion.catch(reject);\n const rejectTransaction = trans._reject.bind(trans);\n const transless = PSD.transless || PSD;\n newScope(() => {\n PSD.trans = trans;\n PSD.transless = transless;\n if (oldVersion === 0) {\n // Create tables:\n keys(globalSchema).forEach(tableName => {\n createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes);\n });\n generateMiddlewareStacks(db, idbUpgradeTrans);\n Promise.follow(() => db.on.populate.fire(trans)).catch(rejectTransaction);\n } else {\n generateMiddlewareStacks(db, idbUpgradeTrans);\n return getExistingVersion(db, trans, oldVersion)\n .then(oldVersion => updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans))\n .catch(rejectTransaction);\n }\n });\n}\n\nexport type UpgradeQueueItem = (idbtrans: IDBTransaction) => PromiseLike | void;\n\nexport function patchCurrentVersion(db: Dexie, idbUpgradeTrans: IDBTransaction) {\n createMissingTables(db._dbSchema, idbUpgradeTrans);\n if (idbUpgradeTrans.db.version % 10 === 0 && !idbUpgradeTrans.objectStoreNames.contains('$meta')) {\n // Rolled over to the next 10-ies due to many schema upgrades without bumping version.\n // No problem! We pin the database to its expected version by adding the $meta table so that next\n // time the programmer bumps the version and attaches, an upgrader, that upgrader will indeed run,\n // as well any further upgraders coming after that.\n idbUpgradeTrans.db.createObjectStore('$meta').add(Math.ceil((idbUpgradeTrans.db.version / 10) - 1), 'version');\n }\n const globalSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n adjustToExistingIndexNames(db, db._dbSchema, idbUpgradeTrans);\n const diff = getSchemaDiff(globalSchema, db._dbSchema);\n for (const tableChange of diff.change) {\n if (tableChange.change.length || tableChange.recreate) {\n console.warn(`Unable to patch indexes of table ${tableChange.name} because it has changes on the type of index or primary key.`);\n return;\n }\n const store = idbUpgradeTrans.objectStore(tableChange.name);\n tableChange.add.forEach(idx => {\n if (debug) console.debug(`Dexie upgrade patch: Creating missing index ${tableChange.name}.${idx.src}`);\n addIndex(store, idx);\n });\n }\n}\n\nfunction getExistingVersion(db: Dexie, trans: Transaction, oldVersion: number): PromiseExtended {\n // In normal case, existing version is the native installed version divided by 10.\n // However, in case more than 10 schema changes have been made on the same version (such as while\n // developing an app), the native version may have passed beyond a multiple of 10 within the same version.\n // When that happens, a table $meta will have been created, containing a single entry with key \"version\"\n // and the value of the real old version to use when running upgraders going forward.\n if (trans.storeNames.includes('$meta')) {\n return trans.table('$meta').get('version').then(metaVersion => {\n return metaVersion != null ? metaVersion : oldVersion\n })\n } else {\n return Promise.resolve(oldVersion);\n }\n}\n\nfunction updateTablesAndIndexes(\n db: Dexie,\n oldVersion: number,\n trans: Transaction,\n idbUpgradeTrans: IDBTransaction)\n{\n // Upgrade version to version, step-by-step from oldest to newest version.\n // Each transaction object will contain the table set that was current in that version (but also not-yet-deleted tables from its previous version)\n const queue: UpgradeQueueItem[] = [];\n const versions = db._versions;\n let globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n let anyContentUpgraderHasRun = false;\n \n const versToRun = versions.filter(v => v._cfg.version >= oldVersion);\n if (versToRun.length === 0) {\n // Important not to continue at this point.\n // Coming here means we've already patched schema in patchCurrentVersion() after having\n // incremented native version to a value above the declared highest version.\n // When being in this mode, it means that there might be different versions the db competing\n // about it with different version of the schema. Therefore, we must avoid deleting tables\n // or indexes here so that both versions can co-exist until the application has been upgraded to\n // a version that declares no lower than the native version.\n // If after that, a downgrade happens again, we'll end up here again, accepting both versions\n // And we'll stay in this state until app developer releases a new declared version.\n return Promise.resolve(); \n }\n \n versToRun.forEach(version => {\n queue.push(() => {\n const oldSchema = globalSchema;\n const newSchema = version._cfg.dbschema;\n adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans);\n adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans);\n\n globalSchema = db._dbSchema = newSchema;\n\n const diff = getSchemaDiff(oldSchema, newSchema);\n // Add tables \n diff.add.forEach(tuple => {\n createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes);\n });\n // Change tables\n diff.change.forEach(change => {\n if (change.recreate) {\n throw new exceptions.Upgrade(\"Not yet support for changing primary key\");\n } else {\n const store = idbUpgradeTrans.objectStore(change.name);\n // Add indexes\n change.add.forEach(idx => addIndex(store, idx));\n // Update indexes\n change.change.forEach(idx => {\n store.deleteIndex(idx.name);\n addIndex(store, idx);\n });\n // Delete indexes\n change.del.forEach(idxName => store.deleteIndex(idxName));\n }\n });\n\n const contentUpgrade = version._cfg.contentUpgrade;\n\n if (contentUpgrade && version._cfg.version > oldVersion) {\n // Update db.core with new tables and indexes:\n generateMiddlewareStacks(db, idbUpgradeTrans);\n trans._memoizedTables = {}; // Invalidate memoization as transaction shape may change between versions.\n\n anyContentUpgraderHasRun = true;\n\n // Add to-be-deleted tables to contentUpgrade transaction\n let upgradeSchema = shallowClone(newSchema);\n diff.del.forEach(table => {\n upgradeSchema[table] = oldSchema[table];\n });\n\n // Safe to affect Transaction.prototype globally in this moment,\n // because when this code runs, there may not be any other code\n // that can access any transaction instance, else than this particular\n // upgrader function.\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema), upgradeSchema);\n trans.schema = upgradeSchema;\n\n // Support for native async await.\n const contentUpgradeIsAsync = isAsyncFunction(contentUpgrade);\n if (contentUpgradeIsAsync) {\n incrementExpectedAwaits();\n }\n \n let returnValue: any;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = contentUpgrade(trans);\n if (returnValue) {\n if (contentUpgradeIsAsync) {\n // contentUpgrade is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n }\n }\n });\n return (returnValue && typeof returnValue.then === 'function' ?\n Promise.resolve(returnValue) : promiseFollowed.then(()=>returnValue));\n }\n });\n queue.push(idbtrans => {\n const newSchema = version._cfg.dbschema;\n // Delete old tables\n deleteRemovedTables(newSchema, idbtrans);\n // Restore the final API\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema);\n trans.schema = db._dbSchema;\n });\n // Maintain the $meta table after this version's tables and indexes has been created and content upgraders have run.\n queue.push(idbtrans => {\n if (db.idbdb.objectStoreNames.contains('$meta')) {\n if (Math.ceil(db.idbdb.version / 10) === version._cfg.version) {\n // Remove $meta table if it's no more needed - we are in line with the native version\n db.idbdb.deleteObjectStore('$meta');\n delete db._dbSchema.$meta;\n db._storeNames = db._storeNames.filter(name => name !== '$meta');\n } else {\n // We're still not in line with the native version. Make sure to update the virtual version\n // to the successfully run version\n idbtrans.objectStore('$meta').put(version._cfg.version, 'version');\n }\n }\n }); \n });\n\n // Now, create a queue execution engine\n function runQueue() {\n return queue.length ? Promise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) :\n Promise.resolve();\n }\n\n return runQueue().then(() => {\n createMissingTables(globalSchema, idbUpgradeTrans); // At last, make sure to create any missing tables. (Needed by addons that add stores to DB without specifying version)\n });\n}\n\nexport interface SchemaDiff {\n del: string[],\n add: [string, TableSchema][];\n change: TableSchemaDiff[];\n}\n\nexport interface TableSchemaDiff {\n name: string,\n recreate: boolean,\n del: string[],\n add: IndexSpec[],\n change: IndexSpec[]\n}\n\nexport function getSchemaDiff(oldSchema: DbSchema, newSchema: DbSchema): SchemaDiff {\n const diff: SchemaDiff = {\n del: [], // Array of table names\n add: [], // Array of [tableName, newDefinition]\n change: [] // Array of {name: tableName, recreate: newDefinition, del: delIndexNames, add: newIndexDefs, change: changedIndexDefs}\n };\n let table: string;\n for (table in oldSchema) {\n if (!newSchema[table]) diff.del.push(table);\n }\n for (table in newSchema) {\n const oldDef = oldSchema[table],\n newDef = newSchema[table];\n if (!oldDef) {\n diff.add.push([table, newDef]);\n } else {\n const change = {\n name: table,\n def: newDef,\n recreate: false,\n del: [],\n add: [],\n change: []\n };\n if (\n (\n // compare keyPaths no matter if string or string[]\n // compare falsy keypaths same no matter if they are null or empty string.\n ''+(oldDef.primKey.keyPath||'')\n ) !== (\n ''+(newDef.primKey.keyPath||'')\n ) ||\n // Compare the autoIncrement flag also\n (oldDef.primKey.auto !== newDef.primKey.auto))\n {\n // Primary key has changed. Remove and re-add table.\n change.recreate = true;\n diff.change.push(change);\n } else {\n // Same primary key. Just find out what differs:\n const oldIndexes = oldDef.idxByName;\n const newIndexes = newDef.idxByName;\n let idxName: string;\n for (idxName in oldIndexes) {\n if (!newIndexes[idxName]) change.del.push(idxName);\n }\n for (idxName in newIndexes) {\n const oldIdx = oldIndexes[idxName],\n newIdx = newIndexes[idxName];\n if (!oldIdx) change.add.push(newIdx);\n else if (oldIdx.src !== newIdx.src) change.change.push(newIdx);\n }\n if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) {\n diff.change.push(change);\n }\n }\n }\n }\n return diff;\n}\n\nexport function createTable(\n idbtrans: IDBTransaction,\n tableName: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n) {\n const store = idbtrans.db.createObjectStore(\n tableName,\n primKey.keyPath ?\n { keyPath: primKey.keyPath, autoIncrement: primKey.auto } :\n { autoIncrement: primKey.auto }\n );\n indexes.forEach(idx => addIndex(store, idx));\n return store;\n}\n\nexport function createMissingTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n keys(newSchema).forEach(tableName => {\n if (!idbtrans.db.objectStoreNames.contains(tableName)) {\n if (debug) console.debug('Dexie: Creating missing table', tableName);\n createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes);\n }\n });\n}\n\nexport function deleteRemovedTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n [].slice.call(idbtrans.db.objectStoreNames).forEach(storeName =>\n newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName));\n}\n\nexport function addIndex(store: IDBObjectStore, idx: IndexSpec) {\n store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi });\n}\n\nfunction buildGlobalSchema(\n db: Dexie,\n idbdb: IDBDatabase,\n tmpTrans: IDBTransaction\n) {\n const globalSchema = {};\n const dbStoreNames = slice(idbdb.objectStoreNames, 0);\n dbStoreNames.forEach(storeName => {\n const store = tmpTrans.objectStore(storeName);\n let keyPath = store.keyPath;\n const primKey = createIndexSpec(\n nameFromKeyPath(keyPath),\n keyPath || \"\",\n true,\n false,\n !!store.autoIncrement,\n keyPath && typeof keyPath !== \"string\",\n true\n );\n const indexes: IndexSpec[] = [];\n for (let j = 0; j < store.indexNames.length; ++j) {\n const idbindex = store.index(store.indexNames[j]);\n keyPath = idbindex.keyPath;\n var index = createIndexSpec(\n idbindex.name,\n keyPath,\n !!idbindex.unique,\n !!idbindex.multiEntry,\n false,\n keyPath && typeof keyPath !== \"string\",\n false\n );\n indexes.push(index);\n }\n globalSchema[storeName] = createTableSchema(storeName, primKey, indexes);\n });\n return globalSchema;\n}\n\nexport function readGlobalSchema(db: Dexie, idbdb: IDBDatabase, tmpTrans: IDBTransaction) {\n db.verno = idbdb.version / 10;\n const globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans);\n db._storeNames = slice(idbdb.objectStoreNames, 0);\n setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema);\n}\n\nexport function verifyInstalledSchema(db: Dexie, tmpTrans: IDBTransaction): boolean {\n const installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans);\n const diff = getSchemaDiff(installedSchema, db._dbSchema);\n return !(diff.add.length || diff.change.some(ch => ch.add.length || ch.change.length));\n}\n\nexport function adjustToExistingIndexNames(db: Dexie, schema: DbSchema, idbtrans: IDBTransaction) {\n // Issue #30 Problem with existing db - adjust to existing index names when migrating from non-dexie db\n const storeNames = idbtrans.db.objectStoreNames;\n\n for (let i = 0; i < storeNames.length; ++i) {\n const storeName = storeNames[i];\n const store = idbtrans.objectStore(storeName);\n db._hasGetAll = 'getAll' in store;\n\n for (let j = 0; j < store.indexNames.length; ++j) {\n const indexName = store.indexNames[j];\n const keyPath = store.index(indexName).keyPath;\n const dexieName = typeof keyPath === 'string' ? keyPath : \"[\" + slice(keyPath).join('+') + \"]\";\n if (schema[storeName]) {\n const indexSpec = schema[storeName].idxByName[dexieName];\n if (indexSpec) {\n indexSpec.name = indexName;\n delete schema[storeName].idxByName[dexieName];\n schema[storeName].idxByName[indexName] = indexSpec;\n }\n }\n }\n }\n\n // Bug with getAll() on Safari ver<604 on Workers only, see discussion following PR #579\n if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604)\n {\n db._hasGetAll = false;\n }\n}\n\nexport function parseIndexSyntax(primKeyAndIndexes: string): IndexSpec[] {\n return primKeyAndIndexes.split(',').map((index, indexNum) => {\n index = index.trim();\n const name = index.replace(/([&*]|\\+\\+)/g, \"\"); // Remove \"&\", \"++\" and \"*\"\n // Let keyPath of \"[a+b]\" be [\"a\",\"b\"]:\n const keyPath = /^\\[/.test(name) ? name.match(/^\\[(.*)\\]$/)[1].split('+') : name;\n\n return createIndexSpec(\n name,\n keyPath || null,\n /\\&/.test(index),\n /\\*/.test(index),\n /\\+\\+/.test(index),\n isArray(keyPath),\n indexNum === 0\n );\n });\n}\n","import { Version as IVersion } from '../../public/types/version';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { extend, keys } from '../../functions/utils';\nimport { Dexie } from '../dexie';\nimport { Transaction } from '../transaction';\nimport { removeTablesApi, setApiOnPlace, parseIndexSyntax } from './schema-helpers';\nimport { exceptions } from '../../errors';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\n\n/** class Version\n *\n * https://dexie.org/docs/Version/Version\n */\nexport class Version implements IVersion {\n db: Dexie;\n _cfg: {\n version: number,\n storesSource: { [tableName: string]: string | null },\n dbschema: DbSchema,\n tables: {},\n contentUpgrade: Function | null\n }\n\n _parseStoresSpec(stores: { [tableName: string]: string | null }, outSchema: DbSchema): any {\n keys(stores).forEach(tableName => {\n if (stores[tableName] !== null) {\n var indexes = parseIndexSyntax(stores[tableName]);\n var primKey = indexes.shift();\n primKey.unique = true;\n if (primKey.multi) throw new exceptions.Schema(\"Primary key cannot be multi-valued\");\n indexes.forEach(idx => {\n if (idx.auto) throw new exceptions.Schema(\"Only primary key can be marked as autoIncrement (++)\");\n if (!idx.keyPath) throw new exceptions.Schema(\"Index must have a name and cannot be an empty string\");\n });\n outSchema[tableName] = createTableSchema(tableName, primKey, indexes);\n }\n });\n }\n\n stores(stores: { [key: string]: string | null; }): IVersion {\n const db = this.db;\n this._cfg.storesSource = this._cfg.storesSource ?\n extend(this._cfg.storesSource, stores) :\n stores;\n const versions = db._versions;\n\n // Derive stores from earlier versions if they are not explicitely specified as null or a new syntax.\n const storesSpec: { [key: string]: string; } = {};\n let dbschema = {};\n versions.forEach(version => { // 'versions' is always sorted by lowest version first.\n extend(storesSpec, version._cfg.storesSource);\n dbschema = (version._cfg.dbschema = {});\n version._parseStoresSpec(storesSpec, dbschema);\n });\n // Update the latest schema to this version\n db._dbSchema = dbschema;\n // Update APIs\n removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]);\n setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema);\n db._storeNames = keys(dbschema);\n return this;\n }\n\n upgrade(upgradeFunction: (trans: Transaction) => PromiseLike | void): Version {\n this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction);\n return this;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Version } from './version';\n\nexport interface VersionConstructor {\n new(versionNumber: number): Version;\n prototype: Version;\n}\n\n/** Generates a Version constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createVersionConstructor(db: Dexie) {\n return makeClassConstructor(\n Version.prototype,\n\n function Version(this: Version, versionNumber: number) {\n this.db = db;\n this._cfg = {\n version: versionNumber,\n storesSource: null,\n dbschema: {},\n tables: {},\n contentUpgrade: null\n };\n });\n\n}\n","import { Dexie } from \"../classes/dexie/dexie\";\nimport { Table } from \"../public/types/table\";\nimport { DBNAMES_DB } from \"../globals/constants\";\nimport { DexieDOMDependencies } from \"../public/types/dexie-dom-dependencies\";\nimport { nop } from \"../functions/chaining-functions\";\n\ntype IDBKeyNamesVar = typeof IDBKeyRange;\n\nfunction getDbNamesTable(indexedDB: IDBFactory, IDBKeyRange: IDBKeyNamesVar) {\n let dbNamesDB = indexedDB[\"_dbNamesDB\"];\n if (!dbNamesDB) {\n dbNamesDB = indexedDB[\"_dbNamesDB\"] = new Dexie(DBNAMES_DB, {\n addons: [],\n indexedDB,\n IDBKeyRange,\n });\n dbNamesDB.version(1).stores({ dbnames: \"name\" });\n }\n return dbNamesDB.table(\"dbnames\") as Table<{ name: string }, string>;\n}\n\nfunction hasDatabasesNative(indexedDB: IDBFactory) {\n return indexedDB && typeof indexedDB.databases === \"function\";\n}\n\nexport function getDatabaseNames({\n indexedDB,\n IDBKeyRange,\n}: DexieDOMDependencies) {\n return hasDatabasesNative(indexedDB)\n ? Promise.resolve(indexedDB.databases()).then((infos) =>\n infos\n // Select name prop of infos:\n .map((info) => info.name)\n // Filter out DBNAMES_DB as previous Dexie or browser version would not have included it in the result.\n .filter((name) => name !== DBNAMES_DB)\n )\n : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys();\n}\n\nexport function _onDatabaseCreated(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).put({name}).catch(nop);\n}\n\nexport function _onDatabaseDeleted(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop);\n}\n","import { newScope } from '../../helpers/promise';\nimport { PSD } from '../../helpers/promise';\n\nexport function vip (fn) {\n // To be used by subscribers to the on('ready') event.\n // This will let caller through to access DB even when it is blocked while the db.ready() subscribers are firing.\n // This would have worked automatically if we were certain that the Provider was using Dexie.Promise for all asyncronic operations. The promise PSD\n // from the provider.connect() call would then be derived all the way to when provider would call localDatabase.applyChanges(). But since\n // the provider more likely is using non-promise async APIs or other thenable implementations, we cannot assume that.\n // Note that this method is only useful for on('ready') subscribers that is returning a Promise from the event. If not using vip()\n // the database could deadlock since it wont open until the returned Promise is resolved, and any non-VIPed operation started by\n // the caller will not resolve until database is opened.\n return newScope(function () {\n PSD.letThrough = true; // Make sure we are let through if still blocking db due to onready is firing.\n return fn();\n });\n}\n\n","/**\n * Work around Safari 14 IndexedDB open bug.\n *\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up. https://bugs.webkit.org/show_bug.cgi?id=226547\n * The only solution is to keep nudging it until it's awake.\n */\nfunction idbReady() {\n var isSafari = !navigator.userAgentData &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\//.test(navigator.userAgent);\n // No point putting other browsers or older versions of Safari through this mess.\n if (!isSafari || !indexedDB.databases)\n return Promise.resolve();\n var intervalId;\n return new Promise(function (resolve) {\n var tryIdb = function () { return indexedDB.databases().finally(resolve); };\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(function () { return clearInterval(intervalId); });\n}\n\nexport default idbReady;\n","import { cmp } from \"../functions/cmp\";\nimport { extend, iteratorSymbol, props } from '../functions/utils';\nimport { IndexableType } from '../public';\nimport {\n EmptyRange,\n IntervalTree,\n IntervalTreeNode,\n RangeSetConstructor,\n RangeSetPrototype,\n} from \"../public/types/rangeset\";\n\n/* An interval tree implementation to efficiently detect overlapping ranges of queried indexes.\n *\n * https://en.wikipedia.org/wiki/Interval_tree\n * \n */\n\nfunction isEmptyRange(node: IntervalTree | {from: IndexableType, to: IndexableType}): node is EmptyRange {\n return !(\"from\" in node);\n}\n\nexport type RangeSet = RangeSetPrototype & IntervalTree;\n\nexport const RangeSet = function(fromOrTree: any, to?: any) {\n if (this) {\n // Called with new()\n extend(this, arguments.length ? {d:1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree} : {d:0});\n } else {\n // Called without new()\n const rv = new RangeSet();\n if (fromOrTree && (\"d\" in fromOrTree)) {\n extend(rv, fromOrTree);\n }\n return rv;\n }\n} as RangeSetConstructor;\n\nprops(RangeSet.prototype, {\n add(rangeSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n mergeRanges(this, rangeSet);\n return this;\n },\n addKey(key: IndexableType) {\n addRange(this, key, key);\n return this;\n },\n addKeys(keys: IndexableType[]) {\n keys.forEach(key => addRange(this, key, key));\n return this;\n },\n\n [iteratorSymbol](): Iterator {\n return getRangeSetIterator(this);\n }\n});\n\nfunction addRange(target: IntervalTree, from: IndexableType, to: IndexableType) {\n const diff = cmp(from, to);\n // cmp() returns NaN if one of the args are IDB-invalid keys.\n // Avoid storing invalid keys in rangeset:\n if (isNaN(diff)) return;\n\n // Caller is trying to add a range where from is greater than to:\n if (diff > 0) throw RangeError();\n \n if (isEmptyRange(target)) return extend(target, { from, to, d: 1 });\n const left = target.l;\n const right = target.r;\n if (cmp(to, target.from) < 0) {\n left\n ? addRange(left, from, to)\n : (target.l = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n if (cmp(from, target.to) > 0) {\n right\n ? addRange(right, from, to)\n : (target.r = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n // Now we have some kind of overlap. We will be able to merge the new range into the node or let it be swallowed.\n\n // Grow left?\n if (cmp(from, target.from) < 0) {\n target.from = from;\n target.l = null; // Cut off for now. Re-add later.\n target.d = right ? right.d + 1 : 1;\n }\n // Grow right?\n if (cmp(to, target.to) > 0) {\n target.to = to;\n target.r = null; // Cut off for now. Re-add later.\n target.d = target.l ? target.l.d + 1 : 1;\n }\n const rightWasCutOff = !target.r;\n // Re-add left?\n if (left && !target.l) {\n //Ranges to the left may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, left);\n }\n // Re-add right?\n if (right && rightWasCutOff) {\n //Ranges to the right may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, right);\n }\n}\n\nexport function mergeRanges(target: IntervalTree, newSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n function _addRangeSet(\n target: IntervalTree,\n { from, to, l, r }: IntervalTreeNode | {from: IndexableType, to: IndexableType, l?: undefined, r?: undefined}\n ) {\n addRange(target, from, to);\n if (l) _addRangeSet(target, l);\n if (r) _addRangeSet(target, r);\n }\n\n if(!isEmptyRange(newSet)) _addRangeSet(target, newSet);\n}\n\nexport function rangesOverlap(\n rangeSet1: IntervalTree,\n rangeSet2: IntervalTree\n): boolean {\n // Start iterating other from scratch.\n const i1 = getRangeSetIterator(rangeSet2);\n let nextResult1 = i1.next();\n if (nextResult1.done) return false;\n let a = nextResult1.value;\n\n // Start iterating this from start of other\n const i2 = getRangeSetIterator(rangeSet1);\n let nextResult2 = i2.next(a.from); // Start from beginning of other range\n let b = nextResult2.value;\n\n while (!nextResult1.done && !nextResult2.done) {\n if (cmp(b!.from, a.to) <= 0 && cmp(b!.to, a.from) >= 0) return true;\n cmp(a.from, b!.from) < 0\n ? (a = (nextResult1 = i1.next(b!.from)).value!) // a is behind. forward it to beginning of next b-range\n : (b = (nextResult2 = i2.next(a.from)).value); // b is behind. forward it to beginning of next a-range\n }\n return false;\n}\n\ntype RangeSetIteratorState =\n | {\n up?: RangeSetIteratorState;\n n: IntervalTreeNode;\n s: 0 | 1 | 2 | 3;\n }\n | undefined\n | null;\nexport function getRangeSetIterator(\n node: EmptyRange | IntervalTreeNode\n): Generator {\n let state: RangeSetIteratorState = isEmptyRange(node) ? null : { s: 0, n: node };\n\n return {\n next(key?) {\n const keyProvided = arguments.length > 0;\n while (state) {\n switch (state.s) {\n case 0:\n // Initial state for node.\n // Fast forward to leftmost node.\n state.s = 1;\n if (keyProvided) {\n while (state.n.l && cmp(key, state.n.from) < 0)\n state = { up: state, n: state.n.l, s: 1 };\n } else {\n while (state.n.l) state = { up: state, n: state.n.l, s: 1 };\n }\n // intentionally fall into case 1:\n case 1:\n // We're on a node where it's left part is already handled or does not exist.\n state.s = 2;\n if (!keyProvided || cmp(key, state.n.to) <= 0)\n return { value: state.n, done: false };\n case 2:\n // We've emitted our node and should continue with the right part or let parent take over from it's state 1\n if (state.n.r) {\n state.s = 3; // So when child is done, we know we're done.\n state = { up: state, n: state.n.r, s: 0 };\n continue; // Will fall in to case 0 with fast forward to left leaf of this subtree.\n }\n // intentionally fall into case 3:\n case 3:\n state = state.up;\n }\n }\n return { done: true };\n },\n } as Generator;\n}\n\nfunction rebalance(target: IntervalTreeNode) {\n const diff = (target.r?.d || 0) - (target.l?.d || 0);\n const r = diff > 1 ? \"r\" : diff < -1 ? \"l\" : \"\";\n if (r) {\n\n // Rotate (https://en.wikipedia.org/wiki/Tree_rotation)\n //\n // \n // [OLDROOT]\n // [OLDROOT.L] [NEWROOT]\n // [NEWROOT.L] [NEWROOT.R]\n //\n // Is going to become:\n //\n // \n // [NEWROOT]\n // [OLDROOT] [NEWROOT.R]\n // [OLDROOT.L] [NEWROOT.L] \n\n // * clone now has the props of OLDROOT\n // Plan:\n // * target must be given the props of NEWROOT\n // * target[l] must point to a new OLDROOT\n // * target[r] must point to NEWROOT.R\n // * OLDROOT[r] must point to NEWROOT.L\n const l = r === \"r\" ? \"l\" : \"r\"; // Support both left/right rotation\n const rootClone = { ...target };\n // We're gonna copy props from target's right node into target so that target will\n // have same range as old target[r] (instead of changing pointers, we copy values.\n // that way we do not need to adjust pointers in parents).\n const oldRootRight = target[r]; \n target.from = oldRootRight.from;\n target.to = oldRootRight.to;\n target[r] = oldRootRight[r];\n rootClone[r] = oldRootRight[l];\n target[l] = rootClone;\n rootClone.d = computeDepth(rootClone);\n }\n target.d = computeDepth(target);\n}\n\nfunction computeDepth({ r, l }: Pick) {\n return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1;\n}\n","import { cloneSimpleObjectTree, deepClone, keys, objectIsEmpty } from \"../functions/utils\";\nimport { mergeRanges, RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\n\nexport function extendObservabilitySet(\n target: ObservabilitySet,\n newSet: ObservabilitySet\n): ObservabilitySet {\n keys(newSet).forEach(part => {\n if (target[part]) mergeRanges(target[part], newSet[part]);\n else target[part] = cloneSimpleObjectTree(newSet[part]); // Somewhat faster\n });\n return target;\n}\n","import { rangesOverlap } from '../helpers/rangeset';\nimport { ObservabilitySet } from '../public/types/db-events';\n\nexport function obsSetsOverlap(os1: ObservabilitySet, os2: ObservabilitySet) {\n return os1.all || os2.all || Object.keys(os1).some(\n (key) => os2[key] && rangesOverlap(os2[key], os1[key])\n );\n}\n","import { type GlobalQueryCache } from \"../../public/types/cache\";\n\nexport const cache: GlobalQueryCache = {}\n","import { CacheEntry, TblQueryCache } from '../../public/types/cache';\nimport { ObservabilitySet } from '../../public/types/db-events';\nimport { extendObservabilitySet } from '../extend-observability-set';\nimport { obsSetsOverlap } from '../obs-sets-overlap';\nimport { cache } from './cache';\n\nlet unsignaledParts: ObservabilitySet = {};\nlet isTaskEnqueued = false;\n\nexport function signalSubscribersLazily(part: ObservabilitySet, optimistic = false) {\n extendObservabilitySet(unsignaledParts, part);\n if (!isTaskEnqueued) {\n isTaskEnqueued = true;\n setTimeout(() => {\n isTaskEnqueued = false;\n const parts = unsignaledParts;\n unsignaledParts = {};\n signalSubscribersNow(parts, false);\n }, 0);\n }\n}\n\nexport function signalSubscribersNow(\n updatedParts: ObservabilitySet,\n deleteAffectedCacheEntries = false\n) {\n const queriesToSignal = new Set<() => void>();\n if (updatedParts.all) {\n // Signal all subscribers to requery.\n for (const tblCache of Object.values(cache)) {\n collectTableSubscribers(\n tblCache,\n updatedParts,\n queriesToSignal,\n deleteAffectedCacheEntries\n );\n }\n } else {\n for (const key in updatedParts) {\n const parts = /^idb\\:\\/\\/(.*)\\/(.*)\\//.exec(key);\n if (parts) {\n const [, dbName, tableName] = parts;\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (tblCache)\n collectTableSubscribers(\n tblCache,\n updatedParts,\n queriesToSignal,\n deleteAffectedCacheEntries\n );\n }\n }\n }\n // Now when affected cache entries are removed, signal collected subscribers to requery.\n queriesToSignal.forEach((requery) => requery());\n}\n\nfunction collectTableSubscribers(\n tblCache: TblQueryCache,\n updatedParts: ObservabilitySet,\n outQueriesToSignal: Set<() => void>,\n deleteAffectedCacheEntries: boolean\n) {\n const updatedEntryLists: [string, CacheEntry[]][] = [];\n for (const [indexName, entries] of Object.entries(tblCache.queries.query)) {\n const filteredEntries: CacheEntry[] = [];\n for (const entry of entries) {\n if (obsSetsOverlap(updatedParts, entry.obsSet)) {\n // This query is affected by the mutation. Remove it from cache\n // and signal all subscribers to requery.\n entry.subscribers.forEach((requery) => outQueriesToSignal.add(requery));\n } else if (deleteAffectedCacheEntries) {\n filteredEntries.push(entry);\n }\n }\n // Collect cache entries to be updated\n if (deleteAffectedCacheEntries)\n updatedEntryLists.push([indexName, filteredEntries]);\n }\n if (deleteAffectedCacheEntries) {\n for (const [indexName, filteredEntries] of updatedEntryLists) {\n tblCache.queries.query[indexName] = filteredEntries;\n }\n }\n}\n","import { Dexie } from './dexie';\nimport * as Debug from '../../helpers/debug';\nimport { rejection } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { eventRejectHandler, preventDefault } from '../../functions/event-wrappers';\nimport Promise, { wrap } from '../../helpers/promise';\nimport { connections } from '../../globals/constants';\nimport { runUpgraders, readGlobalSchema, adjustToExistingIndexNames, verifyInstalledSchema, patchCurrentVersion } from '../version/schema-helpers';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { _onDatabaseCreated } from '../../helpers/database-enumerator';\nimport { vip } from './vip';\nimport { promisableChain, nop } from '../../functions/chaining-functions';\nimport { generateMiddlewareStacks } from './generate-middleware-stacks';\nimport { slice } from '../../functions/utils';\nimport safari14Workaround from 'safari-14-idb-fix';\nimport { type ObservabilitySet } from '../../public/types/db-events';\nimport { RangeSet } from '../../helpers/rangeset';\nimport { DEXIE_STORAGE_MUTATED_EVENT_NAME, globalEvents } from '../../globals/global-events';\nimport { signalSubscribersNow } from '../../live-query/cache/signalSubscribers';\n\nexport function dexieOpen (db: Dexie) {\n const state = db._state;\n const {indexedDB} = db._deps;\n if (state.isBeingOpened || db.idbdb)\n return state.dbReadyPromise.then(() => state.dbOpenError ?\n rejection (state.dbOpenError) :\n db);\n state.isBeingOpened = true;\n state.dbOpenError = null;\n state.openComplete = false;\n const openCanceller = state.openCanceller;\n let nativeVerToOpen = Math.round(db.verno * 10);\n let schemaPatchMode = false;\n\n function throwIfCancelled() {\n // If state.openCanceller object reference is replaced, it means db.close() has been called,\n // meaning this open flow should be cancelled.\n if (state.openCanceller !== openCanceller) throw new exceptions.DatabaseClosed('db.open() was cancelled');\n }\n \n // Function pointers to call when the core opening process completes.\n let resolveDbReady = state.dbReadyResolve,\n // upgradeTransaction to abort on failure.\n upgradeTransaction: (IDBTransaction | null) = null,\n wasCreated = false;\n\n const tryOpenDB = () => new Promise((resolve, reject) => {\n throwIfCancelled();\n // If no API, throw!\n if (!indexedDB) throw new exceptions.MissingAPI();\n const dbName = db.name;\n \n const req = state.autoSchema || !nativeVerToOpen ?\n indexedDB.open(dbName) :\n indexedDB.open(dbName, nativeVerToOpen);\n if (!req) throw new exceptions.MissingAPI(); // May happen in Safari private mode, see https://github.com/dfahlander/Dexie.js/issues/134\n req.onerror = eventRejectHandler(reject);\n req.onblocked = wrap(db._fireOnBlocked);\n req.onupgradeneeded = wrap (e => {\n upgradeTransaction = req.transaction;\n if (state.autoSchema && !db._options.allowEmptyDB) { // Unless an addon has specified db._allowEmptyDB, lets make the call fail.\n // Caller did not specify a version or schema. Doing that is only acceptable for opening alread existing databases.\n // If onupgradeneeded is called it means database did not exist. Reject the open() promise and make sure that we\n // do not create a new database by accident here.\n req.onerror = preventDefault; // Prohibit onabort error from firing before we're done!\n upgradeTransaction.abort(); // Abort transaction (would hope that this would make DB disappear but it doesnt.)\n // Close database and delete it.\n req.result.close();\n const delreq = indexedDB.deleteDatabase(dbName); // The upgrade transaction is atomic, and javascript is single threaded - meaning that there is no risk that we delete someone elses database here!\n delreq.onsuccess = delreq.onerror = wrap(() => {\n reject (new exceptions.NoSuchDatabase(`Database ${dbName} doesnt exist`));\n });\n } else {\n upgradeTransaction.onerror = eventRejectHandler(reject);\n const oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; // Safari 8 fix.\n wasCreated = oldVer < 1;\n db.idbdb = req.result;\n if (schemaPatchMode) {\n patchCurrentVersion(db, upgradeTransaction);\n }\n runUpgraders(db, oldVer / 10, upgradeTransaction, reject);\n }\n }, reject);\n \n req.onsuccess = wrap (() => {\n // Core opening procedure complete. Now let's just record some stuff.\n upgradeTransaction = null;\n const idbdb = db.idbdb = req.result;\n\n const objectStoreNames = slice(idbdb.objectStoreNames);\n if (objectStoreNames.length > 0) try {\n const tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly');\n if (state.autoSchema) readGlobalSchema(db, idbdb, tmpTrans);\n else {\n adjustToExistingIndexNames(db, db._dbSchema, tmpTrans);\n if (!verifyInstalledSchema(db, tmpTrans) && !schemaPatchMode) {\n console.warn(`Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this.`);\n idbdb.close();\n nativeVerToOpen = idbdb.version + 1;\n schemaPatchMode = true;\n return resolve (tryOpenDB()); // Try again with new version (nativeVerToOpen\n }\n }\n generateMiddlewareStacks(db, tmpTrans);\n } catch (e) {\n // Safari 8 may bail out if > 1 store names. However, this shouldnt be a showstopper. Issue #120.\n // BUGBUG: It will bail out anyway as of Dexie 3.\n // Should we support Safari 8 anymore? Believe all\n // Dexie users use the shim for that platform anyway?!\n // If removing Safari 8 support, go ahead and remove the safariMultiStoreFix() function\n // as well as absurd upgrade version quirk for Safari.\n }\n \n connections.push(db); // Used for emulating versionchange event on IE/Edge/Safari.\n \n idbdb.onversionchange = wrap(ev => {\n state.vcFired = true; // detect implementations that not support versionchange (IE/Edge/Safari)\n db.on(\"versionchange\").fire(ev);\n });\n \n idbdb.onclose = wrap(ev => {\n db.on(\"close\").fire(ev);\n });\n\n if (wasCreated) _onDatabaseCreated(db._deps, dbName);\n\n resolve();\n\n }, reject);\n }).catch(err => {\n switch (err?.name) {\n case \"UnknownError\":\n if (state.PR1398_maxLoop > 0) {\n // Bug in Chrome after clearing site data\n // https://github.com/dexie/Dexie.js/issues/543#issuecomment-1795736695\n state.PR1398_maxLoop--;\n console.warn('Dexie: Workaround for Chrome UnknownError on open()');\n return tryOpenDB();\n }\n break;\n case \"VersionError\":\n if (nativeVerToOpen > 0) {\n nativeVerToOpen = 0;\n return tryOpenDB();\n }\n break;\n }\n return Promise.reject(err);\n });\n \n // safari14Workaround = Workaround by jakearchibald for new nasty bug in safari 14.\n return Promise.race([\n openCanceller,\n (typeof navigator === 'undefined' ? Promise.resolve() : safari14Workaround()).then(tryOpenDB)\n ]).then(() => {\n // Before finally resolving the dbReadyPromise and this promise,\n // call and await all on('ready') subscribers:\n // Dexie.vip() makes subscribers able to use the database while being opened.\n // This is a must since these subscribers take part of the opening procedure.\n throwIfCancelled();\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>db.on.ready.fire(db.vip))).then(function fireRemainders() {\n if (state.onReadyBeingFired.length > 0) {\n // In case additional subscribers to db.on('ready') were added during the time db.on.ready.fire was executed.\n let remainders = state.onReadyBeingFired.reduce(promisableChain, nop);\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>remainders(db.vip))).then(fireRemainders)\n }\n });\n }).finally(()=>{\n if (state.openCanceller === openCanceller) {\n // Only modify state if not cancelled in the mean time.\n state.onReadyBeingFired = null;\n state.isBeingOpened = false;\n }\n }).catch(err => {\n state.dbOpenError = err; // Record the error. It will be used to reject further promises of db operations.\n try {\n // Did we fail within onupgradeneeded? Make sure to abort the upgrade transaction so it doesnt commit.\n upgradeTransaction && upgradeTransaction.abort();\n } catch { }\n if (openCanceller === state.openCanceller) {\n // Still in the same open flow - The error reason was not due to external call to db.close().\n // Make sure to call db.close() to finalize resources.\n db._close(); // Closes and resets idbdb, removes connections, resets dbReadyPromise and openCanceller so that a later db.open() is fresh.\n }\n return rejection (err);\n }).finally(()=>{\n state.openComplete = true;\n resolveDbReady(); // dbReadyPromise is resolved no matter if open() rejects or resolved. It's just to wake up waiters.\n }).then(()=>{\n if (wasCreated) {\n // Propagate full range on primary keys and indexes on all tables now that the DB is ready and opened,\n // and all upgraders and on('ready') subscribers have run.\n const everything: ObservabilitySet = {};\n db.tables.forEach(table => {\n table.schema.indexes.forEach(idx => {\n if (idx.name) everything[`idb://${db.name}/${table.name}/${idx.name}`] = new RangeSet(-Infinity, [[[]]]);\n });\n everything[`idb://${db.name}/${table.name}/`] = everything[`idb://${db.name}/${table.name}/:dels`] = new RangeSet(-Infinity, [[[]]]);\n });\n // Database was created. If another tab had it open when it was deleted and reopened, that tab must be updated now.\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME).fire(everything);\n // Wipe the cache and trigger optimistic queries:\n signalSubscribersNow(everything, true);\n }\n // Resolve the db.open() with the db instance.\n return db;\n });\n}\n","import { isArray } from '../functions/utils';\n\nexport function awaitIterator (iterator: Iterator) {\n var callNext = result => iterator.next(result),\n doThrow = error => iterator.throw(error),\n onSuccess = step(callNext),\n onError = step(doThrow);\n\n function step(getNext: (any)=>any) {\n return (val?) => {\n var next = getNext(val),\n value = next.value;\n\n return next.done ? value :\n (!value || typeof value.then !== 'function' ?\n isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) :\n value.then(onSuccess, onError));\n };\n }\n\n return step(callNext)();\n}\n","import { TransactionMode } from '../../public/types/transaction-mode';\nimport { errnames, exceptions } from '../../errors';\nimport { flatten, isAsyncFunction } from '../../functions/utils';\nimport { Dexie } from './dexie';\nimport { Transaction } from '../transaction';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise, {\n PSD,\n NativePromise,\n decrementExpectedAwaits,\n rejection,\n incrementExpectedAwaits\n} from '../../helpers/promise';\n\nexport function extractTransactionArgs(mode: TransactionMode, _tableArgs_, scopeFunc) {\n // Let table arguments be all arguments between mode and last argument.\n var i = arguments.length;\n if (i < 2) throw new exceptions.InvalidArgument(\"Too few arguments\");\n // Prevent optimzation killer (https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments)\n // and clone arguments except the first one into local var 'args'.\n var args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n // Let scopeFunc be the last argument and pop it so that args now only contain the table arguments.\n scopeFunc = args.pop();\n var tables = flatten(args); // Support using array as middle argument, or a mix of arrays and non-arrays.\n return [mode, tables, scopeFunc];\n}\n\nexport function enterTransactionScope(\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n parentTransaction: Transaction | undefined,\n scopeFunc: ()=>PromiseLike | any\n) {\n return Promise.resolve().then(() => {\n // Keep a pointer to last non-transactional PSD to use if someone calls Dexie.ignoreTransaction().\n const transless = PSD.transless || PSD;\n // Our transaction.\n //return new Promise((resolve, reject) => {\n const trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction);\n trans.explicit = true;\n // Let the transaction instance be part of a Promise-specific data (PSD) value.\n const zoneProps = {\n trans: trans,\n transless: transless\n };\n\n if (parentTransaction) {\n // Emulate transaction commit awareness for inner transaction (must 'commit' when the inner transaction has no more operations ongoing)\n trans.idbtrans = parentTransaction.idbtrans;\n } else {\n try {\n trans.create(); // Create the native transaction so that complete() or error() will trigger even if no operation is made upon it.\n // @ts-ignore Mark the idbtrans object with \"_explicit\". DBCore middleware won't have access to Dexie trans but will need to have this info.\n trans.idbtrans._explicit = true;\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db.close({disableAutoOpen: false});\n return db.open().then(() => enterTransactionScope(\n db,\n mode,\n storeNames,\n null,\n scopeFunc\n ));\n }\n return rejection(ex);\n }\n }\n\n // Support for native async await.\n const scopeFuncIsAsync = isAsyncFunction(scopeFunc);\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n\n let returnValue;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = scopeFunc.call(trans, trans);\n if (returnValue) {\n if (scopeFuncIsAsync) {\n // scopeFunc is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n } else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') {\n // scopeFunc returned an iterator with throw-support. Handle yield as await.\n returnValue = awaitIterator(returnValue);\n }\n }\n }, zoneProps);\n return (returnValue && typeof returnValue.then === 'function' ?\n // Promise returned. User uses promise-style transactions.\n Promise.resolve(returnValue).then(x => trans.active ?\n x // Transaction still active. Continue.\n : rejection(new exceptions.PrematureCommit(\n \"Transaction committed too early. See http://bit.ly/2kdckMn\")))\n // No promise returned. Wait for all outstanding promises before continuing. \n : promiseFollowed.then(() => returnValue)\n ).then(x => {\n // sub transactions don't react to idbtrans.oncomplete. We must trigger a completion:\n if (parentTransaction) trans._resolve();\n // wait for trans._completion\n // (if root transaction, this means 'complete' event. If sub-transaction, we've just fired it ourselves)\n return trans._completion.then(() => x);\n }).catch(e => {\n trans._reject(e); // Yes, above then-handler were maybe not called because of an unhandled rejection in scopeFunc!\n return rejection(e);\n });\n });\n}\n","import {\n DBCore,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryRequest,\n DBCoreRangeType,\n DBCoreOpenCursorRequest,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreTable,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { getKeyExtractor } from './get-key-extractor';\nimport { getKeyPathAlias } from './dbcore-indexeddb';\nimport { Middleware } from '../public/types/middleware';\n\ninterface VirtualIndex extends DBCoreIndex {\n /** True if this index is virtual, i.e. represents a compound index internally,\n * but makes it act as as having a subset of its keyPaths.\n */\n isVirtual: boolean;\n\n /** Number of keypaths that this index comprises. Can be 0..N.\n * Note: This is the length of the *virtual index*, not the real index.\n */\n keyLength: number;\n\n /** Number of popped keypaths from the real index.\n */\n keyTail: number;\n\n /** LowLevelIndex represents the actual IndexedDB index behind it */\n lowLevelIndex: DBCoreIndex;\n}\n\n// Move into some util:\nexport function pad (a: any | any[], value: any, count: number) {\n const result = isArray(a) ? a.slice() : [a];\n for (let i=0; i 0;\n const virtualIndex = {\n ...lowLevelIndex,\n name: isVirtual\n ? `${keyPathAlias}(virtual-from:${lowLevelIndex.name})`\n : lowLevelIndex.name,\n lowLevelIndex,\n isVirtual,\n keyTail,\n keyLength,\n extractKey: getKeyExtractor(keyPath),\n unique: !isVirtual && lowLevelIndex.unique\n };\n indexList.push(virtualIndex);\n if (!virtualIndex.isPrimaryKey) {\n allVirtualIndexes.push(virtualIndex);\n }\n if (keyLength > 1) {\n const virtualKeyPath = keyLength === 2 ?\n keyPath[0] : // This is a compound [a, b]. Add a virtual normal index a.\n keyPath.slice(0, keyLength - 1); // This is compound [a,b,c]. Add virtual compound [a,b].\n addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex);\n }\n indexList.sort((a,b) => a.keyTail - b.keyTail); // Shortest keyTail is the best one (represents real index)\n return virtualIndex;\n }\n \n const primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey);\n indexLookup[\":id\"] = [primaryKey];\n for (const index of schema.indexes) {\n addVirtualIndexes(index.keyPath, 0, index);\n }\n \n function findBestIndex(keyPath: null | string | string[]): VirtualIndex {\n const result = indexLookup[getKeyPathAlias(keyPath)];\n return result && result[0];\n }\n \n function translateRange (range: DBCoreKeyRange, keyTail: number): DBCoreKeyRange {\n return {\n type: range.type === DBCoreRangeType.Equal ?\n DBCoreRangeType.Range :\n range.type,\n lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail),\n lowerOpen: true, // doesn't matter true or false\n upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail),\n upperOpen: true // doesn't matter true or false\n };\n }\n \n function translateRequest (req: DBCoreQueryRequest): DBCoreQueryRequest;\n function translateRequest (req: DBCoreOpenCursorRequest): DBCoreOpenCursorRequest;\n function translateRequest (req: DBCoreCountRequest): DBCoreCountRequest {\n const index = req.query.index as VirtualIndex;\n return index.isVirtual ? {\n ...req,\n query: {\n index: index.lowLevelIndex,\n range: translateRange(req.query.range, index.keyTail)\n }\n } : req;\n }\n \n const result: DBCoreTable = {\n ...table,\n schema: {\n ...schema,\n primaryKey,\n indexes: allVirtualIndexes,\n getIndexByKeyPath: findBestIndex\n },\n\n count(req) {\n return table.count(translateRequest(req));\n }, \n \n query(req) {\n return table.query(translateRequest(req));\n },\n \n openCursor(req) {\n const {keyTail, isVirtual, keyLength} = (req.query.index as VirtualIndex);\n if (!isVirtual) return table.openCursor(req);\n \n function createVirtualCursor(cursor: DBCoreCursor) : DBCoreCursor {\n function _continue (key?: any) {\n key != null ?\n cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) :\n req.unique ?\n cursor.continue(\n cursor.key.slice(0, keyLength)\n .concat(req.reverse\n ? down.MIN_KEY\n : down.MAX_KEY, keyTail)\n ) :\n cursor.continue()\n }\n const virtualCursor = Object.create(cursor, {\n continue: {value: _continue},\n continuePrimaryKey: {\n value(key: any, primaryKey: any) {\n cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey);\n }\n },\n primaryKey: {\n get() {\n return cursor.primaryKey;\n }\n },\n key: {\n get() {\n const key = cursor.key as any[]; // A virtual cursor always operates on compound key\n return keyLength === 1 ?\n key[0] : // Cursor.key should not be an array.\n key.slice(0, keyLength); // Cursor.key should be first part of array.\n }\n },\n value: {\n get() {\n return cursor.value;\n }\n }\n });\n return virtualCursor;\n }\n \n return table.openCursor(translateRequest(req))\n .then(cursor => cursor && createVirtualCursor(cursor));\n }\n };\n return result;\n }\n }\n}\n\nexport const virtualIndexMiddleware : Middleware = {\n stack: \"dbcore\",\n name: \"VirtualIndexMiddleware\",\n level: 1,\n create: createVirtualIndexMiddleware\n};\n\n","import { keys, hasOwn, toStringTag } from './utils';\n\nexport function getObjectDiff(a: any, b: any, rv?: any, prfx?: string) {\n // Compares objects a and b and produces a diff object.\n rv = rv || {};\n prfx = prfx || '';\n keys(a).forEach((prop) => {\n if (!hasOwn(b, prop)) {\n // Property removed\n rv[prfx + prop] = undefined;\n } else {\n var ap = a[prop],\n bp = b[prop];\n if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) {\n const apTypeName = toStringTag(ap);\n const bpTypeName = toStringTag(bp);\n\n if (apTypeName !== bpTypeName) {\n rv[prfx + prop] = b[prop]; // Property changed to other type\n } else if (apTypeName === 'Object') {\n // Pojo objects (not Date, ArrayBuffer, Array etc). Go deep.\n getObjectDiff(ap, bp, rv, prfx + prop + '.');\n } else if (ap !== bp) {\n // Values differ.\n // Could have checked if Date, arrays or binary types have same\n // content here but I think that would be a suboptimation.\n // Prefer simplicity.\n rv[prfx + prop] = b[prop];\n }\n } else if (ap !== bp) rv[prfx + prop] = b[prop]; // Primitive value changed\n }\n });\n keys(b).forEach((prop) => {\n if (!hasOwn(a, prop)) {\n rv[prfx + prop] = b[prop]; // Property added\n }\n });\n return rv;\n}\n","import {\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreIndex,\n DBCoreTable,\n} from \"../public/types/dbcore\";\n\nexport function getEffectiveKeys (\n primaryKey: DBCoreIndex,\n req: (Pick & {keys?: any[]}) | Pick)\n{\n //const {outbound} = primaryKey;\n if (req.type === 'delete') return req.keys;\n return req.keys || req.values.map(primaryKey.extractKey)\n}\n","import {\n DBCore,\n DBCoreTable,\n DBCoreMutateResponse,\n DBCoreDeleteRangeRequest,\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreTransaction,\n DBCoreKeyRange\n} from \"../public/types/dbcore\";\nimport { nop } from '../functions/chaining-functions';\nimport { hasOwn, setByKeyPath } from '../functions/utils';\nimport { getObjectDiff } from \"../functions/get-object-diff\";\nimport { PSD } from '../helpers/promise';\n//import { LockableTableMiddleware } from '../dbcore/lockable-table-middleware';\nimport { getEffectiveKeys } from '../dbcore/get-effective-keys';\nimport { Middleware } from '../public/types/middleware';\nimport { Transaction } from '../classes/transaction';\n\nexport const hooksMiddleware: Middleware = {\n stack: \"dbcore\",\n name: \"HooksMiddleware\",\n level: 2,\n create: (downCore: DBCore) => ({\n ...downCore,\n table(tableName: string) {\n const downTable = downCore.table(tableName);\n const {primaryKey} = downTable.schema;\n \n const tableMiddleware: DBCoreTable = {\n ...downTable,\n mutate(req):Promise {\n const dxTrans = PSD.trans as Transaction;\n // Hooks can be transaction-bound. Need to grab them from transaction.table and not\n // db.table!\n const {deleting, creating, updating} = dxTrans.table(tableName).hook;\n switch (req.type) {\n case 'add':\n if (creating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'put':\n if (creating.fire === nop && updating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'delete':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'deleteRange':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>deleteRange(req), true);\n }\n // Any of the breaks above happened (no hooks) - do the default:\n return downTable.mutate(req);\n\n\n function addPutOrDelete(req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest): Promise {\n const dxTrans = PSD.trans;\n const keys = req.keys || getEffectiveKeys(primaryKey, req);\n if (!keys) throw new Error(\"Keys missing\");\n // Clone Request and set keys arg\n req = req.type === 'add' || req.type === 'put' ?\n {...req, keys} :\n {...req};\n if (req.type !== 'delete') req.values = [...req.values];\n if (req.keys) req.keys = [...req.keys];\n \n return getExistingValues(downTable, req, keys).then (existingValues => {\n const contexts = keys.map((key, i) => {\n const existingValue = existingValues[i];\n const ctx = { onerror: null, onsuccess: null };\n if (req.type === 'delete') {\n // delete operation\n deleting.fire.call(ctx, key, existingValue, dxTrans);\n } else if (req.type === 'add' || existingValue === undefined) {\n // The add() or put() resulted in a create\n const generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans);\n if (key == null && generatedPrimaryKey != null) {\n key = generatedPrimaryKey;\n req.keys[i] = key;\n if (!primaryKey.outbound) {\n setByKeyPath(req.values[i], primaryKey.keyPath, key);\n }\n }\n } else {\n // The put() operation resulted in an update\n const objectDiff = getObjectDiff(existingValue, req.values[i]);\n const additionalChanges = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans);\n if (additionalChanges) {\n const requestedValue = req.values[i];\n Object.keys(additionalChanges).forEach(keyPath => {\n if (hasOwn(requestedValue, keyPath)) {\n // keyPath is already present as a literal property of the object\n requestedValue[keyPath] = additionalChanges[keyPath];\n } else {\n // keyPath represents a new or existing path into the object\n setByKeyPath(requestedValue, keyPath, additionalChanges[keyPath]);\n }\n });\n }\n }\n return ctx;\n });\n return downTable.mutate(req).then(({failures, results, numFailures, lastResult}) => {\n for (let i=0; i {\n contexts.forEach(ctx => ctx.onerror && ctx.onerror(error));\n return Promise.reject(error);\n });\n });\n }\n \n function deleteRange(req: DBCoreDeleteRangeRequest): Promise {\n return deleteNextChunk(req.trans, req.range, 10000);\n }\n \n function deleteNextChunk(trans: DBCoreTransaction, range: DBCoreKeyRange, limit: number) {\n // Query what keys in the DB within the given range\n return downTable.query({trans, values: false, query: {index: primaryKey, range}, limit})\n .then(({result}) => {\n // Given a set of keys, bulk delete those using the same procedure as in addPutOrDelete().\n // This will make sure that deleting hook is called.\n return addPutOrDelete({type: 'delete', keys: result, trans}).then(res => {\n if (res.numFailures > 0) return Promise.reject(res.failures[0]);\n if (result.length < limit) {\n return {failures: [], numFailures: 0, lastResult: undefined} as DBCoreMutateResponse;\n } else {\n return deleteNextChunk(trans, {...range, lower: result[result.length - 1], lowerOpen: true}, limit);\n }\n });\n })\n }\n }\n };\n //const {lock, lockableMiddleware} = LockableTableMiddleware(tableMiddleware);\n\n return tableMiddleware;\n },\n }) as DBCore\n};\n\nfunction getExistingValues(\n table: DBCoreTable,\n req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest,\n effectiveKeys: any[]\n) {\n return req.type === \"add\"\n ? Promise.resolve([])\n : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: \"immutable\" });\n}\n","import { deepClone } from \"../functions/utils\";\nimport { DBCore } from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport Promise from \"../helpers/promise\";\nimport { cmp } from '../functions/cmp';\n\nexport function getFromTransactionCache(\n keys: readonly any[],\n cache: { keys: any[]; values: any[] } | undefined | null,\n clone?: boolean\n) {\n try {\n if (!cache) return null;\n if (cache.keys.length < keys.length) return null;\n const result: any[] = [];\n // Compare if the exact same order of keys was retrieved in same transaction:\n // Allow some cached keys to be omitted from provided set of keys\n // Use case: 1. getMany(keys) 2. update a subset of those 3. call put with the updated ones ==> middlewares should be able to find old values\n for (let i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) {\n if (cmp(cache.keys[i], keys[j]) !== 0) continue;\n result.push(clone ? deepClone(cache.values[i]) : cache.values[i]);\n ++j;\n }\n // If got all keys caller was looking for, return result.\n return result.length === keys.length ? result : null;\n } catch {\n return null;\n }\n}\n\nexport const cacheExistingValuesMiddleware: Middleware = {\n stack: \"dbcore\",\n level: -1,\n create: (core) => {\n return {\n table: (tableName) => {\n const table = core.table(tableName);\n return {\n ...table,\n getMany: (req) => {\n if (!req.cache) {\n return table.getMany(req);\n }\n const cachedResult = getFromTransactionCache(\n req.keys,\n req.trans[\"_cache\"],\n req.cache === \"clone\"\n );\n if (cachedResult) {\n return Promise.resolve(cachedResult);\n }\n return table.getMany(req).then((res) => {\n req.trans[\"_cache\"] = {\n keys: req.keys,\n values: req.cache === \"clone\" ? deepClone(res) : res,\n };\n return res;\n });\n },\n mutate: (req) => {\n // Invalidate cache on any mutate except \"add\" which can't change existing values:\n if (req.type !== \"add\") req.trans[\"_cache\"] = null;\n return table.mutate(req);\n },\n };\n },\n };\n },\n};\n","import { DBCore, DBCoreTable } from '../../public/types/dbcore';\nimport { LiveQueryContext } from '../live-query';\n\nexport function isCachableContext(ctx: LiveQueryContext, table: DBCoreTable) {\n return (\n ctx.trans.mode === 'readonly' &&\n !!ctx.subscr &&\n !ctx.trans.explicit &&\n ctx.trans.db._options.cache !== 'disabled' &&\n !table.schema.primaryKey.outbound\n );\n}\n\n","import { DBCoreCountRequest, DBCoreGetManyRequest, DBCoreGetRequest, DBCoreOpenCursorRequest, DBCoreQueryRequest } from '../../public/types/dbcore';\n\n\nexport function isCachableRequest(type: string, req: Partial) {\n switch (type) {\n case 'query':\n return req.values && !req.unique;\n case 'get':\n return false;\n case 'getMany':\n return false;\n case 'count':\n return false;\n case 'openCursor':\n return false;\n }\n}\n","import { LiveQueryContext } from \".\";\nimport { getFromTransactionCache } from \"../dbcore/cache-existing-values-middleware\";\nimport { getEffectiveKeys } from \"../dbcore/get-effective-keys\";\nimport { exceptions } from \"../errors\";\nimport { cmp } from \"../functions/cmp\";\nimport { isArray, keys } from \"../functions/utils\";\nimport { PSD } from \"../helpers/promise\";\nimport { RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport {\n DBCore,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreGetManyRequest,\n DBCoreGetRequest,\n DBCoreIndex,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreQueryResponse,\n DBCoreTable,\n DBCoreTableSchema,\n DBCoreTransaction,\n} from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport { isCachableContext } from \"./cache/is-cachable-context\";\nimport { isCachableRequest } from \"./cache/is-cachable-request\";\nimport { extendObservabilitySet } from \"./extend-observability-set\";\n\nexport const observabilityMiddleware: Middleware = {\n stack: \"dbcore\",\n level: 0,\n name: \"Observability\",\n create: (core) => {\n const dbName = core.schema.name;\n const FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY);\n\n return {\n ...core,\n transaction: (stores, mode, options) => {\n if (PSD.subscr && mode !== 'readonly') {\n throw new exceptions.ReadOnly(`Readwrite transaction in liveQuery context. Querier source: ${(PSD as LiveQueryContext).querier}`);\n }\n return core.transaction(stores, mode, options);\n },\n table: (tableName) => {\n const table = core.table(tableName);\n const { schema } = table;\n const { primaryKey, indexes } = schema;\n const { extractKey, outbound } = primaryKey;\n const indexesWithAutoIncPK = primaryKey.autoIncrement && indexes.filter(\n (index) => index.compound && (index.keyPath as string[]).includes(primaryKey.keyPath as string)\n );\n const tableClone: DBCoreTable = {\n ...table,\n mutate: (req) => {\n const trans = req.trans as DBCoreTransaction & {\n mutatedParts?: ObservabilitySet;\n };\n const mutatedParts = req.mutatedParts || (req.mutatedParts = {});\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (mutatedParts[part] ||\n (mutatedParts[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n\n const { type } = req;\n let [keys, newObjs] =\n req.type === \"deleteRange\"\n ? [req.range] // keys will be an DBCoreKeyRange object - transformed later on to a [from,to]-style range.\n : req.type === \"delete\"\n ? [req.keys] // keys known already here. newObjs will be undefined.\n : req.values.length < 50\n ? [getEffectiveKeys(primaryKey, req).filter(id => id), req.values] // keys except autoIncremented - they will be added later on.\n : []; // keys and newObjs will both be undefined - changeSpec will become true (changed for entire table)\n\n const oldCache = req.trans[\"_cache\"];\n\n // Add the mutated table and optionally keys to the mutatedTables set on the transaction.\n // Used by subscribers to txcommit event and for Collection.prototype.subscribe().\n if (isArray(keys)) {\n // keys is an array - delete, add or put of less than 50 rows.\n // Individual keys (add put or delete)\n pkRangeSet.addKeys(keys);\n // Only get oldObjs if they have been cached recently\n // (This applies to Collection.modify() only, but also if updating/deleting hooks have subscribers)\n const oldObjs = type === 'delete' || keys.length === newObjs.length ? getFromTransactionCache(keys, oldCache) : null;\n\n // Supply detailed values per index for both old and new objects:\n if (!oldObjs) {\n // add, delete or put and we don't know old values.\n // Indicate this in the \":dels\" part, for the sake of count() and primaryKeys() queries only!\n delsRangeSet.addKeys(keys);\n }\n if (oldObjs || newObjs) {\n // No matter if knowning oldObjs or not, track the indices if it's a put, add or delete.\n trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs);\n }\n } else if (keys) {\n // keys is a DBCoreKeyRange object. Transform it to [from,to]-style range.\n // As we can't know deleted index ranges, mark index-based subscriptions must trigger.\n const range = { from: keys.lower, to: keys.upper };\n delsRangeSet.add(range);\n // deleteRange. keys is a DBCoreKeyRange objects. Transform it to [from,to]-style range.\n pkRangeSet.add(range);\n } else {\n // Too many requests to record the details without slowing down write performance.\n // Let's just record a generic large range on primary key, the virtual :dels index and\n // all secondary indices:\n pkRangeSet.add(FULL_RANGE);\n delsRangeSet.add(FULL_RANGE);\n schema.indexes.forEach(idx => getRangeSet(idx.name).add(FULL_RANGE));\n }\n\n return table.mutate(req).then((res) => {\n // Merge the mutated parts from the request into the transaction's mutatedParts\n // now when the request went fine.\n if (keys && (req.type === 'add' || req.type === 'put')) {\n // Less than 50 requests (keys truthy) (otherwise we've added full range anyway)\n // autoincrement means we might not have got all keys until now\n pkRangeSet.addKeys(res.results);\n if (indexesWithAutoIncPK) {\n // Dexie Issue 1946:\n // If an auto-incremented primary key is part of a compound index,\n // we need to compute the resulting value of that index after inserting\n // the rows.\n indexesWithAutoIncPK.forEach(idx => {\n // Extract values of this compound index where primary key is not yet set:\n const idxVals = req.values.map(v => idx.extractKey(v));\n // Find the position of the primary key in the index:\n const pkPos = (idx.keyPath as string[]).findIndex(prop => prop === primaryKey.keyPath);\n // Update idxVals with the resulting primary keys to complete the index value:\n res.results!.forEach(pk => idxVals[pkPos] = pk);\n // Add the updated index to the rangeset:\n getRangeSet(idx.name).addKeys(idxVals);\n });\n }\n }\n trans.mutatedParts = extendObservabilitySet (\n trans.mutatedParts || {},\n mutatedParts\n );\n return res;\n });\n },\n };\n\n const getRange: (req: any) => [DBCoreIndex, RangeSet] = ({\n query: { index, range },\n }:\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest) => [\n index,\n new RangeSet(range.lower ?? core.MIN_KEY, range.upper ?? core.MAX_KEY),\n ];\n\n const readSubscribers: {[method in\n Exclude]: \n (req: any) => [DBCoreIndex, RangeSet]\n } = {\n get: (req) => [primaryKey, new RangeSet(req.key)],\n getMany: (req) => [primaryKey, new RangeSet().addKeys(req.keys)],\n count: getRange,\n query: getRange,\n openCursor: getRange,\n }\n\n keys(readSubscribers).forEach((method: 'get' | 'getMany' | 'count' | 'query' | 'openCursor') => {\n tableClone[method] = function (\n req:\n | DBCoreGetRequest\n | DBCoreGetManyRequest\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest\n ) {\n const { subscr } = PSD as LiveQueryContext;\n const isLiveQuery = !!subscr;\n let cachable = isCachableContext(PSD as LiveQueryContext, table) && isCachableRequest(method, req);\n const obsSet = cachable\n ? req.obsSet = {} // Implicit read transaction - track changes for this query only for the request's duration\n : subscr; // Explicit read transaction - track changes across entire live query\n\n if (isLiveQuery) {\n // Current zone want's to track all queries so they can be subscribed to.\n // (The query is executed within a \"liveQuery\" zone)\n // Check whether the query applies to a certain set of ranges:\n // Track what we should be observing:\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (obsSet[part] ||\n (obsSet[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n const [queriedIndex, queriedRanges] = readSubscribers[method](req);\n // A generic rule here: queried ranges should always be subscribed to.\n if (method === 'query' && queriedIndex.isPrimaryKey && !(req as DBCoreQueryRequest).values) {\n // A pure primay-key based Collection where only .primaryKeys() is requested. Don't wakeup on other changes than added or deleted primary keys within queried range.\n delsRangeSet.add(queriedRanges);\n } else {\n getRangeSet(queriedIndex.name || \"\").add(queriedRanges);\n }\n if (!queriedIndex.isPrimaryKey) {\n // Only count(), query() and openCursor() operates on secondary indices.\n // Since put(), delete() and deleteRange() mutations may happen without knowing oldObjs,\n // the mutate() method will be missing what secondary indices that are being deleted from\n // the subscribed range. We are working around this issue by recording all the resulting\n // primary keys from the queries. This only works for those kinds of queries where we can\n // derive the primary key from the result.\n // In this block we are accomplishing this using various strategies depending on the properties\n // of the query result.\n\n if (method === \"count\") {\n // We've got a problem! Delete and put mutations happen without known the oldObjs.\n // Those mutation could change the count.\n // Solution: Dedicated \":dels\" url represends a subscription to all mutations without oldObjs\n // (specially triggered in the mutators put(), delete() and deleteRange() when they don't know oldObject)\n delsRangeSet.add(FULL_RANGE);\n } else {\n // openCursor() or query()\n\n // Prepare a keysPromise in case the we're doing an IDBIndex.getAll() on a store with outbound keys.\n const keysPromise =\n method === \"query\" &&\n outbound &&\n (req as DBCoreQueryRequest).values &&\n table.query({\n ...(req as DBCoreQueryRequest),\n values: false,\n });\n\n return table[method].apply(this, arguments).then((res) => {\n if (method === \"query\") {\n if (outbound && (req as DBCoreQueryRequest).values) {\n // If keys are outbound, we can't use extractKey to map what keys to observe.\n // We've queried an index (like 'dateTime') on an outbound table\n // and retrieve a list of objects\n // from who we cannot know their primary keys.\n // \"Luckily\" though, we've prepared the keysPromise to assist us in exact this condition.\n return keysPromise.then(\n ({ result: resultingKeys }: DBCoreQueryResponse) => {\n pkRangeSet.addKeys(resultingKeys);\n return res;\n }\n );\n }\n // query() inbound values, keys or outbound keys. Secondary indexes only since\n // for primary keys we would only add results within the already registered range.\n const pKeys = (req as DBCoreQueryRequest).values\n ? (res as DBCoreQueryResponse).result.map(extractKey)\n : (res as DBCoreQueryResponse).result;\n if ((req as DBCoreQueryRequest).values) {\n // Subscribe to any mutation made on the returned keys,\n // so that we detect both deletions and updated properties.\n pkRangeSet.addKeys(pKeys);\n } else {\n // Subscribe only to mutations on the returned keys\n // in case the mutator was unable to know oldObjs.\n // If it has oldObj, the mutator won't put anything in \":dels\" because\n // it can more fine-grained put the exact removed and added index value in the correct\n // index range that we subscribe to in the queried range sets.\n // We don't load values so a change on a property outside our index will not\n // require us to re-execute the query.\n delsRangeSet.addKeys(pKeys);\n }\n } else if (method === \"openCursor\") {\n // Caller requests a cursor.\n // For the same reason as when method===\"query\", we only need to observe\n // those keys whose values are possibly used or rendered - which could\n // only happen on keys where they get the cursor's key, primaryKey or value.\n const cursor: DBCoreCursor | null = res;\n const wantValues = (req as DBCoreOpenCursorRequest).values;\n return (\n cursor &&\n Object.create(cursor, {\n key: {\n get() {\n delsRangeSet.addKey(cursor.primaryKey);\n return cursor.key;\n },\n },\n primaryKey: {\n get() {\n const pkey = cursor.primaryKey;\n delsRangeSet.addKey(pkey);\n return pkey;\n },\n },\n value: {\n get() {\n wantValues && pkRangeSet.addKey(cursor.primaryKey);\n return cursor.value;\n },\n },\n })\n );\n }\n return res;\n });\n }\n }\n }\n return table[method].apply(this, arguments);\n };\n });\n return tableClone;\n },\n };\n },\n};\n\nfunction trackAffectedIndexes(\n getRangeSet: (index: string) => RangeSet,\n schema: DBCoreTableSchema,\n oldObjs: readonly any[] | undefined,\n newObjs: readonly any[] | undefined\n) {\n function addAffectedIndex(ix: DBCoreIndex) {\n const rangeSet = getRangeSet(ix.name || \"\");\n function extractKey(obj: any) {\n return obj != null ? ix.extractKey(obj) : null;\n }\n const addKeyOrKeys = (key: any) => ix.multiEntry && isArray(key)\n // multiEntry and the old property was an array - add each array entry to the rangeSet:\n ? key.forEach(key => rangeSet.addKey(key))\n // Not multiEntry or the old property was not an array - add each array entry to the rangeSet:\n : rangeSet.addKey(key);\n\n (oldObjs || newObjs).forEach((_, i) => {\n const oldKey = oldObjs && extractKey(oldObjs[i]);\n const newKey = newObjs && extractKey(newObjs[i]);\n if (cmp(oldKey, newKey) !== 0) {\n // The index has changed. Add both old and new value of the index.\n if (oldKey != null) addKeyOrKeys(oldKey); // If oldKey is invalid key, addKey() will be a noop.\n if (newKey != null) addKeyOrKeys(newKey); // If newKey is invalid key, addKey() will be a noop.\n }\n });\n }\n schema.indexes.forEach(addAffectedIndex);\n}\n","import { delArrayItem, isArray } from '../../functions/utils';\nimport { TblQueryCache } from '../../public/types/cache';\nimport {\n DBCoreMutateRequest,\n DBCoreMutateResponse,\n} from '../../public/types/dbcore';\n\nexport function adjustOptimisticFromFailures(\n tblCache: TblQueryCache,\n req: DBCoreMutateRequest,\n res: DBCoreMutateResponse\n): DBCoreMutateRequest {\n if (res.numFailures === 0) return req;\n if (req.type === 'deleteRange') {\n // numFailures > 0 means the deleteRange operation failed in its whole.\n return null;\n }\n\n const numBulkOps = req.keys\n ? req.keys.length\n : 'values' in req && req.values\n ? req.values.length\n : 1;\n if (res.numFailures === numBulkOps) {\n // Same number of failures as the number of ops. This means that all ops failed.\n return null;\n }\n\n const clone: DBCoreMutateRequest = { ...req };\n\n if (isArray(clone.keys)) {\n clone.keys = clone.keys.filter((_, i) => !(i in res.failures));\n }\n if ('values' in clone && isArray(clone.values)) {\n clone.values = clone.values.filter((_, i) => !(i in res.failures));\n }\n return clone;\n}\n","import { cmp } from '../../functions/cmp';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function isAboveLower(key: IndexableType, range: DBCoreKeyRange) {\n return range.lower === undefined\n ? true // lower is less than anything because it is undefined\n : range.lowerOpen\n ? cmp(key, range.lower) > 0 // lowerOpen: Exclude lower bound\n : cmp(key, range.lower) >= 0; // !lowerOpen: Include lower bound\n}\n\nexport function isBelowUpper(key: IndexableType, range: DBCoreKeyRange) {\n return range.upper === undefined\n ? true // upper is greater than anything because it is undefined\n : range.upperOpen\n ? cmp(key, range.upper) < 0 // upperOpen: Exclude upper bound\n : cmp(key, range.upper) <= 0; // !upperOpen: Include upper bound\n}\n\nexport function isWithinRange(key: IndexableType, range: DBCoreKeyRange) {\n return isAboveLower(key, range) && isBelowUpper(key, range);\n}\n","import { cmp } from '../../functions/cmp';\nimport { deepClone, isArray } from '../../functions/utils';\nimport { RangeSet, rangesOverlap } from '../../helpers/rangeset';\nimport { CacheEntry } from '../../public/types/cache';\nimport {\n DBCoreIndex,\n DBCoreMutateRequest,\n DBCoreQueryRequest,\n DBCoreTable,\n} from '../../public/types/dbcore';\nimport { isWithinRange } from './is-within-range';\n\nexport function applyOptimisticOps(\n result: any[],\n req: DBCoreQueryRequest,\n ops: DBCoreMutateRequest[] | undefined,\n table: DBCoreTable,\n cacheEntry: CacheEntry,\n immutable: boolean\n): any[] {\n if (!ops || ops.length === 0) return result;\n const index = req.query.index;\n const { multiEntry } = index;\n const queryRange = req.query.range;\n const primaryKey = table.schema.primaryKey;\n const extractPrimKey = primaryKey.extractKey!;\n const extractIndex = index.extractKey!;\n const extractLowLevelIndex = (index.lowLevelIndex || index).extractKey!;\n\n let finalResult = ops.reduce((result, op) => {\n let modifedResult = result;\n const includedValues =\n op.type === 'add' || op.type === 'put'\n ? op.values.filter((v) => {\n const key = extractIndex(v);\n return multiEntry && isArray(key) // multiEntry index work like plain index unless key is array\n ? key.some((k) => isWithinRange(k, queryRange)) // multiEntry and array key\n : isWithinRange(key, queryRange); // multiEntry but not array key\n }).map(v => {\n v = deepClone(v);// v might come from user so we can't just freeze it.\n if (immutable) Object.freeze(v);\n return v;\n })\n : [];\n switch (op.type) {\n case 'add':\n modifedResult = result.concat(\n req.values\n ? includedValues\n : includedValues.map((v) => extractPrimKey(v))\n );\n break;\n case 'put':\n const keySet = new RangeSet().addKeys(\n op.values.map((v) => extractPrimKey(v))\n );\n modifedResult = result\n .filter((item) => {\n const key = req.values ? extractPrimKey(item) : item;\n return !rangesOverlap(new RangeSet(key), keySet);\n })\n .concat(\n req.values\n ? includedValues\n : includedValues.map((v) => extractPrimKey(v))\n );\n break;\n case 'delete':\n const keysToDelete = new RangeSet().addKeys(op.keys);\n modifedResult = result.filter((item) => {\n const key = req.values ? extractPrimKey(item) : item;\n return !rangesOverlap(new RangeSet(key), keysToDelete);\n });\n\n break;\n case 'deleteRange':\n const range = op.range;\n modifedResult = result.filter((item) => !isWithinRange(extractPrimKey(item), range));\n break;\n }\n return modifedResult;\n }, result);\n\n // If no changes were made, we can return the original result.\n if (finalResult === result) return result;\n\n // Sort the result on sortIndex:\n finalResult.sort((a, b) =>\n cmp(extractLowLevelIndex(a), extractLowLevelIndex(b)) ||\n cmp(extractPrimKey(a), extractPrimKey(b))\n );\n\n // If we have a limit we need to respect it:\n if (req.limit && req.limit < Infinity) {\n if (finalResult.length > req.limit) {\n finalResult.length = req.limit; // Cut of any extras after sorting correctly.\n } else if (result.length === req.limit && finalResult.length < req.limit) {\n // We're missing some items because of the limit. We need to add them back.\n // The easiest way is to mark the cache entry as dirty, which will cause\n // it to be requeried after the write-transaction successfully completes.\n cacheEntry.dirty = true;\n }\n }\n return immutable ? Object.freeze(finalResult) as any[] : finalResult;\n}\n","import { cmp } from '../../functions/cmp';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function areRangesEqual(r1: DBCoreKeyRange, r2: DBCoreKeyRange) {\n return (\n cmp(r1.lower, r2.lower) === 0 &&\n cmp(r1.upper, r2.upper) === 0 &&\n !!r1.lowerOpen === !!r2.lowerOpen &&\n !!r1.upperOpen === !!r2.upperOpen\n );\n}\n","import { cmp } from '../../functions/cmp';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function compareLowers(lower1: any, lower2: any, lowerOpen1: boolean, lowerOpen2: boolean) {\n if (lower1 === undefined) return lower2 !== undefined ? -1 : 0;\n if (lower2 === undefined) return 1; // since lower1 !== undefined\n const c = cmp(lower1, lower2);\n if (c === 0) {\n if (lowerOpen1 && lowerOpen2) return 0;\n if (lowerOpen1) return 1\n if (lowerOpen2) return -1;\n }\n return c;\n}\n\nexport function compareUppers(upper1: any, upper2: any, upperOpen1: boolean, upperOpen2: boolean) {\n if (upper1 === undefined) return upper2 !== undefined ? 1 : 0;\n if (upper2 === undefined) return -1; // since upper1 !== undefined\n const c = cmp(upper1, upper2);\n if (c === 0) {\n if (upperOpen1 && upperOpen2) return 0;\n if (upperOpen1) return -1\n if (upperOpen2) return 1;\n }\n return c;\n}\n\nexport function isSuperRange(r1: DBCoreKeyRange, r2: DBCoreKeyRange) {\n return (\n compareLowers(r1.lower, r2.lower, r1.lowerOpen, r2.lowerOpen) <= 0 &&\n compareUppers(r1.upper, r2.upper, r1.upperOpen, r2.upperOpen) >= 0\n );\n}","import { CacheEntry, TblQueryCache } from '../../public/types/cache';\nimport {\n DBCoreCountRequest,\n DBCoreQueryRequest,\n} from '../../public/types/dbcore';\nimport { areRangesEqual } from './are-ranges-equal';\nimport { cache } from './cache';\nimport { isSuperRange } from './is-super-range';\n\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'query',\n req: DBCoreQueryRequest\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]];\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'count',\n req: DBCoreCountRequest\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]];\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'query' | 'count',\n req: Partial & Partial\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]] {\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (!tblCache) return [];\n const queries = tblCache.queries[type];\n if (!queries) return [null, false, tblCache, null];\n const indexName = req.query ? req.query.index.name : null;\n const entries = queries[indexName || ''];\n if (!entries) return [null, false, tblCache, null];\n\n switch (type) {\n case 'query':\n const equalEntry = entries.find(\n (entry) =>\n (entry.req as DBCoreQueryRequest).limit === req.limit &&\n (entry.req as DBCoreQueryRequest).values === req.values &&\n areRangesEqual(entry.req.query.range, req.query.range)\n );\n if (equalEntry)\n return [\n equalEntry,\n true, // exact match\n tblCache,\n entries,\n ];\n const superEntry = entries.find((entry) => {\n const limit = 'limit' in entry.req ? entry.req.limit : Infinity;\n return (\n limit >= req.limit &&\n (req.values ? (entry.req as DBCoreQueryRequest).values : true) &&\n isSuperRange(entry.req.query.range, req.query.range)\n );\n });\n return [superEntry, false, tblCache, entries];\n case 'count':\n const countQuery = entries.find((entry) =>\n areRangesEqual(entry.req.query.range, req.query.range)\n );\n return [countQuery, !!countQuery, tblCache, entries];\n }\n}\n","import { delArrayItem } from \"../../functions/utils\";\nimport { CacheEntry } from \"../../public/types/cache\";\n\nexport function subscribeToCacheEntry(cacheEntry: CacheEntry, container: CacheEntry[], requery: ()=>void, signal: AbortSignal) {\n cacheEntry.subscribers.add(requery);\n signal.addEventListener(\"abort\", () => {\n cacheEntry.subscribers.delete(requery);\n if (cacheEntry.subscribers.size === 0) {\n enqueForDeletion(cacheEntry, container);\n }\n });\n}\n\n\nfunction enqueForDeletion(cacheEntry: CacheEntry, container: CacheEntry[]) {\n setTimeout(() => {\n if (cacheEntry.subscribers.size === 0) { // Still empty (no new subscribers readded after grace time)\n delArrayItem(container, cacheEntry);\n }\n }, 3000);\n}\n","import { LiveQueryContext } from '..';\nimport type { Transaction } from '../../classes/transaction';\nimport { getEffectiveKeys } from '../../dbcore/get-effective-keys';\nimport { deepClone, delArrayItem, setByKeyPath } from '../../functions/utils';\nimport DexiePromise, { PSD } from '../../helpers/promise';\nimport { ObservabilitySet } from '../../public/types/db-events';\nimport {\n DBCore, DBCoreMutateRequest, DBCoreMutateResponse, DBCoreQueryRequest,\n DBCoreQueryResponse\n} from '../../public/types/dbcore';\nimport { Middleware } from '../../public/types/middleware';\nimport { obsSetsOverlap } from '../obs-sets-overlap';\nimport { adjustOptimisticFromFailures } from './adjust-optimistic-request-from-failures';\nimport { applyOptimisticOps } from './apply-optimistic-ops';\nimport { cache } from './cache';\nimport { findCompatibleQuery } from './find-compatible-query';\nimport { isCachableContext } from './is-cachable-context';\nimport { isCachableRequest } from './is-cachable-request';\nimport { signalSubscribersLazily } from './signalSubscribers';\nimport { subscribeToCacheEntry } from './subscribe-cachentry';\n\nexport const cacheMiddleware: Middleware = {\n stack: 'dbcore',\n level: 0,\n name: 'Cache',\n create: (core) => {\n const dbName = core.schema.name;\n const coreMW: DBCore = {\n ...core,\n transaction: (stores, mode, options) => {\n const idbtrans = core.transaction(\n stores,\n mode,\n options\n ) as IDBTransaction & {\n mutatedParts?: ObservabilitySet;\n _explicit?: boolean;\n };\n // Maintain TblQueryCache.ops array when transactions commit or abort\n if (mode === 'readwrite') {\n const ac = new AbortController();\n const { signal } = ac;\n const endTransaction = (wasCommitted: boolean) => () => {\n ac.abort();\n if (mode === 'readwrite') {\n // Collect which subscribers to notify:\n const affectedSubscribers = new Set<()=>void>();\n\n // Go through all tables in transaction and check if they have any optimistic updates\n for (const storeName of stores) {\n const tblCache = cache[`idb://${dbName}/${storeName}`];\n if (tblCache) {\n const table = core.table(storeName);\n // Pick optimistic ops that are part of this transaction\n const ops = tblCache.optimisticOps.filter(\n (op) => op.trans === idbtrans\n );\n // Transaction was marked as _explicit in enterTransactionScope(), transaction-helpers.ts.\n if (idbtrans._explicit && wasCommitted && idbtrans.mutatedParts) {\n // Invalidate all queries that overlap with the mutated parts and signal their subscribers\n for (const entries of Object.values(\n tblCache.queries.query\n )) {\n for (const entry of entries.slice()) {\n if (obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)) {\n delArrayItem(entries, entry); // Remove the entry from the cache so it can be refreshed\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n }\n }\n }\n } else if (ops.length > 0) {\n // Remove them from the optimisticOps array\n tblCache.optimisticOps = tblCache.optimisticOps.filter(\n (op) => op.trans !== idbtrans\n );\n // Commit or abort the optimistic updates\n for (const entries of Object.values(\n tblCache.queries.query\n )) {\n for (const entry of entries.slice()) {\n if (\n entry.res != null && // if entry.promise but not entry.res, we're fine. Query will resume now and get the result.\n idbtrans.mutatedParts/* &&\n obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)*/\n ) {\n if (wasCommitted && !entry.dirty) {\n const freezeResults = Object.isFrozen(entry.res);\n const modRes = applyOptimisticOps(\n entry.res as any[],\n entry.req,\n ops,\n table,\n entry,\n freezeResults\n );\n if (entry.dirty) {\n // Found out at this point that the entry is dirty - not to rely on!\n delArrayItem(entries, entry);\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n } else if (modRes !== entry.res) {\n entry.res = modRes;\n // Update promise\n entry.promise = DexiePromise.resolve({result: modRes} satisfies DBCoreQueryResponse);\n \n // No need to notify subscribers. They already have this value.\n // We have just updated the value of the cache without having to\n // requery the database - because we know the result for this\n // query based on computing the operations and applying them\n // to the previous result.\n }\n } else {\n if (entry.dirty) {\n // If the entry is dirty we need to get rid of it so that\n // a new entry will be created when the query is run again.\n delArrayItem(entries, entry);\n }\n // If we're not committing, we need to notify subscribers that the\n // optimistic updates are no longer valid.\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n }\n }\n }\n }\n }\n }\n }\n affectedSubscribers.forEach((requery) => requery());\n }\n };\n idbtrans.addEventListener('abort', endTransaction(false), {\n signal,\n });\n idbtrans.addEventListener('error', endTransaction(false), {\n signal,\n });\n idbtrans.addEventListener('complete', endTransaction(true), {\n signal,\n });\n }\n return idbtrans;\n },\n table(tableName: string) {\n const downTable = core.table(tableName);\n const primKey = downTable.schema.primaryKey;\n const tableMW = {\n ...downTable,\n mutate(req: DBCoreMutateRequest): Promise {\n const trans = PSD.trans as Transaction;\n if (\n primKey.outbound || // Non-inbound tables are harded to apply optimistic updates on because we can't know primary key of results\n trans.db._options.cache === 'disabled' || // User has opted-out from caching\n trans.explicit // It's an explicit write transaction being made. Don't affect cache until transaction commits.\n ) {\n // Just forward the request to the core.\n return downTable.mutate(req);\n }\n // Find the TblQueryCache for this table:\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (!tblCache) return downTable.mutate(req);\n\n const promise = downTable.mutate(req);\n if ((req.type === 'add' || req.type === 'put') && (req.values.length >= 50 || getEffectiveKeys(primKey, req).some(key => key == null))) {\n // There are some autoIncremented keys not set yet. Need to wait for completion before we can reliably enqueue the operation.\n // (or there are too many objects so we lazy out to avoid performance bottleneck for large bulk inserts)\n promise.then((res) => { // We need to extract result keys and generate cloned values with the keys set (so that applyOptimisticOps can work)\n // But we have a problem! The req.mutatedParts is still not complete so we have to actively add the keys to the unsignaledParts set manually.\n const reqWithResolvedKeys = {\n ...req,\n values: req.values.map((value, i) => {\n const valueWithKey = primKey.keyPath?.includes('.')\n ? deepClone(value)\n : {\n ...value,\n };\n setByKeyPath(valueWithKey, primKey.keyPath, res.results![i]);\n return valueWithKey;\n })\n };\n const adjustedReq = adjustOptimisticFromFailures(tblCache, reqWithResolvedKeys, res);\n tblCache.optimisticOps.push(adjustedReq);\n // Signal subscribers after the observability middleware has complemented req.mutatedParts with the new keys.\n // We must queue the task so that we get the req.mutatedParts updated by observability middleware first.\n // If we refactor the dependency between observability middleware and this middleware we might not need to queue the task.\n queueMicrotask(()=>req.mutatedParts && signalSubscribersLazily(req.mutatedParts)); // Reason for double laziness: in user awaits put and then does another put, signal once.\n });\n } else {\n // Enque the operation immediately\n tblCache.optimisticOps.push(req);\n // Signal subscribers that there are mutated parts\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts);\n promise.then((res) => {\n if (res.numFailures > 0) {\n // In case the operation failed, we need to remove it from the optimisticOps array.\n delArrayItem(tblCache.optimisticOps, req);\n const adjustedReq = adjustOptimisticFromFailures(tblCache, req, res);\n if (adjustedReq) {\n tblCache.optimisticOps.push(adjustedReq);\n }\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts); // Signal the rolling back of the operation.\n }\n });\n promise.catch(()=> {\n // In case the operation failed, we need to remove it from the optimisticOps array.\n delArrayItem(tblCache.optimisticOps, req);\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts); // Signal the rolling back of the operation.\n });\n }\n return promise;\n },\n query(req: DBCoreQueryRequest): Promise {\n if (!isCachableContext(PSD, downTable) || !isCachableRequest(\"query\", req)) return downTable.query(req);\n const freezeResults =\n (PSD as LiveQueryContext).trans?.db._options.cache === 'immutable';\n const { requery, signal } = PSD as LiveQueryContext;\n let [cacheEntry, exactMatch, tblCache, container] =\n findCompatibleQuery(dbName, tableName, 'query', req);\n if (cacheEntry && exactMatch) {\n cacheEntry.obsSet = req.obsSet!; // So that optimistic result is monitored.\n // How? - because observability-middleware will track result where optimistic\n // mutations are applied and record it in the cacheEntry.\n // TODO: CHANGE THIS! The difference is resultKeys only.\n // Wanted behavior:\n // * cacheEntry obsSet should represent the obsSet without optimistic updates (so it can be checked when merging ops in tx commit)\n // * cacheEntry optimisticObsSet should represent the obsSet with current optimistic updates. It should be updated when adding an op\n // by adding the primary keys of the put/add/delete operation to the set.\n // * observability-middleware should stop recording req.obsSet when a cache entry exact match is found because it won't be used anyway.\n // I'm thinking of merging observability-middleware with cache-middleware into one single middleware because the dependencies are too\n // tight between them.\n } else {\n // --> TODO here: If not exact match, check if we have a superset to extract\n // the data from.\n\n // No cached result found. We need to query the database and cache the result.\n const promise = downTable.query(req).then((res) => {\n // Freeze or clone results\n const result = res.result;\n if (cacheEntry) cacheEntry.res = result;\n if (freezeResults) {\n // For performance reasons don't deep freeze.\n // Only freeze the top-level array and its items.\n // This is good enough to teach users that the result must be treated as immutable\n // without enforcing it recursively on the entire result (which is not even possible\n // for things like Date objects and typed arrays)\n for (let i = 0, l = result.length; i < l; ++i) {\n Object.freeze(result[i]);\n }\n Object.freeze(result);\n } else {\n // If not frozen, we need to clone the result to avoid user mutating the cache\n // When we do this, user's must feel conformable with the fact that the result\n // can be mutated deeply - user is not expected to have any respect for immutability.\n res.result = deepClone(result);\n }\n return res;\n }).catch(error => {\n // In case the query operation failed, we need to remove it from the cache\n // so that subsequent calls does not get the same error but re-evaluate\n // the query.\n if (container && cacheEntry) delArrayItem(container, cacheEntry);\n return Promise.reject(error);\n });\n cacheEntry = {\n obsSet: req.obsSet!,\n promise,\n subscribers: new Set(),\n type: 'query',\n req,\n dirty: false,\n };\n if (container) {\n container.push(cacheEntry);\n } else {\n container = [cacheEntry];\n if (!tblCache) {\n tblCache = cache[`idb://${dbName}/${tableName}`] = {\n queries: {\n query: {},\n count: {},\n },\n objs: new Map(),\n optimisticOps: [],\n unsignaledParts: {}\n };\n }\n tblCache.queries.query[req.query.index.name || ''] = container;\n }\n }\n subscribeToCacheEntry(cacheEntry, container!, requery, signal);\n return cacheEntry.promise.then((res: DBCoreQueryResponse) => {\n return {\n result: applyOptimisticOps(\n res.result,\n req,\n tblCache?.optimisticOps,\n downTable,\n cacheEntry!,\n freezeResults\n ) as any[], // readonly any[]\n };\n });\n },\n };\n return tableMW;\n },\n };\n return coreMW;\n },\n};\n\n\n","import { type Dexie } from \"../classes/dexie\";\nimport { type Table } from \"../classes/table\";\nimport { type Transaction } from \"../classes/transaction\";\n\nexport function vipify(\n target: T,\n vipDb: Dexie\n): T {\n return new Proxy(target, {\n get (target, prop, receiver) {\n // The \"db\" prop of the table or transaction is the only one we need to\n // override. The rest of the props can be accessed from the original\n // object.\n if (prop === 'db') return vipDb;\n return Reflect.get(target, prop, receiver);\n }\n });\n}\n","// Import types from the public API\nimport { Dexie as IDexie } from \"../../public/types/dexie\";\nimport { DexieOptions, DexieConstructor } from \"../../public/types/dexie-constructor\";\nimport { DbEvents } from \"../../public/types/db-events\";\n//import { PromiseExtended, PromiseExtendedConstructor } from '../../public/types/promise-extended';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from \"../../public/types/table-schema\";\nimport { DbSchema } from '../../public/types/db-schema';\n\n// Internal imports\nimport { Table, TableConstructor, createTableConstructor } from \"../table\";\nimport { Collection, CollectionConstructor, createCollectionConstructor } from '../collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { WhereClauseConstructor, createWhereClauseConstructor } from '../where-clause/where-clause-constructor';\nimport { Transaction } from '../transaction';\nimport { TransactionConstructor, createTransactionConstructor } from '../transaction/transaction-constructor';\nimport { Version } from \"../version/version\";\nimport { VersionConstructor, createVersionConstructor } from '../version/version-constructor';\n\n// Other imports...\nimport { DexieEventSet } from '../../public/types/dexie-event-set';\nimport { DexieExceptionClasses } from '../../public/types/errors';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\nimport Promise, { PSD, globalPSD } from '../../helpers/promise';\nimport { extend, override, keys, hasOwn } from '../../functions/utils';\nimport Events from '../../helpers/Events';\nimport { maxString, connections, READONLY, READWRITE } from '../../globals/constants';\nimport { getMaxKey } from '../../functions/quirks';\nimport { exceptions } from '../../errors';\nimport { lowerVersionFirst } from '../version/schema-helpers';\nimport { dexieOpen } from './dexie-open';\nimport { wrap } from '../../helpers/promise';\nimport { _onDatabaseDeleted } from '../../helpers/database-enumerator';\nimport { eventRejectHandler } from '../../functions/event-wrappers';\nimport { extractTransactionArgs, enterTransactionScope } from './transaction-helpers';\nimport { TransactionMode } from '../../public/types/transaction-mode';\nimport { rejection } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { DBCore } from '../../public/types/dbcore';\nimport { Middleware, DexieStacks } from '../../public/types/middleware';\nimport { virtualIndexMiddleware } from '../../dbcore/virtual-index-middleware';\nimport { hooksMiddleware } from '../../hooks/hooks-middleware';\nimport { IndexableType } from '../../public';\nimport { observabilityMiddleware } from '../../live-query/observability-middleware';\nimport { cacheExistingValuesMiddleware } from '../../dbcore/cache-existing-values-middleware';\nimport { cacheMiddleware } from \"../../live-query/cache/cache-middleware\";\nimport { vipify } from \"../../helpers/vipify\";\n\nexport interface DbReadyState {\n dbOpenError: any;\n isBeingOpened: boolean;\n onReadyBeingFired: undefined | Function[];\n openComplete: boolean;\n dbReadyResolve: () => void;\n dbReadyPromise: Promise;\n cancelOpen: (reason?: Error) => void;\n openCanceller: Promise & { _stackHolder?: Error };\n autoSchema: boolean;\n vcFired?: boolean;\n PR1398_maxLoop?: number;\n autoOpen?: boolean;\n}\n\nexport class Dexie implements IDexie {\n _options: DexieOptions;\n _state: DbReadyState;\n _versions: Version[];\n _storeNames: string[];\n _deps: DexieDOMDependencies;\n _allTables: { [name: string]: Table; };\n _createTransaction: (this: Dexie, mode: IDBTransactionMode, storeNames: ArrayLike, dbschema: { [tableName: string]: TableSchema; }, parentTransaction?: Transaction) => Transaction;\n _dbSchema: { [tableName: string]: TableSchema; };\n _hasGetAll?: boolean;\n _maxKey: IndexableType;\n _fireOnBlocked: (ev: Event) => void;\n _middlewares: {[StackName in keyof DexieStacks]?: Middleware[]} = {};\n _vip?: boolean;\n _novip: Dexie;// db._novip is to escape to orig db from db.vip.\n core: DBCore;\n\n name: string;\n verno: number = 0;\n idbdb: IDBDatabase | null;\n vip: Dexie;\n on: DbEvents;\n\n Table: TableConstructor;\n WhereClause: WhereClauseConstructor;\n Collection: CollectionConstructor;\n Version: VersionConstructor;\n Transaction: TransactionConstructor;\n static disableBfCache?: boolean;\n\n constructor(name: string, options?: DexieOptions) {\n const deps = (Dexie as any as DexieConstructor).dependencies;\n this._options = options = {\n // Default Options\n addons: (Dexie as any as DexieConstructor).addons, // Pick statically registered addons by default\n autoOpen: true, // Don't require db.open() explicitely.\n // Default DOM dependency implementations from static prop.\n indexedDB: deps.indexedDB, // Backend IndexedDB api. Default to browser env.\n IDBKeyRange: deps.IDBKeyRange, // Backend IDBKeyRange api. Default to browser env.\n cache: 'cloned', // Default to cloned for backward compatibility. For best performance and least memory consumption use 'immutable'.\n ...options\n }; \n this._deps = {\n indexedDB: options.indexedDB as IDBFactory,\n IDBKeyRange: options.IDBKeyRange as typeof IDBKeyRange\n };\n const {\n addons,\n } = options;\n this._dbSchema = {};\n this._versions = [];\n this._storeNames = [];\n this._allTables = {};\n this.idbdb = null;\n this._novip = this;\n const state: DbReadyState = {\n dbOpenError: null,\n isBeingOpened: false,\n onReadyBeingFired: null,\n openComplete: false,\n dbReadyResolve: nop,\n dbReadyPromise: null as Promise,\n cancelOpen: nop,\n openCanceller: null as Promise,\n autoSchema: true,\n PR1398_maxLoop: 3,\n autoOpen: options.autoOpen,\n };\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n this._state = state;\n this.name = name;\n this.on = Events(this, \"populate\", \"blocked\", \"versionchange\", \"close\", { ready: [promisableChain, nop] }) as DbEvents;\n this.on.ready.subscribe = override(this.on.ready.subscribe, subscribe => {\n return (subscriber, bSticky) => {\n (Dexie as any as DexieConstructor).vip(() => {\n const state = this._state;\n if (state.openComplete) {\n // Database already open. Call subscriber asap.\n if (!state.dbOpenError) Promise.resolve().then(subscriber);\n // bSticky: Also subscribe to future open sucesses (after close / reopen) \n if (bSticky) subscribe(subscriber);\n } else if (state.onReadyBeingFired) {\n // db.on('ready') subscribers are currently being executed and have not yet resolved or rejected\n state.onReadyBeingFired.push(subscriber);\n if (bSticky) subscribe(subscriber);\n } else {\n // Database not yet open. Subscribe to it.\n subscribe(subscriber);\n // If bSticky is falsy, make sure to unsubscribe subscriber when fired once.\n const db = this;\n if (!bSticky) subscribe(function unsubscribe() {\n db.on.ready.unsubscribe(subscriber);\n db.on.ready.unsubscribe(unsubscribe);\n });\n }\n });\n }\n });\n\n // Create derived classes bound to this instance of Dexie:\n this.Collection = createCollectionConstructor(this);\n this.Table = createTableConstructor(this);\n this.Transaction = createTransactionConstructor(this);\n this.Version = createVersionConstructor(this);\n this.WhereClause = createWhereClauseConstructor(this);\n\n // Default subscribers to \"versionchange\" and \"blocked\".\n // Can be overridden by custom handlers. If custom handlers return false, these default\n // behaviours will be prevented.\n this.on(\"versionchange\", ev => {\n // Default behavior for versionchange event is to close database connection.\n // Caller can override this behavior by doing db.on(\"versionchange\", function(){ return false; });\n // Let's not block the other window from making it's delete() or open() call.\n // NOTE! This event is never fired in IE,Edge or Safari.\n if (ev.newVersion > 0)\n console.warn(`Another connection wants to upgrade database '${this.name}'. Closing db now to resume the upgrade.`);\n else\n console.warn(`Another connection wants to delete database '${this.name}'. Closing db now to resume the delete request.`);\n this.close({disableAutoOpen: false});\n // In many web applications, it would be recommended to force window.reload()\n // when this event occurs. To do that, subscribe to the versionchange event\n // and call window.location.reload(true) if ev.newVersion > 0 (not a deletion)\n // The reason for this is that your current web app obviously has old schema code that needs\n // to be updated. Another window got a newer version of the app and needs to upgrade DB but\n // your window is blocking it unless we close it here.\n });\n this.on(\"blocked\", ev => {\n if (!ev.newVersion || ev.newVersion < ev.oldVersion)\n console.warn(`Dexie.delete('${this.name}') was blocked`);\n else\n console.warn(`Upgrade '${this.name}' blocked by other connection holding version ${ev.oldVersion / 10}`);\n });\n\n this._maxKey = getMaxKey(options.IDBKeyRange as typeof IDBKeyRange);\n\n this._createTransaction = (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n parentTransaction?: Transaction) => new this.Transaction(mode, storeNames, dbschema, this._options.chromeTransactionDurability, parentTransaction);\n\n this._fireOnBlocked = ev => {\n this.on(\"blocked\").fire(ev);\n // Workaround (not fully*) for missing \"versionchange\" event in IE,Edge and Safari:\n connections\n .filter(c => c.name === this.name && c !== this && !c._state.vcFired)\n .map(c => c.on(\"versionchange\").fire(ev));\n }\n\n // Default middlewares:\n this.use(cacheExistingValuesMiddleware);\n this.use(cacheMiddleware);\n this.use(observabilityMiddleware);\n this.use(virtualIndexMiddleware);\n this.use(hooksMiddleware);\n\n const vipDB = new Proxy(this, {\n get: (_, prop, receiver) => {\n if (prop === '_vip') return true;\n if (prop === 'table') return (tableName: string) => vipify(this.table(tableName), vipDB);\n const rv = Reflect.get(_, prop, receiver);\n if (rv instanceof Table) return vipify(rv, vipDB);\n if (prop === 'tables') return (rv as Table[]).map(t => vipify(t, vipDB));\n if (prop === '_createTransaction') return function() {\n const tx: Transaction = (rv as typeof this._createTransaction).apply(this, arguments);\n return vipify(tx, vipDB);\n }\n return rv;\n }\n });\n this.vip = vipDB;\n\n // Call each addon:\n addons.forEach(addon => addon(this));\n }\n\n version(versionNumber: number): Version {\n if (isNaN(versionNumber) || versionNumber < 0.1) throw new exceptions.Type(`Given version is not a positive number`);\n versionNumber = Math.round(versionNumber * 10) / 10;\n if (this.idbdb || this._state.isBeingOpened)\n throw new exceptions.Schema(\"Cannot add version when database is open\");\n this.verno = Math.max(this.verno, versionNumber);\n const versions = this._versions;\n var versionInstance = versions.filter(\n v => v._cfg.version === versionNumber)[0];\n if (versionInstance) return versionInstance;\n versionInstance = new this.Version(versionNumber);\n versions.push(versionInstance);\n versions.sort(lowerVersionFirst);\n versionInstance.stores({}); // Derive earlier schemas by default.\n // Disable autoschema mode, as at least one version is specified.\n this._state.autoSchema = false;\n return versionInstance;\n }\n\n _whenReady(fn: () => Promise): Promise {\n return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new Promise((resolve, reject) => {\n if (this._state.openComplete) {\n // idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return reject(new exceptions.DatabaseClosed(this._state.dbOpenError));\n }\n if (!this._state.isBeingOpened) {\n if (!this._state.autoOpen) {\n reject(new exceptions.DatabaseClosed());\n return;\n }\n this.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n this._state.dbReadyPromise.then(resolve, reject);\n }).then(fn);\n }\n\n use({stack, create, level, name}: Middleware): this {\n if (name) this.unuse({stack, name}); // Be able to replace existing middleware.\n const middlewares = this._middlewares[stack] || (this._middlewares[stack] = []);\n middlewares.push({stack, create, level: level == null ? 10 : level, name});\n middlewares.sort((a, b) => a.level - b.level);\n // Todo update db.core and db.tables...core ? Or should be expect this to have effect\n // only after next open()?\n return this;\n }\n\n unuse({stack, create}: Middleware<{stack: keyof DexieStacks}>): this;\n unuse({stack, name}: {stack: keyof DexieStacks, name: string}): this;\n unuse({stack, name, create}: {stack: keyof DexieStacks, name?: string, create?: Function}) {\n if (stack && this._middlewares[stack]) {\n this._middlewares[stack] = this._middlewares[stack].filter(mw =>\n create ? mw.create !== create : // Given middleware has a create method. Match that exactly.\n name ? mw.name !== name : // Given middleware spec \n false);\n }\n return this;\n }\n\n open() {\n return usePSD(\n globalPSD, // Enforce global scope here since db.open() can be part of a live query or transaction scope\n () => dexieOpen(this)\n );\n }\n\n _close(): void {\n const state = this._state;\n const idx = connections.indexOf(this);\n if (idx >= 0) connections.splice(idx, 1);\n if (this.idbdb) {\n try { this.idbdb.close(); } catch (e) { }\n this.idbdb = null;\n } \n // Reset dbReadyPromise promise:\n if (!state.isBeingOpened) {\n // Only if not being opened, reset these promises.\n // Otherwise, keep them so existing promise consumers will resolve when db\n // db is reopened later on, in case closing for purpose reopening, using {disableAutoOpen: false}.\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n }\n }\n\n close({disableAutoOpen} = {disableAutoOpen: true}): void {\n const state = this._state;\n if (disableAutoOpen) {\n if (state.isBeingOpened) {\n // cancel before the call to this._close() because this._close() will recreate dbReadyPromise and openCanceller.\n state.cancelOpen(new exceptions.DatabaseClosed());\n }\n this._close();\n state.autoOpen = false;\n state.dbOpenError = new exceptions.DatabaseClosed();\n } else {\n this._close();\n state.autoOpen = this._options.autoOpen ||\n state.isBeingOpened; // If an open call is ongoing, that same promise will resolve when db is reopend.\n state.openComplete = false;\n state.dbOpenError = null;\n }\n }\n\n delete(closeOptions = {disableAutoOpen: true}): Promise {\n // Prevent accidentially doing db.delete(1) when intention was to do db.[table].delete(1).\n const hasInvalidArguments = arguments.length > 0 && typeof arguments[0] !== 'object'; \n const state = this._state;\n return new Promise((resolve, reject) => {\n const doDelete = () => {\n this.close(closeOptions);\n var req = this._deps.indexedDB.deleteDatabase(this.name);\n req.onsuccess = wrap(() => {\n _onDatabaseDeleted(this._deps, this.name);\n resolve();\n });\n req.onerror = eventRejectHandler(reject);\n req.onblocked = this._fireOnBlocked;\n }\n // Prevent accidentially doing db.delete(1) when intention was to do db.[table].delete(1).\n if (hasInvalidArguments) throw new exceptions.InvalidArgument(\"Invalid closeOptions argument to db.delete()\");\n if (state.isBeingOpened) {\n state.dbReadyPromise.then(doDelete);\n } else {\n doDelete();\n }\n });\n }\n\n backendDB() {\n return this.idbdb;\n }\n\n isOpen() {\n return this.idbdb !== null;\n }\n\n hasBeenClosed() {\n const dbOpenError = this._state.dbOpenError;\n return dbOpenError && (dbOpenError.name === 'DatabaseClosed');\n }\n\n hasFailed() {\n return this._state.dbOpenError !== null;\n }\n\n dynamicallyOpened() {\n return this._state.autoSchema;\n }\n\n get tables () {\n return keys(this._allTables).map(name => this._allTables[name]);\n }\n\n transaction(): Promise {\n const args = extractTransactionArgs.apply(this, arguments);\n return this._transaction.apply(this, args);\n }\n\n _transaction(mode: TransactionMode, tables: Array, scopeFunc: Function) {\n let parentTransaction = PSD.trans as Transaction | undefined;\n // Check if parent transactions is bound to this db instance, and if caller wants to reuse it\n if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) parentTransaction = null;\n const onlyIfCompatible = mode.indexOf('?') !== -1;\n mode = mode.replace('!', '').replace('?', '') as TransactionMode; // Ok. Will change arguments[0] as well but we wont touch arguments henceforth.\n let idbMode: IDBTransactionMode,\n storeNames;\n\n try {\n //\n // Get storeNames from arguments. Either through given table instances, or through given table names.\n //\n storeNames = tables.map(table => {\n var storeName = table instanceof this.Table ? table.name : table;\n if (typeof storeName !== 'string') throw new TypeError(\"Invalid table argument to Dexie.transaction(). Only Table or String are allowed\");\n return storeName;\n });\n\n //\n // Resolve mode. Allow shortcuts \"r\" and \"rw\".\n //\n if (mode == \"r\" || mode === READONLY)\n idbMode = READONLY;\n else if (mode == \"rw\" || mode == READWRITE)\n idbMode = READWRITE;\n else\n throw new exceptions.InvalidArgument(\"Invalid transaction mode: \" + mode);\n\n if (parentTransaction) {\n // Basic checks\n if (parentTransaction.mode === READONLY && idbMode === READWRITE) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY\");\n }\n if (parentTransaction) {\n storeNames.forEach(storeName => {\n if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Table \" + storeName +\n \" not included in parent transaction.\");\n }\n });\n }\n if (onlyIfCompatible && parentTransaction && !parentTransaction.active) {\n // '?' mode should not keep using an inactive transaction.\n parentTransaction = null;\n }\n }\n } catch (e) {\n return parentTransaction ?\n parentTransaction._promise(null, (_, reject) => {reject(e);}) :\n rejection (e);\n }\n // If this is a sub-transaction, lock the parent and then launch the sub-transaction.\n const enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc);\n return (parentTransaction ?\n parentTransaction._promise(idbMode, enterTransaction, \"lock\") :\n PSD.trans ?\n // no parent transaction despite PSD.trans exists. Make sure also\n // that the zone we create is not a sub-zone of current, because\n // Promise.follow() should not wait for it if so.\n usePSD(PSD.transless, ()=>this._whenReady(enterTransaction)) :\n this._whenReady (enterTransaction));\n }\n\n table(tableName: string): Table;\n table(tableName: string): ITable;\n table(tableName: string): Table {\n if (!hasOwn(this._allTables, tableName)) {\n throw new exceptions.InvalidTable(`Table ${tableName} does not exist`); }\n return this._allTables[tableName];\n }\n}\n","import {\n Observable as IObservable,\n Observer,\n Subscription,\n} from \"../../public/types/observable\";\n\nconst symbolObservable: typeof Symbol.observable =\n typeof Symbol !== \"undefined\" && \"observable\" in Symbol\n ? Symbol.observable\n : \"@@observable\" as any;\n\nexport class Observable implements IObservable {\n private _subscribe: (observer: Observer) => Subscription;\n hasValue?: ()=>boolean;\n getValue?: ()=>T;\n\n constructor(subscribe: (observer: Observer) => Subscription) {\n this._subscribe = subscribe;\n }\n\n subscribe(\n onNext?: ((value: T) => void) | null,\n onError?: ((error: any) => void) | null,\n onComplete?: (() => void) | null\n ): Subscription;\n subscribe(observer?: Observer | null): Subscription;\n subscribe(x?: any, error?: any, complete?: any): Subscription {\n return this._subscribe(\n !x || typeof x === \"function\" ? { next: x, error, complete } : x\n );\n }\n\n [symbolObservable]() {\n return this;\n }\n}\n","import { _global } from '../../globals/global';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\n\nexport let domDeps: DexieDOMDependencies\n\ntry {\n domDeps = {\n // Required:\n indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB,\n IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange\n };\n} catch (e) {\n domDeps = { indexedDB: null, IDBKeyRange: null };\n}\n","import { _global, isAsyncFunction, keys, objectIsEmpty } from '../functions/utils';\nimport {\n globalEvents,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport {\n beginMicroTickScope,\n decrementExpectedAwaits,\n endMicroTickScope,\n execInGlobalContext,\n incrementExpectedAwaits,\n NativePromise,\n newScope,\n PSD,\n usePSD,\n} from '../helpers/promise';\nimport { ObservabilitySet } from '../public/types/db-events';\nimport {\n Observable as IObservable,\n Subscription,\n} from '../public/types/observable';\nimport { Observable } from '../classes/observable/observable';\nimport { extendObservabilitySet } from './extend-observability-set';\nimport { rangesOverlap } from '../helpers/rangeset';\nimport { domDeps } from '../classes/dexie/dexie-dom-dependencies';\nimport { Transaction } from '../classes/transaction';\nimport { obsSetsOverlap } from './obs-sets-overlap';\n\nexport interface LiveQueryContext {\n subscr: ObservabilitySet;\n signal: AbortSignal;\n requery: () => void;\n trans: null | Transaction;\n querier: Function; // For debugging purposes and Error messages\n}\n\nexport function liveQuery(querier: () => T | Promise): IObservable {\n let hasValue = false;\n let currentValue: T;\n const observable = new Observable((observer) => {\n const scopeFuncIsAsync = isAsyncFunction(querier);\n function execute(ctx: LiveQueryContext) {\n const wasRootExec = beginMicroTickScope(); // Performance: Avoid starting a new microtick scope within the async context.\n try {\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n let rv = newScope(querier, ctx);\n if (scopeFuncIsAsync) {\n // Make sure to set rv = rv.finally in order to wait to after decrementExpectedAwaits() has been called.\n // This fixes zone leaking issue that the liveQuery zone can leak to observer's next microtask.\n rv = (rv as Promise).finally(decrementExpectedAwaits);\n }\n return rv;\n } finally {\n wasRootExec && endMicroTickScope(); // Given that we created the microtick scope, we must also end it.\n }\n }\n\n let closed = false;\n let abortController: AbortController;\n\n let accumMuts: ObservabilitySet = {};\n let currentObs: ObservabilitySet = {};\n\n const subscription: Subscription = {\n get closed() {\n return closed;\n },\n unsubscribe: () => {\n if (closed) return;\n closed = true;\n if (abortController) abortController.abort();\n if (startedListening) globalEvents.storagemutated.unsubscribe(mutationListener);\n },\n };\n\n observer.start && observer.start(subscription); // https://github.com/tc39/proposal-observable\n\n let startedListening = false;\n\n const doQuery = () => execInGlobalContext(_doQuery);\n\n function shouldNotify() {\n return obsSetsOverlap(currentObs, accumMuts);\n }\n\n const mutationListener = (parts: ObservabilitySet) => {\n extendObservabilitySet(accumMuts, parts);\n if (shouldNotify()) {\n doQuery();\n }\n };\n\n const _doQuery = () => {\n if (\n closed || // closed - don't run!\n !domDeps.indexedDB) // SSR in sveltekit, nextjs etc\n {\n return;\n }\n accumMuts = {};\n const subscr: ObservabilitySet = {};\n // Abort signal fill three purposes:\n // 1. Abort the query if the observable is unsubscribed.\n // 2. Abort the query if a new query is made before the previous one has completed.\n // 3. For cached queries to know if they should remain in memory or could be enqued for being freed up.\n // (they will remain in memory for a short time and if noone needs them again, they will eventually be freed up)\n if (abortController) abortController.abort(); // Cancel previous query. Last query will be cancelled on unsubscribe().\n abortController = new AbortController();\n \n const ctx: LiveQueryContext = {\n subscr,\n signal: abortController.signal,\n requery: doQuery,\n querier,\n trans: null // Make the scope transactionless (don't reuse transaction from outer scope of the caller of subscribe())\n }\n const ret = execute(ctx);\n Promise.resolve(ret).then(\n (result) => {\n hasValue = true;\n currentValue = result;\n if (closed || ctx.signal.aborted) {\n // closed - no subscriber anymore.\n // signal.aborted - new query was made before this one completed and\n // the querier might have catched AbortError and return successful result.\n // If so, we should not rely in that result because we know we have aborted\n // this run, which means there's another run going on that will handle accumMuts\n // and we must not base currentObs on the half-baked subscr.\n return;\n }\n accumMuts = {};\n // Update what we are subscribing for based on this last run:\n currentObs = subscr;\n if (!objectIsEmpty(currentObs) && !startedListening) {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener);\n startedListening = true;\n }\n execInGlobalContext(()=>!closed && observer.next && observer.next(result));\n },\n (err) => {\n hasValue = false;\n if (!['DatabaseClosedError', 'AbortError'].includes(err?.name)) {\n if (!closed) execInGlobalContext(()=>{\n if (closed) return;\n observer.error && observer.error(err);\n });\n }\n }\n );\n };\n\n // Use setTimeot here to guarantee execution in a private macro task before and\n // after. The helper executeInGlobalContext(_doQuery) is not enough here because\n // caller of `subscribe()` could be anything, such as a frontend framework that will\n // continue in the same tick after subscribe() is called and call other\n // eftects, that could involve dexie operations such as writing to the DB.\n // If that happens, the private zone echoes from a live query tast started here\n // could still be ongoing when the other operations start and make them inherit\n // the async context from a live query.\n setTimeout(doQuery, 0);\n return subscription;\n });\n observable.hasValue = () => hasValue;\n observable.getValue = () => currentValue;\n return observable;\n}\n","import { Dexie as _Dexie } from './dexie';\nimport { _global } from '../../globals/global';\nimport { props, derive, extend, override, getByKeyPath, setByKeyPath, delByKeyPath, shallowClone, deepClone, asap } from '../../functions/utils';\nimport { getObjectDiff } from \"../../functions/get-object-diff\";\nimport { fullNameExceptions } from '../../errors';\nimport { DexieConstructor } from '../../public/types/dexie-constructor';\nimport { getDatabaseNames } from '../../helpers/database-enumerator';\nimport { PSD } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { newScope } from '../../helpers/promise';\nimport { rejection } from '../../helpers/promise';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { dexieStackFrameFilter, minKey, connections, DEXIE_VERSION } from '../../globals/constants';\nimport Events from '../../helpers/Events';\nimport { exceptions } from '../../errors';\nimport { errnames } from '../../errors';\nimport { getMaxKey } from '../../functions/quirks';\nimport { vip } from './vip';\nimport { globalEvents } from '../../globals/global-events';\nimport { liveQuery } from '../../live-query/live-query';\nimport { extendObservabilitySet } from '../../live-query/extend-observability-set';\nimport { domDeps } from './dexie-dom-dependencies';\nimport { cmp } from '../../functions/cmp';\nimport { cache } from '../../live-query/cache/cache';\n\n/* (Dexie) is an instance of DexieConstructor, as defined in public/types/dexie-constructor.d.ts\n* (new Dexie()) is an instance of Dexie, as defined in public/types/dexie.d.ts\n* \n* Why we're doing this?\n\n* Because we've choosen to define the public Dexie API using a DexieConstructor interface\n* rather than declaring a class. On that interface, all static props are defined.\n* In practice, class Dexie's constructor implements DexieConstructor and all member props\n* are defined in interface Dexie. We could say, it's a typescript limitation of not being\n* able to define a static interface that forces us to do the cast below.\n*/\nconst Dexie = _Dexie as any as DexieConstructor;\n\n//\n// Set all static methods and properties onto Dexie:\n// \nprops(Dexie, {\n\n // Dexie.BulkError = class BulkError {...};\n // Dexie.XXXError = class XXXError {...};\n ...fullNameExceptions,\n\n //\n // Static delete() method.\n //\n delete(databaseName: string) {\n const db = new Dexie(databaseName, {addons: []});\n return db.delete();\n },\n\n //\n // Static exists() method.\n //\n exists(name: string) {\n return new Dexie(name, { addons: [] }).open().then(db => {\n db.close();\n return true;\n }).catch('NoSuchDatabaseError', () => false);\n },\n\n //\n // Static method for retrieving a list of all existing databases at current host.\n //\n getDatabaseNames(cb) {\n try {\n return getDatabaseNames(Dexie.dependencies).then(cb);\n } catch {\n return rejection(new exceptions.MissingAPI());\n }\n },\n\n /** @deprecated */\n defineClass() {\n function Class(content) {\n extend(this, content);\n }\n return Class;\n },\n\n ignoreTransaction(scopeFunc) {\n // In case caller is within a transaction but needs to create a separate transaction.\n // Example of usage:\n //\n // Let's say we have a logger function in our app. Other application-logic should be unaware of the\n // logger function and not need to include the 'logentries' table in all transaction it performs.\n // The logging should always be done in a separate transaction and not be dependant on the current\n // running transaction context. Then you could use Dexie.ignoreTransaction() to run code that starts a new transaction.\n //\n // Dexie.ignoreTransaction(function() {\n // db.logentries.add(newLogEntry);\n // });\n //\n // Unless using Dexie.ignoreTransaction(), the above example would try to reuse the current transaction\n // in current Promise-scope.\n //\n // An alternative to Dexie.ignoreTransaction() would be setImmediate() or setTimeout(). The reason we still provide an\n // API for this because\n // 1) The intention of writing the statement could be unclear if using setImmediate() or setTimeout().\n // 2) setTimeout() would wait unnescessary until firing. This is however not the case with setImmediate().\n // 3) setImmediate() is not supported in the ES standard.\n // 4) You might want to keep other PSD state that was set in a parent PSD, such as PSD.letThrough.\n return PSD.trans ?\n usePSD(PSD.transless, scopeFunc) : // Use the closest parent that was non-transactional.\n scopeFunc(); // No need to change scope because there is no ongoing transaction.\n },\n\n vip,\n\n async: function (generatorFn: Function) {\n return function () {\n try {\n var rv = awaitIterator(generatorFn.apply(this, arguments));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n };\n },\n\n spawn: function (generatorFn, args, thiz) {\n try {\n var rv = awaitIterator(generatorFn.apply(thiz, args || []));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n },\n\n // Dexie.currentTransaction property\n currentTransaction: {\n get: () => PSD.trans || null\n },\n\n waitFor: function (promiseOrFunction, optionalTimeout) {\n // If a function is provided, invoke it and pass the returning value to Transaction.waitFor()\n const promise = Promise.resolve(\n typeof promiseOrFunction === 'function' ?\n Dexie.ignoreTransaction(promiseOrFunction) :\n promiseOrFunction)\n .timeout(optionalTimeout || 60000); // Default the timeout to one minute. Caller may specify Infinity if required. \n\n // Run given promise on current transaction. If no current transaction, just return a Dexie promise based\n // on given value.\n return PSD.trans ?\n PSD.trans.waitFor(promise) :\n promise;\n },\n\n // Export our Promise implementation since it can be handy as a standalone Promise implementation\n Promise: Promise,\n\n // Dexie.debug proptery:\n // Dexie.debug = false\n // Dexie.debug = true\n // Dexie.debug = \"dexie\" - don't hide dexie's stack frames.\n debug: {\n get: () => Debug.debug,\n set: value => {\n Debug.setDebug(value, value === 'dexie' ? () => true : dexieStackFrameFilter);\n }\n },\n\n // Export our derive/extend/override methodology\n derive: derive, // Deprecate?\n extend: extend, // Deprecate?\n props: props,\n override: override, // Deprecate?\n // Export our Events() function - can be handy as a toolkit\n Events: Events,\n on: globalEvents,\n liveQuery,\n extendObservabilitySet,\n // Utilities\n getByKeyPath: getByKeyPath,\n setByKeyPath: setByKeyPath,\n delByKeyPath: delByKeyPath,\n shallowClone: shallowClone,\n deepClone: deepClone,\n getObjectDiff: getObjectDiff,\n cmp,\n asap: asap,\n //maxKey: new Dexie('',{addons:[]})._maxKey,\n minKey: minKey,\n // Addon registry\n addons: [],\n // Global DB connection list\n connections: connections,\n\n //MultiModifyError: exceptions.Modify, // Obsolete!\n errnames: errnames,\n\n // Export other static classes\n //IndexSpec: IndexSpec, Obsolete!\n //TableSchema: TableSchema, Obsolete!\n\n //\n // Dependencies\n //\n // These will automatically work in browsers with indexedDB support, or where an indexedDB polyfill has been included.\n //\n // In node.js, however, these properties must be set \"manually\" before instansiating a new Dexie().\n // For node.js, you need to require indexeddb-js or similar and then set these deps.\n //\n dependencies: domDeps,\n cache,\n\n // API Version Number: Type Number, make sure to always set a version number that can be comparable correctly. Example: 0.9, 0.91, 0.92, 1.0, 1.01, 1.1, 1.2, 1.21, etc.\n semVer: DEXIE_VERSION,\n version: DEXIE_VERSION.split('.')\n .map(n => parseInt(n))\n .reduce((p, c, i) => p + (c / Math.pow(10, i * 2))),\n\n // https://github.com/dfahlander/Dexie.js/issues/186\n // typescript compiler tsc in mode ts-->es5 & commonJS, will expect require() to return\n // x.default. Workaround: Set Dexie.default = Dexie.\n // default: Dexie, // Commented because solved in index-umd.ts instead.\n // Make it possible to import {Dexie} (non-default import)\n // Reason 1: May switch to that in future.\n // Reason 2: We declare it both default and named exported in d.ts to make it possible\n // to let addons extend the Dexie interface with Typescript 2.1 (works only when explicitely\n // exporting the symbol, not just default exporting)\n // Dexie: Dexie // Commented because solved in index-umd.ts instead.\n});\n\nDexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange);\n","import { globalEvents, DEXIE_STORAGE_MUTATED_EVENT_NAME, STORAGE_MUTATED_DOM_EVENT_NAME } from '../globals/global-events';\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport { signalSubscribersNow } from './cache/signalSubscribers';\n\nif (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, updatedParts => {\n if (!propagatingLocally) {\n let event: CustomEvent;\n event = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, {\n detail: updatedParts\n });\n propagatingLocally = true;\n dispatchEvent(event);\n propagatingLocally = false;\n }\n });\n addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, ({detail}: CustomEvent) => {\n if (!propagatingLocally) {\n propagateLocally(detail);\n }\n });\n}\n\n/** Called from listeners to BroadcastChannel and DOM event to\n * propagate the event locally into dexie's storagemutated event\n * and invalidate cached queries.\n * \n * This function is only called when the event is not originating\n * from this same Dexie module - either from another redundant dexie import\n * or from a foreign tab or worker. That's why we need to invalidate\n * the cache when this happens.\n */\nexport function propagateLocally(updateParts: ObservabilitySet) {\n let wasMe = propagatingLocally;\n try {\n propagatingLocally = true;\n // Fire the \"storagemutated\" event.\n globalEvents.storagemutated.fire(updateParts);\n // Invalidate cached queries and signal subscribers to requery.\n signalSubscribersNow(updateParts, true);\n } finally {\n propagatingLocally = wasMe;\n }\n}\n\nexport let propagatingLocally = false;\n","import {\n globalEvents,\n STORAGE_MUTATED_DOM_EVENT_NAME,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport { propagateLocally, propagatingLocally } from './propagate-locally';\n\nexport let bc: BroadcastChannel;\n\nexport let createBC = ()=>{};\n\nif (typeof BroadcastChannel !== 'undefined') {\n createBC = () => {\n bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME);\n bc.onmessage = ev => ev.data && propagateLocally(ev.data);\n }\n createBC();\n\n /**\n * The Node.js BroadcastChannel will prevent the node process from exiting\n * if the BroadcastChannel is not closed.\n * Therefore we have to call unref() which allows the process to finish\n * properly even when the BroadcastChannel is never closed.\n * @link https://nodejs.org/api/worker_threads.html#broadcastchannelunref\n * @link https://github.com/dexie/Dexie.js/pull/1576\n */\n if (typeof (bc as any).unref === 'function') {\n (bc as any).unref();\n }\n \n //\n // Propagate local changes to remote tabs, windows and workers via BroadcastChannel\n //\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, (changedParts) => {\n if (!propagatingLocally) {\n bc.postMessage(changedParts);\n }\n });\n}\n","import { Dexie } from \"./classes/dexie\";\nimport { connections } from \"./globals/constants\";\nimport { debug } from \"./helpers/debug\";\nimport { RangeSet } from \"./helpers/rangeset\";\nimport { bc, createBC } from \"./live-query/enable-broadcast\";\nimport { propagateLocally } from \"./live-query/propagate-locally\";\n\n\nif (typeof addEventListener !== 'undefined') {\n addEventListener('pagehide', (event) => {\n if (!Dexie.disableBfCache && event.persisted) {\n if (debug) console.debug('Dexie: handling persisted pagehide');\n bc?.close();\n for (const db of connections) {\n db.close({disableAutoOpen: false});\n }\n }\n });\n addEventListener('pageshow', (event) => {\n if (!Dexie.disableBfCache && event.persisted) {\n if (debug) console.debug('Dexie: handling persisted pageshow');\n createBC();\n propagateLocally({all: new RangeSet(-Infinity, [[]])}); // Trigger all queries to requery\n }\n });\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function add(value: number | BigInt | Array) {\n return new PropModification({add: value});\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function remove(value: number | BigInt | Array) {\n return new PropModification({remove: value});\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function replacePrefix(a: string, b:string) {\n return new PropModification({replacePrefix: [a, b]});\n}\n","import { Dexie } from './classes/dexie';\nimport { DexieConstructor } from './public/types/dexie-constructor';\nimport { DexiePromise } from './helpers/promise';\nimport { mapError } from './errors';\nimport * as Debug from './helpers/debug';\nimport { dexieStackFrameFilter } from './globals/constants';\n\n// Generate all static properties such as Dexie.maxKey etc\n// (implement interface DexieConstructor):\nimport './classes/dexie/dexie-static-props';\nimport './live-query/enable-broadcast';\nimport './support-bfcache';\nimport { liveQuery } from './live-query/live-query';\nimport { Entity } from './classes/entity/Entity';\nimport { cmp } from './functions/cmp';\nimport { PropModification, PropModSymbol } from './helpers/prop-modification';\nimport { replacePrefix, add, remove } from './functions/propmods';\n\n\n// Set rejectionMapper of DexiePromise so that it generally tries to map\n// DOMErrors and DOMExceptions to a DexieError instance with same name but with\n// async stack support and with a prototypal inheritance from DexieError and Error.\n// of Map DOMErrors and DOMExceptions to corresponding Dexie errors.\nDexiePromise.rejectionMapper = mapError;\n\n// Let the async stack filter focus on app code and filter away frames from dexie.min.js:\nDebug.setDebug(Debug.debug, dexieStackFrameFilter);\n\nexport { RangeSet, mergeRanges, rangesOverlap } from \"./helpers/rangeset\";\nexport { Dexie, liveQuery }; // Comply with public/index.d.ts.\nexport { Entity };\nexport { cmp };\nexport { PropModSymbol, PropModification, replacePrefix, add, remove };\nexport default Dexie;\n"],"names":["asap","_a","Promise","Dexie","safari14Workaround","_Dexie","Debug.debug","Debug.setDebug"],"mappings":"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"} \ No newline at end of file diff --git a/src/dexie/dist/modern/dexie.min.mjs b/src/dexie/dist/modern/dexie.min.mjs deleted file mode 100644 index 5b3a35ac6..000000000 --- a/src/dexie/dist/modern/dexie.min.mjs +++ /dev/null @@ -1,2 +0,0 @@ -const e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,t=Object.keys,n=Array.isArray;function r(e,n){return"object"!=typeof n||t(n).forEach((function(t){e[t]=n[t]})),e}"undefined"==typeof Promise||e.Promise||(e.Promise=Promise);const s=Object.getPrototypeOf,i={}.hasOwnProperty;function o(e,t){return i.call(e,t)}function a(e,n){"function"==typeof n&&(n=n(s(e))),("undefined"==typeof Reflect?t:Reflect.ownKeys)(n).forEach((t=>{l(e,t,n[t])}))}const u=Object.defineProperty;function l(e,t,n,s){u(e,t,r(n&&o(n,"get")&&"function"==typeof n.get?{get:n.get,set:n.set,configurable:!0}:{value:n,configurable:!0,writable:!0},s))}function c(e){return{from:function(t){return e.prototype=Object.create(t.prototype),l(e.prototype,"constructor",e),{extend:a.bind(null,e.prototype)}}}}const h=Object.getOwnPropertyDescriptor;function d(e,t){let n;return h(e,t)||(n=s(e))&&d(n,t)}const f=[].slice;function p(e,t,n){return f.call(e,t,n)}function y(e,t){return t(e)}function m(e){if(!e)throw new Error("Assertion Failed")}function b(t){e.setImmediate?setImmediate(t):setTimeout(t,0)}function g(e,t){if("string"==typeof t&&o(e,t))return e[t];if(!t)return e;if("string"!=typeof t){for(var n=[],r=0,s=t.length;r["Int","Uint","Float"].map((t=>t+e+"Array")))))).filter((t=>e[t])),O=new Set(k.map((t=>e[t])));function P(e){const t={};for(const n in e)if(o(e,n)){const r=e[n];t[n]=!r||"object"!=typeof r||O.has(r.constructor)?r:P(r)}return t}let E=null;function K(e){E=new WeakMap;const t=S(e);return E=null,t}function S(e){if(!e||"object"!=typeof e)return e;let t=E.get(e);if(t)return t;if(n(e)){t=[],E.set(e,t);for(var r=0,i=e.length;r=0&&e.splice(n,1),n>=0}const T={};function I(e){var t,r,s,i;if(1===arguments.length){if(n(e))return e.slice();if(this===T&&"string"==typeof e)return[e];if(i=D(e)){for(r=[];!(s=i.next()).done;)r.push(s.value);return r}if(null==e)return[e];if("number"==typeof(t=e.length)){for(r=new Array(t);t--;)r[t]=e[t];return r}return[e]}for(t=arguments.length,r=new Array(t);t--;)r[t]=arguments[t];return r}const B="undefined"!=typeof Symbol?e=>"AsyncFunction"===e[Symbol.toStringTag]:()=>!1;var R=["Unknown","Constraint","Data","TransactionInactive","ReadOnly","Version","NotFound","InvalidState","InvalidAccess","Abort","Timeout","QuotaExceeded","Syntax","DataClone"],$=["Modify","Bulk","OpenFailed","VersionChange","Schema","Upgrade","InvalidTable","MissingAPI","NoSuchDatabase","InvalidArgument","SubTransaction","Unsupported","Internal","DatabaseClosed","PrematureCommit","ForeignAwait"].concat(R),F={VersionChanged:"Database version changed by other database connection",DatabaseClosed:"Database has been closed",Abort:"Transaction aborted",TransactionInactive:"Transaction has already completed or failed",MissingAPI:"IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb"};function N(e,t){this.name=e,this.message=t}function M(e,t){return e+". Errors: "+Object.keys(t).map((e=>t[e].toString())).filter(((e,t,n)=>n.indexOf(e)===t)).join("\n")}function L(e,t,n,r){this.failures=t,this.failedKeys=r,this.successCount=n,this.message=M(e,t)}function U(e,t){this.name="BulkError",this.failures=Object.keys(t).map((e=>t[e])),this.failuresByPos=t,this.message=M(e,this.failures)}c(N).from(Error).extend({toString:function(){return this.name+": "+this.message}}),c(L).from(N),c(U).from(N);var V=$.reduce(((e,t)=>(e[t]=t+"Error",e)),{});const z=N;var W=$.reduce(((e,t)=>{var n=t+"Error";function r(e,r){this.name=n,e?"string"==typeof e?(this.message=`${e}${r?"\n "+r:""}`,this.inner=r||null):"object"==typeof e&&(this.message=`${e.name} ${e.message}`,this.inner=e):(this.message=F[t]||n,this.inner=null)}return c(r).from(z),e[t]=r,e}),{});W.Syntax=SyntaxError,W.Type=TypeError,W.Range=RangeError;var Y=R.reduce(((e,t)=>(e[t+"Error"]=W[t],e)),{});var G=$.reduce(((e,t)=>(-1===["Syntax","Type","Range"].indexOf(t)&&(e[t+"Error"]=W[t]),e)),{});function Q(){}function X(e){return e}function H(e,t){return null==e||e===X?t:function(n){return t(e(n))}}function J(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function Z(e,t){return e===Q?t:function(){var n=e.apply(this,arguments);void 0!==n&&(arguments[0]=n);var r=this.onsuccess,s=this.onerror;this.onsuccess=null,this.onerror=null;var i=t.apply(this,arguments);return r&&(this.onsuccess=this.onsuccess?J(r,this.onsuccess):r),s&&(this.onerror=this.onerror?J(s,this.onerror):s),void 0!==i?i:n}}function ee(e,t){return e===Q?t:function(){e.apply(this,arguments);var n=this.onsuccess,r=this.onerror;this.onsuccess=this.onerror=null,t.apply(this,arguments),n&&(this.onsuccess=this.onsuccess?J(n,this.onsuccess):n),r&&(this.onerror=this.onerror?J(r,this.onerror):r)}}function te(e,t){return e===Q?t:function(n){var s=e.apply(this,arguments);r(n,s);var i=this.onsuccess,o=this.onerror;this.onsuccess=null,this.onerror=null;var a=t.apply(this,arguments);return i&&(this.onsuccess=this.onsuccess?J(i,this.onsuccess):i),o&&(this.onerror=this.onerror?J(o,this.onerror):o),void 0===s?void 0===a?void 0:a:r(s,a)}}function ne(e,t){return e===Q?t:function(){return!1!==t.apply(this,arguments)&&e.apply(this,arguments)}}function re(e,t){return e===Q?t:function(){var n=e.apply(this,arguments);if(n&&"function"==typeof n.then){for(var r=this,s=arguments.length,i=new Array(s);s--;)i[s]=arguments[s];return n.then((function(){return t.apply(r,i)}))}return t.apply(this,arguments)}}G.ModifyError=L,G.DexieError=N,G.BulkError=U;var se="undefined"!=typeof location&&/^(http|https):\/\/(localhost|127\.0\.0\.1)/.test(location.href);function ie(e,t){se=e}var oe={};const[ae,ue,le]="undefined"==typeof Promise?[]:(()=>{let e=Promise.resolve();if("undefined"==typeof crypto||!crypto.subtle)return[e,s(e),e];const t=crypto.subtle.digest("SHA-512",new Uint8Array([0]));return[t,s(t),e]})(),ce=ue&&ue.then,he=ae&&ae.constructor,de=!!le;var fe=function(e,t){_e.push([e,t]),ye&&(queueMicrotask(De),ye=!1)},pe=!0,ye=!0,me=[],be=[],ge=X,ve={id:"global",global:!0,ref:0,unhandleds:[],onunhandled:Q,pgp:!1,env:{},finalize:Q},we=ve,_e=[],xe=0,ke=[];function Oe(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");this._listeners=[],this._lib=!1;var t=this._PSD=we;if("function"!=typeof e){if(e!==oe)throw new TypeError("Not a function");return this._state=arguments[1],this._value=arguments[2],void(!1===this._state&&Se(this,this._value))}this._state=null,this._value=null,++t.ref,Ke(this,e)}const Pe={get:function(){var e=we,t=Le;function n(n,r){var s=!e.global&&(e!==we||t!==Le);const i=s&&!We();var o=new Oe(((t,o)=>{Ae(this,new Ee(Ze(n,e,s,i),Ze(r,e,s,i),t,o,e))}));return this._consoleTask&&(o._consoleTask=this._consoleTask),o}return n.prototype=oe,n},set:function(e){l(this,"then",e&&e.prototype===oe?Pe:{get:function(){return e},set:Pe.set})}};function Ee(e,t,n,r,s){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=r,this.psd=s}function Ke(e,t){try{t((t=>{if(null===e._state){if(t===e)throw new TypeError("A promise cannot be resolved with itself.");var n=e._lib&&qe();t&&"function"==typeof t.then?Ke(e,((e,n)=>{t instanceof Oe?t._then(e,n):t.then(e,n)})):(e._state=!0,e._value=t,Ce(e)),n&&Te()}}),Se.bind(null,e))}catch(t){Se(e,t)}}function Se(e,t){if(be.push(t),null===e._state){var n=e._lib&&qe();t=ge(t),e._state=!1,e._value=t,function(e){me.some((t=>t._value===e._value))||me.push(e)}(e),Ce(e),n&&Te()}}function Ce(e){var t=e._listeners;e._listeners=[];for(var n=0,r=t.length;n{0==--xe&&Ie()}),[]))}function Ae(e,t){if(null!==e._state){var n=e._state?t.onFulfilled:t.onRejected;if(null===n)return(e._state?t.resolve:t.reject)(e._value);++t.psd.ref,++xe,fe(je,[n,e,t])}else e._listeners.push(t)}function je(e,t,n){try{var r,s=t._value;!t._state&&be.length&&(be=[]),r=se&&t._consoleTask?t._consoleTask.run((()=>e(s))):e(s),t._state||-1!==be.indexOf(s)||function(e){var t=me.length;for(;t;)if(me[--t]._value===e._value)return void me.splice(t,1)}(t),n.resolve(r)}catch(e){n.reject(e)}finally{0==--xe&&Ie(),--n.psd.ref||n.psd.finalize()}}function De(){Je(ve,(()=>{qe()&&Te()}))}function qe(){var e=pe;return pe=!1,ye=!1,e}function Te(){var e,t,n;do{for(;_e.length>0;)for(e=_e,_e=[],n=e.length,t=0;t0);pe=!0,ye=!0}function Ie(){var e=me;me=[],e.forEach((e=>{e._PSD.onunhandled.call(null,e._value,e)}));for(var t=ke.slice(0),n=t.length;n;)t[--n]()}function Be(e){return new Oe(oe,!1,e)}function Re(e,t){var n=we;return function(){var r=qe(),s=we;try{return Xe(n,!0),e.apply(this,arguments)}catch(e){t&&t(e)}finally{Xe(s,!1),r&&Te()}}}a(Oe.prototype,{then:Pe,_then:function(e,t){Ae(this,new Ee(null,null,e,t,we))},catch:function(e){if(1===arguments.length)return this.then(null,e);var t=arguments[0],n=arguments[1];return"function"==typeof t?this.then(null,(e=>e instanceof t?n(e):Be(e))):this.then(null,(e=>e&&e.name===t?n(e):Be(e)))},finally:function(e){return this.then((t=>Oe.resolve(e()).then((()=>t))),(t=>Oe.resolve(e()).then((()=>Be(t)))))},timeout:function(e,t){return e<1/0?new Oe(((n,r)=>{var s=setTimeout((()=>r(new W.Timeout(t))),e);this.then(n,r).finally(clearTimeout.bind(null,s))})):this}}),"undefined"!=typeof Symbol&&Symbol.toStringTag&&l(Oe.prototype,Symbol.toStringTag,"Dexie.Promise"),ve.env=He(),a(Oe,{all:function(){var e=I.apply(null,arguments).map(Ye);return new Oe((function(t,n){0===e.length&&t([]);var r=e.length;e.forEach(((s,i)=>Oe.resolve(s).then((n=>{e[i]=n,--r||t(e)}),n)))}))},resolve:e=>e instanceof Oe?e:e&&"function"==typeof e.then?new Oe(((t,n)=>{e.then(t,n)})):new Oe(oe,!0,e),reject:Be,race:function(){var e=I.apply(null,arguments).map(Ye);return new Oe(((t,n)=>{e.map((e=>Oe.resolve(e).then(t,n)))}))},PSD:{get:()=>we,set:e=>we=e},totalEchoes:{get:()=>Le},newPSD:Ve,usePSD:Je,scheduler:{get:()=>fe,set:e=>{fe=e}},rejectionMapper:{get:()=>ge,set:e=>{ge=e}},follow:(e,t)=>new Oe(((n,r)=>Ve(((t,n)=>{var r=we;r.unhandleds=[],r.onunhandled=n,r.finalize=J((function(){!function(e){function t(){e(),ke.splice(ke.indexOf(t),1)}ke.push(t),++xe,fe((()=>{0==--xe&&Ie()}),[])}((()=>{0===this.unhandleds.length?t():n(this.unhandleds[0])}))}),r.finalize),e()}),t,n,r)))}),he&&(he.allSettled&&l(Oe,"allSettled",(function(){const e=I.apply(null,arguments).map(Ye);return new Oe((t=>{0===e.length&&t([]);let n=e.length;const r=new Array(n);e.forEach(((e,s)=>Oe.resolve(e).then((e=>r[s]={status:"fulfilled",value:e}),(e=>r[s]={status:"rejected",reason:e})).then((()=>--n||t(r)))))}))})),he.any&&"undefined"!=typeof AggregateError&&l(Oe,"any",(function(){const e=I.apply(null,arguments).map(Ye);return new Oe(((t,n)=>{0===e.length&&n(new AggregateError([]));let r=e.length;const s=new Array(r);e.forEach(((e,i)=>Oe.resolve(e).then((e=>t(e)),(e=>{s[i]=e,--r||n(new AggregateError(s))}))))}))})));const $e={awaits:0,echoes:0,id:0};var Fe=0,Ne=[],Me=0,Le=0,Ue=0;function Ve(e,t,n,s){var i=we,o=Object.create(i);o.parent=i,o.ref=0,o.global=!1,o.id=++Ue,ve.env,o.env=de?{Promise:Oe,PromiseProp:{value:Oe,configurable:!0,writable:!0},all:Oe.all,race:Oe.race,allSettled:Oe.allSettled,any:Oe.any,resolve:Oe.resolve,reject:Oe.reject}:{},t&&r(o,t),++i.ref,o.finalize=function(){--this.parent.ref||this.parent.finalize()};var a=Je(o,e,n,s);return 0===o.ref&&o.finalize(),a}function ze(){return $e.id||($e.id=++Fe),++$e.awaits,$e.echoes+=100,$e.id}function We(){return!!$e.awaits&&(0==--$e.awaits&&($e.id=0),$e.echoes=100*$e.awaits,!0)}function Ye(e){return $e.echoes&&e&&e.constructor===he?(ze(),e.then((e=>(We(),e)),(e=>(We(),tt(e))))):e}function Ge(e){++Le,$e.echoes&&0!=--$e.echoes||($e.echoes=$e.awaits=$e.id=0),Ne.push(we),Xe(e,!0)}function Qe(){var e=Ne[Ne.length-1];Ne.pop(),Xe(e,!1)}function Xe(t,n){var r=we;if((n?!$e.echoes||Me++&&t===we:!Me||--Me&&t===we)||queueMicrotask(n?Ge.bind(null,t):Qe),t!==we&&(we=t,r===ve&&(ve.env=He()),de)){var s=ve.env.Promise,i=t.env;(r.global||t.global)&&(Object.defineProperty(e,"Promise",i.PromiseProp),s.all=i.all,s.race=i.race,s.resolve=i.resolve,s.reject=i.reject,i.allSettled&&(s.allSettled=i.allSettled),i.any&&(s.any=i.any))}}function He(){var t=e.Promise;return de?{Promise:t,PromiseProp:Object.getOwnPropertyDescriptor(e,"Promise"),all:t.all,race:t.race,allSettled:t.allSettled,any:t.any,resolve:t.resolve,reject:t.reject}:{}}function Je(e,t,n,r,s){var i=we;try{return Xe(e,!0),t(n,r,s)}finally{Xe(i,!1)}}function Ze(e,t,n,r){return"function"!=typeof e?e:function(){var s=we;n&&ze(),Xe(t,!0);try{return e.apply(this,arguments)}finally{Xe(s,!1),r&&queueMicrotask(We)}}}function et(e){Promise===he&&0===$e.echoes?0===Me?e():enqueueNativeMicroTask(e):setTimeout(e,0)}-1===(""+ce).indexOf("[native code]")&&(ze=We=Q);var tt=Oe.reject;function nt(e,t,n,r){if(e.idbdb&&(e._state.openComplete||we.letThrough||e._vip)){var s=e._createTransaction(t,n,e._dbSchema);try{s.create(),e._state.PR1398_maxLoop=3}catch(s){return s.name===V.InvalidState&&e.isOpen()&&--e._state.PR1398_maxLoop>0?(console.warn("Dexie: Need to reopen db"),e.close({disableAutoOpen:!1}),e.open().then((()=>nt(e,t,n,r)))):tt(s)}return s._promise(t,((e,t)=>Ve((()=>(we.trans=s,r(e,t,s)))))).then((e=>{if("readwrite"===t)try{s.idbtrans.commit()}catch{}return"readonly"===t?e:s._completion.then((()=>e))}))}if(e._state.openComplete)return tt(new W.DatabaseClosed(e._state.dbOpenError));if(!e._state.isBeingOpened){if(!e._state.autoOpen)return tt(new W.DatabaseClosed);e.open().catch(Q)}return e._state.dbReadyPromise.then((()=>nt(e,t,n,r)))}const rt=String.fromCharCode(65535),st="Invalid key provided. Keys must be of type string, number, Date or Array.",it=[];function ot(e,t){return e?t?function(){return e.apply(this,arguments)&&t.apply(this,arguments)}:e:t}const at={type:3,lower:-1/0,lowerOpen:!1,upper:[[]],upperOpen:!1};function ut(e){return"string"!=typeof e||/\./.test(e)?e=>e:t=>(void 0===t[e]&&e in t&&delete(t=K(t))[e],t)}function lt(){throw W.Type()}function ct(e,t){try{const n=ht(e),r=ht(t);if(n!==r)return"Array"===n?1:"Array"===r?-1:"binary"===n?1:"binary"===r?-1:"string"===n?1:"string"===r?-1:"Date"===n?1:"Date"!==r?NaN:-1;switch(n){case"number":case"Date":case"string":return e>t?1:er._promise(e,o,n)),{trans:r,transless:we.transless||we}):nt(this.db,e,[this.name],o);return i&&(t._consoleTask=i,t=t.catch((e=>(console.trace(e),tt(e))))),t}finally{a&&Te()}}get(e,t){return e&&e.constructor===Object?this.where(e).first(t):null==e?tt(new W.Type("Invalid argument to Table.get()")):this._trans("readonly",(t=>this.core.get({trans:t,key:e}).then((e=>this.hook.reading.fire(e))))).then(t)}where(e){if("string"==typeof e)return new this.db.WhereClause(this,e);if(n(e))return new this.db.WhereClause(this,`[${e.join("+")}]`);const r=t(e);if(1===r.length)return this.where(r[0]).equals(e[r[0]]);const s=this.schema.indexes.concat(this.schema.primKey).filter((e=>{if(e.compound&&r.every((t=>e.keyPath.indexOf(t)>=0))){for(let t=0;te.keyPath.length-t.keyPath.length))[0];if(s&&this.db._maxKey!==rt){const t=s.keyPath.slice(0,r.length);return this.where(t).equals(t.map((t=>e[t])))}!s&&se&&console.warn(`The query ${JSON.stringify(e)} on ${this.name} would benefit from a compound index [${r.join("+")}]`);const{idxByName:i}=this.schema,o=this.db._deps.indexedDB;function a(e,t){return 0===o.cmp(e,t)}const[u,l]=r.reduce((([t,r],s)=>{const o=i[s],u=e[s];return[t||o,t||!o?ot(r,o&&o.multi?e=>{const t=g(e,s);return n(t)&&t.some((e=>a(u,e)))}:e=>a(u,g(e,s))):r]}),[null,null]);return u?this.where(u.name).equals(e[u.keyPath]).filter(l):s?this.filter(l):this.where(r).equals("")}filter(e){return this.toCollection().and(e)}count(e){return this.toCollection().count(e)}offset(e){return this.toCollection().offset(e)}limit(e){return this.toCollection().limit(e)}each(e){return this.toCollection().each(e)}toArray(e){return this.toCollection().toArray(e)}toCollection(){return new this.db.Collection(new this.db.WhereClause(this))}orderBy(e){return new this.db.Collection(new this.db.WhereClause(this,n(e)?`[${e.join("+")}]`:e))}reverse(){return this.toCollection().reverse()}mapToClass(e){const{db:t,name:n}=this;this.schema.mappedClass=e,e.prototype instanceof lt&&(e=class extends e{get db(){return t}table(){return n}});const r=new Set;for(let t=e.prototype;t;t=s(t))Object.getOwnPropertyNames(t).forEach((e=>r.add(e)));const i=t=>{if(!t)return t;const n=Object.create(e.prototype);for(let e in t)if(!r.has(e))try{n[e]=t[e]}catch(e){}return n};return this.schema.readHook&&this.hook.reading.unsubscribe(this.schema.readHook),this.schema.readHook=i,this.hook("reading",i),e}defineClass(){return this.mapToClass((function(e){r(this,e)}))}add(e,t){const{auto:n,keyPath:r}=this.schema.primKey;let s=e;return r&&n&&(s=ut(r)(e)),this._trans("readwrite",(e=>this.core.mutate({trans:e,type:"add",keys:null!=t?[t]:null,values:[s]}))).then((e=>e.numFailures?Oe.reject(e.failures[0]):e.lastResult)).then((t=>{if(r)try{v(e,r,t)}catch(e){}return t}))}update(e,t){if("object"!=typeof e||n(e))return this.where(":id").equals(e).modify(t);{const n=g(e,this.schema.primKey.keyPath);return void 0===n?tt(new W.InvalidArgument("Given object does not contain its primary key")):this.where(":id").equals(n).modify(t)}}put(e,t){const{auto:n,keyPath:r}=this.schema.primKey;let s=e;return r&&n&&(s=ut(r)(e)),this._trans("readwrite",(e=>this.core.mutate({trans:e,type:"put",values:[s],keys:null!=t?[t]:null}))).then((e=>e.numFailures?Oe.reject(e.failures[0]):e.lastResult)).then((t=>{if(r)try{v(e,r,t)}catch(e){}return t}))}delete(e){return this._trans("readwrite",(t=>this.core.mutate({trans:t,type:"delete",keys:[e]}))).then((e=>e.numFailures?Oe.reject(e.failures[0]):void 0))}clear(){return this._trans("readwrite",(e=>this.core.mutate({trans:e,type:"deleteRange",range:at}))).then((e=>e.numFailures?Oe.reject(e.failures[0]):void 0))}bulkGet(e){return this._trans("readonly",(t=>this.core.getMany({keys:e,trans:t}).then((e=>e.map((e=>this.hook.reading.fire(e)))))))}bulkAdd(e,t,n){const r=Array.isArray(t)?t:void 0,s=(n=n||(r?void 0:t))?n.allKeys:void 0;return this._trans("readwrite",(t=>{const{auto:n,keyPath:i}=this.schema.primKey;if(i&&r)throw new W.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys");if(r&&r.length!==e.length)throw new W.InvalidArgument("Arguments objects and keys must have the same length");const o=e.length;let a=i&&n?e.map(ut(i)):e;return this.core.mutate({trans:t,type:"add",keys:r,values:a,wantResults:s}).then((({numFailures:e,results:t,lastResult:n,failures:r})=>{if(0===e)return s?t:n;throw new U(`${this.name}.bulkAdd(): ${e} of ${o} operations failed`,r)}))}))}bulkPut(e,t,n){const r=Array.isArray(t)?t:void 0,s=(n=n||(r?void 0:t))?n.allKeys:void 0;return this._trans("readwrite",(t=>{const{auto:n,keyPath:i}=this.schema.primKey;if(i&&r)throw new W.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys");if(r&&r.length!==e.length)throw new W.InvalidArgument("Arguments objects and keys must have the same length");const o=e.length;let a=i&&n?e.map(ut(i)):e;return this.core.mutate({trans:t,type:"put",keys:r,values:a,wantResults:s}).then((({numFailures:e,results:t,lastResult:n,failures:r})=>{if(0===e)return s?t:n;throw new U(`${this.name}.bulkPut(): ${e} of ${o} operations failed`,r)}))}))}bulkUpdate(e){const t=this.core,n=e.map((e=>e.key)),r=e.map((e=>e.changes)),s=[];return this._trans("readwrite",(i=>t.getMany({trans:i,keys:n,cache:"clone"}).then((o=>{const a=[],u=[];e.forEach((({key:e,changes:t},n)=>{const r=o[n];if(r){for(const n of Object.keys(t)){const s=t[n];if(n===this.schema.primKey.keyPath){if(0!==ct(s,e))throw new W.Constraint("Cannot update primary key in bulkUpdate()")}else v(r,n,s)}s.push(n),a.push(e),u.push(r)}}));const l=a.length;return t.mutate({trans:i,type:"put",keys:a,values:u,updates:{keys:n,changeSpecs:r}}).then((({numFailures:e,failures:t})=>{if(0===e)return l;for(const e of Object.keys(t)){const n=s[Number(e)];if(null!=n){const r=t[e];delete t[e],t[n]=r}}throw new U(`${this.name}.bulkUpdate(): ${e} of ${l} operations failed`,t)}))}))))}bulkDelete(e){const t=e.length;return this._trans("readwrite",(t=>this.core.mutate({trans:t,type:"delete",keys:e}))).then((({numFailures:e,lastResult:n,failures:r})=>{if(0===e)return n;throw new U(`${this.name}.bulkDelete(): ${e} of ${t} operations failed`,r)}))}}function pt(e){var r={},s=function(t,n){if(n){for(var s=arguments.length,i=new Array(s-1);--s;)i[s-1]=arguments[s];return r[t].subscribe.apply(null,i),e}if("string"==typeof t)return r[t]};s.addEventType=a;for(var i=1,o=arguments.length;iot(r(),t()):t,e.justLimit=n&&!r}function vt(e,t){if(e.isPrimKey)return t.primaryKey;const n=t.getIndexByKeyPath(e.index);if(!n)throw new W.Schema("KeyPath "+e.index+" on object store "+t.name+" is not indexed");return n}function wt(e,t,n){const r=vt(e,t.schema);return t.openCursor({trans:n,values:!e.keysOnly,reverse:"prev"===e.dir,unique:!!e.unique,query:{index:r,range:e.range}})}function _t(e,t,n,r){const s=e.replayFilter?ot(e.filter,e.replayFilter()):e.filter;if(e.or){const i={},a=(e,n,r)=>{if(!s||s(n,r,(e=>n.stop(e)),(e=>n.fail(e)))){var a=n.primaryKey,u=""+a;"[object ArrayBuffer]"===u&&(u=""+new Uint8Array(a)),o(i,u)||(i[u]=!0,t(e,n,r))}};return Promise.all([e.or._iterate(a,n),xt(wt(e,r,n),e.algorithm,a,!e.keysOnly&&e.valueMapper)])}return xt(wt(e,r,n),ot(e.algorithm,s),t,!e.keysOnly&&e.valueMapper)}function xt(e,t,n,r){var s=Re(r?(e,t,s)=>n(r(e),t,s):n);return e.then((e=>{if(e)return e.start((()=>{var n=()=>e.continue();t&&!t(e,(e=>n=e),(t=>{e.stop(t),n=Q}),(t=>{e.fail(t),n=Q}))||s(e.value,e,(e=>n=e)),n()}))}))}const kt=Symbol();class Ot{execute(e){if(void 0!==this.add){const t=this.add;if(n(t))return[...n(e)?e:[],...t].sort();if("number"==typeof t)return(Number(e)||0)+t;if("bigint"==typeof t)try{return BigInt(e)+t}catch{return BigInt(0)+t}throw new TypeError(`Invalid term ${t}`)}if(void 0!==this.remove){const t=this.remove;if(n(t))return n(e)?e.filter((e=>!t.includes(e))).sort():[];if("number"==typeof t)return Number(e)-t;if("bigint"==typeof t)try{return BigInt(e)-t}catch{return BigInt(0)-t}throw new TypeError(`Invalid subtrahend ${t}`)}const t=this.replacePrefix?.[0];return t&&"string"==typeof e&&e.startsWith(t)?this.replacePrefix[1]+e.substring(t.length):e}constructor(e){Object.assign(this,e)}}class Pt{_read(e,t){var n=this._ctx;return n.error?n.table._trans(null,tt.bind(null,n.error)):n.table._trans("readonly",e).then(t)}_write(e){var t=this._ctx;return t.error?t.table._trans(null,tt.bind(null,t.error)):t.table._trans("readwrite",e,"locked")}_addAlgorithm(e){var t=this._ctx;t.algorithm=ot(t.algorithm,e)}_iterate(e,t){return _t(this._ctx,e,t,this._ctx.table.core)}clone(e){var t=Object.create(this.constructor.prototype),n=Object.create(this._ctx);return e&&r(n,e),t._ctx=n,t}raw(){return this._ctx.valueMapper=null,this}each(e){var t=this._ctx;return this._read((n=>_t(t,e,n,t.table.core)))}count(e){return this._read((e=>{const t=this._ctx,n=t.table.core;if(mt(t,!0))return n.count({trans:e,query:{index:vt(t,n.schema),range:t.range}}).then((e=>Math.min(e,t.limit)));var r=0;return _t(t,(()=>(++r,!1)),e,n).then((()=>r))})).then(e)}sortBy(e,t){const n=e.split(".").reverse(),r=n[0],s=n.length-1;function i(e,t){return t?i(e[n[t]],t-1):e[r]}var o="next"===this._ctx.dir?1:-1;function a(e,t){var n=i(e,s),r=i(t,s);return nr?o:0}return this.toArray((function(e){return e.sort(a)})).then(t)}toArray(e){return this._read((e=>{var t=this._ctx;if("next"===t.dir&&mt(t,!0)&&t.limit>0){const{valueMapper:n}=t,r=vt(t,t.table.core.schema);return t.table.core.query({trans:e,limit:t.limit,values:!0,query:{index:r,range:t.range}}).then((({result:e})=>n?e.map(n):e))}{const n=[];return _t(t,(e=>n.push(e)),e,t.table.core).then((()=>n))}}),e)}offset(e){var t=this._ctx;return e<=0||(t.offset+=e,mt(t)?gt(t,(()=>{var t=e;return(e,n)=>0===t||(1===t?(--t,!1):(n((()=>{e.advance(t),t=0})),!1))})):gt(t,(()=>{var t=e;return()=>--t<0}))),this}limit(e){return this._ctx.limit=Math.min(this._ctx.limit,e),gt(this._ctx,(()=>{var t=e;return function(e,n,r){return--t<=0&&n(r),t>=0}}),!0),this}until(e,t){return bt(this._ctx,(function(n,r,s){return!e(n.value)||(r(s),t)})),this}first(e){return this.limit(1).toArray((function(e){return e[0]})).then(e)}last(e){return this.reverse().first(e)}filter(e){var t,n;return bt(this._ctx,(function(t){return e(t.value)})),t=this._ctx,n=e,t.isMatch=ot(t.isMatch,n),this}and(e){return this.filter(e)}or(e){return new this.db.WhereClause(this._ctx.table,e,this)}reverse(){return this._ctx.dir="prev"===this._ctx.dir?"next":"prev",this._ondirectionchange&&this._ondirectionchange(this._ctx.dir),this}desc(){return this.reverse()}eachKey(e){var t=this._ctx;return t.keysOnly=!t.isMatch,this.each((function(t,n){e(n.key,n)}))}eachUniqueKey(e){return this._ctx.unique="unique",this.eachKey(e)}eachPrimaryKey(e){var t=this._ctx;return t.keysOnly=!t.isMatch,this.each((function(t,n){e(n.primaryKey,n)}))}keys(e){var t=this._ctx;t.keysOnly=!t.isMatch;var n=[];return this.each((function(e,t){n.push(t.key)})).then((function(){return n})).then(e)}primaryKeys(e){var t=this._ctx;if("next"===t.dir&&mt(t,!0)&&t.limit>0)return this._read((e=>{var n=vt(t,t.table.core.schema);return t.table.core.query({trans:e,values:!1,limit:t.limit,query:{index:n,range:t.range}})})).then((({result:e})=>e)).then(e);t.keysOnly=!t.isMatch;var n=[];return this.each((function(e,t){n.push(t.primaryKey)})).then((function(){return n})).then(e)}uniqueKeys(e){return this._ctx.unique="unique",this.keys(e)}firstKey(e){return this.limit(1).keys((function(e){return e[0]})).then(e)}lastKey(e){return this.reverse().firstKey(e)}distinct(){var e=this._ctx,t=e.index&&e.table.schema.idxByName[e.index];if(!t||!t.multi)return this;var n={};return bt(this._ctx,(function(e){var t=e.primaryKey.toString(),r=o(n,t);return n[t]=!0,!r})),this}modify(e){var n=this._ctx;return this._write((r=>{var s;if("function"==typeof e)s=e;else{var i=t(e),o=i.length;s=function(t){let n=!1;for(let r=0;r{const{failures:r,numFailures:s}=n;d+=e-s;for(let e of t(r))h.push(r[e])};return this.clone().primaryKeys().then((t=>{const i=mt(n)&&n.limit===1/0&&("function"!=typeof e||e===Et)&&{index:n.index,range:n.range},o=n=>{const h=Math.min(c,t.length-n);return a.getMany({trans:r,keys:t.slice(n,n+h),cache:"immutable"}).then((d=>{const f=[],y=[],m=u?[]:null,b=[];for(let e=0;e0&&a.mutate({trans:r,type:"add",values:f}).then((e=>{for(let t in e.failures)b.splice(parseInt(t),1);p(f.length,e)}))).then((()=>(y.length>0||i&&"object"==typeof e)&&a.mutate({trans:r,type:"put",keys:m,values:y,criteria:i,changeSpec:"function"!=typeof e&&e,isAdditionalChunk:n>0}).then((e=>p(y.length,e))))).then((()=>(b.length>0||i&&e===Et)&&a.mutate({trans:r,type:"delete",keys:b,criteria:i,isAdditionalChunk:n>0}).then((e=>p(b.length,e))))).then((()=>t.length>n+h&&o(n+c)))}))};return o(0).then((()=>{if(h.length>0)throw new L("Error modifying one or more objects",h,d,f);return t.length}))}))}))}delete(){var e=this._ctx,t=e.range;return mt(e)&&(e.isPrimKey||3===t.type)?this._write((n=>{const{primaryKey:r}=e.table.core.schema,s=t;return e.table.core.count({trans:n,query:{index:r,range:s}}).then((t=>e.table.core.mutate({trans:n,type:"deleteRange",range:s}).then((({failures:e,lastResult:n,results:r,numFailures:s})=>{if(s)throw new L("Could not delete some values",Object.keys(e).map((t=>e[t])),t-s);return t-s}))))})):this.modify(Et)}}const Et=(e,t)=>t.value=null;function Kt(e,t){return et?-1:e===t?0:1}function Ct(e,t,n){var r=e instanceof It?new e.Collection(e):e;return r._ctx.error=n?new n(t):new TypeError(t),r}function At(e){return new e.Collection(e,(()=>Tt(""))).limit(0)}function jt(e,t,n,r,s,i){for(var o=Math.min(e.length,r.length),a=-1,u=0;u=0?e.substr(0,a)+t[a]+n.substr(a+1):null;s(e[u],l)<0&&(a=u)}return o"string"==typeof e)))return Ct(e,"String expected.");function d(e){s=function(e){return"next"===e?e=>e.toUpperCase():e=>e.toLowerCase()}(e),i=function(e){return"next"===e?e=>e.toLowerCase():e=>e.toUpperCase()}(e),o="next"===e?Kt:St;var t=n.map((function(e){return{lower:i(e),upper:s(e)}})).sort((function(e,t){return o(e.lower,t.lower)}));a=t.map((function(e){return e.upper})),u=t.map((function(e){return e.lower})),l=e,c="next"===e?"":r}d("next");var f=new e.Collection(e,(()=>qt(a[0],u[h-1]+r)));f._ondirectionchange=function(e){d(e)};var p=0;return f._addAlgorithm((function(e,n,r){var s=e.key;if("string"!=typeof s)return!1;var d=i(s);if(t(d,u,p))return!0;for(var f=null,y=p;y0)&&(f=m)}return n(null!==f?function(){e.continue(f+c)}:r),!1})),f}function qt(e,t,n,r){return{type:2,lower:e,upper:t,lowerOpen:n,upperOpen:r}}function Tt(e){return{type:1,lower:e,upper:e}}class It{get Collection(){return this._ctx.table.db.Collection}between(e,t,n,r){n=!1!==n,r=!0===r;try{return this._cmp(e,t)>0||0===this._cmp(e,t)&&(n||r)&&(!n||!r)?At(this):new this.Collection(this,(()=>qt(e,t,!n,!r)))}catch(e){return Ct(this,st)}}equals(e){return null==e?Ct(this,st):new this.Collection(this,(()=>Tt(e)))}above(e){return null==e?Ct(this,st):new this.Collection(this,(()=>qt(e,void 0,!0)))}aboveOrEqual(e){return null==e?Ct(this,st):new this.Collection(this,(()=>qt(e,void 0,!1)))}below(e){return null==e?Ct(this,st):new this.Collection(this,(()=>qt(void 0,e,!1,!0)))}belowOrEqual(e){return null==e?Ct(this,st):new this.Collection(this,(()=>qt(void 0,e)))}startsWith(e){return"string"!=typeof e?Ct(this,"String expected."):this.between(e,e+rt,!0,!0)}startsWithIgnoreCase(e){return""===e?this.startsWith(e):Dt(this,((e,t)=>0===e.indexOf(t[0])),[e],rt)}equalsIgnoreCase(e){return Dt(this,((e,t)=>e===t[0]),[e],"")}anyOfIgnoreCase(){var e=I.apply(T,arguments);return 0===e.length?At(this):Dt(this,((e,t)=>-1!==t.indexOf(e)),e,"")}startsWithAnyOfIgnoreCase(){var e=I.apply(T,arguments);return 0===e.length?At(this):Dt(this,((e,t)=>t.some((t=>0===e.indexOf(t)))),e,rt)}anyOf(){const e=I.apply(T,arguments);let t=this._cmp;try{e.sort(t)}catch(e){return Ct(this,st)}if(0===e.length)return At(this);const n=new this.Collection(this,(()=>qt(e[0],e[e.length-1])));n._ondirectionchange=n=>{t="next"===n?this._ascending:this._descending,e.sort(t)};let r=0;return n._addAlgorithm(((n,s,i)=>{const o=n.key;for(;t(o,e[r])>0;)if(++r,r===e.length)return s(i),!1;return 0===t(o,e[r])||(s((()=>{n.continue(e[r])})),!1)})),n}notEqual(e){return this.inAnyRange([[-(1/0),e],[e,this.db._maxKey]],{includeLowers:!1,includeUppers:!1})}noneOf(){const e=I.apply(T,arguments);if(0===e.length)return new this.Collection(this);try{e.sort(this._ascending)}catch(e){return Ct(this,st)}const t=e.reduce(((e,t)=>e?e.concat([[e[e.length-1][1],t]]):[[-(1/0),t]]),null);return t.push([e[e.length-1],this.db._maxKey]),this.inAnyRange(t,{includeLowers:!1,includeUppers:!1})}inAnyRange(e,t){const n=this._cmp,r=this._ascending,s=this._descending,i=this._min,o=this._max;if(0===e.length)return At(this);if(!e.every((e=>void 0!==e[0]&&void 0!==e[1]&&r(e[0],e[1])<=0)))return Ct(this,"First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower",W.InvalidArgument);const a=!t||!1!==t.includeLowers,u=t&&!0===t.includeUppers;let l,c=r;function h(e,t){return c(e[0],t[0])}try{l=e.reduce((function(e,t){let r=0,s=e.length;for(;r0){s[0]=i(s[0],t[0]),s[1]=o(s[1],t[1]);break}}return r===s&&e.push(t),e}),[]),l.sort(h)}catch(e){return Ct(this,st)}let d=0;const f=u?e=>r(e,l[d][1])>0:e=>r(e,l[d][1])>=0,p=a?e=>s(e,l[d][0])>0:e=>s(e,l[d][0])>=0;let y=f;const m=new this.Collection(this,(()=>qt(l[0][0],l[l.length-1][1],!a,!u)));return m._ondirectionchange=e=>{"next"===e?(y=f,c=r):(y=p,c=s),l.sort(h)},m._addAlgorithm(((e,t,n)=>{for(var s=e.key;y(s);)if(++d,d===l.length)return t(n),!1;return!!function(e){return!f(e)&&!p(e)}(s)||(0===this._cmp(s,l[d][1])||0===this._cmp(s,l[d][0])||t((()=>{c===r?e.continue(l[d][0]):e.continue(l[d][1])})),!1)})),m}startsWithAnyOf(){const e=I.apply(T,arguments);return e.every((e=>"string"==typeof e))?0===e.length?At(this):this.inAnyRange(e.map((e=>[e,e+rt]))):Ct(this,"startsWithAnyOf() only works with strings")}}function Bt(e){return Re((function(t){return Rt(t),e(t.target.error),!1}))}function Rt(e){e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault()}const $t=pt(null,"storagemutated");class Ft{_lock(){return m(!we.global),++this._reculock,1!==this._reculock||we.global||(we.lockOwnerFor=this),this}_unlock(){if(m(!we.global),0==--this._reculock)for(we.global||(we.lockOwnerFor=null);this._blockedFuncs.length>0&&!this._locked();){var e=this._blockedFuncs.shift();try{Je(e[1],e[0])}catch(e){}}return this}_locked(){return this._reculock&&we.lockOwnerFor!==this}create(e){if(!this.mode)return this;const t=this.db.idbdb,n=this.db._state.dbOpenError;if(m(!this.idbtrans),!e&&!t)switch(n&&n.name){case"DatabaseClosedError":throw new W.DatabaseClosed(n);case"MissingAPIError":throw new W.MissingAPI(n.message,n);default:throw new W.OpenFailed(n)}if(!this.active)throw new W.TransactionInactive;return m(null===this._completion._state),(e=this.idbtrans=e||(this.db.core?this.db.core.transaction(this.storeNames,this.mode,{durability:this.chromeTransactionDurability}):t.transaction(this.storeNames,this.mode,{durability:this.chromeTransactionDurability}))).onerror=Re((t=>{Rt(t),this._reject(e.error)})),e.onabort=Re((t=>{Rt(t),this.active&&this._reject(new W.Abort(e.error)),this.active=!1,this.on("abort").fire(t)})),e.oncomplete=Re((()=>{this.active=!1,this._resolve(),"mutatedParts"in e&&$t.storagemutated.fire(e.mutatedParts)})),this}_promise(e,t,n){if("readwrite"===e&&"readwrite"!==this.mode)return tt(new W.ReadOnly("Transaction is readonly"));if(!this.active)return tt(new W.TransactionInactive);if(this._locked())return new Oe(((r,s)=>{this._blockedFuncs.push([()=>{this._promise(e,t,n).then(r,s)},we])}));if(n)return Ve((()=>{var e=new Oe(((e,n)=>{this._lock();const r=t(e,n,this);r&&r.then&&r.then(e,n)}));return e.finally((()=>this._unlock())),e._lib=!0,e}));var r=new Oe(((e,n)=>{var r=t(e,n,this);r&&r.then&&r.then(e,n)}));return r._lib=!0,r}_root(){return this.parent?this.parent._root():this}waitFor(e){var t=this._root();const n=Oe.resolve(e);if(t._waitingFor)t._waitingFor=t._waitingFor.then((()=>n));else{t._waitingFor=n,t._waitingQueue=[];var r=t.idbtrans.objectStore(t.storeNames[0]);!function e(){for(++t._spinCount;t._waitingQueue.length;)t._waitingQueue.shift()();t._waitingFor&&(r.get(-1/0).onsuccess=e)}()}var s=t._waitingFor;return new Oe(((e,r)=>{n.then((n=>t._waitingQueue.push(Re(e.bind(null,n)))),(e=>t._waitingQueue.push(Re(r.bind(null,e))))).finally((()=>{t._waitingFor===s&&(t._waitingFor=null)}))}))}abort(){this.active&&(this.active=!1,this.idbtrans&&this.idbtrans.abort(),this._reject(new W.Abort))}table(e){const t=this._memoizedTables||(this._memoizedTables={});if(o(t,e))return t[e];const n=this.schema[e];if(!n)throw new W.NotFound("Table "+e+" not part of transaction");const r=new this.db.Table(e,n,this);return r.core=this.db.core.table(e),t[e]=r,r}}function Nt(e,t,n,r,s,i,o){return{name:e,keyPath:t,unique:n,multi:r,auto:s,compound:i,src:(n&&!o?"&":"")+(r?"*":"")+(s?"++":"")+Mt(t)}}function Mt(e){return"string"==typeof e?e:e?"["+[].join.call(e,"+")+"]":""}function Lt(e,t,n){return{name:e,primKey:t,indexes:n,mappedClass:null,idxByName:(r=n,s=e=>[e.name,e],r.reduce(((e,t,n)=>{var r=s(t,n);return r&&(e[r[0]]=r[1]),e}),{}))};var r,s}let Ut=e=>{try{return e.only([[]]),Ut=()=>[[]],[[]]}catch(e){return Ut=()=>rt,rt}};function Vt(e){return null==e?()=>{}:"string"==typeof e?function(e){return 1===e.split(".").length?t=>t[e]:t=>g(t,e)}(e):t=>g(t,e)}function zt(e){return[].slice.call(e)}let Wt=0;function Yt(e){return null==e?":id":"string"==typeof e?e:`[${e.join("+")}]`}function Gt(e,t,r){function s(e){if(3===e.type)return null;if(4===e.type)throw new Error("Cannot convert never type to IDBKeyRange");const{lower:n,upper:r,lowerOpen:s,upperOpen:i}=e;return void 0===n?void 0===r?null:t.upperBound(r,!!i):void 0===r?t.lowerBound(n,!!s):t.bound(n,r,!!s,!!i)}const{schema:i,hasGetAll:o}=function(e,t){const r=zt(e.objectStoreNames);return{schema:{name:e.name,tables:r.map((e=>t.objectStore(e))).map((e=>{const{keyPath:t,autoIncrement:r}=e,s=n(t),i=null==t,o={},a={name:e.name,primaryKey:{name:null,isPrimaryKey:!0,outbound:i,compound:s,keyPath:t,autoIncrement:r,unique:!0,extractKey:Vt(t)},indexes:zt(e.indexNames).map((t=>e.index(t))).map((e=>{const{name:t,unique:r,multiEntry:s,keyPath:i}=e,a={name:t,compound:n(i),keyPath:i,unique:r,multiEntry:s,extractKey:Vt(i)};return o[Yt(i)]=a,a})),getIndexByKeyPath:e=>o[Yt(e)]};return o[":id"]=a.primaryKey,null!=t&&(o[Yt(t)]=a.primaryKey),a}))},hasGetAll:r.length>0&&"getAll"in t.objectStore(r[0])&&!("undefined"!=typeof navigator&&/Safari/.test(navigator.userAgent)&&!/(Chrome\/|Edge\/)/.test(navigator.userAgent)&&[].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1]<604)}}(e,r),a=i.tables.map((e=>function(e){const t=e.name;return{name:t,schema:e,mutate:function({trans:e,type:n,keys:r,values:i,range:o}){return new Promise(((a,u)=>{a=Re(a);const l=e.objectStore(t),c=null==l.keyPath,h="put"===n||"add"===n;if(!h&&"delete"!==n&&"deleteRange"!==n)throw new Error("Invalid operation type: "+n);const{length:d}=r||i||{length:1};if(r&&i&&r.length!==i.length)throw new Error("Given keys array must have same length as given values array.");if(0===d)return a({numFailures:0,failures:{},results:[],lastResult:void 0});let f;const p=[],y=[];let m=0;const b=e=>{++m,Rt(e)};if("deleteRange"===n){if(4===o.type)return a({numFailures:m,failures:y,results:[],lastResult:void 0});3===o.type?p.push(f=l.clear()):p.push(f=l.delete(s(o)))}else{const[e,t]=h?c?[i,r]:[i,null]:[r,null];if(h)for(let r=0;r{const t=e.target.result;p.forEach(((e,t)=>null!=e.error&&(y[t]=e.error))),a({numFailures:m,failures:y,results:"delete"===n?r:p.map((e=>e.result)),lastResult:t})};f.onerror=e=>{b(e),g(e)},f.onsuccess=g}))},getMany:({trans:e,keys:n})=>new Promise(((r,s)=>{r=Re(r);const i=e.objectStore(t),o=n.length,a=new Array(o);let u,l=0,c=0;const h=e=>{const t=e.target;a[t._pos]=t.result,++c===l&&r(a)},d=Bt(s);for(let e=0;enew Promise(((r,s)=>{r=Re(r);const i=e.objectStore(t).get(n);i.onsuccess=e=>r(e.target.result),i.onerror=Bt(s)})),query:function(e){return n=>new Promise(((r,i)=>{r=Re(r);const{trans:o,values:a,limit:u,query:l}=n,c=u===1/0?void 0:u,{index:h,range:d}=l,f=o.objectStore(t),p=h.isPrimaryKey?f:f.index(h.name),y=s(d);if(0===u)return r({result:[]});if(e){const e=a?p.getAll(y,c):p.getAllKeys(y,c);e.onsuccess=e=>r({result:e.target.result}),e.onerror=Bt(i)}else{let e=0;const t=a||!("openKeyCursor"in p)?p.openCursor(y):p.openKeyCursor(y),n=[];t.onsuccess=s=>{const i=t.result;return i?(n.push(a?i.value:i.primaryKey),++e===u?r({result:n}):void i.continue()):r({result:n})},t.onerror=Bt(i)}}))}(o),openCursor:function({trans:e,values:n,query:r,reverse:i,unique:o}){return new Promise(((a,u)=>{a=Re(a);const{index:l,range:c}=r,h=e.objectStore(t),d=l.isPrimaryKey?h:h.index(l.name),f=i?o?"prevunique":"prev":o?"nextunique":"next",p=n||!("openKeyCursor"in d)?d.openCursor(s(c),f):d.openKeyCursor(s(c),f);p.onerror=Bt(u),p.onsuccess=Re((t=>{const n=p.result;if(!n)return void a(null);n.___id=++Wt,n.done=!1;const r=n.continue.bind(n);let s=n.continuePrimaryKey;s&&(s=s.bind(n));const i=n.advance.bind(n),o=()=>{throw new Error("Cursor not stopped")};n.trans=e,n.stop=n.continue=n.continuePrimaryKey=n.advance=()=>{throw new Error("Cursor not started")},n.fail=Re(u),n.next=function(){let e=1;return this.start((()=>e--?this.continue():this.stop())).then((()=>this))},n.start=e=>{const t=new Promise(((e,t)=>{e=Re(e),p.onerror=Bt(t),n.fail=t,n.stop=t=>{n.stop=n.continue=n.continuePrimaryKey=n.advance=o,e(t)}})),a=()=>{if(p.result)try{e()}catch(e){n.fail(e)}else n.done=!0,n.start=()=>{throw new Error("Cursor behind last entry")},n.stop()};return p.onsuccess=Re((e=>{p.onsuccess=a,a()})),n.continue=r,n.continuePrimaryKey=s,n.advance=i,a(),t},a(n)}),u)}))},count({query:e,trans:n}){const{index:r,range:i}=e;return new Promise(((e,o)=>{const a=n.objectStore(t),u=r.isPrimaryKey?a:a.index(r.name),l=s(i),c=l?u.count(l):u.count();c.onsuccess=Re((t=>e(t.target.result))),c.onerror=Bt(o)}))}}}(e))),u={};return a.forEach((e=>u[e.name]=e)),{stack:"dbcore",transaction:e.transaction.bind(e),table(e){if(!u[e])throw new Error(`Table '${e}' not found`);return u[e]},MIN_KEY:-1/0,MAX_KEY:Ut(t),schema:i}}function Qt(e,t){const n=t.db,r=function(e,t,{IDBKeyRange:n,indexedDB:r},s){const i=function(e,t){return t.reduce(((e,{create:t})=>({...e,...t(e)})),e)}(Gt(t,n,s),e.dbcore);return{dbcore:i}}(e._middlewares,n,e._deps,t);e.core=r.dbcore,e.tables.forEach((t=>{const n=t.name;e.core.schema.tables.some((e=>e.name===n))&&(t.core=e.core.table(n),e[n]instanceof e.Table&&(e[n].core=t.core))}))}function Xt(e,t,n,r){n.forEach((n=>{const s=r[n];t.forEach((t=>{const r=d(t,n);(!r||"value"in r&&void 0===r.value)&&(t===e.Transaction.prototype||t instanceof e.Transaction?l(t,n,{get(){return this.table(n)},set(e){u(this,n,{value:e,writable:!0,configurable:!0,enumerable:!0})}}):t[n]=new e.Table(n,s))}))}))}function Ht(e,t){t.forEach((t=>{for(let n in t)t[n]instanceof e.Table&&delete t[n]}))}function Jt(e,t){return e._cfg.version-t._cfg.version}function Zt(e,n,r,s){const i=e._dbSchema;r.objectStoreNames.contains("$meta")&&!i.$meta&&(i.$meta=Lt("$meta",an("")[0],[]),e._storeNames.push("$meta"));const o=e._createTransaction("readwrite",e._storeNames,i);o.create(r),o._completion.catch(s);const a=o._reject.bind(o),u=we.transless||we;Ve((()=>{if(we.trans=o,we.transless=u,0!==n)return Qt(e,r),function(e,t,n){return t.storeNames.includes("$meta")?t.table("$meta").get("version").then((e=>null!=e?e:n)):Oe.resolve(n)}(0,o,n).then((n=>function(e,n,r,s){const i=[],o=e._versions;let a=e._dbSchema=sn(e,e.idbdb,s);const u=o.filter((e=>e._cfg.version>=n));if(0===u.length)return Oe.resolve();function l(){return i.length?Oe.resolve(i.shift()(r.idbtrans)).then(l):Oe.resolve()}return u.forEach((o=>{i.push((()=>{const i=a,u=o._cfg.dbschema;on(e,i,s),on(e,u,s),a=e._dbSchema=u;const l=en(i,u);l.add.forEach((e=>{tn(s,e[0],e[1].primKey,e[1].indexes)})),l.change.forEach((e=>{if(e.recreate)throw new W.Upgrade("Not yet support for changing primary key");{const t=s.objectStore(e.name);e.add.forEach((e=>rn(t,e))),e.change.forEach((e=>{t.deleteIndex(e.name),rn(t,e)})),e.del.forEach((e=>t.deleteIndex(e)))}}));const c=o._cfg.contentUpgrade;if(c&&o._cfg.version>n){Qt(e,s),r._memoizedTables={};let n=w(u);l.del.forEach((e=>{n[e]=i[e]})),Ht(e,[e.Transaction.prototype]),Xt(e,[e.Transaction.prototype],t(n),n),r.schema=n;const o=B(c);let a;o&&ze();const h=Oe.follow((()=>{if(a=c(r),a&&o){var e=We.bind(null,null);a.then(e,e)}}));return a&&"function"==typeof a.then?Oe.resolve(a):h.then((()=>a))}})),i.push((t=>{!function(e,t){[].slice.call(t.db.objectStoreNames).forEach((n=>null==e[n]&&t.db.deleteObjectStore(n)))}(o._cfg.dbschema,t),Ht(e,[e.Transaction.prototype]),Xt(e,[e.Transaction.prototype],e._storeNames,e._dbSchema),r.schema=e._dbSchema})),i.push((t=>{e.idbdb.objectStoreNames.contains("$meta")&&(Math.ceil(e.idbdb.version/10)===o._cfg.version?(e.idbdb.deleteObjectStore("$meta"),delete e._dbSchema.$meta,e._storeNames=e._storeNames.filter((e=>"$meta"!==e))):t.objectStore("$meta").put(o._cfg.version,"version"))}))})),l().then((()=>{nn(a,s)}))}(e,n,o,r))).catch(a);t(i).forEach((e=>{tn(r,e,i[e].primKey,i[e].indexes)})),Qt(e,r),Oe.follow((()=>e.on.populate.fire(o))).catch(a)}))}function en(e,t){const n={del:[],add:[],change:[]};let r;for(r in e)t[r]||n.del.push(r);for(r in t){const s=e[r],i=t[r];if(s){const e={name:r,def:i,recreate:!1,del:[],add:[],change:[]};if(""+(s.primKey.keyPath||"")!=""+(i.primKey.keyPath||"")||s.primKey.auto!==i.primKey.auto)e.recreate=!0,n.change.push(e);else{const t=s.idxByName,r=i.idxByName;let o;for(o in t)r[o]||e.del.push(o);for(o in r){const n=t[o],s=r[o];n?n.src!==s.src&&e.change.push(s):e.add.push(s)}(e.del.length>0||e.add.length>0||e.change.length>0)&&n.change.push(e)}}else n.add.push([r,i])}return n}function tn(e,t,n,r){const s=e.db.createObjectStore(t,n.keyPath?{keyPath:n.keyPath,autoIncrement:n.auto}:{autoIncrement:n.auto});return r.forEach((e=>rn(s,e))),s}function nn(e,n){t(e).forEach((t=>{n.db.objectStoreNames.contains(t)||(se&&console.debug("Dexie: Creating missing table",t),tn(n,t,e[t].primKey,e[t].indexes))}))}function rn(e,t){e.createIndex(t.name,t.keyPath,{unique:t.unique,multiEntry:t.multi})}function sn(e,t,n){const r={};return p(t.objectStoreNames,0).forEach((e=>{const t=n.objectStore(e);let s=t.keyPath;const i=Nt(Mt(s),s||"",!0,!1,!!t.autoIncrement,s&&"string"!=typeof s,!0),o=[];for(let e=0;e{const r=(e=e.trim()).replace(/([&*]|\+\+)/g,""),s=/^\[/.test(r)?r.match(/^\[(.*)\]$/)[1].split("+"):r;return Nt(r,s||null,/\&/.test(e),/\*/.test(e),/\+\+/.test(e),n(s),0===t)}))}class un{_parseStoresSpec(e,n){t(e).forEach((t=>{if(null!==e[t]){var r=an(e[t]),s=r.shift();if(s.unique=!0,s.multi)throw new W.Schema("Primary key cannot be multi-valued");r.forEach((e=>{if(e.auto)throw new W.Schema("Only primary key can be marked as autoIncrement (++)");if(!e.keyPath)throw new W.Schema("Index must have a name and cannot be an empty string")})),n[t]=Lt(t,s,r)}}))}stores(e){const n=this.db;this._cfg.storesSource=this._cfg.storesSource?r(this._cfg.storesSource,e):e;const s=n._versions,i={};let o={};return s.forEach((e=>{r(i,e._cfg.storesSource),o=e._cfg.dbschema={},e._parseStoresSpec(i,o)})),n._dbSchema=o,Ht(n,[n._allTables,n,n.Transaction.prototype]),Xt(n,[n._allTables,n,n.Transaction.prototype,this._cfg.tables],t(o),o),n._storeNames=t(o),this}upgrade(e){return this._cfg.contentUpgrade=re(this._cfg.contentUpgrade||Q,e),this}}function ln(e,t){let n=e._dbNamesDB;return n||(n=e._dbNamesDB=new Hn("__dbnames",{addons:[],indexedDB:e,IDBKeyRange:t}),n.version(1).stores({dbnames:"name"})),n.table("dbnames")}function cn(e){return e&&"function"==typeof e.databases}function hn(e){return Ve((function(){return we.letThrough=!0,e()}))}function dn(){var e;return!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent)&&indexedDB.databases?new Promise((function(t){var n=function(){return indexedDB.databases().finally(t)};e=setInterval(n,100),n()})).finally((function(){return clearInterval(e)})):Promise.resolve()}function fn(e){return!("from"in e)}const pn=function(e,t){if(!this){const t=new pn;return e&&"d"in e&&r(t,e),t}r(this,arguments.length?{d:1,from:e,to:arguments.length>1?t:e}:{d:0})};function yn(e,t,n){const s=ct(t,n);if(isNaN(s))return;if(s>0)throw RangeError();if(fn(e))return r(e,{from:t,to:n,d:1});const i=e.l,o=e.r;if(ct(n,e.from)<0)return i?yn(i,t,n):e.l={from:t,to:n,d:1,l:null,r:null},vn(e);if(ct(t,e.to)>0)return o?yn(o,t,n):e.r={from:t,to:n,d:1,l:null,r:null},vn(e);ct(t,e.from)<0&&(e.from=t,e.l=null,e.d=o?o.d+1:1),ct(n,e.to)>0&&(e.to=n,e.r=null,e.d=e.l?e.l.d+1:1);const a=!e.r;i&&!e.l&&mn(e,i),o&&a&&mn(e,o)}function mn(e,t){fn(t)||function e(t,{from:n,to:r,l:s,r:i}){yn(t,n,r),s&&e(t,s),i&&e(t,i)}(e,t)}function bn(e,t){const n=gn(t);let r=n.next();if(r.done)return!1;let s=r.value;const i=gn(e);let o=i.next(s.from),a=o.value;for(;!r.done&&!o.done;){if(ct(a.from,s.to)<=0&&ct(a.to,s.from)>=0)return!0;ct(s.from,a.from)<0?s=(r=n.next(a.from)).value:a=(o=i.next(s.from)).value}return!1}function gn(e){let t=fn(e)?null:{s:0,n:e};return{next(e){const n=arguments.length>0;for(;t;)switch(t.s){case 0:if(t.s=1,n)for(;t.n.l&&ct(e,t.n.from)<0;)t={up:t,n:t.n.l,s:1};else for(;t.n.l;)t={up:t,n:t.n.l,s:1};case 1:if(t.s=2,!n||ct(e,t.n.to)<=0)return{value:t.n,done:!1};case 2:if(t.n.r){t.s=3,t={up:t,n:t.n.r,s:0};continue}case 3:t=t.up}return{done:!0}}}}function vn(e){const t=(e.r?.d||0)-(e.l?.d||0),n=t>1?"r":t<-1?"l":"";if(n){const t="r"===n?"l":"r",r={...e},s=e[n];e.from=s.from,e.to=s.to,e[n]=s[n],r[n]=s[t],e[t]=r,r.d=wn(r)}e.d=wn(e)}function wn({r:e,l:t}){return(e?t?Math.max(e.d,t.d):e.d:t?t.d:0)+1}function _n(e,n){return t(n).forEach((t=>{e[t]?mn(e[t],n[t]):e[t]=P(n[t])})),e}function xn(e,t){return e.all||t.all||Object.keys(e).some((n=>t[n]&&bn(t[n],e[n])))}a(pn.prototype,{add(e){return mn(this,e),this},addKey(e){return yn(this,e,e),this},addKeys(e){return e.forEach((e=>yn(this,e,e))),this},[j](){return gn(this)}});const kn={};let On={},Pn=!1;function En(e,t=!1){_n(On,e),Pn||(Pn=!0,setTimeout((()=>{Pn=!1;const e=On;On={},Kn(e,!1)}),0))}function Kn(e,t=!1){const n=new Set;if(e.all)for(const r of Object.values(kn))Sn(r,e,n,t);else for(const r in e){const s=/^idb\:\/\/(.*)\/(.*)\//.exec(r);if(s){const[,r,i]=s,o=kn[`idb://${r}/${i}`];o&&Sn(o,e,n,t)}}n.forEach((e=>e()))}function Sn(e,t,n,r){const s=[];for(const[i,o]of Object.entries(e.queries.query)){const e=[];for(const s of o)xn(t,s.obsSet)?s.subscribers.forEach((e=>n.add(e))):r&&e.push(s);r&&s.push([i,e])}if(r)for(const[t,n]of s)e.queries.query[t]=n}function Cn(e){const n=e._state,{indexedDB:r}=e._deps;if(n.isBeingOpened||e.idbdb)return n.dbReadyPromise.then((()=>n.dbOpenError?tt(n.dbOpenError):e));n.isBeingOpened=!0,n.dbOpenError=null,n.openComplete=!1;const s=n.openCanceller;let i=Math.round(10*e.verno),o=!1;function a(){if(n.openCanceller!==s)throw new W.DatabaseClosed("db.open() was cancelled")}let u=n.dbReadyResolve,l=null,c=!1;const h=()=>new Oe(((s,u)=>{if(a(),!r)throw new W.MissingAPI;const d=e.name,f=n.autoSchema||!i?r.open(d):r.open(d,i);if(!f)throw new W.MissingAPI;f.onerror=Bt(u),f.onblocked=Re(e._fireOnBlocked),f.onupgradeneeded=Re((t=>{if(l=f.transaction,n.autoSchema&&!e._options.allowEmptyDB){f.onerror=Rt,l.abort(),f.result.close();const e=r.deleteDatabase(d);e.onsuccess=e.onerror=Re((()=>{u(new W.NoSuchDatabase(`Database ${d} doesnt exist`))}))}else{l.onerror=Bt(u);const n=t.oldVersion>Math.pow(2,62)?0:t.oldVersion;c=n<1,e.idbdb=f.result,o&&function(e,t){nn(e._dbSchema,t),t.db.version%10!=0||t.objectStoreNames.contains("$meta")||t.db.createObjectStore("$meta").add(Math.ceil(t.db.version/10-1),"version");const n=sn(0,e.idbdb,t);on(e,e._dbSchema,t);const r=en(n,e._dbSchema);for(const e of r.change){if(e.change.length||e.recreate)return void console.warn(`Unable to patch indexes of table ${e.name} because it has changes on the type of index or primary key.`);const n=t.objectStore(e.name);e.add.forEach((t=>{se&&console.debug(`Dexie upgrade patch: Creating missing index ${e.name}.${t.src}`),rn(n,t)}))}}(e,l),Zt(e,n/10,l,u)}}),u),f.onsuccess=Re((()=>{l=null;const r=e.idbdb=f.result,a=p(r.objectStoreNames);if(a.length>0)try{const l=r.transaction(1===(u=a).length?u[0]:u,"readonly");if(n.autoSchema)!function(e,n,r){e.verno=n.version/10;const s=e._dbSchema=sn(0,n,r);e._storeNames=p(n.objectStoreNames,0),Xt(e,[e._allTables],t(s),s)}(e,r,l);else if(on(e,e._dbSchema,l),!function(e,t){const n=en(sn(0,e.idbdb,t),e._dbSchema);return!(n.add.length||n.change.some((e=>e.add.length||e.change.length)))}(e,l)&&!o)return console.warn("Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this."),r.close(),i=r.version+1,o=!0,s(h());Qt(e,l)}catch(e){}var u;it.push(e),r.onversionchange=Re((t=>{n.vcFired=!0,e.on("versionchange").fire(t)})),r.onclose=Re((t=>{e.on("close").fire(t)})),c&&function({indexedDB:e,IDBKeyRange:t},n){!cn(e)&&"__dbnames"!==n&&ln(e,t).put({name:n}).catch(Q)}(e._deps,d),s()}),u)})).catch((e=>{switch(e?.name){case"UnknownError":if(n.PR1398_maxLoop>0)return n.PR1398_maxLoop--,console.warn("Dexie: Workaround for Chrome UnknownError on open()"),h();break;case"VersionError":if(i>0)return i=0,h()}return Oe.reject(e)}));return Oe.race([s,("undefined"==typeof navigator?Oe.resolve():dn()).then(h)]).then((()=>(a(),n.onReadyBeingFired=[],Oe.resolve(hn((()=>e.on.ready.fire(e.vip)))).then((function t(){if(n.onReadyBeingFired.length>0){let r=n.onReadyBeingFired.reduce(re,Q);return n.onReadyBeingFired=[],Oe.resolve(hn((()=>r(e.vip)))).then(t)}}))))).finally((()=>{n.openCanceller===s&&(n.onReadyBeingFired=null,n.isBeingOpened=!1)})).catch((t=>{n.dbOpenError=t;try{l&&l.abort()}catch{}return s===n.openCanceller&&e._close(),tt(t)})).finally((()=>{n.openComplete=!0,u()})).then((()=>{if(c){const t={};e.tables.forEach((n=>{n.schema.indexes.forEach((r=>{r.name&&(t[`idb://${e.name}/${n.name}/${r.name}`]=new pn(-1/0,[[[]]]))})),t[`idb://${e.name}/${n.name}/`]=t[`idb://${e.name}/${n.name}/:dels`]=new pn(-1/0,[[[]]])})),$t("storagemutated").fire(t),Kn(t,!0)}return e}))}function An(e){var t=t=>e.next(t),r=i(t),s=i((t=>e.throw(t)));function i(e){return t=>{var i=e(t),o=i.value;return i.done?o:o&&"function"==typeof o.then?o.then(r,s):n(o)?Promise.all(o).then(r,s):r(o)}}return i(t)()}function jn(e,t,n){var r=arguments.length;if(r<2)throw new W.InvalidArgument("Too few arguments");for(var s=new Array(r-1);--r;)s[r-1]=arguments[r];n=s.pop();var i=x(s);return[e,i,n]}function Dn(e,t,n,r,s){return Oe.resolve().then((()=>{const i=we.transless||we,o=e._createTransaction(t,n,e._dbSchema,r);o.explicit=!0;const a={trans:o,transless:i};if(r)o.idbtrans=r.idbtrans;else try{o.create(),o.idbtrans._explicit=!0,e._state.PR1398_maxLoop=3}catch(r){return r.name===V.InvalidState&&e.isOpen()&&--e._state.PR1398_maxLoop>0?(console.warn("Dexie: Need to reopen db"),e.close({disableAutoOpen:!1}),e.open().then((()=>Dn(e,t,n,null,s)))):tt(r)}const u=B(s);let l;u&&ze();const c=Oe.follow((()=>{if(l=s.call(o,o),l)if(u){var e=We.bind(null,null);l.then(e,e)}else"function"==typeof l.next&&"function"==typeof l.throw&&(l=An(l))}),a);return(l&&"function"==typeof l.then?Oe.resolve(l).then((e=>o.active?e:tt(new W.PrematureCommit("Transaction committed too early. See http://bit.ly/2kdckMn")))):c.then((()=>l))).then((e=>(r&&o._resolve(),o._completion.then((()=>e))))).catch((e=>(o._reject(e),tt(e))))}))}function qn(e,t,r){const s=n(e)?e.slice():[e];for(let e=0;e0,c={...n,name:l?`${r}(virtual-from:${n.name})`:n.name,lowLevelIndex:n,isVirtual:l,keyTail:t,keyLength:u,extractKey:Vt(e),unique:!l&&n.unique};if(a.push(c),c.isPrimaryKey||i.push(c),u>1){o(2===u?e[0]:e.slice(0,u-1),t+1,n)}return a.sort(((e,t)=>e.keyTail-t.keyTail)),c}const a=o(r.primaryKey.keyPath,0,r.primaryKey);s[":id"]=[a];for(const e of r.indexes)o(e.keyPath,0,e);function u(t){const n=t.query.index;return n.isVirtual?{...t,query:{index:n.lowLevelIndex,range:(r=t.query.range,s=n.keyTail,{type:1===r.type?2:r.type,lower:qn(r.lower,r.lowerOpen?e.MAX_KEY:e.MIN_KEY,s),lowerOpen:!0,upper:qn(r.upper,r.upperOpen?e.MIN_KEY:e.MAX_KEY,s),upperOpen:!0})}}:t;var r,s}const l={...n,schema:{...r,primaryKey:a,indexes:i,getIndexByKeyPath:function(e){const t=s[Yt(e)];return t&&t[0]}},count:e=>n.count(u(e)),query:e=>n.query(u(e)),openCursor(t){const{keyTail:r,isVirtual:s,keyLength:i}=t.query.index;if(!s)return n.openCursor(t);return n.openCursor(u(t)).then((n=>n&&function(n){const s=Object.create(n,{continue:{value:function(s){null!=s?n.continue(qn(s,t.reverse?e.MAX_KEY:e.MIN_KEY,r)):t.unique?n.continue(n.key.slice(0,i).concat(t.reverse?e.MIN_KEY:e.MAX_KEY,r)):n.continue()}},continuePrimaryKey:{value(t,s){n.continuePrimaryKey(qn(t,e.MAX_KEY,r),s)}},primaryKey:{get:()=>n.primaryKey},key:{get(){const e=n.key;return 1===i?e[0]:e.slice(0,i)}},value:{get:()=>n.value}});return s}(n)))}};return l}}}};function In(e,n,r,s){return r=r||{},s=s||"",t(e).forEach((t=>{if(o(n,t)){var i=e[t],a=n[t];if("object"==typeof i&&"object"==typeof a&&i&&a){const e=A(i);e!==A(a)?r[s+t]=n[t]:"Object"===e?In(i,a,r,s+t+"."):i!==a&&(r[s+t]=n[t])}else i!==a&&(r[s+t]=n[t])}else r[s+t]=void 0})),t(n).forEach((t=>{o(e,t)||(r[s+t]=n[t])})),r}function Bn(e,t){return"delete"===t.type?t.keys:t.keys||t.values.map(e.extractKey)}const Rn={stack:"dbcore",name:"HooksMiddleware",level:2,create:e=>({...e,table(t){const n=e.table(t),{primaryKey:r}=n.schema,s={...n,mutate(e){const s=we.trans,{deleting:i,creating:a,updating:u}=s.table(t).hook;switch(e.type){case"add":if(a.fire===Q)break;return s._promise("readwrite",(()=>l(e)),!0);case"put":if(a.fire===Q&&u.fire===Q)break;return s._promise("readwrite",(()=>l(e)),!0);case"delete":if(i.fire===Q)break;return s._promise("readwrite",(()=>l(e)),!0);case"deleteRange":if(i.fire===Q)break;return s._promise("readwrite",(()=>function(e){return c(e.trans,e.range,1e4)}(e)),!0)}return n.mutate(e);function l(e){const t=we.trans,s=e.keys||Bn(r,e);if(!s)throw new Error("Keys missing");return"delete"!==(e="add"===e.type||"put"===e.type?{...e,keys:s}:{...e}).type&&(e.values=[...e.values]),e.keys&&(e.keys=[...e.keys]),function(e,t,n){return"add"===t.type?Promise.resolve([]):e.getMany({trans:t.trans,keys:n,cache:"immutable"})}(n,e,s).then((l=>{const c=s.map(((n,s)=>{const c=l[s],h={onerror:null,onsuccess:null};if("delete"===e.type)i.fire.call(h,n,c,t);else if("add"===e.type||void 0===c){const i=a.fire.call(h,n,e.values[s],t);null==n&&null!=i&&(n=i,e.keys[s]=n,r.outbound||v(e.values[s],r.keyPath,n))}else{const r=In(c,e.values[s]),i=u.fire.call(h,r,n,c,t);if(i){const t=e.values[s];Object.keys(i).forEach((e=>{o(t,e)?t[e]=i[e]:v(t,e,i[e])}))}}return h}));return n.mutate(e).then((({failures:t,results:n,numFailures:r,lastResult:i})=>{for(let r=0;r(c.forEach((t=>t.onerror&&t.onerror(e))),Promise.reject(e))))}))}function c(e,t,s){return n.query({trans:e,values:!1,query:{index:r,range:t},limit:s}).then((({result:n})=>l({type:"delete",keys:n,trans:e}).then((r=>r.numFailures>0?Promise.reject(r.failures[0]):n.length({table:t=>{const n=e.table(t);return{...n,getMany:e=>{if(!e.cache)return n.getMany(e);const t=$n(e.keys,e.trans._cache,"clone"===e.cache);return t?Oe.resolve(t):n.getMany(e).then((t=>(e.trans._cache={keys:e.keys,values:"clone"===e.cache?K(t):t},t)))},mutate:e=>("add"!==e.type&&(e.trans._cache=null),n.mutate(e))}}})};function Nn(e,t){return"readonly"===e.trans.mode&&!!e.subscr&&!e.trans.explicit&&"disabled"!==e.trans.db._options.cache&&!t.schema.primaryKey.outbound}function Mn(e,t){switch(e){case"query":return t.values&&!t.unique;case"get":case"getMany":case"count":case"openCursor":return!1}}const Ln={stack:"dbcore",level:0,name:"Observability",create:e=>{const r=e.schema.name,s=new pn(e.MIN_KEY,e.MAX_KEY);return{...e,transaction:(t,n,r)=>{if(we.subscr&&"readonly"!==n)throw new W.ReadOnly(`Readwrite transaction in liveQuery context. Querier source: ${we.querier}`);return e.transaction(t,n,r)},table:i=>{const o=e.table(i),{schema:a}=o,{primaryKey:u,indexes:l}=a,{extractKey:c,outbound:h}=u,d=u.autoIncrement&&l.filter((e=>e.compound&&e.keyPath.includes(u.keyPath))),f={...o,mutate:e=>{const t=e.trans,l=e.mutatedParts||(e.mutatedParts={}),c=e=>{const t=`idb://${r}/${i}/${e}`;return l[t]||(l[t]=new pn)},h=c(""),f=c(":dels"),{type:p}=e;let[y,m]="deleteRange"===e.type?[e.range]:"delete"===e.type?[e.keys]:e.values.length<50?[Bn(u,e).filter((e=>e)),e.values]:[];const b=e.trans._cache;if(n(y)){h.addKeys(y);const e="delete"===p||y.length===m.length?$n(y,b):null;e||f.addKeys(y),(e||m)&&function(e,t,r,s){function i(t){const i=e(t.name||"");function o(e){return null!=e?t.extractKey(e):null}const a=e=>t.multiEntry&&n(e)?e.forEach((e=>i.addKey(e))):i.addKey(e);(r||s).forEach(((e,t)=>{const n=r&&o(r[t]),i=s&&o(s[t]);0!==ct(n,i)&&(null!=n&&a(n),null!=i&&a(i))}))}t.indexes.forEach(i)}(c,a,e,m)}else if(y){const e={from:y.lower,to:y.upper};f.add(e),h.add(e)}else h.add(s),f.add(s),a.indexes.forEach((e=>c(e.name).add(s)));return o.mutate(e).then((n=>(!y||"add"!==e.type&&"put"!==e.type||(h.addKeys(n.results),d&&d.forEach((t=>{const r=e.values.map((e=>t.extractKey(e))),s=t.keyPath.findIndex((e=>e===u.keyPath));n.results.forEach((e=>r[s]=e)),c(t.name).addKeys(r)}))),t.mutatedParts=_n(t.mutatedParts||{},l),n)))}},p=({query:{index:t,range:n}})=>[t,new pn(n.lower??e.MIN_KEY,n.upper??e.MAX_KEY)],y={get:e=>[u,new pn(e.key)],getMany:e=>[u,(new pn).addKeys(e.keys)],count:p,query:p,openCursor:p};return t(y).forEach((e=>{f[e]=function(t){const{subscr:n}=we,a=!!n;let u=Nn(we,o)&&Mn(e,t);const l=u?t.obsSet={}:n;if(a){const n=e=>{const t=`idb://${r}/${i}/${e}`;return l[t]||(l[t]=new pn)},a=n(""),u=n(":dels"),[d,f]=y[e](t);if("query"===e&&d.isPrimaryKey&&!t.values?u.add(f):n(d.name||"").add(f),!d.isPrimaryKey){if("count"!==e){const n="query"===e&&h&&t.values&&o.query({...t,values:!1});return o[e].apply(this,arguments).then((r=>{if("query"===e){if(h&&t.values)return n.then((({result:e})=>(a.addKeys(e),r)));const e=t.values?r.result.map(c):r.result;t.values?a.addKeys(e):u.addKeys(e)}else if("openCursor"===e){const e=r,n=t.values;return e&&Object.create(e,{key:{get:()=>(u.addKey(e.primaryKey),e.key)},primaryKey:{get(){const t=e.primaryKey;return u.addKey(t),t}},value:{get:()=>(n&&a.addKey(e.primaryKey),e.value)}})}return r}))}u.add(s)}}return o[e].apply(this,arguments)}})),f}}}};function Un(e,t,r){if(0===r.numFailures)return t;if("deleteRange"===t.type)return null;const s=t.keys?t.keys.length:"values"in t&&t.values?t.values.length:1;if(r.numFailures===s)return null;const i={...t};return n(i.keys)&&(i.keys=i.keys.filter(((e,t)=>!(t in r.failures)))),"values"in i&&n(i.values)&&(i.values=i.values.filter(((e,t)=>!(t in r.failures)))),i}function Vn(e,t){return function(e,t){return void 0===t.lower||(t.lowerOpen?ct(e,t.lower)>0:ct(e,t.lower)>=0)}(e,t)&&function(e,t){return void 0===t.upper||(t.upperOpen?ct(e,t.upper)<0:ct(e,t.upper)<=0)}(e,t)}function zn(e,t,r,s,i,o){if(!r||0===r.length)return e;const a=t.query.index,{multiEntry:u}=a,l=t.query.range,c=s.schema.primaryKey.extractKey,h=a.extractKey,d=(a.lowLevelIndex||a).extractKey;let f=r.reduce(((e,r)=>{let s=e;const i="add"===r.type||"put"===r.type?r.values.filter((e=>{const t=h(e);return u&&n(t)?t.some((e=>Vn(e,l))):Vn(t,l)})).map((e=>(e=K(e),o&&Object.freeze(e),e))):[];switch(r.type){case"add":s=e.concat(t.values?i:i.map((e=>c(e))));break;case"put":const n=(new pn).addKeys(r.values.map((e=>c(e))));s=e.filter((e=>{const r=t.values?c(e):e;return!bn(new pn(r),n)})).concat(t.values?i:i.map((e=>c(e))));break;case"delete":const o=(new pn).addKeys(r.keys);s=e.filter((e=>{const n=t.values?c(e):e;return!bn(new pn(n),o)}));break;case"deleteRange":const a=r.range;s=e.filter((e=>!Vn(c(e),a)))}return s}),e);return f===e?e:(f.sort(((e,t)=>ct(d(e),d(t))||ct(c(e),c(t)))),t.limit&&t.limit<1/0&&(f.length>t.limit?f.length=t.limit:e.length===t.limit&&f.length=0}function Gn(e,t,n,r){e.subscribers.add(n),r.addEventListener("abort",(()=>{e.subscribers.delete(n),0===e.subscribers.size&&function(e,t){setTimeout((()=>{0===e.subscribers.size&&q(t,e)}),3e3)}(e,t)}))}const Qn={stack:"dbcore",level:0,name:"Cache",create:e=>{const t=e.schema.name,n={...e,transaction:(n,r,s)=>{const i=e.transaction(n,r,s);if("readwrite"===r){const s=new AbortController,{signal:o}=s,a=o=>()=>{if(s.abort(),"readwrite"===r){const r=new Set;for(const s of n){const n=kn[`idb://${t}/${s}`];if(n){const t=e.table(s),a=n.optimisticOps.filter((e=>e.trans===i));if(i._explicit&&o&&i.mutatedParts)for(const e of Object.values(n.queries.query))for(const t of e.slice())xn(t.obsSet,i.mutatedParts)&&(q(e,t),t.subscribers.forEach((e=>r.add(e))));else if(a.length>0){n.optimisticOps=n.optimisticOps.filter((e=>e.trans!==i));for(const e of Object.values(n.queries.query))for(const n of e.slice())if(null!=n.res&&i.mutatedParts)if(o&&!n.dirty){const s=Object.isFrozen(n.res),i=zn(n.res,n.req,a,t,n,s);n.dirty?(q(e,n),n.subscribers.forEach((e=>r.add(e)))):i!==n.res&&(n.res=i,n.promise=Oe.resolve({result:i}))}else n.dirty&&q(e,n),n.subscribers.forEach((e=>r.add(e)))}}}r.forEach((e=>e()))}};i.addEventListener("abort",a(!1),{signal:o}),i.addEventListener("error",a(!1),{signal:o}),i.addEventListener("complete",a(!0),{signal:o})}return i},table(n){const r=e.table(n),s=r.schema.primaryKey,i={...r,mutate(e){const i=we.trans;if(s.outbound||"disabled"===i.db._options.cache||i.explicit)return r.mutate(e);const o=kn[`idb://${t}/${n}`];if(!o)return r.mutate(e);const a=r.mutate(e);return"add"!==e.type&&"put"!==e.type||!(e.values.length>=50||Bn(s,e).some((e=>null==e)))?(o.optimisticOps.push(e),e.mutatedParts&&En(e.mutatedParts),a.then((t=>{if(t.numFailures>0){q(o.optimisticOps,e);const n=Un(0,e,t);n&&o.optimisticOps.push(n),e.mutatedParts&&En(e.mutatedParts)}})),a.catch((()=>{q(o.optimisticOps,e),e.mutatedParts&&En(e.mutatedParts)}))):a.then((t=>{const n=Un(0,{...e,values:e.values.map(((e,n)=>{const r=s.keyPath?.includes(".")?K(e):{...e};return v(r,s.keyPath,t.results[n]),r}))},t);o.optimisticOps.push(n),queueMicrotask((()=>e.mutatedParts&&En(e.mutatedParts)))})),a},query(e){if(!Nn(we,r)||!Mn("query",e))return r.query(e);const s="immutable"===we.trans?.db._options.cache,{requery:i,signal:o}=we;let[a,u,l,c]=function(e,t,n,r){const s=kn[`idb://${e}/${t}`];if(!s)return[];const i=s.queries[n];if(!i)return[null,!1,s,null];const o=i[(r.query?r.query.index.name:null)||""];if(!o)return[null,!1,s,null];switch(n){case"query":const e=o.find((e=>e.req.limit===r.limit&&e.req.values===r.values&&Wn(e.req.query.range,r.query.range)));return e?[e,!0,s,o]:[o.find((e=>("limit"in e.req?e.req.limit:1/0)>=r.limit&&(!r.values||e.req.values)&&Yn(e.req.query.range,r.query.range))),!1,s,o];case"count":const t=o.find((e=>Wn(e.req.query.range,r.query.range)));return[t,!!t,s,o]}}(t,n,"query",e);if(a&&u)a.obsSet=e.obsSet;else{const i=r.query(e).then((e=>{const t=e.result;if(a&&(a.res=t),s){for(let e=0,n=t.length;e(c&&a&&q(c,a),Promise.reject(e))));a={obsSet:e.obsSet,promise:i,subscribers:new Set,type:"query",req:e,dirty:!1},c?c.push(a):(c=[a],l||(l=kn[`idb://${t}/${n}`]={queries:{query:{},count:{}},objs:new Map,optimisticOps:[],unsignaledParts:{}}),l.queries.query[e.query.index.name||""]=c)}return Gn(a,c,i,o),a.promise.then((t=>({result:zn(t.result,e,l?.optimisticOps,r,a,s)})))}};return i}};return n}};function Xn(e,t){return new Proxy(e,{get:(e,n,r)=>"db"===n?t:Reflect.get(e,n,r)})}class Hn{constructor(e,t){this._middlewares={},this.verno=0;const n=Hn.dependencies;this._options=t={addons:Hn.addons,autoOpen:!0,indexedDB:n.indexedDB,IDBKeyRange:n.IDBKeyRange,cache:"cloned",...t},this._deps={indexedDB:t.indexedDB,IDBKeyRange:t.IDBKeyRange};const{addons:r}=t;this._dbSchema={},this._versions=[],this._storeNames=[],this._allTables={},this.idbdb=null,this._novip=this;const s={dbOpenError:null,isBeingOpened:!1,onReadyBeingFired:null,openComplete:!1,dbReadyResolve:Q,dbReadyPromise:null,cancelOpen:Q,openCanceller:null,autoSchema:!0,PR1398_maxLoop:3,autoOpen:t.autoOpen};var i;s.dbReadyPromise=new Oe((e=>{s.dbReadyResolve=e})),s.openCanceller=new Oe(((e,t)=>{s.cancelOpen=t})),this._state=s,this.name=e,this.on=pt(this,"populate","blocked","versionchange","close",{ready:[re,Q]}),this.on.ready.subscribe=y(this.on.ready.subscribe,(e=>(t,n)=>{Hn.vip((()=>{const r=this._state;if(r.openComplete)r.dbOpenError||Oe.resolve().then(t),n&&e(t);else if(r.onReadyBeingFired)r.onReadyBeingFired.push(t),n&&e(t);else{e(t);const r=this;n||e((function e(){r.on.ready.unsubscribe(t),r.on.ready.unsubscribe(e)}))}}))})),this.Collection=(i=this,yt(Pt.prototype,(function(e,t){this.db=i;let n=at,r=null;if(t)try{n=t()}catch(e){r=e}const s=e._ctx,o=s.table,a=o.hook.reading.fire;this._ctx={table:o,index:s.index,isPrimKey:!s.index||o.schema.primKey.keyPath&&s.index===o.schema.primKey.name,range:n,keysOnly:!1,dir:"next",unique:"",algorithm:null,filter:null,replayFilter:null,justLimit:!0,isMatch:null,offset:0,limit:1/0,error:r,or:s.or,valueMapper:a!==X?a:null}}))),this.Table=function(e){return yt(ft.prototype,(function(t,n,r){this.db=e,this._tx=r,this.name=t,this.schema=n,this.hook=e._allTables[t]?e._allTables[t].hook:pt(null,{creating:[Z,Q],reading:[H,X],updating:[te,Q],deleting:[ee,Q]})}))}(this),this.Transaction=function(e){return yt(Ft.prototype,(function(t,n,r,s,i){this.db=e,this.mode=t,this.storeNames=n,this.schema=r,this.chromeTransactionDurability=s,this.idbtrans=null,this.on=pt(this,"complete","error","abort"),this.parent=i||null,this.active=!0,this._reculock=0,this._blockedFuncs=[],this._resolve=null,this._reject=null,this._waitingFor=null,this._waitingQueue=null,this._spinCount=0,this._completion=new Oe(((e,t)=>{this._resolve=e,this._reject=t})),this._completion.then((()=>{this.active=!1,this.on.complete.fire()}),(e=>{var t=this.active;return this.active=!1,this.on.error.fire(e),this.parent?this.parent._reject(e):t&&this.idbtrans&&this.idbtrans.abort(),tt(e)}))}))}(this),this.Version=function(e){return yt(un.prototype,(function(t){this.db=e,this._cfg={version:t,storesSource:null,dbschema:{},tables:{},contentUpgrade:null}}))}(this),this.WhereClause=function(e){return yt(It.prototype,(function(t,n,r){if(this.db=e,this._ctx={table:t,index:":id"===n?null:n,or:r},this._cmp=this._ascending=ct,this._descending=(e,t)=>ct(t,e),this._max=(e,t)=>ct(e,t)>0?e:t,this._min=(e,t)=>ct(e,t)<0?e:t,this._IDBKeyRange=e._deps.IDBKeyRange,!this._IDBKeyRange)throw new W.MissingAPI}))}(this),this.on("versionchange",(e=>{e.newVersion>0?console.warn(`Another connection wants to upgrade database '${this.name}'. Closing db now to resume the upgrade.`):console.warn(`Another connection wants to delete database '${this.name}'. Closing db now to resume the delete request.`),this.close({disableAutoOpen:!1})})),this.on("blocked",(e=>{!e.newVersion||e.newVersionnew this.Transaction(e,t,n,this._options.chromeTransactionDurability,r),this._fireOnBlocked=e=>{this.on("blocked").fire(e),it.filter((e=>e.name===this.name&&e!==this&&!e._state.vcFired)).map((t=>t.on("versionchange").fire(e)))},this.use(Fn),this.use(Qn),this.use(Ln),this.use(Tn),this.use(Rn);const o=new Proxy(this,{get:(e,t,n)=>{if("_vip"===t)return!0;if("table"===t)return e=>Xn(this.table(e),o);const r=Reflect.get(e,t,n);return r instanceof ft?Xn(r,o):"tables"===t?r.map((e=>Xn(e,o))):"_createTransaction"===t?function(){const e=r.apply(this,arguments);return Xn(e,o)}:r}});this.vip=o,r.forEach((e=>e(this)))}version(e){if(isNaN(e)||e<.1)throw new W.Type("Given version is not a positive number");if(e=Math.round(10*e)/10,this.idbdb||this._state.isBeingOpened)throw new W.Schema("Cannot add version when database is open");this.verno=Math.max(this.verno,e);const t=this._versions;var n=t.filter((t=>t._cfg.version===e))[0];return n||(n=new this.Version(e),t.push(n),t.sort(Jt),n.stores({}),this._state.autoSchema=!1,n)}_whenReady(e){return this.idbdb&&(this._state.openComplete||we.letThrough||this._vip)?e():new Oe(((e,t)=>{if(this._state.openComplete)return t(new W.DatabaseClosed(this._state.dbOpenError));if(!this._state.isBeingOpened){if(!this._state.autoOpen)return void t(new W.DatabaseClosed);this.open().catch(Q)}this._state.dbReadyPromise.then(e,t)})).then(e)}use({stack:e,create:t,level:n,name:r}){r&&this.unuse({stack:e,name:r});const s=this._middlewares[e]||(this._middlewares[e]=[]);return s.push({stack:e,create:t,level:null==n?10:n,name:r}),s.sort(((e,t)=>e.level-t.level)),this}unuse({stack:e,name:t,create:n}){return e&&this._middlewares[e]&&(this._middlewares[e]=this._middlewares[e].filter((e=>n?e.create!==n:!!t&&e.name!==t))),this}open(){return Je(ve,(()=>Cn(this)))}_close(){const e=this._state,t=it.indexOf(this);if(t>=0&&it.splice(t,1),this.idbdb){try{this.idbdb.close()}catch(e){}this.idbdb=null}e.isBeingOpened||(e.dbReadyPromise=new Oe((t=>{e.dbReadyResolve=t})),e.openCanceller=new Oe(((t,n)=>{e.cancelOpen=n})))}close({disableAutoOpen:e}={disableAutoOpen:!0}){const t=this._state;e?(t.isBeingOpened&&t.cancelOpen(new W.DatabaseClosed),this._close(),t.autoOpen=!1,t.dbOpenError=new W.DatabaseClosed):(this._close(),t.autoOpen=this._options.autoOpen||t.isBeingOpened,t.openComplete=!1,t.dbOpenError=null)}delete(e={disableAutoOpen:!0}){const t=arguments.length>0&&"object"!=typeof arguments[0],n=this._state;return new Oe(((r,s)=>{const i=()=>{this.close(e);var t=this._deps.indexedDB.deleteDatabase(this.name);t.onsuccess=Re((()=>{!function({indexedDB:e,IDBKeyRange:t},n){!cn(e)&&"__dbnames"!==n&&ln(e,t).delete(n).catch(Q)}(this._deps,this.name),r()})),t.onerror=Bt(s),t.onblocked=this._fireOnBlocked};if(t)throw new W.InvalidArgument("Invalid closeOptions argument to db.delete()");n.isBeingOpened?n.dbReadyPromise.then(i):i()}))}backendDB(){return this.idbdb}isOpen(){return null!==this.idbdb}hasBeenClosed(){const e=this._state.dbOpenError;return e&&"DatabaseClosed"===e.name}hasFailed(){return null!==this._state.dbOpenError}dynamicallyOpened(){return this._state.autoSchema}get tables(){return t(this._allTables).map((e=>this._allTables[e]))}transaction(){const e=jn.apply(this,arguments);return this._transaction.apply(this,e)}_transaction(e,t,n){let r=we.trans;r&&r.db===this&&-1===e.indexOf("!")||(r=null);const s=-1!==e.indexOf("?");let i,o;e=e.replace("!","").replace("?","");try{if(o=t.map((e=>{var t=e instanceof this.Table?e.name:e;if("string"!=typeof t)throw new TypeError("Invalid table argument to Dexie.transaction(). Only Table or String are allowed");return t})),"r"==e||"readonly"===e)i="readonly";else{if("rw"!=e&&"readwrite"!=e)throw new W.InvalidArgument("Invalid transaction mode: "+e);i="readwrite"}if(r){if("readonly"===r.mode&&"readwrite"===i){if(!s)throw new W.SubTransaction("Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY");r=null}r&&o.forEach((e=>{if(r&&-1===r.storeNames.indexOf(e)){if(!s)throw new W.SubTransaction("Table "+e+" not included in parent transaction.");r=null}})),s&&r&&!r.active&&(r=null)}}catch(e){return r?r._promise(null,((t,n)=>{n(e)})):tt(e)}const a=Dn.bind(null,this,i,o,r,n);return r?r._promise(i,a,"lock"):we.trans?Je(we.transless,(()=>this._whenReady(a))):this._whenReady(a)}table(e){if(!o(this._allTables,e))throw new W.InvalidTable(`Table ${e} does not exist`);return this._allTables[e]}}const Jn="undefined"!=typeof Symbol&&"observable"in Symbol?Symbol.observable:"@@observable";class Zn{constructor(e){this._subscribe=e}subscribe(e,t,n){return this._subscribe(e&&"function"!=typeof e?e:{next:e,error:t,complete:n})}[Jn](){return this}}let er;try{er={indexedDB:e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB,IDBKeyRange:e.IDBKeyRange||e.webkitIDBKeyRange}}catch(e){er={indexedDB:null,IDBKeyRange:null}}function tr(e){let t,n=!1;const r=new Zn((r=>{const s=B(e);let i,a=!1,u={},l={};const c={get closed(){return a},unsubscribe:()=>{a||(a=!0,i&&i.abort(),h&&$t.storagemutated.unsubscribe(f))}};r.start&&r.start(c);let h=!1;const d=()=>et(p);const f=e=>{_n(u,e),xn(l,u)&&d()},p=()=>{if(a||!er.indexedDB)return;u={};const c={};i&&i.abort(),i=new AbortController;const p={subscr:c,signal:i.signal,requery:d,querier:e,trans:null},y=function(t){const n=qe();try{s&&ze();let r=Ve(e,t);return s&&(r=r.finally(We)),r}finally{n&&Te()}}(p);Promise.resolve(y).then((e=>{n=!0,t=e,a||p.signal.aborted||(u={},l=c,function(e){for(const t in e)if(o(e,t))return!1;return!0}(l)||h||($t("storagemutated",f),h=!0),et((()=>!a&&r.next&&r.next(e))))}),(e=>{n=!1,["DatabaseClosedError","AbortError"].includes(e?.name)||a||et((()=>{a||r.error&&r.error(e)}))}))};return setTimeout(d,0),c}));return r.hasValue=()=>n,r.getValue=()=>t,r}const nr=Hn;function rr(e){let t=ir;try{ir=!0,$t.storagemutated.fire(e),Kn(e,!0)}finally{ir=t}}a(nr,{...G,delete:e=>new nr(e,{addons:[]}).delete(),exists:e=>new nr(e,{addons:[]}).open().then((e=>(e.close(),!0))).catch("NoSuchDatabaseError",(()=>!1)),getDatabaseNames(e){try{return function({indexedDB:e,IDBKeyRange:t}){return cn(e)?Promise.resolve(e.databases()).then((e=>e.map((e=>e.name)).filter((e=>"__dbnames"!==e)))):ln(e,t).toCollection().primaryKeys()}(nr.dependencies).then(e)}catch{return tt(new W.MissingAPI)}},defineClass:()=>function(e){r(this,e)},ignoreTransaction:e=>we.trans?Je(we.transless,e):e(),vip:hn,async:function(e){return function(){try{var t=An(e.apply(this,arguments));return t&&"function"==typeof t.then?t:Oe.resolve(t)}catch(e){return tt(e)}}},spawn:function(e,t,n){try{var r=An(e.apply(n,t||[]));return r&&"function"==typeof r.then?r:Oe.resolve(r)}catch(e){return tt(e)}},currentTransaction:{get:()=>we.trans||null},waitFor:function(e,t){const n=Oe.resolve("function"==typeof e?nr.ignoreTransaction(e):e).timeout(t||6e4);return we.trans?we.trans.waitFor(n):n},Promise:Oe,debug:{get:()=>se,set:e=>{ie(e)}},derive:c,extend:r,props:a,override:y,Events:pt,on:$t,liveQuery:tr,extendObservabilitySet:_n,getByKeyPath:g,setByKeyPath:v,delByKeyPath:function(e,t){"string"==typeof t?v(e,t,void 0):"length"in t&&[].map.call(t,(function(t){v(e,t,void 0)}))},shallowClone:w,deepClone:K,getObjectDiff:In,cmp:ct,asap:b,minKey:-(1/0),addons:[],connections:it,errnames:V,dependencies:er,cache:kn,semVer:"4.0.7",version:"4.0.7".split(".").map((e=>parseInt(e))).reduce(((e,t,n)=>e+t/Math.pow(10,2*n)))}),nr.maxKey=Ut(nr.dependencies.IDBKeyRange),"undefined"!=typeof dispatchEvent&&"undefined"!=typeof addEventListener&&($t("storagemutated",(e=>{if(!ir){let t;t=new CustomEvent("x-storagemutated-1",{detail:e}),ir=!0,dispatchEvent(t),ir=!1}})),addEventListener("x-storagemutated-1",(({detail:e})=>{ir||rr(e)})));let sr,ir=!1,or=()=>{};function ar(e){return new Ot({add:e})}function ur(e){return new Ot({remove:e})}function lr(e,t){return new Ot({replacePrefix:[e,t]})}"undefined"!=typeof BroadcastChannel&&(or=()=>{sr=new BroadcastChannel("x-storagemutated-1"),sr.onmessage=e=>e.data&&rr(e.data)},or(),"function"==typeof sr.unref&&sr.unref(),$t("storagemutated",(e=>{ir||sr.postMessage(e)}))),"undefined"!=typeof addEventListener&&(addEventListener("pagehide",(e=>{if(!Hn.disableBfCache&&e.persisted){se&&console.debug("Dexie: handling persisted pagehide"),sr?.close();for(const e of it)e.close({disableAutoOpen:!1})}})),addEventListener("pageshow",(e=>{!Hn.disableBfCache&&e.persisted&&(se&&console.debug("Dexie: handling persisted pageshow"),or(),rr({all:new pn(-1/0,[[]])}))}))),Oe.rejectionMapper=function(e,t){if(!e||e instanceof N||e instanceof TypeError||e instanceof SyntaxError||!e.name||!Y[e.name])return e;var n=new Y[e.name](t||e.message,e);return"stack"in e&&l(n,"stack",{get:function(){return this.inner.stack}}),n},ie(se);export{Hn as Dexie,lt as Entity,kt as PropModSymbol,Ot as PropModification,pn as RangeSet,ar as add,ct as cmp,Hn as default,tr as liveQuery,mn as mergeRanges,bn as rangesOverlap,ur as remove,lr as replacePrefix}; -//# sourceMappingURL=dexie.min.mjs.map \ No newline at end of file diff --git a/src/dexie/dist/modern/dexie.min.mjs.map b/src/dexie/dist/modern/dexie.min.mjs.map deleted file mode 100644 index 04601b62e..000000000 --- a/src/dexie/dist/modern/dexie.min.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["dexie.mjs"],"names":["_global","globalThis","self","window","global","keys","Object","isArray","Array","extend","obj","extension","forEach","key","Promise","getProto","getPrototypeOf","_hasOwn","hasOwnProperty","hasOwn","prop","call","props","proto","Reflect","ownKeys","setProp","defineProperty","functionOrGetSet","options","get","set","configurable","value","writable","derive","Child","from","Parent","prototype","create","bind","getOwnPropertyDescriptor","getPropertyDescriptor","_slice","slice","args","start","end","override","origFunc","overridedFactory","assert","b","Error","asap$1","fn","setImmediate","setTimeout","getByKeyPath","keyPath","rv","i","l","length","val","push","period","indexOf","innerObj","substr","undefined","setByKeyPath","isFrozen","currentKeyPath","remainingKeyPath","isNaN","parseInt","splice","shallowClone","m","concat","flatten","a","apply","intrinsicTypeNames","split","map","num","t","filter","intrinsicTypes","Set","cloneSimpleObjectTree","o","k","v","has","constructor","circularRefs","deepClone","any","WeakMap","innerDeepClone","x","toString","toStringTag","iteratorSymbol","Symbol","iterator","getIteratorOf","delArrayItem","NO_CHAR_ARRAY","getArrayOf","arrayLike","it","arguments","this","next","done","isAsyncFunction","idbDomErrorNames","errorList","defaultTexts","VersionChanged","DatabaseClosed","Abort","TransactionInactive","MissingAPI","DexieError","name","msg","message","getMultiErrorMessage","failures","s","join","ModifyError","successCount","failedKeys","BulkError","pos","failuresByPos","errnames","reduce","BaseException","exceptions","fullName","msgOrInner","inner","Syntax","SyntaxError","Type","TypeError","Range","RangeError","exceptionMap","fullNameExceptions","nop","mirror","pureFunctionChain","f1","f2","callBoth","on1","on2","hookCreatingChain","res","onsuccess","onerror","res2","hookDeletingChain","hookUpdatingChain","modifications","reverseStoppableEventChain","promisableChain","then","thiz","debug","location","test","href","setDebug","INTERNAL","resolvedNativePromise","nativePromiseProto","resolvedGlobalPromise","globalP","resolve","crypto","subtle","nativeP","digest","Uint8Array","nativePromiseThen","NativePromise","patchGlobalPromise","asap","callback","microtickQueue","needsNewPhysicalTick","queueMicrotask","physicalTick","isOutsideMicroTick","unhandledErrors","rejectingErrors","rejectionMapper","globalPSD","id","ref","unhandleds","onunhandled","pgp","env","finalize","PSD","numScheduledCalls","tickFinalizers","DexiePromise","_listeners","_lib","psd","_PSD","_state","_value","handleRejection","executePromiseTask","thenProp","microTaskId","totalEchoes","onFulfilled","onRejected","possibleAwait","cleanup","decrementExpectedAwaits","reject","propagateToListener","Listener","nativeAwaitCompatibleWrap","_consoleTask","zone","promise","shouldExecuteTick","beginMicroTickScope","_then","propagateAllListeners","endMicroTickScope","ex","reason","some","p","addPossiblyUnhandledError","listeners","len","finalizePhysicalTick","listener","cb","callListener","ret","run","markErrorAsHandled","e","usePSD","wasRootExec","callbacks","item","unhandledErrs","finalizers","PromiseReject","wrap","errorCatcher","outerScope","switchToZone","catch","type","handler","err","finally","onFinally","timeout","ms","Infinity","handle","Timeout","clearTimeout","snapShot","all","values","onPossibleParallellAsync","remaining","race","newPSD","newScope","scheduler","follow","zoneProps","finalizer","run_at_end_of_this_or_next_physical_tick","allSettled","possiblePromises","results","status","AggregateError","failure","task","awaits","echoes","taskCounter","zoneStack","zoneEchoes","zone_id_counter","a1","a2","parent","PromiseProp","incrementExpectedAwaits","possiblePromise","rejection","zoneEnterEcho","targetZone","zoneLeaveEcho","pop","bEnteringZone","currentZone","GlobalPromise","targetEnv","a3","outerZone","execInGlobalContext","enqueueNativeMicroTask","tempTransaction","db","mode","storeNames","idbdb","openComplete","letThrough","_vip","trans","_createTransaction","_dbSchema","PR1398_maxLoop","InvalidState","isOpen","console","warn","close","disableAutoOpen","open","_promise","result","idbtrans","commit","_completion","dbOpenError","isBeingOpened","autoOpen","dbReadyPromise","maxString","String","fromCharCode","INVALID_KEY_ARGUMENT","connections","combine","filter1","filter2","AnyRange","lower","lowerOpen","upper","upperOpen","workaroundForUndefinedPrimKey","Entity","cmp","ta","tb","NaN","al","bl","compareUint8Arrays","getUint8Array","compareArrays","ArrayBuffer","isView","tsTag","buffer","byteOffset","byteLength","Table","_trans","writeLocked","_tx","tableName","createTask","checkTableInTransaction","schema","NotFound","_novip","transless","trace","keyOrCrit","where","first","core","hook","reading","fire","indexOrCrit","WhereClause","keyPaths","equals","compoundIndex","indexes","primKey","ix","compound","every","sort","_maxKey","keyPathsInValidOrder","kp","JSON","stringify","idxByName","idb","_deps","indexedDB","idx","filterFunction","prevIndex","prevFilterFn","index","multi","toCollection","and","count","thenShortcut","offset","limit","numRows","each","toArray","Collection","orderBy","reverse","mapToClass","mappedClass","table","inheritedProps","getOwnPropertyNames","propName","add","readHook","_","unsubscribe","defineClass","content","auto","objToAdd","mutate","numFailures","lastResult","update","keyOrObject","modify","InvalidArgument","put","delete","clear","range","bulkGet","getMany","bulkAdd","objects","keysOrOptions","wantResults","allKeys","numObjects","objectsToAdd","bulkPut","objectsToPut","bulkUpdate","keysAndChanges","coreTable","entry","changeSpecs","changes","offsetMap","cache","objs","resultKeys","resultObjs","Constraint","numEntries","updates","mappedOffset","Number","bulkDelete","numKeys","Events","ctx","evs","eventName","subscriber","subscribe","addEventType","chainFunction","defaultFunction","addConfiguredEvents","context","subscribers","cfg","makeClassConstructor","isPlainKeyRange","ignoreLimitFilter","algorithm","or","justLimit","replayFilter","addFilter","addReplayFilter","factory","isLimitFilter","curr","getIndexOrStore","coreSchema","isPrimKey","primaryKey","getIndexByKeyPath","Schema","openCursor","keysOnly","dir","unique","query","iter","coreTrans","union","cursor","advance","stop","fail","_iterate","iterate","valueMapper","cursorPromise","wrappedFn","c","continue","advancer","PropModSymbol","PropModification","execute","term","BigInt","remove","subtrahend","includes","prefixToReplace","replacePrefix","startsWith","substring","spec","assign","_read","_ctx","error","_write","_addAlgorithm","clone","raw","Math","min","sortBy","parts","lastPart","lastIndex","getval","order","sorter","aVal","bVal","offsetLeft","rowsLeft","until","bIncludeStopEntry","last","isMatch","indexName","_ondirectionchange","desc","eachKey","eachUniqueKey","eachPrimaryKey","primaryKeys","uniqueKeys","firstKey","lastKey","distinct","strKey","found","modifyer","anythingModified","origVal","outbound","extractKey","_options","modifyChunkSize","totalFailures","applyMutateResult","expectedCount","criteria","deleteCallback","nextChunk","addValues","putValues","putKeys","deleteKeys","origValue","changeSpec","isAdditionalChunk","coreRange","simpleCompare","simpleCompareReverse","collectionOrWhereClause","T","collection","emptyCollection","whereClause","rangeEqual","nextCasing","lowerKey","upperNeedle","lowerNeedle","llp","lwrKeyChar","addIgnoreCaseAlgorithm","match","needles","suffix","compare","upperNeedles","lowerNeedles","direction","nextKeySuffix","needlesLen","initDirection","toUpperCase","toLowerCase","upperFactory","lowerFactory","needleBounds","needle","nb","createRange","firstPossibleNeedle","lowestPossibleCasing","casing","between","includeLower","includeUpper","_cmp","above","aboveOrEqual","below","belowOrEqual","str","startsWithIgnoreCase","equalsIgnoreCase","anyOfIgnoreCase","startsWithAnyOfIgnoreCase","n","anyOf","_ascending","_descending","notEqual","inAnyRange","includeLowers","includeUppers","noneOf","ranges","ascending","descending","_min","max","_max","sortDirection","rangeSorter","newRange","rangePos","keyIsBeyondCurrentEntry","keyIsBeforeCurrentEntry","checkKey","keyWithinCurrentRange","startsWithAnyOf","eventRejectHandler","event","preventDefault","target","stopPropagation","globalEvents","Transaction","_lock","_reculock","lockOwnerFor","_unlock","_blockedFuncs","_locked","fnAndPSD","shift","OpenFailed","active","transaction","durability","chromeTransactionDurability","ev","_reject","onabort","on","oncomplete","_resolve","storagemutated","bWriteLock","ReadOnly","_root","waitFor","promiseLike","root","_waitingFor","_waitingQueue","store","objectStore","spin","_spinCount","currentWaitPromise","abort","memoizedTables","_memoizedTables","tableSchema","transactionBoundTable","createIndexSpec","src","nameFromKeyPath","createTableSchema","array","extractor","nameAndValue","getMaxKey","IdbKeyRange","only","getKeyExtractor","getSinglePathKeyExtractor","arrayify","_id_counter","getKeyPathAlias","createDBCore","tmpTrans","makeIDBKeyRange","upperBound","lowerBound","bound","hasGetAll","tables","objectStoreNames","autoIncrement","indexByKeyPath","isPrimaryKey","indexNames","multiEntry","navigator","userAgent","extractSchema","isAddOrPut","req","reqs","errorHandler","args1","args2","keyCount","callbackCount","successHandler","_pos","request","nonInfinitLimit","source","idbKeyRange","getAll","getAllKeys","openKeyCursor","___id","_cursorContinue","_cursorContinuePrimaryKey","continuePrimaryKey","_cursorAdvance","doThrowCursorIsStopped","gotOne","iterationPromise","resolveIteration","rejectIteration","guardedCallback","createDbCoreTable","tableMap","stack","MIN_KEY","MAX_KEY","generateMiddlewareStacks","stacks","middlewares","IDBKeyRange","dbcore","stackImpl","down","createMiddlewareStack","createMiddlewareStacks","_middlewares","tbl","setApiOnPlace","tableNames","dbschema","propDesc","enumerable","removeTablesApi","lowerVersionFirst","_cfg","version","runUpgraders","oldVersion","idbUpgradeTrans","globalSchema","contains","$meta","parseIndexSyntax","_storeNames","rejectTransaction","metaVersion","getExistingVersion","queue","versions","_versions","buildGlobalSchema","versToRun","runQueue","oldSchema","newSchema","adjustToExistingIndexNames","diff","getSchemaDiff","tuple","createTable","change","recreate","Upgrade","addIndex","deleteIndex","del","idxName","contentUpgrade","upgradeSchema","contentUpgradeIsAsync","returnValue","promiseFollowed","decrementor","storeName","deleteObjectStore","deleteRemovedTables","ceil","createMissingTables","updateTablesAndIndexes","populate","oldDef","newDef","def","oldIndexes","newIndexes","oldIdx","newIdx","createObjectStore","createIndex","j","idbindex","_hasGetAll","dexieName","indexSpec","WorkerGlobalScope","primKeyAndIndexes","indexNum","trim","replace","Version","_parseStoresSpec","stores","outSchema","storesSource","storesSpec","_allTables","upgrade","upgradeFunction","getDbNamesTable","dbNamesDB","Dexie$1","addons","dbnames","hasDatabasesNative","databases","vip","idbReady","intervalId","userAgentData","tryIdb","setInterval","clearInterval","isEmptyRange","node","RangeSet","fromOrTree","to","d","addRange","left","right","r","rebalance","rightWasCutOff","mergeRanges","newSet","_addRangeSet","rangesOverlap","rangeSet1","rangeSet2","i1","getRangeSetIterator","nextResult1","i2","nextResult2","state","keyProvided","up","rootClone","oldRootRight","computeDepth","extendObservabilitySet","part","obsSetsOverlap","os1","os2","rangeSet","addKey","addKeys","unsignaledParts","isTaskEnqueued","signalSubscribersLazily","optimistic","signalSubscribersNow","updatedParts","deleteAffectedCacheEntries","queriesToSignal","tblCache","collectTableSubscribers","exec","dbName","requery","outQueriesToSignal","updatedEntryLists","entries","queries","filteredEntries","obsSet","dexieOpen","openCanceller","nativeVerToOpen","round","verno","schemaPatchMode","throwIfCancelled","resolveDbReady","dbReadyResolve","upgradeTransaction","wasCreated","tryOpenDB","autoSchema","onblocked","_fireOnBlocked","onupgradeneeded","allowEmptyDB","delreq","deleteDatabase","NoSuchDatabase","oldVer","pow","tableChange","patchCurrentVersion","readGlobalSchema","ch","verifyInstalledSchema","onversionchange","vcFired","onclose","_onDatabaseCreated","onReadyBeingFired","ready","fireRemainders","remainders","_close","everything","awaitIterator","callNext","onSuccess","step","onError","throw","getNext","extractTransactionArgs","_tableArgs_","scopeFunc","enterTransactionScope","parentTransaction","explicit","_explicit","scopeFuncIsAsync","PrematureCommit","pad","virtualIndexMiddleware","level","indexLookup","allVirtualIndexes","addVirtualIndexes","keyTail","lowLevelIndex","keyPathAlias","indexList","keyLength","isVirtual","virtualIndex","translateRequest","virtualCursor","createVirtualCursor","getObjectDiff","prfx","ap","bp","apTypeName","getEffectiveKeys","hooksMiddleware","downCore","downTable","tableMiddleware","dxTrans","deleting","creating","updating","addPutOrDelete","deleteNextChunk","deleteRange","effectiveKeys","getExistingValues","existingValues","contexts","existingValue","generatedPrimaryKey","objectDiff","additionalChanges","requestedValue","getFromTransactionCache","cacheExistingValuesMiddleware","cachedResult","isCachableContext","subscr","isCachableRequest","observabilityMiddleware","FULL_RANGE","querier","indexesWithAutoIncPK","tableClone","mutatedParts","getRangeSet","pkRangeSet","delsRangeSet","newObjs","oldCache","oldObjs","addAffectedIndex","addKeyOrKeys","oldKey","newKey","trackAffectedIndexes","idxVals","pkPos","findIndex","pk","getRange","readSubscribers","method","isLiveQuery","cachable","queriedIndex","queriedRanges","keysPromise","resultingKeys","pKeys","wantValues","pkey","adjustOptimisticFromFailures","numBulkOps","isWithinRange","isAboveLower","isBelowUpper","applyOptimisticOps","ops","cacheEntry","immutable","queryRange","extractPrimKey","extractIndex","extractLowLevelIndex","finalResult","op","modifedResult","includedValues","freeze","keySet","keysToDelete","dirty","areRangesEqual","r1","r2","isSuperRange","lower1","lower2","lowerOpen1","lowerOpen2","compareLowers","upper1","upper2","upperOpen1","upperOpen2","compareUppers","subscribeToCacheEntry","container","signal","addEventListener","size","enqueForDeletion","cacheMiddleware","coreMW","ac","AbortController","endTransaction","wasCommitted","affectedSubscribers","optimisticOps","freezeResults","modRes","tableMW","adjustedReq","valueWithKey","exactMatch","equalEntry","find","countQuery","findCompatibleQuery","Map","vipify","vipDb","Proxy","receiver","deps","dependencies","cancelOpen","bSticky","keyRangeGenerator","keyRange","whereCtx","readingHook","createTableConstructor","complete","wasActive","createTransactionConstructor","versionNumber","createVersionConstructor","orCollection","_IDBKeyRange","createWhereClauseConstructor","newVersion","use","vipDB","tx","addon","versionInstance","_whenReady","unuse","mw","closeOptions","hasInvalidArguments","doDelete","_onDatabaseDeleted","backendDB","hasBeenClosed","hasFailed","dynamicallyOpened","_transaction","onlyIfCompatible","idbMode","SubTransaction","enterTransaction","InvalidTable","symbolObservable","observable","Observable","_subscribe","domDeps","mozIndexedDB","webkitIndexedDB","msIndexedDB","webkitIDBKeyRange","liveQuery","currentValue","hasValue","observer","abortController","closed","accumMuts","currentObs","subscription","startedListening","mutationListener","doQuery","_doQuery","aborted","objectIsEmpty","getValue","Dexie","propagateLocally","updateParts","wasMe","propagatingLocally","databaseName","exists","getDatabaseNames","infos","info","ignoreTransaction","async","generatorFn","spawn","currentTransaction","promiseOrFunction","optionalTimeout","delByKeyPath","minKey","semVer","maxKey","dispatchEvent","CustomEvent","detail","bc","createBC","BroadcastChannel","onmessage","data","unref","changedParts","postMessage","disableBfCache","persisted","domError"],"mappings":"AAaA,MAAMA,EAAgC,oBAAfC,WAA6BA,WAChC,oBAATC,KAAuBA,KACR,oBAAXC,OAAyBA,OAC5BC,OAENC,EAAOC,OAAOD,KACdE,EAAUC,MAAMD,QAItB,SAASE,EAAOC,EAAKC,GACjB,MAAyB,iBAAdA,GAEXN,EAAKM,GAAWC,SAAQ,SAAUC,GAC9BH,EAAIG,GAAOF,EAAUE,MAFdH,EALQ,oBAAZI,SAA4Bd,EAAQc,UAC3Cd,EAAQc,QAAUA,SAUtB,MAAMC,EAAWT,OAAOU,eAClBC,EAAU,GAAGC,eACnB,SAASC,EAAOT,EAAKU,GACjB,OAAOH,EAAQI,KAAKX,EAAKU,GAE7B,SAASE,EAAMC,EAAOZ,GACO,mBAAdA,IACPA,EAAYA,EAAUI,EAASQ,MACf,oBAAZC,QAA0BnB,EAAOmB,QAAQC,SAASd,GAAWC,SAAQC,IACzEa,EAAQH,EAAOV,EAAKF,EAAUE,OAGtC,MAAMc,EAAiBrB,OAAOqB,eAC9B,SAASD,EAAQhB,EAAKU,EAAMQ,EAAkBC,GAC1CF,EAAejB,EAAKU,EAAMX,EAAOmB,GAAoBT,EAAOS,EAAkB,QAA0C,mBAAzBA,EAAiBE,IAC5G,CAAEA,IAAKF,EAAiBE,IAAKC,IAAKH,EAAiBG,IAAKC,cAAc,GACtE,CAAEC,MAAOL,EAAkBI,cAAc,EAAME,UAAU,GAAQL,IAEzE,SAASM,EAAOC,GACZ,MAAO,CACHC,KAAM,SAAUC,GAGZ,OAFAF,EAAMG,UAAYjC,OAAOkC,OAAOF,EAAOC,WACvCb,EAAQU,EAAMG,UAAW,cAAeH,GACjC,CACH3B,OAAQa,EAAMmB,KAAK,KAAML,EAAMG,cAK/C,MAAMG,EAA2BpC,OAAOoC,yBACxC,SAASC,EAAsBjC,EAAKU,GAEhC,IAAIG,EACJ,OAFWmB,EAAyBhC,EAAKU,KAE3BG,EAAQR,EAASL,KAASiC,EAAsBpB,EAAOH,GAEzE,MAAMwB,EAAS,GAAGC,MAClB,SAASA,EAAMC,EAAMC,EAAOC,GACxB,OAAOJ,EAAOvB,KAAKyB,EAAMC,EAAOC,GAEpC,SAASC,EAASC,EAAUC,GACxB,OAAOA,EAAiBD,GAE5B,SAASE,EAAOC,GACZ,IAAKA,EACD,MAAM,IAAIC,MAAM,oBAExB,SAASC,EAAOC,GACRxD,EAAQyD,aACRA,aAAaD,GAEbE,WAAWF,EAAI,GAUvB,SAASG,EAAajD,EAAKkD,GACvB,GAAuB,iBAAZA,GAAwBzC,EAAOT,EAAKkD,GAC3C,OAAOlD,EAAIkD,GACf,IAAKA,EACD,OAAOlD,EACX,GAAuB,iBAAZkD,EAAsB,CAE7B,IADA,IAAIC,EAAK,GACAC,EAAI,EAAGC,EAAIH,EAAQI,OAAQF,EAAIC,IAAKD,EAAG,CAC5C,IAAIG,EAAMN,EAAajD,EAAKkD,EAAQE,IACpCD,EAAGK,KAAKD,GAEZ,OAAOJ,EAEX,IAAIM,EAASP,EAAQQ,QAAQ,KAC7B,IAAgB,IAAZD,EAAe,CACf,IAAIE,EAAW3D,EAAIkD,EAAQU,OAAO,EAAGH,IACrC,OAAmB,MAAZE,OAAmBE,EAAYZ,EAAaU,EAAUT,EAAQU,OAAOH,EAAS,KAI7F,SAASK,EAAa9D,EAAKkD,EAAS3B,GAChC,GAAKvB,QAAmB6D,IAAZX,MAER,aAActD,UAAUA,OAAOmE,SAAS/D,IAE5C,GAAuB,iBAAZkD,GAAwB,WAAYA,EAAS,CACpDR,EAAwB,iBAAVnB,GAAsB,WAAYA,GAChD,IAAK,IAAI6B,EAAI,EAAGC,EAAIH,EAAQI,OAAQF,EAAIC,IAAKD,EACzCU,EAAa9D,EAAKkD,EAAQE,GAAI7B,EAAM6B,QAGvC,CACD,IAAIK,EAASP,EAAQQ,QAAQ,KAC7B,IAAgB,IAAZD,EAAe,CACf,IAAIO,EAAiBd,EAAQU,OAAO,EAAGH,GACnCQ,EAAmBf,EAAQU,OAAOH,EAAS,GAC/C,GAAyB,KAArBQ,OACcJ,IAAVtC,EACI1B,EAAQG,KAASkE,MAAMC,SAASH,IAChChE,EAAIoE,OAAOJ,EAAgB,UAEpBhE,EAAIgE,GAGfhE,EAAIgE,GAAkBzC,MACzB,CACD,IAAIoC,EAAW3D,EAAIgE,GACdL,GAAalD,EAAOT,EAAKgE,KAC1BL,EAAY3D,EAAIgE,GAAkB,IACtCF,EAAaH,EAAUM,EAAkB1C,cAI/BsC,IAAVtC,EACI1B,EAAQG,KAASkE,MAAMC,SAASjB,IAChClD,EAAIoE,OAAOlB,EAAS,UAEblD,EAAIkD,GAGflD,EAAIkD,GAAW3B,GAY/B,SAAS8C,EAAarE,GAClB,IAAImD,EAAK,GACT,IAAK,IAAImB,KAAKtE,EACNS,EAAOT,EAAKsE,KACZnB,EAAGmB,GAAKtE,EAAIsE,IAEpB,OAAOnB,EAEX,MAAMoB,EAAS,GAAGA,OAClB,SAASC,EAAQC,GACb,OAAOF,EAAOG,MAAM,GAAID,GAE5B,MAAME,EAAqB,iNACtBC,MAAM,KAAKL,OAAOC,EAAQ,CAAC,EAAG,GAAI,GAAI,IAAIK,KAAIC,GAAO,CAAC,MAAO,OAAQ,SAASD,KAAIE,GAAKA,EAAID,EAAM,cAAYE,QAAOD,GAAKzF,EAAQyF,KAChIE,EAAiB,IAAIC,IAAIP,EAAmBE,KAAIE,GAAKzF,EAAQyF,MACnE,SAASI,EAAsBC,GAC3B,MAAMjC,EAAK,GACX,IAAK,MAAMkC,KAAKD,EACZ,GAAI3E,EAAO2E,EAAGC,GAAI,CACd,MAAMC,EAAIF,EAAEC,GACZlC,EAAGkC,IAAMC,GAAkB,iBAANA,GAAkBL,EAAeM,IAAID,EAAEE,aAAeF,EAAIH,EAAsBG,GAE7G,OAAOnC,EAQX,IAAIsC,EAAe,KACnB,SAASC,EAAUC,GACfF,EAAe,IAAIG,QACnB,MAAMzC,EAAK0C,EAAeF,GAE1B,OADAF,EAAe,KACRtC,EAEX,SAAS0C,EAAeC,GACpB,IAAKA,GAAkB,iBAANA,EACb,OAAOA,EACX,IAAI3C,EAAKsC,EAAarE,IAAI0E,GAC1B,GAAI3C,EACA,OAAOA,EACX,GAAItD,EAAQiG,GAAI,CACZ3C,EAAK,GACLsC,EAAapE,IAAIyE,EAAG3C,GACpB,IAAK,IAAIC,EAAI,EAAGC,EAAIyC,EAAExC,OAAQF,EAAIC,IAAKD,EACnCD,EAAGK,KAAKqC,EAAeC,EAAE1C,UAG5B,GAAI6B,EAAeM,IAAIO,EAAEN,aAC1BrC,EAAK2C,MAEJ,CACD,MAAMjF,EAAQR,EAASyF,GAGvB,IAAK,IAAIpF,KAFTyC,EAAKtC,IAAUjB,OAAOiC,UAAY,GAAKjC,OAAOkC,OAAOjB,GACrD4E,EAAapE,IAAIyE,EAAG3C,GACH2C,EACTrF,EAAOqF,EAAGpF,KACVyC,EAAGzC,GAAQmF,EAAeC,EAAEpF,KAIxC,OAAOyC,EAEX,MAAM4C,SAAEA,GAAa,GACrB,SAASC,EAAYZ,GACjB,OAAOW,EAASpF,KAAKyE,GAAGjD,MAAM,GAAI,GAEtC,MAAM8D,EAAmC,oBAAXC,OAC1BA,OAAOC,SACP,aACEC,EAA0C,iBAAnBH,EAA8B,SAAUH,GACjE,IAAI1C,EACJ,OAAY,MAAL0C,IAAc1C,EAAI0C,EAAEG,KAAoB7C,EAAEsB,MAAMoB,IACvD,WAAc,OAAO,MACzB,SAASO,EAAa5B,EAAGqB,GACrB,MAAM1C,EAAIqB,EAAEf,QAAQoC,GAGpB,OAFI1C,GAAK,GACLqB,EAAEL,OAAOhB,EAAG,GACTA,GAAK,EAEhB,MAAMkD,EAAgB,GACtB,SAASC,EAAWC,GAChB,IAAIpD,EAAGqB,EAAGqB,EAAGW,EACb,GAAyB,IAArBC,UAAUpD,OAAc,CACxB,GAAIzD,EAAQ2G,GACR,OAAOA,EAAUrE,QACrB,GAAIwE,OAASL,GAAsC,iBAAdE,EACjC,MAAO,CAACA,GACZ,GAAKC,EAAKL,EAAcI,GAAa,CAEjC,IADA/B,EAAI,KACIqB,EAAIW,EAAGG,QAAYC,MACvBpC,EAAEjB,KAAKsC,EAAEvE,OACb,OAAOkD,EAEX,GAAiB,MAAb+B,EACA,MAAO,CAACA,GAEZ,GAAiB,iBADjBpD,EAAIoD,EAAUlD,QACa,CAEvB,IADAmB,EAAI,IAAI3E,MAAMsD,GACPA,KACHqB,EAAErB,GAAKoD,EAAUpD,GACrB,OAAOqB,EAEX,MAAO,CAAC+B,GAIZ,IAFApD,EAAIsD,UAAUpD,OACdmB,EAAI,IAAI3E,MAAMsD,GACPA,KACHqB,EAAErB,GAAKsD,UAAUtD,GACrB,OAAOqB,EAEX,MAAMqC,EAAoC,oBAAXZ,OACxBpD,GAAkC,kBAA3BA,EAAGoD,OAAOF,aAClB,KAAM,EAEZ,IAkBIe,EAAmB,CACnB,UACA,aACA,OACA,sBACA,WACA,UACA,WACA,eACA,gBACA,QACA,UACA,gBACA,SACA,aAEAC,EAlCkB,CAClB,SACA,OACA,aACA,gBACA,SACA,UACA,eACA,aACA,iBACA,kBACA,iBACA,cACA,WACA,iBACA,kBACA,gBAkB4BzC,OAAOwC,GACnCE,EAAe,CACfC,eAAgB,wDAChBC,eAAgB,2BAChBC,MAAO,sBACPC,oBAAqB,8CACrBC,WAAY,oEAEhB,SAASC,EAAWC,EAAMC,GACtBd,KAAKa,KAAOA,EACZb,KAAKe,QAAUD,EAKnB,SAASE,EAAqBF,EAAKG,GAC/B,OAAOH,EAAM,aAAe7H,OAAOD,KAAKiI,GACnC/C,KAAI1E,GAAOyH,EAASzH,GAAK4F,aACzBf,QAAO,CAACM,EAAGlC,EAAGyE,IAAMA,EAAEnE,QAAQ4B,KAAOlC,IACrC0E,KAAK,MAEd,SAASC,EAAYN,EAAKG,EAAUI,EAAcC,GAC9CtB,KAAKiB,SAAWA,EAChBjB,KAAKsB,WAAaA,EAClBtB,KAAKqB,aAAeA,EACpBrB,KAAKe,QAAUC,EAAqBF,EAAKG,GAG7C,SAASM,EAAUT,EAAKG,GACpBjB,KAAKa,KAAO,YACZb,KAAKiB,SAAWhI,OAAOD,KAAKiI,GAAU/C,KAAIsD,GAAOP,EAASO,KAC1DxB,KAAKyB,cAAgBR,EACrBjB,KAAKe,QAAUC,EAAqBF,EAAKd,KAAKiB,UApBlDnG,EAAO8F,GAAY5F,KAAKiB,OAAO7C,OAAO,CAClCgG,SAAU,WAAc,OAAOY,KAAKa,KAAO,KAAOb,KAAKe,WAc3DjG,EAAOsG,GAAapG,KAAK4F,GAOzB9F,EAAOyG,GAAWvG,KAAK4F,GACvB,IAAIc,EAAWrB,EAAUsB,QAAO,CAACtI,EAAKwH,KAAUxH,EAAIwH,GAAQA,EAAO,QAASxH,IAAM,IAClF,MAAMuI,EAAgBhB,EACtB,IAAIiB,EAAaxB,EAAUsB,QAAO,CAACtI,EAAKwH,KACpC,IAAIiB,EAAWjB,EAAO,QACtB,SAASD,EAAWmB,EAAYC,GAC5BhC,KAAKa,KAAOiB,EACPC,EAI0B,iBAAfA,GACZ/B,KAAKe,QAAU,GAAGgB,IAAcC,EAAa,MAAQA,EAAb,KACxChC,KAAKgC,MAAQA,GAAS,MAEK,iBAAfD,IACZ/B,KAAKe,QAAU,GAAGgB,EAAWlB,QAAQkB,EAAWhB,UAChDf,KAAKgC,MAAQD,IATb/B,KAAKe,QAAUT,EAAaO,IAASiB,EACrC9B,KAAKgC,MAAQ,MAarB,OAFAlH,EAAO8F,GAAY5F,KAAK4G,GACxBvI,EAAIwH,GAAQD,EACLvH,IACR,IACHwI,EAAWI,OAASC,YACpBL,EAAWM,KAAOC,UAClBP,EAAWQ,MAAQC,WACnB,IAAIC,EAAenC,EAAiBuB,QAAO,CAACtI,EAAKwH,KAC7CxH,EAAIwH,EAAO,SAAWgB,EAAWhB,GAC1BxH,IACR,IAYH,IAAImJ,EAAqBnC,EAAUsB,QAAO,CAACtI,EAAKwH,MACO,IAA/C,CAAC,SAAU,OAAQ,SAAS9D,QAAQ8D,KACpCxH,EAAIwH,EAAO,SAAWgB,EAAWhB,IAC9BxH,IACR,IAKH,SAASoJ,KACT,SAASC,EAAO9F,GAAO,OAAOA,EAC9B,SAAS+F,EAAkBC,EAAIC,GAC3B,OAAU,MAAND,GAAcA,IAAOF,EACdG,EACJ,SAAUjG,GACb,OAAOiG,EAAGD,EAAGhG,KAGrB,SAASkG,EAASC,EAAKC,GACnB,OAAO,WACHD,EAAIhF,MAAMiC,KAAMD,WAChBiD,EAAIjF,MAAMiC,KAAMD,YAGxB,SAASkD,EAAkBL,EAAIC,GAC3B,OAAID,IAAOH,EACAI,EACJ,WACH,IAAIK,EAAMN,EAAG7E,MAAMiC,KAAMD,gBACb7C,IAARgG,IACAnD,UAAU,GAAKmD,GACnB,IAAIC,EAAYnD,KAAKmD,UACrBC,EAAUpD,KAAKoD,QACfpD,KAAKmD,UAAY,KACjBnD,KAAKoD,QAAU,KACf,IAAIC,EAAOR,EAAG9E,MAAMiC,KAAMD,WAK1B,OAJIoD,IACAnD,KAAKmD,UAAYnD,KAAKmD,UAAYL,EAASK,EAAWnD,KAAKmD,WAAaA,GACxEC,IACApD,KAAKoD,QAAUpD,KAAKoD,QAAUN,EAASM,EAASpD,KAAKoD,SAAWA,QACpDlG,IAATmG,EAAqBA,EAAOH,GAG3C,SAASI,GAAkBV,EAAIC,GAC3B,OAAID,IAAOH,EACAI,EACJ,WACHD,EAAG7E,MAAMiC,KAAMD,WACf,IAAIoD,EAAYnD,KAAKmD,UACrBC,EAAUpD,KAAKoD,QACfpD,KAAKmD,UAAYnD,KAAKoD,QAAU,KAChCP,EAAG9E,MAAMiC,KAAMD,WACXoD,IACAnD,KAAKmD,UAAYnD,KAAKmD,UAAYL,EAASK,EAAWnD,KAAKmD,WAAaA,GACxEC,IACApD,KAAKoD,QAAUpD,KAAKoD,QAAUN,EAASM,EAASpD,KAAKoD,SAAWA,IAG5E,SAASG,GAAkBX,EAAIC,GAC3B,OAAID,IAAOH,EACAI,EACJ,SAAUW,GACb,IAAIN,EAAMN,EAAG7E,MAAMiC,KAAMD,WACzB3G,EAAOoK,EAAeN,GACtB,IAAIC,EAAYnD,KAAKmD,UACrBC,EAAUpD,KAAKoD,QACfpD,KAAKmD,UAAY,KACjBnD,KAAKoD,QAAU,KACf,IAAIC,EAAOR,EAAG9E,MAAMiC,KAAMD,WAK1B,OAJIoD,IACAnD,KAAKmD,UAAYnD,KAAKmD,UAAYL,EAASK,EAAWnD,KAAKmD,WAAaA,GACxEC,IACApD,KAAKoD,QAAUpD,KAAKoD,QAAUN,EAASM,EAASpD,KAAKoD,SAAWA,QACrDlG,IAARgG,OACOhG,IAATmG,OAAqBnG,EAAYmG,EACjCjK,EAAO8J,EAAKG,IAGzB,SAASI,GAA2Bb,EAAIC,GACpC,OAAID,IAAOH,EACAI,EACJ,WACH,OAAkC,IAA9BA,EAAG9E,MAAMiC,KAAMD,YAEZ6C,EAAG7E,MAAMiC,KAAMD,YAG9B,SAAS2D,GAAgBd,EAAIC,GACzB,OAAID,IAAOH,EACAI,EACJ,WACH,IAAIK,EAAMN,EAAG7E,MAAMiC,KAAMD,WACzB,GAAImD,GAA2B,mBAAbA,EAAIS,KAAqB,CAEvC,IADA,IAAIC,EAAO5D,KAAMvD,EAAIsD,UAAUpD,OAAQlB,EAAO,IAAItC,MAAMsD,GACjDA,KACHhB,EAAKgB,GAAKsD,UAAUtD,GACxB,OAAOyG,EAAIS,MAAK,WACZ,OAAOd,EAAG9E,MAAM6F,EAAMnI,MAG9B,OAAOoH,EAAG9E,MAAMiC,KAAMD,YA/F9ByC,EAAmBpB,YAAcA,EACjCoB,EAAmB5B,WAAaA,EAChC4B,EAAmBjB,UAAYA,EAiG/B,IAAIsC,GAA4B,oBAAbC,UACf,6CAA6CC,KAAKD,SAASE,MAC/D,SAASC,GAASrJ,EAAOyD,GACrBwF,GAAQjJ,EAGZ,IAAIsJ,GAAW,GACf,MAA8BC,GAAuBC,GAAoBC,IAA4C,oBAAZ5K,QACrG,GACA,MACI,IAAI6K,EAAU7K,QAAQ8K,UACtB,GAAsB,oBAAXC,SAA2BA,OAAOC,OACzC,MAAO,CAACH,EAAS5K,EAAS4K,GAAUA,GACxC,MAAMI,EAAUF,OAAOC,OAAOE,OAAO,UAAW,IAAIC,WAAW,CAAC,KAChE,MAAO,CACHF,EACAhL,EAASgL,GACTJ,IARR,GAUMO,GAAoBT,IAAsBA,GAAmBT,KACjEmB,GAAgBX,IAAyBA,GAAsBtF,YAC/DkG,KAAuBV,GAI7B,IAAIW,GAAO,SAAUC,EAAUxJ,GAC3ByJ,GAAerI,KAAK,CAACoI,EAAUxJ,IAC3B0J,KAJJC,eAAeC,IAMXF,IAAuB,IAG3BG,IAAqB,EACzBH,IAAuB,EACvBI,GAAkB,GAClBC,GAAkB,GAClBC,GAAkB/C,EACdgD,GAAY,CACZC,GAAI,SACJ5M,QAAQ,EACR6M,IAAK,EACLC,WAAY,GACZC,YAAarD,EACbsD,KAAK,EACLC,IAAK,GACLC,SAAUxD,GAEVyD,GAAMR,GACNR,GAAiB,GACjBiB,GAAoB,EACpBC,GAAiB,GACrB,SAASC,GAAalK,GAClB,GAAoB,iBAAT6D,KACP,MAAM,IAAIoC,UAAU,wCACxBpC,KAAKsG,WAAa,GAClBtG,KAAKuG,MAAO,EACZ,IAAIC,EAAOxG,KAAKyG,KAAOP,GACvB,GAAkB,mBAAP/J,EAAmB,CAC1B,GAAIA,IAAO+H,GACP,MAAM,IAAI9B,UAAU,kBAKxB,OAJApC,KAAK0G,OAAS3G,UAAU,GACxBC,KAAK2G,OAAS5G,UAAU,SACJ,IAAhBC,KAAK0G,QACLE,GAAgB5G,KAAMA,KAAK2G,SAGnC3G,KAAK0G,OAAS,KACd1G,KAAK2G,OAAS,OACZH,EAAIZ,IACNiB,GAAmB7G,KAAM7D,GAE7B,MAAM2K,GAAW,CACbrM,IAAK,WACD,IAAI+L,EAAMN,GAAKa,EAAcC,GAC7B,SAASrD,EAAKsD,EAAaC,GACvB,IAAIC,GAAiBX,EAAIzN,SAAWyN,IAAQN,IAAOa,IAAgBC,IACnE,MAAMI,EAAUD,IAAkBE,KAClC,IAAI7K,EAAK,IAAI6J,IAAa,CAAC9B,EAAS+C,KAChCC,GAAoBvH,KAAM,IAAIwH,GAASC,GAA0BR,EAAaT,EAAKW,EAAeC,GAAUK,GAA0BP,EAAYV,EAAKW,EAAeC,GAAU7C,EAAS+C,EAAQd,OAIrM,OAFIxG,KAAK0H,eACLlL,EAAGkL,aAAe1H,KAAK0H,cACpBlL,EAGX,OADAmH,EAAKzI,UAAYgJ,GACVP,GAEXjJ,IAAK,SAAUE,GACXP,EAAQ2F,KAAM,OAAQpF,GAASA,EAAMM,YAAcgJ,GAC/C4C,GACA,CACIrM,IAAK,WACD,OAAOG,GAEXF,IAAKoM,GAASpM,QAoC9B,SAAS8M,GAASP,EAAaC,EAAY3C,EAAS+C,EAAQK,GACxD3H,KAAKiH,YAAqC,mBAAhBA,EAA6BA,EAAc,KACrEjH,KAAKkH,WAAmC,mBAAfA,EAA4BA,EAAa,KAClElH,KAAKuE,QAAUA,EACfvE,KAAKsH,OAASA,EACdtH,KAAKwG,IAAMmB,EA8Ff,SAASd,GAAmBe,EAASzL,GACjC,IACIA,GAAGvB,IACC,GAAuB,OAAnBgN,EAAQlB,OAAZ,CAEA,GAAI9L,IAAUgN,EACV,MAAM,IAAIxF,UAAU,6CACxB,IAAIyF,EAAoBD,EAAQrB,MAAQuB,KACpClN,GAA+B,mBAAfA,EAAM+I,KACtBkD,GAAmBe,GAAS,CAACrD,EAAS+C,KAClC1M,aAAiByL,GACbzL,EAAMmN,MAAMxD,EAAS+C,GACrB1M,EAAM+I,KAAKY,EAAS+C,OAI5BM,EAAQlB,QAAS,EACjBkB,EAAQjB,OAAS/L,EACjBoN,GAAsBJ,IAEtBC,GACAI,QACLrB,GAAgBxL,KAAK,KAAMwM,IAElC,MAAOM,GACHtB,GAAgBgB,EAASM,IAGjC,SAAStB,GAAgBgB,EAASO,GAE9B,GADA3C,GAAgB3I,KAAKsL,GACE,OAAnBP,EAAQlB,OAAZ,CAEA,IAAImB,EAAoBD,EAAQrB,MAAQuB,KACxCK,EAAS1C,GAAgB0C,GACzBP,EAAQlB,QAAS,EACjBkB,EAAQjB,OAASwB,EAyGrB,SAAmCP,GAC1BrC,GAAgB6C,MAAKC,GAAKA,EAAE1B,SAAWiB,EAAQjB,UAChDpB,GAAgB1I,KAAK+K,GA1GzBU,CAA0BV,GAC1BI,GAAsBJ,GAClBC,GACAI,MAER,SAASD,GAAsBJ,GAC3B,IAAIW,EAAYX,EAAQtB,WACxBsB,EAAQtB,WAAa,GACrB,IAAK,IAAI7J,EAAI,EAAG+L,EAAMD,EAAU5L,OAAQF,EAAI+L,IAAO/L,EAC/C8K,GAAoBK,EAASW,EAAU9L,IAE3C,IAAI+J,EAAMoB,EAAQnB,OAChBD,EAAIZ,KAAOY,EAAIP,WACS,IAAtBE,OACEA,GACFnB,IAAK,KAC2B,KAAtBmB,IACFsC,OACL,KAGX,SAASlB,GAAoBK,EAASc,GAClC,GAAuB,OAAnBd,EAAQlB,OAAZ,CAIA,IAAIiC,EAAKf,EAAQlB,OAASgC,EAASzB,YAAcyB,EAASxB,WAC1D,GAAW,OAAPyB,EACA,OAAQf,EAAQlB,OAASgC,EAASnE,QAAUmE,EAASpB,QAAQM,EAAQjB,UAEvE+B,EAASlC,IAAIZ,MACbO,GACFnB,GAAK4D,GAAc,CAACD,EAAIf,EAASc,SAT7Bd,EAAQtB,WAAWzJ,KAAK6L,GAWhC,SAASE,GAAaD,EAAIf,EAASc,GAC/B,IACI,IAAIG,EAAKjO,EAAQgN,EAAQjB,QACpBiB,EAAQlB,QAAUlB,GAAgB7I,SACnC6I,GAAkB,IACtBqD,EAAMhF,IAAS+D,EAAQF,aAAeE,EAAQF,aAAaoB,KAAI,IAAMH,EAAG/N,KAAU+N,EAAG/N,GAChFgN,EAAQlB,SAA8C,IAApClB,GAAgBzI,QAAQnC,IAoEvD,SAA4BgN,GACxB,IAAInL,EAAI8I,GAAgB5I,OACxB,KAAOF,MACC8I,KAAkB9I,GAAGkK,SAAWiB,EAAQjB,OAExC,YADApB,GAAgB9H,OAAOhB,EAAG,GAvE1BsM,CAAmBnB,GAEvBc,EAASnE,QAAQsE,GAErB,MAAOG,GACHN,EAASpB,OAAO0B,GAEpB,QACgC,KAAtB7C,IACFsC,OACFC,EAASlC,IAAIZ,KAAO8C,EAASlC,IAAIP,YAG3C,SAASZ,KACL4D,GAAOvD,IAAW,KACdoC,MAAyBG,QAGjC,SAASH,KACL,IAAIoB,EAAc5D,GAGlB,OAFAA,IAAqB,EACrBH,IAAuB,EAChB+D,EAEX,SAASjB,KACL,IAAIkB,EAAW1M,EAAGC,EAClB,GACI,KAAOwI,GAAevI,OAAS,GAI3B,IAHAwM,EAAYjE,GACZA,GAAiB,GACjBxI,EAAIyM,EAAUxM,OACTF,EAAI,EAAGA,EAAIC,IAAKD,EAAG,CACpB,IAAI2M,EAAOD,EAAU1M,GACrB2M,EAAK,GAAGrL,MAAM,KAAMqL,EAAK,WAG5BlE,GAAevI,OAAS,GACjC2I,IAAqB,EACrBH,IAAuB,EAE3B,SAASsD,KACL,IAAIY,EAAgB9D,GACpBA,GAAkB,GAClB8D,EAAc9P,SAAQ8O,IAClBA,EAAE5B,KAAKX,YAAY9L,KAAK,KAAMqO,EAAE1B,OAAQ0B,MAI5C,IAFA,IAAIiB,EAAalD,GAAe5K,MAAM,GAClCiB,EAAI6M,EAAW3M,OACZF,GACH6M,IAAa7M,KA0BrB,SAAS8M,GAAcpB,GACnB,OAAO,IAAI9B,GAAanC,IAAU,EAAOiE,GAE7C,SAASqB,GAAKrN,EAAIsN,GACd,IAAIjD,EAAMN,GACV,OAAO,WACH,IAAIgD,EAAcpB,KAAuB4B,EAAaxD,GACtD,IAEI,OADAyD,GAAanD,GAAK,GACXrK,EAAG4B,MAAMiC,KAAMD,WAE1B,MAAOiJ,GACHS,GAAgBA,EAAaT,GAEjC,QACIW,GAAaD,GAAY,GACrBR,GACAjB,OA5ShBhO,EAAMoM,GAAanL,UAAW,CAC1ByI,KAAMmD,GACNiB,MAAO,SAAUd,EAAaC,GAC1BK,GAAoBvH,KAAM,IAAIwH,GAAS,KAAM,KAAMP,EAAaC,EAAYhB,MAEhF0D,MAAO,SAAU1C,GACb,GAAyB,IAArBnH,UAAUpD,OACV,OAAOqD,KAAK2D,KAAK,KAAMuD,GAC3B,IAAI2C,EAAO9J,UAAU,GAAI+J,EAAU/J,UAAU,GAC7C,MAAuB,mBAAT8J,EAAsB7J,KAAK2D,KAAK,MAAMoG,GACpDA,aAAeF,EAAOC,EAAQC,GAAOR,GAAcQ,KAC7C/J,KAAK2D,KAAK,MAAMoG,GAClBA,GAAOA,EAAIlJ,OAASgJ,EAAOC,EAAQC,GAAOR,GAAcQ,MAEhEC,QAAS,SAAUC,GACf,OAAOjK,KAAK2D,MAAK/I,GACNyL,GAAa9B,QAAQ0F,KAAatG,MAAK,IAAM/I,MACrDmP,GACQ1D,GAAa9B,QAAQ0F,KAAatG,MAAK,IAAM4F,GAAcQ,QAG1EG,QAAS,SAAUC,EAAIrJ,GACnB,OAAOqJ,EAAKC,EAAAA,EACR,IAAI/D,IAAa,CAAC9B,EAAS+C,KACvB,IAAI+C,EAAShO,YAAW,IAAMiL,EAAO,IAAIzF,EAAWyI,QAAQxJ,KAAOqJ,GACnEnK,KAAK2D,KAAKY,EAAS+C,GAAQ0C,QAAQO,aAAanP,KAAK,KAAMiP,OAC1DrK,QAGK,oBAAXT,QAA0BA,OAAOF,aACxChF,EAAQgM,GAAanL,UAAWqE,OAAOF,YAAa,iBACxDqG,GAAUM,IAAMwE,KAQhBvQ,EAAMoM,GAAc,CAChBoE,IAAK,WACD,IAAIC,EAAS9K,EAAW7B,MAAM,KAAMgC,WAC/B7B,IAAIyM,IACT,OAAO,IAAItE,IAAa,SAAU9B,EAAS+C,GACjB,IAAlBoD,EAAO/N,QACP4H,EAAQ,IACZ,IAAIqG,EAAYF,EAAO/N,OACvB+N,EAAOnR,SAAQ,CAACuE,EAAGrB,IAAM4J,GAAa9B,QAAQzG,GAAG6F,MAAKxE,IAClDuL,EAAOjO,GAAK0C,IACLyL,GACHrG,EAAQmG,KACbpD,SAGX/C,QAAS3J,GACDA,aAAiByL,GACVzL,EACPA,GAA+B,mBAAfA,EAAM+I,KACf,IAAI0C,IAAa,CAAC9B,EAAS+C,KAC9B1M,EAAM+I,KAAKY,EAAS+C,MAEnB,IAAIjB,GAAanC,IAAU,EAAMtJ,GAG9C0M,OAAQiC,GACRsB,KAAM,WACF,IAAIH,EAAS9K,EAAW7B,MAAM,KAAMgC,WAAW7B,IAAIyM,IACnD,OAAO,IAAItE,IAAa,CAAC9B,EAAS+C,KAC9BoD,EAAOxM,KAAItD,GAASyL,GAAa9B,QAAQ3J,GAAO+I,KAAKY,EAAS+C,SAGtEpB,IAAK,CACDzL,IAAK,IAAMyL,GACXxL,IAAKE,GAASsL,GAAMtL,GAExBoM,YAAa,CAAEvM,IAAK,IAAMuM,IAC1B8D,OAAQC,GACR9B,OAAQA,GACR+B,UAAW,CACPvQ,IAAK,IAAMuK,GACXtK,IAAKE,IAAWoK,GAAOpK,IAE3B6K,gBAAiB,CACbhL,IAAK,IAAMgL,GACX/K,IAAKE,IAAW6K,GAAkB7K,IAEtCqQ,OAAQ,CAAC9O,EAAI+O,IACF,IAAI7E,IAAa,CAAC9B,EAAS+C,IACvByD,IAAS,CAACxG,EAAS+C,KACtB,IAAId,EAAMN,GACVM,EAAIX,WAAa,GACjBW,EAAIV,YAAcwB,EAClBd,EAAIP,SAAWnD,GAAS,YAuKxC,SAAkD3G,GAC9C,SAASgP,IACLhP,IACAiK,GAAe3I,OAAO2I,GAAerJ,QAAQoO,GAAY,GAE7D/E,GAAevJ,KAAKsO,KAClBhF,GACFnB,IAAK,KAC2B,KAAtBmB,IACFsC,OACL,IAhLa2C,EAAyC,KACV,IAA3BpL,KAAK6F,WAAWlJ,OAAe4H,IAAY+C,EAAOtH,KAAK6F,WAAW,SAEvEW,EAAIP,UACP9J,MACD+O,EAAW3G,EAAS+C,OAI/BxC,KACIA,GAAcuG,YACdhR,EAAQgM,GAAc,cAAc,WAChC,MAAMiF,EAAmB1L,EAAW7B,MAAM,KAAMgC,WAAW7B,IAAIyM,IAC/D,OAAO,IAAItE,IAAa9B,IACY,IAA5B+G,EAAiB3O,QACjB4H,EAAQ,IACZ,IAAIqG,EAAYU,EAAiB3O,OACjC,MAAM4O,EAAU,IAAIpS,MAAMyR,GAC1BU,EAAiB/R,SAAQ,CAAC8O,EAAG5L,IAAM4J,GAAa9B,QAAQ8D,GAAG1E,MAAK/I,GAAS2Q,EAAQ9O,GAAK,CAAE+O,OAAQ,YAAa5Q,MAAAA,KAASuN,GAAUoD,EAAQ9O,GAAK,CAAE+O,OAAQ,WAAYrD,OAAAA,KAC9JxE,MAAK,MAAQiH,GAAarG,EAAQgH,aAG/CzG,GAAc9F,KAAiC,oBAAnByM,gBAC5BpR,EAAQgM,GAAc,OAAO,WACzB,MAAMiF,EAAmB1L,EAAW7B,MAAM,KAAMgC,WAAW7B,IAAIyM,IAC/D,OAAO,IAAItE,IAAa,CAAC9B,EAAS+C,KACE,IAA5BgE,EAAiB3O,QACjB2K,EAAO,IAAImE,eAAe,KAC9B,IAAIb,EAAYU,EAAiB3O,OACjC,MAAMsE,EAAW,IAAI9H,MAAMyR,GAC3BU,EAAiB/R,SAAQ,CAAC8O,EAAG5L,IAAM4J,GAAa9B,QAAQ8D,GAAG1E,MAAK/I,GAAS2J,EAAQ3J,KAAQ8Q,IACrFzK,EAASxE,GAAKiP,IACPd,GACHtD,EAAO,IAAImE,eAAexK,gBAkLlD,MAAM0K,GAAO,CAAEC,OAAQ,EAAGC,OAAQ,EAAGlG,GAAI,GACzC,IAAImG,GAAc,EACdC,GAAY,GACZC,GAAa,EACbhF,GAAc,EACdiF,GAAkB,EACtB,SAASlB,GAAS5O,EAAIlC,EAAOiS,EAAIC,GAC7B,IAAIC,EAASlG,GAAKM,EAAMvN,OAAOkC,OAAOiR,GACtC5F,EAAI4F,OAASA,EACb5F,EAAIZ,IAAM,EACVY,EAAIzN,QAAS,EACbyN,EAAIb,KAAOsG,GACXvG,GAAUM,IACVQ,EAAIR,IAAMjB,GAAqB,CAC3BtL,QAAS4M,GACTgG,YAAa,CAAEzR,MAAOyL,GAAc1L,cAAc,EAAME,UAAU,GAClE4P,IAAKpE,GAAaoE,IAClBI,KAAMxE,GAAawE,KACnBQ,WAAYhF,GAAagF,WACzBrM,IAAKqH,GAAarH,IAClBuF,QAAS8B,GAAa9B,QACtB+C,OAAQjB,GAAaiB,QACrB,GACArN,GACAb,EAAOoN,EAAKvM,KACdmS,EAAOxG,IACTY,EAAIP,SAAW,aACTjG,KAAKoM,OAAOxG,KAAO5F,KAAKoM,OAAOnG,YAErC,IAAIzJ,EAAKyM,GAAOzC,EAAKrK,EAAI+P,EAAIC,GAG7B,OAFgB,IAAZ3F,EAAIZ,KACJY,EAAIP,WACDzJ,EAEX,SAAS8P,KAKL,OAJKX,GAAKhG,KACNgG,GAAKhG,KAAOmG,MACdH,GAAKC,OACPD,GAAKE,QAjbe,IAkbbF,GAAKhG,GAEhB,SAAS0B,KACL,QAAKsE,GAAKC,SAEY,KAAhBD,GAAKC,SACPD,GAAKhG,GAAK,GACdgG,GAAKE,OAzbe,IAybNF,GAAKC,QACZ,GAKX,SAASjB,GAAyB4B,GAC9B,OAAIZ,GAAKE,QAAUU,GAAmBA,EAAgB1N,cAAgBiG,IAClEwH,KACOC,EAAgB5I,MAAKxE,IACxBkI,KACOlI,KACR6J,IACC3B,KACOmF,GAAUxD,OAGlBuD,EAEX,SAASE,GAAcC,KACjB1F,GACG2E,GAAKE,QAA4B,KAAhBF,GAAKE,SACvBF,GAAKE,OAASF,GAAKC,OAASD,GAAKhG,GAAK,GAE1CoG,GAAUlP,KAAKqJ,IACfyD,GAAa+C,GAAY,GAE7B,SAASC,KACL,IAAIhF,EAAOoE,GAAUA,GAAUpP,OAAS,GACxCoP,GAAUa,MACVjD,GAAahC,GAAM,GAEvB,SAASgC,GAAa+C,EAAYG,GAC9B,IAAIC,EAAc5G,GAIlB,IAHI2G,GAAgBlB,GAAKE,QAAYG,MAAgBU,IAAexG,IAAO8F,MAAkBA,IAAcU,IAAexG,KACtHd,eAAeyH,EAAgBJ,GAAcrR,KAAK,KAAMsR,GAAcC,IAEtED,IAAexG,KAEnBA,GAAMwG,EACFI,IAAgBpH,KAChBA,GAAUM,IAAMwE,MAChBzF,IAAoB,CACpB,IAAIgI,EAAgBrH,GAAUM,IAAIvM,QAC9BuT,EAAYN,EAAW1G,KACvB8G,EAAY/T,QAAU2T,EAAW3T,UACjCE,OAAOqB,eAAe3B,EAAS,UAAWqU,EAAUX,aACpDU,EAActC,IAAMuC,EAAUvC,IAC9BsC,EAAclC,KAAOmC,EAAUnC,KAC/BkC,EAAcxI,QAAUyI,EAAUzI,QAClCwI,EAAczF,OAAS0F,EAAU1F,OAC7B0F,EAAU3B,aACV0B,EAAc1B,WAAa2B,EAAU3B,YACrC2B,EAAUhO,MACV+N,EAAc/N,IAAMgO,EAAUhO,OAI9C,SAASwL,KACL,IAAIuC,EAAgBpU,EAAQc,QAC5B,OAAOsL,GAAqB,CACxBtL,QAASsT,EACTV,YAAapT,OAAOoC,yBAAyB1C,EAAS,WACtD8R,IAAKsC,EAActC,IACnBI,KAAMkC,EAAclC,KACpBQ,WAAY0B,EAAc1B,WAC1BrM,IAAK+N,EAAc/N,IACnBuF,QAASwI,EAAcxI,QACvB+C,OAAQyF,EAAczF,QACtB,GAER,SAAS2B,GAAOzC,EAAKrK,EAAI+P,EAAIC,EAAIc,GAC7B,IAAIvD,EAAaxD,GACjB,IAEI,OADAyD,GAAanD,GAAK,GACXrK,EAAG+P,EAAIC,EAAIc,GAEtB,QACItD,GAAaD,GAAY,IAGjC,SAASjC,GAA0BtL,EAAIwL,EAAMR,EAAeC,GACxD,MAAqB,mBAAPjL,EAAoBA,EAAK,WACnC,IAAI+Q,EAAYhH,GACZiB,GACAmF,KACJ3C,GAAahC,GAAM,GACnB,IACI,OAAOxL,EAAG4B,MAAMiC,KAAMD,WAE1B,QACI4J,GAAauD,GAAW,GACpB9F,GACAhC,eAAeiC,MAI/B,SAAS8F,GAAoBxE,GACrBlP,UAAYqL,IAAiC,IAAhB6G,GAAKE,OACf,IAAfG,GACArD,IAGAyE,uBAAuBzE,GAI3BtM,WAAWsM,EAAI,IAxGoC,KAAtD,GAAK9D,IAAmB9H,QAAQ,mBACjCuP,GAA0BjF,GAA0B5E,GA0GxD,IAAI+J,GAAYnG,GAAaiB,OAE7B,SAAS+F,GAAgBC,EAAIC,EAAMC,EAAYrR,GAC3C,GAAKmR,EAAGG,QAAWH,EAAG5G,OAAOgH,cAAkBxH,GAAIyH,YAAeL,EAAGM,MAWhE,CACD,IAAIC,EAAQP,EAAGQ,mBAAmBP,EAAMC,EAAYF,EAAGS,WACvD,IACIF,EAAM1S,SACNmS,EAAG5G,OAAOsH,eAAiB,EAE/B,MAAO9F,GACH,OAAIA,EAAGrH,OAASa,EAASuM,cAAgBX,EAAGY,YAAcZ,EAAG5G,OAAOsH,eAAiB,GACjFG,QAAQC,KAAK,4BACbd,EAAGe,MAAM,CAAEC,iBAAiB,IACrBhB,EAAGiB,OAAO5K,MAAK,IAAM0J,GAAgBC,EAAIC,EAAMC,EAAYrR,MAE/DqQ,GAAUtE,GAErB,OAAO2F,EAAMW,SAASjB,GAAM,CAAChJ,EAAS+C,IAC3ByD,IAAS,KACZ7E,GAAI2H,MAAQA,EACL1R,EAAGoI,EAAS+C,EAAQuG,QAEhClK,MAAK8K,IACJ,GAAa,cAATlB,EACA,IACIM,EAAMa,SAASC,SAEnB,OACJ,MAAgB,aAATpB,EAAsBkB,EAASZ,EAAMe,YAAYjL,MAAK,IAAM8K,OAnCvE,GAAInB,EAAG5G,OAAOgH,aACV,OAAOlB,GAAU,IAAI3K,EAAWrB,eAAe8M,EAAG5G,OAAOmI,cAE7D,IAAKvB,EAAG5G,OAAOoI,cAAe,CAC1B,IAAKxB,EAAG5G,OAAOqI,SACX,OAAOvC,GAAU,IAAI3K,EAAWrB,gBACpC8M,EAAGiB,OAAO3E,MAAMnH,GAEpB,OAAO6K,EAAG5G,OAAOsI,eAAerL,MAAK,IAAM0J,GAAgBC,EAAIC,EAAMC,EAAYrR,KAgCzF,MACM8S,GAAYC,OAAOC,aAAa,OAEhCC,GAAuB,oGAEvBC,GAAc,GAKpB,SAASC,GAAQC,EAASC,GACtB,OAAOD,EACHC,EACI,WAAc,OAAOD,EAAQxR,MAAMiC,KAAMD,YAAcyP,EAAQzR,MAAMiC,KAAMD,YAC3EwP,EACJC,EAGR,MAAMC,GAAW,CACb5F,KAAM,EACN6F,OAAQtF,EAAAA,EACRuF,WAAW,EACXC,MAAO,CAAC,IACRC,WAAW,GAGf,SAASC,GAA8BvT,GACnC,MAA0B,iBAAZA,GAAyB,KAAKwH,KAAKxH,GAQ1ClD,GAAQA,EAPRA,SACsB6D,IAAjB7D,EAAIkD,IAA2BA,KAAWlD,UAC1CA,EAAM0F,EAAU1F,IACLkD,GAERlD,GAKnB,SAAS0W,KACL,MAAMlO,EAAWM,OAGrB,SAAS6N,GAAIlS,EAAG9B,GACZ,IACI,MAAMiU,EAAKpG,GAAK/L,GACVoS,EAAKrG,GAAK7N,GAChB,GAAIiU,IAAOC,EACP,MAAW,UAAPD,EACO,EACA,UAAPC,GACQ,EACD,WAAPD,EACO,EACA,WAAPC,GACQ,EACD,WAAPD,EACO,EACA,WAAPC,GACQ,EACD,SAAPD,EACO,EACA,SAAPC,EACOC,KACH,EAEZ,OAAQF,GACJ,IAAK,SACL,IAAK,OACL,IAAK,SACD,OAAOnS,EAAI9B,EAAI,EAAI8B,EAAI9B,GAAK,EAAI,EACpC,IAAK,SACD,OAoBhB,SAA4B8B,EAAG9B,GAC3B,MAAMoU,EAAKtS,EAAEnB,OACP0T,EAAKrU,EAAEW,OACPD,EAAI0T,EAAKC,EAAKD,EAAKC,EACzB,IAAK,IAAI5T,EAAI,EAAGA,EAAIC,IAAKD,EACrB,GAAIqB,EAAErB,KAAOT,EAAES,GACX,OAAOqB,EAAErB,GAAKT,EAAES,IAAM,EAAI,EAElC,OAAO2T,IAAOC,EAAK,EAAID,EAAKC,GAAM,EAAI,EA5BnBC,CAAmBC,GAAczS,GAAIyS,GAAcvU,IAE9D,IAAK,QACD,OAMhB,SAAuB8B,EAAG9B,GACtB,MAAMoU,EAAKtS,EAAEnB,OACP0T,EAAKrU,EAAEW,OACPD,EAAI0T,EAAKC,EAAKD,EAAKC,EACzB,IAAK,IAAI5T,EAAI,EAAGA,EAAIC,IAAKD,EAAG,CACxB,MAAMyG,EAAM8M,GAAIlS,EAAErB,GAAIT,EAAES,IACxB,GAAY,IAARyG,EACA,OAAOA,EAEf,OAAOkN,IAAOC,EAAK,EAAID,EAAKC,GAAM,EAAI,EAfnBG,CAAc1S,EAAG9B,IAGpC,OACA,OAAOmU,IAuBX,SAAStG,GAAK1K,GACV,MAAMf,SAAWe,EACjB,GAAU,WAANf,EACA,OAAOA,EACX,GAAIqS,YAAYC,OAAOvR,GACnB,MAAO,SACX,MAAMwR,EAAQtR,EAAYF,GAC1B,MAAiB,gBAAVwR,EAA0B,SAAWA,EAEhD,SAASJ,GAAczS,GACnB,OAAIA,aAAa8G,WACN9G,EACP2S,YAAYC,OAAO5S,GACZ,IAAI8G,WAAW9G,EAAE8S,OAAQ9S,EAAE+S,WAAY/S,EAAEgT,YAC7C,IAAIlM,WAAW9G,GAG1B,MAAMiT,GACFC,OAAOzD,EAAMpR,EAAI8U,GACb,MAAMpD,EAAQ7N,KAAKkR,KAAOhL,GAAI2H,MACxBsD,EAAYnR,KAAKa,KACjB8K,EAAO9H,IAA4B,oBAAZsK,SAA2BA,QAAQiD,YAAcjD,QAAQiD,WAAW,UAAmB,aAAT7D,EAAsB,OAAS,WAAWvN,KAAKa,QAC1J,SAASwQ,EAAwB9M,EAAS+C,EAAQuG,GAC9C,IAAKA,EAAMyD,OAAOH,GACd,MAAM,IAAItP,EAAW0P,SAAS,SAAWJ,EAAY,4BACzD,OAAOhV,EAAG0R,EAAMa,SAAUb,GAE9B,MAAM3E,EAAcpB,KACpB,IACI,IAAIO,EAAIwF,GAASA,EAAMP,GAAGkE,SAAWxR,KAAKsN,GAAGkE,OACzC3D,IAAU3H,GAAI2H,MACVA,EAAMW,SAASjB,EAAM8D,EAAyBJ,GAC9ClG,IAAS,IAAM8C,EAAMW,SAASjB,EAAM8D,EAAyBJ,IAAc,CAAEpD,MAAOA,EAAO4D,UAAWvL,GAAIuL,WAAavL,KAC3HmH,GAAgBrN,KAAKsN,GAAIC,EAAM,CAACvN,KAAKa,MAAOwQ,GAQhD,OAPI1F,IACAtD,EAAEX,aAAeiE,EACjBtD,EAAIA,EAAEuB,OAAMG,IACRoE,QAAQuD,MAAM3H,GACPyC,GAAUzC,OAGlB1B,EAEX,QACQa,GACAjB,MAGZxN,IAAIkX,EAAWhJ,GACX,OAAIgJ,GAAaA,EAAU9S,cAAgB5F,OAChC+G,KAAK4R,MAAMD,GAAWE,MAAMlJ,GACtB,MAAbgJ,EACOnF,GAAU,IAAI3K,EAAWM,KAAK,oCAClCnC,KAAKgR,OAAO,YAAanD,GACrB7N,KAAK8R,KAAKrX,IAAI,CAAEoT,MAAAA,EAAOrU,IAAKmY,IAC9BhO,MAAKT,GAAOlD,KAAK+R,KAAKC,QAAQC,KAAK/O,OACzCS,KAAKgF,GAEZiJ,MAAMM,GACF,GAA2B,iBAAhBA,EACP,OAAO,IAAIlS,KAAKsN,GAAG6E,YAAYnS,KAAMkS,GACzC,GAAIhZ,EAAQgZ,GACR,OAAO,IAAIlS,KAAKsN,GAAG6E,YAAYnS,KAAM,IAAIkS,EAAY/Q,KAAK,SAC9D,MAAMiR,EAAWpZ,EAAKkZ,GACtB,GAAwB,IAApBE,EAASzV,OACT,OAAOqD,KACF4R,MAAMQ,EAAS,IACfC,OAAOH,EAAYE,EAAS,KACrC,MAAME,EAAgBtS,KAAKsR,OAAOiB,QAAQ3U,OAAOoC,KAAKsR,OAAOkB,SAASnU,QAAOoU,IACzE,GAAIA,EAAGC,UACHN,EAASO,OAAMpW,GAAWkW,EAAGlW,QAAQQ,QAAQR,IAAY,IAAI,CAC7D,IAAK,IAAIE,EAAI,EAAGA,EAAI2V,EAASzV,SAAUF,EACnC,IAAyC,IAArC2V,EAASrV,QAAQ0V,EAAGlW,QAAQE,IAC5B,OAAO,EAEf,OAAO,EAEX,OAAO,KACRmW,MAAK,CAAC9U,EAAG9B,IAAM8B,EAAEvB,QAAQI,OAASX,EAAEO,QAAQI,SAAQ,GACvD,GAAI2V,GAAiBtS,KAAKsN,GAAGuF,UAAY5D,GAAW,CAChD,MAAM6D,EAAuBR,EAAc/V,QAAQf,MAAM,EAAG4W,EAASzV,QACrE,OAAOqD,KACF4R,MAAMkB,GACNT,OAAOS,EAAqB5U,KAAI6U,GAAMb,EAAYa,OAEtDT,GAAiBzO,IAClBsK,QAAQC,KAAK,aAAa4E,KAAKC,UAAUf,SAAmBlS,KAAKa,6CAC1CuR,EAASjR,KAAK,SACzC,MAAM+R,UAAEA,GAAclT,KAAKsR,OACrB6B,EAAMnT,KAAKsN,GAAG8F,MAAMC,UAC1B,SAAShB,EAAOvU,EAAG9B,GACf,OAAyB,IAAlBmX,EAAInD,IAAIlS,EAAG9B,GAEtB,MAAOsX,EAAKC,GAAkBnB,EAASzQ,QAAO,EAAE6R,EAAWC,GAAelX,KACtE,MAAMmX,EAAQR,EAAU3W,GAClB3B,EAAQsX,EAAY3V,GAC1B,MAAO,CACHiX,GAAaE,EACbF,IAAcE,EACVpE,GAAQmE,EAAcC,GAASA,EAAMC,MACjCxU,IACI,MAAMpF,EAAOuC,EAAa6C,EAAG5C,GAC7B,OAAOrD,EAAQa,IAASA,EAAKqO,MAAKgB,GAAQiJ,EAAOzX,EAAOwO,MACxDjK,GAAKkT,EAAOzX,EAAO0B,EAAa6C,EAAG5C,KACzCkX,KAEX,CAAC,KAAM,OACV,OAAOH,EACHtT,KAAK4R,MAAM0B,EAAIzS,MAAMwR,OAAOH,EAAYoB,EAAI/W,UACvC8B,OAAOkV,GACZjB,EACItS,KAAK3B,OAAOkV,GACZvT,KAAK4R,MAAMQ,GAAUC,OAAO,IAExChU,OAAOkV,GACH,OAAOvT,KAAK4T,eAAeC,IAAIN,GAEnCO,MAAMC,GACF,OAAO/T,KAAK4T,eAAeE,MAAMC,GAErCC,OAAOA,GACH,OAAOhU,KAAK4T,eAAeI,OAAOA,GAEtCC,MAAMC,GACF,OAAOlU,KAAK4T,eAAeK,MAAMC,GAErCC,KAAKlP,GACD,OAAOjF,KAAK4T,eAAeO,KAAKlP,GAEpCmP,QAAQL,GACJ,OAAO/T,KAAK4T,eAAeQ,QAAQL,GAEvCH,eACI,OAAO,IAAI5T,KAAKsN,GAAG+G,WAAW,IAAIrU,KAAKsN,GAAG6E,YAAYnS,OAE1DsU,QAAQZ,GACJ,OAAO,IAAI1T,KAAKsN,GAAG+G,WAAW,IAAIrU,KAAKsN,GAAG6E,YAAYnS,KAAM9G,EAAQwa,GAChE,IAAIA,EAAMvS,KAAK,QACfuS,IAERa,UACI,OAAOvU,KAAK4T,eAAeW,UAE/BC,WAAW3V,GACP,MAAMyO,GAAEA,EAAIzM,KAAMsQ,GAAcnR,KAChCA,KAAKsR,OAAOmD,YAAc5V,EACtBA,EAAY3D,qBAAqB6U,KACjClR,EAAc,cAAcA,EACpByO,SAAO,OAAOA,EAClBoH,QAAU,OAAOvD,KAGzB,MAAMwD,EAAiB,IAAIpW,IAC3B,IAAK,IAAIrE,EAAQ2E,EAAY3D,UAAWhB,EAAOA,EAAQR,EAASQ,GAC5DjB,OAAO2b,oBAAoB1a,GAAOX,SAAQsb,GAAYF,EAAeG,IAAID,KAE7E,MAAME,EAAY1b,IACd,IAAKA,EACD,OAAOA,EACX,MAAM6J,EAAMjK,OAAOkC,OAAO0D,EAAY3D,WACtC,IAAK,IAAIyC,KAAKtE,EACV,IAAKsb,EAAe/V,IAAIjB,GACpB,IACIuF,EAAIvF,GAAKtE,EAAIsE,GAEjB,MAAOqX,IACf,OAAO9R,GAOX,OALIlD,KAAKsR,OAAOyD,UACZ/U,KAAK+R,KAAKC,QAAQiD,YAAYjV,KAAKsR,OAAOyD,UAE9C/U,KAAKsR,OAAOyD,SAAWA,EACvB/U,KAAK+R,KAAK,UAAWgD,GACdlW,EAEXqW,cAII,OAAOlV,KAAKwU,YAHZ,SAAeW,GACX/b,EAAO4G,KAAMmV,MAIrBL,IAAIzb,EAAKG,GACL,MAAM4b,KAAEA,EAAI7Y,QAAEA,GAAYyD,KAAKsR,OAAOkB,QACtC,IAAI6C,EAAWhc,EAIf,OAHIkD,GAAW6Y,IACXC,EAAWvF,GAA8BvT,EAA9BuT,CAAuCzW,IAE/C2G,KAAKgR,OAAO,aAAanD,GACrB7N,KAAK8R,KAAKwD,OAAO,CAAEzH,MAAAA,EAAOhE,KAAM,MAAO7Q,KAAa,MAAPQ,EAAc,CAACA,GAAO,KAAMkR,OAAQ,CAAC2K,OAC1F1R,MAAKT,GAAOA,EAAIqS,YAAclP,GAAaiB,OAAOpE,EAAIjC,SAAS,IAAMiC,EAAIsS,aACvE7R,MAAK6R,IACN,GAAIjZ,EACA,IACIY,EAAa9D,EAAKkD,EAASiZ,GAE/B,MAAOR,IAEX,OAAOQ,KAGfC,OAAOC,EAAalS,GAChB,GAA2B,iBAAhBkS,GAA6Bxc,EAAQwc,GAO5C,OAAO1V,KAAK4R,MAAM,OAAOS,OAAOqD,GAAaC,OAAOnS,GAPM,CAC1D,MAAMhK,EAAM8C,EAAaoZ,EAAa1V,KAAKsR,OAAOkB,QAAQjW,SAC1D,YAAYW,IAAR1D,EACOgT,GAAU,IAAI3K,EAAW+T,gBAAgB,kDAC7C5V,KAAK4R,MAAM,OAAOS,OAAO7Y,GAAKmc,OAAOnS,IAMpDqS,IAAIxc,EAAKG,GACL,MAAM4b,KAAEA,EAAI7Y,QAAEA,GAAYyD,KAAKsR,OAAOkB,QACtC,IAAI6C,EAAWhc,EAIf,OAHIkD,GAAW6Y,IACXC,EAAWvF,GAA8BvT,EAA9BuT,CAAuCzW,IAE/C2G,KAAKgR,OAAO,aAAanD,GAAS7N,KAAK8R,KAAKwD,OAAO,CAAEzH,MAAAA,EAAOhE,KAAM,MAAOa,OAAQ,CAAC2K,GAAWrc,KAAa,MAAPQ,EAAc,CAACA,GAAO,SAC3HmK,MAAKT,GAAOA,EAAIqS,YAAclP,GAAaiB,OAAOpE,EAAIjC,SAAS,IAAMiC,EAAIsS,aACzE7R,MAAK6R,IACN,GAAIjZ,EACA,IACIY,EAAa9D,EAAKkD,EAASiZ,GAE/B,MAAOR,IAEX,OAAOQ,KAGfM,OAAOtc,GACH,OAAOwG,KAAKgR,OAAO,aAAanD,GAAS7N,KAAK8R,KAAKwD,OAAO,CAAEzH,MAAAA,EAAOhE,KAAM,SAAU7Q,KAAM,CAACQ,OACrFmK,MAAKT,GAAOA,EAAIqS,YAAclP,GAAaiB,OAAOpE,EAAIjC,SAAS,SAAM/D,IAE9E6Y,QACI,OAAO/V,KAAKgR,OAAO,aAAanD,GAAS7N,KAAK8R,KAAKwD,OAAO,CAAEzH,MAAAA,EAAOhE,KAAM,cAAemM,MAAOvG,OAC1F9L,MAAKT,GAAOA,EAAIqS,YAAclP,GAAaiB,OAAOpE,EAAIjC,SAAS,SAAM/D,IAE9E+Y,QAAQjd,GACJ,OAAOgH,KAAKgR,OAAO,YAAYnD,GACpB7N,KAAK8R,KAAKoE,QAAQ,CACrBld,KAAAA,EACA6U,MAAAA,IACDlK,MAAK8K,GAAUA,EAAOvQ,KAAIgF,GAAOlD,KAAK+R,KAAKC,QAAQC,KAAK/O,SAGnEiT,QAAQC,EAASC,EAAe7b,GAC5B,MAAMxB,EAAOG,MAAMD,QAAQmd,GAAiBA,OAAgBnZ,EAEtDoZ,GADN9b,EAAUA,IAAYxB,OAAOkE,EAAYmZ,IACX7b,EAAQ+b,aAAUrZ,EAChD,OAAO8C,KAAKgR,OAAO,aAAanD,IAC5B,MAAMuH,KAAEA,EAAI7Y,QAAEA,GAAYyD,KAAKsR,OAAOkB,QACtC,GAAIjW,GAAWvD,EACX,MAAM,IAAI6I,EAAW+T,gBAAgB,gEACzC,GAAI5c,GAAQA,EAAK2D,SAAWyZ,EAAQzZ,OAChC,MAAM,IAAIkF,EAAW+T,gBAAgB,wDACzC,MAAMY,EAAaJ,EAAQzZ,OAC3B,IAAI8Z,EAAela,GAAW6Y,EAC1BgB,EAAQlY,IAAI4R,GAA8BvT,IAC1C6Z,EACJ,OAAOpW,KAAK8R,KAAKwD,OAAO,CAAEzH,MAAAA,EAAOhE,KAAM,MAAO7Q,KAAMA,EAAM0R,OAAQ+L,EAAcH,YAAAA,IAC3E3S,MAAK,EAAG4R,YAAAA,EAAahK,QAAAA,EAASiK,WAAAA,EAAYvU,SAAAA,MAE3C,GAAoB,IAAhBsU,EACA,OAFWe,EAAc/K,EAAUiK,EAGvC,MAAM,IAAIjU,EAAU,GAAGvB,KAAKa,mBAAmB0U,QAAkBiB,sBAAgCvV,SAI7GyV,QAAQN,EAASC,EAAe7b,GAC5B,MAAMxB,EAAOG,MAAMD,QAAQmd,GAAiBA,OAAgBnZ,EAEtDoZ,GADN9b,EAAUA,IAAYxB,OAAOkE,EAAYmZ,IACX7b,EAAQ+b,aAAUrZ,EAChD,OAAO8C,KAAKgR,OAAO,aAAanD,IAC5B,MAAMuH,KAAEA,EAAI7Y,QAAEA,GAAYyD,KAAKsR,OAAOkB,QACtC,GAAIjW,GAAWvD,EACX,MAAM,IAAI6I,EAAW+T,gBAAgB,gEACzC,GAAI5c,GAAQA,EAAK2D,SAAWyZ,EAAQzZ,OAChC,MAAM,IAAIkF,EAAW+T,gBAAgB,wDACzC,MAAMY,EAAaJ,EAAQzZ,OAC3B,IAAIga,EAAepa,GAAW6Y,EAC1BgB,EAAQlY,IAAI4R,GAA8BvT,IAC1C6Z,EACJ,OAAOpW,KAAK8R,KAAKwD,OAAO,CAAEzH,MAAAA,EAAOhE,KAAM,MAAO7Q,KAAMA,EAAM0R,OAAQiM,EAAcL,YAAAA,IAC3E3S,MAAK,EAAG4R,YAAAA,EAAahK,QAAAA,EAASiK,WAAAA,EAAYvU,SAAAA,MAE3C,GAAoB,IAAhBsU,EACA,OAFWe,EAAc/K,EAAUiK,EAGvC,MAAM,IAAIjU,EAAU,GAAGvB,KAAKa,mBAAmB0U,QAAkBiB,sBAAgCvV,SAI7G2V,WAAWC,GACP,MAAMC,EAAY9W,KAAK8R,KACjB9Y,EAAO6d,EAAe3Y,KAAK6Y,GAAUA,EAAMvd,MAC3Cwd,EAAcH,EAAe3Y,KAAK6Y,GAAUA,EAAME,UAClDC,EAAY,GAClB,OAAOlX,KAAKgR,OAAO,aAAcnD,GACtBiJ,EAAUZ,QAAQ,CAAErI,MAAAA,EAAO7U,KAAAA,EAAMme,MAAO,UAAWxT,MAAMyT,IAC5D,MAAMC,EAAa,GACbC,EAAa,GACnBT,EAAetd,SAAQ,EAAGC,IAAAA,EAAKyd,QAAAA,GAAW3D,KACtC,MAAMja,EAAM+d,EAAK9D,GACjB,GAAIja,EAAK,CACL,IAAK,MAAMkD,KAAWtD,OAAOD,KAAKie,GAAU,CACxC,MAAMrc,EAAQqc,EAAQ1a,GACtB,GAAIA,IAAYyD,KAAKsR,OAAOkB,QAAQjW,SAChC,GAAwB,IAApByT,GAAIpV,EAAOpB,GACX,MAAM,IAAIqI,EAAW0V,WAAW,kDAIpCpa,EAAa9D,EAAKkD,EAAS3B,GAGnCsc,EAAUra,KAAKyW,GACf+D,EAAWxa,KAAKrD,GAChB8d,EAAWza,KAAKxD,OAGxB,MAAMme,EAAaH,EAAW1a,OAC9B,OAAOma,EACFxB,OAAO,CACRzH,MAAAA,EACAhE,KAAM,MACN7Q,KAAMqe,EACN3M,OAAQ4M,EACRG,QAAS,CACLze,KAAAA,EACAge,YAAAA,KAGHrT,MAAK,EAAG4R,YAAAA,EAAatU,SAAAA,MACtB,GAAoB,IAAhBsU,EACA,OAAOiC,EACX,IAAK,MAAMxD,KAAU/a,OAAOD,KAAKiI,GAAW,CACxC,MAAMyW,EAAeR,EAAUS,OAAO3D,IACtC,GAAoB,MAAhB0D,EAAsB,CACtB,MAAMhM,EAAUzK,EAAS+S,UAClB/S,EAAS+S,GAChB/S,EAASyW,GAAgBhM,GAGjC,MAAM,IAAInK,EAAU,GAAGvB,KAAKa,sBAAsB0U,QAAkBiC,sBAAgCvW,WAKpH2W,WAAW5e,GACP,MAAM6e,EAAU7e,EAAK2D,OACrB,OAAOqD,KAAKgR,OAAO,aAAanD,GACrB7N,KAAK8R,KAAKwD,OAAO,CAAEzH,MAAAA,EAAOhE,KAAM,SAAU7Q,KAAMA,MACxD2K,MAAK,EAAG4R,YAAAA,EAAaC,WAAAA,EAAYvU,SAAAA,MAChC,GAAoB,IAAhBsU,EACA,OAAOC,EACX,MAAM,IAAIjU,EAAU,GAAGvB,KAAKa,sBAAsB0U,QAAkBsC,sBAA6B5W,OAK7G,SAAS6W,GAAOC,GACZ,IAAIC,EAAM,GACNxb,EAAK,SAAUyb,EAAWC,GAC1B,GAAIA,EAAY,CAEZ,IADA,IAAIzb,EAAIsD,UAAUpD,OAAQlB,EAAO,IAAItC,MAAMsD,EAAI,KACtCA,GACLhB,EAAKgB,EAAI,GAAKsD,UAAUtD,GAE5B,OADAub,EAAIC,GAAWE,UAAUpa,MAAM,KAAMtC,GAC9Bsc,EAEN,GAA2B,iBAAhB,EACZ,OAAOC,EAAIC,IAGnBzb,EAAG4b,aAAetD,EAClB,IAAK,IAAIrY,EAAI,EAAGC,EAAIqD,UAAUpD,OAAQF,EAAIC,IAAKD,EAC3CqY,EAAI/U,UAAUtD,IAElB,OAAOD,EACP,SAASsY,EAAImD,EAAWI,EAAeC,GACnC,GAAyB,iBAAdL,EACP,OAAOM,EAAoBN,GAC1BI,IACDA,EAAgB5U,IACf6U,IACDA,EAAkB7V,GACtB,IAAI+V,EAAU,CACVC,YAAa,GACbxG,KAAMqG,EACNH,UAAW,SAAUxP,IACwB,IAArC6P,EAAQC,YAAY1b,QAAQ4L,KAC5B6P,EAAQC,YAAY5b,KAAK8L,GACzB6P,EAAQvG,KAAOoG,EAAcG,EAAQvG,KAAMtJ,KAGnDsM,YAAa,SAAUtM,GACnB6P,EAAQC,YAAcD,EAAQC,YAAYpa,QAAO,SAAUlC,GAAM,OAAOA,IAAOwM,KAC/E6P,EAAQvG,KAAOuG,EAAQC,YAAY9W,OAAO0W,EAAeC,KAIjE,OADAN,EAAIC,GAAazb,EAAGyb,GAAaO,EAC1BA,EAEX,SAASD,EAAoBG,GACzB1f,EAAK0f,GAAKnf,SAAQ,SAAU0e,GACxB,IAAIxc,EAAOid,EAAIT,GACf,GAAI/e,EAAQuC,GACRqZ,EAAImD,EAAWS,EAAIT,GAAW,GAAIS,EAAIT,GAAW,QAEhD,CAAA,GAAa,SAATxc,EAaL,MAAM,IAAIoG,EAAW+T,gBAAgB,wBAZrC,IAAI4C,EAAU1D,EAAImD,EAAWvV,GAAQ,WAEjC,IADA,IAAIjG,EAAIsD,UAAUpD,OAAQlB,EAAO,IAAItC,MAAMsD,GACpCA,KACHhB,EAAKgB,GAAKsD,UAAUtD,GACxB+b,EAAQC,YAAYlf,SAAQ,SAAU4C,GAClCD,GAAO,WACHC,EAAG4B,MAAM,KAAMtC,iBAW3C,SAASkd,GAAqBzd,EAAW2D,GAErC,OADA/D,EAAO+D,GAAa7D,KAAK,CAAEE,UAAAA,IACpB2D,EAkBX,SAAS+Z,GAAgBb,EAAKc,GAC1B,QAASd,EAAI1Z,QAAU0Z,EAAIe,WAAaf,EAAIgB,MACvCF,EAAoBd,EAAIiB,WAAajB,EAAIkB,cAElD,SAASC,GAAUnB,EAAK5b,GACpB4b,EAAI1Z,OAASiR,GAAQyI,EAAI1Z,OAAQlC,GAErC,SAASgd,GAAgBpB,EAAKqB,EAASC,GACnC,IAAIC,EAAOvB,EAAIkB,aACflB,EAAIkB,aAAeK,EAAO,IAAMhK,GAAQgK,IAAQF,KAAaA,EAC7DrB,EAAIiB,UAAYK,IAAkBC,EAKtC,SAASC,GAAgBxB,EAAKyB,GAC1B,GAAIzB,EAAI0B,UACJ,OAAOD,EAAWE,WACtB,MAAMhG,EAAQ8F,EAAWG,kBAAkB5B,EAAIrE,OAC/C,IAAKA,EACD,MAAM,IAAI7R,EAAW+X,OAAO,WAAa7B,EAAIrE,MAAQ,oBAAsB8F,EAAW3Y,KAAO,mBACjG,OAAO6S,EAEX,SAASmG,GAAW9B,EAAKjB,EAAWjJ,GAChC,MAAM6F,EAAQ6F,GAAgBxB,EAAKjB,EAAUxF,QAC7C,OAAOwF,EAAU+C,WAAW,CACxBhM,MAAAA,EACAnD,QAASqN,EAAI+B,SACbvF,QAAqB,SAAZwD,EAAIgC,IACbC,SAAUjC,EAAIiC,OACdC,MAAO,CACHvG,MAAAA,EACAsC,MAAO+B,EAAI/B,SAIvB,SAASkE,GAAKnC,EAAK5b,EAAIge,EAAWrD,GAC9B,MAAMzY,EAAS0Z,EAAIkB,aAAe3J,GAAQyI,EAAI1Z,OAAQ0Z,EAAIkB,gBAAkBlB,EAAI1Z,OAChF,GAAK0Z,EAAIgB,GAGJ,CACD,MAAMre,EAAM,GACN0f,EAAQ,CAAChR,EAAMiR,EAAQC,KACzB,IAAKjc,GAAUA,EAAOgc,EAAQC,GAAS7L,GAAU4L,EAAOE,KAAK9L,KAAS1E,GAAOsQ,EAAOG,KAAKzQ,KAAO,CAC5F,IAAI2P,EAAaW,EAAOX,WACpBlgB,EAAM,GAAKkgB,EACH,yBAARlgB,IACAA,EAAM,GAAK,IAAIoL,WAAW8U,IACzB5f,EAAOY,EAAKlB,KACbkB,EAAIlB,IAAO,EACX2C,EAAGiN,EAAMiR,EAAQC,MAI7B,OAAO7gB,QAAQgR,IAAI,CACfsN,EAAIgB,GAAG0B,SAASL,EAAOD,GACvBO,GAAQb,GAAW9B,EAAKjB,EAAWqD,GAAYpC,EAAIe,UAAWsB,GAAQrC,EAAI+B,UAAY/B,EAAI4C,eAlB9F,OAAOD,GAAQb,GAAW9B,EAAKjB,EAAWqD,GAAY7K,GAAQyI,EAAIe,UAAWza,GAASlC,GAAK4b,EAAI+B,UAAY/B,EAAI4C,aAsBvH,SAASD,GAAQE,EAAevc,EAAQlC,EAAIwe,GACxC,IACIE,EAAYrR,GADDmR,EAAc,CAACxb,EAAG2b,EAAGhd,IAAM3B,EAAGwe,EAAYxb,GAAI2b,EAAGhd,GAAK3B,GAErE,OAAOye,EAAcjX,MAAK0W,IACtB,GAAIA,EACA,OAAOA,EAAO3e,OAAM,KAChB,IAAIof,EAAI,IAAMT,EAAOU,WAChB1c,IAAUA,EAAOgc,GAAQW,GAAYF,EAAIE,IAAUpe,IAASyd,EAAOE,KAAK3d,GAAMke,EAAIrY,KAAQuG,IAAOqR,EAAOG,KAAKxR,GAAI8R,EAAIrY,MACtHoY,EAAUR,EAAOzf,MAAOyf,GAAQW,GAAYF,EAAIE,IACpDF,UAMhB,MAAMG,GAAgB1b,SACtB,MAAM2b,GACFC,QAAQvgB,GACJ,QAAiBsC,IAAb8C,KAAK8U,IAAmB,CACxB,MAAMsG,EAAOpb,KAAK8U,IAClB,GAAI5b,EAAQkiB,GACR,MAAO,IAAKliB,EAAQ0B,GAASA,EAAQ,MAAQwgB,GAAMxI,OAEvD,GAAoB,iBAATwI,EACP,OAAQzD,OAAO/c,IAAU,GAAKwgB,EAClC,GAAoB,iBAATA,EACP,IACI,OAAOC,OAAOzgB,GAASwgB,EAE3B,MACI,OAAOC,OAAO,GAAKD,EAG3B,MAAM,IAAIhZ,UAAU,gBAAgBgZ,KAExC,QAAoBle,IAAhB8C,KAAKsb,OAAsB,CAC3B,MAAMC,EAAavb,KAAKsb,OACxB,GAAIpiB,EAAQqiB,GACR,OAAOriB,EAAQ0B,GAASA,EAAMyD,QAAO+K,IAASmS,EAAWC,SAASpS,KAAOwJ,OAAS,GAEtF,GAA0B,iBAAf2I,EACP,OAAO5D,OAAO/c,GAAS2gB,EAC3B,GAA0B,iBAAfA,EACP,IACI,OAAOF,OAAOzgB,GAAS2gB,EAE3B,MACI,OAAOF,OAAO,GAAKE,EAG3B,MAAM,IAAInZ,UAAU,sBAAsBmZ,KAE9C,MAAME,EAAkBzb,KAAK0b,gBAAgB,GAC7C,OAAID,GAAoC,iBAAV7gB,GAAsBA,EAAM+gB,WAAWF,GAC1Dzb,KAAK0b,cAAc,GAAK9gB,EAAMghB,UAAUH,EAAgB9e,QAE5D/B,EAEXiE,YAAYgd,GACR5iB,OAAO6iB,OAAO9b,KAAM6b,IAI5B,MAAMxH,GACF0H,MAAM5f,EAAIwM,GACN,IAAIoP,EAAM/X,KAAKgc,KACf,OAAOjE,EAAIkE,MACPlE,EAAIrD,MAAM1D,OAAO,KAAMxE,GAAUpR,KAAK,KAAM2c,EAAIkE,QAChDlE,EAAIrD,MAAM1D,OAAO,WAAY7U,GAAIwH,KAAKgF,GAE9CuT,OAAO/f,GACH,IAAI4b,EAAM/X,KAAKgc,KACf,OAAOjE,EAAIkE,MACPlE,EAAIrD,MAAM1D,OAAO,KAAMxE,GAAUpR,KAAK,KAAM2c,EAAIkE,QAChDlE,EAAIrD,MAAM1D,OAAO,YAAa7U,EAAI,UAE1CggB,cAAchgB,GACV,IAAI4b,EAAM/X,KAAKgc,KACfjE,EAAIe,UAAYxJ,GAAQyI,EAAIe,UAAW3c,GAE3Cse,SAASte,EAAIge,GACT,OAAOD,GAAKla,KAAKgc,KAAM7f,EAAIge,EAAWna,KAAKgc,KAAKtH,MAAM5C,MAE1DsK,MAAMniB,GACF,IAAIuC,EAAKvD,OAAOkC,OAAO6E,KAAKnB,YAAY3D,WAAY6c,EAAM9e,OAAOkC,OAAO6E,KAAKgc,MAI7E,OAHI/hB,GACAb,EAAO2e,EAAK9d,GAChBuC,EAAGwf,KAAOjE,EACHvb,EAEX6f,MAEI,OADArc,KAAKgc,KAAKrB,YAAc,KACjB3a,KAEXmU,KAAKhY,GACD,IAAI4b,EAAM/X,KAAKgc,KACf,OAAOhc,KAAK+b,OAAMlO,GAASqM,GAAKnC,EAAK5b,EAAI0R,EAAOkK,EAAIrD,MAAM5C,QAE9DgC,MAAMnL,GACF,OAAO3I,KAAK+b,OAAMlO,IACd,MAAMkK,EAAM/X,KAAKgc,KACXlF,EAAYiB,EAAIrD,MAAM5C,KAC5B,GAAI8G,GAAgBb,GAAK,GACrB,OAAOjB,EAAUhD,MAAM,CACnBjG,MAAAA,EACAoM,MAAO,CACHvG,MAAO6F,GAAgBxB,EAAKjB,EAAUxF,QACtC0E,MAAO+B,EAAI/B,SAEhBrS,MAAKmQ,GAASwI,KAAKC,IAAIzI,EAAOiE,EAAI9D,SAGrC,IAAIH,EAAQ,EACZ,OAAOoG,GAAKnC,GAAK,OAAUjE,GAAc,IAAUjG,EAAOiJ,GACrDnT,MAAK,IAAMmQ,OAErBnQ,KAAKgF,GAEZ6T,OAAOjgB,EAASoM,GACZ,MAAM8T,EAAQlgB,EAAQ0B,MAAM,KAAKsW,UAAWmI,EAAWD,EAAM,GAAIE,EAAYF,EAAM9f,OAAS,EAC5F,SAASigB,EAAOvjB,EAAKoD,GACjB,OAAIA,EACOmgB,EAAOvjB,EAAIojB,EAAMhgB,IAAKA,EAAI,GAC9BpD,EAAIqjB,GAEf,IAAIG,EAA0B,SAAlB7c,KAAKgc,KAAKjC,IAAiB,GAAK,EAC5C,SAAS+C,EAAOhf,EAAG9B,GACf,IAAI+gB,EAAOH,EAAO9e,EAAG6e,GAAYK,EAAOJ,EAAO5gB,EAAG2gB,GAClD,OAAOI,EAAOC,GAAQH,EAAQE,EAAOC,EAAOH,EAAQ,EAExD,OAAO7c,KAAKoU,SAAQ,SAAUtW,GAC1B,OAAOA,EAAE8U,KAAKkK,MACfnZ,KAAKgF,GAEZyL,QAAQzL,GACJ,OAAO3I,KAAK+b,OAAMlO,IACd,IAAIkK,EAAM/X,KAAKgc,KACf,GAAgB,SAAZjE,EAAIgC,KAAkBnB,GAAgBb,GAAK,IAASA,EAAI9D,MAAQ,EAAG,CACnE,MAAM0G,YAAEA,GAAgB5C,EAClBrE,EAAQ6F,GAAgBxB,EAAKA,EAAIrD,MAAM5C,KAAKR,QAClD,OAAOyG,EAAIrD,MAAM5C,KAAKmI,MAAM,CACxBpM,MAAAA,EACAoG,MAAO8D,EAAI9D,MACXvJ,QAAQ,EACRuP,MAAO,CACHvG,MAAAA,EACAsC,MAAO+B,EAAI/B,SAEhBrS,MAAK,EAAG8K,OAAAA,KAAakM,EAAclM,EAAOvQ,IAAIyc,GAAelM,IAE/D,CACD,MAAM3Q,EAAI,GACV,OAAOoc,GAAKnC,GAAK3O,GAAQtL,EAAEjB,KAAKuM,IAAOyE,EAAOkK,EAAIrD,MAAM5C,MAAMnO,MAAK,IAAM7F,OAE9E6K,GAEPqL,OAAOA,GACH,IAAI+D,EAAM/X,KAAKgc,KACf,OAAIhI,GAAU,IAEd+D,EAAI/D,QAAUA,EACV4E,GAAgBb,GAChBoB,GAAgBpB,GAAK,KACjB,IAAIkF,EAAajJ,EACjB,MAAO,CAACqG,EAAQC,IACO,IAAf2C,IAEe,IAAfA,KACEA,GACK,IAEX3C,GAAQ,KACJD,EAAOC,QAAQ2C,GACfA,EAAa,MAEV,OAKf9D,GAAgBpB,GAAK,KACjB,IAAIkF,EAAajJ,EACjB,MAAO,MAASiJ,EAAa,MAvB1Bjd,KA4BfiU,MAAMC,GAUF,OATAlU,KAAKgc,KAAK/H,MAAQqI,KAAKC,IAAIvc,KAAKgc,KAAK/H,MAAOC,GAC5CiF,GAAgBnZ,KAAKgc,MAAM,KACvB,IAAIkB,EAAWhJ,EACf,OAAO,SAAUmG,EAAQC,EAAS/V,GAG9B,QAFM2Y,GAAY,GACd5C,EAAQ/V,GACL2Y,GAAY,MAExB,GACIld,KAEXmd,MAAM5J,EAAgB6J,GAUlB,OATAlE,GAAUlZ,KAAKgc,MAAM,SAAU3B,EAAQC,EAAS/V,GAC5C,OAAIgP,EAAe8G,EAAOzf,SACtB0f,EAAQ/V,GACD6Y,MAMRpd,KAEX6R,MAAMlJ,GACF,OAAO3I,KAAKiU,MAAM,GAAGG,SAAQ,SAAUtW,GAAK,OAAOA,EAAE,MAAO6F,KAAKgF,GAErE0U,KAAK1U,GACD,OAAO3I,KAAKuU,UAAU1C,MAAMlJ,GAEhCtK,OAAOkV,GA1QX,IAAwBwE,EAAK5b,EA+QrB,OAJA+c,GAAUlZ,KAAKgc,MAAM,SAAU3B,GAC3B,OAAO9G,EAAe8G,EAAOzf,UA5QjBmd,EA8QD/X,KAAKgc,KA9QC7f,EA8QKoX,EA7Q9BwE,EAAIuF,QAAUhO,GAAQyI,EAAIuF,QAASnhB,GA8QxB6D,KAEX6T,IAAIxV,GACA,OAAO2B,KAAK3B,OAAOA,GAEvB0a,GAAGwE,GACC,OAAO,IAAIvd,KAAKsN,GAAG6E,YAAYnS,KAAKgc,KAAKtH,MAAO6I,EAAWvd,MAE/DuU,UAII,OAHAvU,KAAKgc,KAAKjC,IAAyB,SAAlB/Z,KAAKgc,KAAKjC,IAAiB,OAAS,OACjD/Z,KAAKwd,oBACLxd,KAAKwd,mBAAmBxd,KAAKgc,KAAKjC,KAC/B/Z,KAEXyd,OACI,OAAOzd,KAAKuU,UAEhBmJ,QAAQ/U,GACJ,IAAIoP,EAAM/X,KAAKgc,KAEf,OADAjE,EAAI+B,UAAY/B,EAAIuF,QACbtd,KAAKmU,MAAK,SAAUvX,EAAKyd,GAAU1R,EAAG0R,EAAO7gB,IAAK6gB,MAE7DsD,cAAchV,GAEV,OADA3I,KAAKgc,KAAKhC,OAAS,SACZha,KAAK0d,QAAQ/U,GAExBiV,eAAejV,GACX,IAAIoP,EAAM/X,KAAKgc,KAEf,OADAjE,EAAI+B,UAAY/B,EAAIuF,QACbtd,KAAKmU,MAAK,SAAUvX,EAAKyd,GAAU1R,EAAG0R,EAAOX,WAAYW,MAEpErhB,KAAK2P,GACD,IAAIoP,EAAM/X,KAAKgc,KACfjE,EAAI+B,UAAY/B,EAAIuF,QACpB,IAAIxf,EAAI,GACR,OAAOkC,KAAKmU,MAAK,SAAU/K,EAAMiR,GAC7Bvc,EAAEjB,KAAKwd,EAAO7gB,QACfmK,MAAK,WACJ,OAAO7F,KACR6F,KAAKgF,GAEZkV,YAAYlV,GACR,IAAIoP,EAAM/X,KAAKgc,KACf,GAAgB,SAAZjE,EAAIgC,KAAkBnB,GAAgBb,GAAK,IAASA,EAAI9D,MAAQ,EAChE,OAAOjU,KAAK+b,OAAMlO,IACd,IAAI6F,EAAQ6F,GAAgBxB,EAAKA,EAAIrD,MAAM5C,KAAKR,QAChD,OAAOyG,EAAIrD,MAAM5C,KAAKmI,MAAM,CACxBpM,MAAAA,EACAnD,QAAQ,EACRuJ,MAAO8D,EAAI9D,MACXgG,MAAO,CACHvG,MAAAA,EACAsC,MAAO+B,EAAI/B,YAGpBrS,MAAK,EAAG8K,OAAAA,KAAaA,IAAQ9K,KAAKgF,GAEzCoP,EAAI+B,UAAY/B,EAAIuF,QACpB,IAAIxf,EAAI,GACR,OAAOkC,KAAKmU,MAAK,SAAU/K,EAAMiR,GAC7Bvc,EAAEjB,KAAKwd,EAAOX,eACf/V,MAAK,WACJ,OAAO7F,KACR6F,KAAKgF,GAEZmV,WAAWnV,GAEP,OADA3I,KAAKgc,KAAKhC,OAAS,SACZha,KAAKhH,KAAK2P,GAErBoV,SAASpV,GACL,OAAO3I,KAAKiU,MAAM,GAAGjb,MAAK,SAAU8E,GAAK,OAAOA,EAAE,MAAO6F,KAAKgF,GAElEqV,QAAQrV,GACJ,OAAO3I,KAAKuU,UAAUwJ,SAASpV,GAEnCsV,WACI,IAAIlG,EAAM/X,KAAKgc,KAAM1I,EAAMyE,EAAIrE,OAASqE,EAAIrD,MAAMpD,OAAO4B,UAAU6E,EAAIrE,OACvE,IAAKJ,IAAQA,EAAIK,MACb,OAAO3T,KACX,IAAItF,EAAM,GAOV,OANAwe,GAAUlZ,KAAKgc,MAAM,SAAU3B,GAC3B,IAAI6D,EAAS7D,EAAOX,WAAWta,WAC3B+e,EAAQrkB,EAAOY,EAAKwjB,GAExB,OADAxjB,EAAIwjB,IAAU,GACNC,KAELne,KAEX2V,OAAOsB,GACH,IAAIc,EAAM/X,KAAKgc,KACf,OAAOhc,KAAKkc,QAAOrO,IACf,IAAIuQ,EACJ,GAAuB,mBAAZnH,EACPmH,EAAWnH,MAEV,CACD,IAAI7E,EAAWpZ,EAAKie,GAChBY,EAAUzF,EAASzV,OACvByhB,EAAW,SAAUhV,GACjB,IAAIiV,GAAmB,EACvB,IAAK,IAAI5hB,EAAI,EAAGA,EAAIob,IAAWpb,EAAG,CAC9B,IAAIF,EAAU6V,EAAS3V,GACnBG,EAAMqa,EAAQ1a,GACd+hB,EAAUhiB,EAAa8M,EAAM7M,GAC7BK,aAAese,IACf/d,EAAaiM,EAAM7M,EAASK,EAAIue,QAAQmD,IACxCD,GAAmB,GAEdC,IAAY1hB,IACjBO,EAAaiM,EAAM7M,EAASK,GAC5ByhB,GAAmB,GAG3B,OAAOA,GAGf,MAAMvH,EAAYiB,EAAIrD,MAAM5C,MACtByM,SAAEA,EAAQC,WAAEA,GAAe1H,EAAUxF,OAAOoI,WAC5CzF,EAAQjU,KAAKsN,GAAGmR,SAASC,iBAAmB,IAC5CC,EAAgB,GACtB,IAAItd,EAAe,EACnB,MAAMC,EAAa,GACbsd,EAAoB,CAACC,EAAe3b,KACtC,MAAMjC,SAAEA,EAAQsU,YAAEA,GAAgBrS,EAClC7B,GAAgBwd,EAAgBtJ,EAChC,IAAK,IAAI/T,KAAOxI,EAAKiI,GACjB0d,EAAc9hB,KAAKoE,EAASO,KAGpC,OAAOxB,KAAKoc,QAAQyB,cAAcla,MAAK3K,IACnC,MAAM8lB,EAAWlG,GAAgBb,IAC7BA,EAAI9D,QAAU7J,EAAAA,IACM,mBAAZ6M,GAA0BA,IAAY8H,KAAmB,CACjErL,MAAOqE,EAAIrE,MACXsC,MAAO+B,EAAI/B,OAETgJ,EAAahL,IACf,MAAMF,EAAQwI,KAAKC,IAAItI,EAAOjb,EAAK2D,OAASqX,GAC5C,OAAO8C,EAAUZ,QAAQ,CACrBrI,MAAAA,EACA7U,KAAMA,EAAKwC,MAAMwY,EAAQA,EAASF,GAClCqD,MAAO,cACRxT,MAAK+G,IACJ,MAAMuU,EAAY,GACZC,EAAY,GACZC,EAAUZ,EAAW,GAAK,KAC1Ba,EAAa,GACnB,IAAK,IAAI3iB,EAAI,EAAGA,EAAIqX,IAASrX,EAAG,CAC5B,MAAM4iB,EAAY3U,EAAOjO,GACnBsb,EAAM,CACRnd,MAAOmE,EAAUsgB,GACjB7M,QAASxZ,EAAKgb,EAASvX,KAEgB,IAAvC2hB,EAASpkB,KAAK+d,EAAKA,EAAInd,MAAOmd,KACb,MAAbA,EAAInd,MACJwkB,EAAWviB,KAAK7D,EAAKgb,EAASvX,IAExB8hB,GAAkE,IAAtDvO,GAAIwO,EAAWa,GAAYb,EAAWzG,EAAInd,SAK5DskB,EAAUriB,KAAKkb,EAAInd,OACf2jB,GACAY,EAAQtiB,KAAK7D,EAAKgb,EAASvX,MAN/B2iB,EAAWviB,KAAK7D,EAAKgb,EAASvX,IAC9BwiB,EAAUpiB,KAAKkb,EAAInd,SAS/B,OAAOnB,QAAQ8K,QAAQ0a,EAAUtiB,OAAS,GACtCma,EAAUxB,OAAO,CAAEzH,MAAAA,EAAOhE,KAAM,MAAOa,OAAQuU,IAC1Ctb,MAAKT,IACN,IAAK,IAAI1B,KAAO0B,EAAIjC,SAChBme,EAAW3hB,OAAOD,SAASgE,GAAM,GAErCod,EAAkBK,EAAUtiB,OAAQuG,OACpCS,MAAK,KAAOub,EAAUviB,OAAS,GAAMmiB,GAA+B,iBAAZ7H,IAC5DH,EAAUxB,OAAO,CACbzH,MAAAA,EACAhE,KAAM,MACN7Q,KAAMmmB,EACNzU,OAAQwU,EACRJ,SAAAA,EACAQ,WAA+B,mBAAZrI,GACZA,EACPsI,kBAAmBvL,EAAS,IAC7BrQ,MAAKT,GAAO0b,EAAkBM,EAAUviB,OAAQuG,OAAOS,MAAK,KAAOyb,EAAWziB,OAAS,GAAMmiB,GAAY7H,IAAY8H,KACxHjI,EAAUxB,OAAO,CACbzH,MAAAA,EACAhE,KAAM,SACN7Q,KAAMomB,EACNN,SAAAA,EACAS,kBAAmBvL,EAAS,IAC7BrQ,MAAKT,GAAO0b,EAAkBQ,EAAWziB,OAAQuG,OAAOS,MAAK,IACzD3K,EAAK2D,OAASqX,EAASF,GAASkL,EAAUhL,EAASC,SAItE,OAAO+K,EAAU,GAAGrb,MAAK,KACrB,GAAIgb,EAAchiB,OAAS,EACvB,MAAM,IAAIyE,EAAY,sCAAuCud,EAAetd,EAAcC,GAC9F,OAAOtI,EAAK2D,gBAK5BmZ,SACI,IAAIiC,EAAM/X,KAAKgc,KAAMhG,EAAQ+B,EAAI/B,MACjC,OAAI4C,GAAgBb,KACfA,EAAI0B,WAA4B,IAAfzD,EAAMnM,MAEjB7J,KAAKkc,QAAOrO,IACf,MAAM6L,WAAEA,GAAe3B,EAAIrD,MAAM5C,KAAKR,OAChCkO,EAAYxJ,EAClB,OAAO+B,EAAIrD,MAAM5C,KAAKgC,MAAM,CAAEjG,MAAAA,EAAOoM,MAAO,CAAEvG,MAAOgG,EAAY1D,MAAOwJ,KAAe7b,MAAKmQ,GACjFiE,EAAIrD,MAAM5C,KAAKwD,OAAO,CAAEzH,MAAAA,EAAOhE,KAAM,cAAemM,MAAOwJ,IAC7D7b,MAAK,EAAG1C,SAAAA,EAAUuU,WAAAA,EAAYjK,QAAAA,EAASgK,YAAAA,MACxC,GAAIA,EACA,MAAM,IAAInU,EAAY,+BAAgCnI,OAAOD,KAAKiI,GAAU/C,KAAIsD,GAAOP,EAASO,KAAOsS,EAAQyB,GACnH,OAAOzB,EAAQyB,UAKxBvV,KAAK2V,OAAOoJ,KAG3B,MAAMA,GAAiB,CAACnkB,EAAOmd,IAAQA,EAAInd,MAAQ,KAsCnD,SAAS6kB,GAAc3hB,EAAG9B,GACtB,OAAO8B,EAAI9B,GAAK,EAAI8B,IAAM9B,EAAI,EAAI,EAEtC,SAAS0jB,GAAqB5hB,EAAG9B,GAC7B,OAAO8B,EAAI9B,GAAK,EAAI8B,IAAM9B,EAAI,EAAI,EAGtC,SAASwe,GAAKmF,EAAyB5V,EAAK6V,GACxC,IAAIC,EAAaF,aAAmCxN,GAChD,IAAIwN,EAAwBtL,WAAWsL,GACvCA,EAEJ,OADAE,EAAW7D,KAAKC,MAAQ2D,EAAI,IAAIA,EAAE7V,GAAO,IAAI3H,UAAU2H,GAChD8V,EAEX,SAASC,GAAgBC,GACrB,OAAO,IAAIA,EAAY1L,WAAW0L,GAAa,IAAMC,GAAW,MAAK/L,MAAM,GAY/E,SAASgM,GAAWzmB,EAAK0mB,EAAUC,EAAaC,EAAapQ,EAAK+J,GAG9D,IAFA,IAAIpd,EAAS2f,KAAKC,IAAI/iB,EAAImD,OAAQyjB,EAAYzjB,QAC1C0jB,GAAO,EACF5jB,EAAI,EAAGA,EAAIE,IAAUF,EAAG,CAC7B,IAAI6jB,EAAaJ,EAASzjB,GAC1B,GAAI6jB,IAAeF,EAAY3jB,GAC3B,OAAIuT,EAAIxW,EAAIiD,GAAI0jB,EAAY1jB,IAAM,EACvBjD,EAAIyD,OAAO,EAAGR,GAAK0jB,EAAY1jB,GAAK0jB,EAAYljB,OAAOR,EAAI,GAClEuT,EAAIxW,EAAIiD,GAAI2jB,EAAY3jB,IAAM,EACvBjD,EAAIyD,OAAO,EAAGR,GAAK2jB,EAAY3jB,GAAK0jB,EAAYljB,OAAOR,EAAI,GAClE4jB,GAAO,EACA7mB,EAAIyD,OAAO,EAAGojB,GAAOH,EAASG,GAAOF,EAAYljB,OAAOojB,EAAM,GAClE,KAEPrQ,EAAIxW,EAAIiD,GAAI6jB,GAAc,IAC1BD,EAAM5jB,GAEd,OAAIE,EAASyjB,EAAYzjB,QAAkB,SAARod,EACxBvgB,EAAM2mB,EAAYljB,OAAOzD,EAAImD,QACpCA,EAASnD,EAAImD,QAAkB,SAARod,EAChBvgB,EAAIyD,OAAO,EAAGkjB,EAAYxjB,QAC7B0jB,EAAM,EAAI,KAAO7mB,EAAIyD,OAAO,EAAGojB,GAAOD,EAAYC,GAAOF,EAAYljB,OAAOojB,EAAM,GAE9F,SAASE,GAAuBR,EAAaS,EAAOC,EAASC,GACzD,IAAI9Q,EAAOF,EAAOiR,EAASC,EAAcC,EAAcC,EAAWC,EAAeC,EAAaP,EAAQ9jB,OACtG,IAAK8jB,EAAQ9N,OAAMzR,GAAkB,iBAANA,IAC3B,OAAOsZ,GAAKuF,EAvnCI,oBAynCpB,SAASkB,EAAclH,GACnBnK,EAvCR,SAAsBmK,GAClB,MAAe,SAARA,EACF7Y,GAAMA,EAAEggB,cACRhgB,GAAMA,EAAEigB,cAoCDC,CAAarH,GACrBrK,EAnCR,SAAsBqK,GAClB,MAAe,SAARA,EACF7Y,GAAMA,EAAEigB,cACRjgB,GAAMA,EAAEggB,cAgCDG,CAAatH,GACrB4G,EAAmB,SAAR5G,EAAiB0F,GAAgBC,GAC5C,IAAI4B,EAAeb,EAAQviB,KAAI,SAAUqjB,GACrC,MAAO,CAAE7R,MAAOA,EAAM6R,GAAS3R,MAAOA,EAAM2R,OAC7C3O,MAAK,SAAU9U,EAAG9B,GACjB,OAAO2kB,EAAQ7iB,EAAE4R,MAAO1T,EAAE0T,UAE9BkR,EAAeU,EAAapjB,KAAI,SAAUsjB,GAAM,OAAOA,EAAG5R,SAC1DiR,EAAeS,EAAapjB,KAAI,SAAUsjB,GAAM,OAAOA,EAAG9R,SAC1DoR,EAAY/G,EACZgH,EAAyB,SAARhH,EAAiB,GAAK2G,EAE3CO,EAAc,QACd,IAAInG,EAAI,IAAIiF,EAAY1L,WAAW0L,GAAa,IAAM0B,GAAYb,EAAa,GAAIC,EAAaG,EAAa,GAAKN,KAClH5F,EAAE0C,mBAAqB,SAAUsD,GAC7BG,EAAcH,IAElB,IAAIY,EAAsB,EA4B1B,OA3BA5G,EAAEqB,eAAc,SAAU9B,EAAQC,EAAS/V,GACvC,IAAI/K,EAAM6gB,EAAO7gB,IACjB,GAAmB,iBAARA,EACP,OAAO,EACX,IAAI0mB,EAAWxQ,EAAMlW,GACrB,GAAIgnB,EAAMN,EAAUW,EAAca,GAC9B,OAAO,EAIP,IADA,IAAIC,EAAuB,KAClBllB,EAAIilB,EAAqBjlB,EAAIukB,IAAcvkB,EAAG,CACnD,IAAImlB,EAAS3B,GAAWzmB,EAAK0mB,EAAUU,EAAankB,GAAIokB,EAAapkB,GAAIkkB,EAASG,GACnE,OAAXc,GAA4C,OAAzBD,EACnBD,EAAsBjlB,EAAI,GACI,OAAzBklB,GAAiChB,EAAQgB,EAAsBC,GAAU,KAC9ED,EAAuBC,GAS/B,OALItH,EADyB,OAAzBqH,EACQ,WAActH,EAAOU,SAAS4G,EAAuBZ,IAGrDxc,IAEL,KAGRuW,EAEX,SAAS2G,GAAY/R,EAAOE,EAAOD,EAAWE,GAC1C,MAAO,CACHhG,KAAM,EACN6F,MAAAA,EACAE,MAAAA,EACAD,UAAAA,EACAE,UAAAA,GAGR,SAASmQ,GAAWplB,GAChB,MAAO,CACHiP,KAAM,EACN6F,MAAO9U,EACPgV,MAAOhV,GAIf,MAAMuX,GACEkC,iBACA,OAAOrU,KAAKgc,KAAKtH,MAAMpH,GAAG+G,WAE9BwN,QAAQnS,EAAOE,EAAOkS,EAAcC,GAChCD,GAAgC,IAAjBA,EACfC,GAAgC,IAAjBA,EACf,IACI,OAAK/hB,KAAKgiB,KAAKtS,EAAOE,GAAS,GACE,IAA5B5P,KAAKgiB,KAAKtS,EAAOE,KAAiBkS,GAAgBC,MAAmBD,IAAgBC,GAC/EjC,GAAgB9f,MACpB,IAAIA,KAAKqU,WAAWrU,MAAM,IAAMyhB,GAAY/R,EAAOE,GAAQkS,GAAeC,KAErF,MAAO/Y,GACH,OAAOwR,GAAKxa,KAAMoP,KAG1BiD,OAAOzX,GACH,OAAa,MAATA,EACO4f,GAAKxa,KAAMoP,IACf,IAAIpP,KAAKqU,WAAWrU,MAAM,IAAMggB,GAAWplB,KAEtDqnB,MAAMrnB,GACF,OAAa,MAATA,EACO4f,GAAKxa,KAAMoP,IACf,IAAIpP,KAAKqU,WAAWrU,MAAM,IAAMyhB,GAAY7mB,OAAOsC,GAAW,KAEzEglB,aAAatnB,GACT,OAAa,MAATA,EACO4f,GAAKxa,KAAMoP,IACf,IAAIpP,KAAKqU,WAAWrU,MAAM,IAAMyhB,GAAY7mB,OAAOsC,GAAW,KAEzEilB,MAAMvnB,GACF,OAAa,MAATA,EACO4f,GAAKxa,KAAMoP,IACf,IAAIpP,KAAKqU,WAAWrU,MAAM,IAAMyhB,QAAYvkB,EAAWtC,GAAO,GAAO,KAEhFwnB,aAAaxnB,GACT,OAAa,MAATA,EACO4f,GAAKxa,KAAMoP,IACf,IAAIpP,KAAKqU,WAAWrU,MAAM,IAAMyhB,QAAYvkB,EAAWtC,KAElE+gB,WAAW0G,GACP,MAAmB,iBAARA,EACA7H,GAAKxa,KAvuCA,oBAwuCTA,KAAK6hB,QAAQQ,EAAKA,EAAMpT,IAAW,GAAM,GAEpDqT,qBAAqBD,GACjB,MAAY,KAARA,EACOriB,KAAK2b,WAAW0G,GACpB9B,GAAuBvgB,MAAM,CAACb,EAAGrB,IAA0B,IAApBqB,EAAEpC,QAAQe,EAAE,KAAW,CAACukB,GAAMpT,IAEhFsT,iBAAiBF,GACb,OAAO9B,GAAuBvgB,MAAM,CAACb,EAAGrB,IAAMqB,IAAMrB,EAAE,IAAI,CAACukB,GAAM,IAErEG,kBACI,IAAI9nB,EAAMkF,EAAW7B,MAAM4B,EAAeI,WAC1C,OAAmB,IAAfrF,EAAIiC,OACGmjB,GAAgB9f,MACpBugB,GAAuBvgB,MAAM,CAACb,EAAGrB,KAAwB,IAAlBA,EAAEf,QAAQoC,IAAWzE,EAAK,IAE5E+nB,4BACI,IAAI/nB,EAAMkF,EAAW7B,MAAM4B,EAAeI,WAC1C,OAAmB,IAAfrF,EAAIiC,OACGmjB,GAAgB9f,MACpBugB,GAAuBvgB,MAAM,CAACb,EAAGrB,IAAMA,EAAEsK,MAAKsa,GAAsB,IAAjBvjB,EAAEpC,QAAQ2lB,MAAWhoB,EAAKuU,IAExF0T,QACI,MAAMjoB,EAAMkF,EAAW7B,MAAM4B,EAAeI,WAC5C,IAAI4gB,EAAU3gB,KAAKgiB,KACnB,IACItnB,EAAIkY,KAAK+N,GAEb,MAAO3X,GACH,OAAOwR,GAAKxa,KAAMoP,IAEtB,GAAmB,IAAf1U,EAAIiC,OACJ,OAAOmjB,GAAgB9f,MAC3B,MAAM8a,EAAI,IAAI9a,KAAKqU,WAAWrU,MAAM,IAAMyhB,GAAY/mB,EAAI,GAAIA,EAAIA,EAAIiC,OAAS,MAC/Eme,EAAE0C,mBAAqBsD,IACnBH,EAAyB,SAAdG,EACP9gB,KAAK4iB,WACL5iB,KAAK6iB,YACTnoB,EAAIkY,KAAK+N,IAEb,IAAIlkB,EAAI,EAkBR,OAjBAqe,EAAEqB,eAAc,CAAC9B,EAAQC,EAAS/V,KAC9B,MAAM/K,EAAM6gB,EAAO7gB,IACnB,KAAOmnB,EAAQnnB,EAAKkB,EAAI+B,IAAM,GAE1B,KADEA,EACEA,IAAM/B,EAAIiC,OAEV,OADA2d,EAAQ/V,IACD,EAGf,OAA6B,IAAzBoc,EAAQnnB,EAAKkB,EAAI+B,MAIjB6d,GAAQ,KAAQD,EAAOU,SAASrgB,EAAI+B,QAC7B,MAGRqe,EAEXgI,SAASloB,GACL,OAAOoF,KAAK+iB,WAAW,CAAC,GAvyCjB,EAAA,GAuyC0BnoB,GAAQ,CAACA,EAAOoF,KAAKsN,GAAGuF,UAAW,CAAEmQ,eAAe,EAAOC,eAAe,IAE/GC,SACI,MAAMxoB,EAAMkF,EAAW7B,MAAM4B,EAAeI,WAC5C,GAAmB,IAAfrF,EAAIiC,OACJ,OAAO,IAAIqD,KAAKqU,WAAWrU,MAC/B,IACItF,EAAIkY,KAAK5S,KAAK4iB,YAElB,MAAO5Z,GACH,OAAOwR,GAAKxa,KAAMoP,IAEtB,MAAM+T,EAASzoB,EAAIiH,QAAO,CAACuB,EAAKtG,IAAQsG,EACpCA,EAAItF,OAAO,CAAC,CAACsF,EAAIA,EAAIvG,OAAS,GAAG,GAAIC,KACrC,CAAC,GArzCE,EAAA,GAqzCOA,KAAO,MAErB,OADAumB,EAAOtmB,KAAK,CAACnC,EAAIA,EAAIiC,OAAS,GAAIqD,KAAKsN,GAAGuF,UACnC7S,KAAK+iB,WAAWI,EAAQ,CAAEH,eAAe,EAAOC,eAAe,IAE1EF,WAAWI,EAAQ3oB,GACf,MAAMwV,EAAMhQ,KAAKgiB,KAAMoB,EAAYpjB,KAAK4iB,WAAYS,EAAarjB,KAAK6iB,YAAatG,EAAMvc,KAAKsjB,KAAMC,EAAMvjB,KAAKwjB,KAC/G,GAAsB,IAAlBL,EAAOxmB,OACP,OAAOmjB,GAAgB9f,MAC3B,IAAKmjB,EAAOxQ,OAAMqD,QAAsB9Y,IAAb8Y,EAAM,SAChB9Y,IAAb8Y,EAAM,IACNoN,EAAUpN,EAAM,GAAIA,EAAM,KAAO,IACjC,OAAOwE,GAAKxa,KAAM,6HAA8H6B,EAAW+T,iBAE/J,MAAMoN,GAAiBxoB,IAAqC,IAA1BA,EAAQwoB,cACpCC,EAAgBzoB,IAAqC,IAA1BA,EAAQyoB,cAezC,IAEIvoB,EAFA+oB,EAAgBL,EACpB,SAASM,EAAY5lB,EAAG9B,GAAK,OAAOynB,EAAc3lB,EAAE,GAAI9B,EAAE,IAE1D,IACItB,EAAMyoB,EAAOxhB,QAlBjB,SAAkBwhB,EAAQQ,GACtB,IAAIlnB,EAAI,EAAGC,EAAIymB,EAAOxmB,OACtB,KAAOF,EAAIC,IAAKD,EAAG,CACf,MAAMuZ,EAAQmN,EAAO1mB,GACrB,GAAIuT,EAAI2T,EAAS,GAAI3N,EAAM,IAAM,GAAKhG,EAAI2T,EAAS,GAAI3N,EAAM,IAAM,EAAG,CAClEA,EAAM,GAAKuG,EAAIvG,EAAM,GAAI2N,EAAS,IAClC3N,EAAM,GAAKuN,EAAIvN,EAAM,GAAI2N,EAAS,IAClC,OAKR,OAFIlnB,IAAMC,GACNymB,EAAOtmB,KAAK8mB,GACTR,IAMuB,IAC9BzoB,EAAIkY,KAAK8Q,GAEb,MAAOxb,GACH,OAAOsS,GAAKxa,KAAMoP,IAEtB,IAAIwU,EAAW,EACf,MAAMC,EAA0BZ,EAC5BzpB,GAAO4pB,EAAU5pB,EAAKkB,EAAIkpB,GAAU,IAAM,EAC1CpqB,GAAO4pB,EAAU5pB,EAAKkB,EAAIkpB,GAAU,KAAO,EACzCE,EAA0Bd,EAC5BxpB,GAAO6pB,EAAW7pB,EAAKkB,EAAIkpB,GAAU,IAAM,EAC3CpqB,GAAO6pB,EAAW7pB,EAAKkB,EAAIkpB,GAAU,KAAO,EAIhD,IAAIG,EAAWF,EACf,MAAM/I,EAAI,IAAI9a,KAAKqU,WAAWrU,MAAM,IAAMyhB,GAAY/mB,EAAI,GAAG,GAAIA,EAAIA,EAAIiC,OAAS,GAAG,IAAKqmB,GAAgBC,KAqC1G,OApCAnI,EAAE0C,mBAAqBsD,IACD,SAAdA,GACAiD,EAAWF,EACXJ,EAAgBL,IAGhBW,EAAWD,EACXL,EAAgBJ,GAEpB3oB,EAAIkY,KAAK8Q,IAEb5I,EAAEqB,eAAc,CAAC9B,EAAQC,EAAS/V,KAE9B,IADA,IAAI/K,EAAM6gB,EAAO7gB,IACVuqB,EAASvqB,IAEZ,KADEoqB,EACEA,IAAalpB,EAAIiC,OAEjB,OADA2d,EAAQ/V,IACD,EAGf,QAzBJ,SAA+B/K,GAC3B,OAAQqqB,EAAwBrqB,KAASsqB,EAAwBtqB,GAwB7DwqB,CAAsBxqB,KAGoB,IAArCwG,KAAKgiB,KAAKxoB,EAAKkB,EAAIkpB,GAAU,KAAkD,IAArC5jB,KAAKgiB,KAAKxoB,EAAKkB,EAAIkpB,GAAU,KAI5EtJ,GAAQ,KACAmJ,IAAkBL,EAClB/I,EAAOU,SAASrgB,EAAIkpB,GAAU,IAE9BvJ,EAAOU,SAASrgB,EAAIkpB,GAAU,QAP/B,MAYR9I,EAEXmJ,kBACI,MAAMvpB,EAAMkF,EAAW7B,MAAM4B,EAAeI,WAC5C,OAAKrF,EAAIiY,OAAMzR,GAAkB,iBAANA,IAGR,IAAfxG,EAAIiC,OACGmjB,GAAgB9f,MACpBA,KAAK+iB,WAAWroB,EAAIwD,KAAKmkB,GAAQ,CAACA,EAAKA,EAAMpT,OAJzCuL,GAAKxa,KAAM,8CA0B9B,SAASkkB,GAAmB5c,GACxB,OAAOkC,IAAK,SAAU2a,GAGlB,OAFAC,GAAeD,GACf7c,EAAO6c,EAAME,OAAOpI,QACb,KAGf,SAASmI,GAAeD,GAChBA,EAAMG,iBACNH,EAAMG,kBACNH,EAAMC,gBACND,EAAMC,iBAGd,MAEMG,GAAezM,GAAO,KAFa,kBAIzC,MAAM0M,GACFC,QAKI,OAJA1oB,GAAQmK,GAAInN,UACViH,KAAK0kB,UACgB,IAAnB1kB,KAAK0kB,WAAoBxe,GAAInN,SAC7BmN,GAAIye,aAAe3kB,MAChBA,KAEX4kB,UAEI,GADA7oB,GAAQmK,GAAInN,QACa,KAAnBiH,KAAK0kB,UAGP,IAFKxe,GAAInN,SACLmN,GAAIye,aAAe,MAChB3kB,KAAK6kB,cAAcloB,OAAS,IAAMqD,KAAK8kB,WAAW,CACrD,IAAIC,EAAW/kB,KAAK6kB,cAAcG,QAClC,IACI/b,GAAO8b,EAAS,GAAIA,EAAS,IAEjC,MAAO/b,KAGf,OAAOhJ,KAEX8kB,UACI,OAAO9kB,KAAK0kB,WAAaxe,GAAIye,eAAiB3kB,KAElD7E,OAAOuT,GACH,IAAK1O,KAAKuN,KACN,OAAOvN,KACX,MAAMyN,EAAQzN,KAAKsN,GAAGG,MAChBoB,EAAc7O,KAAKsN,GAAG5G,OAAOmI,YAEnC,GADA9S,GAAQiE,KAAK0O,WACRA,IAAajB,EACd,OAAQoB,GAAeA,EAAYhO,MAC/B,IAAK,sBACD,MAAM,IAAIgB,EAAWrB,eAAeqO,GACxC,IAAK,kBACD,MAAM,IAAIhN,EAAWlB,WAAWkO,EAAY9N,QAAS8N,GACzD,QACI,MAAM,IAAIhN,EAAWojB,WAAWpW,GAG5C,IAAK7O,KAAKklB,OACN,MAAM,IAAIrjB,EAAWnB,oBAuBzB,OAtBA3E,EAAmC,OAA5BiE,KAAK4O,YAAYlI,SACxBgI,EAAW1O,KAAK0O,SAAWA,IACtB1O,KAAKsN,GAAGwE,KACH9R,KAAKsN,GAAGwE,KAAKqT,YAAYnlB,KAAKwN,WAAYxN,KAAKuN,KAAM,CAAE6X,WAAYplB,KAAKqlB,8BACxE5X,EAAM0X,YAAYnlB,KAAKwN,WAAYxN,KAAKuN,KAAM,CAAE6X,WAAYplB,KAAKqlB,gCAClEjiB,QAAUoG,IAAK8b,IACpBlB,GAAekB,GACftlB,KAAKulB,QAAQ7W,EAASuN,UAE1BvN,EAAS8W,QAAUhc,IAAK8b,IACpBlB,GAAekB,GACftlB,KAAKklB,QAAUllB,KAAKulB,QAAQ,IAAI1jB,EAAWpB,MAAMiO,EAASuN,QAC1Djc,KAAKklB,QAAS,EACdllB,KAAKylB,GAAG,SAASxT,KAAKqT,MAE1B5W,EAASgX,WAAalc,IAAK,KACvBxJ,KAAKklB,QAAS,EACdllB,KAAK2lB,WACD,iBAAkBjX,GAClB6V,GAAaqB,eAAe3T,KAAKvD,EAAuB,iBAGzD1O,KAEXwO,SAASjB,EAAMpR,EAAI0pB,GACf,GAAa,cAATtY,GAAsC,cAAdvN,KAAKuN,KAC7B,OAAOf,GAAU,IAAI3K,EAAWikB,SAAS,4BAC7C,IAAK9lB,KAAKklB,OACN,OAAO1Y,GAAU,IAAI3K,EAAWnB,qBACpC,GAAIV,KAAK8kB,UACL,OAAO,IAAIze,IAAa,CAAC9B,EAAS+C,KAC9BtH,KAAK6kB,cAAchoB,KAAK,CAAC,KACjBmD,KAAKwO,SAASjB,EAAMpR,EAAI0pB,GAAYliB,KAAKY,EAAS+C,IACnDpB,QAGV,GAAI2f,EACL,OAAO9a,IAAS,KACZ,IAAI1C,EAAI,IAAIhC,IAAa,CAAC9B,EAAS+C,KAC/BtH,KAAKykB,QACL,MAAMjoB,EAAKL,EAAGoI,EAAS+C,EAAQtH,MAC3BxD,GAAMA,EAAGmH,MACTnH,EAAGmH,KAAKY,EAAS+C,MAIzB,OAFAe,EAAE2B,SAAQ,IAAMhK,KAAK4kB,YACrBvc,EAAE9B,MAAO,EACF8B,KAIX,IAAIA,EAAI,IAAIhC,IAAa,CAAC9B,EAAS+C,KAC/B,IAAI9K,EAAKL,EAAGoI,EAAS+C,EAAQtH,MACzBxD,GAAMA,EAAGmH,MACTnH,EAAGmH,KAAKY,EAAS+C,MAGzB,OADAe,EAAE9B,MAAO,EACF8B,EAGf0d,QACI,OAAO/lB,KAAKoM,OAASpM,KAAKoM,OAAO2Z,QAAU/lB,KAE/CgmB,QAAQC,GACJ,IAAIC,EAAOlmB,KAAK+lB,QAChB,MAAMne,EAAUvB,GAAa9B,QAAQ0hB,GACrC,GAAIC,EAAKC,YACLD,EAAKC,YAAcD,EAAKC,YAAYxiB,MAAK,IAAMiE,QAE9C,CACDse,EAAKC,YAAcve,EACnBse,EAAKE,cAAgB,GACrB,IAAIC,EAAQH,EAAKxX,SAAS4X,YAAYJ,EAAK1Y,WAAW,KACrD,SAAS+Y,IAEN,MADEL,EAAKM,WACAN,EAAKE,cAAczpB,QACrBupB,EAAKE,cAAcpB,OAApB,GACAkB,EAAKC,cACLE,EAAM5rB,KAAK2P,EAAAA,GAAUjH,UAAYojB,GALzC,GAQJ,IAAIE,EAAqBP,EAAKC,YAC9B,OAAO,IAAI9f,IAAa,CAAC9B,EAAS+C,KAC9BM,EAAQjE,MAAKT,GAAOgjB,EAAKE,cAAcvpB,KAAK2M,GAAKjF,EAAQnJ,KAAK,KAAM8H,OAAQ6G,GAAOmc,EAAKE,cAAcvpB,KAAK2M,GAAKlC,EAAOlM,KAAK,KAAM2O,OAAQC,SAAQ,KAC1Ikc,EAAKC,cAAgBM,IACrBP,EAAKC,YAAc,YAKnCO,QACQ1mB,KAAKklB,SACLllB,KAAKklB,QAAS,EACVllB,KAAK0O,UACL1O,KAAK0O,SAASgY,QAClB1mB,KAAKulB,QAAQ,IAAI1jB,EAAWpB,QAGpCiU,MAAMvD,GACF,MAAMwV,EAAkB3mB,KAAK4mB,kBAAoB5mB,KAAK4mB,gBAAkB,IACxE,GAAI9sB,EAAO6sB,EAAgBxV,GACvB,OAAOwV,EAAexV,GAC1B,MAAM0V,EAAc7mB,KAAKsR,OAAOH,GAChC,IAAK0V,EACD,MAAM,IAAIhlB,EAAW0P,SAAS,SAAWJ,EAAY,4BAEzD,MAAM2V,EAAwB,IAAI9mB,KAAKsN,GAAGyD,MAAMI,EAAW0V,EAAa7mB,MAGxE,OAFA8mB,EAAsBhV,KAAO9R,KAAKsN,GAAGwE,KAAK4C,MAAMvD,GAChDwV,EAAexV,GAAa2V,EACrBA,GAyCf,SAASC,GAAgBlmB,EAAMtE,EAASyd,EAAQrG,EAAOyB,EAAM1C,EAAU+G,GACnE,MAAO,CACH5Y,KAAAA,EACAtE,QAAAA,EACAyd,OAAAA,EACArG,MAAAA,EACAyB,KAAAA,EACA1C,SAAAA,EACAsU,KAAMhN,IAAWP,EAAY,IAAM,KAAO9F,EAAQ,IAAM,KAAOyB,EAAO,KAAO,IAAM6R,GAAgB1qB,IAG3G,SAAS0qB,GAAgB1qB,GACrB,MAA0B,iBAAZA,EACVA,EACAA,EAAW,IAAM,GAAG4E,KAAKnH,KAAKuC,EAAS,KAAO,IAAO,GAG7D,SAAS2qB,GAAkBrmB,EAAM2R,EAASD,GACtC,MAAO,CACH1R,KAAAA,EACA2R,QAAAA,EACAD,QAAAA,EACAkC,YAAa,KACbvB,WA5oFeiU,EA4oFU5U,EA5oFH6U,EA4oFY1T,GAAS,CAACA,EAAM7S,KAAM6S,GA3oFrDyT,EAAMxlB,QAAO,CAAC8M,EAAQrF,EAAM3M,KAC/B,IAAI4qB,EAAeD,EAAUhe,EAAM3M,GAGnC,OAFI4qB,IACA5Y,EAAO4Y,EAAa,IAAMA,EAAa,IACpC5Y,IACR,MANP,IAAuB0Y,EAAOC,EAmpF9B,IAAIE,GAAaC,IACb,IAGI,OAFAA,EAAYC,KAAK,CAAC,KAClBF,GAAY,IAAM,CAAC,IACZ,CAAC,IAEZ,MAAOte,GAEH,OADAse,GAAY,IAAMrY,GACXA,KAIf,SAASwY,GAAgBlrB,GACrB,OAAe,MAAXA,EACO,OAEiB,iBAAZA,EAOpB,SAAmCA,GAE/B,OAAqB,IADPA,EAAQ0B,MAAM,KAClBtB,OACCtD,GAAOA,EAAIkD,GAGXlD,GAAOiD,EAAajD,EAAKkD,GAZzBmrB,CAA0BnrB,GAG1BlD,GAAOiD,EAAajD,EAAKkD,GAaxC,SAASorB,GAAS9nB,GACd,MAAO,GAAGrE,MAAMxB,KAAK6F,GAEzB,IAAI+nB,GAAc,EAClB,SAASC,GAAgBtrB,GACrB,OAAkB,MAAXA,EACH,MACmB,iBAAZA,EACHA,EACA,IAAIA,EAAQ4E,KAAK,QAE7B,SAAS2mB,GAAaxa,EAAIia,EAAaQ,GAqDnC,SAASC,EAAgBhS,GACrB,GAAmB,IAAfA,EAAMnM,KACN,OAAO,KACX,GAAmB,IAAfmM,EAAMnM,KACN,MAAM,IAAI5N,MAAM,4CACpB,MAAMyT,MAAEA,EAAKE,MAAEA,EAAKD,UAAEA,EAASE,UAAEA,GAAcmG,EAQ/C,YAP2B9Y,IAAVwS,OACHxS,IAAV0S,EACI,KACA2X,EAAYU,WAAWrY,IAASC,QAC1B3S,IAAV0S,EACI2X,EAAYW,WAAWxY,IAASC,GAChC4X,EAAYY,MAAMzY,EAAOE,IAASD,IAAaE,GA2P3D,MAAMyB,OAAEA,EAAM8W,UAAEA,GA3ThB,SAAuB9a,EAAIO,GACvB,MAAMwa,EAASV,GAASra,EAAGgb,kBAC3B,MAAO,CACHhX,OAAQ,CACJzQ,KAAMyM,EAAGzM,KACTwnB,OAAQA,EAAOnqB,KAAIwW,GAAS7G,EAAMyY,YAAY5R,KAAQxW,KAAImoB,IACtD,MAAM9pB,QAAEA,EAAOgsB,cAAEA,GAAkBlC,EAC7B3T,EAAWxZ,EAAQqD,GACnBgiB,EAAsB,MAAXhiB,EACXisB,EAAiB,GACjB/Z,EAAS,CACX5N,KAAMwlB,EAAMxlB,KACZ6Y,WAAY,CACR7Y,KAAM,KACN4nB,cAAc,EACdlK,SAAAA,EACA7L,SAAAA,EACAnW,QAAAA,EACAgsB,cAAAA,EACAvO,QAAQ,EACRwE,WAAYiJ,GAAgBlrB,IAEhCgW,QAASoV,GAAStB,EAAMqC,YAAYxqB,KAAIqf,GAAa8I,EAAM3S,MAAM6J,KAC5Drf,KAAIwV,IACL,MAAM7S,KAAEA,EAAImZ,OAAEA,EAAM2O,WAAEA,EAAUpsB,QAAEA,GAAYmX,EAExCjF,EAAS,CACX5N,KAAAA,EACA6R,SAHaxZ,EAAQqD,GAIrBA,QAAAA,EACAyd,OAAAA,EACA2O,WAAAA,EACAnK,WAAYiJ,GAAgBlrB,IAGhC,OADAisB,EAAeX,GAAgBtrB,IAAYkS,EACpCA,KAEXkL,kBAAoBpd,GAAYisB,EAAeX,GAAgBtrB,KAMnE,OAJAisB,EAAe,OAAS/Z,EAAOiL,WAChB,MAAXnd,IACAisB,EAAeX,GAAgBtrB,IAAYkS,EAAOiL,YAE/CjL,MAGf2Z,UAAWC,EAAO1rB,OAAS,GAAM,WAAYkR,EAAMyY,YAAY+B,EAAO,OAC3C,oBAAdO,WAA6B,SAAS7kB,KAAK6kB,UAAUC,aACzD,oBAAoB9kB,KAAK6kB,UAAUC,YACpC,GAAGjrB,OAAOgrB,UAAUC,UAAUrI,MAAM,kBAAkB,GAAK,MA0Q7CsI,CAAcxb,EAAIya,GAC1CM,EAAS/W,EAAO+W,OAAOnqB,KAAI2oB,GAzPjC,SAA2BA,GACvB,MAAM1V,EAAY0V,EAAYhmB,KA4L9B,MAAO,CACHA,KAAMsQ,EACNG,OAAQuV,EACRvR,OA9LJ,UAAgBzH,MAAEA,EAAKhE,KAAEA,EAAI7Q,KAAEA,EAAI0R,OAAEA,EAAMsL,MAAEA,IACzC,OAAO,IAAIvc,SAAQ,CAAC8K,EAAS+C,KACzB/C,EAAUiF,GAAKjF,GACf,MAAM8hB,EAAQxY,EAAMyY,YAAYnV,GAC1BoN,EAA4B,MAAjB8H,EAAM9pB,QACjBwsB,EAAsB,QAATlf,GAA2B,QAATA,EACrC,IAAKkf,GAAuB,WAATlf,GAA8B,gBAATA,EACpC,MAAM,IAAI5N,MAAM,2BAA6B4N,GACjD,MAAMlN,OAAEA,GAAW3D,GAAQ0R,GAAU,CAAE/N,OAAQ,GAC/C,GAAI3D,GAAQ0R,GAAU1R,EAAK2D,SAAW+N,EAAO/N,OACzC,MAAM,IAAIV,MAAM,iEAEpB,GAAe,IAAXU,EACA,OAAO4H,EAAQ,CAAEgR,YAAa,EAAGtU,SAAU,GAAIsK,QAAS,GAAIiK,gBAAYtY,IAC5E,IAAI8rB,EACJ,MAAMC,EAAO,GACPhoB,EAAW,GACjB,IAAIsU,EAAc,EAClB,MAAM2T,EAAe/E,MACf5O,EACF6O,GAAeD,IAEnB,GAAa,gBAATta,EAAwB,CACxB,GAAmB,IAAfmM,EAAMnM,KACN,OAAOtF,EAAQ,CAAEgR,YAAAA,EAAatU,SAAAA,EAAUsK,QAAS,GAAIiK,gBAAYtY,IAClD,IAAf8Y,EAAMnM,KACNof,EAAKpsB,KAAKmsB,EAAM3C,EAAMtQ,SAEtBkT,EAAKpsB,KAAKmsB,EAAM3C,EAAMvQ,OAAOkS,EAAgBhS,SAEhD,CACD,MAAOmT,EAAOC,GAASL,EACnBxK,EACI,CAAC7T,EAAQ1R,GACT,CAAC0R,EAAQ,MACb,CAAC1R,EAAM,MACX,GAAI+vB,EACA,IAAK,IAAItsB,EAAI,EAAGA,EAAIE,IAAUF,EAC1BwsB,EAAKpsB,KAAKmsB,EAAOI,QAAsBlsB,IAAbksB,EAAM3sB,GAC5B4pB,EAAMxc,GAAMsf,EAAM1sB,GAAI2sB,EAAM3sB,IAC5B4pB,EAAMxc,GAAMsf,EAAM1sB,KACtBusB,EAAI5lB,QAAU8lB,OAIlB,IAAK,IAAIzsB,EAAI,EAAGA,EAAIE,IAAUF,EAC1BwsB,EAAKpsB,KAAKmsB,EAAM3C,EAAMxc,GAAMsf,EAAM1sB,KAClCusB,EAAI5lB,QAAU8lB,EAI1B,MAAMhpB,EAAOikB,IACT,MAAM3O,EAAa2O,EAAME,OAAO5V,OAChCwa,EAAK1vB,SAAQ,CAACyvB,EAAKvsB,IAAmB,MAAbusB,EAAI/M,QAAkBhb,EAASxE,GAAKusB,EAAI/M,SACjE1X,EAAQ,CACJgR,YAAAA,EACAtU,SAAAA,EACAsK,QAAkB,WAAT1B,EAAoB7Q,EAAOiwB,EAAK/qB,KAAI8qB,GAAOA,EAAIva,SACxD+G,WAAAA,KAGRwT,EAAI5lB,QAAU+gB,IACV+E,EAAa/E,GACbjkB,EAAKikB,IAET6E,EAAI7lB,UAAYjD,MA8HpBgW,QAAO,EAACrI,MAAEA,EAAK7U,KAAEA,KACN,IAAIS,SAAQ,CAAC8K,EAAS+C,KACzB/C,EAAUiF,GAAKjF,GACf,MAAM8hB,EAAQxY,EAAMyY,YAAYnV,GAC1BxU,EAAS3D,EAAK2D,OACd8R,EAAS,IAAItV,MAAMwD,GACzB,IAEIqsB,EAFAK,EAAW,EACXC,EAAgB,EAEpB,MAAMC,EAAiBpF,IACnB,MAAM6E,EAAM7E,EAAME,OACb5V,EAAOua,EAAIQ,MAAQR,EAAIva,SAEtB6a,IAAkBD,GACpB9kB,EAAQkK,IAEVya,EAAehF,GAAmB5c,GACxC,IAAK,IAAI7K,EAAI,EAAGA,EAAIE,IAAUF,EAEf,MADCzD,EAAKyD,KAEbusB,EAAM3C,EAAM5rB,IAAIzB,EAAKyD,IACrBusB,EAAIQ,KAAO/sB,EACXusB,EAAI7lB,UAAYomB,EAChBP,EAAI5lB,QAAU8lB,IACZG,GAGO,IAAbA,GACA9kB,EAAQkK,MAGpBhU,IAAG,EAACoT,MAAEA,EAAKrU,IAAEA,KACF,IAAIC,SAAQ,CAAC8K,EAAS+C,KACzB/C,EAAUiF,GAAKjF,GACf,MACMykB,EADQnb,EAAMyY,YAAYnV,GACd1W,IAAIjB,GACtBwvB,EAAI7lB,UAAYghB,GAAS5f,EAAQ4f,EAAME,OAAO5V,QAC9Cua,EAAI5lB,QAAU8gB,GAAmB5c,MAGzC2S,MAnFJ,SAAemO,GACX,OAAQqB,GACG,IAAIhwB,SAAQ,CAAC8K,EAAS+C,KACzB/C,EAAUiF,GAAKjF,GACf,MAAMsJ,MAAEA,EAAKnD,OAAEA,EAAMuJ,MAAEA,EAAKgG,MAAEA,GAAUwP,EAClCC,EAAkBzV,IAAU7J,EAAAA,OAAWlN,EAAY+W,GACnDP,MAAEA,EAAKsC,MAAEA,GAAUiE,EACnBoM,EAAQxY,EAAMyY,YAAYnV,GAC1BwY,EAASjW,EAAM+U,aAAepC,EAAQA,EAAM3S,MAAMA,EAAM7S,MACxD+oB,EAAc5B,EAAgBhS,GACpC,GAAc,IAAV/B,EACA,OAAO1P,EAAQ,CAAEkK,OAAQ,KAC7B,GAAI2Z,EAAW,CACX,MAAMY,EAAMte,EACRif,EAAOE,OAAOD,EAAaF,GAC3BC,EAAOG,WAAWF,EAAaF,GACnCV,EAAI7lB,UAAYghB,GAAS5f,EAAQ,CAAEkK,OAAQ0V,EAAME,OAAO5V,SACxDua,EAAI5lB,QAAU8gB,GAAmB5c,OAEhC,CACD,IAAIwM,EAAQ,EACZ,MAAMkV,EAAMte,KAAY,kBAAmBif,GACvCA,EAAO9P,WAAW+P,GAClBD,EAAOI,cAAcH,GACnBnb,EAAS,GACfua,EAAI7lB,UAAYghB,IACZ,MAAM9J,EAAS2O,EAAIva,OACnB,OAAK4L,GAEL5L,EAAO5R,KAAK6N,EAAS2P,EAAOzf,MAAQyf,EAAOX,cACrC5F,IAAUG,EACL1P,EAAQ,CAAEkK,OAAAA,SACrB4L,EAAOU,YAJIxW,EAAQ,CAAEkK,OAAAA,KAMzBua,EAAI5lB,QAAU8gB,GAAmB5c,OAiDtC2S,CAAMmO,GACbvO,WApKJ,UAAoBhM,MAAEA,EAAKnD,OAAEA,EAAMuP,MAAEA,EAAK1F,QAAEA,EAAOyF,OAAEA,IACjD,OAAO,IAAIvgB,SAAQ,CAAC8K,EAAS+C,KACzB/C,EAAUiF,GAAKjF,GACf,MAAMmP,MAAEA,EAAKsC,MAAEA,GAAUiE,EACnBoM,EAAQxY,EAAMyY,YAAYnV,GAC1BwY,EAASjW,EAAM+U,aACjBpC,EACAA,EAAM3S,MAAMA,EAAM7S,MAChBigB,EAAYvM,EACdyF,EACI,aACA,OACJA,EACI,aACA,OACFgP,EAAMte,KAAY,kBAAmBif,GACvCA,EAAO9P,WAAWmO,EAAgBhS,GAAQ8K,GAC1C6I,EAAOI,cAAc/B,EAAgBhS,GAAQ8K,GACjDkI,EAAI5lB,QAAU8gB,GAAmB5c,GACjC0hB,EAAI7lB,UAAYqG,IAAK8b,IACjB,MAAMjL,EAAS2O,EAAIva,OACnB,IAAK4L,EAED,YADA9V,EAAQ,MAGZ8V,EAAO2P,QAAUpC,GACjBvN,EAAOna,MAAO,EACd,MAAM+pB,EAAkB5P,EAAOU,SAAS3f,KAAKif,GAC7C,IAAI6P,EAA4B7P,EAAO8P,mBACnCD,IACAA,EAA4BA,EAA0B9uB,KAAKif,IAC/D,MAAM+P,EAAiB/P,EAAOC,QAAQlf,KAAKif,GAErCgQ,EAAyB,KAAQ,MAAM,IAAIpuB,MAAM,uBACvDoe,EAAOxM,MAAQA,EACfwM,EAAOE,KAAOF,EAAOU,SAAWV,EAAO8P,mBAAqB9P,EAAOC,QAHjC,KAAQ,MAAM,IAAIre,MAAM,uBAI1Doe,EAAOG,KAAOhR,GAAKlC,GACnB+S,EAAOpa,KAAO,WACV,IAAIqqB,EAAS,EACb,OAAOtqB,KAAKtE,OAAM,IAAM4uB,IAAWtqB,KAAK+a,WAAa/a,KAAKua,SAAQ5W,MAAK,IAAM3D,QAEjFqa,EAAO3e,MAASuJ,IACZ,MAAMslB,EAAmB,IAAI9wB,SAAQ,CAAC+wB,EAAkBC,KACpDD,EAAmBhhB,GAAKghB,GACxBxB,EAAI5lB,QAAU8gB,GAAmBuG,GACjCpQ,EAAOG,KAAOiQ,EACdpQ,EAAOE,KAAO3f,IACVyf,EAAOE,KAAOF,EAAOU,SAAWV,EAAO8P,mBAAqB9P,EAAOC,QAAU+P,EAC7EG,EAAiB5vB,OAGnB8vB,EAAkB,KACpB,GAAI1B,EAAIva,OACJ,IACIxJ,IAEJ,MAAO8E,GACHsQ,EAAOG,KAAKzQ,QAIhBsQ,EAAOna,MAAO,EACdma,EAAO3e,MAAQ,KAAQ,MAAM,IAAIO,MAAM,6BACvCoe,EAAOE,QAWf,OARAyO,EAAI7lB,UAAYqG,IAAK8b,IACjB0D,EAAI7lB,UAAYunB,EAChBA,OAEJrQ,EAAOU,SAAWkP,EAClB5P,EAAO8P,mBAAqBD,EAC5B7P,EAAOC,QAAU8P,EACjBM,IACOH,GAEXhmB,EAAQ8V,KACT/S,OAwFPwM,OAAMmG,MAAEA,EAAKpM,MAAEA,IACX,MAAM6F,MAAEA,EAAKsC,MAAEA,GAAUiE,EACzB,OAAO,IAAIxgB,SAAQ,CAAC8K,EAAS+C,KACzB,MAAM+e,EAAQxY,EAAMyY,YAAYnV,GAC1BwY,EAASjW,EAAM+U,aAAepC,EAAQA,EAAM3S,MAAMA,EAAM7S,MACxD+oB,EAAc5B,EAAgBhS,GAC9BgT,EAAMY,EAAcD,EAAO7V,MAAM8V,GAAeD,EAAO7V,QAC7DkV,EAAI7lB,UAAYqG,IAAK8b,GAAM/gB,EAAQ+gB,EAAGjB,OAAO5V,UAC7Cua,EAAI5lB,QAAU8gB,GAAmB5c,QAMDqjB,CAAkB9D,KAC5D+D,EAAW,GAEjB,OADAvC,EAAO9uB,SAAQmb,GAASkW,EAASlW,EAAM7T,MAAQ6T,IACxC,CACHmW,MAAO,SACP1F,YAAa7X,EAAG6X,YAAY/pB,KAAKkS,GACjCoH,MAAM7T,GAEF,IADe+pB,EAAS/pB,GAEpB,MAAM,IAAI5E,MAAM,UAAU4E,gBAC9B,OAAO+pB,EAAS/pB,IAEpBiqB,SAAU1gB,EAAAA,EACV2gB,QAASzD,GAAUC,GACnBjW,OAAAA,GAaR,SAAS0Z,GAAyB1d,EAAIya,GAClC,MAAMta,EAAQsa,EAASza,GACjB2d,EARV,SAAgCC,EAAazd,GAAO0d,YAAEA,EAAW9X,UAAEA,GAAa0U,GAC5E,MAAMqD,EAJV,SAA+BC,EAAWH,GACtC,OAAOA,EAAYvpB,QAAO,CAAC2pB,GAAQnwB,OAAAA,MAAa,IAAMmwB,KAASnwB,EAAOmwB,MAAUD,GAGjEE,CAAsBzD,GAAara,EAAO0d,EAAapD,GAAWmD,EAAYE,QAC7F,MAAO,CACHA,OAAAA,GAKWI,CAAuBle,EAAGme,aAAche,EAAOH,EAAG8F,MAAO2U,GACxEza,EAAGwE,KAAOmZ,EAAOG,OACjB9d,EAAG+a,OAAO9uB,SAAQmb,IACd,MAAMvD,EAAYuD,EAAM7T,KACpByM,EAAGwE,KAAKR,OAAO+W,OAAOjgB,MAAKsjB,GAAOA,EAAI7qB,OAASsQ,MAC/CuD,EAAM5C,KAAOxE,EAAGwE,KAAK4C,MAAMvD,GACvB7D,EAAG6D,aAAsB7D,EAAGyD,QAC5BzD,EAAG6D,GAAWW,KAAO4C,EAAM5C,UAM3C,SAAS6Z,GAAcre,EAAI8J,EAAMwU,EAAYC,GACzCD,EAAWryB,SAAQ4X,IACf,MAAMG,EAASua,EAAS1a,GACxBiG,EAAK7d,SAAQF,IACT,MAAMyyB,EAAWxwB,EAAsBjC,EAAK8X,KACvC2a,GAAa,UAAWA,QAA+B5uB,IAAnB4uB,EAASlxB,SAC1CvB,IAAQiU,EAAGkX,YAAYtpB,WAAa7B,aAAeiU,EAAGkX,YACtDnqB,EAAQhB,EAAK8X,EAAW,CACpB1W,MAAQ,OAAOuF,KAAK0U,MAAMvD,IAC1BzW,IAAIE,GACAN,EAAe0F,KAAMmR,EAAW,CAAEvW,MAAAA,EAAOC,UAAU,EAAMF,cAAc,EAAMoxB,YAAY,OAKjG1yB,EAAI8X,GAAa,IAAI7D,EAAGyD,MAAMI,EAAWG,UAM7D,SAAS0a,GAAgB1e,EAAI8J,GACzBA,EAAK7d,SAAQF,IACT,IAAK,IAAIG,KAAOH,EACRA,EAAIG,aAAgB8T,EAAGyD,cAChB1X,EAAIG,MAI3B,SAASyyB,GAAkBnuB,EAAG9B,GAC1B,OAAO8B,EAAEouB,KAAKC,QAAUnwB,EAAEkwB,KAAKC,QAEnC,SAASC,GAAa9e,EAAI+e,EAAYC,EAAiBhlB,GACnD,MAAMilB,EAAejf,EAAGS,UACpBue,EAAgBhE,iBAAiBkE,SAAS,WAAaD,EAAaE,QACpEF,EAAaE,MAAQvF,GAAkB,QAASwF,GAAiB,IAAI,GAAI,IACzEpf,EAAGqf,YAAY9vB,KAAK,UAExB,MAAMgR,EAAQP,EAAGQ,mBAAmB,YAAaR,EAAGqf,YAAaJ,GACjE1e,EAAM1S,OAAOmxB,GACbze,EAAMe,YAAYhF,MAAMtC,GACxB,MAAMslB,EAAoB/e,EAAM0X,QAAQnqB,KAAKyS,GACvC4D,EAAYvL,GAAIuL,WAAavL,GACnC6E,IAAS,KAGL,GAFA7E,GAAI2H,MAAQA,EACZ3H,GAAIuL,UAAYA,EACG,IAAf4a,EASA,OADArB,GAAyB1d,EAAIgf,GA4BzC,SAA4Bhf,EAAIO,EAAOwe,GACnC,OAAIxe,EAAML,WAAWgO,SAAS,SACnB3N,EAAM6G,MAAM,SAASja,IAAI,WAAWkJ,MAAKkpB,GACtB,MAAfA,EAAsBA,EAAcR,IAIxChmB,GAAa9B,QAAQ8nB,GAlCjBS,CAAmBxf,EAAIO,EAAOwe,GAChC1oB,MAAK0oB,GAoCtB,SAAgC/e,EAAI+e,EAAYxe,EAAOye,GACnD,MAAMS,EAAQ,GACRC,EAAW1f,EAAG2f,UACpB,IAAIV,EAAejf,EAAGS,UAAYmf,GAAkB5f,EAAIA,EAAGG,MAAO6e,GAClE,MAAMa,EAAYH,EAAS3uB,QAAOM,GAAKA,EAAEutB,KAAKC,SAAWE,IACzD,GAAyB,IAArBc,EAAUxwB,OACV,OAAO0J,GAAa9B,UA4ExB,SAAS6oB,IACL,OAAOL,EAAMpwB,OAAS0J,GAAa9B,QAAQwoB,EAAM/H,OAAN+H,CAAclf,EAAMa,WAAW/K,KAAKypB,GAC3E/mB,GAAa9B,UAErB,OA9EA4oB,EAAU5zB,SAAQ4yB,IACdY,EAAMlwB,MAAK,KACP,MAAMwwB,EAAYd,EACZe,EAAYnB,EAAQD,KAAKL,SAC/B0B,GAA2BjgB,EAAI+f,EAAWf,GAC1CiB,GAA2BjgB,EAAIggB,EAAWhB,GAC1CC,EAAejf,EAAGS,UAAYuf,EAC9B,MAAME,EAAOC,GAAcJ,EAAWC,GACtCE,EAAK1Y,IAAIvb,SAAQm0B,IACbC,GAAYrB,EAAiBoB,EAAM,GAAIA,EAAM,GAAGlb,QAASkb,EAAM,GAAGnb,YAEtEib,EAAKI,OAAOr0B,SAAQq0B,IAChB,GAAIA,EAAOC,SACP,MAAM,IAAIhsB,EAAWisB,QAAQ,4CAE5B,CACD,MAAMzH,EAAQiG,EAAgBhG,YAAYsH,EAAO/sB,MACjD+sB,EAAO9Y,IAAIvb,SAAQ+Z,GAAOya,GAAS1H,EAAO/S,KAC1Csa,EAAOA,OAAOr0B,SAAQ+Z,IAClB+S,EAAM2H,YAAY1a,EAAIzS,MACtBktB,GAAS1H,EAAO/S,MAEpBsa,EAAOK,IAAI10B,SAAQ20B,GAAW7H,EAAM2H,YAAYE,SAGxD,MAAMC,EAAiBhC,EAAQD,KAAKiC,eACpC,GAAIA,GAAkBhC,EAAQD,KAAKC,QAAUE,EAAY,CACrDrB,GAAyB1d,EAAIgf,GAC7Bze,EAAM+Y,gBAAkB,GACxB,IAAIwH,EAAgB1wB,EAAa4vB,GACjCE,EAAKS,IAAI10B,SAAQmb,IACb0Z,EAAc1Z,GAAS2Y,EAAU3Y,MAErCsX,GAAgB1e,EAAI,CAACA,EAAGkX,YAAYtpB,YACpCywB,GAAcre,EAAI,CAACA,EAAGkX,YAAYtpB,WAAYlC,EAAKo1B,GAAgBA,GACnEvgB,EAAMyD,OAAS8c,EACf,MAAMC,EAAwBluB,EAAgBguB,GAI9C,IAAIG,EAHAD,GACA/hB,KAGJ,MAAMiiB,EAAkBloB,GAAa4E,QAAO,KAExC,GADAqjB,EAAcH,EAAetgB,GACzBygB,GACID,EAAuB,CACvB,IAAIG,EAAcnnB,GAAwBjM,KAAK,KAAM,MACrDkzB,EAAY3qB,KAAK6qB,EAAaA,OAI1C,OAAQF,GAA2C,mBAArBA,EAAY3qB,KACtC0C,GAAa9B,QAAQ+pB,GAAeC,EAAgB5qB,MAAK,IAAM2qB,QAG3EvB,EAAMlwB,MAAK6R,KAkGnB,SAA6B4e,EAAW5e,GACpC,GAAGlT,MAAMxB,KAAK0U,EAASpB,GAAGgb,kBAAkB/uB,SAAQk1B,GAAqC,MAAxBnB,EAAUmB,IAAsB/f,EAASpB,GAAGohB,kBAAkBD,KAjGvHE,CADkBxC,EAAQD,KAAKL,SACAnd,GAC/Bsd,GAAgB1e,EAAI,CAACA,EAAGkX,YAAYtpB,YACpCywB,GAAcre,EAAI,CAACA,EAAGkX,YAAYtpB,WAAYoS,EAAGqf,YAAarf,EAAGS,WACjEF,EAAMyD,OAAShE,EAAGS,aAEtBgf,EAAMlwB,MAAK6R,IACHpB,EAAGG,MAAM6a,iBAAiBkE,SAAS,WAC/BlQ,KAAKsS,KAAKthB,EAAGG,MAAM0e,QAAU,MAAQA,EAAQD,KAAKC,SAClD7e,EAAGG,MAAMihB,kBAAkB,gBACpBphB,EAAGS,UAAU0e,MACpBnf,EAAGqf,YAAcrf,EAAGqf,YAAYtuB,QAAOwC,GAAiB,UAATA,KAG/C6N,EAAS4X,YAAY,SAASzQ,IAAIsW,EAAQD,KAAKC,QAAS,kBASjEiB,IAAWzpB,MAAK,KACnBkrB,GAAoBtC,EAAcD,MA3HNwC,CAAuBxhB,EAAI+e,EAAYxe,EAAOye,KACjE1iB,MAAMgjB,GAVX5zB,EAAKuzB,GAAchzB,SAAQ4X,IACvBwc,GAAYrB,EAAiBnb,EAAWob,EAAapb,GAAWqB,QAAS+Z,EAAapb,GAAWoB,YAErGyY,GAAyB1d,EAAIgf,GAC7BjmB,GAAa4E,QAAO,IAAMqC,EAAGmY,GAAGsJ,SAAS9c,KAAKpE,KAAQjE,MAAMgjB,MAmIxE,SAASa,GAAcJ,EAAWC,GAC9B,MAAME,EAAO,CACTS,IAAK,GACLnZ,IAAK,GACL8Y,OAAQ,IAEZ,IAAIlZ,EACJ,IAAKA,KAAS2Y,EACLC,EAAU5Y,IACX8Y,EAAKS,IAAIpxB,KAAK6X,GAEtB,IAAKA,KAAS4Y,EAAW,CACrB,MAAM0B,EAAS3B,EAAU3Y,GAAQua,EAAS3B,EAAU5Y,GACpD,GAAKsa,EAGA,CACD,MAAMpB,EAAS,CACX/sB,KAAM6T,EACNwa,IAAKD,EACLpB,UAAU,EACVI,IAAK,GACLnZ,IAAK,GACL8Y,OAAQ,IAEZ,GACA,IAAMoB,EAAOxc,QAAQjW,SAAW,KAAU,IAAM0yB,EAAOzc,QAAQjW,SAAW,KACrEyyB,EAAOxc,QAAQ4C,OAAS6Z,EAAOzc,QAAQ4C,KACxCwY,EAAOC,UAAW,EAClBL,EAAKI,OAAO/wB,KAAK+wB,OAEhB,CACD,MAAMuB,EAAaH,EAAO9b,UACpBkc,EAAaH,EAAO/b,UAC1B,IAAIgb,EACJ,IAAKA,KAAWiB,EACPC,EAAWlB,IACZN,EAAOK,IAAIpxB,KAAKqxB,GAExB,IAAKA,KAAWkB,EAAY,CACxB,MAAMC,EAASF,EAAWjB,GAAUoB,EAASF,EAAWlB,GACnDmB,EAEIA,EAAOrI,MAAQsI,EAAOtI,KAC3B4G,EAAOA,OAAO/wB,KAAKyyB,GAFnB1B,EAAO9Y,IAAIjY,KAAKyyB,IAIpB1B,EAAOK,IAAItxB,OAAS,GAAKixB,EAAO9Y,IAAInY,OAAS,GAAKixB,EAAOA,OAAOjxB,OAAS,IACzE6wB,EAAKI,OAAO/wB,KAAK+wB,SAjCzBJ,EAAK1Y,IAAIjY,KAAK,CAAC6X,EAAOua,IAsC9B,OAAOzB,EAEX,SAASG,GAAYjf,EAAUyC,EAAWqB,EAASD,GAC/C,MAAM8T,EAAQ3X,EAASpB,GAAGiiB,kBAAkBpe,EAAWqB,EAAQjW,QAC3D,CAAEA,QAASiW,EAAQjW,QAASgsB,cAAe/V,EAAQ4C,MACnD,CAAEmT,cAAe/V,EAAQ4C,OAE7B,OADA7C,EAAQhZ,SAAQ+Z,GAAOya,GAAS1H,EAAO/S,KAChC+S,EAEX,SAASwI,GAAoBvB,EAAW5e,GACpC1V,EAAKs0B,GAAW/zB,SAAQ4X,IACfzC,EAASpB,GAAGgb,iBAAiBkE,SAASrb,KACnCtN,IACAsK,QAAQtK,MAAM,gCAAiCsN,GACnDwc,GAAYjf,EAAUyC,EAAWmc,EAAUnc,GAAWqB,QAAS8a,EAAUnc,GAAWoB,aAOhG,SAASwb,GAAS1H,EAAO/S,GACrB+S,EAAMmJ,YAAYlc,EAAIzS,KAAMyS,EAAI/W,QAAS,CAAEyd,OAAQ1G,EAAI0G,OAAQ2O,WAAYrV,EAAIK,QAEnF,SAASuZ,GAAkB5f,EAAIG,EAAOsa,GAClC,MAAMwE,EAAe,GAerB,OAdqB/wB,EAAMiS,EAAM6a,iBAAkB,GACtC/uB,SAAQk1B,IACjB,MAAMpI,EAAQ0B,EAASzB,YAAYmI,GACnC,IAAIlyB,EAAU8pB,EAAM9pB,QACpB,MAAMiW,EAAUuU,GAAgBE,GAAgB1qB,GAAUA,GAAW,IAAI,GAAM,IAAS8pB,EAAMkC,cAAehsB,GAA8B,iBAAZA,GAAsB,GAC/IgW,EAAU,GAChB,IAAK,IAAIkd,EAAI,EAAGA,EAAIpJ,EAAMqC,WAAW/rB,SAAU8yB,EAAG,CAC9C,MAAMC,EAAWrJ,EAAM3S,MAAM2S,EAAMqC,WAAW+G,IAC9ClzB,EAAUmzB,EAASnzB,QACnB,IAAImX,EAAQqT,GAAgB2I,EAAS7uB,KAAMtE,IAAWmzB,EAAS1V,SAAU0V,EAAS/G,YAAY,EAAOpsB,GAA8B,iBAAZA,GAAsB,GAC7IgW,EAAQ1V,KAAK6W,GAEjB6Y,EAAakC,GAAavH,GAAkBuH,EAAWjc,EAASD,MAE7Dga,EAaX,SAASgB,GAA2BjgB,EAAIgE,EAAQ5C,GAC5C,MAAMlB,EAAakB,EAASpB,GAAGgb,iBAC/B,IAAK,IAAI7rB,EAAI,EAAGA,EAAI+Q,EAAW7Q,SAAUF,EAAG,CACxC,MAAMgyB,EAAYjhB,EAAW/Q,GACvB4pB,EAAQ3X,EAAS4X,YAAYmI,GACnCnhB,EAAGqiB,WAAa,WAAYtJ,EAC5B,IAAK,IAAIoJ,EAAI,EAAGA,EAAIpJ,EAAMqC,WAAW/rB,SAAU8yB,EAAG,CAC9C,MAAMlS,EAAY8I,EAAMqC,WAAW+G,GAC7BlzB,EAAU8pB,EAAM3S,MAAM6J,GAAWhhB,QACjCqzB,EAA+B,iBAAZrzB,EAAuBA,EAAU,IAAMf,EAAMe,GAAS4E,KAAK,KAAO,IAC3F,GAAImQ,EAAOmd,GAAY,CACnB,MAAMoB,EAAYve,EAAOmd,GAAWvb,UAAU0c,GAC1CC,IACAA,EAAUhvB,KAAO0c,SACVjM,EAAOmd,GAAWvb,UAAU0c,GACnCte,EAAOmd,GAAWvb,UAAUqK,GAAasS,KAKhC,oBAAdjH,WAA6B,SAAS7kB,KAAK6kB,UAAUC,aAC3D,oBAAoB9kB,KAAK6kB,UAAUC,YACpClwB,EAAQm3B,mBAAqBn3B,aAAmBA,EAAQm3B,mBACxD,GAAGlyB,OAAOgrB,UAAUC,UAAUrI,MAAM,kBAAkB,GAAK,MAC3DlT,EAAGqiB,YAAa,GAGxB,SAASjD,GAAiBqD,GACtB,OAAOA,EAAkB9xB,MAAM,KAAKC,KAAI,CAACwV,EAAOsc,KAE5C,MAAMnvB,GADN6S,EAAQA,EAAMuc,QACKC,QAAQ,eAAgB,IACrC3zB,EAAU,MAAMwH,KAAKlD,GAAQA,EAAK2f,MAAM,cAAc,GAAGviB,MAAM,KAAO4C,EAC5E,OAAOkmB,GAAgBlmB,EAAMtE,GAAW,KAAM,KAAKwH,KAAK2P,GAAQ,KAAK3P,KAAK2P,GAAQ,OAAO3P,KAAK2P,GAAQxa,EAAQqD,GAAuB,IAAbyzB,MAIhI,MAAMG,GACFC,iBAAiBC,EAAQC,GACrBt3B,EAAKq3B,GAAQ92B,SAAQ4X,IACjB,GAA0B,OAAtBkf,EAAOlf,GAAqB,CAC5B,IAAIoB,EAAUma,GAAiB2D,EAAOlf,IAClCqB,EAAUD,EAAQyS,QAEtB,GADAxS,EAAQwH,QAAS,EACbxH,EAAQmB,MACR,MAAM,IAAI9R,EAAW+X,OAAO,sCAChCrH,EAAQhZ,SAAQ+Z,IACZ,GAAIA,EAAI8B,KACJ,MAAM,IAAIvT,EAAW+X,OAAO,wDAChC,IAAKtG,EAAI/W,QACL,MAAM,IAAIsF,EAAW+X,OAAO,2DAEpC0W,EAAUnf,GAAa+V,GAAkB/V,EAAWqB,EAASD,OAIzE8d,OAAOA,GACH,MAAM/iB,EAAKtN,KAAKsN,GAChBtN,KAAKksB,KAAKqE,aAAevwB,KAAKksB,KAAKqE,aAC/Bn3B,EAAO4G,KAAKksB,KAAKqE,aAAcF,GAC/BA,EACJ,MAAMrD,EAAW1f,EAAG2f,UACduD,EAAa,GACnB,IAAI3E,EAAW,GAUf,OATAmB,EAASzzB,SAAQ4yB,IACb/yB,EAAOo3B,EAAYrE,EAAQD,KAAKqE,cAChC1E,EAAYM,EAAQD,KAAKL,SAAW,GACpCM,EAAQiE,iBAAiBI,EAAY3E,MAEzCve,EAAGS,UAAY8d,EACfG,GAAgB1e,EAAI,CAACA,EAAGmjB,WAAYnjB,EAAIA,EAAGkX,YAAYtpB,YACvDywB,GAAcre,EAAI,CAACA,EAAGmjB,WAAYnjB,EAAIA,EAAGkX,YAAYtpB,UAAW8E,KAAKksB,KAAK7D,QAASrvB,EAAK6yB,GAAWA,GACnGve,EAAGqf,YAAc3zB,EAAK6yB,GACf7rB,KAEX0wB,QAAQC,GAEJ,OADA3wB,KAAKksB,KAAKiC,eAAiBzqB,GAAgB1D,KAAKksB,KAAKiC,gBAAkB1rB,EAAKkuB,GACrE3wB,MAiBf,SAAS4wB,GAAgBvd,EAAW8X,GAChC,IAAI0F,EAAYxd,EAAsB,WAStC,OARKwd,IACDA,EAAYxd,EAAsB,WAAI,IAAIyd,GA16E/B,YA06EmD,CAC1DC,OAAQ,GACR1d,UAAAA,EACA8X,YAAAA,IAEJ0F,EAAU1E,QAAQ,GAAGkE,OAAO,CAAEW,QAAS,UAEpCH,EAAUnc,MAAM,WAE3B,SAASuc,GAAmB5d,GACxB,OAAOA,GAA4C,mBAAxBA,EAAU6d,UAoBzC,SAASC,GAAIh1B,GACT,OAAO4O,IAAS,WAEZ,OADA7E,GAAIyH,YAAa,EACVxR,OAIf,SAASi1B,KACL,IAKIC,EAFJ,OAHgBzI,UAAU0I,eACtB,WAAWvtB,KAAK6kB,UAAUC,aACzB,iBAAiB9kB,KAAK6kB,UAAUC,YACnBxV,UAAU6d,UAGrB,IAAIz3B,SAAQ,SAAU8K,GACzB,IAAIgtB,EAAS,WAAc,OAAOle,UAAU6d,YAAYlnB,QAAQzF,IAChE8sB,EAAaG,YAAYD,EAAQ,KACjCA,OACDvnB,SAAQ,WAAc,OAAOynB,cAAcJ,MANnC53B,QAAQ8K,UASvB,SAASmtB,GAAaC,GAClB,QAAS,SAAUA,GAEvB,MAAMC,GAAW,SAAUC,EAAYC,GACnC,IAAI9xB,KAGC,CACD,MAAMxD,EAAK,IAAIo1B,GAIf,OAHIC,GAAe,MAAOA,GACtBz4B,EAAOoD,EAAIq1B,GAERr1B,EAPPpD,EAAO4G,KAAMD,UAAUpD,OAAS,CAAEo1B,EAAG,EAAG/2B,KAAM62B,EAAYC,GAAI/xB,UAAUpD,OAAS,EAAIm1B,EAAKD,GAAe,CAAEE,EAAG,KA2BtH,SAASC,GAAS3N,EAAQrpB,EAAM82B,GAC5B,MAAMtE,EAAOxd,GAAIhV,EAAM82B,GACvB,GAAIv0B,MAAMiwB,GACN,OACJ,GAAIA,EAAO,EACP,MAAMlrB,aACV,GAAIovB,GAAarN,GACb,OAAOjrB,EAAOirB,EAAQ,CAAErpB,KAAAA,EAAM82B,GAAAA,EAAIC,EAAG,IACzC,MAAME,EAAO5N,EAAO3nB,EACdw1B,EAAQ7N,EAAO8N,EACrB,GAAIniB,GAAI8hB,EAAIzN,EAAOrpB,MAAQ,EAIvB,OAHAi3B,EACMD,GAASC,EAAMj3B,EAAM82B,GACpBzN,EAAO3nB,EAAI,CAAE1B,KAAAA,EAAM82B,GAAAA,EAAIC,EAAG,EAAGr1B,EAAG,KAAMy1B,EAAG,MACzCC,GAAU/N,GAErB,GAAIrU,GAAIhV,EAAMqpB,EAAOyN,IAAM,EAIvB,OAHAI,EACMF,GAASE,EAAOl3B,EAAM82B,GACrBzN,EAAO8N,EAAI,CAAEn3B,KAAAA,EAAM82B,GAAAA,EAAIC,EAAG,EAAGr1B,EAAG,KAAMy1B,EAAG,MACzCC,GAAU/N,GAEjBrU,GAAIhV,EAAMqpB,EAAOrpB,MAAQ,IACzBqpB,EAAOrpB,KAAOA,EACdqpB,EAAO3nB,EAAI,KACX2nB,EAAO0N,EAAIG,EAAQA,EAAMH,EAAI,EAAI,GAEjC/hB,GAAI8hB,EAAIzN,EAAOyN,IAAM,IACrBzN,EAAOyN,GAAKA,EACZzN,EAAO8N,EAAI,KACX9N,EAAO0N,EAAI1N,EAAO3nB,EAAI2nB,EAAO3nB,EAAEq1B,EAAI,EAAI,GAE3C,MAAMM,GAAkBhO,EAAO8N,EAC3BF,IAAS5N,EAAO3nB,GAChB41B,GAAYjO,EAAQ4N,GAEpBC,GAASG,GACTC,GAAYjO,EAAQ6N,GAG5B,SAASI,GAAYjO,EAAQkO,GAQpBb,GAAaa,IAPlB,SAASC,EAAanO,GAAQrpB,KAAEA,EAAI82B,GAAEA,EAAEp1B,EAAEA,EAACy1B,EAAEA,IACzCH,GAAS3N,EAAQrpB,EAAM82B,GACnBp1B,GACA81B,EAAanO,EAAQ3nB,GACrBy1B,GACAK,EAAanO,EAAQ8N,GAGzBK,CAAanO,EAAQkO,GAE7B,SAASE,GAAcC,EAAWC,GAC9B,MAAMC,EAAKC,GAAoBF,GAC/B,IAAIG,EAAcF,EAAG3yB,OACrB,GAAI6yB,EAAY5yB,KACZ,OAAO,EACX,IAAIpC,EAAIg1B,EAAYl4B,MACpB,MAAMm4B,EAAKF,GAAoBH,GAC/B,IAAIM,EAAcD,EAAG9yB,KAAKnC,EAAE9C,MACxBgB,EAAIg3B,EAAYp4B,MACpB,MAAQk4B,EAAY5yB,OAAS8yB,EAAY9yB,MAAM,CAC3C,GAAI8P,GAAIhU,EAAEhB,KAAM8C,EAAEg0B,KAAO,GAAK9hB,GAAIhU,EAAE81B,GAAIh0B,EAAE9C,OAAS,EAC/C,OAAO,EACXgV,GAAIlS,EAAE9C,KAAMgB,EAAEhB,MAAQ,EACf8C,GAAKg1B,EAAcF,EAAG3yB,KAAKjE,EAAEhB,OAAOJ,MACpCoB,GAAKg3B,EAAcD,EAAG9yB,KAAKnC,EAAE9C,OAAOJ,MAE/C,OAAO,EAEX,SAASi4B,GAAoBlB,GACzB,IAAIsB,EAAQvB,GAAaC,GAAQ,KAAO,CAAEzwB,EAAG,EAAGwhB,EAAGiP,GACnD,MAAO,CACH1xB,KAAKzG,GACD,MAAM05B,EAAcnzB,UAAUpD,OAAS,EACvC,KAAOs2B,GACH,OAAQA,EAAM/xB,GACV,KAAK,EAED,GADA+xB,EAAM/xB,EAAI,EACNgyB,EACA,KAAOD,EAAMvQ,EAAEhmB,GAAKsT,GAAIxW,EAAKy5B,EAAMvQ,EAAE1nB,MAAQ,GACzCi4B,EAAQ,CAAEE,GAAIF,EAAOvQ,EAAGuQ,EAAMvQ,EAAEhmB,EAAGwE,EAAG,QAG1C,KAAO+xB,EAAMvQ,EAAEhmB,GACXu2B,EAAQ,CAAEE,GAAIF,EAAOvQ,EAAGuQ,EAAMvQ,EAAEhmB,EAAGwE,EAAG,GAElD,KAAK,EAED,GADA+xB,EAAM/xB,EAAI,GACLgyB,GAAeljB,GAAIxW,EAAKy5B,EAAMvQ,EAAEoP,KAAO,EACxC,MAAO,CAAEl3B,MAAOq4B,EAAMvQ,EAAGxiB,MAAM,GACvC,KAAK,EACD,GAAI+yB,EAAMvQ,EAAEyP,EAAG,CACXc,EAAM/xB,EAAI,EACV+xB,EAAQ,CAAEE,GAAIF,EAAOvQ,EAAGuQ,EAAMvQ,EAAEyP,EAAGjxB,EAAG,GACtC,SAER,KAAK,EACD+xB,EAAQA,EAAME,GAG1B,MAAO,CAAEjzB,MAAM,KAI3B,SAASkyB,GAAU/N,GACf,MAAMmJ,GAAQnJ,EAAO8N,GAAGJ,GAAK,IAAM1N,EAAO3nB,GAAGq1B,GAAK,GAC5CI,EAAI3E,EAAO,EAAI,IAAMA,GAAQ,EAAI,IAAM,GAC7C,GAAI2E,EAAG,CACH,MAAMz1B,EAAU,MAANy1B,EAAY,IAAM,IACtBiB,EAAY,IAAK/O,GACjBgP,EAAehP,EAAO8N,GAC5B9N,EAAOrpB,KAAOq4B,EAAar4B,KAC3BqpB,EAAOyN,GAAKuB,EAAavB,GACzBzN,EAAO8N,GAAKkB,EAAalB,GACzBiB,EAAUjB,GAAKkB,EAAa32B,GAC5B2nB,EAAO3nB,GAAK02B,EACZA,EAAUrB,EAAIuB,GAAaF,GAE/B/O,EAAO0N,EAAIuB,GAAajP,GAE5B,SAASiP,IAAanB,EAAEA,EAACz1B,EAAEA,IACvB,OAAQy1B,EAAKz1B,EAAI4f,KAAKiH,IAAI4O,EAAEJ,EAAGr1B,EAAEq1B,GAAKI,EAAEJ,EAAKr1B,EAAIA,EAAEq1B,EAAI,GAAK,EAGhE,SAASwB,GAAuBlP,EAAQkO,GAOpC,OANAv5B,EAAKu5B,GAAQh5B,SAAQi6B,IACbnP,EAAOmP,GACPlB,GAAYjO,EAAOmP,GAAOjB,EAAOiB,IAEjCnP,EAAOmP,GAAQh1B,EAAsB+zB,EAAOiB,OAE7CnP,EAGX,SAASoP,GAAeC,EAAKC,GACzB,OAAOD,EAAIjpB,KAAOkpB,EAAIlpB,KAAOxR,OAAOD,KAAK06B,GAAKtrB,MAAM5O,GAAQm6B,EAAIn6B,IAAQi5B,GAAckB,EAAIn6B,GAAMk6B,EAAIl6B,MAxJxGS,EAAM23B,GAAS12B,UAAW,CACtB4Z,IAAI8e,GAEA,OADAtB,GAAYtyB,KAAM4zB,GACX5zB,MAEX6zB,OAAOr6B,GAEH,OADAw4B,GAAShyB,KAAMxG,EAAKA,GACbwG,MAEX8zB,QAAQ96B,GAEJ,OADAA,EAAKO,SAAQC,GAAOw4B,GAAShyB,KAAMxG,EAAKA,KACjCwG,MAEXV,CAACA,KACG,OAAOuzB,GAAoB7yB,SA6InC,MAAMmX,GAAQ,GAEd,IAAI4c,GAAkB,GAClBC,IAAiB,EACrB,SAASC,GAAwBT,EAAMU,GAAa,GAChDX,GAAuBQ,GAAiBP,GACnCQ,KACDA,IAAiB,EACjB33B,YAAW,KACP23B,IAAiB,EACjB,MAAMvX,EAAQsX,GACdA,GAAkB,GAClBI,GAAqB1X,GAAO,KAC7B,IAGX,SAAS0X,GAAqBC,EAAcC,GAA6B,GACrE,MAAMC,EAAkB,IAAI/1B,IAC5B,GAAI61B,EAAa3pB,IACb,IAAK,MAAM8pB,KAAYt7B,OAAOyR,OAAOyM,IACjCqd,GAAwBD,EAAUH,EAAcE,EAAiBD,QAIrE,IAAK,MAAM76B,KAAO46B,EAAc,CAC5B,MAAM3X,EAAQ,yBAAyBgY,KAAKj7B,GAC5C,GAAIijB,EAAO,CACP,MAAO,CAAEiY,EAAQvjB,GAAasL,EACxB8X,EAAWpd,GAAM,SAASud,KAAUvjB,KACtCojB,GACAC,GAAwBD,EAAUH,EAAcE,EAAiBD,IAIjFC,EAAgB/6B,SAASo7B,GAAYA,MAEzC,SAASH,GAAwBD,EAAUH,EAAcQ,EAAoBP,GACzE,MAAMQ,EAAoB,GAC1B,IAAK,MAAOtX,EAAWuX,KAAY77B,OAAO67B,QAAQP,EAASQ,QAAQ9a,OAAQ,CACvE,MAAM+a,EAAkB,GACxB,IAAK,MAAMje,KAAS+d,EACZrB,GAAeW,EAAcrd,EAAMke,QACnCle,EAAM0B,YAAYlf,SAASo7B,GAAYC,EAAmB9f,IAAI6f,KAEzDN,GACLW,EAAgBn4B,KAAKka,GAGzBsd,GACAQ,EAAkBh4B,KAAK,CAAC0gB,EAAWyX,IAE3C,GAAIX,EACA,IAAK,MAAO9W,EAAWyX,KAAoBH,EACvCN,EAASQ,QAAQ9a,MAAMsD,GAAayX,EAKhD,SAASE,GAAU5nB,GACf,MAAM2lB,EAAQ3lB,EAAG5G,QACX2M,UAAEA,GAAc/F,EAAG8F,MACzB,GAAI6f,EAAMnkB,eAAiBxB,EAAGG,MAC1B,OAAOwlB,EAAMjkB,eAAerL,MAAK,IAAMsvB,EAAMpkB,YACzCrC,GAAUymB,EAAMpkB,aAChBvB,IACR2lB,EAAMnkB,eAAgB,EACtBmkB,EAAMpkB,YAAc,KACpBokB,EAAMvlB,cAAe,EACrB,MAAMynB,EAAgBlC,EAAMkC,cAC5B,IAAIC,EAAkB9Y,KAAK+Y,MAAiB,GAAX/nB,EAAGgoB,OAChCC,GAAkB,EACtB,SAASC,IACL,GAAIvC,EAAMkC,gBAAkBA,EACxB,MAAM,IAAItzB,EAAWrB,eAAe,2BAE5C,IAAIi1B,EAAiBxC,EAAMyC,eAC3BC,EAAqB,KAAMC,GAAa,EACxC,MAAMC,EAAY,IAAM,IAAIxvB,IAAa,CAAC9B,EAAS+C,KAE/C,GADAkuB,KACKniB,EACD,MAAM,IAAIxR,EAAWlB,WACzB,MAAM+zB,EAASpnB,EAAGzM,KACZmoB,EAAMiK,EAAM6C,aAAeV,EAC7B/hB,EAAU9E,KAAKmmB,GACfrhB,EAAU9E,KAAKmmB,EAAQU,GAC3B,IAAKpM,EACD,MAAM,IAAInnB,EAAWlB,WACzBqoB,EAAI5lB,QAAU8gB,GAAmB5c,GACjC0hB,EAAI+M,UAAYvsB,GAAK8D,EAAG0oB,gBACxBhN,EAAIiN,gBAAkBzsB,IAAKR,IAEvB,GADA2sB,EAAqB3M,EAAI7D,YACrB8N,EAAM6C,aAAexoB,EAAGmR,SAASyX,aAAc,CAC/ClN,EAAI5lB,QAAUghB,GACduR,EAAmBjP,QACnBsC,EAAIva,OAAOJ,QACX,MAAM8nB,EAAS9iB,EAAU+iB,eAAe1B,GACxCyB,EAAOhzB,UAAYgzB,EAAO/yB,QAAUoG,IAAK,KACrClC,EAAO,IAAIzF,EAAWw0B,eAAe,YAAY3B,0BAGpD,CACDiB,EAAmBvyB,QAAU8gB,GAAmB5c,GAChD,MAAMgvB,EAASttB,EAAEqjB,WAAa/P,KAAKia,IAAI,EAAG,IAAM,EAAIvtB,EAAEqjB,WACtDuJ,EAAaU,EAAS,EACtBhpB,EAAGG,MAAQub,EAAIva,OACX8mB,GAxoBpB,SAA6BjoB,EAAIgf,GAC7BuC,GAAoBvhB,EAAGS,UAAWue,GAC9BA,EAAgBhf,GAAG6e,QAAU,IAAO,GAAMG,EAAgBhE,iBAAiBkE,SAAS,UACpFF,EAAgBhf,GAAGiiB,kBAAkB,SAASza,IAAIwH,KAAKsS,KAAMtC,EAAgBhf,GAAG6e,QAAU,GAAM,GAAI,WAExG,MAAMI,EAAeW,GAAkB5f,EAAIA,EAAGG,MAAO6e,GACrDiB,GAA2BjgB,EAAIA,EAAGS,UAAWue,GAC7C,MAAMkB,EAAOC,GAAclB,EAAcjf,EAAGS,WAC5C,IAAK,MAAMyoB,KAAehJ,EAAKI,OAAQ,CACnC,GAAI4I,EAAY5I,OAAOjxB,QAAU65B,EAAY3I,SAEzC,YADA1f,QAAQC,KAAK,oCAAoCooB,EAAY31B,oEAGjE,MAAMwlB,EAAQiG,EAAgBhG,YAAYkQ,EAAY31B,MACtD21B,EAAY1hB,IAAIvb,SAAQ+Z,IAChBzP,IACAsK,QAAQtK,MAAM,+CAA+C2yB,EAAY31B,QAAQyS,EAAI0T,OACzF+G,GAAS1H,EAAO/S,OAwnBRmjB,CAAoBnpB,EAAIqoB,GAE5BvJ,GAAa9e,EAAIgpB,EAAS,GAAIX,EAAoBruB,MAEvDA,GACH0hB,EAAI7lB,UAAYqG,IAAK,KACjBmsB,EAAqB,KACrB,MAAMloB,EAAQH,EAAGG,MAAQub,EAAIva,OACvB6Z,EAAmB9sB,EAAMiS,EAAM6a,kBACrC,GAAIA,EAAiB3rB,OAAS,EAC1B,IACI,MAAMorB,EAAWta,EAAM0X,YAtmCV,KADJ3X,EAumC8C8a,GAtmCrD3rB,OAAe6Q,EAAW,GAAKA,EAsmCyC,YAC1E,GAAIylB,EAAM6C,YA9b9B,SAA0BxoB,EAAIG,EAAOsa,GACjCza,EAAGgoB,MAAQ7nB,EAAM0e,QAAU,GAC3B,MAAMI,EAAejf,EAAGS,UAAYmf,GAAkB5f,EAAIG,EAAOsa,GACjEza,EAAGqf,YAAcnxB,EAAMiS,EAAM6a,iBAAkB,GAC/CqD,GAAcre,EAAI,CAACA,EAAGmjB,YAAaz3B,EAAKuzB,GAAeA,GA2bnCmK,CAAiBppB,EAAIG,EAAOsa,QAG5B,GADAwF,GAA2BjgB,EAAIA,EAAGS,UAAWga,IA3brE,SAA+Bza,EAAIya,GAC/B,MACMyF,EAAOC,GADWP,GAAkB5f,EAAIA,EAAGG,MAAOsa,GACZza,EAAGS,WAC/C,QAASyf,EAAK1Y,IAAInY,QAAU6wB,EAAKI,OAAOxlB,MAAKuuB,GAAMA,EAAG7hB,IAAInY,QAAUg6B,EAAG/I,OAAOjxB,UAybrDi6B,CAAsBtpB,EAAIya,KAAcwN,EAKzC,OAJApnB,QAAQC,KAAK,oLACbX,EAAMY,QACN+mB,EAAkB3nB,EAAM0e,QAAU,EAClCoJ,GAAkB,EACXhxB,EAAQsxB,KAGvB7K,GAAyB1d,EAAIya,GAEjC,MAAO/e,IAtnCvB,IAA6BwE,EAwnCjB6B,GAAYxS,KAAKyQ,GACjBG,EAAMopB,gBAAkBrtB,IAAK8b,IACzB2N,EAAM6D,SAAU,EAChBxpB,EAAGmY,GAAG,iBAAiBxT,KAAKqT,MAEhC7X,EAAMspB,QAAUvtB,IAAK8b,IACjBhY,EAAGmY,GAAG,SAASxT,KAAKqT,MAEpBsQ,GAxVhB,UAA4BviB,UAAEA,EAAS8X,YAAEA,GAAetqB,IACnDowB,GAAmB5d,IA97EL,cA+7EXxS,GACA+vB,GAAgBvd,EAAW8X,GAAatV,IAAI,CAAEhV,KAAAA,IAAQ+I,MAAMnH,GAsVpDu0B,CAAmB1pB,EAAG8F,MAAOshB,GACjCnwB,MACD+C,MACJsC,OAAMG,IACL,OAAQA,GAAKlJ,MACT,IAAK,eACD,GAAIoyB,EAAMjlB,eAAiB,EAGvB,OAFAilB,EAAMjlB,iBACNG,QAAQC,KAAK,uDACNynB,IAEX,MACJ,IAAK,eACD,GAAIT,EAAkB,EAElB,OADAA,EAAkB,EACXS,IAInB,OAAOxvB,GAAaiB,OAAOyC,MAE/B,OAAO1D,GAAawE,KAAK,CACrBsqB,GACsB,oBAAdvM,UAA4BviB,GAAa9B,UAAY6sB,MAAYztB,KAAKkyB,KAC/ElyB,MAAK,KACJ6xB,IACAvC,EAAMgE,kBAAoB,GACnB5wB,GAAa9B,QAAQ4sB,IAAI,IAAM7jB,EAAGmY,GAAGyR,MAAMjlB,KAAK3E,EAAG6jB,QAAOxtB,MAAK,SAASwzB,IAC3E,GAAIlE,EAAMgE,kBAAkBt6B,OAAS,EAAG,CACpC,IAAIy6B,EAAanE,EAAMgE,kBAAkBt1B,OAAO+B,GAAiBjB,GAEjE,OADAwwB,EAAMgE,kBAAoB,GACnB5wB,GAAa9B,QAAQ4sB,IAAI,IAAMiG,EAAW9pB,EAAG6jB,QAAOxtB,KAAKwzB,UAGzEntB,SAAQ,KACHipB,EAAMkC,gBAAkBA,IACxBlC,EAAMgE,kBAAoB,KAC1BhE,EAAMnkB,eAAgB,MAE3BlF,OAAMG,IACLkpB,EAAMpkB,YAAc9E,EACpB,IACI4rB,GAAsBA,EAAmBjP,QAE7C,OAIA,OAHIyO,IAAkBlC,EAAMkC,eACxB7nB,EAAG+pB,SAEA7qB,GAAUzC,MAClBC,SAAQ,KACPipB,EAAMvlB,cAAe,EACrB+nB,OACD9xB,MAAK,KACJ,GAAIiyB,EAAY,CACZ,MAAM0B,EAAa,GACnBhqB,EAAG+a,OAAO9uB,SAAQmb,IACdA,EAAMpD,OAAOiB,QAAQhZ,SAAQ+Z,IACrBA,EAAIzS,OACJy2B,EAAW,SAAShqB,EAAGzM,QAAQ6T,EAAM7T,QAAQyS,EAAIzS,QAAU,IAAI+wB,IAAUxnB,EAAAA,EAAU,CAAC,CAAC,UAE7FktB,EAAW,SAAShqB,EAAGzM,QAAQ6T,EAAM7T,SAAWy2B,EAAW,SAAShqB,EAAGzM,QAAQ6T,EAAM7T,cAAgB,IAAI+wB,IAAUxnB,EAAAA,EAAU,CAAC,CAAC,SAEnIma,GA/5C6B,kBA+5CkBtS,KAAKqlB,GACpDnD,GAAqBmD,GAAY,GAErC,OAAOhqB,KAIf,SAASiqB,GAAc/3B,GACnB,IAAIg4B,EAAW/oB,GAAUjP,EAASS,KAAKwO,GAAmDgpB,EAAYC,EAAKF,GAAWG,EAAUD,GAAtEzb,GAASzc,EAASo4B,MAAM3b,KAClF,SAASyb,EAAKG,GACV,OAAQj7B,IACJ,IAAIqD,EAAO43B,EAAQj7B,GAAMhC,EAAQqF,EAAKrF,MACtC,OAAOqF,EAAKC,KAAOtF,EACbA,GAA+B,mBAAfA,EAAM+I,KAEpB/I,EAAM+I,KAAK8zB,EAAWE,GADtBz+B,EAAQ0B,GAASnB,QAAQgR,IAAI7P,GAAO+I,KAAK8zB,EAAWE,GAAWF,EAAU78B,IAIzF,OAAO88B,EAAKF,EAALE,GAGX,SAASI,GAAuBvqB,EAAMwqB,EAAaC,GAC/C,IAAIv7B,EAAIsD,UAAUpD,OAClB,GAAIF,EAAI,EACJ,MAAM,IAAIoF,EAAW+T,gBAAgB,qBAEzC,IADA,IAAIna,EAAO,IAAItC,MAAMsD,EAAI,KAChBA,GACLhB,EAAKgB,EAAI,GAAKsD,UAAUtD,GAC5Bu7B,EAAYv8B,EAAKmR,MACjB,IAAIyb,EAASxqB,EAAQpC,GACrB,MAAO,CAAC8R,EAAM8a,EAAQ2P,GAE1B,SAASC,GAAsB3qB,EAAIC,EAAMC,EAAY0qB,EAAmBF,GACpE,OAAO3xB,GAAa9B,UAAUZ,MAAK,KAC/B,MAAM8N,EAAYvL,GAAIuL,WAAavL,GAC7B2H,EAAQP,EAAGQ,mBAAmBP,EAAMC,EAAYF,EAAGS,UAAWmqB,GACpErqB,EAAMsqB,UAAW,EACjB,MAAMjtB,EAAY,CACd2C,MAAOA,EACP4D,UAAWA,GAEf,GAAIymB,EACArqB,EAAMa,SAAWwpB,EAAkBxpB,cAGnC,IACIb,EAAM1S,SACN0S,EAAMa,SAAS0pB,WAAY,EAC3B9qB,EAAG5G,OAAOsH,eAAiB,EAE/B,MAAO9F,GACH,OAAIA,EAAGrH,OAASa,EAASuM,cAAgBX,EAAGY,YAAcZ,EAAG5G,OAAOsH,eAAiB,GACjFG,QAAQC,KAAK,4BACbd,EAAGe,MAAM,CAAEC,iBAAiB,IACrBhB,EAAGiB,OAAO5K,MAAK,IAAMs0B,GAAsB3qB,EAAIC,EAAMC,EAAY,KAAMwqB,MAE3ExrB,GAAUtE,GAGzB,MAAMmwB,EAAmBl4B,EAAgB63B,GAIzC,IAAI1J,EAHA+J,GACA/rB,KAGJ,MAAMiiB,EAAkBloB,GAAa4E,QAAO,KAExC,GADAqjB,EAAc0J,EAAUh+B,KAAK6T,EAAOA,GAChCygB,EACA,GAAI+J,EAAkB,CAClB,IAAI7J,EAAcnnB,GAAwBjM,KAAK,KAAM,MACrDkzB,EAAY3qB,KAAK6qB,EAAaA,OAEG,mBAArBF,EAAYruB,MAAoD,mBAAtBquB,EAAYsJ,QAClEtJ,EAAciJ,GAAcjJ,MAGrCpjB,GACH,OAAQojB,GAA2C,mBAArBA,EAAY3qB,KACtC0C,GAAa9B,QAAQ+pB,GAAa3qB,MAAKxE,GAAK0O,EAAMqX,OAC9C/lB,EACEqN,GAAU,IAAI3K,EAAWy2B,gBAAgB,iEAC7C/J,EAAgB5qB,MAAK,IAAM2qB,KAAc3qB,MAAKxE,IAC5C+4B,GACArqB,EAAM8X,WACH9X,EAAMe,YAAYjL,MAAK,IAAMxE,OACrCyK,OAAMZ,IACL6E,EAAM0X,QAAQvc,GACPwD,GAAUxD,SAK7B,SAASuvB,GAAIz6B,EAAGlD,EAAOkZ,GACnB,MAAMrF,EAASvV,EAAQ4E,GAAKA,EAAEtC,QAAU,CAACsC,GACzC,IAAK,IAAIrB,EAAI,EAAGA,EAAIqX,IAASrX,EACzBgS,EAAO5R,KAAKjC,GAChB,OAAO6T,EAuIX,MAAM+pB,GAAyB,CAC3B3N,MAAO,SACPhqB,KAAM,yBACN43B,MAAO,EACPt9B,OAzIJ,SAAsCmwB,GAClC,MAAO,IACAA,EACH5W,MAAMvD,GACF,MAAMuD,EAAQ4W,EAAK5W,MAAMvD,IACnBG,OAAEA,GAAWoD,EACbgkB,EAAc,GACdC,EAAoB,GAC1B,SAASC,EAAkBr8B,EAASs8B,EAASC,GACzC,MAAMC,EAAelR,GAAgBtrB,GAC/By8B,EAAaN,EAAYK,GAAgBL,EAAYK,IAAiB,GACtEE,EAAuB,MAAX18B,EAAkB,EAAuB,iBAAZA,EAAuB,EAAIA,EAAQI,OAC5Eu8B,EAAYL,EAAU,EACtBM,EAAe,IACdL,EACHj4B,KAAMq4B,EACA,GAAGH,kBAA6BD,EAAcj4B,QAC9Ci4B,EAAcj4B,KACpBi4B,cAAAA,EACAI,UAAAA,EACAL,QAAAA,EACAI,UAAAA,EACAza,WAAYiJ,GAAgBlrB,GAC5Byd,QAASkf,GAAaJ,EAAc9e,QAMxC,GAJAgf,EAAUn8B,KAAKs8B,GACVA,EAAa1Q,cACdkQ,EAAkB97B,KAAKs8B,GAEvBF,EAAY,EAAG,CAIfL,EAHqC,IAAdK,EACnB18B,EAAQ,GACRA,EAAQf,MAAM,EAAGy9B,EAAY,GACCJ,EAAU,EAAGC,GAGnD,OADAE,EAAUpmB,MAAK,CAAC9U,EAAG9B,IAAM8B,EAAE+6B,QAAU78B,EAAE68B,UAChCM,EAEX,MAAMzf,EAAakf,EAAkBtnB,EAAOoI,WAAWnd,QAAS,EAAG+U,EAAOoI,YAC1Egf,EAAY,OAAS,CAAChf,GACtB,IAAK,MAAMhG,KAASpC,EAAOiB,QACvBqmB,EAAkBllB,EAAMnX,QAAS,EAAGmX,GAiBxC,SAAS0lB,EAAiBpQ,GACtB,MAAMtV,EAAQsV,EAAI/O,MAAMvG,MACxB,OAAOA,EAAMwlB,UAAY,IAClBlQ,EACH/O,MAAO,CACHvG,MAAOA,EAAMolB,cACb9iB,OAjBYA,EAiBUgT,EAAI/O,MAAMjE,MAjBb6iB,EAiBoBnlB,EAAMmlB,QAhB9C,CACHhvB,KAAqB,IAAfmM,EAAMnM,KACR,EACAmM,EAAMnM,KACV6F,MAAO6oB,GAAIviB,EAAMtG,MAAOsG,EAAMrG,UAAY2b,EAAKP,QAAUO,EAAKR,QAAS+N,GACvElpB,WAAW,EACXC,MAAO2oB,GAAIviB,EAAMpG,MAAOoG,EAAMnG,UAAYyb,EAAKR,QAAUQ,EAAKP,QAAS8N,GACvEhpB,WAAW,MAWXmZ,EAnBR,IAAwBhT,EAAO6iB,EAqB/B,MAAMpqB,EAAS,IACRiG,EACHpD,OAAQ,IACDA,EACHoI,WAAAA,EACAnH,QAASomB,EACThf,kBA/BR,SAAuBpd,GACnB,MAAMkS,EAASiqB,EAAY7Q,GAAgBtrB,IAC3C,OAAOkS,GAAUA,EAAO,KA+BxBqF,MAAMkV,GACKtU,EAAMZ,MAAMslB,EAAiBpQ,IAExC/O,MAAM+O,GACKtU,EAAMuF,MAAMmf,EAAiBpQ,IAExCnP,WAAWmP,GACP,MAAM6P,QAAEA,EAAOK,UAAEA,EAASD,UAAEA,GAAcjQ,EAAI/O,MAAMvG,MACpD,IAAKwlB,EACD,OAAOxkB,EAAMmF,WAAWmP,GAwC5B,OAAOtU,EAAMmF,WAAWuf,EAAiBpQ,IACpCrlB,MAAK0W,GAAUA,GAxCpB,SAA6BA,GAWzB,MAAMgf,EAAgBpgC,OAAOkC,OAAOkf,EAAQ,CACxCU,SAAU,CAAEngB,MAXhB,SAAmBpB,GACR,MAAPA,EACI6gB,EAAOU,SAASwd,GAAI/+B,EAAKwvB,EAAIzU,QAAU+W,EAAKP,QAAUO,EAAKR,QAAS+N,IACpE7P,EAAIhP,OACAK,EAAOU,SAASV,EAAO7gB,IAAIgC,MAAM,EAAGy9B,GAC/Br7B,OAAOorB,EAAIzU,QACV+W,EAAKR,QACLQ,EAAKP,QAAS8N,IACpBxe,EAAOU,aAIfoP,mBAAoB,CAChBvvB,MAAMpB,EAAKkgB,GACPW,EAAO8P,mBAAmBoO,GAAI/+B,EAAK8xB,EAAKP,QAAS8N,GAAUnf,KAGnEA,WAAY,CACRjf,IAAG,IACQ4f,EAAOX,YAGtBlgB,IAAK,CACDiB,MACI,MAAMjB,EAAM6gB,EAAO7gB,IACnB,OAAqB,IAAdy/B,EACHz/B,EAAI,GACJA,EAAIgC,MAAM,EAAGy9B,KAGzBr+B,MAAO,CACHH,IAAG,IACQ4f,EAAOzf,SAI1B,OAAOy+B,EAGmBC,CAAoBjf,OAG1D,OAAO5L,MAWnB,SAAS8qB,GAAcz7B,EAAG9B,EAAGQ,EAAIg9B,GA+B7B,OA9BAh9B,EAAKA,GAAM,GACXg9B,EAAOA,GAAQ,GACfxgC,EAAK8E,GAAGvE,SAASQ,IACb,GAAKD,EAAOkC,EAAGjC,GAGV,CACD,IAAI0/B,EAAK37B,EAAE/D,GAAO2/B,EAAK19B,EAAEjC,GACzB,GAAkB,iBAAP0/B,GAAiC,iBAAPC,GAAmBD,GAAMC,EAAI,CAC9D,MAAMC,EAAat6B,EAAYo6B,GAE3BE,IADet6B,EAAYq6B,GAE3Bl9B,EAAGg9B,EAAOz/B,GAAQiC,EAAEjC,GAEA,WAAf4/B,EACLJ,GAAcE,EAAIC,EAAIl9B,EAAIg9B,EAAOz/B,EAAO,KAEnC0/B,IAAOC,IACZl9B,EAAGg9B,EAAOz/B,GAAQiC,EAAEjC,SAGnB0/B,IAAOC,IACZl9B,EAAGg9B,EAAOz/B,GAAQiC,EAAEjC,SAlBxByC,EAAGg9B,EAAOz/B,QAAQmD,KAqB1BlE,EAAKgD,GAAGzC,SAASQ,IACRD,EAAOgE,EAAG/D,KACXyC,EAAGg9B,EAAOz/B,GAAQiC,EAAEjC,OAGrByC,EAGX,SAASo9B,GAAiBlgB,EAAYsP,GAClC,MAAiB,WAAbA,EAAInf,KACGmf,EAAIhwB,KACRgwB,EAAIhwB,MAAQgwB,EAAIte,OAAOxM,IAAIwb,EAAW8E,YAGjD,MAAMqb,GAAkB,CACpBhP,MAAO,SACPhqB,KAAM,kBACN43B,MAAO,EACPt9B,OAAS2+B,IAAa,IACfA,EACHplB,MAAMvD,GACF,MAAM4oB,EAAYD,EAASplB,MAAMvD,IAC3BuI,WAAEA,GAAeqgB,EAAUzoB,OAC3B0oB,EAAkB,IACjBD,EACHzkB,OAAO0T,GACH,MAAMiR,EAAU/zB,GAAI2H,OACdqsB,SAAEA,EAAQC,SAAEA,EAAQC,SAAEA,GAAaH,EAAQvlB,MAAMvD,GAAWY,KAClE,OAAQiX,EAAInf,MACR,IAAK,MACD,GAAIswB,EAASloB,OAASxP,EAClB,MACJ,OAAOw3B,EAAQzrB,SAAS,aAAa,IAAM6rB,EAAerR,KAAM,GACpE,IAAK,MACD,GAAImR,EAASloB,OAASxP,GAAO23B,EAASnoB,OAASxP,EAC3C,MACJ,OAAOw3B,EAAQzrB,SAAS,aAAa,IAAM6rB,EAAerR,KAAM,GACpE,IAAK,SACD,GAAIkR,EAASjoB,OAASxP,EAClB,MACJ,OAAOw3B,EAAQzrB,SAAS,aAAa,IAAM6rB,EAAerR,KAAM,GACpE,IAAK,cACD,GAAIkR,EAASjoB,OAASxP,EAClB,MACJ,OAAOw3B,EAAQzrB,SAAS,aAAa,IAsE7C,SAAqBwa,GACjB,OAAOsR,EAAgBtR,EAAInb,MAAOmb,EAAIhT,MAAO,KAvEEukB,CAAYvR,KAAM,GAErE,OAAO+Q,EAAUzkB,OAAO0T,GACxB,SAASqR,EAAerR,GACpB,MAAMiR,EAAU/zB,GAAI2H,MACd7U,EAAOgwB,EAAIhwB,MAAQ4gC,GAAiBlgB,EAAYsP,GACtD,IAAKhwB,EACD,MAAM,IAAIiD,MAAM,gBAQpB,MAJiB,YAHjB+sB,EAAmB,QAAbA,EAAInf,MAA+B,QAAbmf,EAAInf,KAC5B,IAAKmf,EAAKhwB,KAAAA,GACV,IAAKgwB,IACDnf,OACJmf,EAAIte,OAAS,IAAIse,EAAIte,SACrBse,EAAIhwB,OACJgwB,EAAIhwB,KAAO,IAAIgwB,EAAIhwB,OAgF/C,SAA2B0b,EAAOsU,EAAKwR,GACnC,MAAoB,QAAbxR,EAAInf,KACLpQ,QAAQ8K,QAAQ,IAChBmQ,EAAMwB,QAAQ,CAAErI,MAAOmb,EAAInb,MAAO7U,KAAMwhC,EAAerjB,MAAO,cAlFzCsjB,CAAkBV,EAAW/Q,EAAKhwB,GAAM2K,MAAK+2B,IAChD,MAAMC,EAAW3hC,EAAKkF,KAAI,CAAC1E,EAAKiD,KAC5B,MAAMm+B,EAAgBF,EAAej+B,GAC/Bsb,EAAM,CAAE3U,QAAS,KAAMD,UAAW,MACxC,GAAiB,WAAb6lB,EAAInf,KACJqwB,EAASjoB,KAAKjY,KAAK+d,EAAKve,EAAKohC,EAAeX,QAE3C,GAAiB,QAAbjR,EAAInf,WAAoC3M,IAAlB09B,EAA6B,CACxD,MAAMC,EAAsBV,EAASloB,KAAKjY,KAAK+d,EAAKve,EAAKwvB,EAAIte,OAAOjO,GAAIw9B,GAC7D,MAAPzgC,GAAsC,MAAvBqhC,IACfrhC,EAAMqhC,EACN7R,EAAIhwB,KAAKyD,GAAKjD,EACTkgB,EAAW6E,UACZphB,EAAa6rB,EAAIte,OAAOjO,GAAIid,EAAWnd,QAAS/C,QAIvD,CACD,MAAMshC,EAAavB,GAAcqB,EAAe5R,EAAIte,OAAOjO,IACrDs+B,EAAoBX,EAASnoB,KAAKjY,KAAK+d,EAAK+iB,EAAYthC,EAAKohC,EAAeX,GAClF,GAAIc,EAAmB,CACnB,MAAMC,EAAiBhS,EAAIte,OAAOjO,GAClCxD,OAAOD,KAAK+hC,GAAmBxhC,SAAQgD,IAC/BzC,EAAOkhC,EAAgBz+B,GACvBy+B,EAAez+B,GAAWw+B,EAAkBx+B,GAG5CY,EAAa69B,EAAgBz+B,EAASw+B,EAAkBx+B,QAKxE,OAAOwb,KAEX,OAAOgiB,EAAUzkB,OAAO0T,GAAKrlB,MAAK,EAAG1C,SAAAA,EAAUsK,QAAAA,EAASgK,YAAAA,EAAaC,WAAAA,MACjE,IAAK,IAAI/Y,EAAI,EAAGA,EAAIzD,EAAK2D,SAAUF,EAAG,CAClC,MAAM+V,EAAUjH,EAAUA,EAAQ9O,GAAKzD,EAAKyD,GACtCsb,EAAM4iB,EAASl+B,GACN,MAAX+V,EACAuF,EAAI3U,SAAW2U,EAAI3U,QAAQnC,EAASxE,IAGpCsb,EAAI5U,WAAa4U,EAAI5U,UAAuB,QAAb6lB,EAAInf,MAAkB6wB,EAAej+B,GAChEusB,EAAIte,OAAOjO,GACX+V,GAIZ,MAAO,CAAEvR,SAAAA,EAAUsK,QAAAA,EAASgK,YAAAA,EAAaC,WAAAA,MAC1C5L,OAAMqS,IACL0e,EAASphC,SAAQwe,GAAOA,EAAI3U,SAAW2U,EAAI3U,QAAQ6Y,KAC5CxiB,QAAQ6N,OAAO2U,SAOlC,SAASqe,EAAgBzsB,EAAOmI,EAAO/B,GACnC,OAAO8lB,EAAU9f,MAAM,CAAEpM,MAAAA,EAAOnD,QAAQ,EAAOuP,MAAO,CAAEvG,MAAOgG,EAAY1D,MAAAA,GAAS/B,MAAAA,IAC/EtQ,MAAK,EAAG8K,OAAAA,KACF4rB,EAAe,CAAExwB,KAAM,SAAU7Q,KAAMyV,EAAQZ,MAAAA,IAASlK,MAAKT,GAC5DA,EAAIqS,YAAc,EACX9b,QAAQ6N,OAAOpE,EAAIjC,SAAS,IACnCwN,EAAO9R,OAASsX,EACT,CAAEhT,SAAU,GAAIsU,YAAa,EAAGC,gBAAYtY,GAG5Co9B,EAAgBzsB,EAAO,IAAKmI,EAAOtG,MAAOjB,EAAOA,EAAO9R,OAAS,GAAIgT,WAAW,GAAQsE,UAOvH,OAAO+lB,MAUnB,SAASiB,GAAwBjiC,EAAMme,EAAOiF,GAC1C,IACI,IAAKjF,EACD,OAAO,KACX,GAAIA,EAAMne,KAAK2D,OAAS3D,EAAK2D,OACzB,OAAO,KACX,MAAM8R,EAAS,GACf,IAAK,IAAIhS,EAAI,EAAGgzB,EAAI,EAAGhzB,EAAI0a,EAAMne,KAAK2D,QAAU8yB,EAAIz2B,EAAK2D,SAAUF,EAC3B,IAAhCuT,GAAImH,EAAMne,KAAKyD,GAAIzD,EAAKy2B,MAE5BhhB,EAAO5R,KAAKuf,EAAQrd,EAAUoY,EAAMzM,OAAOjO,IAAM0a,EAAMzM,OAAOjO,MAC5DgzB,GAEN,OAAOhhB,EAAO9R,SAAW3D,EAAK2D,OAAS8R,EAAS,KAEpD,MACI,OAAO,MAGf,MAAMysB,GAAgC,CAClCrQ,MAAO,SACP4N,OAAQ,EACRt9B,OAAS2W,IACE,CACH4C,MAAQvD,IACJ,MAAMuD,EAAQ5C,EAAK4C,MAAMvD,GACzB,MAAO,IACAuD,EACHwB,QAAU8S,IACN,IAAKA,EAAI7R,MACL,OAAOzC,EAAMwB,QAAQ8S,GAEzB,MAAMmS,EAAeF,GAAwBjS,EAAIhwB,KAAMgwB,EAAInb,MAAc,OAAiB,UAAdmb,EAAI7R,OAChF,OAAIgkB,EACO90B,GAAa9B,QAAQ42B,GAEzBzmB,EAAMwB,QAAQ8S,GAAKrlB,MAAMT,IAC5B8lB,EAAInb,MAAc,OAAI,CAClB7U,KAAMgwB,EAAIhwB,KACV0R,OAAsB,UAAdse,EAAI7R,MAAoBpY,EAAUmE,GAAOA,GAE9CA,MAGfoS,OAAS0T,IACY,QAAbA,EAAInf,OACJmf,EAAInb,MAAc,OAAI,MACnB6G,EAAMY,OAAO0T,SAQ5C,SAASoS,GAAkBrjB,EAAKrD,GAC5B,MAA2B,aAAnBqD,EAAIlK,MAAMN,QACZwK,EAAIsjB,SACLtjB,EAAIlK,MAAMsqB,UACqB,aAAhCpgB,EAAIlK,MAAMP,GAAGmR,SAAStH,QACrBzC,EAAMpD,OAAOoI,WAAW6E,SAGjC,SAAS+c,GAAkBzxB,EAAMmf,GAC7B,OAAQnf,GACJ,IAAK,QACD,OAAOmf,EAAIte,SAAWse,EAAIhP,OAC9B,IAAK,MAEL,IAAK,UAEL,IAAK,QAEL,IAAK,aACD,OAAO,GAInB,MAAMuhB,GAA0B,CAC5B1Q,MAAO,SACP4N,MAAO,EACP53B,KAAM,gBACN1F,OAAS2W,IACL,MAAM4iB,EAAS5iB,EAAKR,OAAOzQ,KACrB26B,EAAa,IAAI5J,GAAS9f,EAAKgZ,QAAShZ,EAAKiZ,SACnD,MAAO,IACAjZ,EACHqT,YAAa,CAACkL,EAAQ9iB,EAAM/S,KACxB,GAAI0L,GAAIm1B,QAAmB,aAAT9tB,EACd,MAAM,IAAI1L,EAAWikB,SAAS,+DAA+D5f,GAAIu1B,WAErG,OAAO3pB,EAAKqT,YAAYkL,EAAQ9iB,EAAM/S,IAE1Cka,MAAQvD,IACJ,MAAMuD,EAAQ5C,EAAK4C,MAAMvD,IACnBG,OAAEA,GAAWoD,GACbgF,WAAEA,EAAUnH,QAAEA,GAAYjB,GAC1BkN,WAAEA,EAAUD,SAAEA,GAAa7E,EAC3BgiB,EAAuBhiB,EAAW6O,eAAiBhW,EAAQlU,QAAQqV,GAAUA,EAAMhB,UAAYgB,EAAMnX,QAAQif,SAAS9B,EAAWnd,WACjIo/B,EAAa,IACZjnB,EACHY,OAAS0T,IACL,MAAMnb,EAAQmb,EAAInb,MACZ+tB,EAAe5S,EAAI4S,eAAiB5S,EAAI4S,aAAe,IACvDC,EAAete,IACjB,MAAMiW,EAAO,SAASkB,KAAUvjB,KAAaoM,IAC7C,OAAQqe,EAAapI,KAChBoI,EAAapI,GAAQ,IAAI5B,KAE5BkK,EAAaD,EAAY,IACzBE,EAAeF,EAAY,UAC3BhyB,KAAEA,GAASmf,EACjB,IAAKhwB,EAAMgjC,GAAwB,gBAAbhT,EAAInf,KACpB,CAACmf,EAAIhT,OACQ,WAAbgT,EAAInf,KACA,CAACmf,EAAIhwB,MACLgwB,EAAIte,OAAO/N,OAAS,GAChB,CAACi9B,GAAiBlgB,EAAYsP,GAAK3qB,QAAOsH,GAAMA,IAAKqjB,EAAIte,QACzD,GACd,MAAMuxB,EAAWjT,EAAInb,MAAc,OACnC,GAAI3U,EAAQF,GAAO,CACf8iC,EAAWhI,QAAQ96B,GACnB,MAAMkjC,EAAmB,WAATryB,GAAqB7Q,EAAK2D,SAAWq/B,EAAQr/B,OAASs+B,GAAwBjiC,EAAMijC,GAAY,KAC3GC,GACDH,EAAajI,QAAQ96B,IAErBkjC,GAAWF,IAsI3C,SAA8BH,EAAavqB,EAAQ4qB,EAASF,GACxD,SAASG,EAAiB1pB,GACtB,MAAMmhB,EAAWiI,EAAYppB,EAAG5R,MAAQ,IACxC,SAAS2d,EAAWnlB,GAChB,OAAc,MAAPA,EAAcoZ,EAAG+L,WAAWnlB,GAAO,KAE9C,MAAM+iC,EAAgB5iC,GAAQiZ,EAAGkW,YAAczvB,EAAQM,GACjDA,EAAID,SAAQC,GAAOo6B,EAASC,OAAOr6B,KACnCo6B,EAASC,OAAOr6B,IACrB0iC,GAAWF,GAASziC,SAAQ,CAACyb,EAAGvY,KAC7B,MAAM4/B,EAASH,GAAW1d,EAAW0d,EAAQz/B,IACvC6/B,EAASN,GAAWxd,EAAWwd,EAAQv/B,IACjB,IAAxBuT,GAAIqsB,EAAQC,KACE,MAAVD,GACAD,EAAaC,GACH,MAAVC,GACAF,EAAaE,OAI7BhrB,EAAOiB,QAAQhZ,QAAQ4iC,GAzJKI,CAAqBV,EAAavqB,EAAQ4qB,EAASF,QAGtD,GAAIhjC,EAAM,CACX,MAAMgd,EAAQ,CAAEhb,KAAMhC,EAAK0W,MAAOoiB,GAAI94B,EAAK4W,OAC3CmsB,EAAajnB,IAAIkB,GACjB8lB,EAAWhnB,IAAIkB,QAGf8lB,EAAWhnB,IAAI0mB,GACfO,EAAajnB,IAAI0mB,GACjBlqB,EAAOiB,QAAQhZ,SAAQ+Z,GAAOuoB,EAAYvoB,EAAIzS,MAAMiU,IAAI0mB,KAE5D,OAAO9mB,EAAMY,OAAO0T,GAAKrlB,MAAMT,KACvBlK,GAAsB,QAAbgwB,EAAInf,MAA+B,QAAbmf,EAAInf,OACnCiyB,EAAWhI,QAAQ5wB,EAAIqI,SACnBmwB,GACAA,EAAqBniC,SAAQ+Z,IACzB,MAAMkpB,EAAUxT,EAAIte,OAAOxM,KAAIS,GAAK2U,EAAIkL,WAAW7f,KAC7C89B,EAAQnpB,EAAI/W,QAAQmgC,WAAU3iC,GAAQA,IAAS2f,EAAWnd,UAChE2G,EAAIqI,QAAQhS,SAAQojC,GAAMH,EAAQC,GAASE,IAC3Cd,EAAYvoB,EAAIzS,MAAMizB,QAAQ0I,OAI1C3uB,EAAM+tB,aAAerI,GAAuB1lB,EAAM+tB,cAAgB,GAAIA,GAC/D14B,OAIb05B,EAAW,EAAG3iB,OAASvG,MAAAA,EAAOsC,MAAAA,MAAe,CAC/CtC,EACA,IAAIke,GAAS5b,EAAMtG,OAASoC,EAAKgZ,QAAS9U,EAAMpG,OAASkC,EAAKiZ,UAE5D8R,EAAkB,CACpBpiC,IAAMuuB,GAAQ,CAACtP,EAAY,IAAIkY,GAAS5I,EAAIxvB,MAC5C0c,QAAU8S,GAAQ,CAACtP,GAAY,IAAIkY,IAAWkC,QAAQ9K,EAAIhwB,OAC1D8a,MAAO8oB,EACP3iB,MAAO2iB,EACP/iB,WAAY+iB,GAyFhB,OAvFA5jC,EAAK6jC,GAAiBtjC,SAASujC,IAC3BnB,EAAWmB,GAAU,SAAU9T,GAC3B,MAAMqS,OAAEA,GAAWn1B,GACb62B,IAAgB1B,EACtB,IAAI2B,EAAW5B,GAAkBl1B,GAAKwO,IAAU4mB,GAAkBwB,EAAQ9T,GAC1E,MAAMiM,EAAS+H,EACThU,EAAIiM,OAAS,GACboG,EACN,GAAI0B,EAAa,CACb,MAAMlB,EAAete,IACjB,MAAMiW,EAAO,SAASkB,KAAUvjB,KAAaoM,IAC7C,OAAQ0X,EAAOzB,KACVyB,EAAOzB,GAAQ,IAAI5B,KAEtBkK,EAAaD,EAAY,IACzBE,EAAeF,EAAY,UAC1BoB,EAAcC,GAAiBL,EAAgBC,GAAQ9T,GAO9D,GANe,UAAX8T,GAAsBG,EAAaxU,eAAiBO,EAAIte,OACxDqxB,EAAajnB,IAAIooB,GAGjBrB,EAAYoB,EAAap8B,MAAQ,IAAIiU,IAAIooB,IAExCD,EAAaxU,aAAc,CAC5B,GAAe,UAAXqU,EAGC,CACD,MAAMK,EAAyB,UAAXL,GAChBve,GACAyK,EAAIte,QACJgK,EAAMuF,MAAM,IACL+O,EACHte,QAAQ,IAEhB,OAAOgK,EAAMooB,GAAQ/+B,MAAMiC,KAAMD,WAAW4D,MAAMT,IAC9C,GAAe,UAAX45B,EAAoB,CACpB,GAAIve,GAAYyK,EAAIte,OAChB,OAAOyyB,EAAYx5B,MAAK,EAAG8K,OAAQ2uB,MAC/BtB,EAAWhI,QAAQsJ,GACZl6B,KAGf,MAAMm6B,EAAQrU,EAAIte,OACZxH,EAAIuL,OAAOvQ,IAAIsgB,GACftb,EAAIuL,OACNua,EAAIte,OACJoxB,EAAWhI,QAAQuJ,GAGnBtB,EAAajI,QAAQuJ,QAGxB,GAAe,eAAXP,EAAyB,CAC9B,MAAMziB,EAASnX,EACTo6B,EAAatU,EAAIte,OACvB,OAAQ2P,GACJphB,OAAOkC,OAAOkf,EAAQ,CAClB7gB,IAAK,CACDiB,IAAG,KACCshC,EAAalI,OAAOxZ,EAAOX,YACpBW,EAAO7gB,MAGtBkgB,WAAY,CACRjf,MACI,MAAM8iC,EAAOljB,EAAOX,WAEpB,OADAqiB,EAAalI,OAAO0J,GACbA,IAGf3iC,MAAO,CACHH,IAAG,KACC6iC,GAAcxB,EAAWjI,OAAOxZ,EAAOX,YAChCW,EAAOzf,UAKlC,OAAOsI,KAtDX64B,EAAajnB,IAAI0mB,IA2D7B,OAAO9mB,EAAMooB,GAAQ/+B,MAAMiC,KAAMD,eAGlC47B,MA4BvB,SAAS6B,GAA6BjJ,EAAUvL,EAAK9lB,GACjD,GAAwB,IAApBA,EAAIqS,YACJ,OAAOyT,EACX,GAAiB,gBAAbA,EAAInf,KACJ,OAAO,KAEX,MAAM4zB,EAAazU,EAAIhwB,KACjBgwB,EAAIhwB,KAAK2D,OACT,WAAYqsB,GAAOA,EAAIte,OACnBse,EAAIte,OAAO/N,OACX,EACV,GAAIuG,EAAIqS,cAAgBkoB,EACpB,OAAO,KAEX,MAAMrhB,EAAQ,IAAK4M,GAOnB,OANI9vB,EAAQkjB,EAAMpjB,QACdojB,EAAMpjB,KAAOojB,EAAMpjB,KAAKqF,QAAO,CAAC2W,EAAGvY,MAAQA,KAAKyG,EAAIjC,aAEpD,WAAYmb,GAASljB,EAAQkjB,EAAM1R,UACnC0R,EAAM1R,OAAS0R,EAAM1R,OAAOrM,QAAO,CAAC2W,EAAGvY,MAAQA,KAAKyG,EAAIjC,aAErDmb,EAiBX,SAASshB,GAAclkC,EAAKwc,GACxB,OAfJ,SAAsBxc,EAAKwc,GACvB,YAAuB9Y,IAAhB8Y,EAAMtG,QAEPsG,EAAMrG,UACFK,GAAIxW,EAAKwc,EAAMtG,OAAS,EACxBM,GAAIxW,EAAKwc,EAAMtG,QAAU,GAU5BiuB,CAAankC,EAAKwc,IAR7B,SAAsBxc,EAAKwc,GACvB,YAAuB9Y,IAAhB8Y,EAAMpG,QAEPoG,EAAMnG,UACFG,GAAIxW,EAAKwc,EAAMpG,OAAS,EACxBI,GAAIxW,EAAKwc,EAAMpG,QAAU,GAGAguB,CAAapkC,EAAKwc,GAGzD,SAAS6nB,GAAmBpvB,EAAQua,EAAK8U,EAAKppB,EAAOqpB,EAAYC,GAC7D,IAAKF,GAAsB,IAAfA,EAAInhC,OACZ,OAAO8R,EACX,MAAMiF,EAAQsV,EAAI/O,MAAMvG,OAClBiV,WAAEA,GAAejV,EACjBuqB,EAAajV,EAAI/O,MAAMjE,MAEvBkoB,EADaxpB,EAAMpD,OAAOoI,WACE8E,WAC5B2f,EAAezqB,EAAM8K,WACrB4f,GAAwB1qB,EAAMolB,eAAiBplB,GAAO8K,WAC5D,IAAI6f,EAAcP,EAAIn8B,QAAO,CAAC8M,EAAQ6vB,KAClC,IAAIC,EAAgB9vB,EACpB,MAAM+vB,EAA6B,QAAZF,EAAGz0B,MAA8B,QAAZy0B,EAAGz0B,KACzCy0B,EAAG5zB,OAAOrM,QAAQM,IAChB,MAAMnF,EAAM2kC,EAAax/B,GACzB,OAAOgqB,GAAczvB,EAAQM,GACvBA,EAAI4O,MAAM1J,GAAMg/B,GAAch/B,EAAGu/B,KACjCP,GAAclkC,EAAKykC,MAC1B//B,KAAIS,IACHA,EAAII,EAAUJ,GACVq/B,GACA/kC,OAAOwlC,OAAO9/B,GACXA,KAET,GACN,OAAQ2/B,EAAGz0B,MACP,IAAK,MACD00B,EAAgB9vB,EAAO7Q,OAAOorB,EAAIte,OAC5B8zB,EACAA,EAAetgC,KAAKS,GAAMu/B,EAAev/B,MAC/C,MACJ,IAAK,MACD,MAAM+/B,GAAS,IAAI9M,IAAWkC,QAAQwK,EAAG5zB,OAAOxM,KAAKS,GAAMu/B,EAAev/B,MAC1E4/B,EAAgB9vB,EACXpQ,QAAQ+K,IACT,MAAM5P,EAAMwvB,EAAIte,OAASwzB,EAAe90B,GAAQA,EAChD,OAAQqpB,GAAc,IAAIb,GAASp4B,GAAMklC,MAExC9gC,OAAOorB,EAAIte,OACV8zB,EACAA,EAAetgC,KAAKS,GAAMu/B,EAAev/B,MAC/C,MACJ,IAAK,SACD,MAAMggC,GAAe,IAAI/M,IAAWkC,QAAQwK,EAAGtlC,MAC/CulC,EAAgB9vB,EAAOpQ,QAAQ+K,IAC3B,MAAM5P,EAAMwvB,EAAIte,OAASwzB,EAAe90B,GAAQA,EAChD,OAAQqpB,GAAc,IAAIb,GAASp4B,GAAMmlC,MAE7C,MACJ,IAAK,cACD,MAAM3oB,EAAQsoB,EAAGtoB,MACjBuoB,EAAgB9vB,EAAOpQ,QAAQ+K,IAAUs0B,GAAcQ,EAAe90B,GAAO4M,KAGrF,OAAOuoB,IACR9vB,GACH,OAAI4vB,IAAgB5vB,EACTA,GACX4vB,EAAYzrB,MAAK,CAAC9U,EAAG9B,IAAMgU,GAAIouB,EAAqBtgC,GAAIsgC,EAAqBpiC,KACzEgU,GAAIkuB,EAAepgC,GAAIogC,EAAeliC,MACtCgtB,EAAI/U,OAAS+U,EAAI/U,MAAQ7J,EAAAA,IACrBi0B,EAAY1hC,OAASqsB,EAAI/U,MACzBoqB,EAAY1hC,OAASqsB,EAAI/U,MAEpBxF,EAAO9R,SAAWqsB,EAAI/U,OAASoqB,EAAY1hC,OAASqsB,EAAI/U,QAC7D8pB,EAAWa,OAAQ,IAGpBZ,EAAY/kC,OAAOwlC,OAAOJ,GAAeA,GAGpD,SAASQ,GAAeC,EAAIC,GACxB,OAAoC,IAA5B/uB,GAAI8uB,EAAGpvB,MAAOqvB,EAAGrvB,QACO,IAA5BM,GAAI8uB,EAAGlvB,MAAOmvB,EAAGnvB,UACfkvB,EAAGnvB,aAAgBovB,EAAGpvB,aACtBmvB,EAAGjvB,aAAgBkvB,EAAGlvB,UAmChC,SAASmvB,GAAaF,EAAIC,GACtB,OAjCJ,SAAuBE,EAAQC,EAAQC,EAAYC,GAC/C,QAAeliC,IAAX+hC,EACA,YAAkB/hC,IAAXgiC,GAAwB,EAAI,EACvC,QAAehiC,IAAXgiC,EACA,OAAO,EACX,MAAMpkB,EAAI9K,GAAIivB,EAAQC,GACtB,GAAU,IAANpkB,EAAS,CACT,GAAIqkB,GAAcC,EACd,OAAO,EACX,GAAID,EACA,OAAO,EACX,GAAIC,EACA,OAAQ,EAEhB,OAAOtkB,EAmBCukB,CAAcP,EAAGpvB,MAAOqvB,EAAGrvB,MAAOovB,EAAGnvB,UAAWovB,EAAGpvB,YAAc,GAjB7E,SAAuB2vB,EAAQC,EAAQC,EAAYC,GAC/C,QAAeviC,IAAXoiC,EACA,YAAkBpiC,IAAXqiC,EAAuB,EAAI,EACtC,QAAeriC,IAAXqiC,EACA,OAAQ,EACZ,MAAMzkB,EAAI9K,GAAIsvB,EAAQC,GACtB,GAAU,IAANzkB,EAAS,CACT,GAAI0kB,GAAcC,EACd,OAAO,EACX,GAAID,EACA,OAAQ,EACZ,GAAIC,EACA,OAAO,EAEf,OAAO3kB,EAIH4kB,CAAcZ,EAAGlvB,MAAOmvB,EAAGnvB,MAAOkvB,EAAGjvB,UAAWkvB,EAAGlvB,YAAc,EAuCzE,SAAS8vB,GAAsB5B,EAAY6B,EAAWjL,EAASkL,GAC3D9B,EAAWtlB,YAAY3D,IAAI6f,GAC3BkL,EAAOC,iBAAiB,SAAS,KAC7B/B,EAAWtlB,YAAY3C,OAAO6e,GACM,IAAhCoJ,EAAWtlB,YAAYsnB,MAKnC,SAA0BhC,EAAY6B,GAClCvjC,YAAW,KAC6B,IAAhC0hC,EAAWtlB,YAAYsnB,MACvBrgC,EAAakgC,EAAW7B,KAE7B,KATKiC,CAAiBjC,EAAY6B,MAYzC,MAAMK,GAAkB,CACpBpV,MAAO,SACP4N,MAAO,EACP53B,KAAM,QACN1F,OAAS2W,IACL,MAAM4iB,EAAS5iB,EAAKR,OAAOzQ,KACrBq/B,EAAS,IACRpuB,EACHqT,YAAa,CAACkL,EAAQ9iB,EAAM/S,KACxB,MAAMkU,EAAWoD,EAAKqT,YAAYkL,EAAQ9iB,EAAM/S,GAChD,GAAa,cAAT+S,EAAsB,CACtB,MAAM4yB,EAAK,IAAIC,iBACTP,OAAEA,GAAWM,EACbE,EAAkBC,GAAiB,KAErC,GADAH,EAAGzZ,QACU,cAATnZ,EAAsB,CACtB,MAAMgzB,EAAsB,IAAIhiC,IAChC,IAAK,MAAMkwB,KAAa4B,EAAQ,CAC5B,MAAMkE,EAAWpd,GAAM,SAASud,KAAUjG,KAC1C,GAAI8F,EAAU,CACV,MAAM7f,EAAQ5C,EAAK4C,MAAM+Z,GACnBqP,EAAMvJ,EAASiM,cAAcniC,QAAQigC,GAAOA,EAAGzwB,QAAUa,IAC/D,GAAIA,EAAS0pB,WAAakI,GAAgB5xB,EAASktB,aAC/C,IAAK,MAAM9G,KAAW77B,OAAOyR,OAAO6pB,EAASQ,QAAQ9a,OACjD,IAAK,MAAMlD,KAAS+d,EAAQt5B,QACpBi4B,GAAe1c,EAAMke,OAAQvmB,EAASktB,gBACtCl8B,EAAao1B,EAAS/d,GACtBA,EAAM0B,YAAYlf,SAASo7B,GAAY4L,EAAoBzrB,IAAI6f,WAK1E,GAAImJ,EAAInhC,OAAS,EAAG,CACrB43B,EAASiM,cAAgBjM,EAASiM,cAAcniC,QAAQigC,GAAOA,EAAGzwB,QAAUa,IAC5E,IAAK,MAAMomB,KAAW77B,OAAOyR,OAAO6pB,EAASQ,QAAQ9a,OACjD,IAAK,MAAMlD,KAAS+d,EAAQt5B,QACxB,GAAiB,MAAbub,EAAM7T,KACNwL,EAASktB,aAET,GAAI0E,IAAiBvpB,EAAM6nB,MAAO,CAC9B,MAAM6B,EAAgBxnC,OAAOmE,SAAS2Z,EAAM7T,KACtCw9B,EAAS7C,GAAmB9mB,EAAM7T,IAAK6T,EAAMiS,IAAK8U,EAAKppB,EAAOqC,EAAO0pB,GACvE1pB,EAAM6nB,OACNl/B,EAAao1B,EAAS/d,GACtBA,EAAM0B,YAAYlf,SAASo7B,GAAY4L,EAAoBzrB,IAAI6f,MAE1D+L,IAAW3pB,EAAM7T,MACtB6T,EAAM7T,IAAMw9B,EACZ3pB,EAAMnP,QAAUvB,GAAa9B,QAAQ,CAAEkK,OAAQiyB,UAI/C3pB,EAAM6nB,OACNl/B,EAAao1B,EAAS/d,GAE1BA,EAAM0B,YAAYlf,SAASo7B,GAAY4L,EAAoBzrB,IAAI6f,OAQ3F4L,EAAoBhnC,SAASo7B,GAAYA,QAGjDjmB,EAASoxB,iBAAiB,QAASO,GAAe,GAAQ,CACtDR,OAAAA,IAEJnxB,EAASoxB,iBAAiB,QAASO,GAAe,GAAQ,CACtDR,OAAAA,IAEJnxB,EAASoxB,iBAAiB,WAAYO,GAAe,GAAO,CACxDR,OAAAA,IAGR,OAAOnxB,GAEXgG,MAAMvD,GACF,MAAM4oB,EAAYjoB,EAAK4C,MAAMvD,GACvBqB,EAAUunB,EAAUzoB,OAAOoI,WAC3BinB,EAAU,IACT5G,EACHzkB,OAAO0T,GACH,MAAMnb,EAAQ3H,GAAI2H,MAClB,GAAI2E,EAAQ+L,UACoB,aAA5B1Q,EAAMP,GAAGmR,SAAStH,OAClBtJ,EAAMsqB,SAEN,OAAO4B,EAAUzkB,OAAO0T,GAE5B,MAAMuL,EAAWpd,GAAM,SAASud,KAAUvjB,KAC1C,IAAKojB,EACD,OAAOwF,EAAUzkB,OAAO0T,GAC5B,MAAMphB,EAAUmyB,EAAUzkB,OAAO0T,GAsCjC,MArCkB,QAAbA,EAAInf,MAA+B,QAAbmf,EAAInf,QAAoBmf,EAAIte,OAAO/N,QAAU,IAAMi9B,GAAiBpnB,EAASwW,GAAK5gB,MAAK5O,GAAc,MAAPA,MAoBrH+6B,EAASiM,cAAc3jC,KAAKmsB,GAC5BA,EAAI4S,cAAgB3H,GAAwBjL,EAAI4S,cAChDh0B,EAAQjE,MAAMT,IACV,GAAIA,EAAIqS,YAAc,EAAG,CACrB7V,EAAa60B,EAASiM,cAAexX,GACrC,MAAM4X,EAAcpD,GAA6BjJ,EAAUvL,EAAK9lB,GAC5D09B,GACArM,EAASiM,cAAc3jC,KAAK+jC,GAEhC5X,EAAI4S,cAAgB3H,GAAwBjL,EAAI4S,kBAGxDh0B,EAAQgC,OAAM,KACVlK,EAAa60B,EAASiM,cAAexX,GACrCA,EAAI4S,cAAgB3H,GAAwBjL,EAAI4S,kBAjCpDh0B,EAAQjE,MAAMT,IACV,MAYM09B,EAAcpD,GAA6BjJ,EAZrB,IACrBvL,EACHte,OAAQse,EAAIte,OAAOxM,KAAI,CAACtD,EAAO6B,KAC3B,MAAMokC,EAAeruB,EAAQjW,SAASif,SAAS,KACzCzc,EAAUnE,GACV,IACKA,GAGX,OADAuC,EAAa0jC,EAAcruB,EAAQjW,QAAS2G,EAAIqI,QAAQ9O,IACjDokC,MAGiE39B,GAChFqxB,EAASiM,cAAc3jC,KAAK+jC,GAC5Bx7B,gBAAe,IAAM4jB,EAAI4S,cAAgB3H,GAAwBjL,EAAI4S,mBAqBtEh0B,GAEXqS,MAAM+O,GACF,IAAKoS,GAAkBl1B,GAAK6zB,KAAeuB,GAAkB,QAAStS,GAClE,OAAO+Q,EAAU9f,MAAM+O,GAC3B,MAAMyX,EAAiD,cAAjCv6B,GAAI2H,OAAOP,GAAGmR,SAAStH,OACvCwd,QAAEA,EAAOkL,OAAEA,GAAW35B,GAC5B,IAAK63B,EAAY+C,EAAYvM,EAAUqL,GAhM/D,SAA6BlL,EAAQvjB,EAAWtH,EAAMmf,GAClD,MAAMuL,EAAWpd,GAAM,SAASud,KAAUvjB,KAC1C,IAAKojB,EACD,MAAO,GACX,MAAMQ,EAAUR,EAASQ,QAAQlrB,GACjC,IAAKkrB,EACD,MAAO,CAAC,MAAM,EAAOR,EAAU,MACnC,MACMO,EAAUC,GADE/L,EAAI/O,MAAQ+O,EAAI/O,MAAMvG,MAAM7S,KAAO,OAChB,IACrC,IAAKi0B,EACD,MAAO,CAAC,MAAM,EAAOP,EAAU,MACnC,OAAQ1qB,GACJ,IAAK,QACD,MAAMk3B,EAAajM,EAAQkM,MAAMjqB,GAAUA,EAAMiS,IAAI/U,QAAU+U,EAAI/U,OAC/D8C,EAAMiS,IAAIte,SAAWse,EAAIte,QACzBm0B,GAAe9nB,EAAMiS,IAAI/O,MAAMjE,MAAOgT,EAAI/O,MAAMjE,SACpD,OAAI+qB,EACO,CACHA,GACA,EACAxM,EACAO,GAQD,CANYA,EAAQkM,MAAMjqB,IACf,UAAWA,EAAMiS,IAAMjS,EAAMiS,IAAI/U,MAAQ7J,EAAAA,IACtC4e,EAAI/U,SAChB+U,EAAIte,QAASqM,EAAMiS,IAAIte,SACxBs0B,GAAajoB,EAAMiS,IAAI/O,MAAMjE,MAAOgT,EAAI/O,MAAMjE,UAElC,EAAOue,EAAUO,GACzC,IAAK,QACD,MAAMmM,EAAanM,EAAQkM,MAAMjqB,GAAU8nB,GAAe9nB,EAAMiS,IAAI/O,MAAMjE,MAAOgT,EAAI/O,MAAMjE,SAC3F,MAAO,CAACirB,IAAcA,EAAY1M,EAAUO,IAgKoBoM,CAAoBxM,EAAQvjB,EAAW,QAAS6X,GACpG,GAAI+U,GAAc+C,EACd/C,EAAW9I,OAASjM,EAAIiM,WAEvB,CACD,MAAMrtB,EAAUmyB,EAAU9f,MAAM+O,GAAKrlB,MAAMT,IACvC,MAAMuL,EAASvL,EAAIuL,OAGnB,GAFIsvB,IACAA,EAAW76B,IAAMuL,GACjBgyB,EAAe,CACf,IAAK,IAAIhkC,EAAI,EAAGC,EAAI+R,EAAO9R,OAAQF,EAAIC,IAAKD,EACxCxD,OAAOwlC,OAAOhwB,EAAOhS,IAEzBxD,OAAOwlC,OAAOhwB,QAGdvL,EAAIuL,OAAS1P,EAAU0P,GAE3B,OAAOvL,KACR0G,OAAMqS,IACD2jB,GAAa7B,GACbr+B,EAAakgC,EAAW7B,GACrBtkC,QAAQ6N,OAAO2U,MAE1B8hB,EAAa,CACT9I,OAAQjM,EAAIiM,OACZrtB,QAAAA,EACA6Q,YAAa,IAAIla,IACjBsL,KAAM,QACNmf,IAAAA,EACA4V,OAAO,GAEPgB,EACAA,EAAU/iC,KAAKkhC,IAGf6B,EAAY,CAAC7B,GACRxJ,IACDA,EAAWpd,GAAM,SAASud,KAAUvjB,KAAe,CAC/C4jB,QAAS,CACL9a,MAAO,GACPnG,MAAO,IAEXsD,KAAM,IAAI+pB,IACVX,cAAe,GACfzM,gBAAiB,KAGzBQ,EAASQ,QAAQ9a,MAAM+O,EAAI/O,MAAMvG,MAAM7S,MAAQ,IAAM++B,GAI7D,OADAD,GAAsB5B,EAAY6B,EAAWjL,EAASkL,GAC/C9B,EAAWn2B,QAAQjE,MAAMT,IACrB,CACHuL,OAAQovB,GAAmB36B,EAAIuL,OAAQua,EAAKuL,GAAUiM,cAAezG,EAAWgE,EAAY0C,SAK5G,OAAOE,IAGf,OAAOT,IAIf,SAASkB,GAAO/c,EAAQgd,GACpB,OAAO,IAAIC,MAAMjd,EAAQ,CACrB5pB,IAAG,CAAC4pB,EAAQtqB,EAAMwnC,IACD,OAATxnC,EACOsnC,EACJlnC,QAAQM,IAAI4pB,EAAQtqB,EAAMwnC,KAK7C,MAAMzQ,GACFjyB,YAAYgC,EAAMrG,GACdwF,KAAKyrB,aAAe,GACpBzrB,KAAKs1B,MAAQ,EACb,MAAMkM,EAAO1Q,GAAQ2Q,aACrBzhC,KAAKye,SAAWjkB,EAAU,CACtBu2B,OAAQD,GAAQC,OAChBhiB,UAAU,EACVsE,UAAWmuB,EAAKnuB,UAChB8X,YAAaqW,EAAKrW,YAClBhU,MAAO,YACJ3c,GAEPwF,KAAKoT,MAAQ,CACTC,UAAW7Y,EAAQ6Y,UACnB8X,YAAa3wB,EAAQ2wB,aAEzB,MAAM4F,OAAEA,GAAYv2B,EACpBwF,KAAK+N,UAAY,GACjB/N,KAAKitB,UAAY,GACjBjtB,KAAK2sB,YAAc,GACnB3sB,KAAKywB,WAAa,GAClBzwB,KAAKyN,MAAQ,KACbzN,KAAKwR,OAASxR,KACd,MAAMizB,EAAQ,CACVpkB,YAAa,KACbC,eAAe,EACfmoB,kBAAmB,KACnBvpB,cAAc,EACdgoB,eAAgBjzB,EAChBuM,eAAgB,KAChB0yB,WAAYj/B,EACZ0yB,cAAe,KACfW,YAAY,EACZ9nB,eAAgB,EAChBe,SAAUvU,EAAQuU,UAt7F9B,IAAqCzB,EAw7F7B2lB,EAAMjkB,eAAiB,IAAI3I,IAAa9B,IACpC0uB,EAAMyC,eAAiBnxB,KAE3B0uB,EAAMkC,cAAgB,IAAI9uB,IAAa,CAAC2O,EAAG1N,KACvC2rB,EAAMyO,WAAap6B,KAEvBtH,KAAK0G,OAASusB,EACdjzB,KAAKa,KAAOA,EACZb,KAAKylB,GAAK3N,GAAO9X,KAAM,WAAY,UAAW,gBAAiB,QAAS,CAAEk3B,MAAO,CAACxzB,GAAiBjB,KACnGzC,KAAKylB,GAAGyR,MAAM/e,UAAYvc,EAASoE,KAAKylB,GAAGyR,MAAM/e,WAAWA,GACjD,CAACD,EAAYypB,KAChB7Q,GAAQK,KAAI,KACR,MAAM8B,EAAQjzB,KAAK0G,OACnB,GAAIusB,EAAMvlB,aACDulB,EAAMpkB,aACPxI,GAAa9B,UAAUZ,KAAKuU,GAC5BypB,GACAxpB,EAAUD,QAEb,GAAI+a,EAAMgE,kBACXhE,EAAMgE,kBAAkBp6B,KAAKqb,GACzBypB,GACAxpB,EAAUD,OAEb,CACDC,EAAUD,GACV,MAAM5K,EAAKtN,KACN2hC,GACDxpB,GAAU,SAASlD,IACf3H,EAAGmY,GAAGyR,MAAMjiB,YAAYiD,GACxB5K,EAAGmY,GAAGyR,MAAMjiB,YAAYA,aAMhDjV,KAAKqU,YA59FwB/G,EA49FiBtN,KA39F3C2Y,GAAqBtE,GAAWnZ,WAAW,SAAoB6kB,EAAa6hB,GAC/E5hC,KAAKsN,GAAKA,EACV,IAAIu0B,EAAWpyB,GAAUwM,EAAQ,KACjC,GAAI2lB,EACA,IACIC,EAAWD,IAEf,MAAO15B,GACH+T,EAAQ/T,EAEhB,MAAM45B,EAAW/hB,EAAY/D,KACvBtH,EAAQotB,EAASptB,MACjBqtB,EAAcrtB,EAAM3C,KAAKC,QAAQC,KACvCjS,KAAKgc,KAAO,CACRtH,MAAOA,EACPhB,MAAOouB,EAASpuB,MAChB+F,WAAaqoB,EAASpuB,OAAUgB,EAAMpD,OAAOkB,QAAQjW,SAAWulC,EAASpuB,QAAUgB,EAAMpD,OAAOkB,QAAQ3R,KACxGmV,MAAO6rB,EACP/nB,UAAU,EACVC,IAAK,OACLC,OAAQ,GACRlB,UAAW,KACXza,OAAQ,KACR4a,aAAc,KACdD,WAAW,EACXsE,QAAS,KACTtJ,OAAQ,EACRC,MAAO7J,EAAAA,EACP6R,MAAOA,EACPlD,GAAI+oB,EAAS/oB,GACb4B,YAAaonB,IAAgBr/B,EAASq/B,EAAc,UA87FxD/hC,KAAK+Q,MA3+Gb,SAAgCzD,GAC5B,OAAOqL,GAAqB5H,GAAM7V,WAAW,SAAe2F,EAAMgmB,EAAahZ,GAC3E7N,KAAKsN,GAAKA,EACVtN,KAAKkR,IAAMrD,EACX7N,KAAKa,KAAOA,EACZb,KAAKsR,OAASuV,EACd7mB,KAAK+R,KAAOzE,EAAGmjB,WAAW5vB,GAAQyM,EAAGmjB,WAAW5vB,GAAMkR,KAAO+F,GAAO,KAAM,CACtEqiB,SAAY,CAACl3B,EAAmBR,GAChCuP,QAAW,CAACrP,EAAmBD,GAC/B03B,SAAY,CAAC72B,GAAmBd,GAChCy3B,SAAY,CAAC52B,GAAmBb,QAi+GvBu/B,CAAuBhiC,MACpCA,KAAKwkB,YAr6Eb,SAAsClX,GAClC,OAAOqL,GAAqB6L,GAAYtpB,WAAW,SAAqBqS,EAAMC,EAAYqe,EAAUxG,EAA6BjZ,GAC7HpM,KAAKsN,GAAKA,EACVtN,KAAKuN,KAAOA,EACZvN,KAAKwN,WAAaA,EAClBxN,KAAKsR,OAASua,EACd7rB,KAAKqlB,4BAA8BA,EACnCrlB,KAAK0O,SAAW,KAChB1O,KAAKylB,GAAK3N,GAAO9X,KAAM,WAAY,QAAS,SAC5CA,KAAKoM,OAASA,GAAU,KACxBpM,KAAKklB,QAAS,EACdllB,KAAK0kB,UAAY,EACjB1kB,KAAK6kB,cAAgB,GACrB7kB,KAAK2lB,SAAW,KAChB3lB,KAAKulB,QAAU,KACfvlB,KAAKmmB,YAAc,KACnBnmB,KAAKomB,cAAgB,KACrBpmB,KAAKwmB,WAAa,EAClBxmB,KAAK4O,YAAc,IAAIvI,IAAa,CAAC9B,EAAS+C,KAC1CtH,KAAK2lB,SAAWphB,EAChBvE,KAAKulB,QAAUje,KAEnBtH,KAAK4O,YAAYjL,MAAK,KAClB3D,KAAKklB,QAAS,EACdllB,KAAKylB,GAAGwc,SAAShwB,UAClBjJ,IACC,IAAIk5B,EAAYliC,KAAKklB,OAMrB,OALAllB,KAAKklB,QAAS,EACdllB,KAAKylB,GAAGxJ,MAAMhK,KAAKjJ,GACnBhJ,KAAKoM,OACDpM,KAAKoM,OAAOmZ,QAAQvc,GACpBk5B,GAAaliC,KAAK0O,UAAY1O,KAAK0O,SAASgY,QACzCla,GAAUxD,SAq4EFm5B,CAA6BniC,MAChDA,KAAKmwB,QAjmDb,SAAkC7iB,GAC9B,OAAOqL,GAAqBwX,GAAQj1B,WAAW,SAAiBknC,GAC5DpiC,KAAKsN,GAAKA,EACVtN,KAAKksB,KAAO,CACRC,QAASiW,EACT7R,aAAc,KACd1E,SAAU,GACVxD,OAAQ,GACR8F,eAAgB,SAylDLkU,CAAyBriC,MACxCA,KAAKmS,YAvmFb,SAAsC7E,GAClC,OAAOqL,GAAqBxG,GAAYjX,WAAW,SAAqBwZ,EAAOhB,EAAO4uB,GAYlF,GAXAtiC,KAAKsN,GAAKA,EACVtN,KAAKgc,KAAO,CACRtH,MAAOA,EACPhB,MAAiB,QAAVA,EAAkB,KAAOA,EAChCqF,GAAIupB,GAERtiC,KAAKgiB,KAAOhiB,KAAK4iB,WAAa5S,GAC9BhQ,KAAK6iB,YAAc,CAAC/kB,EAAG9B,IAAMgU,GAAIhU,EAAG8B,GACpCkC,KAAKwjB,KAAO,CAAC1lB,EAAG9B,IAAMgU,GAAIlS,EAAG9B,GAAK,EAAI8B,EAAI9B,EAC1CgE,KAAKsjB,KAAO,CAACxlB,EAAG9B,IAAMgU,GAAIlS,EAAG9B,GAAK,EAAI8B,EAAI9B,EAC1CgE,KAAKuiC,aAAej1B,EAAG8F,MAAM+X,aACxBnrB,KAAKuiC,aACN,MAAM,IAAI1gC,EAAWlB,cAylFN6hC,CAA6BxiC,MAChDA,KAAKylB,GAAG,iBAAiBH,IACjBA,EAAGmd,WAAa,EAChBt0B,QAAQC,KAAK,iDAAiDpO,KAAKa,gDAEnEsN,QAAQC,KAAK,gDAAgDpO,KAAKa,uDACtEb,KAAKqO,MAAM,CAAEC,iBAAiB,OAElCtO,KAAKylB,GAAG,WAAWH,KACVA,EAAGmd,YAAcnd,EAAGmd,WAAand,EAAG+G,WACrCle,QAAQC,KAAK,iBAAiBpO,KAAKa,sBAEnCsN,QAAQC,KAAK,YAAYpO,KAAKa,qDAAqDykB,EAAG+G,WAAa,SAE3GrsB,KAAK6S,QAAUyU,GAAU9sB,EAAQ2wB,aACjCnrB,KAAK8N,mBAAqB,CAACP,EAAMC,EAAYqe,EAAUqM,IAAsB,IAAIl4B,KAAKwkB,YAAYjX,EAAMC,EAAYqe,EAAU7rB,KAAKye,SAAS4G,4BAA6B6S,GACzKl4B,KAAKg2B,eAAiB1Q,IAClBtlB,KAAKylB,GAAG,WAAWxT,KAAKqT,GACxBjW,GACKhR,QAAOyc,GAAKA,EAAEja,OAASb,KAAKa,MAAQia,IAAM9a,OAAS8a,EAAEpU,OAAOowB,UAC5D54B,KAAI4c,GAAKA,EAAE2K,GAAG,iBAAiBxT,KAAKqT,MAE7CtlB,KAAK0iC,IAAIxH,IACTl7B,KAAK0iC,IAAIzC,IACTjgC,KAAK0iC,IAAInH,IACTv7B,KAAK0iC,IAAIlK,IACTx4B,KAAK0iC,IAAI7I,IACT,MAAM8I,EAAQ,IAAIrB,MAAMthC,KAAM,CAC1BvF,IAAK,CAACua,EAAGjb,EAAMwnC,KACX,GAAa,SAATxnC,EACA,OAAO,EACX,GAAa,UAATA,EACA,OAAQoX,GAAciwB,GAAOphC,KAAK0U,MAAMvD,GAAYwxB,GACxD,MAAMnmC,EAAKrC,QAAQM,IAAIua,EAAGjb,EAAMwnC,GAChC,OAAI/kC,aAAcuU,GACPqwB,GAAO5kC,EAAImmC,GACT,WAAT5oC,EACOyC,EAAG0B,KAAIE,GAAKgjC,GAAOhjC,EAAGukC,KACpB,uBAAT5oC,EACO,WACH,MAAM6oC,EAAKpmC,EAAGuB,MAAMiC,KAAMD,WAC1B,OAAOqhC,GAAOwB,EAAID,IAEnBnmC,KAGfwD,KAAKmxB,IAAMwR,EACX5R,EAAOx3B,SAAQspC,GAASA,EAAM7iC,QAElCmsB,QAAQiW,GACJ,GAAI7kC,MAAM6kC,IAAkBA,EAAgB,GACxC,MAAM,IAAIvgC,EAAWM,KAAK,0CAE9B,GADAigC,EAAgB9lB,KAAK+Y,MAAsB,GAAhB+M,GAAsB,GAC7CpiC,KAAKyN,OAASzN,KAAK0G,OAAOoI,cAC1B,MAAM,IAAIjN,EAAW+X,OAAO,4CAChC5Z,KAAKs1B,MAAQhZ,KAAKiH,IAAIvjB,KAAKs1B,MAAO8M,GAClC,MAAMpV,EAAWhtB,KAAKitB,UACtB,IAAI6V,EAAkB9V,EAAS3uB,QAAOM,GAAKA,EAAEutB,KAAKC,UAAYiW,IAAe,GAC7E,OAAIU,IAEJA,EAAkB,IAAI9iC,KAAKmwB,QAAQiS,GACnCpV,EAASnwB,KAAKimC,GACd9V,EAASpa,KAAKqZ,IACd6W,EAAgBzS,OAAO,IACvBrwB,KAAK0G,OAAOovB,YAAa,EAClBgN,GAEXC,WAAW5mC,GACP,OAAQ6D,KAAKyN,QAAUzN,KAAK0G,OAAOgH,cAAgBxH,GAAIyH,YAAc3N,KAAK4N,MAASzR,IAAO,IAAIkK,IAAa,CAAC9B,EAAS+C,KACjH,GAAItH,KAAK0G,OAAOgH,aACZ,OAAOpG,EAAO,IAAIzF,EAAWrB,eAAeR,KAAK0G,OAAOmI,cAE5D,IAAK7O,KAAK0G,OAAOoI,cAAe,CAC5B,IAAK9O,KAAK0G,OAAOqI,SAEb,YADAzH,EAAO,IAAIzF,EAAWrB,gBAG1BR,KAAKuO,OAAO3E,MAAMnH,GAEtBzC,KAAK0G,OAAOsI,eAAerL,KAAKY,EAAS+C,MAC1C3D,KAAKxH,GAEZumC,KAAI7X,MAAEA,EAAK1vB,OAAEA,EAAMs9B,MAAEA,EAAK53B,KAAEA,IACpBA,GACAb,KAAKgjC,MAAM,CAAEnY,MAAAA,EAAOhqB,KAAAA,IACxB,MAAMqqB,EAAclrB,KAAKyrB,aAAaZ,KAAW7qB,KAAKyrB,aAAaZ,GAAS,IAG5E,OAFAK,EAAYruB,KAAK,CAAEguB,MAAAA,EAAO1vB,OAAAA,EAAQs9B,MAAgB,MAATA,EAAgB,GAAKA,EAAO53B,KAAAA,IACrEqqB,EAAYtY,MAAK,CAAC9U,EAAG9B,IAAM8B,EAAE26B,MAAQz8B,EAAEy8B,QAChCz4B,KAEXgjC,OAAMnY,MAAEA,EAAKhqB,KAAEA,EAAI1F,OAAEA,IAMjB,OALI0vB,GAAS7qB,KAAKyrB,aAAaZ,KAC3B7qB,KAAKyrB,aAAaZ,GAAS7qB,KAAKyrB,aAAaZ,GAAOxsB,QAAO4kC,GAAM9nC,EAAS8nC,EAAG9nC,SAAWA,IACpF0F,GAAOoiC,EAAGpiC,OAASA,KAGpBb,KAEXuO,OACI,OAAOtF,GAAOvD,IACd,IAAMwvB,GAAUl1B,QAEpBq3B,SACI,MAAMpE,EAAQjzB,KAAK0G,OACb4M,EAAMjE,GAAYtS,QAAQiD,MAGhC,GAFIsT,GAAO,GACPjE,GAAY5R,OAAO6V,EAAK,GACxBtT,KAAKyN,MAAO,CACZ,IACIzN,KAAKyN,MAAMY,QAEf,MAAOrF,IACPhJ,KAAKyN,MAAQ,KAEZwlB,EAAMnkB,gBACPmkB,EAAMjkB,eAAiB,IAAI3I,IAAa9B,IACpC0uB,EAAMyC,eAAiBnxB,KAE3B0uB,EAAMkC,cAAgB,IAAI9uB,IAAa,CAAC2O,EAAG1N,KACvC2rB,EAAMyO,WAAap6B,MAI/B+G,OAAMC,gBAAEA,GAAoB,CAAEA,iBAAiB,IAC3C,MAAM2kB,EAAQjzB,KAAK0G,OACf4H,GACI2kB,EAAMnkB,eACNmkB,EAAMyO,WAAW,IAAI7/B,EAAWrB,gBAEpCR,KAAKq3B,SACLpE,EAAMlkB,UAAW,EACjBkkB,EAAMpkB,YAAc,IAAIhN,EAAWrB,iBAGnCR,KAAKq3B,SACLpE,EAAMlkB,SAAW/O,KAAKye,SAAS1P,UAC3BkkB,EAAMnkB,cACVmkB,EAAMvlB,cAAe,EACrBulB,EAAMpkB,YAAc,MAG5BiH,OAAOotB,EAAe,CAAE50B,iBAAiB,IACrC,MAAM60B,EAAsBpjC,UAAUpD,OAAS,GAA6B,iBAAjBoD,UAAU,GAC/DkzB,EAAQjzB,KAAK0G,OACnB,OAAO,IAAIL,IAAa,CAAC9B,EAAS+C,KAC9B,MAAM87B,EAAW,KACbpjC,KAAKqO,MAAM60B,GACX,IAAIla,EAAMhpB,KAAKoT,MAAMC,UAAU+iB,eAAep2B,KAAKa,MACnDmoB,EAAI7lB,UAAYqG,IAAK,MA9sDrC,UAA4B6J,UAAEA,EAAS8X,YAAEA,GAAetqB,IACnDowB,GAAmB5d,IAn8EL,cAo8EXxS,GACA+vB,GAAgBvd,EAAW8X,GAAarV,OAAOjV,GAAM+I,MAAMnH,GA4sD/C4gC,CAAmBrjC,KAAKoT,MAAOpT,KAAKa,MACpC0D,OAEJykB,EAAI5lB,QAAU8gB,GAAmB5c,GACjC0hB,EAAI+M,UAAY/1B,KAAKg2B,gBAEzB,GAAImN,EACA,MAAM,IAAIthC,EAAW+T,gBAAgB,gDACrCqd,EAAMnkB,cACNmkB,EAAMjkB,eAAerL,KAAKy/B,GAG1BA,OAIZE,YACI,OAAOtjC,KAAKyN,MAEhBS,SACI,OAAsB,OAAflO,KAAKyN,MAEhB81B,gBACI,MAAM10B,EAAc7O,KAAK0G,OAAOmI,YAChC,OAAOA,GAAqC,mBAArBA,EAAYhO,KAEvC2iC,YACI,OAAmC,OAA5BxjC,KAAK0G,OAAOmI,YAEvB40B,oBACI,OAAOzjC,KAAK0G,OAAOovB,WAEnBzN,aACA,OAAOrvB,EAAKgH,KAAKywB,YAAYvyB,KAAI2C,GAAQb,KAAKywB,WAAW5vB,KAE7DskB,cACI,MAAM1pB,EAAOq8B,GAAuB/5B,MAAMiC,KAAMD,WAChD,OAAOC,KAAK0jC,aAAa3lC,MAAMiC,KAAMvE,GAEzCioC,aAAan2B,EAAM8a,EAAQ2P,GACvB,IAAIE,EAAoBhyB,GAAI2H,MACvBqqB,GAAqBA,EAAkB5qB,KAAOtN,OAA+B,IAAvBuN,EAAKxQ,QAAQ,OACpEm7B,EAAoB,MACxB,MAAMyL,GAA0C,IAAvBp2B,EAAKxQ,QAAQ,KAEtC,IAAI6mC,EAASp2B,EADbD,EAAOA,EAAK2iB,QAAQ,IAAK,IAAIA,QAAQ,IAAK,IAE1C,IAOI,GANA1iB,EAAa6a,EAAOnqB,KAAIwW,IACpB,IAAI+Z,EAAY/Z,aAAiB1U,KAAK+Q,MAAQ2D,EAAM7T,KAAO6T,EAC3D,GAAyB,iBAAd+Z,EACP,MAAM,IAAIrsB,UAAU,mFACxB,OAAOqsB,KAEC,KAARlhB,GArsIC,aAqsIcA,EACfq2B,EAtsIC,eAusIA,CAAA,GAAY,MAARr2B,GAtsIH,aAssImBA,EAGrB,MAAM,IAAI1L,EAAW+T,gBAAgB,6BAA+BrI,GAFpEq2B,EAvsIE,YA0sIN,GAAI1L,EAAmB,CACnB,GA5sIC,aA4sIGA,EAAkB3qB,MA3sIpB,cA2sIyCq2B,EAAuB,CAC9D,IAAID,EAIA,MAAM,IAAI9hC,EAAWgiC,eAAe,0FAHpC3L,EAAoB,KAKxBA,GACA1qB,EAAWjU,SAAQk1B,IACf,GAAIyJ,IAA0E,IAArDA,EAAkB1qB,WAAWzQ,QAAQ0xB,GAAmB,CAC7E,IAAIkV,EAIA,MAAM,IAAI9hC,EAAWgiC,eAAe,SAAWpV,EAC3C,wCAJJyJ,EAAoB,SAQhCyL,GAAoBzL,IAAsBA,EAAkBhT,SAC5DgT,EAAoB,OAIhC,MAAOlvB,GACH,OAAOkvB,EACHA,EAAkB1pB,SAAS,MAAM,CAACwG,EAAG1N,KAAaA,EAAO0B,MACzDwD,GAAUxD,GAElB,MAAM86B,EAAmB7L,GAAsB78B,KAAK,KAAM4E,KAAM4jC,EAASp2B,EAAY0qB,EAAmBF,GACxG,OAAQE,EACJA,EAAkB1pB,SAASo1B,EAASE,EAAkB,QACtD59B,GAAI2H,MACA5E,GAAO/C,GAAIuL,WAAW,IAAMzR,KAAK+iC,WAAWe,KAC5C9jC,KAAK+iC,WAAWe,GAE5BpvB,MAAMvD,GACF,IAAKrX,EAAOkG,KAAKywB,WAAYtf,GACzB,MAAM,IAAItP,EAAWkiC,aAAa,SAAS5yB,oBAE/C,OAAOnR,KAAKywB,WAAWtf,IAI/B,MAAM6yB,GAAqC,oBAAXzkC,QAA0B,eAAgBA,OACpEA,OAAO0kC,WACP,eACN,MAAMC,GACFrlC,YAAYsZ,GACRnY,KAAKmkC,WAAahsB,EAEtBA,UAAUhZ,EAAG8c,EAAOgmB,GAChB,OAAOjiC,KAAKmkC,WAAYhlC,GAAkB,mBAANA,EAAkDA,EAA/B,CAAEc,KAAMd,EAAG8c,MAAAA,EAAOgmB,SAAAA,IAE7E+B,CAACA,MACG,OAAOhkC,MAIf,IAAIokC,GACJ,IACIA,GAAU,CACN/wB,UAAW1a,EAAQ0a,WAAa1a,EAAQ0rC,cAAgB1rC,EAAQ2rC,iBAAmB3rC,EAAQ4rC,YAC3FpZ,YAAaxyB,EAAQwyB,aAAexyB,EAAQ6rC,mBAGpD,MAAOx7B,GACHo7B,GAAU,CAAE/wB,UAAW,KAAM8X,YAAa,MAG9C,SAASsZ,GAAUhJ,GACf,IACIiJ,EADAC,GAAW,EAEf,MAAMV,EAAa,IAAIC,IAAYU,IAC/B,MAAMvM,EAAmBl4B,EAAgBs7B,GAiBzC,IACIoJ,EADAC,GAAS,EAETC,EAAY,GACZC,EAAa,GACjB,MAAMC,EAAe,CACbH,aACA,OAAOA,GAEX7vB,YAAa,KACL6vB,IAEJA,GAAS,EACLD,GACAA,EAAgBne,QAChBwe,GACA3gB,GAAaqB,eAAe3Q,YAAYkwB,MAGpDP,EAASlpC,OAASkpC,EAASlpC,MAAMupC,GACjC,IAAIC,GAAmB,EACvB,MAAME,EAAU,IAAMj4B,GAAoBk4B,GAI1C,MAAMF,EAAoB1oB,IACtB8W,GAAuBwR,EAAWtoB,GAH3BgX,GAAeuR,EAAYD,IAK9BK,KAGFC,EAAW,KACb,GAAIP,IACCV,GAAQ/wB,UAET,OAEJ0xB,EAAY,GACZ,MAAM1J,EAAS,GACXwJ,GACAA,EAAgBne,QACpBme,EAAkB,IAAIzE,gBACtB,MAAMroB,EAAM,CACRsjB,OAAAA,EACAwE,OAAQgF,EAAgBhF,OACxBlL,QAASyQ,EACT3J,QAAAA,EACA5tB,MAAO,MAELhF,EAhEV,SAAiBkP,GACb,MAAM7O,EAAcpB,KACpB,IACQuwB,GACA/rB,KAEJ,IAAI9P,EAAKuO,GAAS0wB,EAAS1jB,GAI3B,OAHIsgB,IACA77B,EAAKA,EAAGwN,QAAQ3C,KAEb7K,EAEX,QACI0M,GAAejB,MAmDPkT,CAAQpD,GACpBte,QAAQ8K,QAAQsE,GAAKlF,MAAM8K,IACvBk2B,GAAW,EACXD,EAAej2B,EACXq2B,GAAU/sB,EAAI8nB,OAAOyF,UAGzBP,EAAY,GACZC,EAAa3J,EAnvK7B,SAAuB58B,GACnB,IAAK,MAAMC,KAAKD,EACZ,GAAI3E,EAAO2E,EAAGC,GACV,OAAO,EACf,OAAO,EAgvKU6mC,CAAcP,IAAgBE,IAC/B3gB,GA76FqB,iBA66F0B4gB,GAC/CD,GAAmB,GAEvB/3B,IAAoB,KAAO23B,GAAUF,EAAS3kC,MAAQ2kC,EAAS3kC,KAAKwO,SACpE1E,IACA46B,GAAW,EACN,CAAC,sBAAuB,cAAcnpB,SAASzR,GAAKlJ,OAChDikC,GACD33B,IAAoB,KACZ23B,GAEJF,EAAS3oB,OAAS2oB,EAAS3oB,MAAMlS,UAMrD,OADA1N,WAAW+oC,EAAS,GACbH,KAIX,OAFAhB,EAAWU,SAAW,IAAMA,EAC5BV,EAAWuB,SAAW,IAAMd,EACrBT,EAGX,MAAMwB,GAAQ3U,GA2Hd,SAAS4U,GAAiBC,GACtB,IAAIC,EAAQC,GACZ,IACIA,IAAqB,EACrBthB,GAAaqB,eAAe3T,KAAK0zB,GACjCxR,GAAqBwR,GAAa,GAEtC,QACIE,GAAqBD,GAlI7B3rC,EAAMwrC,GAAO,IACNjjC,EACHsT,OAAOgwB,GACQ,IAAIL,GAAMK,EAAc,CAAE/U,OAAQ,KACnCjb,SAEdiwB,OAAOllC,GACI,IAAI4kC,GAAM5kC,EAAM,CAAEkwB,OAAQ,KAAMxiB,OAAO5K,MAAK2J,IAC/CA,EAAGe,SACI,KACRzE,MAAM,uBAAuB,KAAM,IAE1Co8B,iBAAiBr9B,GACb,IACI,OAn9DZ,UAA0B0K,UAAEA,EAAS8X,YAAEA,IACnC,OAAO8F,GAAmB5d,GACpB5Z,QAAQ8K,QAAQ8O,EAAU6d,aAAavtB,MAAMsiC,GAAUA,EACpD/nC,KAAKgoC,GAASA,EAAKrlC,OACnBxC,QAAQwC,GA17EF,cA07EWA,MACpB+vB,GAAgBvd,EAAW8X,GAAavX,eAAeiK,cA88D9CmoB,CAAiBP,GAAMhE,cAAc99B,KAAKgF,GAErD,MACI,OAAO6D,GAAU,IAAI3K,EAAWlB,cAGxCuU,YAAW,IACP,SAAeC,GACX/b,EAAO4G,KAAMmV,IAIrBgxB,kBAAkBnO,GACP9xB,GAAI2H,MACP5E,GAAO/C,GAAIuL,UAAWumB,GACtBA,IAER7G,IAAAA,GACAiV,MAAO,SAAUC,GACb,OAAO,WACH,IACI,IAAI7pC,EAAK+6B,GAAc8O,EAAYtoC,MAAMiC,KAAMD,YAC/C,OAAKvD,GAAyB,mBAAZA,EAAGmH,KAEdnH,EADI6J,GAAa9B,QAAQ/H,GAGpC,MAAOwM,GACH,OAAOwD,GAAUxD,MAI7Bs9B,MAAO,SAAUD,EAAa5qC,EAAMmI,GAChC,IACI,IAAIpH,EAAK+6B,GAAc8O,EAAYtoC,MAAM6F,EAAMnI,GAAQ,KACvD,OAAKe,GAAyB,mBAAZA,EAAGmH,KAEdnH,EADI6J,GAAa9B,QAAQ/H,GAGpC,MAAOwM,GACH,OAAOwD,GAAUxD,KAGzBu9B,mBAAoB,CAChB9rC,IAAK,IAAMyL,GAAI2H,OAAS,MAE5BmY,QAAS,SAAUwgB,EAAmBC,GAClC,MAAM7+B,EAAUvB,GAAa9B,QAAqC,mBAAtBiiC,EACxCf,GAAMU,kBAAkBK,GACxBA,GACCt8B,QAAQu8B,GAAmB,KAChC,OAAOvgC,GAAI2H,MACP3H,GAAI2H,MAAMmY,QAAQpe,GAClBA,GAERnO,QAAS4M,GACTxC,MAAO,CACHpJ,IAAK,IAAMoJ,GACXnJ,IAAKE,IACDqJ,GAASrJ,KAGjBE,OAAQA,EACR1B,OAAQA,EACRa,MAAOA,EACP2B,SAAUA,EACVkc,OAAQA,GACR2N,GAAIlB,GACJkgB,UAAAA,GACAlR,uBAAAA,GACAj3B,aAAcA,EACda,aAAcA,EACdupC,aAn4KJ,SAAsBrtC,EAAKkD,GACA,iBAAZA,EACPY,EAAa9D,EAAKkD,OAASW,GACtB,WAAYX,GACjB,GAAG2B,IAAIlE,KAAKuC,GAAS,SAAUwW,GAC3B5V,EAAa9D,EAAK0Z,OAAI7V,OA+3K9BQ,aAAcA,EACdqB,UAAWA,EACXw6B,cAAeA,GACfvpB,IAAAA,GACAhL,KAAM9I,EACNyqC,SA19IW,EAAA,GA29IX5V,OAAQ,GACR1hB,YAAaA,GACb3N,SAAUA,EACV+/B,aAAc2C,GACdjtB,MAAAA,GACAyvB,OAl+IkB,QAm+IlBza,QAn+IkB,QAm+IKluB,MAAM,KACxBC,KAAIwkB,GAAKllB,SAASklB,KAClB/gB,QAAO,CAAC0G,EAAGyS,EAAGre,IAAM4L,EAAKyS,EAAIwB,KAAKia,IAAI,GAAQ,EAAJ95B,OAEnDgpC,GAAMoB,OAASvf,GAAUme,GAAMhE,aAAatW,aAEf,oBAAlB2b,eAA6D,oBAArBhH,mBAC/Cvb,GA/iGqC,kBA+iGU6P,IAC3C,IAAKyR,GAAoB,CACrB,IAAI1hB,EACJA,EAAQ,IAAI4iB,YAjjGe,qBAijG6B,CACpDC,OAAQ5S,IAEZyR,IAAqB,EACrBiB,cAAc3iB,GACd0hB,IAAqB,MAG7B/F,iBAzjGmC,sBAyjGc,EAAGkH,OAAAA,MAC3CnB,IACDH,GAAiBsB,OAe7B,IAEIC,GAFApB,IAAqB,EAGrBqB,GAAW,OAsCf,SAASpyB,GAAIla,GACT,OAAO,IAAIsgB,GAAiB,CAAEpG,IAAKla,IAGvC,SAAS0gB,GAAO1gB,GACZ,OAAO,IAAIsgB,GAAiB,CAAEI,OAAQ1gB,IAG1C,SAAS8gB,GAAc5d,EAAG9B,GACtB,OAAO,IAAIkf,GAAiB,CAAEQ,cAAe,CAAC5d,EAAG9B,KA9CrB,oBAArBmrC,mBACPD,GAAW,KACPD,GAAK,IAAIE,iBAhlGsB,sBAilG/BF,GAAGG,UAAY9hB,GAAMA,EAAG+hB,MAAQ3B,GAAiBpgB,EAAG+hB,OAExDH,KACwB,mBAAbD,GAAGK,OACVL,GAAGK,QAEP/iB,GAxlGqC,kBAwlGWgjB,IACvC1B,IACDoB,GAAGO,YAAYD,OAKK,oBAArBzH,mBACPA,iBAAiB,YAAa3b,IAC1B,IAAK2M,GAAQ2W,gBAAkBtjB,EAAMujB,UAAW,CACxC7jC,IACAsK,QAAQtK,MAAM,sCAClBojC,IAAI54B,QACJ,IAAK,MAAMf,KAAM+B,GACb/B,EAAGe,MAAM,CAAEC,iBAAiB,QAIxCwxB,iBAAiB,YAAa3b,KACrB2M,GAAQ2W,gBAAkBtjB,EAAMujB,YAC7B7jC,IACAsK,QAAQtK,MAAM,sCAClBqjC,KACAxB,GAAiB,CAAEj7B,IAAK,IAAImnB,IAAUxnB,EAAAA,EAAU,CAAC,YAiB7D/D,GAAaZ,gBAxwKb,SAAkBkiC,EAAU5mC,GACxB,IAAK4mC,GAAYA,aAAoB/mC,GAAc+mC,aAAoBvlC,WAAaulC,aAAoBzlC,cAAgBylC,EAAS9mC,OAAS0B,EAAaolC,EAAS9mC,MAC5J,OAAO8mC,EACX,IAAInrC,EAAK,IAAI+F,EAAaolC,EAAS9mC,MAAME,GAAW4mC,EAAS5mC,QAAS4mC,GAMtE,MALI,UAAWA,GACXttC,EAAQmC,EAAI,QAAS,CAAE/B,IAAK,WACpB,OAAOuF,KAAKgC,MAAM6oB,SAGvBruB,GAgwKXyH,GAASJ,WAEAitB,YAAkB/gB,aAAQkL,oBAAeC,uBAAkB0W,eAAU9c,UAAK9E,UAAK8gB,cAAoB2T,gBAAWnS,kBAAaG,oBAAenX,aAAQI"} \ No newline at end of file diff --git a/src/dexie/dist/modern/dexie.mjs b/src/dexie/dist/modern/dexie.mjs deleted file mode 100644 index 75744312a..000000000 --- a/src/dexie/dist/modern/dexie.mjs +++ /dev/null @@ -1,5768 +0,0 @@ -/* - * Dexie.js - a minimalistic wrapper for IndexedDB - * =============================================== - * - * By David Fahlander, david.fahlander@gmail.com - * - * Version 4.0.7, Sun May 26 2024 - * - * https://dexie.org - * - * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/ - */ - -const _global = typeof globalThis !== 'undefined' ? globalThis : - typeof self !== 'undefined' ? self : - typeof window !== 'undefined' ? window : - global; - -const keys = Object.keys; -const isArray = Array.isArray; -if (typeof Promise !== 'undefined' && !_global.Promise) { - _global.Promise = Promise; -} -function extend(obj, extension) { - if (typeof extension !== 'object') - return obj; - keys(extension).forEach(function (key) { - obj[key] = extension[key]; - }); - return obj; -} -const getProto = Object.getPrototypeOf; -const _hasOwn = {}.hasOwnProperty; -function hasOwn(obj, prop) { - return _hasOwn.call(obj, prop); -} -function props(proto, extension) { - if (typeof extension === 'function') - extension = extension(getProto(proto)); - (typeof Reflect === "undefined" ? keys : Reflect.ownKeys)(extension).forEach(key => { - setProp(proto, key, extension[key]); - }); -} -const defineProperty = Object.defineProperty; -function setProp(obj, prop, functionOrGetSet, options) { - defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, "get") && typeof functionOrGetSet.get === 'function' ? - { get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true } : - { value: functionOrGetSet, configurable: true, writable: true }, options)); -} -function derive(Child) { - return { - from: function (Parent) { - Child.prototype = Object.create(Parent.prototype); - setProp(Child.prototype, "constructor", Child); - return { - extend: props.bind(null, Child.prototype) - }; - } - }; -} -const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; -function getPropertyDescriptor(obj, prop) { - const pd = getOwnPropertyDescriptor(obj, prop); - let proto; - return pd || (proto = getProto(obj)) && getPropertyDescriptor(proto, prop); -} -const _slice = [].slice; -function slice(args, start, end) { - return _slice.call(args, start, end); -} -function override(origFunc, overridedFactory) { - return overridedFactory(origFunc); -} -function assert(b) { - if (!b) - throw new Error("Assertion Failed"); -} -function asap$1(fn) { - if (_global.setImmediate) - setImmediate(fn); - else - setTimeout(fn, 0); -} -function arrayToObject(array, extractor) { - return array.reduce((result, item, i) => { - var nameAndValue = extractor(item, i); - if (nameAndValue) - result[nameAndValue[0]] = nameAndValue[1]; - return result; - }, {}); -} -function getByKeyPath(obj, keyPath) { - if (typeof keyPath === 'string' && hasOwn(obj, keyPath)) - return obj[keyPath]; - if (!keyPath) - return obj; - if (typeof keyPath !== 'string') { - var rv = []; - for (var i = 0, l = keyPath.length; i < l; ++i) { - var val = getByKeyPath(obj, keyPath[i]); - rv.push(val); - } - return rv; - } - var period = keyPath.indexOf('.'); - if (period !== -1) { - var innerObj = obj[keyPath.substr(0, period)]; - return innerObj == null ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1)); - } - return undefined; -} -function setByKeyPath(obj, keyPath, value) { - if (!obj || keyPath === undefined) - return; - if ('isFrozen' in Object && Object.isFrozen(obj)) - return; - if (typeof keyPath !== 'string' && 'length' in keyPath) { - assert(typeof value !== 'string' && 'length' in value); - for (var i = 0, l = keyPath.length; i < l; ++i) { - setByKeyPath(obj, keyPath[i], value[i]); - } - } - else { - var period = keyPath.indexOf('.'); - if (period !== -1) { - var currentKeyPath = keyPath.substr(0, period); - var remainingKeyPath = keyPath.substr(period + 1); - if (remainingKeyPath === "") - if (value === undefined) { - if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) - obj.splice(currentKeyPath, 1); - else - delete obj[currentKeyPath]; - } - else - obj[currentKeyPath] = value; - else { - var innerObj = obj[currentKeyPath]; - if (!innerObj || !hasOwn(obj, currentKeyPath)) - innerObj = (obj[currentKeyPath] = {}); - setByKeyPath(innerObj, remainingKeyPath, value); - } - } - else { - if (value === undefined) { - if (isArray(obj) && !isNaN(parseInt(keyPath))) - obj.splice(keyPath, 1); - else - delete obj[keyPath]; - } - else - obj[keyPath] = value; - } - } -} -function delByKeyPath(obj, keyPath) { - if (typeof keyPath === 'string') - setByKeyPath(obj, keyPath, undefined); - else if ('length' in keyPath) - [].map.call(keyPath, function (kp) { - setByKeyPath(obj, kp, undefined); - }); -} -function shallowClone(obj) { - var rv = {}; - for (var m in obj) { - if (hasOwn(obj, m)) - rv[m] = obj[m]; - } - return rv; -} -const concat = [].concat; -function flatten(a) { - return concat.apply([], a); -} -const intrinsicTypeNames = "BigUint64Array,BigInt64Array,Array,Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,FileSystemDirectoryHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey" - .split(',').concat(flatten([8, 16, 32, 64].map(num => ["Int", "Uint", "Float"].map(t => t + num + "Array")))).filter(t => _global[t]); -const intrinsicTypes = new Set(intrinsicTypeNames.map(t => _global[t])); -function cloneSimpleObjectTree(o) { - const rv = {}; - for (const k in o) - if (hasOwn(o, k)) { - const v = o[k]; - rv[k] = !v || typeof v !== 'object' || intrinsicTypes.has(v.constructor) ? v : cloneSimpleObjectTree(v); - } - return rv; -} -function objectIsEmpty(o) { - for (const k in o) - if (hasOwn(o, k)) - return false; - return true; -} -let circularRefs = null; -function deepClone(any) { - circularRefs = new WeakMap(); - const rv = innerDeepClone(any); - circularRefs = null; - return rv; -} -function innerDeepClone(x) { - if (!x || typeof x !== 'object') - return x; - let rv = circularRefs.get(x); - if (rv) - return rv; - if (isArray(x)) { - rv = []; - circularRefs.set(x, rv); - for (var i = 0, l = x.length; i < l; ++i) { - rv.push(innerDeepClone(x[i])); - } - } - else if (intrinsicTypes.has(x.constructor)) { - rv = x; - } - else { - const proto = getProto(x); - rv = proto === Object.prototype ? {} : Object.create(proto); - circularRefs.set(x, rv); - for (var prop in x) { - if (hasOwn(x, prop)) { - rv[prop] = innerDeepClone(x[prop]); - } - } - } - return rv; -} -const { toString } = {}; -function toStringTag(o) { - return toString.call(o).slice(8, -1); -} -const iteratorSymbol = typeof Symbol !== 'undefined' ? - Symbol.iterator : - '@@iterator'; -const getIteratorOf = typeof iteratorSymbol === "symbol" ? function (x) { - var i; - return x != null && (i = x[iteratorSymbol]) && i.apply(x); -} : function () { return null; }; -function delArrayItem(a, x) { - const i = a.indexOf(x); - if (i >= 0) - a.splice(i, 1); - return i >= 0; -} -const NO_CHAR_ARRAY = {}; -function getArrayOf(arrayLike) { - var i, a, x, it; - if (arguments.length === 1) { - if (isArray(arrayLike)) - return arrayLike.slice(); - if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') - return [arrayLike]; - if ((it = getIteratorOf(arrayLike))) { - a = []; - while ((x = it.next()), !x.done) - a.push(x.value); - return a; - } - if (arrayLike == null) - return [arrayLike]; - i = arrayLike.length; - if (typeof i === 'number') { - a = new Array(i); - while (i--) - a[i] = arrayLike[i]; - return a; - } - return [arrayLike]; - } - i = arguments.length; - a = new Array(i); - while (i--) - a[i] = arguments[i]; - return a; -} -const isAsyncFunction = typeof Symbol !== 'undefined' - ? (fn) => fn[Symbol.toStringTag] === 'AsyncFunction' - : () => false; - -var dexieErrorNames = [ - 'Modify', - 'Bulk', - 'OpenFailed', - 'VersionChange', - 'Schema', - 'Upgrade', - 'InvalidTable', - 'MissingAPI', - 'NoSuchDatabase', - 'InvalidArgument', - 'SubTransaction', - 'Unsupported', - 'Internal', - 'DatabaseClosed', - 'PrematureCommit', - 'ForeignAwait' -]; -var idbDomErrorNames = [ - 'Unknown', - 'Constraint', - 'Data', - 'TransactionInactive', - 'ReadOnly', - 'Version', - 'NotFound', - 'InvalidState', - 'InvalidAccess', - 'Abort', - 'Timeout', - 'QuotaExceeded', - 'Syntax', - 'DataClone' -]; -var errorList = dexieErrorNames.concat(idbDomErrorNames); -var defaultTexts = { - VersionChanged: "Database version changed by other database connection", - DatabaseClosed: "Database has been closed", - Abort: "Transaction aborted", - TransactionInactive: "Transaction has already completed or failed", - MissingAPI: "IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb" -}; -function DexieError(name, msg) { - this.name = name; - this.message = msg; -} -derive(DexieError).from(Error).extend({ - toString: function () { return this.name + ": " + this.message; } -}); -function getMultiErrorMessage(msg, failures) { - return msg + ". Errors: " + Object.keys(failures) - .map(key => failures[key].toString()) - .filter((v, i, s) => s.indexOf(v) === i) - .join('\n'); -} -function ModifyError(msg, failures, successCount, failedKeys) { - this.failures = failures; - this.failedKeys = failedKeys; - this.successCount = successCount; - this.message = getMultiErrorMessage(msg, failures); -} -derive(ModifyError).from(DexieError); -function BulkError(msg, failures) { - this.name = "BulkError"; - this.failures = Object.keys(failures).map(pos => failures[pos]); - this.failuresByPos = failures; - this.message = getMultiErrorMessage(msg, this.failures); -} -derive(BulkError).from(DexieError); -var errnames = errorList.reduce((obj, name) => (obj[name] = name + "Error", obj), {}); -const BaseException = DexieError; -var exceptions = errorList.reduce((obj, name) => { - var fullName = name + "Error"; - function DexieError(msgOrInner, inner) { - this.name = fullName; - if (!msgOrInner) { - this.message = defaultTexts[name] || fullName; - this.inner = null; - } - else if (typeof msgOrInner === 'string') { - this.message = `${msgOrInner}${!inner ? '' : '\n ' + inner}`; - this.inner = inner || null; - } - else if (typeof msgOrInner === 'object') { - this.message = `${msgOrInner.name} ${msgOrInner.message}`; - this.inner = msgOrInner; - } - } - derive(DexieError).from(BaseException); - obj[name] = DexieError; - return obj; -}, {}); -exceptions.Syntax = SyntaxError; -exceptions.Type = TypeError; -exceptions.Range = RangeError; -var exceptionMap = idbDomErrorNames.reduce((obj, name) => { - obj[name + "Error"] = exceptions[name]; - return obj; -}, {}); -function mapError(domError, message) { - if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name]) - return domError; - var rv = new exceptionMap[domError.name](message || domError.message, domError); - if ("stack" in domError) { - setProp(rv, "stack", { get: function () { - return this.inner.stack; - } }); - } - return rv; -} -var fullNameExceptions = errorList.reduce((obj, name) => { - if (["Syntax", "Type", "Range"].indexOf(name) === -1) - obj[name + "Error"] = exceptions[name]; - return obj; -}, {}); -fullNameExceptions.ModifyError = ModifyError; -fullNameExceptions.DexieError = DexieError; -fullNameExceptions.BulkError = BulkError; - -function nop() { } -function mirror(val) { return val; } -function pureFunctionChain(f1, f2) { - if (f1 == null || f1 === mirror) - return f2; - return function (val) { - return f2(f1(val)); - }; -} -function callBoth(on1, on2) { - return function () { - on1.apply(this, arguments); - on2.apply(this, arguments); - }; -} -function hookCreatingChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - var res = f1.apply(this, arguments); - if (res !== undefined) - arguments[0] = res; - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = null; - this.onerror = null; - var res2 = f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - return res2 !== undefined ? res2 : res; - }; -} -function hookDeletingChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - f1.apply(this, arguments); - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = this.onerror = null; - f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - }; -} -function hookUpdatingChain(f1, f2) { - if (f1 === nop) - return f2; - return function (modifications) { - var res = f1.apply(this, arguments); - extend(modifications, res); - var onsuccess = this.onsuccess, - onerror = this.onerror; - this.onsuccess = null; - this.onerror = null; - var res2 = f2.apply(this, arguments); - if (onsuccess) - this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; - if (onerror) - this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; - return res === undefined ? - (res2 === undefined ? undefined : res2) : - (extend(res, res2)); - }; -} -function reverseStoppableEventChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - if (f2.apply(this, arguments) === false) - return false; - return f1.apply(this, arguments); - }; -} -function promisableChain(f1, f2) { - if (f1 === nop) - return f2; - return function () { - var res = f1.apply(this, arguments); - if (res && typeof res.then === 'function') { - var thiz = this, i = arguments.length, args = new Array(i); - while (i--) - args[i] = arguments[i]; - return res.then(function () { - return f2.apply(thiz, args); - }); - } - return f2.apply(this, arguments); - }; -} - -var debug = typeof location !== 'undefined' && - /^(http|https):\/\/(localhost|127\.0\.0\.1)/.test(location.href); -function setDebug(value, filter) { - debug = value; -} - -var INTERNAL = {}; -const ZONE_ECHO_LIMIT = 100, [resolvedNativePromise, nativePromiseProto, resolvedGlobalPromise] = typeof Promise === 'undefined' ? - [] : - (() => { - let globalP = Promise.resolve(); - if (typeof crypto === 'undefined' || !crypto.subtle) - return [globalP, getProto(globalP), globalP]; - const nativeP = crypto.subtle.digest("SHA-512", new Uint8Array([0])); - return [ - nativeP, - getProto(nativeP), - globalP - ]; - })(), nativePromiseThen = nativePromiseProto && nativePromiseProto.then; -const NativePromise = resolvedNativePromise && resolvedNativePromise.constructor; -const patchGlobalPromise = !!resolvedGlobalPromise; -function schedulePhysicalTick() { - queueMicrotask(physicalTick); -} -var asap = function (callback, args) { - microtickQueue.push([callback, args]); - if (needsNewPhysicalTick) { - schedulePhysicalTick(); - needsNewPhysicalTick = false; - } -}; -var isOutsideMicroTick = true, -needsNewPhysicalTick = true, -unhandledErrors = [], -rejectingErrors = [], -rejectionMapper = mirror; -var globalPSD = { - id: 'global', - global: true, - ref: 0, - unhandleds: [], - onunhandled: nop, - pgp: false, - env: {}, - finalize: nop -}; -var PSD = globalPSD; -var microtickQueue = []; -var numScheduledCalls = 0; -var tickFinalizers = []; -function DexiePromise(fn) { - if (typeof this !== 'object') - throw new TypeError('Promises must be constructed via new'); - this._listeners = []; - this._lib = false; - var psd = (this._PSD = PSD); - if (typeof fn !== 'function') { - if (fn !== INTERNAL) - throw new TypeError('Not a function'); - this._state = arguments[1]; - this._value = arguments[2]; - if (this._state === false) - handleRejection(this, this._value); - return; - } - this._state = null; - this._value = null; - ++psd.ref; - executePromiseTask(this, fn); -} -const thenProp = { - get: function () { - var psd = PSD, microTaskId = totalEchoes; - function then(onFulfilled, onRejected) { - var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes); - const cleanup = possibleAwait && !decrementExpectedAwaits(); - var rv = new DexiePromise((resolve, reject) => { - propagateToListener(this, new Listener(nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup), nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup), resolve, reject, psd)); - }); - if (this._consoleTask) - rv._consoleTask = this._consoleTask; - return rv; - } - then.prototype = INTERNAL; - return then; - }, - set: function (value) { - setProp(this, 'then', value && value.prototype === INTERNAL ? - thenProp : - { - get: function () { - return value; - }, - set: thenProp.set - }); - } -}; -props(DexiePromise.prototype, { - then: thenProp, - _then: function (onFulfilled, onRejected) { - propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); - }, - catch: function (onRejected) { - if (arguments.length === 1) - return this.then(null, onRejected); - var type = arguments[0], handler = arguments[1]; - return typeof type === 'function' ? this.then(null, err => - err instanceof type ? handler(err) : PromiseReject(err)) - : this.then(null, err => - err && err.name === type ? handler(err) : PromiseReject(err)); - }, - finally: function (onFinally) { - return this.then(value => { - return DexiePromise.resolve(onFinally()).then(() => value); - }, err => { - return DexiePromise.resolve(onFinally()).then(() => PromiseReject(err)); - }); - }, - timeout: function (ms, msg) { - return ms < Infinity ? - new DexiePromise((resolve, reject) => { - var handle = setTimeout(() => reject(new exceptions.Timeout(msg)), ms); - this.then(resolve, reject).finally(clearTimeout.bind(null, handle)); - }) : this; - } -}); -if (typeof Symbol !== 'undefined' && Symbol.toStringTag) - setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise'); -globalPSD.env = snapShot(); -function Listener(onFulfilled, onRejected, resolve, reject, zone) { - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; - this.onRejected = typeof onRejected === 'function' ? onRejected : null; - this.resolve = resolve; - this.reject = reject; - this.psd = zone; -} -props(DexiePromise, { - all: function () { - var values = getArrayOf.apply(null, arguments) - .map(onPossibleParallellAsync); - return new DexiePromise(function (resolve, reject) { - if (values.length === 0) - resolve([]); - var remaining = values.length; - values.forEach((a, i) => DexiePromise.resolve(a).then(x => { - values[i] = x; - if (!--remaining) - resolve(values); - }, reject)); - }); - }, - resolve: value => { - if (value instanceof DexiePromise) - return value; - if (value && typeof value.then === 'function') - return new DexiePromise((resolve, reject) => { - value.then(resolve, reject); - }); - var rv = new DexiePromise(INTERNAL, true, value); - return rv; - }, - reject: PromiseReject, - race: function () { - var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise((resolve, reject) => { - values.map(value => DexiePromise.resolve(value).then(resolve, reject)); - }); - }, - PSD: { - get: () => PSD, - set: value => PSD = value - }, - totalEchoes: { get: () => totalEchoes }, - newPSD: newScope, - usePSD: usePSD, - scheduler: { - get: () => asap, - set: value => { asap = value; } - }, - rejectionMapper: { - get: () => rejectionMapper, - set: value => { rejectionMapper = value; } - }, - follow: (fn, zoneProps) => { - return new DexiePromise((resolve, reject) => { - return newScope((resolve, reject) => { - var psd = PSD; - psd.unhandleds = []; - psd.onunhandled = reject; - psd.finalize = callBoth(function () { - run_at_end_of_this_or_next_physical_tick(() => { - this.unhandleds.length === 0 ? resolve() : reject(this.unhandleds[0]); - }); - }, psd.finalize); - fn(); - }, zoneProps, resolve, reject); - }); - } -}); -if (NativePromise) { - if (NativePromise.allSettled) - setProp(DexiePromise, "allSettled", function () { - const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise(resolve => { - if (possiblePromises.length === 0) - resolve([]); - let remaining = possiblePromises.length; - const results = new Array(remaining); - possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(value => results[i] = { status: "fulfilled", value }, reason => results[i] = { status: "rejected", reason }) - .then(() => --remaining || resolve(results))); - }); - }); - if (NativePromise.any && typeof AggregateError !== 'undefined') - setProp(DexiePromise, "any", function () { - const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); - return new DexiePromise((resolve, reject) => { - if (possiblePromises.length === 0) - reject(new AggregateError([])); - let remaining = possiblePromises.length; - const failures = new Array(remaining); - possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(value => resolve(value), failure => { - failures[i] = failure; - if (!--remaining) - reject(new AggregateError(failures)); - })); - }); - }); -} -function executePromiseTask(promise, fn) { - try { - fn(value => { - if (promise._state !== null) - return; - if (value === promise) - throw new TypeError('A promise cannot be resolved with itself.'); - var shouldExecuteTick = promise._lib && beginMicroTickScope(); - if (value && typeof value.then === 'function') { - executePromiseTask(promise, (resolve, reject) => { - value instanceof DexiePromise ? - value._then(resolve, reject) : - value.then(resolve, reject); - }); - } - else { - promise._state = true; - promise._value = value; - propagateAllListeners(promise); - } - if (shouldExecuteTick) - endMicroTickScope(); - }, handleRejection.bind(null, promise)); - } - catch (ex) { - handleRejection(promise, ex); - } -} -function handleRejection(promise, reason) { - rejectingErrors.push(reason); - if (promise._state !== null) - return; - var shouldExecuteTick = promise._lib && beginMicroTickScope(); - reason = rejectionMapper(reason); - promise._state = false; - promise._value = reason; - addPossiblyUnhandledError(promise); - propagateAllListeners(promise); - if (shouldExecuteTick) - endMicroTickScope(); -} -function propagateAllListeners(promise) { - var listeners = promise._listeners; - promise._listeners = []; - for (var i = 0, len = listeners.length; i < len; ++i) { - propagateToListener(promise, listeners[i]); - } - var psd = promise._PSD; - --psd.ref || psd.finalize(); - if (numScheduledCalls === 0) { - ++numScheduledCalls; - asap(() => { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - }, []); - } -} -function propagateToListener(promise, listener) { - if (promise._state === null) { - promise._listeners.push(listener); - return; - } - var cb = promise._state ? listener.onFulfilled : listener.onRejected; - if (cb === null) { - return (promise._state ? listener.resolve : listener.reject)(promise._value); - } - ++listener.psd.ref; - ++numScheduledCalls; - asap(callListener, [cb, promise, listener]); -} -function callListener(cb, promise, listener) { - try { - var ret, value = promise._value; - if (!promise._state && rejectingErrors.length) - rejectingErrors = []; - ret = debug && promise._consoleTask ? promise._consoleTask.run(() => cb(value)) : cb(value); - if (!promise._state && rejectingErrors.indexOf(value) === -1) { - markErrorAsHandled(promise); - } - listener.resolve(ret); - } - catch (e) { - listener.reject(e); - } - finally { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - --listener.psd.ref || listener.psd.finalize(); - } -} -function physicalTick() { - usePSD(globalPSD, () => { - beginMicroTickScope() && endMicroTickScope(); - }); -} -function beginMicroTickScope() { - var wasRootExec = isOutsideMicroTick; - isOutsideMicroTick = false; - needsNewPhysicalTick = false; - return wasRootExec; -} -function endMicroTickScope() { - var callbacks, i, l; - do { - while (microtickQueue.length > 0) { - callbacks = microtickQueue; - microtickQueue = []; - l = callbacks.length; - for (i = 0; i < l; ++i) { - var item = callbacks[i]; - item[0].apply(null, item[1]); - } - } - } while (microtickQueue.length > 0); - isOutsideMicroTick = true; - needsNewPhysicalTick = true; -} -function finalizePhysicalTick() { - var unhandledErrs = unhandledErrors; - unhandledErrors = []; - unhandledErrs.forEach(p => { - p._PSD.onunhandled.call(null, p._value, p); - }); - var finalizers = tickFinalizers.slice(0); - var i = finalizers.length; - while (i) - finalizers[--i](); -} -function run_at_end_of_this_or_next_physical_tick(fn) { - function finalizer() { - fn(); - tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1); - } - tickFinalizers.push(finalizer); - ++numScheduledCalls; - asap(() => { - if (--numScheduledCalls === 0) - finalizePhysicalTick(); - }, []); -} -function addPossiblyUnhandledError(promise) { - if (!unhandledErrors.some(p => p._value === promise._value)) - unhandledErrors.push(promise); -} -function markErrorAsHandled(promise) { - var i = unhandledErrors.length; - while (i) - if (unhandledErrors[--i]._value === promise._value) { - unhandledErrors.splice(i, 1); - return; - } -} -function PromiseReject(reason) { - return new DexiePromise(INTERNAL, false, reason); -} -function wrap(fn, errorCatcher) { - var psd = PSD; - return function () { - var wasRootExec = beginMicroTickScope(), outerScope = PSD; - try { - switchToZone(psd, true); - return fn.apply(this, arguments); - } - catch (e) { - errorCatcher && errorCatcher(e); - } - finally { - switchToZone(outerScope, false); - if (wasRootExec) - endMicroTickScope(); - } - }; -} -const task = { awaits: 0, echoes: 0, id: 0 }; -var taskCounter = 0; -var zoneStack = []; -var zoneEchoes = 0; -var totalEchoes = 0; -var zone_id_counter = 0; -function newScope(fn, props, a1, a2) { - var parent = PSD, psd = Object.create(parent); - psd.parent = parent; - psd.ref = 0; - psd.global = false; - psd.id = ++zone_id_counter; - globalPSD.env; - psd.env = patchGlobalPromise ? { - Promise: DexiePromise, - PromiseProp: { value: DexiePromise, configurable: true, writable: true }, - all: DexiePromise.all, - race: DexiePromise.race, - allSettled: DexiePromise.allSettled, - any: DexiePromise.any, - resolve: DexiePromise.resolve, - reject: DexiePromise.reject, - } : {}; - if (props) - extend(psd, props); - ++parent.ref; - psd.finalize = function () { - --this.parent.ref || this.parent.finalize(); - }; - var rv = usePSD(psd, fn, a1, a2); - if (psd.ref === 0) - psd.finalize(); - return rv; -} -function incrementExpectedAwaits() { - if (!task.id) - task.id = ++taskCounter; - ++task.awaits; - task.echoes += ZONE_ECHO_LIMIT; - return task.id; -} -function decrementExpectedAwaits() { - if (!task.awaits) - return false; - if (--task.awaits === 0) - task.id = 0; - task.echoes = task.awaits * ZONE_ECHO_LIMIT; - return true; -} -if (('' + nativePromiseThen).indexOf('[native code]') === -1) { - incrementExpectedAwaits = decrementExpectedAwaits = nop; -} -function onPossibleParallellAsync(possiblePromise) { - if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) { - incrementExpectedAwaits(); - return possiblePromise.then(x => { - decrementExpectedAwaits(); - return x; - }, e => { - decrementExpectedAwaits(); - return rejection(e); - }); - } - return possiblePromise; -} -function zoneEnterEcho(targetZone) { - ++totalEchoes; - if (!task.echoes || --task.echoes === 0) { - task.echoes = task.awaits = task.id = 0; - } - zoneStack.push(PSD); - switchToZone(targetZone, true); -} -function zoneLeaveEcho() { - var zone = zoneStack[zoneStack.length - 1]; - zoneStack.pop(); - switchToZone(zone, false); -} -function switchToZone(targetZone, bEnteringZone) { - var currentZone = PSD; - if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) { - queueMicrotask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho); - } - if (targetZone === PSD) - return; - PSD = targetZone; - if (currentZone === globalPSD) - globalPSD.env = snapShot(); - if (patchGlobalPromise) { - var GlobalPromise = globalPSD.env.Promise; - var targetEnv = targetZone.env; - if (currentZone.global || targetZone.global) { - Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp); - GlobalPromise.all = targetEnv.all; - GlobalPromise.race = targetEnv.race; - GlobalPromise.resolve = targetEnv.resolve; - GlobalPromise.reject = targetEnv.reject; - if (targetEnv.allSettled) - GlobalPromise.allSettled = targetEnv.allSettled; - if (targetEnv.any) - GlobalPromise.any = targetEnv.any; - } - } -} -function snapShot() { - var GlobalPromise = _global.Promise; - return patchGlobalPromise ? { - Promise: GlobalPromise, - PromiseProp: Object.getOwnPropertyDescriptor(_global, "Promise"), - all: GlobalPromise.all, - race: GlobalPromise.race, - allSettled: GlobalPromise.allSettled, - any: GlobalPromise.any, - resolve: GlobalPromise.resolve, - reject: GlobalPromise.reject, - } : {}; -} -function usePSD(psd, fn, a1, a2, a3) { - var outerScope = PSD; - try { - switchToZone(psd, true); - return fn(a1, a2, a3); - } - finally { - switchToZone(outerScope, false); - } -} -function nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) { - return typeof fn !== 'function' ? fn : function () { - var outerZone = PSD; - if (possibleAwait) - incrementExpectedAwaits(); - switchToZone(zone, true); - try { - return fn.apply(this, arguments); - } - finally { - switchToZone(outerZone, false); - if (cleanup) - queueMicrotask(decrementExpectedAwaits); - } - }; -} -function execInGlobalContext(cb) { - if (Promise === NativePromise && task.echoes === 0) { - if (zoneEchoes === 0) { - cb(); - } - else { - enqueueNativeMicroTask(cb); - } - } - else { - setTimeout(cb, 0); - } -} -var rejection = DexiePromise.reject; - -function tempTransaction(db, mode, storeNames, fn) { - if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) { - if (db._state.openComplete) { - return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError)); - } - if (!db._state.isBeingOpened) { - if (!db._state.autoOpen) - return rejection(new exceptions.DatabaseClosed()); - db.open().catch(nop); - } - return db._state.dbReadyPromise.then(() => tempTransaction(db, mode, storeNames, fn)); - } - else { - var trans = db._createTransaction(mode, storeNames, db._dbSchema); - try { - trans.create(); - db._state.PR1398_maxLoop = 3; - } - catch (ex) { - if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { - console.warn('Dexie: Need to reopen db'); - db.close({ disableAutoOpen: false }); - return db.open().then(() => tempTransaction(db, mode, storeNames, fn)); - } - return rejection(ex); - } - return trans._promise(mode, (resolve, reject) => { - return newScope(() => { - PSD.trans = trans; - return fn(resolve, reject, trans); - }); - }).then(result => { - if (mode === 'readwrite') - try { - trans.idbtrans.commit(); - } - catch { } - return mode === 'readonly' ? result : trans._completion.then(() => result); - }); - } -} - -const DEXIE_VERSION = '4.0.7'; -const maxString = String.fromCharCode(65535); -const minKey = -Infinity; -const INVALID_KEY_ARGUMENT = "Invalid key provided. Keys must be of type string, number, Date or Array."; -const STRING_EXPECTED = "String expected."; -const connections = []; -const DBNAMES_DB = '__dbnames'; -const READONLY = 'readonly'; -const READWRITE = 'readwrite'; - -function combine(filter1, filter2) { - return filter1 ? - filter2 ? - function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } : - filter1 : - filter2; -} - -const AnyRange = { - type: 3 , - lower: -Infinity, - lowerOpen: false, - upper: [[]], - upperOpen: false -}; - -function workaroundForUndefinedPrimKey(keyPath) { - return typeof keyPath === "string" && !/\./.test(keyPath) - ? (obj) => { - if (obj[keyPath] === undefined && (keyPath in obj)) { - obj = deepClone(obj); - delete obj[keyPath]; - } - return obj; - } - : (obj) => obj; -} - -function Entity() { - throw exceptions.Type(); -} - -function cmp(a, b) { - try { - const ta = type(a); - const tb = type(b); - if (ta !== tb) { - if (ta === 'Array') - return 1; - if (tb === 'Array') - return -1; - if (ta === 'binary') - return 1; - if (tb === 'binary') - return -1; - if (ta === 'string') - return 1; - if (tb === 'string') - return -1; - if (ta === 'Date') - return 1; - if (tb !== 'Date') - return NaN; - return -1; - } - switch (ta) { - case 'number': - case 'Date': - case 'string': - return a > b ? 1 : a < b ? -1 : 0; - case 'binary': { - return compareUint8Arrays(getUint8Array(a), getUint8Array(b)); - } - case 'Array': - return compareArrays(a, b); - } - } - catch { } - return NaN; -} -function compareArrays(a, b) { - const al = a.length; - const bl = b.length; - const l = al < bl ? al : bl; - for (let i = 0; i < l; ++i) { - const res = cmp(a[i], b[i]); - if (res !== 0) - return res; - } - return al === bl ? 0 : al < bl ? -1 : 1; -} -function compareUint8Arrays(a, b) { - const al = a.length; - const bl = b.length; - const l = al < bl ? al : bl; - for (let i = 0; i < l; ++i) { - if (a[i] !== b[i]) - return a[i] < b[i] ? -1 : 1; - } - return al === bl ? 0 : al < bl ? -1 : 1; -} -function type(x) { - const t = typeof x; - if (t !== 'object') - return t; - if (ArrayBuffer.isView(x)) - return 'binary'; - const tsTag = toStringTag(x); - return tsTag === 'ArrayBuffer' ? 'binary' : tsTag; -} -function getUint8Array(a) { - if (a instanceof Uint8Array) - return a; - if (ArrayBuffer.isView(a)) - return new Uint8Array(a.buffer, a.byteOffset, a.byteLength); - return new Uint8Array(a); -} - -class Table { - _trans(mode, fn, writeLocked) { - const trans = this._tx || PSD.trans; - const tableName = this.name; - const task = debug && typeof console !== 'undefined' && console.createTask && console.createTask(`Dexie: ${mode === 'readonly' ? 'read' : 'write'} ${this.name}`); - function checkTableInTransaction(resolve, reject, trans) { - if (!trans.schema[tableName]) - throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); - return fn(trans.idbtrans, trans); - } - const wasRootExec = beginMicroTickScope(); - try { - let p = trans && trans.db._novip === this.db._novip ? - trans === PSD.trans ? - trans._promise(mode, checkTableInTransaction, writeLocked) : - newScope(() => trans._promise(mode, checkTableInTransaction, writeLocked), { trans: trans, transless: PSD.transless || PSD }) : - tempTransaction(this.db, mode, [this.name], checkTableInTransaction); - if (task) { - p._consoleTask = task; - p = p.catch(err => { - console.trace(err); - return rejection(err); - }); - } - return p; - } - finally { - if (wasRootExec) - endMicroTickScope(); - } - } - get(keyOrCrit, cb) { - if (keyOrCrit && keyOrCrit.constructor === Object) - return this.where(keyOrCrit).first(cb); - if (keyOrCrit == null) - return rejection(new exceptions.Type(`Invalid argument to Table.get()`)); - return this._trans('readonly', (trans) => { - return this.core.get({ trans, key: keyOrCrit }) - .then(res => this.hook.reading.fire(res)); - }).then(cb); - } - where(indexOrCrit) { - if (typeof indexOrCrit === 'string') - return new this.db.WhereClause(this, indexOrCrit); - if (isArray(indexOrCrit)) - return new this.db.WhereClause(this, `[${indexOrCrit.join('+')}]`); - const keyPaths = keys(indexOrCrit); - if (keyPaths.length === 1) - return this - .where(keyPaths[0]) - .equals(indexOrCrit[keyPaths[0]]); - const compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(ix => { - if (ix.compound && - keyPaths.every(keyPath => ix.keyPath.indexOf(keyPath) >= 0)) { - for (let i = 0; i < keyPaths.length; ++i) { - if (keyPaths.indexOf(ix.keyPath[i]) === -1) - return false; - } - return true; - } - return false; - }).sort((a, b) => a.keyPath.length - b.keyPath.length)[0]; - if (compoundIndex && this.db._maxKey !== maxString) { - const keyPathsInValidOrder = compoundIndex.keyPath.slice(0, keyPaths.length); - return this - .where(keyPathsInValidOrder) - .equals(keyPathsInValidOrder.map(kp => indexOrCrit[kp])); - } - if (!compoundIndex && debug) - console.warn(`The query ${JSON.stringify(indexOrCrit)} on ${this.name} would benefit from a ` + - `compound index [${keyPaths.join('+')}]`); - const { idxByName } = this.schema; - const idb = this.db._deps.indexedDB; - function equals(a, b) { - return idb.cmp(a, b) === 0; - } - const [idx, filterFunction] = keyPaths.reduce(([prevIndex, prevFilterFn], keyPath) => { - const index = idxByName[keyPath]; - const value = indexOrCrit[keyPath]; - return [ - prevIndex || index, - prevIndex || !index ? - combine(prevFilterFn, index && index.multi ? - x => { - const prop = getByKeyPath(x, keyPath); - return isArray(prop) && prop.some(item => equals(value, item)); - } : x => equals(value, getByKeyPath(x, keyPath))) - : prevFilterFn - ]; - }, [null, null]); - return idx ? - this.where(idx.name).equals(indexOrCrit[idx.keyPath]) - .filter(filterFunction) : - compoundIndex ? - this.filter(filterFunction) : - this.where(keyPaths).equals(''); - } - filter(filterFunction) { - return this.toCollection().and(filterFunction); - } - count(thenShortcut) { - return this.toCollection().count(thenShortcut); - } - offset(offset) { - return this.toCollection().offset(offset); - } - limit(numRows) { - return this.toCollection().limit(numRows); - } - each(callback) { - return this.toCollection().each(callback); - } - toArray(thenShortcut) { - return this.toCollection().toArray(thenShortcut); - } - toCollection() { - return new this.db.Collection(new this.db.WhereClause(this)); - } - orderBy(index) { - return new this.db.Collection(new this.db.WhereClause(this, isArray(index) ? - `[${index.join('+')}]` : - index)); - } - reverse() { - return this.toCollection().reverse(); - } - mapToClass(constructor) { - const { db, name: tableName } = this; - this.schema.mappedClass = constructor; - if (constructor.prototype instanceof Entity) { - constructor = class extends constructor { - get db() { return db; } - table() { return tableName; } - }; - } - const inheritedProps = new Set(); - for (let proto = constructor.prototype; proto; proto = getProto(proto)) { - Object.getOwnPropertyNames(proto).forEach(propName => inheritedProps.add(propName)); - } - const readHook = (obj) => { - if (!obj) - return obj; - const res = Object.create(constructor.prototype); - for (let m in obj) - if (!inheritedProps.has(m)) - try { - res[m] = obj[m]; - } - catch (_) { } - return res; - }; - if (this.schema.readHook) { - this.hook.reading.unsubscribe(this.schema.readHook); - } - this.schema.readHook = readHook; - this.hook("reading", readHook); - return constructor; - } - defineClass() { - function Class(content) { - extend(this, content); - } - return this.mapToClass(Class); - } - add(obj, key) { - const { auto, keyPath } = this.schema.primKey; - let objToAdd = obj; - if (keyPath && auto) { - objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); - } - return this._trans('readwrite', trans => { - return this.core.mutate({ trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd] }); - }).then(res => res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult) - .then(lastResult => { - if (keyPath) { - try { - setByKeyPath(obj, keyPath, lastResult); - } - catch (_) { } - } - return lastResult; - }); - } - update(keyOrObject, modifications) { - if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) { - const key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath); - if (key === undefined) - return rejection(new exceptions.InvalidArgument("Given object does not contain its primary key")); - return this.where(":id").equals(key).modify(modifications); - } - else { - return this.where(":id").equals(keyOrObject).modify(modifications); - } - } - put(obj, key) { - const { auto, keyPath } = this.schema.primKey; - let objToAdd = obj; - if (keyPath && auto) { - objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); - } - return this._trans('readwrite', trans => this.core.mutate({ trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null })) - .then(res => res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult) - .then(lastResult => { - if (keyPath) { - try { - setByKeyPath(obj, keyPath, lastResult); - } - catch (_) { } - } - return lastResult; - }); - } - delete(key) { - return this._trans('readwrite', trans => this.core.mutate({ trans, type: 'delete', keys: [key] })) - .then(res => res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined); - } - clear() { - return this._trans('readwrite', trans => this.core.mutate({ trans, type: 'deleteRange', range: AnyRange })) - .then(res => res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined); - } - bulkGet(keys) { - return this._trans('readonly', trans => { - return this.core.getMany({ - keys, - trans - }).then(result => result.map(res => this.hook.reading.fire(res))); - }); - } - bulkAdd(objects, keysOrOptions, options) { - const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; - options = options || (keys ? undefined : keysOrOptions); - const wantResults = options ? options.allKeys : undefined; - return this._trans('readwrite', trans => { - const { auto, keyPath } = this.schema.primKey; - if (keyPath && keys) - throw new exceptions.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys"); - if (keys && keys.length !== objects.length) - throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); - const numObjects = objects.length; - let objectsToAdd = keyPath && auto ? - objects.map(workaroundForUndefinedPrimKey(keyPath)) : - objects; - return this.core.mutate({ trans, type: 'add', keys: keys, values: objectsToAdd, wantResults }) - .then(({ numFailures, results, lastResult, failures }) => { - const result = wantResults ? results : lastResult; - if (numFailures === 0) - return result; - throw new BulkError(`${this.name}.bulkAdd(): ${numFailures} of ${numObjects} operations failed`, failures); - }); - }); - } - bulkPut(objects, keysOrOptions, options) { - const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; - options = options || (keys ? undefined : keysOrOptions); - const wantResults = options ? options.allKeys : undefined; - return this._trans('readwrite', trans => { - const { auto, keyPath } = this.schema.primKey; - if (keyPath && keys) - throw new exceptions.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys"); - if (keys && keys.length !== objects.length) - throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); - const numObjects = objects.length; - let objectsToPut = keyPath && auto ? - objects.map(workaroundForUndefinedPrimKey(keyPath)) : - objects; - return this.core.mutate({ trans, type: 'put', keys: keys, values: objectsToPut, wantResults }) - .then(({ numFailures, results, lastResult, failures }) => { - const result = wantResults ? results : lastResult; - if (numFailures === 0) - return result; - throw new BulkError(`${this.name}.bulkPut(): ${numFailures} of ${numObjects} operations failed`, failures); - }); - }); - } - bulkUpdate(keysAndChanges) { - const coreTable = this.core; - const keys = keysAndChanges.map((entry) => entry.key); - const changeSpecs = keysAndChanges.map((entry) => entry.changes); - const offsetMap = []; - return this._trans('readwrite', (trans) => { - return coreTable.getMany({ trans, keys, cache: 'clone' }).then((objs) => { - const resultKeys = []; - const resultObjs = []; - keysAndChanges.forEach(({ key, changes }, idx) => { - const obj = objs[idx]; - if (obj) { - for (const keyPath of Object.keys(changes)) { - const value = changes[keyPath]; - if (keyPath === this.schema.primKey.keyPath) { - if (cmp(value, key) !== 0) { - throw new exceptions.Constraint(`Cannot update primary key in bulkUpdate()`); - } - } - else { - setByKeyPath(obj, keyPath, value); - } - } - offsetMap.push(idx); - resultKeys.push(key); - resultObjs.push(obj); - } - }); - const numEntries = resultKeys.length; - return coreTable - .mutate({ - trans, - type: 'put', - keys: resultKeys, - values: resultObjs, - updates: { - keys, - changeSpecs - } - }) - .then(({ numFailures, failures }) => { - if (numFailures === 0) - return numEntries; - for (const offset of Object.keys(failures)) { - const mappedOffset = offsetMap[Number(offset)]; - if (mappedOffset != null) { - const failure = failures[offset]; - delete failures[offset]; - failures[mappedOffset] = failure; - } - } - throw new BulkError(`${this.name}.bulkUpdate(): ${numFailures} of ${numEntries} operations failed`, failures); - }); - }); - }); - } - bulkDelete(keys) { - const numKeys = keys.length; - return this._trans('readwrite', trans => { - return this.core.mutate({ trans, type: 'delete', keys: keys }); - }).then(({ numFailures, lastResult, failures }) => { - if (numFailures === 0) - return lastResult; - throw new BulkError(`${this.name}.bulkDelete(): ${numFailures} of ${numKeys} operations failed`, failures); - }); - } -} - -function Events(ctx) { - var evs = {}; - var rv = function (eventName, subscriber) { - if (subscriber) { - var i = arguments.length, args = new Array(i - 1); - while (--i) - args[i - 1] = arguments[i]; - evs[eventName].subscribe.apply(null, args); - return ctx; - } - else if (typeof (eventName) === 'string') { - return evs[eventName]; - } - }; - rv.addEventType = add; - for (var i = 1, l = arguments.length; i < l; ++i) { - add(arguments[i]); - } - return rv; - function add(eventName, chainFunction, defaultFunction) { - if (typeof eventName === 'object') - return addConfiguredEvents(eventName); - if (!chainFunction) - chainFunction = reverseStoppableEventChain; - if (!defaultFunction) - defaultFunction = nop; - var context = { - subscribers: [], - fire: defaultFunction, - subscribe: function (cb) { - if (context.subscribers.indexOf(cb) === -1) { - context.subscribers.push(cb); - context.fire = chainFunction(context.fire, cb); - } - }, - unsubscribe: function (cb) { - context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; }); - context.fire = context.subscribers.reduce(chainFunction, defaultFunction); - } - }; - evs[eventName] = rv[eventName] = context; - return context; - } - function addConfiguredEvents(cfg) { - keys(cfg).forEach(function (eventName) { - var args = cfg[eventName]; - if (isArray(args)) { - add(eventName, cfg[eventName][0], cfg[eventName][1]); - } - else if (args === 'asap') { - var context = add(eventName, mirror, function fire() { - var i = arguments.length, args = new Array(i); - while (i--) - args[i] = arguments[i]; - context.subscribers.forEach(function (fn) { - asap$1(function fireEvent() { - fn.apply(null, args); - }); - }); - }); - } - else - throw new exceptions.InvalidArgument("Invalid event config"); - }); - } -} - -function makeClassConstructor(prototype, constructor) { - derive(constructor).from({ prototype }); - return constructor; -} - -function createTableConstructor(db) { - return makeClassConstructor(Table.prototype, function Table(name, tableSchema, trans) { - this.db = db; - this._tx = trans; - this.name = name; - this.schema = tableSchema; - this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, { - "creating": [hookCreatingChain, nop], - "reading": [pureFunctionChain, mirror], - "updating": [hookUpdatingChain, nop], - "deleting": [hookDeletingChain, nop] - }); - }); -} - -function isPlainKeyRange(ctx, ignoreLimitFilter) { - return !(ctx.filter || ctx.algorithm || ctx.or) && - (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter); -} -function addFilter(ctx, fn) { - ctx.filter = combine(ctx.filter, fn); -} -function addReplayFilter(ctx, factory, isLimitFilter) { - var curr = ctx.replayFilter; - ctx.replayFilter = curr ? () => combine(curr(), factory()) : factory; - ctx.justLimit = isLimitFilter && !curr; -} -function addMatchFilter(ctx, fn) { - ctx.isMatch = combine(ctx.isMatch, fn); -} -function getIndexOrStore(ctx, coreSchema) { - if (ctx.isPrimKey) - return coreSchema.primaryKey; - const index = coreSchema.getIndexByKeyPath(ctx.index); - if (!index) - throw new exceptions.Schema("KeyPath " + ctx.index + " on object store " + coreSchema.name + " is not indexed"); - return index; -} -function openCursor(ctx, coreTable, trans) { - const index = getIndexOrStore(ctx, coreTable.schema); - return coreTable.openCursor({ - trans, - values: !ctx.keysOnly, - reverse: ctx.dir === 'prev', - unique: !!ctx.unique, - query: { - index, - range: ctx.range - } - }); -} -function iter(ctx, fn, coreTrans, coreTable) { - const filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter; - if (!ctx.or) { - return iterate(openCursor(ctx, coreTable, coreTrans), combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper); - } - else { - const set = {}; - const union = (item, cursor, advance) => { - if (!filter || filter(cursor, advance, result => cursor.stop(result), err => cursor.fail(err))) { - var primaryKey = cursor.primaryKey; - var key = '' + primaryKey; - if (key === '[object ArrayBuffer]') - key = '' + new Uint8Array(primaryKey); - if (!hasOwn(set, key)) { - set[key] = true; - fn(item, cursor, advance); - } - } - }; - return Promise.all([ - ctx.or._iterate(union, coreTrans), - iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper) - ]); - } -} -function iterate(cursorPromise, filter, fn, valueMapper) { - var mappedFn = valueMapper ? (x, c, a) => fn(valueMapper(x), c, a) : fn; - var wrappedFn = wrap(mappedFn); - return cursorPromise.then(cursor => { - if (cursor) { - return cursor.start(() => { - var c = () => cursor.continue(); - if (!filter || filter(cursor, advancer => c = advancer, val => { cursor.stop(val); c = nop; }, e => { cursor.fail(e); c = nop; })) - wrappedFn(cursor.value, cursor, advancer => c = advancer); - c(); - }); - } - }); -} - -const PropModSymbol = Symbol(); -class PropModification { - execute(value) { - if (this.add !== undefined) { - const term = this.add; - if (isArray(term)) { - return [...(isArray(value) ? value : []), ...term].sort(); - } - if (typeof term === 'number') - return (Number(value) || 0) + term; - if (typeof term === 'bigint') { - try { - return BigInt(value) + term; - } - catch { - return BigInt(0) + term; - } - } - throw new TypeError(`Invalid term ${term}`); - } - if (this.remove !== undefined) { - const subtrahend = this.remove; - if (isArray(subtrahend)) { - return isArray(value) ? value.filter(item => !subtrahend.includes(item)).sort() : []; - } - if (typeof subtrahend === 'number') - return Number(value) - subtrahend; - if (typeof subtrahend === 'bigint') { - try { - return BigInt(value) - subtrahend; - } - catch { - return BigInt(0) - subtrahend; - } - } - throw new TypeError(`Invalid subtrahend ${subtrahend}`); - } - const prefixToReplace = this.replacePrefix?.[0]; - if (prefixToReplace && typeof value === 'string' && value.startsWith(prefixToReplace)) { - return this.replacePrefix[1] + value.substring(prefixToReplace.length); - } - return value; - } - constructor(spec) { - Object.assign(this, spec); - } -} - -class Collection { - _read(fn, cb) { - var ctx = this._ctx; - return ctx.error ? - ctx.table._trans(null, rejection.bind(null, ctx.error)) : - ctx.table._trans('readonly', fn).then(cb); - } - _write(fn) { - var ctx = this._ctx; - return ctx.error ? - ctx.table._trans(null, rejection.bind(null, ctx.error)) : - ctx.table._trans('readwrite', fn, "locked"); - } - _addAlgorithm(fn) { - var ctx = this._ctx; - ctx.algorithm = combine(ctx.algorithm, fn); - } - _iterate(fn, coreTrans) { - return iter(this._ctx, fn, coreTrans, this._ctx.table.core); - } - clone(props) { - var rv = Object.create(this.constructor.prototype), ctx = Object.create(this._ctx); - if (props) - extend(ctx, props); - rv._ctx = ctx; - return rv; - } - raw() { - this._ctx.valueMapper = null; - return this; - } - each(fn) { - var ctx = this._ctx; - return this._read(trans => iter(ctx, fn, trans, ctx.table.core)); - } - count(cb) { - return this._read(trans => { - const ctx = this._ctx; - const coreTable = ctx.table.core; - if (isPlainKeyRange(ctx, true)) { - return coreTable.count({ - trans, - query: { - index: getIndexOrStore(ctx, coreTable.schema), - range: ctx.range - } - }).then(count => Math.min(count, ctx.limit)); - } - else { - var count = 0; - return iter(ctx, () => { ++count; return false; }, trans, coreTable) - .then(() => count); - } - }).then(cb); - } - sortBy(keyPath, cb) { - const parts = keyPath.split('.').reverse(), lastPart = parts[0], lastIndex = parts.length - 1; - function getval(obj, i) { - if (i) - return getval(obj[parts[i]], i - 1); - return obj[lastPart]; - } - var order = this._ctx.dir === "next" ? 1 : -1; - function sorter(a, b) { - var aVal = getval(a, lastIndex), bVal = getval(b, lastIndex); - return aVal < bVal ? -order : aVal > bVal ? order : 0; - } - return this.toArray(function (a) { - return a.sort(sorter); - }).then(cb); - } - toArray(cb) { - return this._read(trans => { - var ctx = this._ctx; - if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { - const { valueMapper } = ctx; - const index = getIndexOrStore(ctx, ctx.table.core.schema); - return ctx.table.core.query({ - trans, - limit: ctx.limit, - values: true, - query: { - index, - range: ctx.range - } - }).then(({ result }) => valueMapper ? result.map(valueMapper) : result); - } - else { - const a = []; - return iter(ctx, item => a.push(item), trans, ctx.table.core).then(() => a); - } - }, cb); - } - offset(offset) { - var ctx = this._ctx; - if (offset <= 0) - return this; - ctx.offset += offset; - if (isPlainKeyRange(ctx)) { - addReplayFilter(ctx, () => { - var offsetLeft = offset; - return (cursor, advance) => { - if (offsetLeft === 0) - return true; - if (offsetLeft === 1) { - --offsetLeft; - return false; - } - advance(() => { - cursor.advance(offsetLeft); - offsetLeft = 0; - }); - return false; - }; - }); - } - else { - addReplayFilter(ctx, () => { - var offsetLeft = offset; - return () => (--offsetLeft < 0); - }); - } - return this; - } - limit(numRows) { - this._ctx.limit = Math.min(this._ctx.limit, numRows); - addReplayFilter(this._ctx, () => { - var rowsLeft = numRows; - return function (cursor, advance, resolve) { - if (--rowsLeft <= 0) - advance(resolve); - return rowsLeft >= 0; - }; - }, true); - return this; - } - until(filterFunction, bIncludeStopEntry) { - addFilter(this._ctx, function (cursor, advance, resolve) { - if (filterFunction(cursor.value)) { - advance(resolve); - return bIncludeStopEntry; - } - else { - return true; - } - }); - return this; - } - first(cb) { - return this.limit(1).toArray(function (a) { return a[0]; }).then(cb); - } - last(cb) { - return this.reverse().first(cb); - } - filter(filterFunction) { - addFilter(this._ctx, function (cursor) { - return filterFunction(cursor.value); - }); - addMatchFilter(this._ctx, filterFunction); - return this; - } - and(filter) { - return this.filter(filter); - } - or(indexName) { - return new this.db.WhereClause(this._ctx.table, indexName, this); - } - reverse() { - this._ctx.dir = (this._ctx.dir === "prev" ? "next" : "prev"); - if (this._ondirectionchange) - this._ondirectionchange(this._ctx.dir); - return this; - } - desc() { - return this.reverse(); - } - eachKey(cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - return this.each(function (val, cursor) { cb(cursor.key, cursor); }); - } - eachUniqueKey(cb) { - this._ctx.unique = "unique"; - return this.eachKey(cb); - } - eachPrimaryKey(cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); }); - } - keys(cb) { - var ctx = this._ctx; - ctx.keysOnly = !ctx.isMatch; - var a = []; - return this.each(function (item, cursor) { - a.push(cursor.key); - }).then(function () { - return a; - }).then(cb); - } - primaryKeys(cb) { - var ctx = this._ctx; - if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { - return this._read(trans => { - var index = getIndexOrStore(ctx, ctx.table.core.schema); - return ctx.table.core.query({ - trans, - values: false, - limit: ctx.limit, - query: { - index, - range: ctx.range - } - }); - }).then(({ result }) => result).then(cb); - } - ctx.keysOnly = !ctx.isMatch; - var a = []; - return this.each(function (item, cursor) { - a.push(cursor.primaryKey); - }).then(function () { - return a; - }).then(cb); - } - uniqueKeys(cb) { - this._ctx.unique = "unique"; - return this.keys(cb); - } - firstKey(cb) { - return this.limit(1).keys(function (a) { return a[0]; }).then(cb); - } - lastKey(cb) { - return this.reverse().firstKey(cb); - } - distinct() { - var ctx = this._ctx, idx = ctx.index && ctx.table.schema.idxByName[ctx.index]; - if (!idx || !idx.multi) - return this; - var set = {}; - addFilter(this._ctx, function (cursor) { - var strKey = cursor.primaryKey.toString(); - var found = hasOwn(set, strKey); - set[strKey] = true; - return !found; - }); - return this; - } - modify(changes) { - var ctx = this._ctx; - return this._write(trans => { - var modifyer; - if (typeof changes === 'function') { - modifyer = changes; - } - else { - var keyPaths = keys(changes); - var numKeys = keyPaths.length; - modifyer = function (item) { - let anythingModified = false; - for (let i = 0; i < numKeys; ++i) { - let keyPath = keyPaths[i]; - let val = changes[keyPath]; - let origVal = getByKeyPath(item, keyPath); - if (val instanceof PropModification) { - setByKeyPath(item, keyPath, val.execute(origVal)); - anythingModified = true; - } - else if (origVal !== val) { - setByKeyPath(item, keyPath, val); - anythingModified = true; - } - } - return anythingModified; - }; - } - const coreTable = ctx.table.core; - const { outbound, extractKey } = coreTable.schema.primaryKey; - const limit = this.db._options.modifyChunkSize || 200; - const totalFailures = []; - let successCount = 0; - const failedKeys = []; - const applyMutateResult = (expectedCount, res) => { - const { failures, numFailures } = res; - successCount += expectedCount - numFailures; - for (let pos of keys(failures)) { - totalFailures.push(failures[pos]); - } - }; - return this.clone().primaryKeys().then(keys => { - const criteria = isPlainKeyRange(ctx) && - ctx.limit === Infinity && - (typeof changes !== 'function' || changes === deleteCallback) && { - index: ctx.index, - range: ctx.range - }; - const nextChunk = (offset) => { - const count = Math.min(limit, keys.length - offset); - return coreTable.getMany({ - trans, - keys: keys.slice(offset, offset + count), - cache: "immutable" - }).then(values => { - const addValues = []; - const putValues = []; - const putKeys = outbound ? [] : null; - const deleteKeys = []; - for (let i = 0; i < count; ++i) { - const origValue = values[i]; - const ctx = { - value: deepClone(origValue), - primKey: keys[offset + i] - }; - if (modifyer.call(ctx, ctx.value, ctx) !== false) { - if (ctx.value == null) { - deleteKeys.push(keys[offset + i]); - } - else if (!outbound && cmp(extractKey(origValue), extractKey(ctx.value)) !== 0) { - deleteKeys.push(keys[offset + i]); - addValues.push(ctx.value); - } - else { - putValues.push(ctx.value); - if (outbound) - putKeys.push(keys[offset + i]); - } - } - } - return Promise.resolve(addValues.length > 0 && - coreTable.mutate({ trans, type: 'add', values: addValues }) - .then(res => { - for (let pos in res.failures) { - deleteKeys.splice(parseInt(pos), 1); - } - applyMutateResult(addValues.length, res); - })).then(() => (putValues.length > 0 || (criteria && typeof changes === 'object')) && - coreTable.mutate({ - trans, - type: 'put', - keys: putKeys, - values: putValues, - criteria, - changeSpec: typeof changes !== 'function' - && changes, - isAdditionalChunk: offset > 0 - }).then(res => applyMutateResult(putValues.length, res))).then(() => (deleteKeys.length > 0 || (criteria && changes === deleteCallback)) && - coreTable.mutate({ - trans, - type: 'delete', - keys: deleteKeys, - criteria, - isAdditionalChunk: offset > 0 - }).then(res => applyMutateResult(deleteKeys.length, res))).then(() => { - return keys.length > offset + count && nextChunk(offset + limit); - }); - }); - }; - return nextChunk(0).then(() => { - if (totalFailures.length > 0) - throw new ModifyError("Error modifying one or more objects", totalFailures, successCount, failedKeys); - return keys.length; - }); - }); - }); - } - delete() { - var ctx = this._ctx, range = ctx.range; - if (isPlainKeyRange(ctx) && - (ctx.isPrimKey || range.type === 3 )) - { - return this._write(trans => { - const { primaryKey } = ctx.table.core.schema; - const coreRange = range; - return ctx.table.core.count({ trans, query: { index: primaryKey, range: coreRange } }).then(count => { - return ctx.table.core.mutate({ trans, type: 'deleteRange', range: coreRange }) - .then(({ failures, lastResult, results, numFailures }) => { - if (numFailures) - throw new ModifyError("Could not delete some values", Object.keys(failures).map(pos => failures[pos]), count - numFailures); - return count - numFailures; - }); - }); - }); - } - return this.modify(deleteCallback); - } -} -const deleteCallback = (value, ctx) => ctx.value = null; - -function createCollectionConstructor(db) { - return makeClassConstructor(Collection.prototype, function Collection(whereClause, keyRangeGenerator) { - this.db = db; - let keyRange = AnyRange, error = null; - if (keyRangeGenerator) - try { - keyRange = keyRangeGenerator(); - } - catch (ex) { - error = ex; - } - const whereCtx = whereClause._ctx; - const table = whereCtx.table; - const readingHook = table.hook.reading.fire; - this._ctx = { - table: table, - index: whereCtx.index, - isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)), - range: keyRange, - keysOnly: false, - dir: "next", - unique: "", - algorithm: null, - filter: null, - replayFilter: null, - justLimit: true, - isMatch: null, - offset: 0, - limit: Infinity, - error: error, - or: whereCtx.or, - valueMapper: readingHook !== mirror ? readingHook : null - }; - }); -} - -function simpleCompare(a, b) { - return a < b ? -1 : a === b ? 0 : 1; -} -function simpleCompareReverse(a, b) { - return a > b ? -1 : a === b ? 0 : 1; -} - -function fail(collectionOrWhereClause, err, T) { - var collection = collectionOrWhereClause instanceof WhereClause ? - new collectionOrWhereClause.Collection(collectionOrWhereClause) : - collectionOrWhereClause; - collection._ctx.error = T ? new T(err) : new TypeError(err); - return collection; -} -function emptyCollection(whereClause) { - return new whereClause.Collection(whereClause, () => rangeEqual("")).limit(0); -} -function upperFactory(dir) { - return dir === "next" ? - (s) => s.toUpperCase() : - (s) => s.toLowerCase(); -} -function lowerFactory(dir) { - return dir === "next" ? - (s) => s.toLowerCase() : - (s) => s.toUpperCase(); -} -function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) { - var length = Math.min(key.length, lowerNeedle.length); - var llp = -1; - for (var i = 0; i < length; ++i) { - var lwrKeyChar = lowerKey[i]; - if (lwrKeyChar !== lowerNeedle[i]) { - if (cmp(key[i], upperNeedle[i]) < 0) - return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1); - if (cmp(key[i], lowerNeedle[i]) < 0) - return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1); - if (llp >= 0) - return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1); - return null; - } - if (cmp(key[i], lwrKeyChar) < 0) - llp = i; - } - if (length < lowerNeedle.length && dir === "next") - return key + upperNeedle.substr(key.length); - if (length < key.length && dir === "prev") - return key.substr(0, upperNeedle.length); - return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1)); -} -function addIgnoreCaseAlgorithm(whereClause, match, needles, suffix) { - var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix, needlesLen = needles.length; - if (!needles.every(s => typeof s === 'string')) { - return fail(whereClause, STRING_EXPECTED); - } - function initDirection(dir) { - upper = upperFactory(dir); - lower = lowerFactory(dir); - compare = (dir === "next" ? simpleCompare : simpleCompareReverse); - var needleBounds = needles.map(function (needle) { - return { lower: lower(needle), upper: upper(needle) }; - }).sort(function (a, b) { - return compare(a.lower, b.lower); - }); - upperNeedles = needleBounds.map(function (nb) { return nb.upper; }); - lowerNeedles = needleBounds.map(function (nb) { return nb.lower; }); - direction = dir; - nextKeySuffix = (dir === "next" ? "" : suffix); - } - initDirection("next"); - var c = new whereClause.Collection(whereClause, () => createRange(upperNeedles[0], lowerNeedles[needlesLen - 1] + suffix)); - c._ondirectionchange = function (direction) { - initDirection(direction); - }; - var firstPossibleNeedle = 0; - c._addAlgorithm(function (cursor, advance, resolve) { - var key = cursor.key; - if (typeof key !== 'string') - return false; - var lowerKey = lower(key); - if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) { - return true; - } - else { - var lowestPossibleCasing = null; - for (var i = firstPossibleNeedle; i < needlesLen; ++i) { - var casing = nextCasing(key, lowerKey, upperNeedles[i], lowerNeedles[i], compare, direction); - if (casing === null && lowestPossibleCasing === null) - firstPossibleNeedle = i + 1; - else if (lowestPossibleCasing === null || compare(lowestPossibleCasing, casing) > 0) { - lowestPossibleCasing = casing; - } - } - if (lowestPossibleCasing !== null) { - advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); }); - } - else { - advance(resolve); - } - return false; - } - }); - return c; -} -function createRange(lower, upper, lowerOpen, upperOpen) { - return { - type: 2 , - lower, - upper, - lowerOpen, - upperOpen - }; -} -function rangeEqual(value) { - return { - type: 1 , - lower: value, - upper: value - }; -} - -class WhereClause { - get Collection() { - return this._ctx.table.db.Collection; - } - between(lower, upper, includeLower, includeUpper) { - includeLower = includeLower !== false; - includeUpper = includeUpper === true; - try { - if ((this._cmp(lower, upper) > 0) || - (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper))) - return emptyCollection(this); - return new this.Collection(this, () => createRange(lower, upper, !includeLower, !includeUpper)); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - } - equals(value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, () => rangeEqual(value)); - } - above(value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, () => createRange(value, undefined, true)); - } - aboveOrEqual(value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, () => createRange(value, undefined, false)); - } - below(value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, () => createRange(undefined, value, false, true)); - } - belowOrEqual(value) { - if (value == null) - return fail(this, INVALID_KEY_ARGUMENT); - return new this.Collection(this, () => createRange(undefined, value)); - } - startsWith(str) { - if (typeof str !== 'string') - return fail(this, STRING_EXPECTED); - return this.between(str, str + maxString, true, true); - } - startsWithIgnoreCase(str) { - if (str === "") - return this.startsWith(str); - return addIgnoreCaseAlgorithm(this, (x, a) => x.indexOf(a[0]) === 0, [str], maxString); - } - equalsIgnoreCase(str) { - return addIgnoreCaseAlgorithm(this, (x, a) => x === a[0], [str], ""); - } - anyOfIgnoreCase() { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return emptyCollection(this); - return addIgnoreCaseAlgorithm(this, (x, a) => a.indexOf(x) !== -1, set, ""); - } - startsWithAnyOfIgnoreCase() { - var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return emptyCollection(this); - return addIgnoreCaseAlgorithm(this, (x, a) => a.some(n => x.indexOf(n) === 0), set, maxString); - } - anyOf() { - const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - let compare = this._cmp; - try { - set.sort(compare); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - if (set.length === 0) - return emptyCollection(this); - const c = new this.Collection(this, () => createRange(set[0], set[set.length - 1])); - c._ondirectionchange = direction => { - compare = (direction === "next" ? - this._ascending : - this._descending); - set.sort(compare); - }; - let i = 0; - c._addAlgorithm((cursor, advance, resolve) => { - const key = cursor.key; - while (compare(key, set[i]) > 0) { - ++i; - if (i === set.length) { - advance(resolve); - return false; - } - } - if (compare(key, set[i]) === 0) { - return true; - } - else { - advance(() => { cursor.continue(set[i]); }); - return false; - } - }); - return c; - } - notEqual(value) { - return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false }); - } - noneOf() { - const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (set.length === 0) - return new this.Collection(this); - try { - set.sort(this._ascending); - } - catch (e) { - return fail(this, INVALID_KEY_ARGUMENT); - } - const ranges = set.reduce((res, val) => res ? - res.concat([[res[res.length - 1][1], val]]) : - [[minKey, val]], null); - ranges.push([set[set.length - 1], this.db._maxKey]); - return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false }); - } - inAnyRange(ranges, options) { - const cmp = this._cmp, ascending = this._ascending, descending = this._descending, min = this._min, max = this._max; - if (ranges.length === 0) - return emptyCollection(this); - if (!ranges.every(range => range[0] !== undefined && - range[1] !== undefined && - ascending(range[0], range[1]) <= 0)) { - return fail(this, "First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower", exceptions.InvalidArgument); - } - const includeLowers = !options || options.includeLowers !== false; - const includeUppers = options && options.includeUppers === true; - function addRange(ranges, newRange) { - let i = 0, l = ranges.length; - for (; i < l; ++i) { - const range = ranges[i]; - if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) { - range[0] = min(range[0], newRange[0]); - range[1] = max(range[1], newRange[1]); - break; - } - } - if (i === l) - ranges.push(newRange); - return ranges; - } - let sortDirection = ascending; - function rangeSorter(a, b) { return sortDirection(a[0], b[0]); } - let set; - try { - set = ranges.reduce(addRange, []); - set.sort(rangeSorter); - } - catch (ex) { - return fail(this, INVALID_KEY_ARGUMENT); - } - let rangePos = 0; - const keyIsBeyondCurrentEntry = includeUppers ? - key => ascending(key, set[rangePos][1]) > 0 : - key => ascending(key, set[rangePos][1]) >= 0; - const keyIsBeforeCurrentEntry = includeLowers ? - key => descending(key, set[rangePos][0]) > 0 : - key => descending(key, set[rangePos][0]) >= 0; - function keyWithinCurrentRange(key) { - return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key); - } - let checkKey = keyIsBeyondCurrentEntry; - const c = new this.Collection(this, () => createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers)); - c._ondirectionchange = direction => { - if (direction === "next") { - checkKey = keyIsBeyondCurrentEntry; - sortDirection = ascending; - } - else { - checkKey = keyIsBeforeCurrentEntry; - sortDirection = descending; - } - set.sort(rangeSorter); - }; - c._addAlgorithm((cursor, advance, resolve) => { - var key = cursor.key; - while (checkKey(key)) { - ++rangePos; - if (rangePos === set.length) { - advance(resolve); - return false; - } - } - if (keyWithinCurrentRange(key)) { - return true; - } - else if (this._cmp(key, set[rangePos][1]) === 0 || this._cmp(key, set[rangePos][0]) === 0) { - return false; - } - else { - advance(() => { - if (sortDirection === ascending) - cursor.continue(set[rangePos][0]); - else - cursor.continue(set[rangePos][1]); - }); - return false; - } - }); - return c; - } - startsWithAnyOf() { - const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); - if (!set.every(s => typeof s === 'string')) { - return fail(this, "startsWithAnyOf() only works with strings"); - } - if (set.length === 0) - return emptyCollection(this); - return this.inAnyRange(set.map((str) => [str, str + maxString])); - } -} - -function createWhereClauseConstructor(db) { - return makeClassConstructor(WhereClause.prototype, function WhereClause(table, index, orCollection) { - this.db = db; - this._ctx = { - table: table, - index: index === ":id" ? null : index, - or: orCollection - }; - this._cmp = this._ascending = cmp; - this._descending = (a, b) => cmp(b, a); - this._max = (a, b) => cmp(a, b) > 0 ? a : b; - this._min = (a, b) => cmp(a, b) < 0 ? a : b; - this._IDBKeyRange = db._deps.IDBKeyRange; - if (!this._IDBKeyRange) - throw new exceptions.MissingAPI(); - }); -} - -function eventRejectHandler(reject) { - return wrap(function (event) { - preventDefault(event); - reject(event.target.error); - return false; - }); -} -function preventDefault(event) { - if (event.stopPropagation) - event.stopPropagation(); - if (event.preventDefault) - event.preventDefault(); -} - -const DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated'; -const STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1'; -const globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME); - -class Transaction { - _lock() { - assert(!PSD.global); - ++this._reculock; - if (this._reculock === 1 && !PSD.global) - PSD.lockOwnerFor = this; - return this; - } - _unlock() { - assert(!PSD.global); - if (--this._reculock === 0) { - if (!PSD.global) - PSD.lockOwnerFor = null; - while (this._blockedFuncs.length > 0 && !this._locked()) { - var fnAndPSD = this._blockedFuncs.shift(); - try { - usePSD(fnAndPSD[1], fnAndPSD[0]); - } - catch (e) { } - } - } - return this; - } - _locked() { - return this._reculock && PSD.lockOwnerFor !== this; - } - create(idbtrans) { - if (!this.mode) - return this; - const idbdb = this.db.idbdb; - const dbOpenError = this.db._state.dbOpenError; - assert(!this.idbtrans); - if (!idbtrans && !idbdb) { - switch (dbOpenError && dbOpenError.name) { - case "DatabaseClosedError": - throw new exceptions.DatabaseClosed(dbOpenError); - case "MissingAPIError": - throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError); - default: - throw new exceptions.OpenFailed(dbOpenError); - } - } - if (!this.active) - throw new exceptions.TransactionInactive(); - assert(this._completion._state === null); - idbtrans = this.idbtrans = idbtrans || - (this.db.core - ? this.db.core.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability }) - : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })); - idbtrans.onerror = wrap(ev => { - preventDefault(ev); - this._reject(idbtrans.error); - }); - idbtrans.onabort = wrap(ev => { - preventDefault(ev); - this.active && this._reject(new exceptions.Abort(idbtrans.error)); - this.active = false; - this.on("abort").fire(ev); - }); - idbtrans.oncomplete = wrap(() => { - this.active = false; - this._resolve(); - if ('mutatedParts' in idbtrans) { - globalEvents.storagemutated.fire(idbtrans["mutatedParts"]); - } - }); - return this; - } - _promise(mode, fn, bWriteLock) { - if (mode === 'readwrite' && this.mode !== 'readwrite') - return rejection(new exceptions.ReadOnly("Transaction is readonly")); - if (!this.active) - return rejection(new exceptions.TransactionInactive()); - if (this._locked()) { - return new DexiePromise((resolve, reject) => { - this._blockedFuncs.push([() => { - this._promise(mode, fn, bWriteLock).then(resolve, reject); - }, PSD]); - }); - } - else if (bWriteLock) { - return newScope(() => { - var p = new DexiePromise((resolve, reject) => { - this._lock(); - const rv = fn(resolve, reject, this); - if (rv && rv.then) - rv.then(resolve, reject); - }); - p.finally(() => this._unlock()); - p._lib = true; - return p; - }); - } - else { - var p = new DexiePromise((resolve, reject) => { - var rv = fn(resolve, reject, this); - if (rv && rv.then) - rv.then(resolve, reject); - }); - p._lib = true; - return p; - } - } - _root() { - return this.parent ? this.parent._root() : this; - } - waitFor(promiseLike) { - var root = this._root(); - const promise = DexiePromise.resolve(promiseLike); - if (root._waitingFor) { - root._waitingFor = root._waitingFor.then(() => promise); - } - else { - root._waitingFor = promise; - root._waitingQueue = []; - var store = root.idbtrans.objectStore(root.storeNames[0]); - (function spin() { - ++root._spinCount; - while (root._waitingQueue.length) - (root._waitingQueue.shift())(); - if (root._waitingFor) - store.get(-Infinity).onsuccess = spin; - }()); - } - var currentWaitPromise = root._waitingFor; - return new DexiePromise((resolve, reject) => { - promise.then(res => root._waitingQueue.push(wrap(resolve.bind(null, res))), err => root._waitingQueue.push(wrap(reject.bind(null, err)))).finally(() => { - if (root._waitingFor === currentWaitPromise) { - root._waitingFor = null; - } - }); - }); - } - abort() { - if (this.active) { - this.active = false; - if (this.idbtrans) - this.idbtrans.abort(); - this._reject(new exceptions.Abort()); - } - } - table(tableName) { - const memoizedTables = (this._memoizedTables || (this._memoizedTables = {})); - if (hasOwn(memoizedTables, tableName)) - return memoizedTables[tableName]; - const tableSchema = this.schema[tableName]; - if (!tableSchema) { - throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); - } - const transactionBoundTable = new this.db.Table(tableName, tableSchema, this); - transactionBoundTable.core = this.db.core.table(tableName); - memoizedTables[tableName] = transactionBoundTable; - return transactionBoundTable; - } -} - -function createTransactionConstructor(db) { - return makeClassConstructor(Transaction.prototype, function Transaction(mode, storeNames, dbschema, chromeTransactionDurability, parent) { - this.db = db; - this.mode = mode; - this.storeNames = storeNames; - this.schema = dbschema; - this.chromeTransactionDurability = chromeTransactionDurability; - this.idbtrans = null; - this.on = Events(this, "complete", "error", "abort"); - this.parent = parent || null; - this.active = true; - this._reculock = 0; - this._blockedFuncs = []; - this._resolve = null; - this._reject = null; - this._waitingFor = null; - this._waitingQueue = null; - this._spinCount = 0; - this._completion = new DexiePromise((resolve, reject) => { - this._resolve = resolve; - this._reject = reject; - }); - this._completion.then(() => { - this.active = false; - this.on.complete.fire(); - }, e => { - var wasActive = this.active; - this.active = false; - this.on.error.fire(e); - this.parent ? - this.parent._reject(e) : - wasActive && this.idbtrans && this.idbtrans.abort(); - return rejection(e); - }); - }); -} - -function createIndexSpec(name, keyPath, unique, multi, auto, compound, isPrimKey) { - return { - name, - keyPath, - unique, - multi, - auto, - compound, - src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? "++" : "") + nameFromKeyPath(keyPath) - }; -} -function nameFromKeyPath(keyPath) { - return typeof keyPath === 'string' ? - keyPath : - keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : ""; -} - -function createTableSchema(name, primKey, indexes) { - return { - name, - primKey, - indexes, - mappedClass: null, - idxByName: arrayToObject(indexes, index => [index.name, index]) - }; -} - -function safariMultiStoreFix(storeNames) { - return storeNames.length === 1 ? storeNames[0] : storeNames; -} -let getMaxKey = (IdbKeyRange) => { - try { - IdbKeyRange.only([[]]); - getMaxKey = () => [[]]; - return [[]]; - } - catch (e) { - getMaxKey = () => maxString; - return maxString; - } -}; - -function getKeyExtractor(keyPath) { - if (keyPath == null) { - return () => undefined; - } - else if (typeof keyPath === 'string') { - return getSinglePathKeyExtractor(keyPath); - } - else { - return obj => getByKeyPath(obj, keyPath); - } -} -function getSinglePathKeyExtractor(keyPath) { - const split = keyPath.split('.'); - if (split.length === 1) { - return obj => obj[keyPath]; - } - else { - return obj => getByKeyPath(obj, keyPath); - } -} - -function arrayify(arrayLike) { - return [].slice.call(arrayLike); -} -let _id_counter = 0; -function getKeyPathAlias(keyPath) { - return keyPath == null ? - ":id" : - typeof keyPath === 'string' ? - keyPath : - `[${keyPath.join('+')}]`; -} -function createDBCore(db, IdbKeyRange, tmpTrans) { - function extractSchema(db, trans) { - const tables = arrayify(db.objectStoreNames); - return { - schema: { - name: db.name, - tables: tables.map(table => trans.objectStore(table)).map(store => { - const { keyPath, autoIncrement } = store; - const compound = isArray(keyPath); - const outbound = keyPath == null; - const indexByKeyPath = {}; - const result = { - name: store.name, - primaryKey: { - name: null, - isPrimaryKey: true, - outbound, - compound, - keyPath, - autoIncrement, - unique: true, - extractKey: getKeyExtractor(keyPath) - }, - indexes: arrayify(store.indexNames).map(indexName => store.index(indexName)) - .map(index => { - const { name, unique, multiEntry, keyPath } = index; - const compound = isArray(keyPath); - const result = { - name, - compound, - keyPath, - unique, - multiEntry, - extractKey: getKeyExtractor(keyPath) - }; - indexByKeyPath[getKeyPathAlias(keyPath)] = result; - return result; - }), - getIndexByKeyPath: (keyPath) => indexByKeyPath[getKeyPathAlias(keyPath)] - }; - indexByKeyPath[":id"] = result.primaryKey; - if (keyPath != null) { - indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey; - } - return result; - }) - }, - hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) && - !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && - !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && - [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) - }; - } - function makeIDBKeyRange(range) { - if (range.type === 3 ) - return null; - if (range.type === 4 ) - throw new Error("Cannot convert never type to IDBKeyRange"); - const { lower, upper, lowerOpen, upperOpen } = range; - const idbRange = lower === undefined ? - upper === undefined ? - null : - IdbKeyRange.upperBound(upper, !!upperOpen) : - upper === undefined ? - IdbKeyRange.lowerBound(lower, !!lowerOpen) : - IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen); - return idbRange; - } - function createDbCoreTable(tableSchema) { - const tableName = tableSchema.name; - function mutate({ trans, type, keys, values, range }) { - return new Promise((resolve, reject) => { - resolve = wrap(resolve); - const store = trans.objectStore(tableName); - const outbound = store.keyPath == null; - const isAddOrPut = type === "put" || type === "add"; - if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange') - throw new Error("Invalid operation type: " + type); - const { length } = keys || values || { length: 1 }; - if (keys && values && keys.length !== values.length) { - throw new Error("Given keys array must have same length as given values array."); - } - if (length === 0) - return resolve({ numFailures: 0, failures: {}, results: [], lastResult: undefined }); - let req; - const reqs = []; - const failures = []; - let numFailures = 0; - const errorHandler = event => { - ++numFailures; - preventDefault(event); - }; - if (type === 'deleteRange') { - if (range.type === 4 ) - return resolve({ numFailures, failures, results: [], lastResult: undefined }); - if (range.type === 3 ) - reqs.push(req = store.clear()); - else - reqs.push(req = store.delete(makeIDBKeyRange(range))); - } - else { - const [args1, args2] = isAddOrPut ? - outbound ? - [values, keys] : - [values, null] : - [keys, null]; - if (isAddOrPut) { - for (let i = 0; i < length; ++i) { - reqs.push(req = (args2 && args2[i] !== undefined ? - store[type](args1[i], args2[i]) : - store[type](args1[i]))); - req.onerror = errorHandler; - } - } - else { - for (let i = 0; i < length; ++i) { - reqs.push(req = store[type](args1[i])); - req.onerror = errorHandler; - } - } - } - const done = event => { - const lastResult = event.target.result; - reqs.forEach((req, i) => req.error != null && (failures[i] = req.error)); - resolve({ - numFailures, - failures, - results: type === "delete" ? keys : reqs.map(req => req.result), - lastResult - }); - }; - req.onerror = event => { - errorHandler(event); - done(event); - }; - req.onsuccess = done; - }); - } - function openCursor({ trans, values, query, reverse, unique }) { - return new Promise((resolve, reject) => { - resolve = wrap(resolve); - const { index, range } = query; - const store = trans.objectStore(tableName); - const source = index.isPrimaryKey ? - store : - store.index(index.name); - const direction = reverse ? - unique ? - "prevunique" : - "prev" : - unique ? - "nextunique" : - "next"; - const req = values || !('openKeyCursor' in source) ? - source.openCursor(makeIDBKeyRange(range), direction) : - source.openKeyCursor(makeIDBKeyRange(range), direction); - req.onerror = eventRejectHandler(reject); - req.onsuccess = wrap(ev => { - const cursor = req.result; - if (!cursor) { - resolve(null); - return; - } - cursor.___id = ++_id_counter; - cursor.done = false; - const _cursorContinue = cursor.continue.bind(cursor); - let _cursorContinuePrimaryKey = cursor.continuePrimaryKey; - if (_cursorContinuePrimaryKey) - _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor); - const _cursorAdvance = cursor.advance.bind(cursor); - const doThrowCursorIsNotStarted = () => { throw new Error("Cursor not started"); }; - const doThrowCursorIsStopped = () => { throw new Error("Cursor not stopped"); }; - cursor.trans = trans; - cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted; - cursor.fail = wrap(reject); - cursor.next = function () { - let gotOne = 1; - return this.start(() => gotOne-- ? this.continue() : this.stop()).then(() => this); - }; - cursor.start = (callback) => { - const iterationPromise = new Promise((resolveIteration, rejectIteration) => { - resolveIteration = wrap(resolveIteration); - req.onerror = eventRejectHandler(rejectIteration); - cursor.fail = rejectIteration; - cursor.stop = value => { - cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped; - resolveIteration(value); - }; - }); - const guardedCallback = () => { - if (req.result) { - try { - callback(); - } - catch (err) { - cursor.fail(err); - } - } - else { - cursor.done = true; - cursor.start = () => { throw new Error("Cursor behind last entry"); }; - cursor.stop(); - } - }; - req.onsuccess = wrap(ev => { - req.onsuccess = guardedCallback; - guardedCallback(); - }); - cursor.continue = _cursorContinue; - cursor.continuePrimaryKey = _cursorContinuePrimaryKey; - cursor.advance = _cursorAdvance; - guardedCallback(); - return iterationPromise; - }; - resolve(cursor); - }, reject); - }); - } - function query(hasGetAll) { - return (request) => { - return new Promise((resolve, reject) => { - resolve = wrap(resolve); - const { trans, values, limit, query } = request; - const nonInfinitLimit = limit === Infinity ? undefined : limit; - const { index, range } = query; - const store = trans.objectStore(tableName); - const source = index.isPrimaryKey ? store : store.index(index.name); - const idbKeyRange = makeIDBKeyRange(range); - if (limit === 0) - return resolve({ result: [] }); - if (hasGetAll) { - const req = values ? - source.getAll(idbKeyRange, nonInfinitLimit) : - source.getAllKeys(idbKeyRange, nonInfinitLimit); - req.onsuccess = event => resolve({ result: event.target.result }); - req.onerror = eventRejectHandler(reject); - } - else { - let count = 0; - const req = values || !('openKeyCursor' in source) ? - source.openCursor(idbKeyRange) : - source.openKeyCursor(idbKeyRange); - const result = []; - req.onsuccess = event => { - const cursor = req.result; - if (!cursor) - return resolve({ result }); - result.push(values ? cursor.value : cursor.primaryKey); - if (++count === limit) - return resolve({ result }); - cursor.continue(); - }; - req.onerror = eventRejectHandler(reject); - } - }); - }; - } - return { - name: tableName, - schema: tableSchema, - mutate, - getMany({ trans, keys }) { - return new Promise((resolve, reject) => { - resolve = wrap(resolve); - const store = trans.objectStore(tableName); - const length = keys.length; - const result = new Array(length); - let keyCount = 0; - let callbackCount = 0; - let req; - const successHandler = event => { - const req = event.target; - if ((result[req._pos] = req.result) != null) - ; - if (++callbackCount === keyCount) - resolve(result); - }; - const errorHandler = eventRejectHandler(reject); - for (let i = 0; i < length; ++i) { - const key = keys[i]; - if (key != null) { - req = store.get(keys[i]); - req._pos = i; - req.onsuccess = successHandler; - req.onerror = errorHandler; - ++keyCount; - } - } - if (keyCount === 0) - resolve(result); - }); - }, - get({ trans, key }) { - return new Promise((resolve, reject) => { - resolve = wrap(resolve); - const store = trans.objectStore(tableName); - const req = store.get(key); - req.onsuccess = event => resolve(event.target.result); - req.onerror = eventRejectHandler(reject); - }); - }, - query: query(hasGetAll), - openCursor, - count({ query, trans }) { - const { index, range } = query; - return new Promise((resolve, reject) => { - const store = trans.objectStore(tableName); - const source = index.isPrimaryKey ? store : store.index(index.name); - const idbKeyRange = makeIDBKeyRange(range); - const req = idbKeyRange ? source.count(idbKeyRange) : source.count(); - req.onsuccess = wrap(ev => resolve(ev.target.result)); - req.onerror = eventRejectHandler(reject); - }); - } - }; - } - const { schema, hasGetAll } = extractSchema(db, tmpTrans); - const tables = schema.tables.map(tableSchema => createDbCoreTable(tableSchema)); - const tableMap = {}; - tables.forEach(table => tableMap[table.name] = table); - return { - stack: "dbcore", - transaction: db.transaction.bind(db), - table(name) { - const result = tableMap[name]; - if (!result) - throw new Error(`Table '${name}' not found`); - return tableMap[name]; - }, - MIN_KEY: -Infinity, - MAX_KEY: getMaxKey(IdbKeyRange), - schema - }; -} - -function createMiddlewareStack(stackImpl, middlewares) { - return middlewares.reduce((down, { create }) => ({ ...down, ...create(down) }), stackImpl); -} -function createMiddlewareStacks(middlewares, idbdb, { IDBKeyRange, indexedDB }, tmpTrans) { - const dbcore = createMiddlewareStack(createDBCore(idbdb, IDBKeyRange, tmpTrans), middlewares.dbcore); - return { - dbcore - }; -} -function generateMiddlewareStacks(db, tmpTrans) { - const idbdb = tmpTrans.db; - const stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans); - db.core = stacks.dbcore; - db.tables.forEach(table => { - const tableName = table.name; - if (db.core.schema.tables.some(tbl => tbl.name === tableName)) { - table.core = db.core.table(tableName); - if (db[tableName] instanceof db.Table) { - db[tableName].core = table.core; - } - } - }); -} - -function setApiOnPlace(db, objs, tableNames, dbschema) { - tableNames.forEach(tableName => { - const schema = dbschema[tableName]; - objs.forEach(obj => { - const propDesc = getPropertyDescriptor(obj, tableName); - if (!propDesc || ("value" in propDesc && propDesc.value === undefined)) { - if (obj === db.Transaction.prototype || obj instanceof db.Transaction) { - setProp(obj, tableName, { - get() { return this.table(tableName); }, - set(value) { - defineProperty(this, tableName, { value, writable: true, configurable: true, enumerable: true }); - } - }); - } - else { - obj[tableName] = new db.Table(tableName, schema); - } - } - }); - }); -} -function removeTablesApi(db, objs) { - objs.forEach(obj => { - for (let key in obj) { - if (obj[key] instanceof db.Table) - delete obj[key]; - } - }); -} -function lowerVersionFirst(a, b) { - return a._cfg.version - b._cfg.version; -} -function runUpgraders(db, oldVersion, idbUpgradeTrans, reject) { - const globalSchema = db._dbSchema; - if (idbUpgradeTrans.objectStoreNames.contains('$meta') && !globalSchema.$meta) { - globalSchema.$meta = createTableSchema("$meta", parseIndexSyntax("")[0], []); - db._storeNames.push('$meta'); - } - const trans = db._createTransaction('readwrite', db._storeNames, globalSchema); - trans.create(idbUpgradeTrans); - trans._completion.catch(reject); - const rejectTransaction = trans._reject.bind(trans); - const transless = PSD.transless || PSD; - newScope(() => { - PSD.trans = trans; - PSD.transless = transless; - if (oldVersion === 0) { - keys(globalSchema).forEach(tableName => { - createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes); - }); - generateMiddlewareStacks(db, idbUpgradeTrans); - DexiePromise.follow(() => db.on.populate.fire(trans)).catch(rejectTransaction); - } - else { - generateMiddlewareStacks(db, idbUpgradeTrans); - return getExistingVersion(db, trans, oldVersion) - .then(oldVersion => updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans)) - .catch(rejectTransaction); - } - }); -} -function patchCurrentVersion(db, idbUpgradeTrans) { - createMissingTables(db._dbSchema, idbUpgradeTrans); - if (idbUpgradeTrans.db.version % 10 === 0 && !idbUpgradeTrans.objectStoreNames.contains('$meta')) { - idbUpgradeTrans.db.createObjectStore('$meta').add(Math.ceil((idbUpgradeTrans.db.version / 10) - 1), 'version'); - } - const globalSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); - adjustToExistingIndexNames(db, db._dbSchema, idbUpgradeTrans); - const diff = getSchemaDiff(globalSchema, db._dbSchema); - for (const tableChange of diff.change) { - if (tableChange.change.length || tableChange.recreate) { - console.warn(`Unable to patch indexes of table ${tableChange.name} because it has changes on the type of index or primary key.`); - return; - } - const store = idbUpgradeTrans.objectStore(tableChange.name); - tableChange.add.forEach(idx => { - if (debug) - console.debug(`Dexie upgrade patch: Creating missing index ${tableChange.name}.${idx.src}`); - addIndex(store, idx); - }); - } -} -function getExistingVersion(db, trans, oldVersion) { - if (trans.storeNames.includes('$meta')) { - return trans.table('$meta').get('version').then(metaVersion => { - return metaVersion != null ? metaVersion : oldVersion; - }); - } - else { - return DexiePromise.resolve(oldVersion); - } -} -function updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans) { - const queue = []; - const versions = db._versions; - let globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); - const versToRun = versions.filter(v => v._cfg.version >= oldVersion); - if (versToRun.length === 0) { - return DexiePromise.resolve(); - } - versToRun.forEach(version => { - queue.push(() => { - const oldSchema = globalSchema; - const newSchema = version._cfg.dbschema; - adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans); - adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans); - globalSchema = db._dbSchema = newSchema; - const diff = getSchemaDiff(oldSchema, newSchema); - diff.add.forEach(tuple => { - createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes); - }); - diff.change.forEach(change => { - if (change.recreate) { - throw new exceptions.Upgrade("Not yet support for changing primary key"); - } - else { - const store = idbUpgradeTrans.objectStore(change.name); - change.add.forEach(idx => addIndex(store, idx)); - change.change.forEach(idx => { - store.deleteIndex(idx.name); - addIndex(store, idx); - }); - change.del.forEach(idxName => store.deleteIndex(idxName)); - } - }); - const contentUpgrade = version._cfg.contentUpgrade; - if (contentUpgrade && version._cfg.version > oldVersion) { - generateMiddlewareStacks(db, idbUpgradeTrans); - trans._memoizedTables = {}; - let upgradeSchema = shallowClone(newSchema); - diff.del.forEach(table => { - upgradeSchema[table] = oldSchema[table]; - }); - removeTablesApi(db, [db.Transaction.prototype]); - setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema), upgradeSchema); - trans.schema = upgradeSchema; - const contentUpgradeIsAsync = isAsyncFunction(contentUpgrade); - if (contentUpgradeIsAsync) { - incrementExpectedAwaits(); - } - let returnValue; - const promiseFollowed = DexiePromise.follow(() => { - returnValue = contentUpgrade(trans); - if (returnValue) { - if (contentUpgradeIsAsync) { - var decrementor = decrementExpectedAwaits.bind(null, null); - returnValue.then(decrementor, decrementor); - } - } - }); - return (returnValue && typeof returnValue.then === 'function' ? - DexiePromise.resolve(returnValue) : promiseFollowed.then(() => returnValue)); - } - }); - queue.push(idbtrans => { - const newSchema = version._cfg.dbschema; - deleteRemovedTables(newSchema, idbtrans); - removeTablesApi(db, [db.Transaction.prototype]); - setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema); - trans.schema = db._dbSchema; - }); - queue.push(idbtrans => { - if (db.idbdb.objectStoreNames.contains('$meta')) { - if (Math.ceil(db.idbdb.version / 10) === version._cfg.version) { - db.idbdb.deleteObjectStore('$meta'); - delete db._dbSchema.$meta; - db._storeNames = db._storeNames.filter(name => name !== '$meta'); - } - else { - idbtrans.objectStore('$meta').put(version._cfg.version, 'version'); - } - } - }); - }); - function runQueue() { - return queue.length ? DexiePromise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) : - DexiePromise.resolve(); - } - return runQueue().then(() => { - createMissingTables(globalSchema, idbUpgradeTrans); - }); -} -function getSchemaDiff(oldSchema, newSchema) { - const diff = { - del: [], - add: [], - change: [] - }; - let table; - for (table in oldSchema) { - if (!newSchema[table]) - diff.del.push(table); - } - for (table in newSchema) { - const oldDef = oldSchema[table], newDef = newSchema[table]; - if (!oldDef) { - diff.add.push([table, newDef]); - } - else { - const change = { - name: table, - def: newDef, - recreate: false, - del: [], - add: [], - change: [] - }; - if (( - '' + (oldDef.primKey.keyPath || '')) !== ('' + (newDef.primKey.keyPath || '')) || - (oldDef.primKey.auto !== newDef.primKey.auto)) { - change.recreate = true; - diff.change.push(change); - } - else { - const oldIndexes = oldDef.idxByName; - const newIndexes = newDef.idxByName; - let idxName; - for (idxName in oldIndexes) { - if (!newIndexes[idxName]) - change.del.push(idxName); - } - for (idxName in newIndexes) { - const oldIdx = oldIndexes[idxName], newIdx = newIndexes[idxName]; - if (!oldIdx) - change.add.push(newIdx); - else if (oldIdx.src !== newIdx.src) - change.change.push(newIdx); - } - if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) { - diff.change.push(change); - } - } - } - } - return diff; -} -function createTable(idbtrans, tableName, primKey, indexes) { - const store = idbtrans.db.createObjectStore(tableName, primKey.keyPath ? - { keyPath: primKey.keyPath, autoIncrement: primKey.auto } : - { autoIncrement: primKey.auto }); - indexes.forEach(idx => addIndex(store, idx)); - return store; -} -function createMissingTables(newSchema, idbtrans) { - keys(newSchema).forEach(tableName => { - if (!idbtrans.db.objectStoreNames.contains(tableName)) { - if (debug) - console.debug('Dexie: Creating missing table', tableName); - createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes); - } - }); -} -function deleteRemovedTables(newSchema, idbtrans) { - [].slice.call(idbtrans.db.objectStoreNames).forEach(storeName => newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName)); -} -function addIndex(store, idx) { - store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi }); -} -function buildGlobalSchema(db, idbdb, tmpTrans) { - const globalSchema = {}; - const dbStoreNames = slice(idbdb.objectStoreNames, 0); - dbStoreNames.forEach(storeName => { - const store = tmpTrans.objectStore(storeName); - let keyPath = store.keyPath; - const primKey = createIndexSpec(nameFromKeyPath(keyPath), keyPath || "", true, false, !!store.autoIncrement, keyPath && typeof keyPath !== "string", true); - const indexes = []; - for (let j = 0; j < store.indexNames.length; ++j) { - const idbindex = store.index(store.indexNames[j]); - keyPath = idbindex.keyPath; - var index = createIndexSpec(idbindex.name, keyPath, !!idbindex.unique, !!idbindex.multiEntry, false, keyPath && typeof keyPath !== "string", false); - indexes.push(index); - } - globalSchema[storeName] = createTableSchema(storeName, primKey, indexes); - }); - return globalSchema; -} -function readGlobalSchema(db, idbdb, tmpTrans) { - db.verno = idbdb.version / 10; - const globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans); - db._storeNames = slice(idbdb.objectStoreNames, 0); - setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema); -} -function verifyInstalledSchema(db, tmpTrans) { - const installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans); - const diff = getSchemaDiff(installedSchema, db._dbSchema); - return !(diff.add.length || diff.change.some(ch => ch.add.length || ch.change.length)); -} -function adjustToExistingIndexNames(db, schema, idbtrans) { - const storeNames = idbtrans.db.objectStoreNames; - for (let i = 0; i < storeNames.length; ++i) { - const storeName = storeNames[i]; - const store = idbtrans.objectStore(storeName); - db._hasGetAll = 'getAll' in store; - for (let j = 0; j < store.indexNames.length; ++j) { - const indexName = store.indexNames[j]; - const keyPath = store.index(indexName).keyPath; - const dexieName = typeof keyPath === 'string' ? keyPath : "[" + slice(keyPath).join('+') + "]"; - if (schema[storeName]) { - const indexSpec = schema[storeName].idxByName[dexieName]; - if (indexSpec) { - indexSpec.name = indexName; - delete schema[storeName].idxByName[dexieName]; - schema[storeName].idxByName[indexName] = indexSpec; - } - } - } - } - if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && - !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && - _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope && - [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) { - db._hasGetAll = false; - } -} -function parseIndexSyntax(primKeyAndIndexes) { - return primKeyAndIndexes.split(',').map((index, indexNum) => { - index = index.trim(); - const name = index.replace(/([&*]|\+\+)/g, ""); - const keyPath = /^\[/.test(name) ? name.match(/^\[(.*)\]$/)[1].split('+') : name; - return createIndexSpec(name, keyPath || null, /\&/.test(index), /\*/.test(index), /\+\+/.test(index), isArray(keyPath), indexNum === 0); - }); -} - -class Version { - _parseStoresSpec(stores, outSchema) { - keys(stores).forEach(tableName => { - if (stores[tableName] !== null) { - var indexes = parseIndexSyntax(stores[tableName]); - var primKey = indexes.shift(); - primKey.unique = true; - if (primKey.multi) - throw new exceptions.Schema("Primary key cannot be multi-valued"); - indexes.forEach(idx => { - if (idx.auto) - throw new exceptions.Schema("Only primary key can be marked as autoIncrement (++)"); - if (!idx.keyPath) - throw new exceptions.Schema("Index must have a name and cannot be an empty string"); - }); - outSchema[tableName] = createTableSchema(tableName, primKey, indexes); - } - }); - } - stores(stores) { - const db = this.db; - this._cfg.storesSource = this._cfg.storesSource ? - extend(this._cfg.storesSource, stores) : - stores; - const versions = db._versions; - const storesSpec = {}; - let dbschema = {}; - versions.forEach(version => { - extend(storesSpec, version._cfg.storesSource); - dbschema = (version._cfg.dbschema = {}); - version._parseStoresSpec(storesSpec, dbschema); - }); - db._dbSchema = dbschema; - removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]); - setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema); - db._storeNames = keys(dbschema); - return this; - } - upgrade(upgradeFunction) { - this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction); - return this; - } -} - -function createVersionConstructor(db) { - return makeClassConstructor(Version.prototype, function Version(versionNumber) { - this.db = db; - this._cfg = { - version: versionNumber, - storesSource: null, - dbschema: {}, - tables: {}, - contentUpgrade: null - }; - }); -} - -function getDbNamesTable(indexedDB, IDBKeyRange) { - let dbNamesDB = indexedDB["_dbNamesDB"]; - if (!dbNamesDB) { - dbNamesDB = indexedDB["_dbNamesDB"] = new Dexie$1(DBNAMES_DB, { - addons: [], - indexedDB, - IDBKeyRange, - }); - dbNamesDB.version(1).stores({ dbnames: "name" }); - } - return dbNamesDB.table("dbnames"); -} -function hasDatabasesNative(indexedDB) { - return indexedDB && typeof indexedDB.databases === "function"; -} -function getDatabaseNames({ indexedDB, IDBKeyRange, }) { - return hasDatabasesNative(indexedDB) - ? Promise.resolve(indexedDB.databases()).then((infos) => infos - .map((info) => info.name) - .filter((name) => name !== DBNAMES_DB)) - : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys(); -} -function _onDatabaseCreated({ indexedDB, IDBKeyRange }, name) { - !hasDatabasesNative(indexedDB) && - name !== DBNAMES_DB && - getDbNamesTable(indexedDB, IDBKeyRange).put({ name }).catch(nop); -} -function _onDatabaseDeleted({ indexedDB, IDBKeyRange }, name) { - !hasDatabasesNative(indexedDB) && - name !== DBNAMES_DB && - getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop); -} - -function vip(fn) { - return newScope(function () { - PSD.letThrough = true; - return fn(); - }); -} - -function idbReady() { - var isSafari = !navigator.userAgentData && - /Safari\//.test(navigator.userAgent) && - !/Chrom(e|ium)\//.test(navigator.userAgent); - if (!isSafari || !indexedDB.databases) - return Promise.resolve(); - var intervalId; - return new Promise(function (resolve) { - var tryIdb = function () { return indexedDB.databases().finally(resolve); }; - intervalId = setInterval(tryIdb, 100); - tryIdb(); - }).finally(function () { return clearInterval(intervalId); }); -} - -function isEmptyRange(node) { - return !("from" in node); -} -const RangeSet = function (fromOrTree, to) { - if (this) { - extend(this, arguments.length ? { d: 1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree } : { d: 0 }); - } - else { - const rv = new RangeSet(); - if (fromOrTree && ("d" in fromOrTree)) { - extend(rv, fromOrTree); - } - return rv; - } -}; -props(RangeSet.prototype, { - add(rangeSet) { - mergeRanges(this, rangeSet); - return this; - }, - addKey(key) { - addRange(this, key, key); - return this; - }, - addKeys(keys) { - keys.forEach(key => addRange(this, key, key)); - return this; - }, - [iteratorSymbol]() { - return getRangeSetIterator(this); - } -}); -function addRange(target, from, to) { - const diff = cmp(from, to); - if (isNaN(diff)) - return; - if (diff > 0) - throw RangeError(); - if (isEmptyRange(target)) - return extend(target, { from, to, d: 1 }); - const left = target.l; - const right = target.r; - if (cmp(to, target.from) < 0) { - left - ? addRange(left, from, to) - : (target.l = { from, to, d: 1, l: null, r: null }); - return rebalance(target); - } - if (cmp(from, target.to) > 0) { - right - ? addRange(right, from, to) - : (target.r = { from, to, d: 1, l: null, r: null }); - return rebalance(target); - } - if (cmp(from, target.from) < 0) { - target.from = from; - target.l = null; - target.d = right ? right.d + 1 : 1; - } - if (cmp(to, target.to) > 0) { - target.to = to; - target.r = null; - target.d = target.l ? target.l.d + 1 : 1; - } - const rightWasCutOff = !target.r; - if (left && !target.l) { - mergeRanges(target, left); - } - if (right && rightWasCutOff) { - mergeRanges(target, right); - } -} -function mergeRanges(target, newSet) { - function _addRangeSet(target, { from, to, l, r }) { - addRange(target, from, to); - if (l) - _addRangeSet(target, l); - if (r) - _addRangeSet(target, r); - } - if (!isEmptyRange(newSet)) - _addRangeSet(target, newSet); -} -function rangesOverlap(rangeSet1, rangeSet2) { - const i1 = getRangeSetIterator(rangeSet2); - let nextResult1 = i1.next(); - if (nextResult1.done) - return false; - let a = nextResult1.value; - const i2 = getRangeSetIterator(rangeSet1); - let nextResult2 = i2.next(a.from); - let b = nextResult2.value; - while (!nextResult1.done && !nextResult2.done) { - if (cmp(b.from, a.to) <= 0 && cmp(b.to, a.from) >= 0) - return true; - cmp(a.from, b.from) < 0 - ? (a = (nextResult1 = i1.next(b.from)).value) - : (b = (nextResult2 = i2.next(a.from)).value); - } - return false; -} -function getRangeSetIterator(node) { - let state = isEmptyRange(node) ? null : { s: 0, n: node }; - return { - next(key) { - const keyProvided = arguments.length > 0; - while (state) { - switch (state.s) { - case 0: - state.s = 1; - if (keyProvided) { - while (state.n.l && cmp(key, state.n.from) < 0) - state = { up: state, n: state.n.l, s: 1 }; - } - else { - while (state.n.l) - state = { up: state, n: state.n.l, s: 1 }; - } - case 1: - state.s = 2; - if (!keyProvided || cmp(key, state.n.to) <= 0) - return { value: state.n, done: false }; - case 2: - if (state.n.r) { - state.s = 3; - state = { up: state, n: state.n.r, s: 0 }; - continue; - } - case 3: - state = state.up; - } - } - return { done: true }; - }, - }; -} -function rebalance(target) { - const diff = (target.r?.d || 0) - (target.l?.d || 0); - const r = diff > 1 ? "r" : diff < -1 ? "l" : ""; - if (r) { - const l = r === "r" ? "l" : "r"; - const rootClone = { ...target }; - const oldRootRight = target[r]; - target.from = oldRootRight.from; - target.to = oldRootRight.to; - target[r] = oldRootRight[r]; - rootClone[r] = oldRootRight[l]; - target[l] = rootClone; - rootClone.d = computeDepth(rootClone); - } - target.d = computeDepth(target); -} -function computeDepth({ r, l }) { - return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1; -} - -function extendObservabilitySet(target, newSet) { - keys(newSet).forEach(part => { - if (target[part]) - mergeRanges(target[part], newSet[part]); - else - target[part] = cloneSimpleObjectTree(newSet[part]); - }); - return target; -} - -function obsSetsOverlap(os1, os2) { - return os1.all || os2.all || Object.keys(os1).some((key) => os2[key] && rangesOverlap(os2[key], os1[key])); -} - -const cache = {}; - -let unsignaledParts = {}; -let isTaskEnqueued = false; -function signalSubscribersLazily(part, optimistic = false) { - extendObservabilitySet(unsignaledParts, part); - if (!isTaskEnqueued) { - isTaskEnqueued = true; - setTimeout(() => { - isTaskEnqueued = false; - const parts = unsignaledParts; - unsignaledParts = {}; - signalSubscribersNow(parts, false); - }, 0); - } -} -function signalSubscribersNow(updatedParts, deleteAffectedCacheEntries = false) { - const queriesToSignal = new Set(); - if (updatedParts.all) { - for (const tblCache of Object.values(cache)) { - collectTableSubscribers(tblCache, updatedParts, queriesToSignal, deleteAffectedCacheEntries); - } - } - else { - for (const key in updatedParts) { - const parts = /^idb\:\/\/(.*)\/(.*)\//.exec(key); - if (parts) { - const [, dbName, tableName] = parts; - const tblCache = cache[`idb://${dbName}/${tableName}`]; - if (tblCache) - collectTableSubscribers(tblCache, updatedParts, queriesToSignal, deleteAffectedCacheEntries); - } - } - } - queriesToSignal.forEach((requery) => requery()); -} -function collectTableSubscribers(tblCache, updatedParts, outQueriesToSignal, deleteAffectedCacheEntries) { - const updatedEntryLists = []; - for (const [indexName, entries] of Object.entries(tblCache.queries.query)) { - const filteredEntries = []; - for (const entry of entries) { - if (obsSetsOverlap(updatedParts, entry.obsSet)) { - entry.subscribers.forEach((requery) => outQueriesToSignal.add(requery)); - } - else if (deleteAffectedCacheEntries) { - filteredEntries.push(entry); - } - } - if (deleteAffectedCacheEntries) - updatedEntryLists.push([indexName, filteredEntries]); - } - if (deleteAffectedCacheEntries) { - for (const [indexName, filteredEntries] of updatedEntryLists) { - tblCache.queries.query[indexName] = filteredEntries; - } - } -} - -function dexieOpen(db) { - const state = db._state; - const { indexedDB } = db._deps; - if (state.isBeingOpened || db.idbdb) - return state.dbReadyPromise.then(() => state.dbOpenError ? - rejection(state.dbOpenError) : - db); - state.isBeingOpened = true; - state.dbOpenError = null; - state.openComplete = false; - const openCanceller = state.openCanceller; - let nativeVerToOpen = Math.round(db.verno * 10); - let schemaPatchMode = false; - function throwIfCancelled() { - if (state.openCanceller !== openCanceller) - throw new exceptions.DatabaseClosed('db.open() was cancelled'); - } - let resolveDbReady = state.dbReadyResolve, - upgradeTransaction = null, wasCreated = false; - const tryOpenDB = () => new DexiePromise((resolve, reject) => { - throwIfCancelled(); - if (!indexedDB) - throw new exceptions.MissingAPI(); - const dbName = db.name; - const req = state.autoSchema || !nativeVerToOpen ? - indexedDB.open(dbName) : - indexedDB.open(dbName, nativeVerToOpen); - if (!req) - throw new exceptions.MissingAPI(); - req.onerror = eventRejectHandler(reject); - req.onblocked = wrap(db._fireOnBlocked); - req.onupgradeneeded = wrap(e => { - upgradeTransaction = req.transaction; - if (state.autoSchema && !db._options.allowEmptyDB) { - req.onerror = preventDefault; - upgradeTransaction.abort(); - req.result.close(); - const delreq = indexedDB.deleteDatabase(dbName); - delreq.onsuccess = delreq.onerror = wrap(() => { - reject(new exceptions.NoSuchDatabase(`Database ${dbName} doesnt exist`)); - }); - } - else { - upgradeTransaction.onerror = eventRejectHandler(reject); - const oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; - wasCreated = oldVer < 1; - db.idbdb = req.result; - if (schemaPatchMode) { - patchCurrentVersion(db, upgradeTransaction); - } - runUpgraders(db, oldVer / 10, upgradeTransaction, reject); - } - }, reject); - req.onsuccess = wrap(() => { - upgradeTransaction = null; - const idbdb = db.idbdb = req.result; - const objectStoreNames = slice(idbdb.objectStoreNames); - if (objectStoreNames.length > 0) - try { - const tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly'); - if (state.autoSchema) - readGlobalSchema(db, idbdb, tmpTrans); - else { - adjustToExistingIndexNames(db, db._dbSchema, tmpTrans); - if (!verifyInstalledSchema(db, tmpTrans) && !schemaPatchMode) { - console.warn(`Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this.`); - idbdb.close(); - nativeVerToOpen = idbdb.version + 1; - schemaPatchMode = true; - return resolve(tryOpenDB()); - } - } - generateMiddlewareStacks(db, tmpTrans); - } - catch (e) { - } - connections.push(db); - idbdb.onversionchange = wrap(ev => { - state.vcFired = true; - db.on("versionchange").fire(ev); - }); - idbdb.onclose = wrap(ev => { - db.on("close").fire(ev); - }); - if (wasCreated) - _onDatabaseCreated(db._deps, dbName); - resolve(); - }, reject); - }).catch(err => { - switch (err?.name) { - case "UnknownError": - if (state.PR1398_maxLoop > 0) { - state.PR1398_maxLoop--; - console.warn('Dexie: Workaround for Chrome UnknownError on open()'); - return tryOpenDB(); - } - break; - case "VersionError": - if (nativeVerToOpen > 0) { - nativeVerToOpen = 0; - return tryOpenDB(); - } - break; - } - return DexiePromise.reject(err); - }); - return DexiePromise.race([ - openCanceller, - (typeof navigator === 'undefined' ? DexiePromise.resolve() : idbReady()).then(tryOpenDB) - ]).then(() => { - throwIfCancelled(); - state.onReadyBeingFired = []; - return DexiePromise.resolve(vip(() => db.on.ready.fire(db.vip))).then(function fireRemainders() { - if (state.onReadyBeingFired.length > 0) { - let remainders = state.onReadyBeingFired.reduce(promisableChain, nop); - state.onReadyBeingFired = []; - return DexiePromise.resolve(vip(() => remainders(db.vip))).then(fireRemainders); - } - }); - }).finally(() => { - if (state.openCanceller === openCanceller) { - state.onReadyBeingFired = null; - state.isBeingOpened = false; - } - }).catch(err => { - state.dbOpenError = err; - try { - upgradeTransaction && upgradeTransaction.abort(); - } - catch { } - if (openCanceller === state.openCanceller) { - db._close(); - } - return rejection(err); - }).finally(() => { - state.openComplete = true; - resolveDbReady(); - }).then(() => { - if (wasCreated) { - const everything = {}; - db.tables.forEach(table => { - table.schema.indexes.forEach(idx => { - if (idx.name) - everything[`idb://${db.name}/${table.name}/${idx.name}`] = new RangeSet(-Infinity, [[[]]]); - }); - everything[`idb://${db.name}/${table.name}/`] = everything[`idb://${db.name}/${table.name}/:dels`] = new RangeSet(-Infinity, [[[]]]); - }); - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME).fire(everything); - signalSubscribersNow(everything, true); - } - return db; - }); -} - -function awaitIterator(iterator) { - var callNext = result => iterator.next(result), doThrow = error => iterator.throw(error), onSuccess = step(callNext), onError = step(doThrow); - function step(getNext) { - return (val) => { - var next = getNext(val), value = next.value; - return next.done ? value : - (!value || typeof value.then !== 'function' ? - isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) : - value.then(onSuccess, onError)); - }; - } - return step(callNext)(); -} - -function extractTransactionArgs(mode, _tableArgs_, scopeFunc) { - var i = arguments.length; - if (i < 2) - throw new exceptions.InvalidArgument("Too few arguments"); - var args = new Array(i - 1); - while (--i) - args[i - 1] = arguments[i]; - scopeFunc = args.pop(); - var tables = flatten(args); - return [mode, tables, scopeFunc]; -} -function enterTransactionScope(db, mode, storeNames, parentTransaction, scopeFunc) { - return DexiePromise.resolve().then(() => { - const transless = PSD.transless || PSD; - const trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction); - trans.explicit = true; - const zoneProps = { - trans: trans, - transless: transless - }; - if (parentTransaction) { - trans.idbtrans = parentTransaction.idbtrans; - } - else { - try { - trans.create(); - trans.idbtrans._explicit = true; - db._state.PR1398_maxLoop = 3; - } - catch (ex) { - if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { - console.warn('Dexie: Need to reopen db'); - db.close({ disableAutoOpen: false }); - return db.open().then(() => enterTransactionScope(db, mode, storeNames, null, scopeFunc)); - } - return rejection(ex); - } - } - const scopeFuncIsAsync = isAsyncFunction(scopeFunc); - if (scopeFuncIsAsync) { - incrementExpectedAwaits(); - } - let returnValue; - const promiseFollowed = DexiePromise.follow(() => { - returnValue = scopeFunc.call(trans, trans); - if (returnValue) { - if (scopeFuncIsAsync) { - var decrementor = decrementExpectedAwaits.bind(null, null); - returnValue.then(decrementor, decrementor); - } - else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') { - returnValue = awaitIterator(returnValue); - } - } - }, zoneProps); - return (returnValue && typeof returnValue.then === 'function' ? - DexiePromise.resolve(returnValue).then(x => trans.active ? - x - : rejection(new exceptions.PrematureCommit("Transaction committed too early. See http://bit.ly/2kdckMn"))) - : promiseFollowed.then(() => returnValue)).then(x => { - if (parentTransaction) - trans._resolve(); - return trans._completion.then(() => x); - }).catch(e => { - trans._reject(e); - return rejection(e); - }); - }); -} - -function pad(a, value, count) { - const result = isArray(a) ? a.slice() : [a]; - for (let i = 0; i < count; ++i) - result.push(value); - return result; -} -function createVirtualIndexMiddleware(down) { - return { - ...down, - table(tableName) { - const table = down.table(tableName); - const { schema } = table; - const indexLookup = {}; - const allVirtualIndexes = []; - function addVirtualIndexes(keyPath, keyTail, lowLevelIndex) { - const keyPathAlias = getKeyPathAlias(keyPath); - const indexList = (indexLookup[keyPathAlias] = indexLookup[keyPathAlias] || []); - const keyLength = keyPath == null ? 0 : typeof keyPath === 'string' ? 1 : keyPath.length; - const isVirtual = keyTail > 0; - const virtualIndex = { - ...lowLevelIndex, - name: isVirtual - ? `${keyPathAlias}(virtual-from:${lowLevelIndex.name})` - : lowLevelIndex.name, - lowLevelIndex, - isVirtual, - keyTail, - keyLength, - extractKey: getKeyExtractor(keyPath), - unique: !isVirtual && lowLevelIndex.unique - }; - indexList.push(virtualIndex); - if (!virtualIndex.isPrimaryKey) { - allVirtualIndexes.push(virtualIndex); - } - if (keyLength > 1) { - const virtualKeyPath = keyLength === 2 ? - keyPath[0] : - keyPath.slice(0, keyLength - 1); - addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex); - } - indexList.sort((a, b) => a.keyTail - b.keyTail); - return virtualIndex; - } - const primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey); - indexLookup[":id"] = [primaryKey]; - for (const index of schema.indexes) { - addVirtualIndexes(index.keyPath, 0, index); - } - function findBestIndex(keyPath) { - const result = indexLookup[getKeyPathAlias(keyPath)]; - return result && result[0]; - } - function translateRange(range, keyTail) { - return { - type: range.type === 1 ? - 2 : - range.type, - lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail), - lowerOpen: true, - upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail), - upperOpen: true - }; - } - function translateRequest(req) { - const index = req.query.index; - return index.isVirtual ? { - ...req, - query: { - index: index.lowLevelIndex, - range: translateRange(req.query.range, index.keyTail) - } - } : req; - } - const result = { - ...table, - schema: { - ...schema, - primaryKey, - indexes: allVirtualIndexes, - getIndexByKeyPath: findBestIndex - }, - count(req) { - return table.count(translateRequest(req)); - }, - query(req) { - return table.query(translateRequest(req)); - }, - openCursor(req) { - const { keyTail, isVirtual, keyLength } = req.query.index; - if (!isVirtual) - return table.openCursor(req); - function createVirtualCursor(cursor) { - function _continue(key) { - key != null ? - cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) : - req.unique ? - cursor.continue(cursor.key.slice(0, keyLength) - .concat(req.reverse - ? down.MIN_KEY - : down.MAX_KEY, keyTail)) : - cursor.continue(); - } - const virtualCursor = Object.create(cursor, { - continue: { value: _continue }, - continuePrimaryKey: { - value(key, primaryKey) { - cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey); - } - }, - primaryKey: { - get() { - return cursor.primaryKey; - } - }, - key: { - get() { - const key = cursor.key; - return keyLength === 1 ? - key[0] : - key.slice(0, keyLength); - } - }, - value: { - get() { - return cursor.value; - } - } - }); - return virtualCursor; - } - return table.openCursor(translateRequest(req)) - .then(cursor => cursor && createVirtualCursor(cursor)); - } - }; - return result; - } - }; -} -const virtualIndexMiddleware = { - stack: "dbcore", - name: "VirtualIndexMiddleware", - level: 1, - create: createVirtualIndexMiddleware -}; - -function getObjectDiff(a, b, rv, prfx) { - rv = rv || {}; - prfx = prfx || ''; - keys(a).forEach((prop) => { - if (!hasOwn(b, prop)) { - rv[prfx + prop] = undefined; - } - else { - var ap = a[prop], bp = b[prop]; - if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) { - const apTypeName = toStringTag(ap); - const bpTypeName = toStringTag(bp); - if (apTypeName !== bpTypeName) { - rv[prfx + prop] = b[prop]; - } - else if (apTypeName === 'Object') { - getObjectDiff(ap, bp, rv, prfx + prop + '.'); - } - else if (ap !== bp) { - rv[prfx + prop] = b[prop]; - } - } - else if (ap !== bp) - rv[prfx + prop] = b[prop]; - } - }); - keys(b).forEach((prop) => { - if (!hasOwn(a, prop)) { - rv[prfx + prop] = b[prop]; - } - }); - return rv; -} - -function getEffectiveKeys(primaryKey, req) { - if (req.type === 'delete') - return req.keys; - return req.keys || req.values.map(primaryKey.extractKey); -} - -const hooksMiddleware = { - stack: "dbcore", - name: "HooksMiddleware", - level: 2, - create: (downCore) => ({ - ...downCore, - table(tableName) { - const downTable = downCore.table(tableName); - const { primaryKey } = downTable.schema; - const tableMiddleware = { - ...downTable, - mutate(req) { - const dxTrans = PSD.trans; - const { deleting, creating, updating } = dxTrans.table(tableName).hook; - switch (req.type) { - case 'add': - if (creating.fire === nop) - break; - return dxTrans._promise('readwrite', () => addPutOrDelete(req), true); - case 'put': - if (creating.fire === nop && updating.fire === nop) - break; - return dxTrans._promise('readwrite', () => addPutOrDelete(req), true); - case 'delete': - if (deleting.fire === nop) - break; - return dxTrans._promise('readwrite', () => addPutOrDelete(req), true); - case 'deleteRange': - if (deleting.fire === nop) - break; - return dxTrans._promise('readwrite', () => deleteRange(req), true); - } - return downTable.mutate(req); - function addPutOrDelete(req) { - const dxTrans = PSD.trans; - const keys = req.keys || getEffectiveKeys(primaryKey, req); - if (!keys) - throw new Error("Keys missing"); - req = req.type === 'add' || req.type === 'put' ? - { ...req, keys } : - { ...req }; - if (req.type !== 'delete') - req.values = [...req.values]; - if (req.keys) - req.keys = [...req.keys]; - return getExistingValues(downTable, req, keys).then(existingValues => { - const contexts = keys.map((key, i) => { - const existingValue = existingValues[i]; - const ctx = { onerror: null, onsuccess: null }; - if (req.type === 'delete') { - deleting.fire.call(ctx, key, existingValue, dxTrans); - } - else if (req.type === 'add' || existingValue === undefined) { - const generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans); - if (key == null && generatedPrimaryKey != null) { - key = generatedPrimaryKey; - req.keys[i] = key; - if (!primaryKey.outbound) { - setByKeyPath(req.values[i], primaryKey.keyPath, key); - } - } - } - else { - const objectDiff = getObjectDiff(existingValue, req.values[i]); - const additionalChanges = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans); - if (additionalChanges) { - const requestedValue = req.values[i]; - Object.keys(additionalChanges).forEach(keyPath => { - if (hasOwn(requestedValue, keyPath)) { - requestedValue[keyPath] = additionalChanges[keyPath]; - } - else { - setByKeyPath(requestedValue, keyPath, additionalChanges[keyPath]); - } - }); - } - } - return ctx; - }); - return downTable.mutate(req).then(({ failures, results, numFailures, lastResult }) => { - for (let i = 0; i < keys.length; ++i) { - const primKey = results ? results[i] : keys[i]; - const ctx = contexts[i]; - if (primKey == null) { - ctx.onerror && ctx.onerror(failures[i]); - } - else { - ctx.onsuccess && ctx.onsuccess(req.type === 'put' && existingValues[i] ? - req.values[i] : - primKey - ); - } - } - return { failures, results, numFailures, lastResult }; - }).catch(error => { - contexts.forEach(ctx => ctx.onerror && ctx.onerror(error)); - return Promise.reject(error); - }); - }); - } - function deleteRange(req) { - return deleteNextChunk(req.trans, req.range, 10000); - } - function deleteNextChunk(trans, range, limit) { - return downTable.query({ trans, values: false, query: { index: primaryKey, range }, limit }) - .then(({ result }) => { - return addPutOrDelete({ type: 'delete', keys: result, trans }).then(res => { - if (res.numFailures > 0) - return Promise.reject(res.failures[0]); - if (result.length < limit) { - return { failures: [], numFailures: 0, lastResult: undefined }; - } - else { - return deleteNextChunk(trans, { ...range, lower: result[result.length - 1], lowerOpen: true }, limit); - } - }); - }); - } - } - }; - return tableMiddleware; - }, - }) -}; -function getExistingValues(table, req, effectiveKeys) { - return req.type === "add" - ? Promise.resolve([]) - : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: "immutable" }); -} - -function getFromTransactionCache(keys, cache, clone) { - try { - if (!cache) - return null; - if (cache.keys.length < keys.length) - return null; - const result = []; - for (let i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) { - if (cmp(cache.keys[i], keys[j]) !== 0) - continue; - result.push(clone ? deepClone(cache.values[i]) : cache.values[i]); - ++j; - } - return result.length === keys.length ? result : null; - } - catch { - return null; - } -} -const cacheExistingValuesMiddleware = { - stack: "dbcore", - level: -1, - create: (core) => { - return { - table: (tableName) => { - const table = core.table(tableName); - return { - ...table, - getMany: (req) => { - if (!req.cache) { - return table.getMany(req); - } - const cachedResult = getFromTransactionCache(req.keys, req.trans["_cache"], req.cache === "clone"); - if (cachedResult) { - return DexiePromise.resolve(cachedResult); - } - return table.getMany(req).then((res) => { - req.trans["_cache"] = { - keys: req.keys, - values: req.cache === "clone" ? deepClone(res) : res, - }; - return res; - }); - }, - mutate: (req) => { - if (req.type !== "add") - req.trans["_cache"] = null; - return table.mutate(req); - }, - }; - }, - }; - }, -}; - -function isCachableContext(ctx, table) { - return (ctx.trans.mode === 'readonly' && - !!ctx.subscr && - !ctx.trans.explicit && - ctx.trans.db._options.cache !== 'disabled' && - !table.schema.primaryKey.outbound); -} - -function isCachableRequest(type, req) { - switch (type) { - case 'query': - return req.values && !req.unique; - case 'get': - return false; - case 'getMany': - return false; - case 'count': - return false; - case 'openCursor': - return false; - } -} - -const observabilityMiddleware = { - stack: "dbcore", - level: 0, - name: "Observability", - create: (core) => { - const dbName = core.schema.name; - const FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY); - return { - ...core, - transaction: (stores, mode, options) => { - if (PSD.subscr && mode !== 'readonly') { - throw new exceptions.ReadOnly(`Readwrite transaction in liveQuery context. Querier source: ${PSD.querier}`); - } - return core.transaction(stores, mode, options); - }, - table: (tableName) => { - const table = core.table(tableName); - const { schema } = table; - const { primaryKey, indexes } = schema; - const { extractKey, outbound } = primaryKey; - const indexesWithAutoIncPK = primaryKey.autoIncrement && indexes.filter((index) => index.compound && index.keyPath.includes(primaryKey.keyPath)); - const tableClone = { - ...table, - mutate: (req) => { - const trans = req.trans; - const mutatedParts = req.mutatedParts || (req.mutatedParts = {}); - const getRangeSet = (indexName) => { - const part = `idb://${dbName}/${tableName}/${indexName}`; - return (mutatedParts[part] || - (mutatedParts[part] = new RangeSet())); - }; - const pkRangeSet = getRangeSet(""); - const delsRangeSet = getRangeSet(":dels"); - const { type } = req; - let [keys, newObjs] = req.type === "deleteRange" - ? [req.range] - : req.type === "delete" - ? [req.keys] - : req.values.length < 50 - ? [getEffectiveKeys(primaryKey, req).filter(id => id), req.values] - : []; - const oldCache = req.trans["_cache"]; - if (isArray(keys)) { - pkRangeSet.addKeys(keys); - const oldObjs = type === 'delete' || keys.length === newObjs.length ? getFromTransactionCache(keys, oldCache) : null; - if (!oldObjs) { - delsRangeSet.addKeys(keys); - } - if (oldObjs || newObjs) { - trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs); - } - } - else if (keys) { - const range = { from: keys.lower, to: keys.upper }; - delsRangeSet.add(range); - pkRangeSet.add(range); - } - else { - pkRangeSet.add(FULL_RANGE); - delsRangeSet.add(FULL_RANGE); - schema.indexes.forEach(idx => getRangeSet(idx.name).add(FULL_RANGE)); - } - return table.mutate(req).then((res) => { - if (keys && (req.type === 'add' || req.type === 'put')) { - pkRangeSet.addKeys(res.results); - if (indexesWithAutoIncPK) { - indexesWithAutoIncPK.forEach(idx => { - const idxVals = req.values.map(v => idx.extractKey(v)); - const pkPos = idx.keyPath.findIndex(prop => prop === primaryKey.keyPath); - res.results.forEach(pk => idxVals[pkPos] = pk); - getRangeSet(idx.name).addKeys(idxVals); - }); - } - } - trans.mutatedParts = extendObservabilitySet(trans.mutatedParts || {}, mutatedParts); - return res; - }); - }, - }; - const getRange = ({ query: { index, range }, }) => [ - index, - new RangeSet(range.lower ?? core.MIN_KEY, range.upper ?? core.MAX_KEY), - ]; - const readSubscribers = { - get: (req) => [primaryKey, new RangeSet(req.key)], - getMany: (req) => [primaryKey, new RangeSet().addKeys(req.keys)], - count: getRange, - query: getRange, - openCursor: getRange, - }; - keys(readSubscribers).forEach((method) => { - tableClone[method] = function (req) { - const { subscr } = PSD; - const isLiveQuery = !!subscr; - let cachable = isCachableContext(PSD, table) && isCachableRequest(method, req); - const obsSet = cachable - ? req.obsSet = {} - : subscr; - if (isLiveQuery) { - const getRangeSet = (indexName) => { - const part = `idb://${dbName}/${tableName}/${indexName}`; - return (obsSet[part] || - (obsSet[part] = new RangeSet())); - }; - const pkRangeSet = getRangeSet(""); - const delsRangeSet = getRangeSet(":dels"); - const [queriedIndex, queriedRanges] = readSubscribers[method](req); - if (method === 'query' && queriedIndex.isPrimaryKey && !req.values) { - delsRangeSet.add(queriedRanges); - } - else { - getRangeSet(queriedIndex.name || "").add(queriedRanges); - } - if (!queriedIndex.isPrimaryKey) { - if (method === "count") { - delsRangeSet.add(FULL_RANGE); - } - else { - const keysPromise = method === "query" && - outbound && - req.values && - table.query({ - ...req, - values: false, - }); - return table[method].apply(this, arguments).then((res) => { - if (method === "query") { - if (outbound && req.values) { - return keysPromise.then(({ result: resultingKeys }) => { - pkRangeSet.addKeys(resultingKeys); - return res; - }); - } - const pKeys = req.values - ? res.result.map(extractKey) - : res.result; - if (req.values) { - pkRangeSet.addKeys(pKeys); - } - else { - delsRangeSet.addKeys(pKeys); - } - } - else if (method === "openCursor") { - const cursor = res; - const wantValues = req.values; - return (cursor && - Object.create(cursor, { - key: { - get() { - delsRangeSet.addKey(cursor.primaryKey); - return cursor.key; - }, - }, - primaryKey: { - get() { - const pkey = cursor.primaryKey; - delsRangeSet.addKey(pkey); - return pkey; - }, - }, - value: { - get() { - wantValues && pkRangeSet.addKey(cursor.primaryKey); - return cursor.value; - }, - }, - })); - } - return res; - }); - } - } - } - return table[method].apply(this, arguments); - }; - }); - return tableClone; - }, - }; - }, -}; -function trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs) { - function addAffectedIndex(ix) { - const rangeSet = getRangeSet(ix.name || ""); - function extractKey(obj) { - return obj != null ? ix.extractKey(obj) : null; - } - const addKeyOrKeys = (key) => ix.multiEntry && isArray(key) - ? key.forEach(key => rangeSet.addKey(key)) - : rangeSet.addKey(key); - (oldObjs || newObjs).forEach((_, i) => { - const oldKey = oldObjs && extractKey(oldObjs[i]); - const newKey = newObjs && extractKey(newObjs[i]); - if (cmp(oldKey, newKey) !== 0) { - if (oldKey != null) - addKeyOrKeys(oldKey); - if (newKey != null) - addKeyOrKeys(newKey); - } - }); - } - schema.indexes.forEach(addAffectedIndex); -} - -function adjustOptimisticFromFailures(tblCache, req, res) { - if (res.numFailures === 0) - return req; - if (req.type === 'deleteRange') { - return null; - } - const numBulkOps = req.keys - ? req.keys.length - : 'values' in req && req.values - ? req.values.length - : 1; - if (res.numFailures === numBulkOps) { - return null; - } - const clone = { ...req }; - if (isArray(clone.keys)) { - clone.keys = clone.keys.filter((_, i) => !(i in res.failures)); - } - if ('values' in clone && isArray(clone.values)) { - clone.values = clone.values.filter((_, i) => !(i in res.failures)); - } - return clone; -} - -function isAboveLower(key, range) { - return range.lower === undefined - ? true - : range.lowerOpen - ? cmp(key, range.lower) > 0 - : cmp(key, range.lower) >= 0; -} -function isBelowUpper(key, range) { - return range.upper === undefined - ? true - : range.upperOpen - ? cmp(key, range.upper) < 0 - : cmp(key, range.upper) <= 0; -} -function isWithinRange(key, range) { - return isAboveLower(key, range) && isBelowUpper(key, range); -} - -function applyOptimisticOps(result, req, ops, table, cacheEntry, immutable) { - if (!ops || ops.length === 0) - return result; - const index = req.query.index; - const { multiEntry } = index; - const queryRange = req.query.range; - const primaryKey = table.schema.primaryKey; - const extractPrimKey = primaryKey.extractKey; - const extractIndex = index.extractKey; - const extractLowLevelIndex = (index.lowLevelIndex || index).extractKey; - let finalResult = ops.reduce((result, op) => { - let modifedResult = result; - const includedValues = op.type === 'add' || op.type === 'put' - ? op.values.filter((v) => { - const key = extractIndex(v); - return multiEntry && isArray(key) - ? key.some((k) => isWithinRange(k, queryRange)) - : isWithinRange(key, queryRange); - }).map(v => { - v = deepClone(v); - if (immutable) - Object.freeze(v); - return v; - }) - : []; - switch (op.type) { - case 'add': - modifedResult = result.concat(req.values - ? includedValues - : includedValues.map((v) => extractPrimKey(v))); - break; - case 'put': - const keySet = new RangeSet().addKeys(op.values.map((v) => extractPrimKey(v))); - modifedResult = result - .filter((item) => { - const key = req.values ? extractPrimKey(item) : item; - return !rangesOverlap(new RangeSet(key), keySet); - }) - .concat(req.values - ? includedValues - : includedValues.map((v) => extractPrimKey(v))); - break; - case 'delete': - const keysToDelete = new RangeSet().addKeys(op.keys); - modifedResult = result.filter((item) => { - const key = req.values ? extractPrimKey(item) : item; - return !rangesOverlap(new RangeSet(key), keysToDelete); - }); - break; - case 'deleteRange': - const range = op.range; - modifedResult = result.filter((item) => !isWithinRange(extractPrimKey(item), range)); - break; - } - return modifedResult; - }, result); - if (finalResult === result) - return result; - finalResult.sort((a, b) => cmp(extractLowLevelIndex(a), extractLowLevelIndex(b)) || - cmp(extractPrimKey(a), extractPrimKey(b))); - if (req.limit && req.limit < Infinity) { - if (finalResult.length > req.limit) { - finalResult.length = req.limit; - } - else if (result.length === req.limit && finalResult.length < req.limit) { - cacheEntry.dirty = true; - } - } - return immutable ? Object.freeze(finalResult) : finalResult; -} - -function areRangesEqual(r1, r2) { - return (cmp(r1.lower, r2.lower) === 0 && - cmp(r1.upper, r2.upper) === 0 && - !!r1.lowerOpen === !!r2.lowerOpen && - !!r1.upperOpen === !!r2.upperOpen); -} - -function compareLowers(lower1, lower2, lowerOpen1, lowerOpen2) { - if (lower1 === undefined) - return lower2 !== undefined ? -1 : 0; - if (lower2 === undefined) - return 1; - const c = cmp(lower1, lower2); - if (c === 0) { - if (lowerOpen1 && lowerOpen2) - return 0; - if (lowerOpen1) - return 1; - if (lowerOpen2) - return -1; - } - return c; -} -function compareUppers(upper1, upper2, upperOpen1, upperOpen2) { - if (upper1 === undefined) - return upper2 !== undefined ? 1 : 0; - if (upper2 === undefined) - return -1; - const c = cmp(upper1, upper2); - if (c === 0) { - if (upperOpen1 && upperOpen2) - return 0; - if (upperOpen1) - return -1; - if (upperOpen2) - return 1; - } - return c; -} -function isSuperRange(r1, r2) { - return (compareLowers(r1.lower, r2.lower, r1.lowerOpen, r2.lowerOpen) <= 0 && - compareUppers(r1.upper, r2.upper, r1.upperOpen, r2.upperOpen) >= 0); -} - -function findCompatibleQuery(dbName, tableName, type, req) { - const tblCache = cache[`idb://${dbName}/${tableName}`]; - if (!tblCache) - return []; - const queries = tblCache.queries[type]; - if (!queries) - return [null, false, tblCache, null]; - const indexName = req.query ? req.query.index.name : null; - const entries = queries[indexName || '']; - if (!entries) - return [null, false, tblCache, null]; - switch (type) { - case 'query': - const equalEntry = entries.find((entry) => entry.req.limit === req.limit && - entry.req.values === req.values && - areRangesEqual(entry.req.query.range, req.query.range)); - if (equalEntry) - return [ - equalEntry, - true, - tblCache, - entries, - ]; - const superEntry = entries.find((entry) => { - const limit = 'limit' in entry.req ? entry.req.limit : Infinity; - return (limit >= req.limit && - (req.values ? entry.req.values : true) && - isSuperRange(entry.req.query.range, req.query.range)); - }); - return [superEntry, false, tblCache, entries]; - case 'count': - const countQuery = entries.find((entry) => areRangesEqual(entry.req.query.range, req.query.range)); - return [countQuery, !!countQuery, tblCache, entries]; - } -} - -function subscribeToCacheEntry(cacheEntry, container, requery, signal) { - cacheEntry.subscribers.add(requery); - signal.addEventListener("abort", () => { - cacheEntry.subscribers.delete(requery); - if (cacheEntry.subscribers.size === 0) { - enqueForDeletion(cacheEntry, container); - } - }); -} -function enqueForDeletion(cacheEntry, container) { - setTimeout(() => { - if (cacheEntry.subscribers.size === 0) { - delArrayItem(container, cacheEntry); - } - }, 3000); -} - -const cacheMiddleware = { - stack: 'dbcore', - level: 0, - name: 'Cache', - create: (core) => { - const dbName = core.schema.name; - const coreMW = { - ...core, - transaction: (stores, mode, options) => { - const idbtrans = core.transaction(stores, mode, options); - if (mode === 'readwrite') { - const ac = new AbortController(); - const { signal } = ac; - const endTransaction = (wasCommitted) => () => { - ac.abort(); - if (mode === 'readwrite') { - const affectedSubscribers = new Set(); - for (const storeName of stores) { - const tblCache = cache[`idb://${dbName}/${storeName}`]; - if (tblCache) { - const table = core.table(storeName); - const ops = tblCache.optimisticOps.filter((op) => op.trans === idbtrans); - if (idbtrans._explicit && wasCommitted && idbtrans.mutatedParts) { - for (const entries of Object.values(tblCache.queries.query)) { - for (const entry of entries.slice()) { - if (obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)) { - delArrayItem(entries, entry); - entry.subscribers.forEach((requery) => affectedSubscribers.add(requery)); - } - } - } - } - else if (ops.length > 0) { - tblCache.optimisticOps = tblCache.optimisticOps.filter((op) => op.trans !== idbtrans); - for (const entries of Object.values(tblCache.queries.query)) { - for (const entry of entries.slice()) { - if (entry.res != null && - idbtrans.mutatedParts -) { - if (wasCommitted && !entry.dirty) { - const freezeResults = Object.isFrozen(entry.res); - const modRes = applyOptimisticOps(entry.res, entry.req, ops, table, entry, freezeResults); - if (entry.dirty) { - delArrayItem(entries, entry); - entry.subscribers.forEach((requery) => affectedSubscribers.add(requery)); - } - else if (modRes !== entry.res) { - entry.res = modRes; - entry.promise = DexiePromise.resolve({ result: modRes }); - } - } - else { - if (entry.dirty) { - delArrayItem(entries, entry); - } - entry.subscribers.forEach((requery) => affectedSubscribers.add(requery)); - } - } - } - } - } - } - } - affectedSubscribers.forEach((requery) => requery()); - } - }; - idbtrans.addEventListener('abort', endTransaction(false), { - signal, - }); - idbtrans.addEventListener('error', endTransaction(false), { - signal, - }); - idbtrans.addEventListener('complete', endTransaction(true), { - signal, - }); - } - return idbtrans; - }, - table(tableName) { - const downTable = core.table(tableName); - const primKey = downTable.schema.primaryKey; - const tableMW = { - ...downTable, - mutate(req) { - const trans = PSD.trans; - if (primKey.outbound || - trans.db._options.cache === 'disabled' || - trans.explicit - ) { - return downTable.mutate(req); - } - const tblCache = cache[`idb://${dbName}/${tableName}`]; - if (!tblCache) - return downTable.mutate(req); - const promise = downTable.mutate(req); - if ((req.type === 'add' || req.type === 'put') && (req.values.length >= 50 || getEffectiveKeys(primKey, req).some(key => key == null))) { - promise.then((res) => { - const reqWithResolvedKeys = { - ...req, - values: req.values.map((value, i) => { - const valueWithKey = primKey.keyPath?.includes('.') - ? deepClone(value) - : { - ...value, - }; - setByKeyPath(valueWithKey, primKey.keyPath, res.results[i]); - return valueWithKey; - }) - }; - const adjustedReq = adjustOptimisticFromFailures(tblCache, reqWithResolvedKeys, res); - tblCache.optimisticOps.push(adjustedReq); - queueMicrotask(() => req.mutatedParts && signalSubscribersLazily(req.mutatedParts)); - }); - } - else { - tblCache.optimisticOps.push(req); - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - promise.then((res) => { - if (res.numFailures > 0) { - delArrayItem(tblCache.optimisticOps, req); - const adjustedReq = adjustOptimisticFromFailures(tblCache, req, res); - if (adjustedReq) { - tblCache.optimisticOps.push(adjustedReq); - } - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - } - }); - promise.catch(() => { - delArrayItem(tblCache.optimisticOps, req); - req.mutatedParts && signalSubscribersLazily(req.mutatedParts); - }); - } - return promise; - }, - query(req) { - if (!isCachableContext(PSD, downTable) || !isCachableRequest("query", req)) - return downTable.query(req); - const freezeResults = PSD.trans?.db._options.cache === 'immutable'; - const { requery, signal } = PSD; - let [cacheEntry, exactMatch, tblCache, container] = findCompatibleQuery(dbName, tableName, 'query', req); - if (cacheEntry && exactMatch) { - cacheEntry.obsSet = req.obsSet; - } - else { - const promise = downTable.query(req).then((res) => { - const result = res.result; - if (cacheEntry) - cacheEntry.res = result; - if (freezeResults) { - for (let i = 0, l = result.length; i < l; ++i) { - Object.freeze(result[i]); - } - Object.freeze(result); - } - else { - res.result = deepClone(result); - } - return res; - }).catch(error => { - if (container && cacheEntry) - delArrayItem(container, cacheEntry); - return Promise.reject(error); - }); - cacheEntry = { - obsSet: req.obsSet, - promise, - subscribers: new Set(), - type: 'query', - req, - dirty: false, - }; - if (container) { - container.push(cacheEntry); - } - else { - container = [cacheEntry]; - if (!tblCache) { - tblCache = cache[`idb://${dbName}/${tableName}`] = { - queries: { - query: {}, - count: {}, - }, - objs: new Map(), - optimisticOps: [], - unsignaledParts: {} - }; - } - tblCache.queries.query[req.query.index.name || ''] = container; - } - } - subscribeToCacheEntry(cacheEntry, container, requery, signal); - return cacheEntry.promise.then((res) => { - return { - result: applyOptimisticOps(res.result, req, tblCache?.optimisticOps, downTable, cacheEntry, freezeResults), - }; - }); - }, - }; - return tableMW; - }, - }; - return coreMW; - }, -}; - -function vipify(target, vipDb) { - return new Proxy(target, { - get(target, prop, receiver) { - if (prop === 'db') - return vipDb; - return Reflect.get(target, prop, receiver); - } - }); -} - -class Dexie$1 { - constructor(name, options) { - this._middlewares = {}; - this.verno = 0; - const deps = Dexie$1.dependencies; - this._options = options = { - addons: Dexie$1.addons, - autoOpen: true, - indexedDB: deps.indexedDB, - IDBKeyRange: deps.IDBKeyRange, - cache: 'cloned', - ...options - }; - this._deps = { - indexedDB: options.indexedDB, - IDBKeyRange: options.IDBKeyRange - }; - const { addons, } = options; - this._dbSchema = {}; - this._versions = []; - this._storeNames = []; - this._allTables = {}; - this.idbdb = null; - this._novip = this; - const state = { - dbOpenError: null, - isBeingOpened: false, - onReadyBeingFired: null, - openComplete: false, - dbReadyResolve: nop, - dbReadyPromise: null, - cancelOpen: nop, - openCanceller: null, - autoSchema: true, - PR1398_maxLoop: 3, - autoOpen: options.autoOpen, - }; - state.dbReadyPromise = new DexiePromise(resolve => { - state.dbReadyResolve = resolve; - }); - state.openCanceller = new DexiePromise((_, reject) => { - state.cancelOpen = reject; - }); - this._state = state; - this.name = name; - this.on = Events(this, "populate", "blocked", "versionchange", "close", { ready: [promisableChain, nop] }); - this.on.ready.subscribe = override(this.on.ready.subscribe, subscribe => { - return (subscriber, bSticky) => { - Dexie$1.vip(() => { - const state = this._state; - if (state.openComplete) { - if (!state.dbOpenError) - DexiePromise.resolve().then(subscriber); - if (bSticky) - subscribe(subscriber); - } - else if (state.onReadyBeingFired) { - state.onReadyBeingFired.push(subscriber); - if (bSticky) - subscribe(subscriber); - } - else { - subscribe(subscriber); - const db = this; - if (!bSticky) - subscribe(function unsubscribe() { - db.on.ready.unsubscribe(subscriber); - db.on.ready.unsubscribe(unsubscribe); - }); - } - }); - }; - }); - this.Collection = createCollectionConstructor(this); - this.Table = createTableConstructor(this); - this.Transaction = createTransactionConstructor(this); - this.Version = createVersionConstructor(this); - this.WhereClause = createWhereClauseConstructor(this); - this.on("versionchange", ev => { - if (ev.newVersion > 0) - console.warn(`Another connection wants to upgrade database '${this.name}'. Closing db now to resume the upgrade.`); - else - console.warn(`Another connection wants to delete database '${this.name}'. Closing db now to resume the delete request.`); - this.close({ disableAutoOpen: false }); - }); - this.on("blocked", ev => { - if (!ev.newVersion || ev.newVersion < ev.oldVersion) - console.warn(`Dexie.delete('${this.name}') was blocked`); - else - console.warn(`Upgrade '${this.name}' blocked by other connection holding version ${ev.oldVersion / 10}`); - }); - this._maxKey = getMaxKey(options.IDBKeyRange); - this._createTransaction = (mode, storeNames, dbschema, parentTransaction) => new this.Transaction(mode, storeNames, dbschema, this._options.chromeTransactionDurability, parentTransaction); - this._fireOnBlocked = ev => { - this.on("blocked").fire(ev); - connections - .filter(c => c.name === this.name && c !== this && !c._state.vcFired) - .map(c => c.on("versionchange").fire(ev)); - }; - this.use(cacheExistingValuesMiddleware); - this.use(cacheMiddleware); - this.use(observabilityMiddleware); - this.use(virtualIndexMiddleware); - this.use(hooksMiddleware); - const vipDB = new Proxy(this, { - get: (_, prop, receiver) => { - if (prop === '_vip') - return true; - if (prop === 'table') - return (tableName) => vipify(this.table(tableName), vipDB); - const rv = Reflect.get(_, prop, receiver); - if (rv instanceof Table) - return vipify(rv, vipDB); - if (prop === 'tables') - return rv.map(t => vipify(t, vipDB)); - if (prop === '_createTransaction') - return function () { - const tx = rv.apply(this, arguments); - return vipify(tx, vipDB); - }; - return rv; - } - }); - this.vip = vipDB; - addons.forEach(addon => addon(this)); - } - version(versionNumber) { - if (isNaN(versionNumber) || versionNumber < 0.1) - throw new exceptions.Type(`Given version is not a positive number`); - versionNumber = Math.round(versionNumber * 10) / 10; - if (this.idbdb || this._state.isBeingOpened) - throw new exceptions.Schema("Cannot add version when database is open"); - this.verno = Math.max(this.verno, versionNumber); - const versions = this._versions; - var versionInstance = versions.filter(v => v._cfg.version === versionNumber)[0]; - if (versionInstance) - return versionInstance; - versionInstance = new this.Version(versionNumber); - versions.push(versionInstance); - versions.sort(lowerVersionFirst); - versionInstance.stores({}); - this._state.autoSchema = false; - return versionInstance; - } - _whenReady(fn) { - return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new DexiePromise((resolve, reject) => { - if (this._state.openComplete) { - return reject(new exceptions.DatabaseClosed(this._state.dbOpenError)); - } - if (!this._state.isBeingOpened) { - if (!this._state.autoOpen) { - reject(new exceptions.DatabaseClosed()); - return; - } - this.open().catch(nop); - } - this._state.dbReadyPromise.then(resolve, reject); - }).then(fn); - } - use({ stack, create, level, name }) { - if (name) - this.unuse({ stack, name }); - const middlewares = this._middlewares[stack] || (this._middlewares[stack] = []); - middlewares.push({ stack, create, level: level == null ? 10 : level, name }); - middlewares.sort((a, b) => a.level - b.level); - return this; - } - unuse({ stack, name, create }) { - if (stack && this._middlewares[stack]) { - this._middlewares[stack] = this._middlewares[stack].filter(mw => create ? mw.create !== create : - name ? mw.name !== name : - false); - } - return this; - } - open() { - return usePSD(globalPSD, - () => dexieOpen(this)); - } - _close() { - const state = this._state; - const idx = connections.indexOf(this); - if (idx >= 0) - connections.splice(idx, 1); - if (this.idbdb) { - try { - this.idbdb.close(); - } - catch (e) { } - this.idbdb = null; - } - if (!state.isBeingOpened) { - state.dbReadyPromise = new DexiePromise(resolve => { - state.dbReadyResolve = resolve; - }); - state.openCanceller = new DexiePromise((_, reject) => { - state.cancelOpen = reject; - }); - } - } - close({ disableAutoOpen } = { disableAutoOpen: true }) { - const state = this._state; - if (disableAutoOpen) { - if (state.isBeingOpened) { - state.cancelOpen(new exceptions.DatabaseClosed()); - } - this._close(); - state.autoOpen = false; - state.dbOpenError = new exceptions.DatabaseClosed(); - } - else { - this._close(); - state.autoOpen = this._options.autoOpen || - state.isBeingOpened; - state.openComplete = false; - state.dbOpenError = null; - } - } - delete(closeOptions = { disableAutoOpen: true }) { - const hasInvalidArguments = arguments.length > 0 && typeof arguments[0] !== 'object'; - const state = this._state; - return new DexiePromise((resolve, reject) => { - const doDelete = () => { - this.close(closeOptions); - var req = this._deps.indexedDB.deleteDatabase(this.name); - req.onsuccess = wrap(() => { - _onDatabaseDeleted(this._deps, this.name); - resolve(); - }); - req.onerror = eventRejectHandler(reject); - req.onblocked = this._fireOnBlocked; - }; - if (hasInvalidArguments) - throw new exceptions.InvalidArgument("Invalid closeOptions argument to db.delete()"); - if (state.isBeingOpened) { - state.dbReadyPromise.then(doDelete); - } - else { - doDelete(); - } - }); - } - backendDB() { - return this.idbdb; - } - isOpen() { - return this.idbdb !== null; - } - hasBeenClosed() { - const dbOpenError = this._state.dbOpenError; - return dbOpenError && (dbOpenError.name === 'DatabaseClosed'); - } - hasFailed() { - return this._state.dbOpenError !== null; - } - dynamicallyOpened() { - return this._state.autoSchema; - } - get tables() { - return keys(this._allTables).map(name => this._allTables[name]); - } - transaction() { - const args = extractTransactionArgs.apply(this, arguments); - return this._transaction.apply(this, args); - } - _transaction(mode, tables, scopeFunc) { - let parentTransaction = PSD.trans; - if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) - parentTransaction = null; - const onlyIfCompatible = mode.indexOf('?') !== -1; - mode = mode.replace('!', '').replace('?', ''); - let idbMode, storeNames; - try { - storeNames = tables.map(table => { - var storeName = table instanceof this.Table ? table.name : table; - if (typeof storeName !== 'string') - throw new TypeError("Invalid table argument to Dexie.transaction(). Only Table or String are allowed"); - return storeName; - }); - if (mode == "r" || mode === READONLY) - idbMode = READONLY; - else if (mode == "rw" || mode == READWRITE) - idbMode = READWRITE; - else - throw new exceptions.InvalidArgument("Invalid transaction mode: " + mode); - if (parentTransaction) { - if (parentTransaction.mode === READONLY && idbMode === READWRITE) { - if (onlyIfCompatible) { - parentTransaction = null; - } - else - throw new exceptions.SubTransaction("Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY"); - } - if (parentTransaction) { - storeNames.forEach(storeName => { - if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) { - if (onlyIfCompatible) { - parentTransaction = null; - } - else - throw new exceptions.SubTransaction("Table " + storeName + - " not included in parent transaction."); - } - }); - } - if (onlyIfCompatible && parentTransaction && !parentTransaction.active) { - parentTransaction = null; - } - } - } - catch (e) { - return parentTransaction ? - parentTransaction._promise(null, (_, reject) => { reject(e); }) : - rejection(e); - } - const enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc); - return (parentTransaction ? - parentTransaction._promise(idbMode, enterTransaction, "lock") : - PSD.trans ? - usePSD(PSD.transless, () => this._whenReady(enterTransaction)) : - this._whenReady(enterTransaction)); - } - table(tableName) { - if (!hasOwn(this._allTables, tableName)) { - throw new exceptions.InvalidTable(`Table ${tableName} does not exist`); - } - return this._allTables[tableName]; - } -} - -const symbolObservable = typeof Symbol !== "undefined" && "observable" in Symbol - ? Symbol.observable - : "@@observable"; -class Observable { - constructor(subscribe) { - this._subscribe = subscribe; - } - subscribe(x, error, complete) { - return this._subscribe(!x || typeof x === "function" ? { next: x, error, complete } : x); - } - [symbolObservable]() { - return this; - } -} - -let domDeps; -try { - domDeps = { - indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB, - IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange - }; -} -catch (e) { - domDeps = { indexedDB: null, IDBKeyRange: null }; -} - -function liveQuery(querier) { - let hasValue = false; - let currentValue; - const observable = new Observable((observer) => { - const scopeFuncIsAsync = isAsyncFunction(querier); - function execute(ctx) { - const wasRootExec = beginMicroTickScope(); - try { - if (scopeFuncIsAsync) { - incrementExpectedAwaits(); - } - let rv = newScope(querier, ctx); - if (scopeFuncIsAsync) { - rv = rv.finally(decrementExpectedAwaits); - } - return rv; - } - finally { - wasRootExec && endMicroTickScope(); - } - } - let closed = false; - let abortController; - let accumMuts = {}; - let currentObs = {}; - const subscription = { - get closed() { - return closed; - }, - unsubscribe: () => { - if (closed) - return; - closed = true; - if (abortController) - abortController.abort(); - if (startedListening) - globalEvents.storagemutated.unsubscribe(mutationListener); - }, - }; - observer.start && observer.start(subscription); - let startedListening = false; - const doQuery = () => execInGlobalContext(_doQuery); - function shouldNotify() { - return obsSetsOverlap(currentObs, accumMuts); - } - const mutationListener = (parts) => { - extendObservabilitySet(accumMuts, parts); - if (shouldNotify()) { - doQuery(); - } - }; - const _doQuery = () => { - if (closed || - !domDeps.indexedDB) - { - return; - } - accumMuts = {}; - const subscr = {}; - if (abortController) - abortController.abort(); - abortController = new AbortController(); - const ctx = { - subscr, - signal: abortController.signal, - requery: doQuery, - querier, - trans: null - }; - const ret = execute(ctx); - Promise.resolve(ret).then((result) => { - hasValue = true; - currentValue = result; - if (closed || ctx.signal.aborted) { - return; - } - accumMuts = {}; - currentObs = subscr; - if (!objectIsEmpty(currentObs) && !startedListening) { - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener); - startedListening = true; - } - execInGlobalContext(() => !closed && observer.next && observer.next(result)); - }, (err) => { - hasValue = false; - if (!['DatabaseClosedError', 'AbortError'].includes(err?.name)) { - if (!closed) - execInGlobalContext(() => { - if (closed) - return; - observer.error && observer.error(err); - }); - } - }); - }; - setTimeout(doQuery, 0); - return subscription; - }); - observable.hasValue = () => hasValue; - observable.getValue = () => currentValue; - return observable; -} - -const Dexie = Dexie$1; -props(Dexie, { - ...fullNameExceptions, - delete(databaseName) { - const db = new Dexie(databaseName, { addons: [] }); - return db.delete(); - }, - exists(name) { - return new Dexie(name, { addons: [] }).open().then(db => { - db.close(); - return true; - }).catch('NoSuchDatabaseError', () => false); - }, - getDatabaseNames(cb) { - try { - return getDatabaseNames(Dexie.dependencies).then(cb); - } - catch { - return rejection(new exceptions.MissingAPI()); - } - }, - defineClass() { - function Class(content) { - extend(this, content); - } - return Class; - }, - ignoreTransaction(scopeFunc) { - return PSD.trans ? - usePSD(PSD.transless, scopeFunc) : - scopeFunc(); - }, - vip, - async: function (generatorFn) { - return function () { - try { - var rv = awaitIterator(generatorFn.apply(this, arguments)); - if (!rv || typeof rv.then !== 'function') - return DexiePromise.resolve(rv); - return rv; - } - catch (e) { - return rejection(e); - } - }; - }, - spawn: function (generatorFn, args, thiz) { - try { - var rv = awaitIterator(generatorFn.apply(thiz, args || [])); - if (!rv || typeof rv.then !== 'function') - return DexiePromise.resolve(rv); - return rv; - } - catch (e) { - return rejection(e); - } - }, - currentTransaction: { - get: () => PSD.trans || null - }, - waitFor: function (promiseOrFunction, optionalTimeout) { - const promise = DexiePromise.resolve(typeof promiseOrFunction === 'function' ? - Dexie.ignoreTransaction(promiseOrFunction) : - promiseOrFunction) - .timeout(optionalTimeout || 60000); - return PSD.trans ? - PSD.trans.waitFor(promise) : - promise; - }, - Promise: DexiePromise, - debug: { - get: () => debug, - set: value => { - setDebug(value); - } - }, - derive: derive, - extend: extend, - props: props, - override: override, - Events: Events, - on: globalEvents, - liveQuery, - extendObservabilitySet, - getByKeyPath: getByKeyPath, - setByKeyPath: setByKeyPath, - delByKeyPath: delByKeyPath, - shallowClone: shallowClone, - deepClone: deepClone, - getObjectDiff: getObjectDiff, - cmp, - asap: asap$1, - minKey: minKey, - addons: [], - connections: connections, - errnames: errnames, - dependencies: domDeps, - cache, - semVer: DEXIE_VERSION, - version: DEXIE_VERSION.split('.') - .map(n => parseInt(n)) - .reduce((p, c, i) => p + (c / Math.pow(10, i * 2))), -}); -Dexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange); - -if (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') { - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, updatedParts => { - if (!propagatingLocally) { - let event; - event = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, { - detail: updatedParts - }); - propagatingLocally = true; - dispatchEvent(event); - propagatingLocally = false; - } - }); - addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, ({ detail }) => { - if (!propagatingLocally) { - propagateLocally(detail); - } - }); -} -function propagateLocally(updateParts) { - let wasMe = propagatingLocally; - try { - propagatingLocally = true; - globalEvents.storagemutated.fire(updateParts); - signalSubscribersNow(updateParts, true); - } - finally { - propagatingLocally = wasMe; - } -} -let propagatingLocally = false; - -let bc; -let createBC = () => { }; -if (typeof BroadcastChannel !== 'undefined') { - createBC = () => { - bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME); - bc.onmessage = ev => ev.data && propagateLocally(ev.data); - }; - createBC(); - if (typeof bc.unref === 'function') { - bc.unref(); - } - globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, (changedParts) => { - if (!propagatingLocally) { - bc.postMessage(changedParts); - } - }); -} - -if (typeof addEventListener !== 'undefined') { - addEventListener('pagehide', (event) => { - if (!Dexie$1.disableBfCache && event.persisted) { - if (debug) - console.debug('Dexie: handling persisted pagehide'); - bc?.close(); - for (const db of connections) { - db.close({ disableAutoOpen: false }); - } - } - }); - addEventListener('pageshow', (event) => { - if (!Dexie$1.disableBfCache && event.persisted) { - if (debug) - console.debug('Dexie: handling persisted pageshow'); - createBC(); - propagateLocally({ all: new RangeSet(-Infinity, [[]]) }); - } - }); -} - -function add(value) { - return new PropModification({ add: value }); -} - -function remove(value) { - return new PropModification({ remove: value }); -} - -function replacePrefix(a, b) { - return new PropModification({ replacePrefix: [a, b] }); -} - -DexiePromise.rejectionMapper = mapError; -setDebug(debug); - -export { Dexie$1 as Dexie, Entity, PropModSymbol, PropModification, RangeSet, add, cmp, Dexie$1 as default, liveQuery, mergeRanges, rangesOverlap, remove, replacePrefix }; -//# sourceMappingURL=dexie.mjs.map diff --git a/src/dexie/dist/modern/dexie.mjs.map b/src/dexie/dist/modern/dexie.mjs.map deleted file mode 100644 index b9194d77e..000000000 --- a/src/dexie/dist/modern/dexie.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dexie.mjs","sources":["../../src/globals/global.ts","../../src/functions/utils.ts","../../src/errors/errors.js","../../src/functions/chaining-functions.js","../../src/helpers/debug.ts","../../src/helpers/promise.js","../../src/functions/temp-transaction.ts","../../src/globals/constants.ts","../../src/functions/combine.ts","../../src/dbcore/keyrange.ts","../../src/functions/workaround-undefined-primkey.ts","../../src/classes/entity/Entity.ts","../../src/functions/cmp.ts","../../src/classes/table/table.ts","../../src/helpers/Events.js","../../src/functions/make-class-constructor.ts","../../src/classes/table/table-constructor.ts","../../src/classes/collection/collection-helpers.ts","../../src/helpers/prop-modification.ts","../../src/classes/collection/collection.ts","../../src/classes/collection/collection-constructor.ts","../../src/functions/compare-functions.ts","../../src/classes/where-clause/where-clause-helpers.ts","../../src/classes/where-clause/where-clause.ts","../../src/classes/where-clause/where-clause-constructor.ts","../../src/functions/event-wrappers.ts","../../src/globals/global-events.ts","../../src/classes/transaction/transaction.ts","../../src/classes/transaction/transaction-constructor.ts","../../src/helpers/index-spec.ts","../../src/helpers/table-schema.ts","../../src/functions/quirks.ts","../../src/dbcore/get-key-extractor.ts","../../src/dbcore/dbcore-indexeddb.ts","../../src/classes/dexie/generate-middleware-stacks.ts","../../src/classes/version/schema-helpers.ts","../../src/classes/version/version.ts","../../src/classes/version/version-constructor.ts","../../src/helpers/database-enumerator.ts","../../src/classes/dexie/vip.ts","../../node_modules/.pnpm/safari-14-idb-fix@3.0.0/node_modules/safari-14-idb-fix/dist/index.js","../../src/helpers/rangeset.ts","../../src/live-query/extend-observability-set.ts","../../src/live-query/obs-sets-overlap.ts","../../src/live-query/cache/cache.ts","../../src/live-query/cache/signalSubscribers.ts","../../src/classes/dexie/dexie-open.ts","../../src/helpers/yield-support.ts","../../src/classes/dexie/transaction-helpers.ts","../../src/dbcore/virtual-index-middleware.ts","../../src/functions/get-object-diff.ts","../../src/dbcore/get-effective-keys.ts","../../src/hooks/hooks-middleware.ts","../../src/dbcore/cache-existing-values-middleware.ts","../../src/live-query/cache/is-cachable-context.ts","../../src/live-query/cache/is-cachable-request.ts","../../src/live-query/observability-middleware.ts","../../src/live-query/cache/adjust-optimistic-request-from-failures.ts","../../src/live-query/cache/is-within-range.ts","../../src/live-query/cache/apply-optimistic-ops.ts","../../src/live-query/cache/are-ranges-equal.ts","../../src/live-query/cache/is-super-range.ts","../../src/live-query/cache/find-compatible-query.ts","../../src/live-query/cache/subscribe-cachentry.ts","../../src/live-query/cache/cache-middleware.ts","../../src/helpers/vipify.ts","../../src/classes/dexie/dexie.ts","../../src/classes/observable/observable.ts","../../src/classes/dexie/dexie-dom-dependencies.ts","../../src/live-query/live-query.ts","../../src/classes/dexie/dexie-static-props.ts","../../src/live-query/propagate-locally.ts","../../src/live-query/enable-broadcast.ts","../../src/support-bfcache.ts","../../src/functions/propmods/add.ts","../../src/functions/propmods/remove.ts","../../src/functions/propmods/replace-prefix.ts","../../src/index.ts"],"sourcesContent":["declare var global;\nexport const _global: any =\n typeof globalThis !== 'undefined' ? globalThis :\n typeof self !== 'undefined' ? self :\n typeof window !== 'undefined' ? window :\n global;\n","import { _global } from \"../globals/global\";\nexport const keys = Object.keys;\nexport const isArray = Array.isArray;\nif (typeof Promise !== 'undefined' && !_global.Promise){\n // In jsdom, this it can be the case that Promise is not put on the global object.\n // If so, we need to patch the global object for the rest of the code to work as expected.\n // Other dexie code expects Promise to be on the global object (like normal browser environments)\n _global.Promise = Promise;\n}\nexport { _global }\n\nexport function extend(obj: T, extension: X): T & X {\n if (typeof extension !== 'object') return obj as T & X;\n keys(extension).forEach(function (key) {\n obj[key] = extension[key];\n });\n return obj as T & X;\n}\n\nexport const getProto = Object.getPrototypeOf;\nexport const _hasOwn = {}.hasOwnProperty;\nexport function hasOwn(obj, prop) {\n return _hasOwn.call(obj, prop);\n}\n\nexport function props (proto, extension) {\n if (typeof extension === 'function') extension = extension(getProto(proto));\n (typeof Reflect === \"undefined\" ? keys : Reflect.ownKeys)(extension).forEach(key => {\n setProp(proto, key, extension[key]);\n });\n}\n\nexport const defineProperty = Object.defineProperty;\n\nexport function setProp(obj, prop, functionOrGetSet, options?) {\n defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, \"get\") && typeof functionOrGetSet.get === 'function' ?\n {get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true} :\n {value: functionOrGetSet, configurable: true, writable: true}, options));\n}\n\nexport function derive(Child) {\n return {\n from: function (Parent) {\n Child.prototype = Object.create(Parent.prototype);\n setProp(Child.prototype, \"constructor\", Child);\n return {\n extend: props.bind(null, Child.prototype)\n };\n }\n };\n}\n\nexport const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nexport function getPropertyDescriptor(obj, prop) {\n const pd = getOwnPropertyDescriptor(obj, prop);\n let proto;\n return pd || (proto = getProto(obj)) && getPropertyDescriptor (proto, prop);\n}\n\nconst _slice = [].slice;\nexport function slice(args, start?, end?) {\n return _slice.call(args, start, end);\n}\n\nexport function override(origFunc, overridedFactory) {\n return overridedFactory(origFunc);\n}\n\nexport function assert (b) {\n if (!b) throw new Error(\"Assertion Failed\");\n}\n\nexport function asap(fn) {\n // @ts-ignore\n if (_global.setImmediate) setImmediate(fn); else setTimeout(fn, 0);\n}\n\nexport function getUniqueArray(a) {\n return a.filter((value, index, self) => self.indexOf(value) === index);\n}\n\n/** Generate an object (hash map) based on given array.\n * @param extractor Function taking an array item and its index and returning an array of 2 items ([key, value]) to\n * instert on the resulting object for each item in the array. If this function returns a falsy value, the\n * current item wont affect the resulting object.\n */\nexport function arrayToObject (array: T[], extractor: (x:T, idx: number)=>[string, R]): {[name: string]: R} {\n return array.reduce((result, item, i) => {\n var nameAndValue = extractor(item, i);\n if (nameAndValue) result[nameAndValue[0]] = nameAndValue[1];\n return result;\n }, {});\n}\n\nexport function trycatcher(fn, reject) {\n return function () {\n try {\n fn.apply(this, arguments);\n } catch (e) {\n reject(e);\n }\n };\n}\n\nexport function tryCatch(fn: (...args: any[])=>void, onerror, args?) : void {\n try {\n fn.apply(null, args);\n } catch (ex) {\n onerror && onerror(ex);\n }\n}\n\nexport function getByKeyPath(obj, keyPath) {\n // http://www.w3.org/TR/IndexedDB/#steps-for-extracting-a-key-from-a-value-using-a-key-path\n if (typeof keyPath === 'string' && hasOwn(obj, keyPath)) return obj[keyPath]; // This line is moved from last to first for optimization purpose.\n if (!keyPath) return obj;\n if (typeof keyPath !== 'string') {\n var rv = [];\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n var val = getByKeyPath(obj, keyPath[i]);\n rv.push(val);\n }\n return rv;\n }\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var innerObj = obj[keyPath.substr(0, period)];\n return innerObj == null ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1));\n }\n return undefined;\n}\n\nexport function setByKeyPath(obj, keyPath, value) {\n if (!obj || keyPath === undefined) return;\n if ('isFrozen' in Object && Object.isFrozen(obj)) return;\n if (typeof keyPath !== 'string' && 'length' in keyPath) {\n assert(typeof value !== 'string' && 'length' in value);\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n setByKeyPath(obj, keyPath[i], value[i]);\n }\n } else {\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var currentKeyPath = keyPath.substr(0, period);\n var remainingKeyPath = keyPath.substr(period + 1);\n if (remainingKeyPath === \"\")\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) obj.splice(currentKeyPath, 1);\n else delete obj[currentKeyPath];\n } else obj[currentKeyPath] = value;\n else {\n var innerObj = obj[currentKeyPath];\n if (!innerObj || !hasOwn(obj, currentKeyPath)) innerObj = (obj[currentKeyPath] = {});\n setByKeyPath(innerObj, remainingKeyPath, value);\n }\n } else {\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(keyPath))) obj.splice(keyPath, 1);\n else delete obj[keyPath];\n } else obj[keyPath] = value;\n }\n }\n}\n\nexport function delByKeyPath(obj, keyPath) {\n if (typeof keyPath === 'string')\n setByKeyPath(obj, keyPath, undefined);\n else if ('length' in keyPath)\n [].map.call(keyPath, function(kp) {\n setByKeyPath(obj, kp, undefined);\n });\n}\n\nexport function shallowClone(obj) {\n var rv = {};\n for (var m in obj) {\n if (hasOwn(obj, m)) rv[m] = obj[m];\n }\n return rv;\n}\n\nconst concat = [].concat;\nexport function flatten (a: (T | T[])[]) : T[] {\n return concat.apply([], a);\n}\n\n//https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm\nconst intrinsicTypeNames =\n \"BigUint64Array,BigInt64Array,Array,Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,FileSystemDirectoryHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey\"\n .split(',').concat(\n flatten([8,16,32,64].map(num=>[\"Int\",\"Uint\",\"Float\"].map(t=>t+num+\"Array\")))\n ).filter(t=>_global[t]);\nconst intrinsicTypes = new Set(intrinsicTypeNames.map(t=>_global[t]));\n\n/** Deep clone a simple object tree.\n * \n * Copies object tree deeply, but does not deep-copy arrays,\n * typed arrays, Dates or other intrinsic types.\n * \n * Does not check for cyclic references.\n * \n * This function is 6 times faster than structuredClone() on chromium 111.\n * \n * This function can safely be used for cloning ObservabilitySets and RangeSets.\n * \n * @param o Object to clone\n * @returns Cloned object\n */\nexport function cloneSimpleObjectTree(o: T): T {\n const rv = {} as T;\n for (const k in o) if (hasOwn(o, k)) {\n const v = o[k];\n rv[k] = !v || typeof v !== 'object' || intrinsicTypes.has(v.constructor) ? v : cloneSimpleObjectTree(v);\n }\n return rv;\n}\n\nexport function objectIsEmpty(o: object) {\n for (const k in o) if (hasOwn(o, k)) return false;\n return true;\n}\n\nlet circularRefs: null | WeakMap = null;\n\n/** Deep clone an object or array.\n * \n * \n * @param any \n * @returns \n */\nexport function deepClone(any: T): T {\n circularRefs = new WeakMap();\n const rv = innerDeepClone(any);\n circularRefs = null;\n return rv;\n}\n\nfunction innerDeepClone(x: T): T {\n if (!x || typeof x !== 'object') return x;\n let rv = circularRefs.get(x); // Resolve circular references\n if (rv) return rv;\n if (isArray(x)) {\n rv = [];\n circularRefs.set(x, rv);\n for (var i = 0, l = x.length; i < l; ++i) {\n rv.push(innerDeepClone(x[i]));\n }\n } else if (intrinsicTypes.has(x.constructor)) {\n // For performance, we're less strict than structuredClone - we're only\n // cloning arrays and custom objects.\n // Typed arrays, Dates etc are not cloned.\n rv = x;\n } else {\n // We're nicer to custom classes than what structuredClone() is -\n // we preserve the proto of each object.\n const proto = getProto(x);\n rv = proto === Object.prototype ? {} : Object.create(proto);\n circularRefs.set(x, rv);\n for (var prop in x) {\n if (hasOwn(x, prop)) {\n rv[prop] = innerDeepClone(x[prop]);\n }\n }\n }\n return rv;\n}\n\nconst {toString} = {};\nexport function toStringTag(o: Object) {\n return toString.call(o).slice(8, -1);\n}\n\n// If first argument is iterable or array-like, return it as an array\nexport const iteratorSymbol = typeof Symbol !== 'undefined' ?\n Symbol.iterator :\n '@@iterator';\nexport const getIteratorOf = typeof iteratorSymbol === \"symbol\" ? function(x) {\n var i;\n return x != null && (i = x[iteratorSymbol]) && i.apply(x);\n} : function () { return null; };\nexport const asyncIteratorSymbol = typeof Symbol !== 'undefined'\n ? Symbol.asyncIterator || Symbol.for(\"Symbol.asyncIterator\")\n : '@asyncIterator';\n\nexport function delArrayItem(a: any[], x: any) {\n const i = a.indexOf(x);\n if (i >= 0) a.splice(i, 1);\n return i >= 0;\n}\n\nexport const NO_CHAR_ARRAY = {};\n// Takes one or several arguments and returns an array based on the following criteras:\n// * If several arguments provided, return arguments converted to an array in a way that\n// still allows javascript engine to optimize the code.\n// * If single argument is an array, return a clone of it.\n// * If this-pointer equals NO_CHAR_ARRAY, don't accept strings as valid iterables as a special\n// case to the two bullets below.\n// * If single argument is an iterable, convert it to an array and return the resulting array.\n// * If single argument is array-like (has length of type number), convert it to an array.\nexport function getArrayOf (arrayLike) {\n var i, a, x, it;\n if (arguments.length === 1) {\n if (isArray(arrayLike)) return arrayLike.slice();\n if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') return [arrayLike];\n if ((it = getIteratorOf(arrayLike))) {\n a = [];\n while ((x = it.next()), !x.done) a.push(x.value);\n return a;\n }\n if (arrayLike == null) return [arrayLike];\n i = arrayLike.length;\n if (typeof i === 'number') {\n a = new Array(i);\n while (i--) a[i] = arrayLike[i];\n return a;\n }\n return [arrayLike];\n }\n i = arguments.length;\n a = new Array(i);\n while (i--) a[i] = arguments[i];\n return a;\n}\nexport const isAsyncFunction = typeof Symbol !== 'undefined'\n ? (fn: Function) => fn[Symbol.toStringTag] === 'AsyncFunction'\n : ()=>false;\n","import { derive, setProp } from '../functions/utils';\n\nvar dexieErrorNames = [\n 'Modify',\n 'Bulk',\n 'OpenFailed',\n 'VersionChange',\n 'Schema',\n 'Upgrade',\n 'InvalidTable',\n 'MissingAPI',\n 'NoSuchDatabase',\n 'InvalidArgument',\n 'SubTransaction',\n 'Unsupported',\n 'Internal',\n 'DatabaseClosed',\n 'PrematureCommit',\n 'ForeignAwait'\n];\n\nvar idbDomErrorNames = [\n 'Unknown',\n 'Constraint',\n 'Data',\n 'TransactionInactive',\n 'ReadOnly',\n 'Version',\n 'NotFound',\n 'InvalidState',\n 'InvalidAccess',\n 'Abort',\n 'Timeout',\n 'QuotaExceeded',\n 'Syntax',\n 'DataClone'\n];\n\nvar errorList = dexieErrorNames.concat(idbDomErrorNames);\n\nvar defaultTexts = {\n VersionChanged: \"Database version changed by other database connection\",\n DatabaseClosed: \"Database has been closed\",\n Abort: \"Transaction aborted\",\n TransactionInactive: \"Transaction has already completed or failed\",\n MissingAPI: \"IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb\"\n};\n\n//\n// DexieError - base class of all out exceptions.\n//\nexport function DexieError (name, msg) {\n // Reason we don't use ES6 classes is because:\n // 1. It bloats transpiled code and increases size of minified code.\n // 2. It doesn't give us much in this case.\n // 3. It would require sub classes to call super(), which\n // is not needed when deriving from Error.\n this.name = name;\n this.message = msg;\n}\n\nderive(DexieError).from(Error).extend({\n toString: function(){ return this.name + \": \" + this.message; }\n});\n\nfunction getMultiErrorMessage (msg, failures) {\n return msg + \". Errors: \" + Object.keys(failures)\n .map(key=>failures[key].toString())\n .filter((v,i,s)=>s.indexOf(v) === i) // Only unique error strings\n .join('\\n');\n}\n\n//\n// ModifyError - thrown in Collection.modify()\n// Specific constructor because it contains members failures and failedKeys.\n//\nexport function ModifyError (msg, failures, successCount, failedKeys) {\n this.failures = failures;\n this.failedKeys = failedKeys;\n this.successCount = successCount;\n this.message = getMultiErrorMessage(msg, failures);\n}\nderive(ModifyError).from(DexieError);\n\nexport function BulkError (msg, failures) {\n this.name = \"BulkError\";\n this.failures = Object.keys(failures).map(pos => failures[pos]);\n this.failuresByPos = failures;\n this.message = getMultiErrorMessage(msg, this.failures);\n}\nderive(BulkError).from(DexieError);\n\n//\n//\n// Dynamically generate error names and exception classes based\n// on the names in errorList.\n//\n//\n\n// Map of {ErrorName -> ErrorName + \"Error\"}\nexport var errnames = errorList.reduce((obj,name)=>(obj[name]=name+\"Error\",obj),{});\n\n// Need an alias for DexieError because we're gonna create subclasses with the same name.\nconst BaseException = DexieError;\n// Map of {ErrorName -> exception constructor}\nexport var exceptions = errorList.reduce((obj,name)=>{\n // Let the name be \"DexieError\" because this name may\n // be shown in call stack and when debugging. DexieError is\n // the most true name because it derives from DexieError,\n // and we cannot change Function.name programatically without\n // dynamically create a Function object, which would be considered\n // 'eval-evil'.\n var fullName = name + \"Error\";\n function DexieError (msgOrInner, inner){\n this.name = fullName;\n if (!msgOrInner) {\n this.message = defaultTexts[name] || fullName;\n this.inner = null;\n } else if (typeof msgOrInner === 'string') {\n this.message = `${msgOrInner}${!inner ? '' : '\\n ' + inner}`;\n this.inner = inner || null;\n } else if (typeof msgOrInner === 'object') {\n this.message = `${msgOrInner.name} ${msgOrInner.message}`;\n this.inner = msgOrInner;\n }\n }\n derive(DexieError).from(BaseException);\n obj[name]=DexieError;\n return obj;\n},{});\n\n// Use ECMASCRIPT standard exceptions where applicable:\nexceptions.Syntax = SyntaxError;\nexceptions.Type = TypeError;\nexceptions.Range = RangeError;\n\nexport var exceptionMap = idbDomErrorNames.reduce((obj, name)=>{\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nexport function mapError (domError, message) {\n if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name])\n return domError;\n var rv = new exceptionMap[domError.name](message || domError.message, domError);\n if (\"stack\" in domError) {\n // Derive stack from inner exception if it has a stack\n setProp(rv, \"stack\", {get: function(){\n return this.inner.stack;\n }});\n }\n return rv;\n}\n\nexport var fullNameExceptions = errorList.reduce((obj, name)=>{\n if ([\"Syntax\",\"Type\",\"Range\"].indexOf(name) === -1)\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nfullNameExceptions.ModifyError = ModifyError;\nfullNameExceptions.DexieError = DexieError;\nfullNameExceptions.BulkError = BulkError;\n","import {extend} from './utils';\n\nexport function nop() { }\nexport function mirror(val) { return val; }\nexport function pureFunctionChain(f1, f2) {\n // Enables chained events that takes ONE argument and returns it to the next function in chain.\n // This pattern is used in the hook(\"reading\") event.\n if (f1 == null || f1 === mirror) return f2;\n return function (val) {\n return f2(f1(val));\n };\n}\n\nexport function callBoth(on1, on2) {\n return function () {\n on1.apply(this, arguments);\n on2.apply(this, arguments);\n };\n}\n\nexport function hookCreatingChain(f1, f2) {\n // Enables chained events that takes several arguments and may modify first argument by making a modification and then returning the same instance.\n // This pattern is used in the hook(\"creating\") event.\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res !== undefined) arguments[0] = res;\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res2 !== undefined ? res2 : res;\n };\n}\n\nexport function hookDeletingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = this.onerror = null;\n f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n };\n}\n\nexport function hookUpdatingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function (modifications) {\n var res = f1.apply(this, arguments);\n extend(modifications, res); // If f1 returns new modifications, extend caller's modifications with the result before calling next in chain.\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res === undefined ?\n (res2 === undefined ? undefined : res2) :\n (extend(res, res2));\n };\n}\n\nexport function reverseStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n if (f2.apply(this, arguments) === false) return false;\n return f1.apply(this, arguments);\n };\n}\n\nexport function nonStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n f2.apply(this, arguments);\n };\n}\n\nexport function promisableChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res && typeof res.then === 'function') {\n var thiz = this,\n i = arguments.length,\n args = new Array(i);\n while (i--) args[i] = arguments[i];\n return res.then(function () {\n return f2.apply(thiz, args);\n });\n }\n return f2.apply(this, arguments);\n };\n}\n","// By default, debug will be true only if platform is a web platform and its page is served from localhost.\n// When debug = true, error's stacks will contain asyncronic long stacks.\nexport var debug = typeof location !== 'undefined' &&\n // By default, use debug mode if served from localhost.\n /^(http|https):\\/\\/(localhost|127\\.0\\.0\\.1)/.test(location.href);\n\nexport function setDebug(value, filter) {\n debug = value;\n}\n\nexport function deprecated (what: string, fn: (...args)=>T) {\n return function () {\n console.warn(`${what} is deprecated. See https://dexie.org/docs/Deprecations}`);\n return fn.apply(this, arguments);\n } as (...args)=>T\n}\n","/*\n * Copyright (c) 2014-2017 David Fahlander\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/LICENSE-2.0\n */\nimport { _global } from '../globals/global';\nimport {tryCatch, props, setProp,\n getPropertyDescriptor, getArrayOf, extend, getProto} from '../functions/utils';\nimport {nop, callBoth, mirror} from '../functions/chaining-functions';\nimport {debug} from './debug';\nimport {exceptions} from '../errors';\n\n//\n// Promise and Zone (PSD) for Dexie library\n//\n// I started out writing this Promise class by copying promise-light (https://github.com/taylorhakes/promise-light) by\n// https://github.com/taylorhakes - an A+ and ECMASCRIPT 6 compliant Promise implementation.\n//\n// In previous versions this was fixed by not calling setTimeout when knowing that the resolve() or reject() came from another\n// tick. In Dexie v1.4.0, I've rewritten the Promise class entirely. Just some fragments of promise-light is left. I use\n// another strategy now that simplifies everything a lot: to always execute callbacks in a new micro-task, but have an own micro-task\n// engine that is indexedDB compliant across all browsers.\n// Promise class has also been optimized a lot with inspiration from bluebird - to avoid closures as much as possible.\n//\n// Specific non-standard features of this Promise class:\n// * Custom zone support (a.k.a. PSD) with ability to keep zones also when using native promises as well as\n// native async / await.\n// * Promise.follow() method built upon the custom zone engine, that allows user to track all promises created from current stack frame\n// and below + all promises that those promises creates or awaits.\n// * Detect any unhandled promise in a PSD-scope (PSD.onunhandled). \n//\n// David Fahlander, https://github.com/dfahlander\n//\n\n// Just a pointer that only this module knows about.\n// Used in Promise constructor to emulate a private constructor.\nvar INTERNAL = {};\n\nconst\n ZONE_ECHO_LIMIT = 100,\n [resolvedNativePromise, nativePromiseProto, resolvedGlobalPromise] = typeof Promise === 'undefined' ?\n [] :\n (()=>{\n let globalP = Promise.resolve();\n if (typeof crypto === 'undefined' || !crypto.subtle)\n return [globalP, getProto(globalP), globalP];\n // Generate a native promise (as window.Promise may have been patched)\n const nativeP = crypto.subtle.digest(\"SHA-512\", new Uint8Array([0]));\n return [\n nativeP,\n getProto(nativeP),\n globalP\n ];\n })(),\n nativePromiseThen = nativePromiseProto && nativePromiseProto.then;\n\nexport const NativePromise = resolvedNativePromise && resolvedNativePromise.constructor;\nconst patchGlobalPromise = !!resolvedGlobalPromise;\n\n/* The default function used only for the very first promise in a promise chain.\n As soon as then promise is resolved or rejected, all next tasks will be executed in micro ticks\n emulated in this module. For indexedDB compatibility, this means that every method needs to \n execute at least one promise before doing an indexedDB operation. Dexie will always call \n db.ready().then() for every operation to make sure the indexedDB event is started in an\n indexedDB-compatible emulated micro task loop.\n*/\nfunction schedulePhysicalTick() {\n queueMicrotask(physicalTick);\n}\n\n// Configurable through Promise.scheduler.\n// Don't export because it would be unsafe to let unknown\n// code call it unless they do try..catch within their callback.\n// This function can be retrieved through getter of Promise.scheduler though,\n// but users must not do Promise.scheduler = myFuncThatThrowsException\nvar asap = function (callback, args) {\n microtickQueue.push([callback, args]);\n if (needsNewPhysicalTick) {\n schedulePhysicalTick();\n needsNewPhysicalTick = false;\n }\n};\n\nvar isOutsideMicroTick = true, // True when NOT in a virtual microTick.\n needsNewPhysicalTick = true, // True when a push to microtickQueue must also schedulePhysicalTick()\n unhandledErrors = [], // Rejected promises that has occured. Used for triggering 'unhandledrejection'.\n rejectingErrors = [], // Tracks if errors are being re-rejected during onRejected callback.\n rejectionMapper = mirror; // Remove in next major when removing error mapping of DOMErrors and DOMExceptions\n \nexport var globalPSD = {\n id: 'global',\n global: true,\n ref: 0,\n unhandleds: [],\n onunhandled: nop,\n pgp: false,\n env: {},\n finalize: nop\n};\n\nexport var PSD = globalPSD;\n\nexport var microtickQueue = []; // Callbacks to call in this or next physical tick.\nexport var numScheduledCalls = 0; // Number of listener-calls left to do in this physical tick.\nexport var tickFinalizers = []; // Finalizers to call when there are no more async calls scheduled within current physical tick.\n\nexport default function DexiePromise(fn) {\n if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); \n this._listeners = [];\n \n // A library may set `promise._lib = true;` after promise is created to make resolve() or reject()\n // execute the microtask engine implicitely within the call to resolve() or reject().\n // To remain A+ compliant, a library must only set `_lib=true` if it can guarantee that the stack\n // only contains library code when calling resolve() or reject().\n // RULE OF THUMB: ONLY set _lib = true for promises explicitely resolving/rejecting directly from\n // global scope (event handler, timer etc)!\n this._lib = false;\n // Current async scope\n var psd = (this._PSD = PSD);\n \n if (typeof fn !== 'function') {\n if (fn !== INTERNAL) throw new TypeError('Not a function');\n // Private constructor (INTERNAL, state, value).\n // Used internally by Promise.resolve() and Promise.reject().\n this._state = arguments[1];\n this._value = arguments[2];\n if (this._state === false)\n handleRejection(this, this._value); // Map error, set stack and addPossiblyUnhandledError().\n return;\n }\n \n this._state = null; // null (=pending), false (=rejected) or true (=resolved)\n this._value = null; // error or result\n ++psd.ref; // Refcounting current scope\n executePromiseTask(this, fn);\n}\n\n// Prepare a property descriptor to put onto Promise.prototype.then\nconst thenProp = {\n get: function() {\n var psd = PSD, microTaskId = totalEchoes;\n\n function then (onFulfilled, onRejected) {\n var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes);\n const cleanup = possibleAwait && !decrementExpectedAwaits();\n var rv = new DexiePromise((resolve, reject) => {\n propagateToListener(this, new Listener(\n nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup),\n nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup),\n resolve,\n reject,\n psd));\n });\n if (this._consoleTask) rv._consoleTask = this._consoleTask;\n return rv;\n }\n\n then.prototype = INTERNAL; // For idempotense, see setter below.\n\n return then;\n },\n // Be idempotent and allow another framework (such as zone.js or another instance of a Dexie.Promise module) to replace Promise.prototype.then\n // and when that framework wants to restore the original property, we must identify that and restore the original property descriptor.\n set: function (value) {\n setProp (this, 'then', value && value.prototype === INTERNAL ?\n thenProp : // Restore to original property descriptor.\n {\n get: function(){\n return value; // Getter returning provided value (behaves like value is just changed)\n },\n set: thenProp.set // Keep a setter that is prepared to restore original.\n }\n );\n }\n};\n\nprops(DexiePromise.prototype, {\n then: thenProp, // Defined above.\n _then: function (onFulfilled, onRejected) {\n // A little tinier version of then() that don't have to create a resulting promise.\n propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); \n },\n\n catch: function (onRejected) {\n if (arguments.length === 1) return this.then(null, onRejected);\n // First argument is the Error type to catch\n var type = arguments[0],\n handler = arguments[1];\n return typeof type === 'function' ? this.then(null, err =>\n // Catching errors by its constructor type (similar to java / c++ / c#)\n // Sample: promise.catch(TypeError, function (e) { ... });\n err instanceof type ? handler(err) : PromiseReject(err))\n : this.then(null, err =>\n // Catching errors by the error.name property. Makes sense for indexedDB where error type\n // is always DOMError but where e.name tells the actual error type.\n // Sample: promise.catch('ConstraintError', function (e) { ... });\n err && err.name === type ? handler(err) : PromiseReject(err));\n },\n\n finally: function (onFinally) {\n return this.then(value => {\n return DexiePromise.resolve(onFinally()).then(()=>value);\n }, err => {\n return DexiePromise.resolve(onFinally()).then(()=>PromiseReject(err));\n });\n },\n \n timeout: function (ms, msg) {\n return ms < Infinity ?\n new DexiePromise((resolve, reject) => {\n var handle = setTimeout(() => reject(new exceptions.Timeout(msg)), ms);\n this.then(resolve, reject).finally(clearTimeout.bind(null, handle));\n }) : this;\n }\n});\n\nif (typeof Symbol !== 'undefined' && Symbol.toStringTag)\n setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise');\n\n// Now that Promise.prototype is defined, we have all it takes to set globalPSD.env.\n// Environment globals snapshotted on leaving global zone\nglobalPSD.env = snapShot();\n\nfunction Listener(onFulfilled, onRejected, resolve, reject, zone) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.resolve = resolve;\n this.reject = reject;\n this.psd = zone;\n}\n\n// Promise Static Properties\nprops (DexiePromise, {\n all: function () {\n var values = getArrayOf.apply(null, arguments) // Supports iterables, implicit arguments and array-like.\n .map(onPossibleParallellAsync); // Handle parallell async/awaits \n return new DexiePromise(function (resolve, reject) {\n if (values.length === 0) resolve([]);\n var remaining = values.length;\n values.forEach((a,i) => DexiePromise.resolve(a).then(x => {\n values[i] = x;\n if (!--remaining) resolve(values);\n }, reject));\n });\n },\n \n resolve: value => {\n if (value instanceof DexiePromise) return value;\n if (value && typeof value.then === 'function') return new DexiePromise((resolve, reject)=>{\n value.then(resolve, reject);\n });\n var rv = new DexiePromise(INTERNAL, true, value);\n return rv;\n },\n \n reject: PromiseReject,\n \n race: function () {\n var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n values.map(value => DexiePromise.resolve(value).then(resolve, reject));\n });\n },\n\n PSD: {\n get: ()=>PSD,\n set: value => PSD = value\n },\n\n totalEchoes: {get: ()=>totalEchoes},\n\n //task: {get: ()=>task},\n \n newPSD: newScope,\n \n usePSD: usePSD,\n \n scheduler: {\n get: () => asap,\n set: value => {asap = value}\n },\n \n rejectionMapper: {\n get: () => rejectionMapper,\n set: value => {rejectionMapper = value;} // Map reject failures\n },\n \n follow: (fn, zoneProps) => {\n return new DexiePromise((resolve, reject) => {\n return newScope((resolve, reject) => {\n var psd = PSD;\n psd.unhandleds = []; // For unhandled standard- or 3rd party Promises. Checked at psd.finalize()\n psd.onunhandled = reject; // Triggered directly on unhandled promises of this library.\n psd.finalize = callBoth(function () {\n // Unhandled standard or 3rd part promises are put in PSD.unhandleds and\n // examined upon scope completion while unhandled rejections in this Promise\n // will trigger directly through psd.onunhandled\n run_at_end_of_this_or_next_physical_tick(()=>{\n this.unhandleds.length === 0 ? resolve() : reject(this.unhandleds[0]);\n });\n }, psd.finalize);\n fn();\n }, zoneProps, resolve, reject);\n });\n }\n});\n\nif (NativePromise) {\n if (NativePromise.allSettled) setProp (DexiePromise, \"allSettled\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise(resolve => {\n if (possiblePromises.length === 0) resolve([]);\n let remaining = possiblePromises.length;\n const results = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => results[i] = {status: \"fulfilled\", value},\n reason => results[i] = {status: \"rejected\", reason})\n .then(()=>--remaining || resolve(results)));\n });\n });\n if (NativePromise.any && typeof AggregateError !== 'undefined') setProp(DexiePromise, \"any\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n if (possiblePromises.length === 0) reject(new AggregateError([]));\n let remaining = possiblePromises.length;\n const failures = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => resolve(value),\n failure => {\n failures[i] = failure;\n if (!--remaining) reject(new AggregateError(failures));\n }));\n });\n });\n}\n\n/**\n* Take a potentially misbehaving resolver function and make sure\n* onFulfilled and onRejected are only called once.\n*\n* Makes no guarantees about asynchrony.\n*/\nfunction executePromiseTask (promise, fn) {\n // Promise Resolution Procedure:\n // https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n try {\n fn(value => {\n if (promise._state !== null) return; // Already settled\n if (value === promise) throw new TypeError('A promise cannot be resolved with itself.');\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n if (value && typeof value.then === 'function') {\n executePromiseTask(promise, (resolve, reject) => {\n value instanceof DexiePromise ?\n value._then(resolve, reject) :\n value.then(resolve, reject);\n });\n } else {\n promise._state = true;\n promise._value = value;\n propagateAllListeners(promise);\n }\n if (shouldExecuteTick) endMicroTickScope();\n }, handleRejection.bind(null, promise)); // If Function.bind is not supported. Exception is handled in catch below\n } catch (ex) {\n handleRejection(promise, ex);\n }\n}\n\nfunction handleRejection (promise, reason) {\n rejectingErrors.push(reason);\n if (promise._state !== null) return;\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n reason = rejectionMapper(reason);\n promise._state = false;\n promise._value = reason;\n // Add the failure to a list of possibly uncaught errors\n addPossiblyUnhandledError(promise);\n propagateAllListeners(promise);\n if (shouldExecuteTick) endMicroTickScope();\n}\n\nfunction propagateAllListeners (promise) {\n //debug && linkToPreviousPromise(promise);\n var listeners = promise._listeners;\n promise._listeners = [];\n for (var i = 0, len = listeners.length; i < len; ++i) {\n propagateToListener(promise, listeners[i]);\n }\n var psd = promise._PSD;\n --psd.ref || psd.finalize(); // if psd.ref reaches zero, call psd.finalize();\n if (numScheduledCalls === 0) {\n // If numScheduledCalls is 0, it means that our stack is not in a callback of a scheduled call,\n // and that no deferreds where listening to this rejection or success.\n // Since there is a risk that our stack can contain application code that may\n // do stuff after this code is finished that may generate new calls, we cannot\n // call finalizers here.\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick(); // Will detect unhandled errors\n }, []);\n }\n}\n\nfunction propagateToListener(promise, listener) {\n if (promise._state === null) {\n promise._listeners.push(listener);\n return;\n }\n\n var cb = promise._state ? listener.onFulfilled : listener.onRejected;\n if (cb === null) {\n // This Listener doesnt have a listener for the event being triggered (onFulfilled or onReject) so lets forward the event to any eventual listeners on the Promise instance returned by then() or catch()\n return (promise._state ? listener.resolve : listener.reject) (promise._value);\n }\n ++listener.psd.ref;\n ++numScheduledCalls;\n asap (callListener, [cb, promise, listener]);\n}\n\nfunction callListener (cb, promise, listener) {\n try {\n // Call callback and resolve our listener with it's return value.\n var ret, value = promise._value;\n \n if (!promise._state && rejectingErrors.length) rejectingErrors = [];\n // cb is onResolved\n ret = debug && promise._consoleTask ? promise._consoleTask.run(()=>cb (value)) : cb (value);\n if (!promise._state && rejectingErrors.indexOf(value) === -1) {\n markErrorAsHandled(promise); // Callback didnt do Promise.reject(err) nor reject(err) onto another promise.\n }\n listener.resolve(ret);\n } catch (e) {\n // Exception thrown in callback. Reject our listener.\n listener.reject(e);\n } finally {\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n --listener.psd.ref || listener.psd.finalize();\n }\n}\n\n/* The callback to schedule with queueMicrotask().\n It runs a virtual microtick and executes any callback registered in microtickQueue.\n */\nfunction physicalTick() {\n usePSD(globalPSD, ()=>{\n // Make sure to reset the async context to globalPSD before\n // executing any of the microtick subscribers.\n beginMicroTickScope() && endMicroTickScope();\n });\n}\n\nexport function beginMicroTickScope() {\n var wasRootExec = isOutsideMicroTick;\n isOutsideMicroTick = false;\n needsNewPhysicalTick = false;\n return wasRootExec;\n}\n\n/* Executes micro-ticks without doing try..catch.\n This can be possible because we only use this internally and\n the registered functions are exception-safe (they do try..catch\n internally before calling any external method). If registering\n functions in the microtickQueue that are not exception-safe, this\n would destroy the framework and make it instable. So we don't export\n our asap method.\n*/\nexport function endMicroTickScope() {\n var callbacks, i, l;\n do {\n while (microtickQueue.length > 0) {\n callbacks = microtickQueue;\n microtickQueue = [];\n l = callbacks.length;\n for (i = 0; i < l; ++i) {\n var item = callbacks[i];\n item[0].apply(null, item[1]);\n }\n }\n } while (microtickQueue.length > 0);\n isOutsideMicroTick = true;\n needsNewPhysicalTick = true;\n}\n\nfunction finalizePhysicalTick() {\n var unhandledErrs = unhandledErrors;\n unhandledErrors = [];\n unhandledErrs.forEach(p => {\n p._PSD.onunhandled.call(null, p._value, p);\n });\n var finalizers = tickFinalizers.slice(0); // Clone first because finalizer may remove itself from list.\n var i = finalizers.length;\n while (i) finalizers[--i](); \n}\n\nfunction run_at_end_of_this_or_next_physical_tick (fn) {\n function finalizer() {\n fn();\n tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1);\n }\n tickFinalizers.push(finalizer);\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n }, []);\n}\n\nfunction addPossiblyUnhandledError(promise) {\n // Only add to unhandledErrors if not already there. The first one to add to this list\n // will be upon the first rejection so that the root cause (first promise in the\n // rejection chain) is the one listed.\n if (!unhandledErrors.some(p => p._value === promise._value))\n unhandledErrors.push(promise);\n}\n\nfunction markErrorAsHandled(promise) {\n // Called when a reject handled is actually being called.\n // Search in unhandledErrors for any promise whos _value is this promise_value (list\n // contains only rejected promises, and only one item per error)\n var i = unhandledErrors.length;\n while (i) if (unhandledErrors[--i]._value === promise._value) {\n // Found a promise that failed with this same error object pointer,\n // Remove that since there is a listener that actually takes care of it.\n unhandledErrors.splice(i, 1);\n return;\n }\n}\n\nfunction PromiseReject (reason) {\n return new DexiePromise(INTERNAL, false, reason);\n}\n\nexport function wrap (fn, errorCatcher) {\n var psd = PSD;\n return function() {\n var wasRootExec = beginMicroTickScope(),\n outerScope = PSD;\n\n try {\n switchToZone(psd, true);\n return fn.apply(this, arguments);\n } catch (e) {\n errorCatcher && errorCatcher(e);\n } finally {\n switchToZone(outerScope, false);\n if (wasRootExec) endMicroTickScope();\n }\n };\n}\n\n\n//\n// variables used for native await support\n//\nconst task = { awaits: 0, echoes: 0, id: 0}; // The ongoing macro-task when using zone-echoing.\nvar taskCounter = 0; // ID counter for macro tasks.\nvar zoneStack = []; // Stack of left zones to restore asynchronically.\nvar zoneEchoes = 0; // When > 0, zoneLeaveEcho is queued. When 0 and task.echoes is also 0, nothing is queued.\nvar totalEchoes = 0; // ID counter for micro-tasks. Used to detect possible native await in our Promise.prototype.then.\n\n\nvar zone_id_counter = 0;\nexport function newScope (fn, props, a1, a2) {\n var parent = PSD,\n psd = Object.create(parent);\n psd.parent = parent;\n psd.ref = 0;\n psd.global = false;\n psd.id = ++zone_id_counter;\n // Prepare for promise patching (done in usePSD):\n var globalEnv = globalPSD.env;\n psd.env = patchGlobalPromise ? {\n Promise: DexiePromise, // Changing window.Promise could be omitted for Chrome and Edge, where IDB+Promise plays well!\n PromiseProp: {value: DexiePromise, configurable: true, writable: true},\n all: DexiePromise.all,\n race: DexiePromise.race,\n allSettled: DexiePromise.allSettled,\n any: DexiePromise.any,\n resolve: DexiePromise.resolve,\n reject: DexiePromise.reject,\n } : {};\n if (props) extend(psd, props);\n \n // unhandleds and onunhandled should not be specifically set here.\n // Leave them on parent prototype.\n // unhandleds.push(err) will push to parent's prototype\n // onunhandled() will call parents onunhandled (with this scope's this-pointer though!)\n ++parent.ref;\n psd.finalize = function () {\n --this.parent.ref || this.parent.finalize();\n }\n var rv = usePSD (psd, fn, a1, a2);\n if (psd.ref === 0) psd.finalize();\n return rv;\n}\n\n// Function to call if scopeFunc returns NativePromise\n// Also for each NativePromise in the arguments to Promise.all()\nexport function incrementExpectedAwaits() {\n if (!task.id) task.id = ++taskCounter;\n ++task.awaits;\n task.echoes += ZONE_ECHO_LIMIT;\n return task.id;\n}\n\n// Function to call when 'then' calls back on a native promise where onAwaitExpected() had been called.\n// Also call this when a native await calls then method on a promise. In that case, don't supply\n// sourceTaskId because we already know it refers to current task.\nexport function decrementExpectedAwaits() {\n if (!task.awaits) return false;\n if (--task.awaits === 0) task.id = 0;\n task.echoes = task.awaits * ZONE_ECHO_LIMIT; // Will reset echoes to 0 if awaits is 0.\n return true;\n}\n\nif ((''+nativePromiseThen).indexOf('[native code]') === -1) {\n // If the native promise' prototype is patched, we cannot rely on zone echoing.\n // Disable that here:\n incrementExpectedAwaits = decrementExpectedAwaits = nop;\n}\n\n// Call from Promise.all() and Promise.race()\nexport function onPossibleParallellAsync (possiblePromise) {\n if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) {\n incrementExpectedAwaits(); \n return possiblePromise.then(x => {\n decrementExpectedAwaits();\n return x;\n }, e => {\n decrementExpectedAwaits();\n return rejection(e);\n });\n }\n return possiblePromise;\n}\n\nfunction zoneEnterEcho(targetZone) {\n ++totalEchoes;\n //console.log(\"Total echoes \", totalEchoes);\n //if (task.echoes === 1) console.warn(\"Cancelling echoing of async context.\");\n if (!task.echoes || --task.echoes === 0) {\n task.echoes = task.awaits = task.id = 0; // Cancel echoing.\n }\n\n zoneStack.push(PSD);\n switchToZone(targetZone, true);\n}\n\nfunction zoneLeaveEcho() {\n var zone = zoneStack[zoneStack.length-1];\n zoneStack.pop();\n switchToZone(zone, false);\n}\n\nfunction switchToZone (targetZone, bEnteringZone) {\n var currentZone = PSD;\n if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) {\n // Enter or leave zone asynchronically as well, so that tasks initiated during current tick\n // will be surrounded by the zone when they are invoked.\n queueMicrotask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho);\n }\n if (targetZone === PSD) return;\n\n PSD = targetZone; // The actual zone switch occurs at this line.\n\n // Snapshot on every leave from global zone.\n if (currentZone === globalPSD) globalPSD.env = snapShot();\n\n if (patchGlobalPromise) {\n // Let's patch the global and native Promises (may be same or may be different)\n var GlobalPromise = globalPSD.env.Promise;\n // Swich environments (may be PSD-zone or the global zone. Both apply.)\n var targetEnv = targetZone.env;\n\n if (currentZone.global || targetZone.global) {\n // Leaving or entering global zone. It's time to patch / restore global Promise.\n\n // Set this Promise to window.Promise so that transiled async functions will work on Firefox, Safari and IE, as well as with Zonejs and angular.\n Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp);\n\n // Support Promise.all() etc to work indexedDB-safe also when people are including es6-promise as a module (they might\n // not be accessing global.Promise but a local reference to it)\n GlobalPromise.all = targetEnv.all;\n GlobalPromise.race = targetEnv.race;\n GlobalPromise.resolve = targetEnv.resolve;\n GlobalPromise.reject = targetEnv.reject;\n if (targetEnv.allSettled) GlobalPromise.allSettled = targetEnv.allSettled;\n if (targetEnv.any) GlobalPromise.any = targetEnv.any;\n }\n }\n}\n\nfunction snapShot () {\n var GlobalPromise = _global.Promise;\n return patchGlobalPromise ? {\n Promise: GlobalPromise,\n PromiseProp: Object.getOwnPropertyDescriptor(_global, \"Promise\"),\n all: GlobalPromise.all,\n race: GlobalPromise.race,\n allSettled: GlobalPromise.allSettled,\n any: GlobalPromise.any,\n resolve: GlobalPromise.resolve,\n reject: GlobalPromise.reject,\n } : {};\n}\n\nexport function usePSD (psd, fn, a1, a2, a3) {\n var outerScope = PSD;\n try {\n switchToZone(psd, true);\n return fn(a1, a2, a3);\n } finally {\n switchToZone(outerScope, false);\n }\n}\n\nfunction nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) {\n return typeof fn !== 'function' ? fn : function () {\n var outerZone = PSD;\n if (possibleAwait) incrementExpectedAwaits();\n switchToZone(zone, true);\n try {\n return fn.apply(this, arguments);\n } finally {\n switchToZone(outerZone, false);\n if (cleanup) queueMicrotask(decrementExpectedAwaits);\n }\n };\n}\n\n/** Execute callback in global context */\nexport function execInGlobalContext(cb) {\n if (Promise === NativePromise && task.echoes === 0) {\n if (zoneEchoes === 0) {\n cb();\n } else {\n enqueueNativeMicroTask(cb);\n }\n } else {\n setTimeout(cb, 0);\n }\n}\n\nexport var rejection = DexiePromise.reject;\n\nexport {DexiePromise};\n","import { PSD, rejection, newScope } from \"../helpers/promise\";\nimport { DexieOptions } from \"../public/types/dexie-constructor\";\nimport { errnames, exceptions } from \"../errors\";\nimport { nop } from \"./chaining-functions\";\nimport { Transaction } from \"../classes/transaction\";\nimport { Dexie } from '../classes/dexie';\n\n/* Generate a temporary transaction when db operations are done outside a transaction scope.\n*/\nexport function tempTransaction (\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n fn: (resolve, reject, trans: Transaction) => any)\n // Last argument is \"writeLocked\". But this doesnt apply to oneshot direct db operations, so we ignore it.\n{\n if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) {\n if (db._state.openComplete) {\n // db.idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError));\n }\n if (!db._state.isBeingOpened) {\n if (!db._state.autoOpen)\n return rejection(new exceptions.DatabaseClosed());\n db.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n return db._state.dbReadyPromise.then(() => tempTransaction(db, mode, storeNames, fn));\n } else {\n var trans = db._createTransaction(mode, storeNames, db._dbSchema);\n try {\n trans.create();\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db.close({disableAutoOpen: false});\n return db.open().then(()=>tempTransaction(db, mode, storeNames, fn));\n }\n return rejection(ex);\n }\n return trans._promise(mode, (resolve, reject) => {\n return newScope(() => { // OPTIMIZATION POSSIBLE? newScope() not needed because it's already done in _promise.\n PSD.trans = trans;\n return fn(resolve, reject, trans);\n });\n }).then(result => {\n // Instead of resolving value directly, wait with resolving it until transaction has completed.\n // Otherwise the data would not be in the DB if requesting it in the then() operation.\n // Specifically, to ensure that the following expression will work:\n //\n // db.friends.put({name: \"Arne\"}).then(function () {\n // db.friends.where(\"name\").equals(\"Arne\").count(function(count) {\n // assert (count === 1);\n // });\n // });\n //\n if (mode === 'readwrite') try {trans.idbtrans.commit();} catch {}\n return mode === 'readonly' ? result : trans._completion.then(() => result);\n });/*.catch(err => { // Don't do this as of now. If would affect bulk- and modify methods in a way that could be more intuitive. But wait! Maybe change in next major.\n trans._reject(err);\n return rejection(err);\n });*/\n }\n}\n","import { Dexie } from \"../classes/dexie\";\n\nexport const DEXIE_VERSION = '{version}'; // Replaced by build-script.\nexport const maxString = String.fromCharCode(65535);\nexport const minKey = -Infinity; // minKey can be constant. maxKey must be a prop of Dexie (_maxKey)\nexport const INVALID_KEY_ARGUMENT =\n \"Invalid key provided. Keys must be of type string, number, Date or Array.\";\nexport const STRING_EXPECTED = \"String expected.\";\nexport const connections: Dexie[] = [];\nexport const dexieStackFrameFilter = frame => !/(dexie\\.js|dexie\\.min\\.js)/.test(frame);\nexport const DBNAMES_DB = '__dbnames';\nexport const READONLY = 'readonly';\nexport const READWRITE = 'readwrite';\n","export function combine(filter1, filter2) {\n return filter1 ?\n filter2 ?\n function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } :\n filter1 :\n filter2;\n}\n","import { DBCoreKeyRange, DBCoreRangeType } from '../public/types/dbcore';\n\nexport const AnyRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Any,\n lower: -Infinity,\n lowerOpen: false,\n upper: [[]],\n upperOpen: false\n}\n\nexport const NeverRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Never,\n lower: -Infinity,\n lowerOpen: true,\n upper: -Infinity,\n upperOpen: true\n}\n","import { deepClone, delByKeyPath, getByKeyPath } from './utils';\n\n// This workaround is needed since obj could be a custom-class instance with an\n// uninitialized keyPath. See the following comment for more context:\n// https://github.com/dfahlander/Dexie.js/issues/1280#issuecomment-823557881\nexport function workaroundForUndefinedPrimKey(keyPath: string | ArrayLike) {\n // Workaround only needed for plain non-dotted keyPaths\n return typeof keyPath === \"string\" && !/\\./.test(keyPath) \n ? (obj: object) => {\n if (obj[keyPath] === undefined && (keyPath in obj)) {\n // property exists but is undefined. This will not be liked by Indexeddb.\n // Need to remove the property before adding it but we need to clone it before\n // doing that to not be intrusive.\n obj = deepClone(obj);\n delete obj[keyPath];\n }\n return obj;\n }\n : (obj: object) => obj;\n}","import { exceptions } from \"../../errors\";\n\nexport function Entity(){\n throw exceptions.Type();\n}\n","// Implementation of https://www.w3.org/TR/IndexedDB-3/#compare-two-keys\n\nimport { toStringTag } from './utils';\n\n// ... with the adjustment to return NaN instead of throwing.\nexport function cmp(a: any, b: any): number {\n try {\n const ta = type(a);\n const tb = type(b);\n if (ta !== tb) {\n if (ta === 'Array') return 1;\n if (tb === 'Array') return -1;\n if (ta === 'binary') return 1;\n if (tb === 'binary') return -1;\n if (ta === 'string') return 1;\n if (tb === 'string') return -1;\n if (ta === 'Date') return 1;\n if (tb !== 'Date') return NaN;\n return -1;\n }\n switch (ta) {\n case 'number':\n case 'Date':\n case 'string':\n return a > b ? 1 : a < b ? -1 : 0;\n case 'binary': {\n return compareUint8Arrays(getUint8Array(a), getUint8Array(b));\n }\n case 'Array':\n return compareArrays(a, b);\n }\n } catch {}\n return NaN; // Return value if any given args are valid keys.\n}\n\nexport function compareArrays(a: any[], b: any[]): number {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n const res = cmp(a[i], b[i]);\n if (res !== 0) return res;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\nexport function compareUint8Arrays(\n a: Uint8Array,\n b: Uint8Array\n) {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n if (a[i] !== b[i]) return a[i] < b[i] ? -1 : 1;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\n// Implementation of https://www.w3.org/TR/IndexedDB-3/#key-type\nfunction type(x: any) {\n const t = typeof x;\n if (t !== 'object') return t;\n if (ArrayBuffer.isView(x)) return 'binary';\n const tsTag = toStringTag(x); // Cannot use instanceof in Safari\n return tsTag === 'ArrayBuffer' ? 'binary' : (tsTag as 'Array' | 'Date');\n}\n\ntype BinaryType =\n | ArrayBuffer\n | DataView\n | Uint8ClampedArray\n | ArrayBufferView\n | Uint8Array\n | Int8Array\n | Uint16Array\n | Int16Array\n | Uint32Array\n | Int32Array\n | Float32Array\n | Float64Array\n | BigInt64Array \n | BigUint64Array;\n\nfunction getUint8Array(a: BinaryType): Uint8Array {\n if (a instanceof Uint8Array) return a;\n if (ArrayBuffer.isView(a))\n // TypedArray or DataView\n return new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n return new Uint8Array(a); // ArrayBuffer\n}\n","import { BulkError, exceptions } from '../../errors';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { DexiePromise as Promise, PSD, newScope, rejection, beginMicroTickScope, endMicroTickScope } from '../../helpers/promise';\nimport { Transaction } from '../transaction';\nimport { Dexie } from '../dexie';\nimport { tempTransaction } from '../../functions/temp-transaction';\nimport { Collection } from '../collection';\nimport { isArray, keys, getByKeyPath, setByKeyPath, extend, getProto } from '../../functions/utils';\nimport { maxString } from '../../globals/constants';\nimport { combine } from '../../functions/combine';\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { IndexableType } from '../../public/types/indexable-type';\nimport { debug } from '../../helpers/debug';\nimport { DBCoreTable } from '../../public/types/dbcore';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { workaroundForUndefinedPrimKey } from '../../functions/workaround-undefined-primkey';\nimport { Entity } from '../entity/Entity';\nimport { UpdateSpec } from '../../public';\nimport { cmp } from '../../functions/cmp';\n\n/** class Table\n * \n * https://dexie.org/docs/Table/Table\n */\nexport class Table implements ITable {\n db: Dexie;\n _tx?: Transaction;\n name: string;\n schema: TableSchema;\n hook: TableHooks;\n core: DBCoreTable;\n\n _trans(\n mode: IDBTransactionMode,\n fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike | void,\n writeLocked?: boolean | string) : PromiseExtended\n {\n const trans: Transaction = this._tx || PSD.trans;\n const tableName = this.name;\n // @ts-ignore: Use Chrome's Async Stack Tagging API to allow tracing and simplify debugging for dexie users.\n const task = debug && typeof console !== 'undefined' && console.createTask && console.createTask(`Dexie: ${mode === 'readonly' ? 'read' : 'write' } ${this.name}`);\n \n function checkTableInTransaction(resolve, reject, trans: Transaction) {\n if (!trans.schema[tableName])\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\");\n return fn(trans.idbtrans, trans) as Promise;\n }\n // Surround all in a microtick scope.\n // Reason: Browsers (modern Safari + older others)\n // still as of 2018-10-10 has problems keeping a transaction\n // alive between micro ticks. Safari because if transaction\n // is created but not used in same microtick, it will go\n // away. That specific issue could be solved in DBCore\n // by opening the transaction just before using it instead.\n // But older Firefoxes and IE11 (with Promise polyfills)\n // will still have probs.\n // The beginMicrotickScope()/endMicrotickScope() works\n // in cooperation with Dexie.Promise to orchestrate\n // the micro-ticks in endMicrotickScope() rather than\n // in native engine.\n const wasRootExec = beginMicroTickScope();\n try {\n let p = trans && trans.db._novip === this.db._novip ?\n trans === PSD.trans ?\n trans._promise(mode, checkTableInTransaction, writeLocked) :\n newScope(() => trans._promise(mode, checkTableInTransaction, writeLocked), { trans: trans, transless: PSD.transless || PSD }) :\n tempTransaction(this.db, mode, [this.name], checkTableInTransaction);\n if (task) { // Dexie.debug = true so we trace errors\n p._consoleTask = task;\n p = p.catch(err => {\n console.trace(err);\n return rejection(err);\n });\n }\n return p; \n } finally {\n if (wasRootExec) endMicroTickScope();\n }\n }\n\n /** Table.get()\n * \n * https://dexie.org/docs/Table/Table.get()\n * \n **/\n get(keyOrCrit, cb?) {\n if (keyOrCrit && keyOrCrit.constructor === Object)\n return this.where(keyOrCrit as { [key: string]: IndexableType }).first(cb);\n if (keyOrCrit == null) return rejection(new exceptions.Type(`Invalid argument to Table.get()`));\n\n return this._trans('readonly', (trans) => {\n return this.core.get({trans, key: keyOrCrit})\n .then(res => this.hook.reading.fire(res));\n }).then(cb);\n }\n\n /** Table.where()\n * \n * https://dexie.org/docs/Table/Table.where()\n * \n **/\n where(indexOrCrit: string | string[] | { [key: string]: IndexableType }) {\n if (typeof indexOrCrit === 'string')\n return new this.db.WhereClause(this, indexOrCrit);\n if (isArray(indexOrCrit))\n return new this.db.WhereClause(this, `[${indexOrCrit.join('+')}]`);\n // indexOrCrit is an object map of {[keyPath]:value} \n const keyPaths = keys(indexOrCrit);\n if (keyPaths.length === 1)\n // Only one critera. This was the easy case:\n return this\n .where(keyPaths[0])\n .equals(indexOrCrit[keyPaths[0]]);\n\n // Multiple criterias.\n // Let's try finding a compound index that matches all keyPaths in\n // arbritary order:\n const compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(ix => {\n if (\n ix.compound &&\n keyPaths.every(keyPath => ix.keyPath.indexOf(keyPath) >= 0)) {\n for (let i=0; i a.keyPath.length - b.keyPath.length)[0];\n \n if (compoundIndex && this.db._maxKey !== maxString) {\n // Cool! We found such compound index\n // and this browser supports compound indexes (maxKey !== maxString)!\n const keyPathsInValidOrder = (compoundIndex.keyPath as string[]).slice(0, keyPaths.length);\n return this\n .where(keyPathsInValidOrder)\n .equals(keyPathsInValidOrder.map(kp => indexOrCrit[kp]));\n }\n\n if (!compoundIndex && debug) console.warn(\n `The query ${JSON.stringify(indexOrCrit)} on ${this.name} would benefit from a ` +\n `compound index [${keyPaths.join('+')}]`);\n\n // Ok, now let's fallback to finding at least one matching index\n // and filter the rest.\n const { idxByName } = this.schema;\n const idb = this.db._deps.indexedDB;\n\n function equals (a, b) {\n return idb.cmp(a,b) === 0; // Works with all indexable types including binary keys.\n }\n\n const [idx, filterFunction] = keyPaths.reduce(([prevIndex, prevFilterFn], keyPath) => {\n const index = idxByName[keyPath];\n const value = indexOrCrit[keyPath];\n return [\n prevIndex || index, // idx::=Pick index of first matching keypath\n prevIndex || !index ? // filter::=null if not needed, otherwise combine function filter\n combine(\n prevFilterFn,\n index && index.multi ?\n x => {\n const prop = getByKeyPath(x, keyPath);\n return isArray(prop) && prop.some(item => equals(value, item));\n } : x => equals(value, getByKeyPath(x, keyPath)))\n : prevFilterFn\n ];\n }, [null, null]);\n\n return idx ?\n this.where(idx.name).equals(indexOrCrit[idx.keyPath])\n .filter(filterFunction) :\n compoundIndex ?\n this.filter(filterFunction) : // Has compound but browser bad. Allow filter.\n this.where(keyPaths).equals(''); // No index at all. Fail lazily with \"[a+b+c] is not indexed\"\n }\n\n /** Table.filter()\n * \n * https://dexie.org/docs/Table/Table.filter()\n * \n **/\n filter(filterFunction: (obj: any) => boolean) {\n return this.toCollection().and(filterFunction);\n }\n\n /** Table.count()\n * \n * https://dexie.org/docs/Table/Table.count()\n * \n **/\n count(thenShortcut?: any) {\n return this.toCollection().count(thenShortcut);\n }\n\n /** Table.offset()\n * \n * https://dexie.org/docs/Table/Table.offset()\n * \n **/\n offset(offset: number) {\n return this.toCollection().offset(offset);\n }\n\n /** Table.limit()\n * \n * https://dexie.org/docs/Table/Table.limit()\n * \n **/\n limit(numRows: number) {\n return this.toCollection().limit(numRows);\n }\n\n /** Table.each()\n * \n * https://dexie.org/docs/Table/Table.each()\n * \n **/\n each(callback: (obj: any, cursor: { key: IndexableType, primaryKey: IndexableType }) => any) {\n return this.toCollection().each(callback);\n }\n\n /** Table.toArray()\n * \n * https://dexie.org/docs/Table/Table.toArray()\n * \n **/\n toArray(thenShortcut?: any) {\n return this.toCollection().toArray(thenShortcut);\n }\n\n /** Table.toCollection()\n * \n * https://dexie.org/docs/Table/Table.toCollection()\n * \n **/\n toCollection() {\n return new this.db.Collection(new this.db.WhereClause(this));\n }\n\n /** Table.orderBy()\n * \n * https://dexie.org/docs/Table/Table.orderBy()\n * \n **/\n orderBy(index: string | string[]) {\n return new this.db.Collection(\n new this.db.WhereClause(this, isArray(index) ?\n `[${index.join('+')}]` :\n index));\n }\n\n /** Table.reverse()\n * \n * https://dexie.org/docs/Table/Table.reverse()\n * \n **/\n reverse(): Collection {\n return this.toCollection().reverse();\n }\n\n /** Table.mapToClass()\n * \n * https://dexie.org/docs/Table/Table.mapToClass()\n * \n **/\n mapToClass(constructor: Function) {\n const {db, name: tableName} = this;\n this.schema.mappedClass = constructor;\n if (constructor.prototype instanceof Entity) {\n constructor = class extends (constructor as any) {\n get db () { return db; }\n table() { return tableName; }\n }\n }\n // Collect all inherited property names (including method names) by\n // walking the prototype chain. This is to avoid overwriting them from\n // database data - so application code can rely on inherited props never\n // becoming shadowed by database object props.\n const inheritedProps = new Set();\n for (let proto = constructor.prototype; proto; proto = getProto(proto)) {\n Object.getOwnPropertyNames(proto).forEach(propName => inheritedProps.add(propName));\n }\n \n // Now, subscribe to the when(\"reading\") event to make all objects that come out from this table inherit from given class\n // no matter which method to use for reading (Table.get() or Table.where(...)... )\n const readHook = (obj: Object) => {\n if (!obj) return obj; // No valid object. (Value is null or undefined). Return as is.\n // Create a new object that derives from constructor:\n const res = Object.create(constructor.prototype);\n // Clone members (but never those that collide with a property in the prototype\n // hierchary (MUST BE ABLE TO RELY ON Entity methods and props!)):\n for (let m in obj) if (!inheritedProps.has(m)) try { res[m] = obj[m]; } catch (_) { }\n return res;\n };\n\n if (this.schema.readHook) {\n this.hook.reading.unsubscribe(this.schema.readHook);\n }\n this.schema.readHook = readHook;\n this.hook(\"reading\", readHook);\n return constructor;\n }\n\n /** @deprecated */\n defineClass() {\n function Class (content){\n extend(this, content);\n };\n return this.mapToClass(Class);\n }\n\n /** Table.add()\n * \n * https://dexie.org/docs/Table/Table.add()\n * \n **/\n add(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd]});\n }).then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.update()\n * \n * https://dexie.org/docs/Table/Table.update()\n * \n **/\n update(keyOrObject, modifications: { [keyPath: string]: any; } | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) {\n const key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath);\n if (key === undefined) return rejection(new exceptions.InvalidArgument(\n \"Given object does not contain its primary key\"));\n /*// object to modify. Also modify given object with the modifications:\n // This part should be here for backward compatibility.\n // If ever feeling too bad about mutating given object, please wait to a new major before removing it,\n // and document the change thoroughly. TODO: Document this change!\n if (!Object.isFrozen(keyOrObject)) try {\n if (typeof modifications !== \"function\") {\n keys(modifications).forEach(keyPath => {\n setByKeyPath(keyOrObject, keyPath, modifications[keyPath]);\n });\n } else {\n // Now since we support function argument, we should have a similar behavior here as well\n // (as long as we do this mutability stuff on the given object)\n modifications(keyOrObject, {value: keyOrObject, primKey: key});\n }\n } catch {\n // Maybe given object was frozen.\n // This part is not essential. Just move on as nothing happened...\n }*/\n return this.where(\":id\").equals(key).modify(modifications);\n } else {\n // key to modify\n return this.where(\":id\").equals(keyOrObject).modify(modifications);\n }\n }\n\n /** Table.put()\n * \n * https://dexie.org/docs/Table/Table.put()\n * \n **/\n put(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans(\n 'readwrite',\n trans => this.core.mutate({trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.delete()\n * \n * https://dexie.org/docs/Table/Table.delete()\n * \n **/\n delete(key: IndexableType): PromiseExtended {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'delete', keys: [key]}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.clear()\n * \n * https://dexie.org/docs/Table/Table.clear()\n * \n **/\n clear() {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'deleteRange', range: AnyRange}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.bulkGet()\n * \n * https://dexie.org/docs/Table/Table.bulkGet()\n * \n * @param keys \n */\n bulkGet(keys: IndexableType[]) {\n return this._trans('readonly', trans => {\n return this.core.getMany({\n keys,\n trans\n }).then(result => result.map(res => this.hook.reading.fire(res)));\n });\n }\n\n /** Table.bulkAdd()\n * \n * https://dexie.org/docs/Table/Table.bulkAdd()\n * \n **/\n bulkAdd(\n objects: readonly any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkAdd(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToAdd = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n return this.core.mutate(\n {trans, type: 'add', keys: keys as IndexableType[], values: objectsToAdd, wantResults}\n )\n .then(({numFailures, results,lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkAdd(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkPut()\n * \n * https://dexie.org/docs/Table/Table.bulkPut()\n * \n **/\n bulkPut(\n objects: readonly any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkPut(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToPut = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n\n return this.core.mutate(\n {trans, type: 'put', keys: keys as IndexableType[], values: objectsToPut, wantResults}\n )\n .then(({numFailures, results, lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkPut(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkUpdate()\n *\n * https://dexie.org/docs/Table.Table.bulkUpdate()\n */\n bulkUpdate(\n keysAndChanges: readonly { key: any; changes: UpdateSpec }[]\n ): PromiseExtended {\n const coreTable = this.core;\n const keys = keysAndChanges.map((entry) => entry.key);\n const changeSpecs = keysAndChanges.map((entry) => entry.changes);\n const offsetMap: number[] = [];\n return this._trans('readwrite', (trans) => {\n return coreTable.getMany({ trans, keys, cache: 'clone' }).then((objs) => {\n const resultKeys: any[] = [];\n const resultObjs: any[] = [];\n keysAndChanges.forEach(({ key, changes }, idx) => {\n const obj = objs[idx];\n if (obj) {\n for (const keyPath of Object.keys(changes)) {\n const value = changes[keyPath];\n if (keyPath === this.schema.primKey.keyPath) {\n if (cmp(value, key) !== 0) {\n throw new exceptions.Constraint(\n `Cannot update primary key in bulkUpdate()`\n );\n }\n } else {\n setByKeyPath(obj, keyPath, value);\n }\n }\n offsetMap.push(idx);\n resultKeys.push(key);\n resultObjs.push(obj);\n }\n });\n const numEntries = resultKeys.length;\n return coreTable\n .mutate({\n trans,\n type: 'put',\n keys: resultKeys,\n values: resultObjs,\n updates: {\n keys,\n changeSpecs\n }\n })\n .then(({ numFailures, failures }) => {\n if (numFailures === 0) return numEntries;\n // Failure. bulkPut() may have a subset of keys\n // so we must translate returned 'failutes' into the offsets of given argument:\n for (const offset of Object.keys(failures)) {\n const mappedOffset = offsetMap[Number(offset)];\n if (mappedOffset != null) {\n const failure = failures[offset];\n delete failures[offset];\n failures[mappedOffset] = failure;\n }\n }\n throw new BulkError(\n `${this.name}.bulkUpdate(): ${numFailures} of ${numEntries} operations failed`,\n failures\n );\n });\n });\n });\n }\n\n /** Table.bulkDelete()\n * \n * https://dexie.org/docs/Table/Table.bulkDelete()\n * \n **/\n bulkDelete(keys: ReadonlyArray): PromiseExtended {\n const numKeys = keys.length;\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'delete', keys: keys as IndexableType[]});\n }).then(({numFailures, lastResult, failures}) => {\n if (numFailures === 0) return lastResult;\n throw new BulkError(\n `${this.name}.bulkDelete(): ${numFailures} of ${numKeys} operations failed`, failures);\n });\n }\n}\n","import {keys, isArray, asap} from '../functions/utils';\nimport {nop, mirror, reverseStoppableEventChain} from '../functions/chaining-functions';\nimport {exceptions} from '../errors';\n\nexport default function Events(ctx) {\n var evs = {};\n var rv = function (eventName, subscriber) {\n if (subscriber) {\n // Subscribe. If additional arguments than just the subscriber was provided, forward them as well.\n var i = arguments.length, args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n evs[eventName].subscribe.apply(null, args);\n return ctx;\n } else if (typeof (eventName) === 'string') {\n // Return interface allowing to fire or unsubscribe from event\n return evs[eventName];\n }\n };\n rv.addEventType = add;\n \n for (var i = 1, l = arguments.length; i < l; ++i) {\n add(arguments[i]);\n }\n \n return rv;\n\n function add(eventName, chainFunction, defaultFunction) {\n if (typeof eventName === 'object') return addConfiguredEvents(eventName);\n if (!chainFunction) chainFunction = reverseStoppableEventChain;\n if (!defaultFunction) defaultFunction = nop;\n\n var context = {\n subscribers: [],\n fire: defaultFunction,\n subscribe: function (cb) {\n if (context.subscribers.indexOf(cb) === -1) {\n context.subscribers.push(cb);\n context.fire = chainFunction(context.fire, cb);\n }\n },\n unsubscribe: function (cb) {\n context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; });\n context.fire = context.subscribers.reduce(chainFunction, defaultFunction);\n }\n };\n evs[eventName] = rv[eventName] = context;\n return context;\n }\n\n function addConfiguredEvents(cfg) {\n // events(this, {reading: [functionChain, nop]});\n keys(cfg).forEach(function (eventName) {\n var args = cfg[eventName];\n if (isArray(args)) {\n add(eventName, cfg[eventName][0], cfg[eventName][1]);\n } else if (args === 'asap') {\n // Rather than approaching event subscription using a functional approach, we here do it in a for-loop where subscriber is executed in its own stack\n // enabling that any exception that occur wont disturb the initiator and also not nescessary be catched and forgotten.\n var context = add(eventName, mirror, function fire() {\n // Optimazation-safe cloning of arguments into args.\n var i = arguments.length, args = new Array(i);\n while (i--) args[i] = arguments[i];\n // All each subscriber:\n context.subscribers.forEach(function (fn) {\n asap(function fireEvent() {\n fn.apply(null, args);\n });\n });\n });\n } else throw new exceptions.InvalidArgument(\"Invalid event config\");\n });\n }\n}\n","import { arrayToObject, derive } from './utils';\n\n\nexport function makeClassConstructor (prototype: Object, constructor: Function) {\n /*const propertyDescriptorMap = arrayToObject(\n Object.getOwnPropertyNames(prototype),\n propKey => [propKey, Object.getOwnPropertyDescriptor(prototype, propKey)]);\n\n // Both derive and clone the prototype.\n // derive: So that x instanceof T returns true when T is the class template.\n // clone: Optimizes method access a bit (but actually not nescessary)\n const derivedPrototypeClone = Object.create(prototype, propertyDescriptorMap);\n derivedPrototypeClone.constructor = constructor;\n constructor.prototype = derivedPrototypeClone;\n return constructor as any as TConstructor;*/\n\n // Keep the above code in case we want to clone AND derive the parent prototype.\n // Reason would be optimization of property access.\n // The code below will only create a prototypal inheritance from given constructor function\n // to given prototype.\n derive(constructor).from({prototype});\n return constructor as any as TConstructor; \n}\n","import { Dexie } from '../dexie';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { Transaction } from '../transaction/transaction';\nimport { hookCreatingChain, pureFunctionChain, nop, mirror, hookUpdatingChain, hookDeletingChain } from '../../functions/chaining-functions';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { Table } from './table';\nimport Events from '../../helpers/Events';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\n\nexport interface TableConstructor {\n new (name: string, tableSchema: TableSchema, optionalTrans?: Transaction) : Table;\n prototype: Table;\n}\n\n/** Generates a Table constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTableConstructor (db: Dexie) {\n return makeClassConstructor(\n Table.prototype,\n\n function Table (this: Table, name: string, tableSchema: TableSchema, trans?: Transaction) {\n this.db = db;\n this._tx = trans;\n this.name = name;\n this.schema = tableSchema;\n this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, {\n \"creating\": [hookCreatingChain, nop],\n \"reading\": [pureFunctionChain, mirror],\n \"updating\": [hookUpdatingChain, nop],\n \"deleting\": [hookDeletingChain, nop]\n }) as TableHooks;\n }\n\n );\n}\n","import { combine } from \"../../functions/combine\";\nimport { exceptions } from \"../../errors\";\nimport { hasOwn } from \"../../functions/utils\";\nimport { wrap } from \"../../helpers/promise\";\nimport { Collection } from './';\nimport { DBCoreCursor, DBCoreTable, DBCoreTransaction, DBCoreTableSchema, DBCoreRangeType } from '../../public/types/dbcore';\nimport { nop } from '../../functions/chaining-functions';\n\ntype CollectionContext = Collection[\"_ctx\"];\n\nexport function isPlainKeyRange (ctx: CollectionContext, ignoreLimitFilter?: boolean) {\n return !(ctx.filter || ctx.algorithm || ctx.or) &&\n (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter);\n} \n\nexport function addFilter(ctx: CollectionContext, fn: Function) {\n ctx.filter = combine(ctx.filter, fn);\n}\n\nexport function addReplayFilter (ctx: CollectionContext, factory, isLimitFilter?) {\n var curr = ctx.replayFilter;\n ctx.replayFilter = curr ? ()=>combine(curr(), factory()) : factory;\n ctx.justLimit = isLimitFilter && !curr;\n}\n\nexport function addMatchFilter(ctx: CollectionContext, fn) {\n ctx.isMatch = combine(ctx.isMatch, fn);\n}\n\nexport function getIndexOrStore(ctx: CollectionContext, coreSchema: DBCoreTableSchema) {\n // TODO: Rewrite this. No need to know ctx.isPrimKey. ctx.index should hold the keypath.\n // Still, throw if not found!\n if (ctx.isPrimKey) return coreSchema.primaryKey;\n const index = coreSchema.getIndexByKeyPath(ctx.index);\n if (!index) throw new exceptions.Schema(\"KeyPath \" + ctx.index + \" on object store \" + coreSchema.name + \" is not indexed\");\n return index;\n}\n\nexport function openCursor(ctx: CollectionContext, coreTable: DBCoreTable, trans: DBCoreTransaction) {\n const index = getIndexOrStore(ctx, coreTable.schema);\n return coreTable.openCursor({\n trans,\n values: !ctx.keysOnly,\n reverse: ctx.dir === 'prev',\n unique: !!ctx.unique,\n query: {\n index, \n range: ctx.range\n }\n });\n}\n\nexport function iter (\n ctx: CollectionContext, \n fn: (item, cursor: DBCoreCursor, advance: Function)=>void,\n coreTrans: DBCoreTransaction,\n coreTable: DBCoreTable): Promise\n{\n const filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter;\n if (!ctx.or) {\n return iterate(\n openCursor(ctx, coreTable, coreTrans),\n combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper);\n } else {\n const set = {};\n\n const union = (item: any, cursor: DBCoreCursor, advance) => {\n if (!filter || filter(cursor, advance, result=>cursor.stop(result), err => cursor.fail(err))) {\n var primaryKey = cursor.primaryKey;\n var key = '' + primaryKey;\n if (key === '[object ArrayBuffer]') key = '' + new Uint8Array(primaryKey);\n if (!hasOwn(set, key)) {\n set[key] = true;\n fn(item, cursor, advance);\n }\n }\n }\n\n return Promise.all([\n ctx.or._iterate(union, coreTrans),\n iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper)\n ]);\n }\n}\n\nfunction iterate(cursorPromise: Promise, filter, fn, valueMapper): Promise {\n \n // Apply valueMapper (hook('reading') or mappped class)\n var mappedFn = valueMapper ? (x,c,a) => fn(valueMapper(x),c,a) : fn;\n // Wrap fn with PSD and microtick stuff from Promise.\n var wrappedFn = wrap(mappedFn);\n \n return cursorPromise.then(cursor => {\n if (cursor) {\n return cursor.start(()=>{\n var c = ()=>cursor.continue();\n if (!filter || filter(cursor, advancer => c = advancer, val=>{cursor.stop(val);c=nop}, e => {cursor.fail(e);c = nop;}))\n wrappedFn(cursor.value, cursor, advancer => c = advancer);\n c();\n });\n }\n });\n}\n","import { isArray } from \"../functions/utils\";\nimport { PropModSpec } from \"../public/types/prop-modification\";\n\nexport const PropModSymbol: unique symbol = Symbol();\n\n/** Consistent change propagation across offline synced data.\n * \n * This class is executed client- and server side on sync, making\n * an operation consistent across sync for full consistency and accuracy.\n * \n * Example: An object represents a bank account with a balance.\n * One offline user adds $ 1.00 to the balance.\n * Another user (online) adds $ 2.00 to the balance.\n * When first user syncs, the balance becomes the sum of every operation (3.00).\n * \n * -- initial: balance is 0\n * 1. db.bankAccounts.update(1, { balance: new ProdModification({add: 100})}) // user 1 (offline)\n * 2. db.bankAccounts.update(1, { balance: new ProdModification({add: 200})}) // user 2 (online)\n * -- before user 1 syncs, balance is 200 (representing money with integers * 100 to avoid rounding issues)\n * \n * -- balance is 300\n * \n * When new operations are added, they need to be added to:\n * 1. PropModSpec interface\n * 2. Here in PropModification with the logic they represent\n * 3. (Optionally) a sugar function for it, such as const mathAdd = (amount: number | BigInt) => new PropModification({mathAdd: amount})\n */\nexport class PropModification implements PropModSpec {\n [PropModSymbol]?: true;\n replacePrefix?: [string, string];\n add?: number | BigInt | Array;\n remove?: number | BigInt | Array;\n\n execute(value: any): any {\n // add (mathematical or set-wise)\n if (this.add !== undefined) {\n const term = this.add;\n // Set-addition on array representing a set of primitive types (strings, numbers)\n if (isArray(term)) {\n return [...(isArray(value) ? value : []), ...term].sort();\n }\n // Mathematical addition:\n if (typeof term === 'number') return (Number(value) || 0) + term; // if value is not convertible to number, return 0 + term\n if (typeof term === 'bigint') {\n try {\n return BigInt(value) + term;\n } catch {\n return BigInt(0) + term; // Unlike Number(value) that can return NaN, BigInt(value) throws if value is not BigInt, Number or numeric string\n }\n }\n throw new TypeError(`Invalid term ${term}`);\n }\n\n // remove (mathematical or set-wise)\n if (this.remove !== undefined) {\n const subtrahend = this.remove;\n // Set-addition on array representing a set of primitive types (strings, numbers)\n if (isArray(subtrahend)) {\n return isArray(value) ? value.filter(item => !subtrahend.includes(item)).sort() : [];\n } \n // Mathematical addition:\n if (typeof subtrahend === 'number') return Number(value) - subtrahend;\n if (typeof subtrahend === 'bigint') {\n try {\n return BigInt(value) - subtrahend;\n } catch {\n return BigInt(0) - subtrahend; // Unlike Number(value) that can return NaN, BigInt(value) throws if value is not BigInt, Number or numeric string\n }\n }\n throw new TypeError(`Invalid subtrahend ${subtrahend}`);\n }\n\n // Replace a prefix:\n const prefixToReplace = this.replacePrefix?.[0];\n if (prefixToReplace && typeof value === 'string' && value.startsWith(prefixToReplace)) {\n return this.replacePrefix[1] + value.substring(prefixToReplace.length);\n }\n return value;\n }\n\n constructor(spec: PropModSpec) {\n Object.assign(this, spec);\n }\n}\n","import { Collection as ICollection } from \"../../public/types/collection\";\nimport { Dexie } from \"../dexie\";\nimport { Table } from \"../table\";\nimport { IndexableType, IndexableTypeArrayReadonly } from \"../../public/types/indexable-type\";\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { iter, isPlainKeyRange, getIndexOrStore, addReplayFilter, addFilter, addMatchFilter } from \"./collection-helpers\";\nimport { rejection } from \"../../helpers/promise\";\nimport { combine } from \"../../functions/combine\";\nimport { extend, hasOwn, deepClone, keys, setByKeyPath, getByKeyPath } from \"../../functions/utils\";\nimport { ModifyError } from \"../../errors\";\nimport { ThenShortcut } from \"../../public/types/then-shortcut\";\nimport { Transaction } from '../transaction';\nimport { DBCoreCursor, DBCoreTransaction, DBCoreRangeType, DBCoreMutateResponse, DBCoreKeyRange } from '../../public/types/dbcore';\nimport { cmp } from \"../../functions/cmp\";\nimport { PropModification } from \"../../helpers/prop-modification\";\nimport { UpdateSpec } from \"../../public/types/update-spec\";\n\n/** class Collection\n * \n * https://dexie.org/docs/Collection/Collection\n */\nexport class Collection implements ICollection {\n db: Dexie;\n _ctx: {\n table: Table;\n index?: string | null;\n isPrimKey?: boolean;\n range: DBCoreKeyRange;\n keysOnly: boolean;\n dir: \"next\" | \"prev\";\n unique: \"\" | \"unique\";\n algorithm?: Function | null;\n filter?: Function | null;\n replayFilter: Function | null;\n justLimit: boolean; // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: Function | null;\n offset: number,\n limit: number,\n error: any, // If set, any promise must be rejected with this error\n or: Collection,\n valueMapper: (any) => any\n }\n \n _ondirectionchange?: Function;\n\n _read(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike, cb?): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readonly', fn).then(cb);\n }\n\n _write(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readwrite', fn, \"locked\"); // When doing write operations on collections, always lock the operation so that upcoming operations gets queued.\n }\n\n _addAlgorithm(fn) {\n var ctx = this._ctx;\n ctx.algorithm = combine(ctx.algorithm, fn);\n }\n\n _iterate(\n fn: (item, cursor: DBCoreCursor, advance: Function) => void,\n coreTrans: DBCoreTransaction) : Promise\n {\n return iter(this._ctx, fn, coreTrans, this._ctx.table.core);\n }\n\n /** Collection.clone()\n * \n * https://dexie.org/docs/Collection/Collection.clone()\n * \n **/\n clone(props?): this {\n var rv = Object.create(this.constructor.prototype),\n ctx = Object.create(this._ctx);\n if (props) extend(ctx, props);\n rv._ctx = ctx;\n return rv;\n }\n\n /** Collection.raw()\n * \n * https://dexie.org/docs/Collection/Collection.raw()\n * \n **/\n raw(): this {\n this._ctx.valueMapper = null;\n return this;\n }\n\n /** Collection.each()\n * \n * https://dexie.org/docs/Collection/Collection.each()\n * \n **/\n each(fn: (obj, cursor: DBCoreCursor) => any): PromiseExtended {\n var ctx = this._ctx;\n\n return this._read(trans => iter(ctx, fn, trans, ctx.table.core));\n }\n\n /** Collection.count()\n * \n * https://dexie.org/docs/Collection/Collection.count()\n * \n **/\n count(cb?) {\n return this._read(trans => {\n const ctx = this._ctx;\n const coreTable = ctx.table.core;\n if (isPlainKeyRange(ctx, true)) {\n // This is a plain key range. We can use the count() method if the index.\n return coreTable.count({\n trans,\n query: {\n index: getIndexOrStore(ctx, coreTable.schema),\n range: ctx.range\n }\n }).then(count => Math.min(count, ctx.limit));\n } else {\n // Algorithms, filters or expressions are applied. Need to count manually.\n var count = 0;\n return iter(ctx, () => { ++count; return false; }, trans, coreTable)\n .then(()=>count);\n }\n }).then(cb);\n }\n\n /** Collection.sortBy()\n * \n * https://dexie.org/docs/Collection/Collection.sortBy()\n * \n **/\n sortBy(keyPath: string): PromiseExtended;\n sortBy(keyPath: string, thenShortcut: ThenShortcut) : PromiseExtended;\n sortBy(keyPath: string, cb?: ThenShortcut) {\n const parts = keyPath.split('.').reverse(),\n lastPart = parts[0],\n lastIndex = parts.length - 1;\n function getval(obj, i) {\n if (i) return getval(obj[parts[i]], i - 1);\n return obj[lastPart];\n }\n var order = this._ctx.dir === \"next\" ? 1 : -1;\n\n function sorter(a, b) {\n var aVal = getval(a, lastIndex),\n bVal = getval(b, lastIndex);\n return aVal < bVal ? -order : aVal > bVal ? order : 0;\n }\n return this.toArray(function (a) {\n return a.sort(sorter);\n }).then(cb);\n }\n\n /** Collection.toArray()\n * \n * https://dexie.org/docs/Collection/Collection.toArray()\n * \n **/\n toArray(cb?): PromiseExtended {\n return this._read(trans => {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAll() or\n // IDBKeyRange.getAll():\n const {valueMapper} = ctx;\n const index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n limit: ctx.limit,\n values: true,\n query: {\n index,\n range: ctx.range\n }\n }).then(({result}) => valueMapper ? result.map(valueMapper) : result);\n } else {\n // Getting array through a cursor.\n const a = [];\n return iter(ctx, item => a.push(item), trans, ctx.table.core).then(()=>a);\n }\n }, cb);\n }\n\n /** Collection.offset()\n * \n * https://dexie.org/docs/Collection/Collection.offset()\n * \n **/\n offset(offset: number) : Collection{\n var ctx = this._ctx;\n if (offset <= 0) return this;\n ctx.offset += offset; // For count()\n if (isPlainKeyRange(ctx)) {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return (cursor, advance) => {\n if (offsetLeft === 0) return true;\n if (offsetLeft === 1) { --offsetLeft; return false; }\n advance(() => {\n cursor.advance(offsetLeft);\n offsetLeft = 0;\n });\n return false;\n };\n });\n } else {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return () => (--offsetLeft < 0);\n });\n }\n return this;\n }\n\n /** Collection.limit()\n * \n * https://dexie.org/docs/Collection/Collection.limit()\n * \n **/\n limit(numRows: number) : Collection {\n this._ctx.limit = Math.min(this._ctx.limit, numRows); // For count()\n addReplayFilter(this._ctx, () => {\n var rowsLeft = numRows;\n return function (cursor, advance, resolve) {\n if (--rowsLeft <= 0) advance(resolve); // Stop after this item has been included\n return rowsLeft >= 0; // If numRows is already below 0, return false because then 0 was passed to numRows initially. Otherwise we wouldnt come here.\n };\n }, true);\n return this;\n }\n\n /** Collection.until()\n * \n * https://dexie.org/docs/Collection/Collection.until()\n * \n **/\n until(filterFunction: (x) => boolean, bIncludeStopEntry?) {\n addFilter(this._ctx, function (cursor, advance, resolve) {\n if (filterFunction(cursor.value)) {\n advance(resolve);\n return bIncludeStopEntry;\n } else {\n return true;\n }\n });\n return this;\n }\n\n /** Collection.first()\n * \n * https://dexie.org/docs/Collection/Collection.first()\n * \n **/\n first(cb?) {\n return this.limit(1).toArray(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.last()\n * \n * https://dexie.org/docs/Collection/Collection.last()\n * \n **/\n last(cb?) {\n return this.reverse().first(cb);\n }\n\n /** Collection.filter()\n * \n * https://dexie.org/docs/Collection/Collection.filter()\n * \n **/\n filter(filterFunction: (x) => boolean): Collection {\n /// function(val){return true/false}\n addFilter(this._ctx, function (cursor) {\n return filterFunction(cursor.value);\n });\n // match filters not used in Dexie.js but can be used by 3rd part libraries to test a\n // collection for a match without querying DB. Used by Dexie.Observable.\n addMatchFilter(this._ctx, filterFunction);\n return this;\n }\n\n /** Collection.and()\n * \n * https://dexie.org/docs/Collection/Collection.and()\n * \n **/\n and(filter: (x) => boolean) {\n return this.filter(filter);\n }\n\n /** Collection.or()\n * \n * https://dexie.org/docs/Collection/Collection.or()\n * \n **/\n or(indexName: string) {\n return new this.db.WhereClause(this._ctx.table, indexName, this);\n }\n\n /** Collection.reverse()\n * \n * https://dexie.org/docs/Collection/Collection.reverse()\n * \n **/\n reverse() {\n this._ctx.dir = (this._ctx.dir === \"prev\" ? \"next\" : \"prev\");\n if (this._ondirectionchange) this._ondirectionchange(this._ctx.dir);\n return this;\n }\n\n /** Collection.desc()\n * \n * https://dexie.org/docs/Collection/Collection.desc()\n * \n **/\n desc() {\n return this.reverse();\n }\n\n /** Collection.eachKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachKey()\n * \n **/\n eachKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.key, cursor); });\n }\n\n /** Collection.eachUniqueKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachUniqueKey()\n * \n **/\n eachUniqueKey(cb?) {\n this._ctx.unique = \"unique\";\n return this.eachKey(cb);\n }\n\n /** Collection.eachPrimaryKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachPrimaryKey()\n * \n **/\n eachPrimaryKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); });\n }\n\n /** Collection.keys()\n * \n * https://dexie.org/docs/Collection/Collection.keys()\n * \n **/\n keys(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.key);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.primaryKeys()\n * \n * https://dexie.org/docs/Collection/Collection.primaryKeys()\n * \n **/\n primaryKeys(cb?) : PromiseExtended {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAllKeys() or\n // IDBKeyRange.getAllKeys():\n return this._read(trans => {\n var index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n values: false,\n limit: ctx.limit,\n query: {\n index,\n range: ctx.range\n }});\n }).then(({result})=>result).then(cb);\n }\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.primaryKey);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.uniqueKeys()\n * \n * https://dexie.org/docs/Collection/Collection.uniqueKeys()\n * \n **/\n uniqueKeys(cb?) {\n this._ctx.unique = \"unique\";\n return this.keys(cb);\n }\n\n /** Collection.firstKey()\n * \n * https://dexie.org/docs/Collection/Collection.firstKey()\n * \n **/\n firstKey(cb?) {\n return this.limit(1).keys(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.lastKey()\n * \n * https://dexie.org/docs/Collection/Collection.lastKey()\n * \n **/\n lastKey(cb?) {\n return this.reverse().firstKey(cb);\n }\n\n /** Collection.distinct()\n * \n * https://dexie.org/docs/Collection/Collection.distinct()\n * \n **/\n distinct() {\n var ctx = this._ctx,\n idx = ctx.index && ctx.table.schema.idxByName[ctx.index];\n if (!idx || !idx.multi) return this; // distinct() only makes differencies on multiEntry indexes.\n var set = {};\n addFilter(this._ctx, function (cursor: DBCoreCursor) {\n var strKey = cursor.primaryKey.toString(); // Converts any Date to String, String to String, Number to String and Array to comma-separated string\n var found = hasOwn(set, strKey);\n set[strKey] = true;\n return !found;\n });\n return this;\n }\n\n //\n // Methods that mutate storage\n //\n\n /** Collection.modify()\n * \n * https://dexie.org/docs/Collection/Collection.modify()\n * \n **/\n modify(changes: UpdateSpec | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n var ctx = this._ctx;\n return this._write(trans => {\n var modifyer: (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean\n if (typeof changes === 'function') {\n // Changes is a function that may update, add or delete propterties or even require a deletion the object itself (delete this.item)\n modifyer = changes as (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean;\n } else {\n // changes is a set of {keyPath: value} and no one is listening to the updating hook.\n var keyPaths = keys(changes);\n var numKeys = keyPaths.length;\n modifyer = function (item) {\n let anythingModified = false;\n for (let i = 0; i < numKeys; ++i) {\n let keyPath = keyPaths[i];\n let val = changes[keyPath];\n let origVal = getByKeyPath(item, keyPath);\n\n if (val instanceof PropModification) {\n setByKeyPath(item, keyPath, val.execute(origVal));\n anythingModified = true;\n } else if (origVal !== val) {\n setByKeyPath(item, keyPath, val); // Adding {keyPath: undefined} means that the keyPath should be deleted. Handled by setByKeyPath\n anythingModified = true;\n }\n }\n return anythingModified;\n };\n }\n\n const coreTable = ctx.table.core;\n const {outbound, extractKey} = coreTable.schema.primaryKey;\n const limit = this.db._options.modifyChunkSize || 200;\n const totalFailures = [];\n let successCount = 0;\n const failedKeys: IndexableType[] = [];\n const applyMutateResult = (expectedCount: number, res: DBCoreMutateResponse) => {\n const {failures, numFailures} = res;\n successCount += expectedCount - numFailures;\n for (let pos of keys(failures)) {\n totalFailures.push(failures[pos]);\n }\n }\n return this.clone().primaryKeys().then(keys => {\n const criteria = isPlainKeyRange(ctx) &&\n ctx.limit === Infinity &&\n (typeof changes !== 'function' || changes === deleteCallback) && {\n index: ctx.index,\n range: ctx.range\n };\n\n const nextChunk = (offset: number) => {\n const count = Math.min(limit, keys.length - offset);\n return coreTable.getMany({\n trans,\n keys: keys.slice(offset, offset + count),\n cache: \"immutable\" // Optimize for 2 things:\n // 1) observability-middleware can track changes better.\n // 2) hooks middleware don't have to query the existing values again when tracking changes.\n // We can use \"immutable\" because we promise to not touch the values we retrieve here!\n }).then(values => {\n const addValues = [];\n const putValues = [];\n const putKeys = outbound ? [] : null;\n const deleteKeys = [];\n for (let i=0; i 0 &&\n coreTable.mutate({trans, type: 'add', values: addValues})\n .then(res => {\n for (let pos in res.failures) {\n // Remove from deleteKeys the key of the object that failed to change its primary key\n deleteKeys.splice(parseInt(pos), 1);\n }\n applyMutateResult(addValues.length, res);\n })\n ).then(()=>(putValues.length > 0 || (criteria && typeof changes === 'object')) &&\n coreTable.mutate({\n trans,\n type: 'put',\n keys: putKeys,\n values: putValues,\n criteria,\n changeSpec: typeof changes !== 'function'\n && changes,\n isAdditionalChunk: offset > 0\n }).then(res=>applyMutateResult(putValues.length, res))\n ).then(()=>(deleteKeys.length > 0 || (criteria && changes === deleteCallback)) &&\n coreTable.mutate({\n trans,\n type: 'delete',\n keys: deleteKeys,\n criteria,\n isAdditionalChunk: offset > 0\n }).then(res=>applyMutateResult(deleteKeys.length, res))\n ).then(()=>{\n return keys.length > offset + count && nextChunk(offset + limit);\n });\n });\n }\n\n return nextChunk(0).then(()=>{\n if (totalFailures.length > 0)\n throw new ModifyError(\"Error modifying one or more objects\", totalFailures, successCount, failedKeys as IndexableTypeArrayReadonly);\n\n return keys.length;\n });\n });\n\n });\n }\n\n /** Collection.delete()\n * \n * https://dexie.org/docs/Collection/Collection.delete()\n * \n **/\n delete() : PromiseExtended {\n var ctx = this._ctx,\n range = ctx.range;\n //deletingHook = ctx.table.hook.deleting.fire,\n //hasDeleteHook = deletingHook !== nop;\n if (isPlainKeyRange(ctx) &&\n (ctx.isPrimKey || range.type === DBCoreRangeType.Any)) // if no range, we'll use clear().\n {\n // May use IDBObjectStore.delete(IDBKeyRange) in this case (Issue #208)\n // For chromium, this is the way most optimized version.\n // For IE/Edge, this could hang the indexedDB engine and make operating system instable\n // (https://gist.github.com/dfahlander/5a39328f029de18222cf2125d56c38f7)\n return this._write(trans => {\n // Our API contract is to return a count of deleted items, so we have to count() before delete().\n const {primaryKey} = ctx.table.core.schema;\n const coreRange = range;\n return ctx.table.core.count({trans, query: {index: primaryKey, range: coreRange}}).then(count => {\n return ctx.table.core.mutate({trans, type: 'deleteRange', range: coreRange})\n .then(({failures, lastResult, results, numFailures}) => {\n if (numFailures) throw new ModifyError(\"Could not delete some values\",\n Object.keys(failures).map(pos => failures[pos]),\n count - numFailures);\n return count - numFailures;\n });\n });\n });\n }\n\n return this.modify(deleteCallback);\n }\n}\n\nconst deleteCallback = (value, ctx) => ctx.value = null;\n","import { Dexie } from '../../classes/dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Collection } from './collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\nimport { mirror } from '../../functions/chaining-functions';\n\n/** Constructs a Collection instance. */\nexport interface CollectionConstructor {\n new(whereClause?: WhereClause | null, keyRangeGenerator?: () => DBCoreKeyRange): Collection;\n prototype: Collection;\n}\n\n/** Generates a Collection constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createCollectionConstructor(db: Dexie) {\n return makeClassConstructor(\n Collection.prototype,\n\n function Collection(\n this: Collection,\n whereClause?: WhereClause | null,\n keyRangeGenerator?: () => DBCoreKeyRange)\n {\n this.db = db;\n let keyRange = AnyRange, error = null;\n if (keyRangeGenerator) try {\n keyRange = keyRangeGenerator();\n } catch (ex) {\n error = ex;\n }\n\n const whereCtx = whereClause._ctx;\n const table = whereCtx.table;\n const readingHook = table.hook.reading.fire;\n this._ctx = {\n table: table,\n index: whereCtx.index,\n isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)),\n range: keyRange,\n keysOnly: false,\n dir: \"next\",\n unique: \"\",\n algorithm: null,\n filter: null,\n replayFilter: null,\n justLimit: true, // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: null,\n offset: 0,\n limit: Infinity,\n error: error, // If set, any promise must be rejected with this error\n or: whereCtx.or,\n valueMapper: readingHook !== mirror ? readingHook : null\n };\n }\n );\n}\n","import { IndexableType } from '../public/types/indexable-type';\n\nexport function simpleCompare(a, b) {\n return a < b ? -1 : a === b ? 0 : 1;\n}\n\nexport function simpleCompareReverse(a, b) {\n return a > b ? -1 : a === b ? 0 : 1;\n}\n","import { WhereClause } from './where-clause';\nimport { Collection } from '../collection';\nimport { STRING_EXPECTED } from '../../globals/constants';\nimport { simpleCompare, simpleCompareReverse } from '../../functions/compare-functions';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange, DBCoreRangeType } from '../../public/types/dbcore';\n\nexport function fail(collectionOrWhereClause: Collection | WhereClause, err, T?) {\n var collection = collectionOrWhereClause instanceof WhereClause ?\n new collectionOrWhereClause.Collection (collectionOrWhereClause) :\n collectionOrWhereClause;\n \n collection._ctx.error = T ? new T(err) : new TypeError(err);\n return collection;\n}\n\nexport function emptyCollection(whereClause: WhereClause) {\n return new whereClause.Collection (whereClause, () => rangeEqual(\"\")).limit(0);\n}\n\nexport function upperFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toUpperCase() :\n (s: string) => s.toLowerCase();\n}\n\nexport function lowerFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toLowerCase() :\n (s: string) => s.toUpperCase();\n}\n\nexport function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) {\n var length = Math.min(key.length, lowerNeedle.length);\n var llp = -1;\n for (var i = 0; i < length; ++i) {\n var lwrKeyChar = lowerKey[i];\n if (lwrKeyChar !== lowerNeedle[i]) {\n if (cmp(key[i], upperNeedle[i]) < 0) return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1);\n if (cmp(key[i], lowerNeedle[i]) < 0) return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1);\n if (llp >= 0) return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1);\n return null;\n }\n if (cmp(key[i], lwrKeyChar) < 0) llp = i;\n }\n if (length < lowerNeedle.length && dir === \"next\") return key + upperNeedle.substr(key.length);\n if (length < key.length && dir === \"prev\") return key.substr(0, upperNeedle.length);\n return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1));\n}\n\nexport function addIgnoreCaseAlgorithm(whereClause: WhereClause, match, needles, suffix) {\n /// \n var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix,\n needlesLen = needles.length;\n if (!needles.every(s => typeof s === 'string')) {\n return fail(whereClause, STRING_EXPECTED);\n }\n function initDirection(dir) {\n upper = upperFactory(dir);\n lower = lowerFactory(dir);\n compare = (dir === \"next\" ? simpleCompare : simpleCompareReverse);\n var needleBounds = needles.map(function (needle){\n return {lower: lower(needle), upper: upper(needle)};\n }).sort(function(a,b) {\n return compare(a.lower, b.lower);\n });\n upperNeedles = needleBounds.map(function (nb){ return nb.upper; });\n lowerNeedles = needleBounds.map(function (nb){ return nb.lower; });\n direction = dir;\n nextKeySuffix = (dir === \"next\" ? \"\" : suffix);\n }\n initDirection(\"next\");\n\n var c = new whereClause.Collection (\n whereClause,\n ()=>createRange(upperNeedles[0], lowerNeedles[needlesLen-1] + suffix)\n );\n\n c._ondirectionchange = function (direction) {\n // This event onlys occur before filter is called the first time.\n initDirection(direction);\n };\n\n var firstPossibleNeedle = 0;\n\n c._addAlgorithm(function (cursor, advance, resolve) {\n /// \n /// \n /// \n var key = cursor.key;\n if (typeof key !== 'string') return false;\n var lowerKey = lower(key);\n if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) {\n return true;\n } else {\n var lowestPossibleCasing = null;\n for (var i=firstPossibleNeedle; i 0) {\n lowestPossibleCasing = casing;\n }\n }\n if (lowestPossibleCasing !== null) {\n advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); });\n } else {\n advance(resolve);\n }\n return false;\n }\n });\n return c;\n}\n\nexport function createRange (lower: IndexableType, upper: IndexableType, lowerOpen?: boolean, upperOpen?: boolean): DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Range,\n lower,\n upper,\n lowerOpen,\n upperOpen\n };\n}\n\nexport function rangeEqual (value: IndexableType) : DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Equal,\n lower: value,\n upper: value\n };\n}\n","import { WhereClause as IWhereClause } from \"../../public/types/where-clause\";\nimport { Collection } from \"../collection\";\nimport { Table } from \"../table\";\nimport { IndexableType } from \"../../public/types/indexable-type\";\nimport { emptyCollection, fail, addIgnoreCaseAlgorithm, createRange, rangeEqual } from './where-clause-helpers';\nimport { INVALID_KEY_ARGUMENT, STRING_EXPECTED, maxString, minKey } from '../../globals/constants';\nimport { getArrayOf, NO_CHAR_ARRAY } from '../../functions/utils';\nimport { exceptions } from '../../errors';\nimport { Dexie } from '../dexie';\nimport { Collection as ICollection} from \"../../public/types/collection\";\n\n/** class WhereClause\n * \n * https://dexie.org/docs/WhereClause/WhereClause\n */\nexport class WhereClause implements IWhereClause {\n db: Dexie;\n _IDBKeyRange: typeof IDBKeyRange;\n _ctx: {\n table: Table;\n index: string;\n or: Collection;\n }\n _cmp: (a: IndexableType, b: IndexableType) => number;\n _ascending: (a: IndexableType, b: IndexableType) => number;\n _descending: (a: IndexableType, b: IndexableType) => number;\n _min: (a: IndexableType, b: IndexableType) => IndexableType;\n _max: (a: IndexableType, b: IndexableType) => IndexableType;\n\n get Collection() {\n return this._ctx.table.db.Collection;\n }\n\n /** WhereClause.between()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.between()\n * \n **/\n between(lower: IndexableType, upper: IndexableType, includeLower?: boolean, includeUpper?: boolean) {\n includeLower = includeLower !== false; // Default to true\n includeUpper = includeUpper === true; // Default to false\n try {\n if ((this._cmp(lower, upper) > 0) ||\n (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper)))\n return emptyCollection(this); // Workaround for idiotic W3C Specification that DataError must be thrown if lower > upper. The natural result would be to return an empty collection.\n return new this.Collection(this, ()=>createRange(lower, upper, !includeLower, !includeUpper));\n } catch (e) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n }\n\n /** WhereClause.equals()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equals()\n * \n **/\n equals(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => rangeEqual(value)) as ICollection;\n }\n\n /** WhereClause.above()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.above()\n * \n **/\n above(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, true));\n }\n\n /** WhereClause.aboveOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.aboveOrEqual()\n * \n **/\n aboveOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, false));\n }\n\n /** WhereClause.below()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.below()\n * \n **/\n below(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value, false, true));\n }\n\n /** WhereClause.belowOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.belowOrEqual()\n * \n **/\n belowOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value));\n }\n\n /** WhereClause.startsWith()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWith()\n * \n **/\n startsWith(str: string) {\n if (typeof str !== 'string') return fail(this, STRING_EXPECTED);\n return this.between(str, str + maxString, true, true);\n }\n\n /** WhereClause.startsWithIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithIgnoreCase()\n * \n **/\n startsWithIgnoreCase(str: string) {\n if (str === \"\") return this.startsWith(str);\n return addIgnoreCaseAlgorithm(this, (x, a) => x.indexOf(a[0]) === 0, [str], maxString);\n }\n\n /** WhereClause.equalsIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equalsIgnoreCase()\n * \n **/\n equalsIgnoreCase(str: string) {\n return addIgnoreCaseAlgorithm(this, (x, a) => x === a[0], [str], \"\");\n }\n\n /** WhereClause.anyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOfIgnoreCase()\n * \n **/\n anyOfIgnoreCase(...values: string[]): Collection;\n anyOfIgnoreCase(values: string[]): Collection;\n anyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.indexOf(x) !== -1, set, \"\");\n }\n\n /** WhereClause.startsWithAnyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOfIgnoreCase()\n * \n **/\n startsWithAnyOfIgnoreCase(...values: string[]): Collection;\n startsWithAnyOfIgnoreCase(values: string[]): Collection;\n startsWithAnyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.some(n => x.indexOf(n) === 0), set, maxString);\n }\n\n /** WhereClause.anyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOf()\n * \n **/\n anyOf(...values: string[]): Collection;\n anyOf(values: string[]): Collection;\n anyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n let compare = this._cmp;\n try { set.sort(compare); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n if (set.length === 0) return emptyCollection(this);\n const c = new this.Collection(this, () => createRange(set[0], set[set.length - 1]));\n\n c._ondirectionchange = direction => {\n compare = (direction === \"next\" ?\n this._ascending :\n this._descending);\n set.sort(compare);\n };\n\n let i = 0;\n c._addAlgorithm((cursor, advance, resolve) => {\n const key = cursor.key;\n while (compare(key, set[i]) > 0) {\n // The cursor has passed beyond this key. Check next.\n ++i;\n if (i === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (compare(key, set[i]) === 0) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => { cursor.continue(set[i]); });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.notEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.notEqual()\n * \n **/\n notEqual(value: IndexableType) {\n return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.noneOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.noneOf()\n * \n **/\n noneOf(...values: string[]): Collection;\n noneOf(values: string[]): Collection;\n noneOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return new this.Collection(this); // Return entire collection.\n try { set.sort(this._ascending); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n // Transform [\"a\",\"b\",\"c\"] to a set of ranges for between/above/below: [[minKey,\"a\"], [\"a\",\"b\"], [\"b\",\"c\"], [\"c\",maxKey]]\n const ranges = set.reduce(\n (res, val) => res ?\n res.concat([[res[res.length - 1][1], val]]) :\n [[minKey, val]],\n null);\n ranges.push([set[set.length - 1], this.db._maxKey]);\n return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.inAnyRange()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.inAnyRange()\n * \n **/\n inAnyRange(\n ranges: ReadonlyArray<{ 0: IndexableType, 1: IndexableType }>,\n options?: { includeLowers?: boolean, includeUppers?: boolean })\n {\n const cmp = this._cmp,\n ascending = this._ascending,\n descending = this._descending,\n min = this._min,\n max = this._max;\n\n if (ranges.length === 0) return emptyCollection(this);\n if (!ranges.every(range =>\n range[0] !== undefined &&\n range[1] !== undefined &&\n ascending(range[0], range[1]) <= 0)) {\n return fail(\n this,\n \"First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower\",\n exceptions.InvalidArgument);\n }\n const includeLowers = !options || options.includeLowers !== false; // Default to true\n const includeUppers = options && options.includeUppers === true; // Default to false\n\n function addRange(ranges, newRange) {\n let i = 0, l = ranges.length;\n for (; i < l; ++i) {\n const range = ranges[i];\n if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) {\n range[0] = min(range[0], newRange[0]);\n range[1] = max(range[1], newRange[1]);\n break;\n }\n }\n if (i === l)\n ranges.push(newRange);\n return ranges;\n }\n\n let sortDirection = ascending;\n function rangeSorter(a, b) { return sortDirection(a[0], b[0]); }\n\n // Join overlapping ranges\n let set;\n try {\n set = ranges.reduce(addRange, []);\n set.sort(rangeSorter);\n } catch (ex) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n\n let rangePos = 0;\n const keyIsBeyondCurrentEntry = includeUppers ?\n key => ascending(key, set[rangePos][1]) > 0 :\n key => ascending(key, set[rangePos][1]) >= 0;\n\n const keyIsBeforeCurrentEntry = includeLowers ?\n key => descending(key, set[rangePos][0]) > 0 :\n key => descending(key, set[rangePos][0]) >= 0;\n\n function keyWithinCurrentRange(key) {\n return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key);\n }\n\n let checkKey = keyIsBeyondCurrentEntry;\n\n const c = new this.Collection(\n this,\n () => createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers));\n\n c._ondirectionchange = direction => {\n if (direction === \"next\") {\n checkKey = keyIsBeyondCurrentEntry;\n sortDirection = ascending;\n } else {\n checkKey = keyIsBeforeCurrentEntry;\n sortDirection = descending;\n }\n set.sort(rangeSorter);\n };\n\n c._addAlgorithm((cursor, advance, resolve) => {\n var key = cursor.key;\n while (checkKey(key)) {\n // The cursor has passed beyond this key. Check next.\n ++rangePos;\n if (rangePos === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (keyWithinCurrentRange(key)) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else if (this._cmp(key, set[rangePos][1]) === 0 || this._cmp(key, set[rangePos][0]) === 0) {\n // includeUpper or includeLower is false so keyWithinCurrentRange() returns false even though we are at range border.\n // Continue to next key but don't include this one.\n return false;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => {\n if (sortDirection === ascending) cursor.continue(set[rangePos][0]);\n else cursor.continue(set[rangePos][1]);\n });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.startsWithAnyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOf()\n * \n **/\n startsWithAnyOf(...prefixes: string[]): Collection;\n startsWithAnyOf(prefixes: string[]): Collection;\n startsWithAnyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n\n if (!set.every(s => typeof s === 'string')) {\n return fail(this, \"startsWithAnyOf() only works with strings\");\n }\n if (set.length === 0) return emptyCollection(this);\n\n return this.inAnyRange(set.map((str: string) => [str, str + maxString]));\n }\n\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { WhereClause } from './where-clause';\nimport { Table } from '../table';\nimport { Collection } from '../collection';\nimport { exceptions } from '../../errors';\nimport { cmp } from '../../functions/cmp';\n\nexport interface WhereClauseConstructor {\n new(table: Table, index?: string, orCollection?: Collection): WhereClause;\n prototype: WhereClause;\n}\n\n/** Generates a WhereClause constructor.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createWhereClauseConstructor(db: Dexie) {\n return makeClassConstructor(\n WhereClause.prototype,\n\n function WhereClause(this: WhereClause, table: Table, index?: string, orCollection?: Collection) {\n this.db = db;\n this._ctx = {\n table: table,\n index: index === \":id\" ? null : index,\n or: orCollection\n };\n this._cmp = this._ascending = cmp;\n this._descending = (a, b) => cmp(b, a);\n this._max = (a, b) => cmp(a,b) > 0 ? a : b;\n this._min = (a, b) => cmp(a,b) < 0 ? a : b;\n this._IDBKeyRange = db._deps.IDBKeyRange;\n if (!this._IDBKeyRange) throw new exceptions.MissingAPI();\n }\n );\n}\n","import { wrap } from \"../helpers/promise\";\n\nexport function eventRejectHandler(reject) {\n return wrap(function (event) {\n preventDefault(event);\n reject (event.target.error);\n return false;\n });\n}\n\nexport function eventSuccessHandler (resolve) {\n return wrap(function (event){\n resolve(event.target.result);\n });\n}\n\nexport function hookedEventRejectHandler (reject) {\n return wrap(function (event) {\n // See comment on hookedEventSuccessHandler() why wrap() is needed only when supporting hooks.\n \n var req = event.target,\n err = req.error,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n hookErrorHandler = ctx && ctx.onerror;\n hookErrorHandler && hookErrorHandler(err);\n preventDefault(event);\n reject (err);\n return false;\n });\n}\n\nexport function hookedEventSuccessHandler(resolve) {\n // wrap() is needed when calling hooks because the rare scenario of:\n // * hook does a db operation that fails immediately (IDB throws exception)\n // For calling db operations on correct transaction, wrap makes sure to set PSD correctly.\n // wrap() will also execute in a virtual tick.\n // * If not wrapped in a virtual tick, direct exception will launch a new physical tick.\n // * If this was the last event in the bulk, the promise will resolve after a physical tick\n // and the transaction will have committed already.\n // If no hook, the virtual tick will be executed in the reject()/resolve of the final promise,\n // because it is always marked with _lib = true when created using Transaction._promise().\n return wrap(function(event) {\n var req = event.target,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n result = ctx.value || req.result, // Pass the object value on updates. The result from IDB is the primary key.\n hookSuccessHandler = ctx && ctx.onsuccess;\n hookSuccessHandler && hookSuccessHandler(result);\n resolve && resolve(result);\n }, resolve);\n}\n\n\nexport function preventDefault(event) {\n if (event.stopPropagation) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.stopPropagation();\n if (event.preventDefault) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.preventDefault();\n}\n\nexport function BulkErrorHandlerCatchAll(errorList, done?, supportHooks?) {\n return (supportHooks ? hookedEventRejectHandler : eventRejectHandler)(e => {\n errorList.push(e);\n done && done();\n });\n}\n\n","import Events from '../helpers/Events';\nimport { GlobalDexieEvents } from '../public/types/db-events';\n\nexport const DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated' as 'storagemutated';\n\n// Name of the global event fired using DOM dispatchEvent (if not in node).\n// Reason for propagating this as a DOM event is for getting reactivity across\n// multiple versions of Dexie within the same app (as long as they are\n// compatible with regards to the event data).\n// If the ObservabilitySet protocol change in a way that would not be backward\n// compatible, make sure also update the event name to a new number at the end\n// so that two Dexie instances of different versions continue to work together\n// - maybe not able to communicate but won't fail due to unexpected data in\n// the detail property of the CustomEvent. If so, also make sure to udpate\n// docs and explain at which Dexie version the new name and format of the event\n// is being used.\nexport const STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1';\n\nexport const globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME) as GlobalDexieEvents;\n","import { Transaction as ITransaction } from '../../public/types/transaction';\nimport { DexiePromise, wrap, rejection } from \"../../helpers/promise\";\nimport { DbSchema } from '../../public/types/db-schema';\nimport { assert, hasOwn } from '../../functions/utils';\nimport { PSD, usePSD } from '../../helpers/promise';\nimport { Dexie } from '../dexie';\nimport { exceptions } from '../../errors';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { preventDefault } from '../../functions/event-wrappers';\nimport { newScope } from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { Table } from '../table';\nimport { globalEvents } from '../../globals/global-events';\n\n/** Transaction\n * \n * https://dexie.org/docs/Transaction/Transaction\n * \n **/\nexport class Transaction implements ITransaction {\n db: Dexie;\n active: boolean;\n mode: IDBTransactionMode;\n chromeTransactionDurability: ChromeTransactionDurability;\n idbtrans: IDBTransaction;\n storeNames: string[];\n explicit?: boolean;\n on: any;\n parent?: Transaction;\n schema: DbSchema;\n _memoizedTables: {[tableName: string]: Table};\n\n _reculock: number;\n _blockedFuncs: { 0: () => any, 1: any }[];\n _resolve: () => void;\n _reject: (Error) => void;\n _waitingFor: DexiePromise; // for waitFor()\n _waitingQueue: Function[]; // for waitFor()\n _spinCount: number; // Just for debugging waitFor()\n _completion: DexiePromise;\n\n //\n // Transaction internal methods (not required by API users, but needed internally and eventually by dexie extensions)\n //\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _lock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n // Temporary set all requests into a pending queue if they are called before database is ready.\n ++this._reculock; // Recursive read/write lock pattern using PSD (Promise Specific Data) instead of TLS (Thread Local Storage)\n if (this._reculock === 1 && !PSD.global) PSD.lockOwnerFor = this;\n return this;\n }\n\n /** Transaction._unlock()\n * \n * Internal method.\n */\n _unlock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n if (--this._reculock === 0) {\n if (!PSD.global) PSD.lockOwnerFor = null;\n while (this._blockedFuncs.length > 0 && !this._locked()) {\n var fnAndPSD = this._blockedFuncs.shift();\n try { usePSD(fnAndPSD[1], fnAndPSD[0]); } catch (e) { }\n }\n }\n return this;\n }\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _locked() {\n // Checks if any write-lock is applied on this transaction.\n // To simplify the Dexie API for extension implementations, we support recursive locks.\n // This is accomplished by using \"Promise Specific Data\" (PSD).\n // PSD data is bound to a Promise and any child Promise emitted through then() or resolve( new Promise() ).\n // PSD is local to code executing on top of the call stacks of any of any code executed by Promise():\n // * callback given to the Promise() constructor (function (resolve, reject){...})\n // * callbacks given to then()/catch()/finally() methods (function (value){...})\n // If creating a new independant Promise instance from within a Promise call stack, the new Promise will derive the PSD from the call stack of the parent Promise.\n // Derivation is done so that the inner PSD __proto__ points to the outer PSD.\n // PSD.lockOwnerFor will point to current transaction object if the currently executing PSD scope owns the lock.\n return this._reculock && PSD.lockOwnerFor !== this;\n }\n\n /** Transaction.create()\n * \n * Internal method.\n * \n */\n create(idbtrans?: IDBTransaction & {[prop: string]: any}) {\n if (!this.mode) return this;\n const idbdb = this.db.idbdb;\n const dbOpenError = this.db._state.dbOpenError;\n assert(!this.idbtrans);\n if (!idbtrans && !idbdb) {\n switch (dbOpenError && dbOpenError.name) {\n case \"DatabaseClosedError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.DatabaseClosed(dbOpenError);\n case \"MissingAPIError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError);\n default:\n // Make it clear that the user operation was not what caused the error - the error had occurred earlier on db.open()!\n throw new exceptions.OpenFailed(dbOpenError);\n }\n }\n if (!this.active) throw new exceptions.TransactionInactive();\n assert(this._completion._state === null); // Completion Promise must still be pending.\n\n idbtrans = this.idbtrans = idbtrans ||\n (this.db.core \n ? this.db.core.transaction(this.storeNames, this.mode as 'readwrite' | 'readonly', { durability: this.chromeTransactionDurability })\n : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })\n ) as IDBTransaction;\n\n idbtrans.onerror = wrap(ev => {\n preventDefault(ev);// Prohibit default bubbling to window.error\n this._reject(idbtrans.error);\n });\n idbtrans.onabort = wrap(ev => {\n preventDefault(ev);\n this.active && this._reject(new exceptions.Abort(idbtrans.error));\n this.active = false;\n this.on(\"abort\").fire(ev);\n });\n idbtrans.oncomplete = wrap(() => {\n this.active = false;\n this._resolve();\n if ('mutatedParts' in idbtrans) {\n globalEvents.storagemutated.fire(idbtrans[\"mutatedParts\"]);\n }\n });\n return this;\n }\n\n /** Transaction._promise()\n * \n * Internal method.\n */\n _promise(\n mode: IDBTransactionMode,\n fn: (resolve, reject, trans: Transaction) => PromiseLike | void,\n bWriteLock?: string | boolean): DexiePromise\n {\n if (mode === 'readwrite' && this.mode !== 'readwrite')\n return rejection(new exceptions.ReadOnly(\"Transaction is readonly\"));\n\n if (!this.active)\n return rejection(new exceptions.TransactionInactive());\n\n if (this._locked()) {\n return new DexiePromise((resolve, reject) => {\n this._blockedFuncs.push([() => {\n this._promise(mode, fn, bWriteLock).then(resolve, reject);\n }, PSD]);\n });\n\n } else if (bWriteLock) {\n return newScope(() => {\n var p = new DexiePromise((resolve, reject) => {\n this._lock();\n const rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p.finally(() => this._unlock());\n p._lib = true;\n return p;\n });\n\n } else {\n var p = new DexiePromise((resolve, reject) => {\n var rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p._lib = true;\n return p;\n }\n }\n\n /** Transaction._root()\n * \n * Internal method. Retrieves the root transaction in the tree of sub transactions.\n */\n _root() {\n return this.parent ? this.parent._root() : this;\n }\n\n /** Transaction.waitFor()\n * \n * Internal method. Can be accessed from the public API through\n * Dexie.waitFor(): https://dexie.org/docs/Dexie/Dexie.waitFor()\n * \n **/\n waitFor(promiseLike: PromiseLike) {\n // Always operate on the root transaction (in case this is a sub stransaction)\n var root = this._root();\n // For stability reasons, convert parameter to promise no matter what type is passed to waitFor().\n // (We must be able to call .then() on it.)\n const promise = DexiePromise.resolve(promiseLike);\n if (root._waitingFor) {\n // Already called waitFor(). Wait for both to complete.\n root._waitingFor = root._waitingFor.then(() => promise);\n } else {\n // We're not in waiting state. Start waiting state.\n root._waitingFor = promise;\n root._waitingQueue = [];\n // Start interacting with indexedDB until promise completes:\n var store = root.idbtrans.objectStore(root.storeNames[0]);\n (function spin() {\n ++root._spinCount; // For debugging only\n while (root._waitingQueue.length) (root._waitingQueue.shift())();\n if (root._waitingFor) store.get(-Infinity).onsuccess = spin;\n }());\n }\n var currentWaitPromise = root._waitingFor;\n return new DexiePromise((resolve, reject) => {\n promise.then(\n res => root._waitingQueue.push(wrap(resolve.bind(null, res))),\n err => root._waitingQueue.push(wrap(reject.bind(null, err)))\n ).finally(() => {\n if (root._waitingFor === currentWaitPromise) {\n // No one added a wait after us. Safe to stop the spinning.\n root._waitingFor = null;\n }\n });\n });\n } \n\n /** Transaction.abort()\n * \n * https://dexie.org/docs/Transaction/Transaction.abort()\n */\n abort() {\n if (this.active) {\n this.active = false;\n if (this.idbtrans) this.idbtrans.abort();\n this._reject(new exceptions.Abort());\n }\n }\n\n /** Transaction.table()\n * \n * https://dexie.org/docs/Transaction/Transaction.table()\n */\n table(tableName: string) {\n const memoizedTables = (this._memoizedTables || (this._memoizedTables = {}));\n if (hasOwn(memoizedTables, tableName))\n return memoizedTables[tableName];\n const tableSchema = this.schema[tableName];\n if (!tableSchema) {\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\"); \n }\n\n const transactionBoundTable = new this.db.Table(tableName, tableSchema, this);\n transactionBoundTable.core = this.db.core.table(tableName);\n memoizedTables[tableName] = transactionBoundTable;\n return transactionBoundTable;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Transaction } from './transaction';\nimport { DbSchema } from '../../public/types/db-schema';\nimport Events from '../../helpers/Events';\nimport Promise, { rejection } from '../../helpers/promise';\n\nexport interface TransactionConstructor {\n new (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction) : T;\n prototype: T;\n}\n\n/** Generates a Transaction constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTransactionConstructor(db: Dexie) {\n return makeClassConstructor>(\n Transaction.prototype,\n function Transaction (\n this: Transaction,\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction)\n {\n this.db = db;\n this.mode = mode;\n this.storeNames = storeNames;\n this.schema = dbschema;\n this.chromeTransactionDurability = chromeTransactionDurability;\n this.idbtrans = null;\n this.on = Events(this, \"complete\", \"error\", \"abort\");\n this.parent = parent || null;\n this.active = true;\n this._reculock = 0;\n this._blockedFuncs = [];\n this._resolve = null;\n this._reject = null;\n this._waitingFor = null;\n this._waitingQueue = null;\n this._spinCount = 0; // Just for debugging waitFor()\n this._completion = new Promise ((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n \n this._completion.then(\n ()=> {\n this.active = false;\n this.on.complete.fire();\n },\n e => {\n var wasActive = this.active;\n this.active = false;\n this.on.error.fire(e);\n this.parent ?\n this.parent._reject(e) :\n wasActive && this.idbtrans && this.idbtrans.abort();\n return rejection(e); // Indicate we actually DO NOT catch this error.\n });\n \n });\n}\n","import { IndexSpec } from '../public/types/index-spec';\n\nexport function createIndexSpec(\n name: string,\n keyPath: string | string[],\n unique: boolean,\n multi: boolean,\n auto: boolean,\n compound: boolean,\n isPrimKey: boolean\n): IndexSpec {\n return {\n name,\n keyPath,\n unique,\n multi,\n auto,\n compound,\n src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? \"++\" : \"\") + nameFromKeyPath(keyPath)\n }\n}\n\nexport function nameFromKeyPath (keyPath?: string | string[]): string {\n return typeof keyPath === 'string' ?\n keyPath :\n keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : \"\";\n}\n","import { IndexSpec } from '../public/types/index-spec';\nimport { TableSchema } from '../public/types/table-schema';\nimport { createIndexSpec } from './index-spec';\nimport { arrayToObject } from '../functions/utils';\n\nexport function createTableSchema (\n name: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n): TableSchema {\n return {\n name,\n primKey,\n indexes,\n mappedClass: null,\n idxByName: arrayToObject(indexes, index => [index.name, index])\n };\n}\n","import { maxString } from '../globals/constants';\n\nexport function safariMultiStoreFix(storeNames: string[]) {\n return storeNames.length === 1 ? storeNames[0] : storeNames;\n}\n\nexport function getNativeGetDatabaseNamesFn(indexedDB) {\n var fn = indexedDB && (indexedDB.getDatabaseNames || indexedDB.webkitGetDatabaseNames);\n return fn && fn.bind(indexedDB);\n}\n\nexport let getMaxKey = (IdbKeyRange: typeof IDBKeyRange) => {\n try {\n IdbKeyRange.only([[]]);\n getMaxKey = () => [[]];\n return [[]];\n } catch (e) {\n getMaxKey = () => maxString;\n return maxString;\n }\n}\n","import { getByKeyPath } from '../functions/utils';\n\nexport function getKeyExtractor (keyPath: null | string | string[]) : (a: any) => any {\n if (keyPath == null) {\n return () => undefined;\n } else if (typeof keyPath === 'string') {\n return getSinglePathKeyExtractor(keyPath);\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n\nexport function getSinglePathKeyExtractor(keyPath: string) {\n const split = keyPath.split('.');\n if (split.length === 1) {\n return obj => obj[keyPath];\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n","import {\n DBCore,\n DBCoreCursor,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryResponse,\n DBCoreRangeType,\n DBCoreSchema,\n DBCoreTableSchema,\n DBCoreTable,\n DBCoreMutateResponse,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { eventRejectHandler, preventDefault } from '../functions/event-wrappers';\nimport { wrap } from '../helpers/promise';\nimport { getMaxKey } from '../functions/quirks';\nimport { getKeyExtractor } from './get-key-extractor';\n\nexport function arrayify(arrayLike: {length: number, [index: number]: T}): T[] {\n return [].slice.call(arrayLike);\n}\nexport function pick(obj: T, props: Prop[]): Pick {\n const result = {} as Pick;\n props.forEach(prop => result[prop] = obj[prop]);\n return result;\n}\n\nlet _id_counter = 0;\n\nexport function getKeyPathAlias(keyPath: null | string | string[]) {\n return keyPath == null ?\n \":id\" :\n typeof keyPath === 'string' ?\n keyPath :\n `[${keyPath.join('+')}]`;\n}\n\nexport function createDBCore (\n db: IDBDatabase,\n IdbKeyRange: typeof IDBKeyRange,\n tmpTrans: IDBTransaction) : DBCore\n{\n function extractSchema(db: IDBDatabase, trans: IDBTransaction) : {schema: DBCoreSchema, hasGetAll: boolean} {\n const tables = arrayify(db.objectStoreNames);\n return {\n schema: {\n name: db.name,\n tables: tables.map(table => trans.objectStore(table)).map(store => {\n const {keyPath, autoIncrement} = store;\n const compound = isArray(keyPath);\n const outbound = keyPath == null;\n const indexByKeyPath: {[keyPathAlias: string]: DBCoreIndex} = {};\n const result = {\n name: store.name,\n primaryKey: {\n name: null,\n isPrimaryKey: true,\n outbound,\n compound,\n keyPath,\n autoIncrement,\n unique: true,\n extractKey: getKeyExtractor(keyPath)\n } as DBCoreIndex,\n indexes: arrayify(store.indexNames).map(indexName => store.index(indexName))\n .map(index => {\n const {name, unique, multiEntry, keyPath} = index;\n const compound = isArray(keyPath);\n const result: DBCoreIndex = {\n name,\n compound,\n keyPath,\n unique,\n multiEntry,\n extractKey: getKeyExtractor(keyPath)\n };\n indexByKeyPath[getKeyPathAlias(keyPath)] = result;\n return result;\n }),\n getIndexByKeyPath: (keyPath: null | string | string[]) => indexByKeyPath[getKeyPathAlias(keyPath)]\n };\n indexByKeyPath[\":id\"] = result.primaryKey;\n if (keyPath != null) {\n indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey;\n }\n return result;\n })\n },\n hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) &&\n !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604) // Bug with getAll() on Safari ver<604. See discussion following PR #579\n };\n }\n\n function makeIDBKeyRange (range: DBCoreKeyRange) : IDBKeyRange | null {\n if (range.type === DBCoreRangeType.Any) return null;\n if (range.type === DBCoreRangeType.Never) throw new Error(\"Cannot convert never type to IDBKeyRange\");\n const {lower, upper, lowerOpen, upperOpen} = range;\n const idbRange = lower === undefined ?\n upper === undefined ?\n null : //IDBKeyRange.lowerBound(-Infinity, false) : // Any range (TODO: Should we return null instead?)\n IdbKeyRange.upperBound(upper, !!upperOpen) : // below\n upper === undefined ?\n IdbKeyRange.lowerBound(lower, !!lowerOpen) : // above\n IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen);\n return idbRange;\n }\n\n function createDbCoreTable(tableSchema: DBCoreTableSchema): DBCoreTable {\n const tableName = tableSchema.name;\n\n function mutate ({trans, type, keys, values, range}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const outbound = store.keyPath == null;\n const isAddOrPut = type === \"put\" || type === \"add\";\n if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange')\n throw new Error (\"Invalid operation type: \" + type);\n\n const {length} = keys || values || {length: 1}; // keys.length if keys. values.length if values. 1 if range.\n if (keys && values && keys.length !== values.length) {\n throw new Error(\"Given keys array must have same length as given values array.\");\n }\n if (length === 0)\n // No items to write. Don't even bother!\n return resolve({numFailures: 0, failures: {}, results: [], lastResult: undefined});\n\n let req: IDBRequest;\n const reqs: IDBRequest[] = [];\n \n const failures: {[operationNumber: number]: Error} = [];\n let numFailures = 0;\n const errorHandler = \n event => {\n ++numFailures;\n preventDefault(event);\n };\n \n if (type === 'deleteRange') {\n // Here the argument is the range\n if (range.type === DBCoreRangeType.Never)\n return resolve({numFailures, failures, results: [], lastResult: undefined}); // Deleting the Never range shoulnt do anything.\n if (range.type === DBCoreRangeType.Any)\n reqs.push(req = store.clear()); // Deleting the Any range is equivalent to store.clear()\n else\n reqs.push(req = store.delete(makeIDBKeyRange(range)));\n } else {\n // No matter add, put or delete - find out arrays of first and second arguments to it.\n const [args1, args2] = isAddOrPut ?\n outbound ?\n [values, keys] :\n [values, null] :\n [keys, null];\n\n if (isAddOrPut) {\n for (let i=0; i {\n const lastResult = event.target.result;\n reqs.forEach((req, i) => req.error != null && (failures[i] = req.error));\n resolve({\n numFailures,\n failures,\n results: type === \"delete\" ? keys : reqs.map(req => req.result),\n lastResult\n });\n };\n \n req.onerror = event => { // wrap() not needed. All paths calling outside will wrap!\n errorHandler(event);\n done(event);\n };\n \n req.onsuccess = done;\n });\n }\n \n function openCursor ({trans, values, query, reverse, unique}: DBCoreOpenCursorRequest): Promise\n {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n // source\n const source = index.isPrimaryKey ?\n store :\n store.index(index.name);\n // direction\n const direction = reverse ?\n unique ?\n \"prevunique\" :\n \"prev\" :\n unique ?\n \"nextunique\" :\n \"next\";\n // request\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(makeIDBKeyRange(range), direction) :\n source.openKeyCursor(makeIDBKeyRange(range), direction);\n \n // iteration\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = wrap(ev => {\n\n const cursor = req.result as unknown as DBCoreCursor;\n if (!cursor) {\n resolve(null);\n return;\n }\n (cursor as any).___id = ++_id_counter;\n (cursor as any).done = false;\n const _cursorContinue = cursor.continue.bind(cursor);\n let _cursorContinuePrimaryKey = cursor.continuePrimaryKey;\n if (_cursorContinuePrimaryKey) _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor);\n const _cursorAdvance = cursor.advance.bind(cursor);\n const doThrowCursorIsNotStarted = ()=>{throw new Error(\"Cursor not started\");}\n const doThrowCursorIsStopped = ()=>{throw new Error(\"Cursor not stopped\");}\n (cursor as any).trans = trans;\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted;\n cursor.fail = wrap(reject);\n cursor.next = function (this: DBCoreCursor) {\n // next() must work with \"this\" pointer in order to function correctly for ProxyCursors (derived objects)\n // without having to re-define next() on each child.\n let gotOne = 1;\n return this.start(() => gotOne-- ? this.continue() : this.stop()).then(() => this);\n };\n cursor.start = (callback) => {\n //console.log(\"Starting cursor\", (cursor as any).___id);\n const iterationPromise = new Promise((resolveIteration, rejectIteration) =>{\n resolveIteration = wrap(resolveIteration);\n req.onerror = eventRejectHandler(rejectIteration);\n cursor.fail = rejectIteration;\n cursor.stop = value => {\n //console.log(\"Cursor stop\", cursor);\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped;\n resolveIteration(value);\n };\n });\n // Now change req.onsuccess to a callback that doesn't call initCursor but just observer.next()\n const guardedCallback = () => {\n if (req.result) {\n //console.log(\"Next result\", cursor);\n try {\n callback();\n } catch (err) {\n cursor.fail(err);\n }\n } else {\n (cursor as any).done = true;\n cursor.start = ()=>{throw new Error(\"Cursor behind last entry\");}\n cursor.stop();\n }\n }\n req.onsuccess = wrap(ev => {\n //cursor.continue = _cursorContinue;\n //cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n //cursor.advance = _cursorAdvance;\n req.onsuccess = guardedCallback;\n guardedCallback();\n });\n cursor.continue = _cursorContinue;\n cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n cursor.advance = _cursorAdvance;\n guardedCallback();\n return iterationPromise;\n };\n resolve(cursor);\n }, reject); \n });\n }\n \n function query (hasGetAll: boolean) {\n return (request: DBCoreQueryRequest) => {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {trans, values, limit, query} = request;\n const nonInfinitLimit = limit === Infinity ? undefined : limit;\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n if (limit === 0) return resolve({result: []});\n if (hasGetAll) {\n const req = values ?\n (source as any).getAll(idbKeyRange, nonInfinitLimit) :\n (source as any).getAllKeys(idbKeyRange, nonInfinitLimit);\n req.onsuccess = event => resolve({result: event.target.result});\n req.onerror = eventRejectHandler(reject);\n } else {\n let count = 0;\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(idbKeyRange) :\n source.openKeyCursor(idbKeyRange)\n const result = [];\n req.onsuccess = event => {\n const cursor = req.result as IDBCursorWithValue;\n if (!cursor) return resolve({result});\n result.push(values ? cursor.value : cursor.primaryKey);\n if (++count === limit) return resolve({result});\n cursor.continue();\n };\n req.onerror = eventRejectHandler(reject);\n }\n });\n };\n }\n \n return {\n name: tableName,\n schema: tableSchema,\n \n mutate,\n\n getMany ({trans, keys}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const length = keys.length;\n const result = new Array(length);\n let keyCount = 0;\n let callbackCount = 0;\n let valueCount = 0;\n let req: IDBRequest & {_pos?: number};\n \n const successHandler = event => {\n const req = event.target;\n if ((result[req._pos] = req.result) != null) ++valueCount;\n if (++callbackCount === keyCount) resolve(result);\n };\n const errorHandler = eventRejectHandler(reject);\n \n for (let i=0; i((resolve, reject) => {\n resolve = wrap (resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const req = store.get(key);\n req.onsuccess = event => resolve((event.target as any).result);\n req.onerror = eventRejectHandler(reject);\n });\n },\n\n query: query(hasGetAll),\n \n openCursor,\n\n count ({query, trans}) {\n const {index, range} = query;\n return new Promise((resolve, reject) => {\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n const req = idbKeyRange ? source.count(idbKeyRange) : source.count();\n req.onsuccess = wrap(ev => resolve((ev.target as IDBRequest).result));\n req.onerror = eventRejectHandler(reject);\n });\n }\n };\n }\n\n const {schema, hasGetAll} = extractSchema(db, tmpTrans);\n const tables = schema.tables.map(tableSchema => createDbCoreTable(tableSchema));\n const tableMap: {[name: string]: DBCoreTable} = {};\n tables.forEach(table => tableMap[table.name] = table);\n return {\n stack: \"dbcore\",\n \n transaction: db.transaction.bind(db),\n\n table(name: string) {\n const result = tableMap[name];\n if (!result) throw new Error(`Table '${name}' not found`);\n return tableMap[name];\n },\n\n MIN_KEY: -Infinity,\n\n MAX_KEY: getMaxKey(IdbKeyRange),\n\n schema\n\n };\n}\n","import { Dexie } from './';\nimport { createDBCore } from '../../dbcore/dbcore-indexeddb';\nimport { DBCore } from '../../public/types/dbcore';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { DexieStacks, Middleware } from '../../public/types/middleware';\nimport { exceptions } from '../../errors';\n\nfunction createMiddlewareStack(\n stackImpl: {stack: string},\n middlewares: Middleware<{stack: string}>[]): TStack {\n return middlewares.reduce((down, {create}) => ({...down, ...create(down)}), stackImpl) as TStack;\n} \n\nfunction createMiddlewareStacks(\n middlewares: {[StackName in keyof DexieStacks]?: Middleware[]},\n idbdb: IDBDatabase,\n {IDBKeyRange, indexedDB}: DexieDOMDependencies,\n tmpTrans: IDBTransaction): {[StackName in keyof DexieStacks]?: DexieStacks[StackName]}\n{\n const dbcore = createMiddlewareStack(\n createDBCore(idbdb, IDBKeyRange, tmpTrans),\n middlewares.dbcore);\n \n // TODO: Create other stacks the same way as above. They might be dependant on the result\n // of creating dbcore stack.\n\n return {\n dbcore\n };\n}\n\nexport function generateMiddlewareStacks(db: Dexie, tmpTrans: IDBTransaction) {\n const idbdb = tmpTrans.db;\n const stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans);\n db.core = stacks.dbcore!;\n db.tables.forEach(table => {\n const tableName = table.name;\n if (db.core.schema.tables.some(tbl => tbl.name === tableName)) {\n table.core = db.core.table(tableName);\n if (db[tableName] instanceof db.Table) {\n db[tableName].core = table.core;\n }\n }\n });\n}\n","import { Dexie } from '../dexie';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { _global } from \"../../globals/global\";\nimport { setProp, keys, slice, isArray, shallowClone, isAsyncFunction, defineProperty, getPropertyDescriptor } from '../../functions/utils';\nimport { Transaction } from '../transaction';\nimport { Version } from './version';\nimport Promise, { PSD, newScope, NativePromise, decrementExpectedAwaits, incrementExpectedAwaits } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { IndexSpec } from '../../public/types/index-spec';\nimport { createIndexSpec, nameFromKeyPath } from '../../helpers/index-spec';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { generateMiddlewareStacks } from '../dexie/generate-middleware-stacks';\nimport { debug } from '../../helpers/debug';\nimport { PromiseExtended } from '../../public/types/promise-extended';\n\nexport function setApiOnPlace(db: Dexie, objs: Object[], tableNames: string[], dbschema: DbSchema) {\n tableNames.forEach(tableName => {\n const schema = dbschema[tableName];\n objs.forEach(obj => {\n const propDesc = getPropertyDescriptor(obj, tableName);\n if (!propDesc || (\"value\" in propDesc && propDesc.value === undefined)) {\n // Either the prop is not declared, or it is initialized to undefined.\n if (obj === db.Transaction.prototype || obj instanceof db.Transaction) {\n // obj is a Transaction prototype (or prototype of a subclass to Transaction)\n // Make the API a getter that returns this.table(tableName)\n setProp(obj, tableName, {\n get(this: Transaction) { return this.table(tableName); },\n set(value: any) {\n // Issue #1039\n // Let \"this.schema = dbschema;\" and other props in transaction constructor work even if there's a name collision with the table name.\n defineProperty(this, tableName, {value, writable: true, configurable: true, enumerable: true});\n }\n });\n } else {\n // Table will not be bound to a transaction (will use Dexie.currentTransaction)\n obj[tableName] = new db.Table(tableName, schema);\n }\n }\n });\n });\n}\n\nexport function removeTablesApi(db: Dexie, objs: Object[]) {\n objs.forEach(obj => {\n for (let key in obj) {\n if (obj[key] instanceof db.Table) delete obj[key];\n }\n });\n}\n\nexport function lowerVersionFirst(a: Version, b: Version) {\n return a._cfg.version - b._cfg.version;\n}\n\nexport function runUpgraders(db: Dexie, oldVersion: number, idbUpgradeTrans: IDBTransaction, reject) {\n const globalSchema = db._dbSchema;\n if (idbUpgradeTrans.objectStoreNames.contains('$meta') && !globalSchema.$meta) {\n globalSchema.$meta = createTableSchema(\"$meta\", parseIndexSyntax(\"\")[0], []);\n db._storeNames.push('$meta');\n }\n const trans = db._createTransaction('readwrite', db._storeNames, globalSchema);\n trans.create(idbUpgradeTrans);\n trans._completion.catch(reject);\n const rejectTransaction = trans._reject.bind(trans);\n const transless = PSD.transless || PSD;\n newScope(() => {\n PSD.trans = trans;\n PSD.transless = transless;\n if (oldVersion === 0) {\n // Create tables:\n keys(globalSchema).forEach(tableName => {\n createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes);\n });\n generateMiddlewareStacks(db, idbUpgradeTrans);\n Promise.follow(() => db.on.populate.fire(trans)).catch(rejectTransaction);\n } else {\n generateMiddlewareStacks(db, idbUpgradeTrans);\n return getExistingVersion(db, trans, oldVersion)\n .then(oldVersion => updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans))\n .catch(rejectTransaction);\n }\n });\n}\n\nexport type UpgradeQueueItem = (idbtrans: IDBTransaction) => PromiseLike | void;\n\nexport function patchCurrentVersion(db: Dexie, idbUpgradeTrans: IDBTransaction) {\n createMissingTables(db._dbSchema, idbUpgradeTrans);\n if (idbUpgradeTrans.db.version % 10 === 0 && !idbUpgradeTrans.objectStoreNames.contains('$meta')) {\n // Rolled over to the next 10-ies due to many schema upgrades without bumping version.\n // No problem! We pin the database to its expected version by adding the $meta table so that next\n // time the programmer bumps the version and attaches, an upgrader, that upgrader will indeed run,\n // as well any further upgraders coming after that.\n idbUpgradeTrans.db.createObjectStore('$meta').add(Math.ceil((idbUpgradeTrans.db.version / 10) - 1), 'version');\n }\n const globalSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n adjustToExistingIndexNames(db, db._dbSchema, idbUpgradeTrans);\n const diff = getSchemaDiff(globalSchema, db._dbSchema);\n for (const tableChange of diff.change) {\n if (tableChange.change.length || tableChange.recreate) {\n console.warn(`Unable to patch indexes of table ${tableChange.name} because it has changes on the type of index or primary key.`);\n return;\n }\n const store = idbUpgradeTrans.objectStore(tableChange.name);\n tableChange.add.forEach(idx => {\n if (debug) console.debug(`Dexie upgrade patch: Creating missing index ${tableChange.name}.${idx.src}`);\n addIndex(store, idx);\n });\n }\n}\n\nfunction getExistingVersion(db: Dexie, trans: Transaction, oldVersion: number): PromiseExtended {\n // In normal case, existing version is the native installed version divided by 10.\n // However, in case more than 10 schema changes have been made on the same version (such as while\n // developing an app), the native version may have passed beyond a multiple of 10 within the same version.\n // When that happens, a table $meta will have been created, containing a single entry with key \"version\"\n // and the value of the real old version to use when running upgraders going forward.\n if (trans.storeNames.includes('$meta')) {\n return trans.table('$meta').get('version').then(metaVersion => {\n return metaVersion != null ? metaVersion : oldVersion\n })\n } else {\n return Promise.resolve(oldVersion);\n }\n}\n\nfunction updateTablesAndIndexes(\n db: Dexie,\n oldVersion: number,\n trans: Transaction,\n idbUpgradeTrans: IDBTransaction)\n{\n // Upgrade version to version, step-by-step from oldest to newest version.\n // Each transaction object will contain the table set that was current in that version (but also not-yet-deleted tables from its previous version)\n const queue: UpgradeQueueItem[] = [];\n const versions = db._versions;\n let globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n let anyContentUpgraderHasRun = false;\n \n const versToRun = versions.filter(v => v._cfg.version >= oldVersion);\n if (versToRun.length === 0) {\n // Important not to continue at this point.\n // Coming here means we've already patched schema in patchCurrentVersion() after having\n // incremented native version to a value above the declared highest version.\n // When being in this mode, it means that there might be different versions the db competing\n // about it with different version of the schema. Therefore, we must avoid deleting tables\n // or indexes here so that both versions can co-exist until the application has been upgraded to\n // a version that declares no lower than the native version.\n // If after that, a downgrade happens again, we'll end up here again, accepting both versions\n // And we'll stay in this state until app developer releases a new declared version.\n return Promise.resolve(); \n }\n \n versToRun.forEach(version => {\n queue.push(() => {\n const oldSchema = globalSchema;\n const newSchema = version._cfg.dbschema;\n adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans);\n adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans);\n\n globalSchema = db._dbSchema = newSchema;\n\n const diff = getSchemaDiff(oldSchema, newSchema);\n // Add tables \n diff.add.forEach(tuple => {\n createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes);\n });\n // Change tables\n diff.change.forEach(change => {\n if (change.recreate) {\n throw new exceptions.Upgrade(\"Not yet support for changing primary key\");\n } else {\n const store = idbUpgradeTrans.objectStore(change.name);\n // Add indexes\n change.add.forEach(idx => addIndex(store, idx));\n // Update indexes\n change.change.forEach(idx => {\n store.deleteIndex(idx.name);\n addIndex(store, idx);\n });\n // Delete indexes\n change.del.forEach(idxName => store.deleteIndex(idxName));\n }\n });\n\n const contentUpgrade = version._cfg.contentUpgrade;\n\n if (contentUpgrade && version._cfg.version > oldVersion) {\n // Update db.core with new tables and indexes:\n generateMiddlewareStacks(db, idbUpgradeTrans);\n trans._memoizedTables = {}; // Invalidate memoization as transaction shape may change between versions.\n\n anyContentUpgraderHasRun = true;\n\n // Add to-be-deleted tables to contentUpgrade transaction\n let upgradeSchema = shallowClone(newSchema);\n diff.del.forEach(table => {\n upgradeSchema[table] = oldSchema[table];\n });\n\n // Safe to affect Transaction.prototype globally in this moment,\n // because when this code runs, there may not be any other code\n // that can access any transaction instance, else than this particular\n // upgrader function.\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema), upgradeSchema);\n trans.schema = upgradeSchema;\n\n // Support for native async await.\n const contentUpgradeIsAsync = isAsyncFunction(contentUpgrade);\n if (contentUpgradeIsAsync) {\n incrementExpectedAwaits();\n }\n \n let returnValue: any;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = contentUpgrade(trans);\n if (returnValue) {\n if (contentUpgradeIsAsync) {\n // contentUpgrade is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n }\n }\n });\n return (returnValue && typeof returnValue.then === 'function' ?\n Promise.resolve(returnValue) : promiseFollowed.then(()=>returnValue));\n }\n });\n queue.push(idbtrans => {\n const newSchema = version._cfg.dbschema;\n // Delete old tables\n deleteRemovedTables(newSchema, idbtrans);\n // Restore the final API\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema);\n trans.schema = db._dbSchema;\n });\n // Maintain the $meta table after this version's tables and indexes has been created and content upgraders have run.\n queue.push(idbtrans => {\n if (db.idbdb.objectStoreNames.contains('$meta')) {\n if (Math.ceil(db.idbdb.version / 10) === version._cfg.version) {\n // Remove $meta table if it's no more needed - we are in line with the native version\n db.idbdb.deleteObjectStore('$meta');\n delete db._dbSchema.$meta;\n db._storeNames = db._storeNames.filter(name => name !== '$meta');\n } else {\n // We're still not in line with the native version. Make sure to update the virtual version\n // to the successfully run version\n idbtrans.objectStore('$meta').put(version._cfg.version, 'version');\n }\n }\n }); \n });\n\n // Now, create a queue execution engine\n function runQueue() {\n return queue.length ? Promise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) :\n Promise.resolve();\n }\n\n return runQueue().then(() => {\n createMissingTables(globalSchema, idbUpgradeTrans); // At last, make sure to create any missing tables. (Needed by addons that add stores to DB without specifying version)\n });\n}\n\nexport interface SchemaDiff {\n del: string[],\n add: [string, TableSchema][];\n change: TableSchemaDiff[];\n}\n\nexport interface TableSchemaDiff {\n name: string,\n recreate: boolean,\n del: string[],\n add: IndexSpec[],\n change: IndexSpec[]\n}\n\nexport function getSchemaDiff(oldSchema: DbSchema, newSchema: DbSchema): SchemaDiff {\n const diff: SchemaDiff = {\n del: [], // Array of table names\n add: [], // Array of [tableName, newDefinition]\n change: [] // Array of {name: tableName, recreate: newDefinition, del: delIndexNames, add: newIndexDefs, change: changedIndexDefs}\n };\n let table: string;\n for (table in oldSchema) {\n if (!newSchema[table]) diff.del.push(table);\n }\n for (table in newSchema) {\n const oldDef = oldSchema[table],\n newDef = newSchema[table];\n if (!oldDef) {\n diff.add.push([table, newDef]);\n } else {\n const change = {\n name: table,\n def: newDef,\n recreate: false,\n del: [],\n add: [],\n change: []\n };\n if (\n (\n // compare keyPaths no matter if string or string[]\n // compare falsy keypaths same no matter if they are null or empty string.\n ''+(oldDef.primKey.keyPath||'')\n ) !== (\n ''+(newDef.primKey.keyPath||'')\n ) ||\n // Compare the autoIncrement flag also\n (oldDef.primKey.auto !== newDef.primKey.auto))\n {\n // Primary key has changed. Remove and re-add table.\n change.recreate = true;\n diff.change.push(change);\n } else {\n // Same primary key. Just find out what differs:\n const oldIndexes = oldDef.idxByName;\n const newIndexes = newDef.idxByName;\n let idxName: string;\n for (idxName in oldIndexes) {\n if (!newIndexes[idxName]) change.del.push(idxName);\n }\n for (idxName in newIndexes) {\n const oldIdx = oldIndexes[idxName],\n newIdx = newIndexes[idxName];\n if (!oldIdx) change.add.push(newIdx);\n else if (oldIdx.src !== newIdx.src) change.change.push(newIdx);\n }\n if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) {\n diff.change.push(change);\n }\n }\n }\n }\n return diff;\n}\n\nexport function createTable(\n idbtrans: IDBTransaction,\n tableName: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n) {\n const store = idbtrans.db.createObjectStore(\n tableName,\n primKey.keyPath ?\n { keyPath: primKey.keyPath, autoIncrement: primKey.auto } :\n { autoIncrement: primKey.auto }\n );\n indexes.forEach(idx => addIndex(store, idx));\n return store;\n}\n\nexport function createMissingTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n keys(newSchema).forEach(tableName => {\n if (!idbtrans.db.objectStoreNames.contains(tableName)) {\n if (debug) console.debug('Dexie: Creating missing table', tableName);\n createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes);\n }\n });\n}\n\nexport function deleteRemovedTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n [].slice.call(idbtrans.db.objectStoreNames).forEach(storeName =>\n newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName));\n}\n\nexport function addIndex(store: IDBObjectStore, idx: IndexSpec) {\n store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi });\n}\n\nfunction buildGlobalSchema(\n db: Dexie,\n idbdb: IDBDatabase,\n tmpTrans: IDBTransaction\n) {\n const globalSchema = {};\n const dbStoreNames = slice(idbdb.objectStoreNames, 0);\n dbStoreNames.forEach(storeName => {\n const store = tmpTrans.objectStore(storeName);\n let keyPath = store.keyPath;\n const primKey = createIndexSpec(\n nameFromKeyPath(keyPath),\n keyPath || \"\",\n true,\n false,\n !!store.autoIncrement,\n keyPath && typeof keyPath !== \"string\",\n true\n );\n const indexes: IndexSpec[] = [];\n for (let j = 0; j < store.indexNames.length; ++j) {\n const idbindex = store.index(store.indexNames[j]);\n keyPath = idbindex.keyPath;\n var index = createIndexSpec(\n idbindex.name,\n keyPath,\n !!idbindex.unique,\n !!idbindex.multiEntry,\n false,\n keyPath && typeof keyPath !== \"string\",\n false\n );\n indexes.push(index);\n }\n globalSchema[storeName] = createTableSchema(storeName, primKey, indexes);\n });\n return globalSchema;\n}\n\nexport function readGlobalSchema(db: Dexie, idbdb: IDBDatabase, tmpTrans: IDBTransaction) {\n db.verno = idbdb.version / 10;\n const globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans);\n db._storeNames = slice(idbdb.objectStoreNames, 0);\n setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema);\n}\n\nexport function verifyInstalledSchema(db: Dexie, tmpTrans: IDBTransaction): boolean {\n const installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans);\n const diff = getSchemaDiff(installedSchema, db._dbSchema);\n return !(diff.add.length || diff.change.some(ch => ch.add.length || ch.change.length));\n}\n\nexport function adjustToExistingIndexNames(db: Dexie, schema: DbSchema, idbtrans: IDBTransaction) {\n // Issue #30 Problem with existing db - adjust to existing index names when migrating from non-dexie db\n const storeNames = idbtrans.db.objectStoreNames;\n\n for (let i = 0; i < storeNames.length; ++i) {\n const storeName = storeNames[i];\n const store = idbtrans.objectStore(storeName);\n db._hasGetAll = 'getAll' in store;\n\n for (let j = 0; j < store.indexNames.length; ++j) {\n const indexName = store.indexNames[j];\n const keyPath = store.index(indexName).keyPath;\n const dexieName = typeof keyPath === 'string' ? keyPath : \"[\" + slice(keyPath).join('+') + \"]\";\n if (schema[storeName]) {\n const indexSpec = schema[storeName].idxByName[dexieName];\n if (indexSpec) {\n indexSpec.name = indexName;\n delete schema[storeName].idxByName[dexieName];\n schema[storeName].idxByName[indexName] = indexSpec;\n }\n }\n }\n }\n\n // Bug with getAll() on Safari ver<604 on Workers only, see discussion following PR #579\n if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604)\n {\n db._hasGetAll = false;\n }\n}\n\nexport function parseIndexSyntax(primKeyAndIndexes: string): IndexSpec[] {\n return primKeyAndIndexes.split(',').map((index, indexNum) => {\n index = index.trim();\n const name = index.replace(/([&*]|\\+\\+)/g, \"\"); // Remove \"&\", \"++\" and \"*\"\n // Let keyPath of \"[a+b]\" be [\"a\",\"b\"]:\n const keyPath = /^\\[/.test(name) ? name.match(/^\\[(.*)\\]$/)[1].split('+') : name;\n\n return createIndexSpec(\n name,\n keyPath || null,\n /\\&/.test(index),\n /\\*/.test(index),\n /\\+\\+/.test(index),\n isArray(keyPath),\n indexNum === 0\n );\n });\n}\n","import { Version as IVersion } from '../../public/types/version';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { extend, keys } from '../../functions/utils';\nimport { Dexie } from '../dexie';\nimport { Transaction } from '../transaction';\nimport { removeTablesApi, setApiOnPlace, parseIndexSyntax } from './schema-helpers';\nimport { exceptions } from '../../errors';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\n\n/** class Version\n *\n * https://dexie.org/docs/Version/Version\n */\nexport class Version implements IVersion {\n db: Dexie;\n _cfg: {\n version: number,\n storesSource: { [tableName: string]: string | null },\n dbschema: DbSchema,\n tables: {},\n contentUpgrade: Function | null\n }\n\n _parseStoresSpec(stores: { [tableName: string]: string | null }, outSchema: DbSchema): any {\n keys(stores).forEach(tableName => {\n if (stores[tableName] !== null) {\n var indexes = parseIndexSyntax(stores[tableName]);\n var primKey = indexes.shift();\n primKey.unique = true;\n if (primKey.multi) throw new exceptions.Schema(\"Primary key cannot be multi-valued\");\n indexes.forEach(idx => {\n if (idx.auto) throw new exceptions.Schema(\"Only primary key can be marked as autoIncrement (++)\");\n if (!idx.keyPath) throw new exceptions.Schema(\"Index must have a name and cannot be an empty string\");\n });\n outSchema[tableName] = createTableSchema(tableName, primKey, indexes);\n }\n });\n }\n\n stores(stores: { [key: string]: string | null; }): IVersion {\n const db = this.db;\n this._cfg.storesSource = this._cfg.storesSource ?\n extend(this._cfg.storesSource, stores) :\n stores;\n const versions = db._versions;\n\n // Derive stores from earlier versions if they are not explicitely specified as null or a new syntax.\n const storesSpec: { [key: string]: string; } = {};\n let dbschema = {};\n versions.forEach(version => { // 'versions' is always sorted by lowest version first.\n extend(storesSpec, version._cfg.storesSource);\n dbschema = (version._cfg.dbschema = {});\n version._parseStoresSpec(storesSpec, dbschema);\n });\n // Update the latest schema to this version\n db._dbSchema = dbschema;\n // Update APIs\n removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]);\n setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema);\n db._storeNames = keys(dbschema);\n return this;\n }\n\n upgrade(upgradeFunction: (trans: Transaction) => PromiseLike | void): Version {\n this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction);\n return this;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Version } from './version';\n\nexport interface VersionConstructor {\n new(versionNumber: number): Version;\n prototype: Version;\n}\n\n/** Generates a Version constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createVersionConstructor(db: Dexie) {\n return makeClassConstructor(\n Version.prototype,\n\n function Version(this: Version, versionNumber: number) {\n this.db = db;\n this._cfg = {\n version: versionNumber,\n storesSource: null,\n dbschema: {},\n tables: {},\n contentUpgrade: null\n };\n });\n\n}\n","import { Dexie } from \"../classes/dexie/dexie\";\nimport { Table } from \"../public/types/table\";\nimport { DBNAMES_DB } from \"../globals/constants\";\nimport { DexieDOMDependencies } from \"../public/types/dexie-dom-dependencies\";\nimport { nop } from \"../functions/chaining-functions\";\n\ntype IDBKeyNamesVar = typeof IDBKeyRange;\n\nfunction getDbNamesTable(indexedDB: IDBFactory, IDBKeyRange: IDBKeyNamesVar) {\n let dbNamesDB = indexedDB[\"_dbNamesDB\"];\n if (!dbNamesDB) {\n dbNamesDB = indexedDB[\"_dbNamesDB\"] = new Dexie(DBNAMES_DB, {\n addons: [],\n indexedDB,\n IDBKeyRange,\n });\n dbNamesDB.version(1).stores({ dbnames: \"name\" });\n }\n return dbNamesDB.table(\"dbnames\") as Table<{ name: string }, string>;\n}\n\nfunction hasDatabasesNative(indexedDB: IDBFactory) {\n return indexedDB && typeof indexedDB.databases === \"function\";\n}\n\nexport function getDatabaseNames({\n indexedDB,\n IDBKeyRange,\n}: DexieDOMDependencies) {\n return hasDatabasesNative(indexedDB)\n ? Promise.resolve(indexedDB.databases()).then((infos) =>\n infos\n // Select name prop of infos:\n .map((info) => info.name)\n // Filter out DBNAMES_DB as previous Dexie or browser version would not have included it in the result.\n .filter((name) => name !== DBNAMES_DB)\n )\n : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys();\n}\n\nexport function _onDatabaseCreated(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).put({name}).catch(nop);\n}\n\nexport function _onDatabaseDeleted(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop);\n}\n","import { newScope } from '../../helpers/promise';\nimport { PSD } from '../../helpers/promise';\n\nexport function vip (fn) {\n // To be used by subscribers to the on('ready') event.\n // This will let caller through to access DB even when it is blocked while the db.ready() subscribers are firing.\n // This would have worked automatically if we were certain that the Provider was using Dexie.Promise for all asyncronic operations. The promise PSD\n // from the provider.connect() call would then be derived all the way to when provider would call localDatabase.applyChanges(). But since\n // the provider more likely is using non-promise async APIs or other thenable implementations, we cannot assume that.\n // Note that this method is only useful for on('ready') subscribers that is returning a Promise from the event. If not using vip()\n // the database could deadlock since it wont open until the returned Promise is resolved, and any non-VIPed operation started by\n // the caller will not resolve until database is opened.\n return newScope(function () {\n PSD.letThrough = true; // Make sure we are let through if still blocking db due to onready is firing.\n return fn();\n });\n}\n\n","/**\n * Work around Safari 14 IndexedDB open bug.\n *\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up. https://bugs.webkit.org/show_bug.cgi?id=226547\n * The only solution is to keep nudging it until it's awake.\n */\nfunction idbReady() {\n var isSafari = !navigator.userAgentData &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\//.test(navigator.userAgent);\n // No point putting other browsers or older versions of Safari through this mess.\n if (!isSafari || !indexedDB.databases)\n return Promise.resolve();\n var intervalId;\n return new Promise(function (resolve) {\n var tryIdb = function () { return indexedDB.databases().finally(resolve); };\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(function () { return clearInterval(intervalId); });\n}\n\nexport default idbReady;\n","import { cmp } from \"../functions/cmp\";\nimport { extend, iteratorSymbol, props } from '../functions/utils';\nimport { IndexableType } from '../public';\nimport {\n EmptyRange,\n IntervalTree,\n IntervalTreeNode,\n RangeSetConstructor,\n RangeSetPrototype,\n} from \"../public/types/rangeset\";\n\n/* An interval tree implementation to efficiently detect overlapping ranges of queried indexes.\n *\n * https://en.wikipedia.org/wiki/Interval_tree\n * \n */\n\nfunction isEmptyRange(node: IntervalTree | {from: IndexableType, to: IndexableType}): node is EmptyRange {\n return !(\"from\" in node);\n}\n\nexport type RangeSet = RangeSetPrototype & IntervalTree;\n\nexport const RangeSet = function(fromOrTree: any, to?: any) {\n if (this) {\n // Called with new()\n extend(this, arguments.length ? {d:1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree} : {d:0});\n } else {\n // Called without new()\n const rv = new RangeSet();\n if (fromOrTree && (\"d\" in fromOrTree)) {\n extend(rv, fromOrTree);\n }\n return rv;\n }\n} as RangeSetConstructor;\n\nprops(RangeSet.prototype, {\n add(rangeSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n mergeRanges(this, rangeSet);\n return this;\n },\n addKey(key: IndexableType) {\n addRange(this, key, key);\n return this;\n },\n addKeys(keys: IndexableType[]) {\n keys.forEach(key => addRange(this, key, key));\n return this;\n },\n\n [iteratorSymbol](): Iterator {\n return getRangeSetIterator(this);\n }\n});\n\nfunction addRange(target: IntervalTree, from: IndexableType, to: IndexableType) {\n const diff = cmp(from, to);\n // cmp() returns NaN if one of the args are IDB-invalid keys.\n // Avoid storing invalid keys in rangeset:\n if (isNaN(diff)) return;\n\n // Caller is trying to add a range where from is greater than to:\n if (diff > 0) throw RangeError();\n \n if (isEmptyRange(target)) return extend(target, { from, to, d: 1 });\n const left = target.l;\n const right = target.r;\n if (cmp(to, target.from) < 0) {\n left\n ? addRange(left, from, to)\n : (target.l = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n if (cmp(from, target.to) > 0) {\n right\n ? addRange(right, from, to)\n : (target.r = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n // Now we have some kind of overlap. We will be able to merge the new range into the node or let it be swallowed.\n\n // Grow left?\n if (cmp(from, target.from) < 0) {\n target.from = from;\n target.l = null; // Cut off for now. Re-add later.\n target.d = right ? right.d + 1 : 1;\n }\n // Grow right?\n if (cmp(to, target.to) > 0) {\n target.to = to;\n target.r = null; // Cut off for now. Re-add later.\n target.d = target.l ? target.l.d + 1 : 1;\n }\n const rightWasCutOff = !target.r;\n // Re-add left?\n if (left && !target.l) {\n //Ranges to the left may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, left);\n }\n // Re-add right?\n if (right && rightWasCutOff) {\n //Ranges to the right may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, right);\n }\n}\n\nexport function mergeRanges(target: IntervalTree, newSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n function _addRangeSet(\n target: IntervalTree,\n { from, to, l, r }: IntervalTreeNode | {from: IndexableType, to: IndexableType, l?: undefined, r?: undefined}\n ) {\n addRange(target, from, to);\n if (l) _addRangeSet(target, l);\n if (r) _addRangeSet(target, r);\n }\n\n if(!isEmptyRange(newSet)) _addRangeSet(target, newSet);\n}\n\nexport function rangesOverlap(\n rangeSet1: IntervalTree,\n rangeSet2: IntervalTree\n): boolean {\n // Start iterating other from scratch.\n const i1 = getRangeSetIterator(rangeSet2);\n let nextResult1 = i1.next();\n if (nextResult1.done) return false;\n let a = nextResult1.value;\n\n // Start iterating this from start of other\n const i2 = getRangeSetIterator(rangeSet1);\n let nextResult2 = i2.next(a.from); // Start from beginning of other range\n let b = nextResult2.value;\n\n while (!nextResult1.done && !nextResult2.done) {\n if (cmp(b!.from, a.to) <= 0 && cmp(b!.to, a.from) >= 0) return true;\n cmp(a.from, b!.from) < 0\n ? (a = (nextResult1 = i1.next(b!.from)).value!) // a is behind. forward it to beginning of next b-range\n : (b = (nextResult2 = i2.next(a.from)).value); // b is behind. forward it to beginning of next a-range\n }\n return false;\n}\n\ntype RangeSetIteratorState =\n | {\n up?: RangeSetIteratorState;\n n: IntervalTreeNode;\n s: 0 | 1 | 2 | 3;\n }\n | undefined\n | null;\nexport function getRangeSetIterator(\n node: EmptyRange | IntervalTreeNode\n): Generator {\n let state: RangeSetIteratorState = isEmptyRange(node) ? null : { s: 0, n: node };\n\n return {\n next(key?) {\n const keyProvided = arguments.length > 0;\n while (state) {\n switch (state.s) {\n case 0:\n // Initial state for node.\n // Fast forward to leftmost node.\n state.s = 1;\n if (keyProvided) {\n while (state.n.l && cmp(key, state.n.from) < 0)\n state = { up: state, n: state.n.l, s: 1 };\n } else {\n while (state.n.l) state = { up: state, n: state.n.l, s: 1 };\n }\n // intentionally fall into case 1:\n case 1:\n // We're on a node where it's left part is already handled or does not exist.\n state.s = 2;\n if (!keyProvided || cmp(key, state.n.to) <= 0)\n return { value: state.n, done: false };\n case 2:\n // We've emitted our node and should continue with the right part or let parent take over from it's state 1\n if (state.n.r) {\n state.s = 3; // So when child is done, we know we're done.\n state = { up: state, n: state.n.r, s: 0 };\n continue; // Will fall in to case 0 with fast forward to left leaf of this subtree.\n }\n // intentionally fall into case 3:\n case 3:\n state = state.up;\n }\n }\n return { done: true };\n },\n } as Generator;\n}\n\nfunction rebalance(target: IntervalTreeNode) {\n const diff = (target.r?.d || 0) - (target.l?.d || 0);\n const r = diff > 1 ? \"r\" : diff < -1 ? \"l\" : \"\";\n if (r) {\n\n // Rotate (https://en.wikipedia.org/wiki/Tree_rotation)\n //\n // \n // [OLDROOT]\n // [OLDROOT.L] [NEWROOT]\n // [NEWROOT.L] [NEWROOT.R]\n //\n // Is going to become:\n //\n // \n // [NEWROOT]\n // [OLDROOT] [NEWROOT.R]\n // [OLDROOT.L] [NEWROOT.L] \n\n // * clone now has the props of OLDROOT\n // Plan:\n // * target must be given the props of NEWROOT\n // * target[l] must point to a new OLDROOT\n // * target[r] must point to NEWROOT.R\n // * OLDROOT[r] must point to NEWROOT.L\n const l = r === \"r\" ? \"l\" : \"r\"; // Support both left/right rotation\n const rootClone = { ...target };\n // We're gonna copy props from target's right node into target so that target will\n // have same range as old target[r] (instead of changing pointers, we copy values.\n // that way we do not need to adjust pointers in parents).\n const oldRootRight = target[r]; \n target.from = oldRootRight.from;\n target.to = oldRootRight.to;\n target[r] = oldRootRight[r];\n rootClone[r] = oldRootRight[l];\n target[l] = rootClone;\n rootClone.d = computeDepth(rootClone);\n }\n target.d = computeDepth(target);\n}\n\nfunction computeDepth({ r, l }: Pick) {\n return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1;\n}\n","import { cloneSimpleObjectTree, deepClone, keys, objectIsEmpty } from \"../functions/utils\";\nimport { mergeRanges, RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\n\nexport function extendObservabilitySet(\n target: ObservabilitySet,\n newSet: ObservabilitySet\n): ObservabilitySet {\n keys(newSet).forEach(part => {\n if (target[part]) mergeRanges(target[part], newSet[part]);\n else target[part] = cloneSimpleObjectTree(newSet[part]); // Somewhat faster\n });\n return target;\n}\n","import { rangesOverlap } from '../helpers/rangeset';\nimport { ObservabilitySet } from '../public/types/db-events';\n\nexport function obsSetsOverlap(os1: ObservabilitySet, os2: ObservabilitySet) {\n return os1.all || os2.all || Object.keys(os1).some(\n (key) => os2[key] && rangesOverlap(os2[key], os1[key])\n );\n}\n","import { type GlobalQueryCache } from \"../../public/types/cache\";\n\nexport const cache: GlobalQueryCache = {}\n","import { CacheEntry, TblQueryCache } from '../../public/types/cache';\nimport { ObservabilitySet } from '../../public/types/db-events';\nimport { extendObservabilitySet } from '../extend-observability-set';\nimport { obsSetsOverlap } from '../obs-sets-overlap';\nimport { cache } from './cache';\n\nlet unsignaledParts: ObservabilitySet = {};\nlet isTaskEnqueued = false;\n\nexport function signalSubscribersLazily(part: ObservabilitySet, optimistic = false) {\n extendObservabilitySet(unsignaledParts, part);\n if (!isTaskEnqueued) {\n isTaskEnqueued = true;\n setTimeout(() => {\n isTaskEnqueued = false;\n const parts = unsignaledParts;\n unsignaledParts = {};\n signalSubscribersNow(parts, false);\n }, 0);\n }\n}\n\nexport function signalSubscribersNow(\n updatedParts: ObservabilitySet,\n deleteAffectedCacheEntries = false\n) {\n const queriesToSignal = new Set<() => void>();\n if (updatedParts.all) {\n // Signal all subscribers to requery.\n for (const tblCache of Object.values(cache)) {\n collectTableSubscribers(\n tblCache,\n updatedParts,\n queriesToSignal,\n deleteAffectedCacheEntries\n );\n }\n } else {\n for (const key in updatedParts) {\n const parts = /^idb\\:\\/\\/(.*)\\/(.*)\\//.exec(key);\n if (parts) {\n const [, dbName, tableName] = parts;\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (tblCache)\n collectTableSubscribers(\n tblCache,\n updatedParts,\n queriesToSignal,\n deleteAffectedCacheEntries\n );\n }\n }\n }\n // Now when affected cache entries are removed, signal collected subscribers to requery.\n queriesToSignal.forEach((requery) => requery());\n}\n\nfunction collectTableSubscribers(\n tblCache: TblQueryCache,\n updatedParts: ObservabilitySet,\n outQueriesToSignal: Set<() => void>,\n deleteAffectedCacheEntries: boolean\n) {\n const updatedEntryLists: [string, CacheEntry[]][] = [];\n for (const [indexName, entries] of Object.entries(tblCache.queries.query)) {\n const filteredEntries: CacheEntry[] = [];\n for (const entry of entries) {\n if (obsSetsOverlap(updatedParts, entry.obsSet)) {\n // This query is affected by the mutation. Remove it from cache\n // and signal all subscribers to requery.\n entry.subscribers.forEach((requery) => outQueriesToSignal.add(requery));\n } else if (deleteAffectedCacheEntries) {\n filteredEntries.push(entry);\n }\n }\n // Collect cache entries to be updated\n if (deleteAffectedCacheEntries)\n updatedEntryLists.push([indexName, filteredEntries]);\n }\n if (deleteAffectedCacheEntries) {\n for (const [indexName, filteredEntries] of updatedEntryLists) {\n tblCache.queries.query[indexName] = filteredEntries;\n }\n }\n}\n","import { Dexie } from './dexie';\nimport * as Debug from '../../helpers/debug';\nimport { rejection } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { eventRejectHandler, preventDefault } from '../../functions/event-wrappers';\nimport Promise, { wrap } from '../../helpers/promise';\nimport { connections } from '../../globals/constants';\nimport { runUpgraders, readGlobalSchema, adjustToExistingIndexNames, verifyInstalledSchema, patchCurrentVersion } from '../version/schema-helpers';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { _onDatabaseCreated } from '../../helpers/database-enumerator';\nimport { vip } from './vip';\nimport { promisableChain, nop } from '../../functions/chaining-functions';\nimport { generateMiddlewareStacks } from './generate-middleware-stacks';\nimport { slice } from '../../functions/utils';\nimport safari14Workaround from 'safari-14-idb-fix';\nimport { type ObservabilitySet } from '../../public/types/db-events';\nimport { RangeSet } from '../../helpers/rangeset';\nimport { DEXIE_STORAGE_MUTATED_EVENT_NAME, globalEvents } from '../../globals/global-events';\nimport { signalSubscribersNow } from '../../live-query/cache/signalSubscribers';\n\nexport function dexieOpen (db: Dexie) {\n const state = db._state;\n const {indexedDB} = db._deps;\n if (state.isBeingOpened || db.idbdb)\n return state.dbReadyPromise.then(() => state.dbOpenError ?\n rejection (state.dbOpenError) :\n db);\n state.isBeingOpened = true;\n state.dbOpenError = null;\n state.openComplete = false;\n const openCanceller = state.openCanceller;\n let nativeVerToOpen = Math.round(db.verno * 10);\n let schemaPatchMode = false;\n\n function throwIfCancelled() {\n // If state.openCanceller object reference is replaced, it means db.close() has been called,\n // meaning this open flow should be cancelled.\n if (state.openCanceller !== openCanceller) throw new exceptions.DatabaseClosed('db.open() was cancelled');\n }\n \n // Function pointers to call when the core opening process completes.\n let resolveDbReady = state.dbReadyResolve,\n // upgradeTransaction to abort on failure.\n upgradeTransaction: (IDBTransaction | null) = null,\n wasCreated = false;\n\n const tryOpenDB = () => new Promise((resolve, reject) => {\n throwIfCancelled();\n // If no API, throw!\n if (!indexedDB) throw new exceptions.MissingAPI();\n const dbName = db.name;\n \n const req = state.autoSchema || !nativeVerToOpen ?\n indexedDB.open(dbName) :\n indexedDB.open(dbName, nativeVerToOpen);\n if (!req) throw new exceptions.MissingAPI(); // May happen in Safari private mode, see https://github.com/dfahlander/Dexie.js/issues/134\n req.onerror = eventRejectHandler(reject);\n req.onblocked = wrap(db._fireOnBlocked);\n req.onupgradeneeded = wrap (e => {\n upgradeTransaction = req.transaction;\n if (state.autoSchema && !db._options.allowEmptyDB) { // Unless an addon has specified db._allowEmptyDB, lets make the call fail.\n // Caller did not specify a version or schema. Doing that is only acceptable for opening alread existing databases.\n // If onupgradeneeded is called it means database did not exist. Reject the open() promise and make sure that we\n // do not create a new database by accident here.\n req.onerror = preventDefault; // Prohibit onabort error from firing before we're done!\n upgradeTransaction.abort(); // Abort transaction (would hope that this would make DB disappear but it doesnt.)\n // Close database and delete it.\n req.result.close();\n const delreq = indexedDB.deleteDatabase(dbName); // The upgrade transaction is atomic, and javascript is single threaded - meaning that there is no risk that we delete someone elses database here!\n delreq.onsuccess = delreq.onerror = wrap(() => {\n reject (new exceptions.NoSuchDatabase(`Database ${dbName} doesnt exist`));\n });\n } else {\n upgradeTransaction.onerror = eventRejectHandler(reject);\n const oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; // Safari 8 fix.\n wasCreated = oldVer < 1;\n db.idbdb = req.result;\n if (schemaPatchMode) {\n patchCurrentVersion(db, upgradeTransaction);\n }\n runUpgraders(db, oldVer / 10, upgradeTransaction, reject);\n }\n }, reject);\n \n req.onsuccess = wrap (() => {\n // Core opening procedure complete. Now let's just record some stuff.\n upgradeTransaction = null;\n const idbdb = db.idbdb = req.result;\n\n const objectStoreNames = slice(idbdb.objectStoreNames);\n if (objectStoreNames.length > 0) try {\n const tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly');\n if (state.autoSchema) readGlobalSchema(db, idbdb, tmpTrans);\n else {\n adjustToExistingIndexNames(db, db._dbSchema, tmpTrans);\n if (!verifyInstalledSchema(db, tmpTrans) && !schemaPatchMode) {\n console.warn(`Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Dexie will add missing parts and increment native version number to workaround this.`);\n idbdb.close();\n nativeVerToOpen = idbdb.version + 1;\n schemaPatchMode = true;\n return resolve (tryOpenDB()); // Try again with new version (nativeVerToOpen\n }\n }\n generateMiddlewareStacks(db, tmpTrans);\n } catch (e) {\n // Safari 8 may bail out if > 1 store names. However, this shouldnt be a showstopper. Issue #120.\n // BUGBUG: It will bail out anyway as of Dexie 3.\n // Should we support Safari 8 anymore? Believe all\n // Dexie users use the shim for that platform anyway?!\n // If removing Safari 8 support, go ahead and remove the safariMultiStoreFix() function\n // as well as absurd upgrade version quirk for Safari.\n }\n \n connections.push(db); // Used for emulating versionchange event on IE/Edge/Safari.\n \n idbdb.onversionchange = wrap(ev => {\n state.vcFired = true; // detect implementations that not support versionchange (IE/Edge/Safari)\n db.on(\"versionchange\").fire(ev);\n });\n \n idbdb.onclose = wrap(ev => {\n db.on(\"close\").fire(ev);\n });\n\n if (wasCreated) _onDatabaseCreated(db._deps, dbName);\n\n resolve();\n\n }, reject);\n }).catch(err => {\n switch (err?.name) {\n case \"UnknownError\":\n if (state.PR1398_maxLoop > 0) {\n // Bug in Chrome after clearing site data\n // https://github.com/dexie/Dexie.js/issues/543#issuecomment-1795736695\n state.PR1398_maxLoop--;\n console.warn('Dexie: Workaround for Chrome UnknownError on open()');\n return tryOpenDB();\n }\n break;\n case \"VersionError\":\n if (nativeVerToOpen > 0) {\n nativeVerToOpen = 0;\n return tryOpenDB();\n }\n break;\n }\n return Promise.reject(err);\n });\n \n // safari14Workaround = Workaround by jakearchibald for new nasty bug in safari 14.\n return Promise.race([\n openCanceller,\n (typeof navigator === 'undefined' ? Promise.resolve() : safari14Workaround()).then(tryOpenDB)\n ]).then(() => {\n // Before finally resolving the dbReadyPromise and this promise,\n // call and await all on('ready') subscribers:\n // Dexie.vip() makes subscribers able to use the database while being opened.\n // This is a must since these subscribers take part of the opening procedure.\n throwIfCancelled();\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>db.on.ready.fire(db.vip))).then(function fireRemainders() {\n if (state.onReadyBeingFired.length > 0) {\n // In case additional subscribers to db.on('ready') were added during the time db.on.ready.fire was executed.\n let remainders = state.onReadyBeingFired.reduce(promisableChain, nop);\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>remainders(db.vip))).then(fireRemainders)\n }\n });\n }).finally(()=>{\n if (state.openCanceller === openCanceller) {\n // Only modify state if not cancelled in the mean time.\n state.onReadyBeingFired = null;\n state.isBeingOpened = false;\n }\n }).catch(err => {\n state.dbOpenError = err; // Record the error. It will be used to reject further promises of db operations.\n try {\n // Did we fail within onupgradeneeded? Make sure to abort the upgrade transaction so it doesnt commit.\n upgradeTransaction && upgradeTransaction.abort();\n } catch { }\n if (openCanceller === state.openCanceller) {\n // Still in the same open flow - The error reason was not due to external call to db.close().\n // Make sure to call db.close() to finalize resources.\n db._close(); // Closes and resets idbdb, removes connections, resets dbReadyPromise and openCanceller so that a later db.open() is fresh.\n }\n return rejection (err);\n }).finally(()=>{\n state.openComplete = true;\n resolveDbReady(); // dbReadyPromise is resolved no matter if open() rejects or resolved. It's just to wake up waiters.\n }).then(()=>{\n if (wasCreated) {\n // Propagate full range on primary keys and indexes on all tables now that the DB is ready and opened,\n // and all upgraders and on('ready') subscribers have run.\n const everything: ObservabilitySet = {};\n db.tables.forEach(table => {\n table.schema.indexes.forEach(idx => {\n if (idx.name) everything[`idb://${db.name}/${table.name}/${idx.name}`] = new RangeSet(-Infinity, [[[]]]);\n });\n everything[`idb://${db.name}/${table.name}/`] = everything[`idb://${db.name}/${table.name}/:dels`] = new RangeSet(-Infinity, [[[]]]);\n });\n // Database was created. If another tab had it open when it was deleted and reopened, that tab must be updated now.\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME).fire(everything);\n // Wipe the cache and trigger optimistic queries:\n signalSubscribersNow(everything, true);\n }\n // Resolve the db.open() with the db instance.\n return db;\n });\n}\n","import { isArray } from '../functions/utils';\n\nexport function awaitIterator (iterator: Iterator) {\n var callNext = result => iterator.next(result),\n doThrow = error => iterator.throw(error),\n onSuccess = step(callNext),\n onError = step(doThrow);\n\n function step(getNext: (any)=>any) {\n return (val?) => {\n var next = getNext(val),\n value = next.value;\n\n return next.done ? value :\n (!value || typeof value.then !== 'function' ?\n isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) :\n value.then(onSuccess, onError));\n };\n }\n\n return step(callNext)();\n}\n","import { TransactionMode } from '../../public/types/transaction-mode';\nimport { errnames, exceptions } from '../../errors';\nimport { flatten, isAsyncFunction } from '../../functions/utils';\nimport { Dexie } from './dexie';\nimport { Transaction } from '../transaction';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise, {\n PSD,\n NativePromise,\n decrementExpectedAwaits,\n rejection,\n incrementExpectedAwaits\n} from '../../helpers/promise';\n\nexport function extractTransactionArgs(mode: TransactionMode, _tableArgs_, scopeFunc) {\n // Let table arguments be all arguments between mode and last argument.\n var i = arguments.length;\n if (i < 2) throw new exceptions.InvalidArgument(\"Too few arguments\");\n // Prevent optimzation killer (https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments)\n // and clone arguments except the first one into local var 'args'.\n var args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n // Let scopeFunc be the last argument and pop it so that args now only contain the table arguments.\n scopeFunc = args.pop();\n var tables = flatten(args); // Support using array as middle argument, or a mix of arrays and non-arrays.\n return [mode, tables, scopeFunc];\n}\n\nexport function enterTransactionScope(\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n parentTransaction: Transaction | undefined,\n scopeFunc: ()=>PromiseLike | any\n) {\n return Promise.resolve().then(() => {\n // Keep a pointer to last non-transactional PSD to use if someone calls Dexie.ignoreTransaction().\n const transless = PSD.transless || PSD;\n // Our transaction.\n //return new Promise((resolve, reject) => {\n const trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction);\n trans.explicit = true;\n // Let the transaction instance be part of a Promise-specific data (PSD) value.\n const zoneProps = {\n trans: trans,\n transless: transless\n };\n\n if (parentTransaction) {\n // Emulate transaction commit awareness for inner transaction (must 'commit' when the inner transaction has no more operations ongoing)\n trans.idbtrans = parentTransaction.idbtrans;\n } else {\n try {\n trans.create(); // Create the native transaction so that complete() or error() will trigger even if no operation is made upon it.\n // @ts-ignore Mark the idbtrans object with \"_explicit\". DBCore middleware won't have access to Dexie trans but will need to have this info.\n trans.idbtrans._explicit = true;\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db.close({disableAutoOpen: false});\n return db.open().then(() => enterTransactionScope(\n db,\n mode,\n storeNames,\n null,\n scopeFunc\n ));\n }\n return rejection(ex);\n }\n }\n\n // Support for native async await.\n const scopeFuncIsAsync = isAsyncFunction(scopeFunc);\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n\n let returnValue;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = scopeFunc.call(trans, trans);\n if (returnValue) {\n if (scopeFuncIsAsync) {\n // scopeFunc is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n } else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') {\n // scopeFunc returned an iterator with throw-support. Handle yield as await.\n returnValue = awaitIterator(returnValue);\n }\n }\n }, zoneProps);\n return (returnValue && typeof returnValue.then === 'function' ?\n // Promise returned. User uses promise-style transactions.\n Promise.resolve(returnValue).then(x => trans.active ?\n x // Transaction still active. Continue.\n : rejection(new exceptions.PrematureCommit(\n \"Transaction committed too early. See http://bit.ly/2kdckMn\")))\n // No promise returned. Wait for all outstanding promises before continuing. \n : promiseFollowed.then(() => returnValue)\n ).then(x => {\n // sub transactions don't react to idbtrans.oncomplete. We must trigger a completion:\n if (parentTransaction) trans._resolve();\n // wait for trans._completion\n // (if root transaction, this means 'complete' event. If sub-transaction, we've just fired it ourselves)\n return trans._completion.then(() => x);\n }).catch(e => {\n trans._reject(e); // Yes, above then-handler were maybe not called because of an unhandled rejection in scopeFunc!\n return rejection(e);\n });\n });\n}\n","import {\n DBCore,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryRequest,\n DBCoreRangeType,\n DBCoreOpenCursorRequest,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreTable,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { getKeyExtractor } from './get-key-extractor';\nimport { getKeyPathAlias } from './dbcore-indexeddb';\nimport { Middleware } from '../public/types/middleware';\n\ninterface VirtualIndex extends DBCoreIndex {\n /** True if this index is virtual, i.e. represents a compound index internally,\n * but makes it act as as having a subset of its keyPaths.\n */\n isVirtual: boolean;\n\n /** Number of keypaths that this index comprises. Can be 0..N.\n * Note: This is the length of the *virtual index*, not the real index.\n */\n keyLength: number;\n\n /** Number of popped keypaths from the real index.\n */\n keyTail: number;\n\n /** LowLevelIndex represents the actual IndexedDB index behind it */\n lowLevelIndex: DBCoreIndex;\n}\n\n// Move into some util:\nexport function pad (a: any | any[], value: any, count: number) {\n const result = isArray(a) ? a.slice() : [a];\n for (let i=0; i 0;\n const virtualIndex = {\n ...lowLevelIndex,\n name: isVirtual\n ? `${keyPathAlias}(virtual-from:${lowLevelIndex.name})`\n : lowLevelIndex.name,\n lowLevelIndex,\n isVirtual,\n keyTail,\n keyLength,\n extractKey: getKeyExtractor(keyPath),\n unique: !isVirtual && lowLevelIndex.unique\n };\n indexList.push(virtualIndex);\n if (!virtualIndex.isPrimaryKey) {\n allVirtualIndexes.push(virtualIndex);\n }\n if (keyLength > 1) {\n const virtualKeyPath = keyLength === 2 ?\n keyPath[0] : // This is a compound [a, b]. Add a virtual normal index a.\n keyPath.slice(0, keyLength - 1); // This is compound [a,b,c]. Add virtual compound [a,b].\n addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex);\n }\n indexList.sort((a,b) => a.keyTail - b.keyTail); // Shortest keyTail is the best one (represents real index)\n return virtualIndex;\n }\n \n const primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey);\n indexLookup[\":id\"] = [primaryKey];\n for (const index of schema.indexes) {\n addVirtualIndexes(index.keyPath, 0, index);\n }\n \n function findBestIndex(keyPath: null | string | string[]): VirtualIndex {\n const result = indexLookup[getKeyPathAlias(keyPath)];\n return result && result[0];\n }\n \n function translateRange (range: DBCoreKeyRange, keyTail: number): DBCoreKeyRange {\n return {\n type: range.type === DBCoreRangeType.Equal ?\n DBCoreRangeType.Range :\n range.type,\n lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail),\n lowerOpen: true, // doesn't matter true or false\n upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail),\n upperOpen: true // doesn't matter true or false\n };\n }\n \n function translateRequest (req: DBCoreQueryRequest): DBCoreQueryRequest;\n function translateRequest (req: DBCoreOpenCursorRequest): DBCoreOpenCursorRequest;\n function translateRequest (req: DBCoreCountRequest): DBCoreCountRequest {\n const index = req.query.index as VirtualIndex;\n return index.isVirtual ? {\n ...req,\n query: {\n index: index.lowLevelIndex,\n range: translateRange(req.query.range, index.keyTail)\n }\n } : req;\n }\n \n const result: DBCoreTable = {\n ...table,\n schema: {\n ...schema,\n primaryKey,\n indexes: allVirtualIndexes,\n getIndexByKeyPath: findBestIndex\n },\n\n count(req) {\n return table.count(translateRequest(req));\n }, \n \n query(req) {\n return table.query(translateRequest(req));\n },\n \n openCursor(req) {\n const {keyTail, isVirtual, keyLength} = (req.query.index as VirtualIndex);\n if (!isVirtual) return table.openCursor(req);\n \n function createVirtualCursor(cursor: DBCoreCursor) : DBCoreCursor {\n function _continue (key?: any) {\n key != null ?\n cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) :\n req.unique ?\n cursor.continue(\n cursor.key.slice(0, keyLength)\n .concat(req.reverse\n ? down.MIN_KEY\n : down.MAX_KEY, keyTail)\n ) :\n cursor.continue()\n }\n const virtualCursor = Object.create(cursor, {\n continue: {value: _continue},\n continuePrimaryKey: {\n value(key: any, primaryKey: any) {\n cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey);\n }\n },\n primaryKey: {\n get() {\n return cursor.primaryKey;\n }\n },\n key: {\n get() {\n const key = cursor.key as any[]; // A virtual cursor always operates on compound key\n return keyLength === 1 ?\n key[0] : // Cursor.key should not be an array.\n key.slice(0, keyLength); // Cursor.key should be first part of array.\n }\n },\n value: {\n get() {\n return cursor.value;\n }\n }\n });\n return virtualCursor;\n }\n \n return table.openCursor(translateRequest(req))\n .then(cursor => cursor && createVirtualCursor(cursor));\n }\n };\n return result;\n }\n }\n}\n\nexport const virtualIndexMiddleware : Middleware = {\n stack: \"dbcore\",\n name: \"VirtualIndexMiddleware\",\n level: 1,\n create: createVirtualIndexMiddleware\n};\n\n","import { keys, hasOwn, toStringTag } from './utils';\n\nexport function getObjectDiff(a: any, b: any, rv?: any, prfx?: string) {\n // Compares objects a and b and produces a diff object.\n rv = rv || {};\n prfx = prfx || '';\n keys(a).forEach((prop) => {\n if (!hasOwn(b, prop)) {\n // Property removed\n rv[prfx + prop] = undefined;\n } else {\n var ap = a[prop],\n bp = b[prop];\n if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) {\n const apTypeName = toStringTag(ap);\n const bpTypeName = toStringTag(bp);\n\n if (apTypeName !== bpTypeName) {\n rv[prfx + prop] = b[prop]; // Property changed to other type\n } else if (apTypeName === 'Object') {\n // Pojo objects (not Date, ArrayBuffer, Array etc). Go deep.\n getObjectDiff(ap, bp, rv, prfx + prop + '.');\n } else if (ap !== bp) {\n // Values differ.\n // Could have checked if Date, arrays or binary types have same\n // content here but I think that would be a suboptimation.\n // Prefer simplicity.\n rv[prfx + prop] = b[prop];\n }\n } else if (ap !== bp) rv[prfx + prop] = b[prop]; // Primitive value changed\n }\n });\n keys(b).forEach((prop) => {\n if (!hasOwn(a, prop)) {\n rv[prfx + prop] = b[prop]; // Property added\n }\n });\n return rv;\n}\n","import {\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreIndex,\n DBCoreTable,\n} from \"../public/types/dbcore\";\n\nexport function getEffectiveKeys (\n primaryKey: DBCoreIndex,\n req: (Pick & {keys?: any[]}) | Pick)\n{\n //const {outbound} = primaryKey;\n if (req.type === 'delete') return req.keys;\n return req.keys || req.values.map(primaryKey.extractKey)\n}\n","import {\n DBCore,\n DBCoreTable,\n DBCoreMutateResponse,\n DBCoreDeleteRangeRequest,\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreTransaction,\n DBCoreKeyRange\n} from \"../public/types/dbcore\";\nimport { nop } from '../functions/chaining-functions';\nimport { hasOwn, setByKeyPath } from '../functions/utils';\nimport { getObjectDiff } from \"../functions/get-object-diff\";\nimport { PSD } from '../helpers/promise';\n//import { LockableTableMiddleware } from '../dbcore/lockable-table-middleware';\nimport { getEffectiveKeys } from '../dbcore/get-effective-keys';\nimport { Middleware } from '../public/types/middleware';\nimport { Transaction } from '../classes/transaction';\n\nexport const hooksMiddleware: Middleware = {\n stack: \"dbcore\",\n name: \"HooksMiddleware\",\n level: 2,\n create: (downCore: DBCore) => ({\n ...downCore,\n table(tableName: string) {\n const downTable = downCore.table(tableName);\n const {primaryKey} = downTable.schema;\n \n const tableMiddleware: DBCoreTable = {\n ...downTable,\n mutate(req):Promise {\n const dxTrans = PSD.trans as Transaction;\n // Hooks can be transaction-bound. Need to grab them from transaction.table and not\n // db.table!\n const {deleting, creating, updating} = dxTrans.table(tableName).hook;\n switch (req.type) {\n case 'add':\n if (creating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'put':\n if (creating.fire === nop && updating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'delete':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'deleteRange':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>deleteRange(req), true);\n }\n // Any of the breaks above happened (no hooks) - do the default:\n return downTable.mutate(req);\n\n\n function addPutOrDelete(req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest): Promise {\n const dxTrans = PSD.trans;\n const keys = req.keys || getEffectiveKeys(primaryKey, req);\n if (!keys) throw new Error(\"Keys missing\");\n // Clone Request and set keys arg\n req = req.type === 'add' || req.type === 'put' ?\n {...req, keys} :\n {...req};\n if (req.type !== 'delete') req.values = [...req.values];\n if (req.keys) req.keys = [...req.keys];\n \n return getExistingValues(downTable, req, keys).then (existingValues => {\n const contexts = keys.map((key, i) => {\n const existingValue = existingValues[i];\n const ctx = { onerror: null, onsuccess: null };\n if (req.type === 'delete') {\n // delete operation\n deleting.fire.call(ctx, key, existingValue, dxTrans);\n } else if (req.type === 'add' || existingValue === undefined) {\n // The add() or put() resulted in a create\n const generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans);\n if (key == null && generatedPrimaryKey != null) {\n key = generatedPrimaryKey;\n req.keys[i] = key;\n if (!primaryKey.outbound) {\n setByKeyPath(req.values[i], primaryKey.keyPath, key);\n }\n }\n } else {\n // The put() operation resulted in an update\n const objectDiff = getObjectDiff(existingValue, req.values[i]);\n const additionalChanges = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans);\n if (additionalChanges) {\n const requestedValue = req.values[i];\n Object.keys(additionalChanges).forEach(keyPath => {\n if (hasOwn(requestedValue, keyPath)) {\n // keyPath is already present as a literal property of the object\n requestedValue[keyPath] = additionalChanges[keyPath];\n } else {\n // keyPath represents a new or existing path into the object\n setByKeyPath(requestedValue, keyPath, additionalChanges[keyPath]);\n }\n });\n }\n }\n return ctx;\n });\n return downTable.mutate(req).then(({failures, results, numFailures, lastResult}) => {\n for (let i=0; i {\n contexts.forEach(ctx => ctx.onerror && ctx.onerror(error));\n return Promise.reject(error);\n });\n });\n }\n \n function deleteRange(req: DBCoreDeleteRangeRequest): Promise {\n return deleteNextChunk(req.trans, req.range, 10000);\n }\n \n function deleteNextChunk(trans: DBCoreTransaction, range: DBCoreKeyRange, limit: number) {\n // Query what keys in the DB within the given range\n return downTable.query({trans, values: false, query: {index: primaryKey, range}, limit})\n .then(({result}) => {\n // Given a set of keys, bulk delete those using the same procedure as in addPutOrDelete().\n // This will make sure that deleting hook is called.\n return addPutOrDelete({type: 'delete', keys: result, trans}).then(res => {\n if (res.numFailures > 0) return Promise.reject(res.failures[0]);\n if (result.length < limit) {\n return {failures: [], numFailures: 0, lastResult: undefined} as DBCoreMutateResponse;\n } else {\n return deleteNextChunk(trans, {...range, lower: result[result.length - 1], lowerOpen: true}, limit);\n }\n });\n })\n }\n }\n };\n //const {lock, lockableMiddleware} = LockableTableMiddleware(tableMiddleware);\n\n return tableMiddleware;\n },\n }) as DBCore\n};\n\nfunction getExistingValues(\n table: DBCoreTable,\n req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest,\n effectiveKeys: any[]\n) {\n return req.type === \"add\"\n ? Promise.resolve([])\n : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: \"immutable\" });\n}\n","import { deepClone } from \"../functions/utils\";\nimport { DBCore } from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport Promise from \"../helpers/promise\";\nimport { cmp } from '../functions/cmp';\n\nexport function getFromTransactionCache(\n keys: readonly any[],\n cache: { keys: any[]; values: any[] } | undefined | null,\n clone?: boolean\n) {\n try {\n if (!cache) return null;\n if (cache.keys.length < keys.length) return null;\n const result: any[] = [];\n // Compare if the exact same order of keys was retrieved in same transaction:\n // Allow some cached keys to be omitted from provided set of keys\n // Use case: 1. getMany(keys) 2. update a subset of those 3. call put with the updated ones ==> middlewares should be able to find old values\n for (let i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) {\n if (cmp(cache.keys[i], keys[j]) !== 0) continue;\n result.push(clone ? deepClone(cache.values[i]) : cache.values[i]);\n ++j;\n }\n // If got all keys caller was looking for, return result.\n return result.length === keys.length ? result : null;\n } catch {\n return null;\n }\n}\n\nexport const cacheExistingValuesMiddleware: Middleware = {\n stack: \"dbcore\",\n level: -1,\n create: (core) => {\n return {\n table: (tableName) => {\n const table = core.table(tableName);\n return {\n ...table,\n getMany: (req) => {\n if (!req.cache) {\n return table.getMany(req);\n }\n const cachedResult = getFromTransactionCache(\n req.keys,\n req.trans[\"_cache\"],\n req.cache === \"clone\"\n );\n if (cachedResult) {\n return Promise.resolve(cachedResult);\n }\n return table.getMany(req).then((res) => {\n req.trans[\"_cache\"] = {\n keys: req.keys,\n values: req.cache === \"clone\" ? deepClone(res) : res,\n };\n return res;\n });\n },\n mutate: (req) => {\n // Invalidate cache on any mutate except \"add\" which can't change existing values:\n if (req.type !== \"add\") req.trans[\"_cache\"] = null;\n return table.mutate(req);\n },\n };\n },\n };\n },\n};\n","import { DBCore, DBCoreTable } from '../../public/types/dbcore';\nimport { LiveQueryContext } from '../live-query';\n\nexport function isCachableContext(ctx: LiveQueryContext, table: DBCoreTable) {\n return (\n ctx.trans.mode === 'readonly' &&\n !!ctx.subscr &&\n !ctx.trans.explicit &&\n ctx.trans.db._options.cache !== 'disabled' &&\n !table.schema.primaryKey.outbound\n );\n}\n\n","import { DBCoreCountRequest, DBCoreGetManyRequest, DBCoreGetRequest, DBCoreOpenCursorRequest, DBCoreQueryRequest } from '../../public/types/dbcore';\n\n\nexport function isCachableRequest(type: string, req: Partial) {\n switch (type) {\n case 'query':\n return req.values && !req.unique;\n case 'get':\n return false;\n case 'getMany':\n return false;\n case 'count':\n return false;\n case 'openCursor':\n return false;\n }\n}\n","import { LiveQueryContext } from \".\";\nimport { getFromTransactionCache } from \"../dbcore/cache-existing-values-middleware\";\nimport { getEffectiveKeys } from \"../dbcore/get-effective-keys\";\nimport { exceptions } from \"../errors\";\nimport { cmp } from \"../functions/cmp\";\nimport { isArray, keys } from \"../functions/utils\";\nimport { PSD } from \"../helpers/promise\";\nimport { RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport {\n DBCore,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreGetManyRequest,\n DBCoreGetRequest,\n DBCoreIndex,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreQueryResponse,\n DBCoreTable,\n DBCoreTableSchema,\n DBCoreTransaction,\n} from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport { isCachableContext } from \"./cache/is-cachable-context\";\nimport { isCachableRequest } from \"./cache/is-cachable-request\";\nimport { extendObservabilitySet } from \"./extend-observability-set\";\n\nexport const observabilityMiddleware: Middleware = {\n stack: \"dbcore\",\n level: 0,\n name: \"Observability\",\n create: (core) => {\n const dbName = core.schema.name;\n const FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY);\n\n return {\n ...core,\n transaction: (stores, mode, options) => {\n if (PSD.subscr && mode !== 'readonly') {\n throw new exceptions.ReadOnly(`Readwrite transaction in liveQuery context. Querier source: ${(PSD as LiveQueryContext).querier}`);\n }\n return core.transaction(stores, mode, options);\n },\n table: (tableName) => {\n const table = core.table(tableName);\n const { schema } = table;\n const { primaryKey, indexes } = schema;\n const { extractKey, outbound } = primaryKey;\n const indexesWithAutoIncPK = primaryKey.autoIncrement && indexes.filter(\n (index) => index.compound && (index.keyPath as string[]).includes(primaryKey.keyPath as string)\n );\n const tableClone: DBCoreTable = {\n ...table,\n mutate: (req) => {\n const trans = req.trans as DBCoreTransaction & {\n mutatedParts?: ObservabilitySet;\n };\n const mutatedParts = req.mutatedParts || (req.mutatedParts = {});\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (mutatedParts[part] ||\n (mutatedParts[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n\n const { type } = req;\n let [keys, newObjs] =\n req.type === \"deleteRange\"\n ? [req.range] // keys will be an DBCoreKeyRange object - transformed later on to a [from,to]-style range.\n : req.type === \"delete\"\n ? [req.keys] // keys known already here. newObjs will be undefined.\n : req.values.length < 50\n ? [getEffectiveKeys(primaryKey, req).filter(id => id), req.values] // keys except autoIncremented - they will be added later on.\n : []; // keys and newObjs will both be undefined - changeSpec will become true (changed for entire table)\n\n const oldCache = req.trans[\"_cache\"];\n\n // Add the mutated table and optionally keys to the mutatedTables set on the transaction.\n // Used by subscribers to txcommit event and for Collection.prototype.subscribe().\n if (isArray(keys)) {\n // keys is an array - delete, add or put of less than 50 rows.\n // Individual keys (add put or delete)\n pkRangeSet.addKeys(keys);\n // Only get oldObjs if they have been cached recently\n // (This applies to Collection.modify() only, but also if updating/deleting hooks have subscribers)\n const oldObjs = type === 'delete' || keys.length === newObjs.length ? getFromTransactionCache(keys, oldCache) : null;\n\n // Supply detailed values per index for both old and new objects:\n if (!oldObjs) {\n // add, delete or put and we don't know old values.\n // Indicate this in the \":dels\" part, for the sake of count() and primaryKeys() queries only!\n delsRangeSet.addKeys(keys);\n }\n if (oldObjs || newObjs) {\n // No matter if knowning oldObjs or not, track the indices if it's a put, add or delete.\n trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs);\n }\n } else if (keys) {\n // keys is a DBCoreKeyRange object. Transform it to [from,to]-style range.\n // As we can't know deleted index ranges, mark index-based subscriptions must trigger.\n const range = { from: keys.lower, to: keys.upper };\n delsRangeSet.add(range);\n // deleteRange. keys is a DBCoreKeyRange objects. Transform it to [from,to]-style range.\n pkRangeSet.add(range);\n } else {\n // Too many requests to record the details without slowing down write performance.\n // Let's just record a generic large range on primary key, the virtual :dels index and\n // all secondary indices:\n pkRangeSet.add(FULL_RANGE);\n delsRangeSet.add(FULL_RANGE);\n schema.indexes.forEach(idx => getRangeSet(idx.name).add(FULL_RANGE));\n }\n\n return table.mutate(req).then((res) => {\n // Merge the mutated parts from the request into the transaction's mutatedParts\n // now when the request went fine.\n if (keys && (req.type === 'add' || req.type === 'put')) {\n // Less than 50 requests (keys truthy) (otherwise we've added full range anyway)\n // autoincrement means we might not have got all keys until now\n pkRangeSet.addKeys(res.results);\n if (indexesWithAutoIncPK) {\n // Dexie Issue 1946:\n // If an auto-incremented primary key is part of a compound index,\n // we need to compute the resulting value of that index after inserting\n // the rows.\n indexesWithAutoIncPK.forEach(idx => {\n // Extract values of this compound index where primary key is not yet set:\n const idxVals = req.values.map(v => idx.extractKey(v));\n // Find the position of the primary key in the index:\n const pkPos = (idx.keyPath as string[]).findIndex(prop => prop === primaryKey.keyPath);\n // Update idxVals with the resulting primary keys to complete the index value:\n res.results!.forEach(pk => idxVals[pkPos] = pk);\n // Add the updated index to the rangeset:\n getRangeSet(idx.name).addKeys(idxVals);\n });\n }\n }\n trans.mutatedParts = extendObservabilitySet (\n trans.mutatedParts || {},\n mutatedParts\n );\n return res;\n });\n },\n };\n\n const getRange: (req: any) => [DBCoreIndex, RangeSet] = ({\n query: { index, range },\n }:\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest) => [\n index,\n new RangeSet(range.lower ?? core.MIN_KEY, range.upper ?? core.MAX_KEY),\n ];\n\n const readSubscribers: {[method in\n Exclude]: \n (req: any) => [DBCoreIndex, RangeSet]\n } = {\n get: (req) => [primaryKey, new RangeSet(req.key)],\n getMany: (req) => [primaryKey, new RangeSet().addKeys(req.keys)],\n count: getRange,\n query: getRange,\n openCursor: getRange,\n }\n\n keys(readSubscribers).forEach((method: 'get' | 'getMany' | 'count' | 'query' | 'openCursor') => {\n tableClone[method] = function (\n req:\n | DBCoreGetRequest\n | DBCoreGetManyRequest\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest\n ) {\n const { subscr } = PSD as LiveQueryContext;\n const isLiveQuery = !!subscr;\n let cachable = isCachableContext(PSD as LiveQueryContext, table) && isCachableRequest(method, req);\n const obsSet = cachable\n ? req.obsSet = {} // Implicit read transaction - track changes for this query only for the request's duration\n : subscr; // Explicit read transaction - track changes across entire live query\n\n if (isLiveQuery) {\n // Current zone want's to track all queries so they can be subscribed to.\n // (The query is executed within a \"liveQuery\" zone)\n // Check whether the query applies to a certain set of ranges:\n // Track what we should be observing:\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (obsSet[part] ||\n (obsSet[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n const [queriedIndex, queriedRanges] = readSubscribers[method](req);\n // A generic rule here: queried ranges should always be subscribed to.\n if (method === 'query' && queriedIndex.isPrimaryKey && !(req as DBCoreQueryRequest).values) {\n // A pure primay-key based Collection where only .primaryKeys() is requested. Don't wakeup on other changes than added or deleted primary keys within queried range.\n delsRangeSet.add(queriedRanges);\n } else {\n getRangeSet(queriedIndex.name || \"\").add(queriedRanges);\n }\n if (!queriedIndex.isPrimaryKey) {\n // Only count(), query() and openCursor() operates on secondary indices.\n // Since put(), delete() and deleteRange() mutations may happen without knowing oldObjs,\n // the mutate() method will be missing what secondary indices that are being deleted from\n // the subscribed range. We are working around this issue by recording all the resulting\n // primary keys from the queries. This only works for those kinds of queries where we can\n // derive the primary key from the result.\n // In this block we are accomplishing this using various strategies depending on the properties\n // of the query result.\n\n if (method === \"count\") {\n // We've got a problem! Delete and put mutations happen without known the oldObjs.\n // Those mutation could change the count.\n // Solution: Dedicated \":dels\" url represends a subscription to all mutations without oldObjs\n // (specially triggered in the mutators put(), delete() and deleteRange() when they don't know oldObject)\n delsRangeSet.add(FULL_RANGE);\n } else {\n // openCursor() or query()\n\n // Prepare a keysPromise in case the we're doing an IDBIndex.getAll() on a store with outbound keys.\n const keysPromise =\n method === \"query\" &&\n outbound &&\n (req as DBCoreQueryRequest).values &&\n table.query({\n ...(req as DBCoreQueryRequest),\n values: false,\n });\n\n return table[method].apply(this, arguments).then((res) => {\n if (method === \"query\") {\n if (outbound && (req as DBCoreQueryRequest).values) {\n // If keys are outbound, we can't use extractKey to map what keys to observe.\n // We've queried an index (like 'dateTime') on an outbound table\n // and retrieve a list of objects\n // from who we cannot know their primary keys.\n // \"Luckily\" though, we've prepared the keysPromise to assist us in exact this condition.\n return keysPromise.then(\n ({ result: resultingKeys }: DBCoreQueryResponse) => {\n pkRangeSet.addKeys(resultingKeys);\n return res;\n }\n );\n }\n // query() inbound values, keys or outbound keys. Secondary indexes only since\n // for primary keys we would only add results within the already registered range.\n const pKeys = (req as DBCoreQueryRequest).values\n ? (res as DBCoreQueryResponse).result.map(extractKey)\n : (res as DBCoreQueryResponse).result;\n if ((req as DBCoreQueryRequest).values) {\n // Subscribe to any mutation made on the returned keys,\n // so that we detect both deletions and updated properties.\n pkRangeSet.addKeys(pKeys);\n } else {\n // Subscribe only to mutations on the returned keys\n // in case the mutator was unable to know oldObjs.\n // If it has oldObj, the mutator won't put anything in \":dels\" because\n // it can more fine-grained put the exact removed and added index value in the correct\n // index range that we subscribe to in the queried range sets.\n // We don't load values so a change on a property outside our index will not\n // require us to re-execute the query.\n delsRangeSet.addKeys(pKeys);\n }\n } else if (method === \"openCursor\") {\n // Caller requests a cursor.\n // For the same reason as when method===\"query\", we only need to observe\n // those keys whose values are possibly used or rendered - which could\n // only happen on keys where they get the cursor's key, primaryKey or value.\n const cursor: DBCoreCursor | null = res;\n const wantValues = (req as DBCoreOpenCursorRequest).values;\n return (\n cursor &&\n Object.create(cursor, {\n key: {\n get() {\n delsRangeSet.addKey(cursor.primaryKey);\n return cursor.key;\n },\n },\n primaryKey: {\n get() {\n const pkey = cursor.primaryKey;\n delsRangeSet.addKey(pkey);\n return pkey;\n },\n },\n value: {\n get() {\n wantValues && pkRangeSet.addKey(cursor.primaryKey);\n return cursor.value;\n },\n },\n })\n );\n }\n return res;\n });\n }\n }\n }\n return table[method].apply(this, arguments);\n };\n });\n return tableClone;\n },\n };\n },\n};\n\nfunction trackAffectedIndexes(\n getRangeSet: (index: string) => RangeSet,\n schema: DBCoreTableSchema,\n oldObjs: readonly any[] | undefined,\n newObjs: readonly any[] | undefined\n) {\n function addAffectedIndex(ix: DBCoreIndex) {\n const rangeSet = getRangeSet(ix.name || \"\");\n function extractKey(obj: any) {\n return obj != null ? ix.extractKey(obj) : null;\n }\n const addKeyOrKeys = (key: any) => ix.multiEntry && isArray(key)\n // multiEntry and the old property was an array - add each array entry to the rangeSet:\n ? key.forEach(key => rangeSet.addKey(key))\n // Not multiEntry or the old property was not an array - add each array entry to the rangeSet:\n : rangeSet.addKey(key);\n\n (oldObjs || newObjs).forEach((_, i) => {\n const oldKey = oldObjs && extractKey(oldObjs[i]);\n const newKey = newObjs && extractKey(newObjs[i]);\n if (cmp(oldKey, newKey) !== 0) {\n // The index has changed. Add both old and new value of the index.\n if (oldKey != null) addKeyOrKeys(oldKey); // If oldKey is invalid key, addKey() will be a noop.\n if (newKey != null) addKeyOrKeys(newKey); // If newKey is invalid key, addKey() will be a noop.\n }\n });\n }\n schema.indexes.forEach(addAffectedIndex);\n}\n","import { delArrayItem, isArray } from '../../functions/utils';\nimport { TblQueryCache } from '../../public/types/cache';\nimport {\n DBCoreMutateRequest,\n DBCoreMutateResponse,\n} from '../../public/types/dbcore';\n\nexport function adjustOptimisticFromFailures(\n tblCache: TblQueryCache,\n req: DBCoreMutateRequest,\n res: DBCoreMutateResponse\n): DBCoreMutateRequest {\n if (res.numFailures === 0) return req;\n if (req.type === 'deleteRange') {\n // numFailures > 0 means the deleteRange operation failed in its whole.\n return null;\n }\n\n const numBulkOps = req.keys\n ? req.keys.length\n : 'values' in req && req.values\n ? req.values.length\n : 1;\n if (res.numFailures === numBulkOps) {\n // Same number of failures as the number of ops. This means that all ops failed.\n return null;\n }\n\n const clone: DBCoreMutateRequest = { ...req };\n\n if (isArray(clone.keys)) {\n clone.keys = clone.keys.filter((_, i) => !(i in res.failures));\n }\n if ('values' in clone && isArray(clone.values)) {\n clone.values = clone.values.filter((_, i) => !(i in res.failures));\n }\n return clone;\n}\n","import { cmp } from '../../functions/cmp';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function isAboveLower(key: IndexableType, range: DBCoreKeyRange) {\n return range.lower === undefined\n ? true // lower is less than anything because it is undefined\n : range.lowerOpen\n ? cmp(key, range.lower) > 0 // lowerOpen: Exclude lower bound\n : cmp(key, range.lower) >= 0; // !lowerOpen: Include lower bound\n}\n\nexport function isBelowUpper(key: IndexableType, range: DBCoreKeyRange) {\n return range.upper === undefined\n ? true // upper is greater than anything because it is undefined\n : range.upperOpen\n ? cmp(key, range.upper) < 0 // upperOpen: Exclude upper bound\n : cmp(key, range.upper) <= 0; // !upperOpen: Include upper bound\n}\n\nexport function isWithinRange(key: IndexableType, range: DBCoreKeyRange) {\n return isAboveLower(key, range) && isBelowUpper(key, range);\n}\n","import { cmp } from '../../functions/cmp';\nimport { deepClone, isArray } from '../../functions/utils';\nimport { RangeSet, rangesOverlap } from '../../helpers/rangeset';\nimport { CacheEntry } from '../../public/types/cache';\nimport {\n DBCoreIndex,\n DBCoreMutateRequest,\n DBCoreQueryRequest,\n DBCoreTable,\n} from '../../public/types/dbcore';\nimport { isWithinRange } from './is-within-range';\n\nexport function applyOptimisticOps(\n result: any[],\n req: DBCoreQueryRequest,\n ops: DBCoreMutateRequest[] | undefined,\n table: DBCoreTable,\n cacheEntry: CacheEntry,\n immutable: boolean\n): any[] {\n if (!ops || ops.length === 0) return result;\n const index = req.query.index;\n const { multiEntry } = index;\n const queryRange = req.query.range;\n const primaryKey = table.schema.primaryKey;\n const extractPrimKey = primaryKey.extractKey!;\n const extractIndex = index.extractKey!;\n const extractLowLevelIndex = (index.lowLevelIndex || index).extractKey!;\n\n let finalResult = ops.reduce((result, op) => {\n let modifedResult = result;\n const includedValues =\n op.type === 'add' || op.type === 'put'\n ? op.values.filter((v) => {\n const key = extractIndex(v);\n return multiEntry && isArray(key) // multiEntry index work like plain index unless key is array\n ? key.some((k) => isWithinRange(k, queryRange)) // multiEntry and array key\n : isWithinRange(key, queryRange); // multiEntry but not array key\n }).map(v => {\n v = deepClone(v);// v might come from user so we can't just freeze it.\n if (immutable) Object.freeze(v);\n return v;\n })\n : [];\n switch (op.type) {\n case 'add':\n modifedResult = result.concat(\n req.values\n ? includedValues\n : includedValues.map((v) => extractPrimKey(v))\n );\n break;\n case 'put':\n const keySet = new RangeSet().addKeys(\n op.values.map((v) => extractPrimKey(v))\n );\n modifedResult = result\n .filter((item) => {\n const key = req.values ? extractPrimKey(item) : item;\n return !rangesOverlap(new RangeSet(key), keySet);\n })\n .concat(\n req.values\n ? includedValues\n : includedValues.map((v) => extractPrimKey(v))\n );\n break;\n case 'delete':\n const keysToDelete = new RangeSet().addKeys(op.keys);\n modifedResult = result.filter((item) => {\n const key = req.values ? extractPrimKey(item) : item;\n return !rangesOverlap(new RangeSet(key), keysToDelete);\n });\n\n break;\n case 'deleteRange':\n const range = op.range;\n modifedResult = result.filter((item) => !isWithinRange(extractPrimKey(item), range));\n break;\n }\n return modifedResult;\n }, result);\n\n // If no changes were made, we can return the original result.\n if (finalResult === result) return result;\n\n // Sort the result on sortIndex:\n finalResult.sort((a, b) =>\n cmp(extractLowLevelIndex(a), extractLowLevelIndex(b)) ||\n cmp(extractPrimKey(a), extractPrimKey(b))\n );\n\n // If we have a limit we need to respect it:\n if (req.limit && req.limit < Infinity) {\n if (finalResult.length > req.limit) {\n finalResult.length = req.limit; // Cut of any extras after sorting correctly.\n } else if (result.length === req.limit && finalResult.length < req.limit) {\n // We're missing some items because of the limit. We need to add them back.\n // The easiest way is to mark the cache entry as dirty, which will cause\n // it to be requeried after the write-transaction successfully completes.\n cacheEntry.dirty = true;\n }\n }\n return immutable ? Object.freeze(finalResult) as any[] : finalResult;\n}\n","import { cmp } from '../../functions/cmp';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function areRangesEqual(r1: DBCoreKeyRange, r2: DBCoreKeyRange) {\n return (\n cmp(r1.lower, r2.lower) === 0 &&\n cmp(r1.upper, r2.upper) === 0 &&\n !!r1.lowerOpen === !!r2.lowerOpen &&\n !!r1.upperOpen === !!r2.upperOpen\n );\n}\n","import { cmp } from '../../functions/cmp';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\n\nexport function compareLowers(lower1: any, lower2: any, lowerOpen1: boolean, lowerOpen2: boolean) {\n if (lower1 === undefined) return lower2 !== undefined ? -1 : 0;\n if (lower2 === undefined) return 1; // since lower1 !== undefined\n const c = cmp(lower1, lower2);\n if (c === 0) {\n if (lowerOpen1 && lowerOpen2) return 0;\n if (lowerOpen1) return 1\n if (lowerOpen2) return -1;\n }\n return c;\n}\n\nexport function compareUppers(upper1: any, upper2: any, upperOpen1: boolean, upperOpen2: boolean) {\n if (upper1 === undefined) return upper2 !== undefined ? 1 : 0;\n if (upper2 === undefined) return -1; // since upper1 !== undefined\n const c = cmp(upper1, upper2);\n if (c === 0) {\n if (upperOpen1 && upperOpen2) return 0;\n if (upperOpen1) return -1\n if (upperOpen2) return 1;\n }\n return c;\n}\n\nexport function isSuperRange(r1: DBCoreKeyRange, r2: DBCoreKeyRange) {\n return (\n compareLowers(r1.lower, r2.lower, r1.lowerOpen, r2.lowerOpen) <= 0 &&\n compareUppers(r1.upper, r2.upper, r1.upperOpen, r2.upperOpen) >= 0\n );\n}","import { CacheEntry, TblQueryCache } from '../../public/types/cache';\nimport {\n DBCoreCountRequest,\n DBCoreQueryRequest,\n} from '../../public/types/dbcore';\nimport { areRangesEqual } from './are-ranges-equal';\nimport { cache } from './cache';\nimport { isSuperRange } from './is-super-range';\n\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'query',\n req: DBCoreQueryRequest\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]];\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'count',\n req: DBCoreCountRequest\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]];\nexport function findCompatibleQuery(\n dbName: string,\n tableName: string,\n type: 'query' | 'count',\n req: Partial & Partial\n): [] | [CacheEntry, boolean, TblQueryCache, CacheEntry[]] {\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (!tblCache) return [];\n const queries = tblCache.queries[type];\n if (!queries) return [null, false, tblCache, null];\n const indexName = req.query ? req.query.index.name : null;\n const entries = queries[indexName || ''];\n if (!entries) return [null, false, tblCache, null];\n\n switch (type) {\n case 'query':\n const equalEntry = entries.find(\n (entry) =>\n (entry.req as DBCoreQueryRequest).limit === req.limit &&\n (entry.req as DBCoreQueryRequest).values === req.values &&\n areRangesEqual(entry.req.query.range, req.query.range)\n );\n if (equalEntry)\n return [\n equalEntry,\n true, // exact match\n tblCache,\n entries,\n ];\n const superEntry = entries.find((entry) => {\n const limit = 'limit' in entry.req ? entry.req.limit : Infinity;\n return (\n limit >= req.limit &&\n (req.values ? (entry.req as DBCoreQueryRequest).values : true) &&\n isSuperRange(entry.req.query.range, req.query.range)\n );\n });\n return [superEntry, false, tblCache, entries];\n case 'count':\n const countQuery = entries.find((entry) =>\n areRangesEqual(entry.req.query.range, req.query.range)\n );\n return [countQuery, !!countQuery, tblCache, entries];\n }\n}\n","import { delArrayItem } from \"../../functions/utils\";\nimport { CacheEntry } from \"../../public/types/cache\";\n\nexport function subscribeToCacheEntry(cacheEntry: CacheEntry, container: CacheEntry[], requery: ()=>void, signal: AbortSignal) {\n cacheEntry.subscribers.add(requery);\n signal.addEventListener(\"abort\", () => {\n cacheEntry.subscribers.delete(requery);\n if (cacheEntry.subscribers.size === 0) {\n enqueForDeletion(cacheEntry, container);\n }\n });\n}\n\n\nfunction enqueForDeletion(cacheEntry: CacheEntry, container: CacheEntry[]) {\n setTimeout(() => {\n if (cacheEntry.subscribers.size === 0) { // Still empty (no new subscribers readded after grace time)\n delArrayItem(container, cacheEntry);\n }\n }, 3000);\n}\n","import { LiveQueryContext } from '..';\nimport type { Transaction } from '../../classes/transaction';\nimport { getEffectiveKeys } from '../../dbcore/get-effective-keys';\nimport { deepClone, delArrayItem, setByKeyPath } from '../../functions/utils';\nimport DexiePromise, { PSD } from '../../helpers/promise';\nimport { ObservabilitySet } from '../../public/types/db-events';\nimport {\n DBCore, DBCoreMutateRequest, DBCoreMutateResponse, DBCoreQueryRequest,\n DBCoreQueryResponse\n} from '../../public/types/dbcore';\nimport { Middleware } from '../../public/types/middleware';\nimport { obsSetsOverlap } from '../obs-sets-overlap';\nimport { adjustOptimisticFromFailures } from './adjust-optimistic-request-from-failures';\nimport { applyOptimisticOps } from './apply-optimistic-ops';\nimport { cache } from './cache';\nimport { findCompatibleQuery } from './find-compatible-query';\nimport { isCachableContext } from './is-cachable-context';\nimport { isCachableRequest } from './is-cachable-request';\nimport { signalSubscribersLazily } from './signalSubscribers';\nimport { subscribeToCacheEntry } from './subscribe-cachentry';\n\nexport const cacheMiddleware: Middleware = {\n stack: 'dbcore',\n level: 0,\n name: 'Cache',\n create: (core) => {\n const dbName = core.schema.name;\n const coreMW: DBCore = {\n ...core,\n transaction: (stores, mode, options) => {\n const idbtrans = core.transaction(\n stores,\n mode,\n options\n ) as IDBTransaction & {\n mutatedParts?: ObservabilitySet;\n _explicit?: boolean;\n };\n // Maintain TblQueryCache.ops array when transactions commit or abort\n if (mode === 'readwrite') {\n const ac = new AbortController();\n const { signal } = ac;\n const endTransaction = (wasCommitted: boolean) => () => {\n ac.abort();\n if (mode === 'readwrite') {\n // Collect which subscribers to notify:\n const affectedSubscribers = new Set<()=>void>();\n\n // Go through all tables in transaction and check if they have any optimistic updates\n for (const storeName of stores) {\n const tblCache = cache[`idb://${dbName}/${storeName}`];\n if (tblCache) {\n const table = core.table(storeName);\n // Pick optimistic ops that are part of this transaction\n const ops = tblCache.optimisticOps.filter(\n (op) => op.trans === idbtrans\n );\n // Transaction was marked as _explicit in enterTransactionScope(), transaction-helpers.ts.\n if (idbtrans._explicit && wasCommitted && idbtrans.mutatedParts) {\n // Invalidate all queries that overlap with the mutated parts and signal their subscribers\n for (const entries of Object.values(\n tblCache.queries.query\n )) {\n for (const entry of entries.slice()) {\n if (obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)) {\n delArrayItem(entries, entry); // Remove the entry from the cache so it can be refreshed\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n }\n }\n }\n } else if (ops.length > 0) {\n // Remove them from the optimisticOps array\n tblCache.optimisticOps = tblCache.optimisticOps.filter(\n (op) => op.trans !== idbtrans\n );\n // Commit or abort the optimistic updates\n for (const entries of Object.values(\n tblCache.queries.query\n )) {\n for (const entry of entries.slice()) {\n if (\n entry.res != null && // if entry.promise but not entry.res, we're fine. Query will resume now and get the result.\n idbtrans.mutatedParts/* &&\n obsSetsOverlap(entry.obsSet, idbtrans.mutatedParts)*/\n ) {\n if (wasCommitted && !entry.dirty) {\n const freezeResults = Object.isFrozen(entry.res);\n const modRes = applyOptimisticOps(\n entry.res as any[],\n entry.req,\n ops,\n table,\n entry,\n freezeResults\n );\n if (entry.dirty) {\n // Found out at this point that the entry is dirty - not to rely on!\n delArrayItem(entries, entry);\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n } else if (modRes !== entry.res) {\n entry.res = modRes;\n // Update promise\n entry.promise = DexiePromise.resolve({result: modRes} satisfies DBCoreQueryResponse);\n \n // No need to notify subscribers. They already have this value.\n // We have just updated the value of the cache without having to\n // requery the database - because we know the result for this\n // query based on computing the operations and applying them\n // to the previous result.\n }\n } else {\n if (entry.dirty) {\n // If the entry is dirty we need to get rid of it so that\n // a new entry will be created when the query is run again.\n delArrayItem(entries, entry);\n }\n // If we're not committing, we need to notify subscribers that the\n // optimistic updates are no longer valid.\n entry.subscribers.forEach((requery) => affectedSubscribers.add(requery));\n }\n }\n }\n }\n }\n }\n }\n affectedSubscribers.forEach((requery) => requery());\n }\n };\n idbtrans.addEventListener('abort', endTransaction(false), {\n signal,\n });\n idbtrans.addEventListener('error', endTransaction(false), {\n signal,\n });\n idbtrans.addEventListener('complete', endTransaction(true), {\n signal,\n });\n }\n return idbtrans;\n },\n table(tableName: string) {\n const downTable = core.table(tableName);\n const primKey = downTable.schema.primaryKey;\n const tableMW = {\n ...downTable,\n mutate(req: DBCoreMutateRequest): Promise {\n const trans = PSD.trans as Transaction;\n if (\n primKey.outbound || // Non-inbound tables are harded to apply optimistic updates on because we can't know primary key of results\n trans.db._options.cache === 'disabled' || // User has opted-out from caching\n trans.explicit // It's an explicit write transaction being made. Don't affect cache until transaction commits.\n ) {\n // Just forward the request to the core.\n return downTable.mutate(req);\n }\n // Find the TblQueryCache for this table:\n const tblCache = cache[`idb://${dbName}/${tableName}`];\n if (!tblCache) return downTable.mutate(req);\n\n const promise = downTable.mutate(req);\n if ((req.type === 'add' || req.type === 'put') && (req.values.length >= 50 || getEffectiveKeys(primKey, req).some(key => key == null))) {\n // There are some autoIncremented keys not set yet. Need to wait for completion before we can reliably enqueue the operation.\n // (or there are too many objects so we lazy out to avoid performance bottleneck for large bulk inserts)\n promise.then((res) => { // We need to extract result keys and generate cloned values with the keys set (so that applyOptimisticOps can work)\n // But we have a problem! The req.mutatedParts is still not complete so we have to actively add the keys to the unsignaledParts set manually.\n const reqWithResolvedKeys = {\n ...req,\n values: req.values.map((value, i) => {\n const valueWithKey = primKey.keyPath?.includes('.')\n ? deepClone(value)\n : {\n ...value,\n };\n setByKeyPath(valueWithKey, primKey.keyPath, res.results![i]);\n return valueWithKey;\n })\n };\n const adjustedReq = adjustOptimisticFromFailures(tblCache, reqWithResolvedKeys, res);\n tblCache.optimisticOps.push(adjustedReq);\n // Signal subscribers after the observability middleware has complemented req.mutatedParts with the new keys.\n // We must queue the task so that we get the req.mutatedParts updated by observability middleware first.\n // If we refactor the dependency between observability middleware and this middleware we might not need to queue the task.\n queueMicrotask(()=>req.mutatedParts && signalSubscribersLazily(req.mutatedParts)); // Reason for double laziness: in user awaits put and then does another put, signal once.\n });\n } else {\n // Enque the operation immediately\n tblCache.optimisticOps.push(req);\n // Signal subscribers that there are mutated parts\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts);\n promise.then((res) => {\n if (res.numFailures > 0) {\n // In case the operation failed, we need to remove it from the optimisticOps array.\n delArrayItem(tblCache.optimisticOps, req);\n const adjustedReq = adjustOptimisticFromFailures(tblCache, req, res);\n if (adjustedReq) {\n tblCache.optimisticOps.push(adjustedReq);\n }\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts); // Signal the rolling back of the operation.\n }\n });\n promise.catch(()=> {\n // In case the operation failed, we need to remove it from the optimisticOps array.\n delArrayItem(tblCache.optimisticOps, req);\n req.mutatedParts && signalSubscribersLazily(req.mutatedParts); // Signal the rolling back of the operation.\n });\n }\n return promise;\n },\n query(req: DBCoreQueryRequest): Promise {\n if (!isCachableContext(PSD, downTable) || !isCachableRequest(\"query\", req)) return downTable.query(req);\n const freezeResults =\n (PSD as LiveQueryContext).trans?.db._options.cache === 'immutable';\n const { requery, signal } = PSD as LiveQueryContext;\n let [cacheEntry, exactMatch, tblCache, container] =\n findCompatibleQuery(dbName, tableName, 'query', req);\n if (cacheEntry && exactMatch) {\n cacheEntry.obsSet = req.obsSet!; // So that optimistic result is monitored.\n // How? - because observability-middleware will track result where optimistic\n // mutations are applied and record it in the cacheEntry.\n // TODO: CHANGE THIS! The difference is resultKeys only.\n // Wanted behavior:\n // * cacheEntry obsSet should represent the obsSet without optimistic updates (so it can be checked when merging ops in tx commit)\n // * cacheEntry optimisticObsSet should represent the obsSet with current optimistic updates. It should be updated when adding an op\n // by adding the primary keys of the put/add/delete operation to the set.\n // * observability-middleware should stop recording req.obsSet when a cache entry exact match is found because it won't be used anyway.\n // I'm thinking of merging observability-middleware with cache-middleware into one single middleware because the dependencies are too\n // tight between them.\n } else {\n // --> TODO here: If not exact match, check if we have a superset to extract\n // the data from.\n\n // No cached result found. We need to query the database and cache the result.\n const promise = downTable.query(req).then((res) => {\n // Freeze or clone results\n const result = res.result;\n if (cacheEntry) cacheEntry.res = result;\n if (freezeResults) {\n // For performance reasons don't deep freeze.\n // Only freeze the top-level array and its items.\n // This is good enough to teach users that the result must be treated as immutable\n // without enforcing it recursively on the entire result (which is not even possible\n // for things like Date objects and typed arrays)\n for (let i = 0, l = result.length; i < l; ++i) {\n Object.freeze(result[i]);\n }\n Object.freeze(result);\n } else {\n // If not frozen, we need to clone the result to avoid user mutating the cache\n // When we do this, user's must feel conformable with the fact that the result\n // can be mutated deeply - user is not expected to have any respect for immutability.\n res.result = deepClone(result);\n }\n return res;\n }).catch(error => {\n // In case the query operation failed, we need to remove it from the cache\n // so that subsequent calls does not get the same error but re-evaluate\n // the query.\n if (container && cacheEntry) delArrayItem(container, cacheEntry);\n return Promise.reject(error);\n });\n cacheEntry = {\n obsSet: req.obsSet!,\n promise,\n subscribers: new Set(),\n type: 'query',\n req,\n dirty: false,\n };\n if (container) {\n container.push(cacheEntry);\n } else {\n container = [cacheEntry];\n if (!tblCache) {\n tblCache = cache[`idb://${dbName}/${tableName}`] = {\n queries: {\n query: {},\n count: {},\n },\n objs: new Map(),\n optimisticOps: [],\n unsignaledParts: {}\n };\n }\n tblCache.queries.query[req.query.index.name || ''] = container;\n }\n }\n subscribeToCacheEntry(cacheEntry, container!, requery, signal);\n return cacheEntry.promise.then((res: DBCoreQueryResponse) => {\n return {\n result: applyOptimisticOps(\n res.result,\n req,\n tblCache?.optimisticOps,\n downTable,\n cacheEntry!,\n freezeResults\n ) as any[], // readonly any[]\n };\n });\n },\n };\n return tableMW;\n },\n };\n return coreMW;\n },\n};\n\n\n","import { type Dexie } from \"../classes/dexie\";\nimport { type Table } from \"../classes/table\";\nimport { type Transaction } from \"../classes/transaction\";\n\nexport function vipify(\n target: T,\n vipDb: Dexie\n): T {\n return new Proxy(target, {\n get (target, prop, receiver) {\n // The \"db\" prop of the table or transaction is the only one we need to\n // override. The rest of the props can be accessed from the original\n // object.\n if (prop === 'db') return vipDb;\n return Reflect.get(target, prop, receiver);\n }\n });\n}\n","// Import types from the public API\nimport { Dexie as IDexie } from \"../../public/types/dexie\";\nimport { DexieOptions, DexieConstructor } from \"../../public/types/dexie-constructor\";\nimport { DbEvents } from \"../../public/types/db-events\";\n//import { PromiseExtended, PromiseExtendedConstructor } from '../../public/types/promise-extended';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from \"../../public/types/table-schema\";\nimport { DbSchema } from '../../public/types/db-schema';\n\n// Internal imports\nimport { Table, TableConstructor, createTableConstructor } from \"../table\";\nimport { Collection, CollectionConstructor, createCollectionConstructor } from '../collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { WhereClauseConstructor, createWhereClauseConstructor } from '../where-clause/where-clause-constructor';\nimport { Transaction } from '../transaction';\nimport { TransactionConstructor, createTransactionConstructor } from '../transaction/transaction-constructor';\nimport { Version } from \"../version/version\";\nimport { VersionConstructor, createVersionConstructor } from '../version/version-constructor';\n\n// Other imports...\nimport { DexieEventSet } from '../../public/types/dexie-event-set';\nimport { DexieExceptionClasses } from '../../public/types/errors';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\nimport Promise, { PSD, globalPSD } from '../../helpers/promise';\nimport { extend, override, keys, hasOwn } from '../../functions/utils';\nimport Events from '../../helpers/Events';\nimport { maxString, connections, READONLY, READWRITE } from '../../globals/constants';\nimport { getMaxKey } from '../../functions/quirks';\nimport { exceptions } from '../../errors';\nimport { lowerVersionFirst } from '../version/schema-helpers';\nimport { dexieOpen } from './dexie-open';\nimport { wrap } from '../../helpers/promise';\nimport { _onDatabaseDeleted } from '../../helpers/database-enumerator';\nimport { eventRejectHandler } from '../../functions/event-wrappers';\nimport { extractTransactionArgs, enterTransactionScope } from './transaction-helpers';\nimport { TransactionMode } from '../../public/types/transaction-mode';\nimport { rejection } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { DBCore } from '../../public/types/dbcore';\nimport { Middleware, DexieStacks } from '../../public/types/middleware';\nimport { virtualIndexMiddleware } from '../../dbcore/virtual-index-middleware';\nimport { hooksMiddleware } from '../../hooks/hooks-middleware';\nimport { IndexableType } from '../../public';\nimport { observabilityMiddleware } from '../../live-query/observability-middleware';\nimport { cacheExistingValuesMiddleware } from '../../dbcore/cache-existing-values-middleware';\nimport { cacheMiddleware } from \"../../live-query/cache/cache-middleware\";\nimport { vipify } from \"../../helpers/vipify\";\n\nexport interface DbReadyState {\n dbOpenError: any;\n isBeingOpened: boolean;\n onReadyBeingFired: undefined | Function[];\n openComplete: boolean;\n dbReadyResolve: () => void;\n dbReadyPromise: Promise;\n cancelOpen: (reason?: Error) => void;\n openCanceller: Promise & { _stackHolder?: Error };\n autoSchema: boolean;\n vcFired?: boolean;\n PR1398_maxLoop?: number;\n autoOpen?: boolean;\n}\n\nexport class Dexie implements IDexie {\n _options: DexieOptions;\n _state: DbReadyState;\n _versions: Version[];\n _storeNames: string[];\n _deps: DexieDOMDependencies;\n _allTables: { [name: string]: Table; };\n _createTransaction: (this: Dexie, mode: IDBTransactionMode, storeNames: ArrayLike, dbschema: { [tableName: string]: TableSchema; }, parentTransaction?: Transaction) => Transaction;\n _dbSchema: { [tableName: string]: TableSchema; };\n _hasGetAll?: boolean;\n _maxKey: IndexableType;\n _fireOnBlocked: (ev: Event) => void;\n _middlewares: {[StackName in keyof DexieStacks]?: Middleware[]} = {};\n _vip?: boolean;\n _novip: Dexie;// db._novip is to escape to orig db from db.vip.\n core: DBCore;\n\n name: string;\n verno: number = 0;\n idbdb: IDBDatabase | null;\n vip: Dexie;\n on: DbEvents;\n\n Table: TableConstructor;\n WhereClause: WhereClauseConstructor;\n Collection: CollectionConstructor;\n Version: VersionConstructor;\n Transaction: TransactionConstructor;\n static disableBfCache?: boolean;\n\n constructor(name: string, options?: DexieOptions) {\n const deps = (Dexie as any as DexieConstructor).dependencies;\n this._options = options = {\n // Default Options\n addons: (Dexie as any as DexieConstructor).addons, // Pick statically registered addons by default\n autoOpen: true, // Don't require db.open() explicitely.\n // Default DOM dependency implementations from static prop.\n indexedDB: deps.indexedDB, // Backend IndexedDB api. Default to browser env.\n IDBKeyRange: deps.IDBKeyRange, // Backend IDBKeyRange api. Default to browser env.\n cache: 'cloned', // Default to cloned for backward compatibility. For best performance and least memory consumption use 'immutable'.\n ...options\n }; \n this._deps = {\n indexedDB: options.indexedDB as IDBFactory,\n IDBKeyRange: options.IDBKeyRange as typeof IDBKeyRange\n };\n const {\n addons,\n } = options;\n this._dbSchema = {};\n this._versions = [];\n this._storeNames = [];\n this._allTables = {};\n this.idbdb = null;\n this._novip = this;\n const state: DbReadyState = {\n dbOpenError: null,\n isBeingOpened: false,\n onReadyBeingFired: null,\n openComplete: false,\n dbReadyResolve: nop,\n dbReadyPromise: null as Promise,\n cancelOpen: nop,\n openCanceller: null as Promise,\n autoSchema: true,\n PR1398_maxLoop: 3,\n autoOpen: options.autoOpen,\n };\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n this._state = state;\n this.name = name;\n this.on = Events(this, \"populate\", \"blocked\", \"versionchange\", \"close\", { ready: [promisableChain, nop] }) as DbEvents;\n this.on.ready.subscribe = override(this.on.ready.subscribe, subscribe => {\n return (subscriber, bSticky) => {\n (Dexie as any as DexieConstructor).vip(() => {\n const state = this._state;\n if (state.openComplete) {\n // Database already open. Call subscriber asap.\n if (!state.dbOpenError) Promise.resolve().then(subscriber);\n // bSticky: Also subscribe to future open sucesses (after close / reopen) \n if (bSticky) subscribe(subscriber);\n } else if (state.onReadyBeingFired) {\n // db.on('ready') subscribers are currently being executed and have not yet resolved or rejected\n state.onReadyBeingFired.push(subscriber);\n if (bSticky) subscribe(subscriber);\n } else {\n // Database not yet open. Subscribe to it.\n subscribe(subscriber);\n // If bSticky is falsy, make sure to unsubscribe subscriber when fired once.\n const db = this;\n if (!bSticky) subscribe(function unsubscribe() {\n db.on.ready.unsubscribe(subscriber);\n db.on.ready.unsubscribe(unsubscribe);\n });\n }\n });\n }\n });\n\n // Create derived classes bound to this instance of Dexie:\n this.Collection = createCollectionConstructor(this);\n this.Table = createTableConstructor(this);\n this.Transaction = createTransactionConstructor(this);\n this.Version = createVersionConstructor(this);\n this.WhereClause = createWhereClauseConstructor(this);\n\n // Default subscribers to \"versionchange\" and \"blocked\".\n // Can be overridden by custom handlers. If custom handlers return false, these default\n // behaviours will be prevented.\n this.on(\"versionchange\", ev => {\n // Default behavior for versionchange event is to close database connection.\n // Caller can override this behavior by doing db.on(\"versionchange\", function(){ return false; });\n // Let's not block the other window from making it's delete() or open() call.\n // NOTE! This event is never fired in IE,Edge or Safari.\n if (ev.newVersion > 0)\n console.warn(`Another connection wants to upgrade database '${this.name}'. Closing db now to resume the upgrade.`);\n else\n console.warn(`Another connection wants to delete database '${this.name}'. Closing db now to resume the delete request.`);\n this.close({disableAutoOpen: false});\n // In many web applications, it would be recommended to force window.reload()\n // when this event occurs. To do that, subscribe to the versionchange event\n // and call window.location.reload(true) if ev.newVersion > 0 (not a deletion)\n // The reason for this is that your current web app obviously has old schema code that needs\n // to be updated. Another window got a newer version of the app and needs to upgrade DB but\n // your window is blocking it unless we close it here.\n });\n this.on(\"blocked\", ev => {\n if (!ev.newVersion || ev.newVersion < ev.oldVersion)\n console.warn(`Dexie.delete('${this.name}') was blocked`);\n else\n console.warn(`Upgrade '${this.name}' blocked by other connection holding version ${ev.oldVersion / 10}`);\n });\n\n this._maxKey = getMaxKey(options.IDBKeyRange as typeof IDBKeyRange);\n\n this._createTransaction = (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n parentTransaction?: Transaction) => new this.Transaction(mode, storeNames, dbschema, this._options.chromeTransactionDurability, parentTransaction);\n\n this._fireOnBlocked = ev => {\n this.on(\"blocked\").fire(ev);\n // Workaround (not fully*) for missing \"versionchange\" event in IE,Edge and Safari:\n connections\n .filter(c => c.name === this.name && c !== this && !c._state.vcFired)\n .map(c => c.on(\"versionchange\").fire(ev));\n }\n\n // Default middlewares:\n this.use(cacheExistingValuesMiddleware);\n this.use(cacheMiddleware);\n this.use(observabilityMiddleware);\n this.use(virtualIndexMiddleware);\n this.use(hooksMiddleware);\n\n const vipDB = new Proxy(this, {\n get: (_, prop, receiver) => {\n if (prop === '_vip') return true;\n if (prop === 'table') return (tableName: string) => vipify(this.table(tableName), vipDB);\n const rv = Reflect.get(_, prop, receiver);\n if (rv instanceof Table) return vipify(rv, vipDB);\n if (prop === 'tables') return (rv as Table[]).map(t => vipify(t, vipDB));\n if (prop === '_createTransaction') return function() {\n const tx: Transaction = (rv as typeof this._createTransaction).apply(this, arguments);\n return vipify(tx, vipDB);\n }\n return rv;\n }\n });\n this.vip = vipDB;\n\n // Call each addon:\n addons.forEach(addon => addon(this));\n }\n\n version(versionNumber: number): Version {\n if (isNaN(versionNumber) || versionNumber < 0.1) throw new exceptions.Type(`Given version is not a positive number`);\n versionNumber = Math.round(versionNumber * 10) / 10;\n if (this.idbdb || this._state.isBeingOpened)\n throw new exceptions.Schema(\"Cannot add version when database is open\");\n this.verno = Math.max(this.verno, versionNumber);\n const versions = this._versions;\n var versionInstance = versions.filter(\n v => v._cfg.version === versionNumber)[0];\n if (versionInstance) return versionInstance;\n versionInstance = new this.Version(versionNumber);\n versions.push(versionInstance);\n versions.sort(lowerVersionFirst);\n versionInstance.stores({}); // Derive earlier schemas by default.\n // Disable autoschema mode, as at least one version is specified.\n this._state.autoSchema = false;\n return versionInstance;\n }\n\n _whenReady(fn: () => Promise): Promise {\n return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new Promise((resolve, reject) => {\n if (this._state.openComplete) {\n // idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return reject(new exceptions.DatabaseClosed(this._state.dbOpenError));\n }\n if (!this._state.isBeingOpened) {\n if (!this._state.autoOpen) {\n reject(new exceptions.DatabaseClosed());\n return;\n }\n this.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n this._state.dbReadyPromise.then(resolve, reject);\n }).then(fn);\n }\n\n use({stack, create, level, name}: Middleware): this {\n if (name) this.unuse({stack, name}); // Be able to replace existing middleware.\n const middlewares = this._middlewares[stack] || (this._middlewares[stack] = []);\n middlewares.push({stack, create, level: level == null ? 10 : level, name});\n middlewares.sort((a, b) => a.level - b.level);\n // Todo update db.core and db.tables...core ? Or should be expect this to have effect\n // only after next open()?\n return this;\n }\n\n unuse({stack, create}: Middleware<{stack: keyof DexieStacks}>): this;\n unuse({stack, name}: {stack: keyof DexieStacks, name: string}): this;\n unuse({stack, name, create}: {stack: keyof DexieStacks, name?: string, create?: Function}) {\n if (stack && this._middlewares[stack]) {\n this._middlewares[stack] = this._middlewares[stack].filter(mw =>\n create ? mw.create !== create : // Given middleware has a create method. Match that exactly.\n name ? mw.name !== name : // Given middleware spec \n false);\n }\n return this;\n }\n\n open() {\n return usePSD(\n globalPSD, // Enforce global scope here since db.open() can be part of a live query or transaction scope\n () => dexieOpen(this)\n );\n }\n\n _close(): void {\n const state = this._state;\n const idx = connections.indexOf(this);\n if (idx >= 0) connections.splice(idx, 1);\n if (this.idbdb) {\n try { this.idbdb.close(); } catch (e) { }\n this.idbdb = null;\n } \n // Reset dbReadyPromise promise:\n if (!state.isBeingOpened) {\n // Only if not being opened, reset these promises.\n // Otherwise, keep them so existing promise consumers will resolve when db\n // db is reopened later on, in case closing for purpose reopening, using {disableAutoOpen: false}.\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n }\n }\n\n close({disableAutoOpen} = {disableAutoOpen: true}): void {\n const state = this._state;\n if (disableAutoOpen) {\n if (state.isBeingOpened) {\n // cancel before the call to this._close() because this._close() will recreate dbReadyPromise and openCanceller.\n state.cancelOpen(new exceptions.DatabaseClosed());\n }\n this._close();\n state.autoOpen = false;\n state.dbOpenError = new exceptions.DatabaseClosed();\n } else {\n this._close();\n state.autoOpen = this._options.autoOpen ||\n state.isBeingOpened; // If an open call is ongoing, that same promise will resolve when db is reopend.\n state.openComplete = false;\n state.dbOpenError = null;\n }\n }\n\n delete(closeOptions = {disableAutoOpen: true}): Promise {\n // Prevent accidentially doing db.delete(1) when intention was to do db.[table].delete(1).\n const hasInvalidArguments = arguments.length > 0 && typeof arguments[0] !== 'object'; \n const state = this._state;\n return new Promise((resolve, reject) => {\n const doDelete = () => {\n this.close(closeOptions);\n var req = this._deps.indexedDB.deleteDatabase(this.name);\n req.onsuccess = wrap(() => {\n _onDatabaseDeleted(this._deps, this.name);\n resolve();\n });\n req.onerror = eventRejectHandler(reject);\n req.onblocked = this._fireOnBlocked;\n }\n // Prevent accidentially doing db.delete(1) when intention was to do db.[table].delete(1).\n if (hasInvalidArguments) throw new exceptions.InvalidArgument(\"Invalid closeOptions argument to db.delete()\");\n if (state.isBeingOpened) {\n state.dbReadyPromise.then(doDelete);\n } else {\n doDelete();\n }\n });\n }\n\n backendDB() {\n return this.idbdb;\n }\n\n isOpen() {\n return this.idbdb !== null;\n }\n\n hasBeenClosed() {\n const dbOpenError = this._state.dbOpenError;\n return dbOpenError && (dbOpenError.name === 'DatabaseClosed');\n }\n\n hasFailed() {\n return this._state.dbOpenError !== null;\n }\n\n dynamicallyOpened() {\n return this._state.autoSchema;\n }\n\n get tables () {\n return keys(this._allTables).map(name => this._allTables[name]);\n }\n\n transaction(): Promise {\n const args = extractTransactionArgs.apply(this, arguments);\n return this._transaction.apply(this, args);\n }\n\n _transaction(mode: TransactionMode, tables: Array, scopeFunc: Function) {\n let parentTransaction = PSD.trans as Transaction | undefined;\n // Check if parent transactions is bound to this db instance, and if caller wants to reuse it\n if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) parentTransaction = null;\n const onlyIfCompatible = mode.indexOf('?') !== -1;\n mode = mode.replace('!', '').replace('?', '') as TransactionMode; // Ok. Will change arguments[0] as well but we wont touch arguments henceforth.\n let idbMode: IDBTransactionMode,\n storeNames;\n\n try {\n //\n // Get storeNames from arguments. Either through given table instances, or through given table names.\n //\n storeNames = tables.map(table => {\n var storeName = table instanceof this.Table ? table.name : table;\n if (typeof storeName !== 'string') throw new TypeError(\"Invalid table argument to Dexie.transaction(). Only Table or String are allowed\");\n return storeName;\n });\n\n //\n // Resolve mode. Allow shortcuts \"r\" and \"rw\".\n //\n if (mode == \"r\" || mode === READONLY)\n idbMode = READONLY;\n else if (mode == \"rw\" || mode == READWRITE)\n idbMode = READWRITE;\n else\n throw new exceptions.InvalidArgument(\"Invalid transaction mode: \" + mode);\n\n if (parentTransaction) {\n // Basic checks\n if (parentTransaction.mode === READONLY && idbMode === READWRITE) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY\");\n }\n if (parentTransaction) {\n storeNames.forEach(storeName => {\n if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Table \" + storeName +\n \" not included in parent transaction.\");\n }\n });\n }\n if (onlyIfCompatible && parentTransaction && !parentTransaction.active) {\n // '?' mode should not keep using an inactive transaction.\n parentTransaction = null;\n }\n }\n } catch (e) {\n return parentTransaction ?\n parentTransaction._promise(null, (_, reject) => {reject(e);}) :\n rejection (e);\n }\n // If this is a sub-transaction, lock the parent and then launch the sub-transaction.\n const enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc);\n return (parentTransaction ?\n parentTransaction._promise(idbMode, enterTransaction, \"lock\") :\n PSD.trans ?\n // no parent transaction despite PSD.trans exists. Make sure also\n // that the zone we create is not a sub-zone of current, because\n // Promise.follow() should not wait for it if so.\n usePSD(PSD.transless, ()=>this._whenReady(enterTransaction)) :\n this._whenReady (enterTransaction));\n }\n\n table(tableName: string): Table;\n table(tableName: string): ITable;\n table(tableName: string): Table {\n if (!hasOwn(this._allTables, tableName)) {\n throw new exceptions.InvalidTable(`Table ${tableName} does not exist`); }\n return this._allTables[tableName];\n }\n}\n","import {\n Observable as IObservable,\n Observer,\n Subscription,\n} from \"../../public/types/observable\";\n\nconst symbolObservable: typeof Symbol.observable =\n typeof Symbol !== \"undefined\" && \"observable\" in Symbol\n ? Symbol.observable\n : \"@@observable\" as any;\n\nexport class Observable implements IObservable {\n private _subscribe: (observer: Observer) => Subscription;\n hasValue?: ()=>boolean;\n getValue?: ()=>T;\n\n constructor(subscribe: (observer: Observer) => Subscription) {\n this._subscribe = subscribe;\n }\n\n subscribe(\n onNext?: ((value: T) => void) | null,\n onError?: ((error: any) => void) | null,\n onComplete?: (() => void) | null\n ): Subscription;\n subscribe(observer?: Observer | null): Subscription;\n subscribe(x?: any, error?: any, complete?: any): Subscription {\n return this._subscribe(\n !x || typeof x === \"function\" ? { next: x, error, complete } : x\n );\n }\n\n [symbolObservable]() {\n return this;\n }\n}\n","import { _global } from '../../globals/global';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\n\nexport let domDeps: DexieDOMDependencies\n\ntry {\n domDeps = {\n // Required:\n indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB,\n IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange\n };\n} catch (e) {\n domDeps = { indexedDB: null, IDBKeyRange: null };\n}\n","import { _global, isAsyncFunction, keys, objectIsEmpty } from '../functions/utils';\nimport {\n globalEvents,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport {\n beginMicroTickScope,\n decrementExpectedAwaits,\n endMicroTickScope,\n execInGlobalContext,\n incrementExpectedAwaits,\n NativePromise,\n newScope,\n PSD,\n usePSD,\n} from '../helpers/promise';\nimport { ObservabilitySet } from '../public/types/db-events';\nimport {\n Observable as IObservable,\n Subscription,\n} from '../public/types/observable';\nimport { Observable } from '../classes/observable/observable';\nimport { extendObservabilitySet } from './extend-observability-set';\nimport { rangesOverlap } from '../helpers/rangeset';\nimport { domDeps } from '../classes/dexie/dexie-dom-dependencies';\nimport { Transaction } from '../classes/transaction';\nimport { obsSetsOverlap } from './obs-sets-overlap';\n\nexport interface LiveQueryContext {\n subscr: ObservabilitySet;\n signal: AbortSignal;\n requery: () => void;\n trans: null | Transaction;\n querier: Function; // For debugging purposes and Error messages\n}\n\nexport function liveQuery(querier: () => T | Promise): IObservable {\n let hasValue = false;\n let currentValue: T;\n const observable = new Observable((observer) => {\n const scopeFuncIsAsync = isAsyncFunction(querier);\n function execute(ctx: LiveQueryContext) {\n const wasRootExec = beginMicroTickScope(); // Performance: Avoid starting a new microtick scope within the async context.\n try {\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n let rv = newScope(querier, ctx);\n if (scopeFuncIsAsync) {\n // Make sure to set rv = rv.finally in order to wait to after decrementExpectedAwaits() has been called.\n // This fixes zone leaking issue that the liveQuery zone can leak to observer's next microtask.\n rv = (rv as Promise).finally(decrementExpectedAwaits);\n }\n return rv;\n } finally {\n wasRootExec && endMicroTickScope(); // Given that we created the microtick scope, we must also end it.\n }\n }\n\n let closed = false;\n let abortController: AbortController;\n\n let accumMuts: ObservabilitySet = {};\n let currentObs: ObservabilitySet = {};\n\n const subscription: Subscription = {\n get closed() {\n return closed;\n },\n unsubscribe: () => {\n if (closed) return;\n closed = true;\n if (abortController) abortController.abort();\n if (startedListening) globalEvents.storagemutated.unsubscribe(mutationListener);\n },\n };\n\n observer.start && observer.start(subscription); // https://github.com/tc39/proposal-observable\n\n let startedListening = false;\n\n const doQuery = () => execInGlobalContext(_doQuery);\n\n function shouldNotify() {\n return obsSetsOverlap(currentObs, accumMuts);\n }\n\n const mutationListener = (parts: ObservabilitySet) => {\n extendObservabilitySet(accumMuts, parts);\n if (shouldNotify()) {\n doQuery();\n }\n };\n\n const _doQuery = () => {\n if (\n closed || // closed - don't run!\n !domDeps.indexedDB) // SSR in sveltekit, nextjs etc\n {\n return;\n }\n accumMuts = {};\n const subscr: ObservabilitySet = {};\n // Abort signal fill three purposes:\n // 1. Abort the query if the observable is unsubscribed.\n // 2. Abort the query if a new query is made before the previous one has completed.\n // 3. For cached queries to know if they should remain in memory or could be enqued for being freed up.\n // (they will remain in memory for a short time and if noone needs them again, they will eventually be freed up)\n if (abortController) abortController.abort(); // Cancel previous query. Last query will be cancelled on unsubscribe().\n abortController = new AbortController();\n \n const ctx: LiveQueryContext = {\n subscr,\n signal: abortController.signal,\n requery: doQuery,\n querier,\n trans: null // Make the scope transactionless (don't reuse transaction from outer scope of the caller of subscribe())\n }\n const ret = execute(ctx);\n Promise.resolve(ret).then(\n (result) => {\n hasValue = true;\n currentValue = result;\n if (closed || ctx.signal.aborted) {\n // closed - no subscriber anymore.\n // signal.aborted - new query was made before this one completed and\n // the querier might have catched AbortError and return successful result.\n // If so, we should not rely in that result because we know we have aborted\n // this run, which means there's another run going on that will handle accumMuts\n // and we must not base currentObs on the half-baked subscr.\n return;\n }\n accumMuts = {};\n // Update what we are subscribing for based on this last run:\n currentObs = subscr;\n if (!objectIsEmpty(currentObs) && !startedListening) {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener);\n startedListening = true;\n }\n execInGlobalContext(()=>!closed && observer.next && observer.next(result));\n },\n (err) => {\n hasValue = false;\n if (!['DatabaseClosedError', 'AbortError'].includes(err?.name)) {\n if (!closed) execInGlobalContext(()=>{\n if (closed) return;\n observer.error && observer.error(err);\n });\n }\n }\n );\n };\n\n // Use setTimeot here to guarantee execution in a private macro task before and\n // after. The helper executeInGlobalContext(_doQuery) is not enough here because\n // caller of `subscribe()` could be anything, such as a frontend framework that will\n // continue in the same tick after subscribe() is called and call other\n // eftects, that could involve dexie operations such as writing to the DB.\n // If that happens, the private zone echoes from a live query tast started here\n // could still be ongoing when the other operations start and make them inherit\n // the async context from a live query.\n setTimeout(doQuery, 0);\n return subscription;\n });\n observable.hasValue = () => hasValue;\n observable.getValue = () => currentValue;\n return observable;\n}\n","import { Dexie as _Dexie } from './dexie';\nimport { _global } from '../../globals/global';\nimport { props, derive, extend, override, getByKeyPath, setByKeyPath, delByKeyPath, shallowClone, deepClone, asap } from '../../functions/utils';\nimport { getObjectDiff } from \"../../functions/get-object-diff\";\nimport { fullNameExceptions } from '../../errors';\nimport { DexieConstructor } from '../../public/types/dexie-constructor';\nimport { getDatabaseNames } from '../../helpers/database-enumerator';\nimport { PSD } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { newScope } from '../../helpers/promise';\nimport { rejection } from '../../helpers/promise';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { dexieStackFrameFilter, minKey, connections, DEXIE_VERSION } from '../../globals/constants';\nimport Events from '../../helpers/Events';\nimport { exceptions } from '../../errors';\nimport { errnames } from '../../errors';\nimport { getMaxKey } from '../../functions/quirks';\nimport { vip } from './vip';\nimport { globalEvents } from '../../globals/global-events';\nimport { liveQuery } from '../../live-query/live-query';\nimport { extendObservabilitySet } from '../../live-query/extend-observability-set';\nimport { domDeps } from './dexie-dom-dependencies';\nimport { cmp } from '../../functions/cmp';\nimport { cache } from '../../live-query/cache/cache';\n\n/* (Dexie) is an instance of DexieConstructor, as defined in public/types/dexie-constructor.d.ts\n* (new Dexie()) is an instance of Dexie, as defined in public/types/dexie.d.ts\n* \n* Why we're doing this?\n\n* Because we've choosen to define the public Dexie API using a DexieConstructor interface\n* rather than declaring a class. On that interface, all static props are defined.\n* In practice, class Dexie's constructor implements DexieConstructor and all member props\n* are defined in interface Dexie. We could say, it's a typescript limitation of not being\n* able to define a static interface that forces us to do the cast below.\n*/\nconst Dexie = _Dexie as any as DexieConstructor;\n\n//\n// Set all static methods and properties onto Dexie:\n// \nprops(Dexie, {\n\n // Dexie.BulkError = class BulkError {...};\n // Dexie.XXXError = class XXXError {...};\n ...fullNameExceptions,\n\n //\n // Static delete() method.\n //\n delete(databaseName: string) {\n const db = new Dexie(databaseName, {addons: []});\n return db.delete();\n },\n\n //\n // Static exists() method.\n //\n exists(name: string) {\n return new Dexie(name, { addons: [] }).open().then(db => {\n db.close();\n return true;\n }).catch('NoSuchDatabaseError', () => false);\n },\n\n //\n // Static method for retrieving a list of all existing databases at current host.\n //\n getDatabaseNames(cb) {\n try {\n return getDatabaseNames(Dexie.dependencies).then(cb);\n } catch {\n return rejection(new exceptions.MissingAPI());\n }\n },\n\n /** @deprecated */\n defineClass() {\n function Class(content) {\n extend(this, content);\n }\n return Class;\n },\n\n ignoreTransaction(scopeFunc) {\n // In case caller is within a transaction but needs to create a separate transaction.\n // Example of usage:\n //\n // Let's say we have a logger function in our app. Other application-logic should be unaware of the\n // logger function and not need to include the 'logentries' table in all transaction it performs.\n // The logging should always be done in a separate transaction and not be dependant on the current\n // running transaction context. Then you could use Dexie.ignoreTransaction() to run code that starts a new transaction.\n //\n // Dexie.ignoreTransaction(function() {\n // db.logentries.add(newLogEntry);\n // });\n //\n // Unless using Dexie.ignoreTransaction(), the above example would try to reuse the current transaction\n // in current Promise-scope.\n //\n // An alternative to Dexie.ignoreTransaction() would be setImmediate() or setTimeout(). The reason we still provide an\n // API for this because\n // 1) The intention of writing the statement could be unclear if using setImmediate() or setTimeout().\n // 2) setTimeout() would wait unnescessary until firing. This is however not the case with setImmediate().\n // 3) setImmediate() is not supported in the ES standard.\n // 4) You might want to keep other PSD state that was set in a parent PSD, such as PSD.letThrough.\n return PSD.trans ?\n usePSD(PSD.transless, scopeFunc) : // Use the closest parent that was non-transactional.\n scopeFunc(); // No need to change scope because there is no ongoing transaction.\n },\n\n vip,\n\n async: function (generatorFn: Function) {\n return function () {\n try {\n var rv = awaitIterator(generatorFn.apply(this, arguments));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n };\n },\n\n spawn: function (generatorFn, args, thiz) {\n try {\n var rv = awaitIterator(generatorFn.apply(thiz, args || []));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n },\n\n // Dexie.currentTransaction property\n currentTransaction: {\n get: () => PSD.trans || null\n },\n\n waitFor: function (promiseOrFunction, optionalTimeout) {\n // If a function is provided, invoke it and pass the returning value to Transaction.waitFor()\n const promise = Promise.resolve(\n typeof promiseOrFunction === 'function' ?\n Dexie.ignoreTransaction(promiseOrFunction) :\n promiseOrFunction)\n .timeout(optionalTimeout || 60000); // Default the timeout to one minute. Caller may specify Infinity if required. \n\n // Run given promise on current transaction. If no current transaction, just return a Dexie promise based\n // on given value.\n return PSD.trans ?\n PSD.trans.waitFor(promise) :\n promise;\n },\n\n // Export our Promise implementation since it can be handy as a standalone Promise implementation\n Promise: Promise,\n\n // Dexie.debug proptery:\n // Dexie.debug = false\n // Dexie.debug = true\n // Dexie.debug = \"dexie\" - don't hide dexie's stack frames.\n debug: {\n get: () => Debug.debug,\n set: value => {\n Debug.setDebug(value, value === 'dexie' ? () => true : dexieStackFrameFilter);\n }\n },\n\n // Export our derive/extend/override methodology\n derive: derive, // Deprecate?\n extend: extend, // Deprecate?\n props: props,\n override: override, // Deprecate?\n // Export our Events() function - can be handy as a toolkit\n Events: Events,\n on: globalEvents,\n liveQuery,\n extendObservabilitySet,\n // Utilities\n getByKeyPath: getByKeyPath,\n setByKeyPath: setByKeyPath,\n delByKeyPath: delByKeyPath,\n shallowClone: shallowClone,\n deepClone: deepClone,\n getObjectDiff: getObjectDiff,\n cmp,\n asap: asap,\n //maxKey: new Dexie('',{addons:[]})._maxKey,\n minKey: minKey,\n // Addon registry\n addons: [],\n // Global DB connection list\n connections: connections,\n\n //MultiModifyError: exceptions.Modify, // Obsolete!\n errnames: errnames,\n\n // Export other static classes\n //IndexSpec: IndexSpec, Obsolete!\n //TableSchema: TableSchema, Obsolete!\n\n //\n // Dependencies\n //\n // These will automatically work in browsers with indexedDB support, or where an indexedDB polyfill has been included.\n //\n // In node.js, however, these properties must be set \"manually\" before instansiating a new Dexie().\n // For node.js, you need to require indexeddb-js or similar and then set these deps.\n //\n dependencies: domDeps,\n cache,\n\n // API Version Number: Type Number, make sure to always set a version number that can be comparable correctly. Example: 0.9, 0.91, 0.92, 1.0, 1.01, 1.1, 1.2, 1.21, etc.\n semVer: DEXIE_VERSION,\n version: DEXIE_VERSION.split('.')\n .map(n => parseInt(n))\n .reduce((p, c, i) => p + (c / Math.pow(10, i * 2))),\n\n // https://github.com/dfahlander/Dexie.js/issues/186\n // typescript compiler tsc in mode ts-->es5 & commonJS, will expect require() to return\n // x.default. Workaround: Set Dexie.default = Dexie.\n // default: Dexie, // Commented because solved in index-umd.ts instead.\n // Make it possible to import {Dexie} (non-default import)\n // Reason 1: May switch to that in future.\n // Reason 2: We declare it both default and named exported in d.ts to make it possible\n // to let addons extend the Dexie interface with Typescript 2.1 (works only when explicitely\n // exporting the symbol, not just default exporting)\n // Dexie: Dexie // Commented because solved in index-umd.ts instead.\n});\n\nDexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange);\n","import { globalEvents, DEXIE_STORAGE_MUTATED_EVENT_NAME, STORAGE_MUTATED_DOM_EVENT_NAME } from '../globals/global-events';\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport { signalSubscribersNow } from './cache/signalSubscribers';\n\nif (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, updatedParts => {\n if (!propagatingLocally) {\n let event: CustomEvent;\n event = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, {\n detail: updatedParts\n });\n propagatingLocally = true;\n dispatchEvent(event);\n propagatingLocally = false;\n }\n });\n addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, ({detail}: CustomEvent) => {\n if (!propagatingLocally) {\n propagateLocally(detail);\n }\n });\n}\n\n/** Called from listeners to BroadcastChannel and DOM event to\n * propagate the event locally into dexie's storagemutated event\n * and invalidate cached queries.\n * \n * This function is only called when the event is not originating\n * from this same Dexie module - either from another redundant dexie import\n * or from a foreign tab or worker. That's why we need to invalidate\n * the cache when this happens.\n */\nexport function propagateLocally(updateParts: ObservabilitySet) {\n let wasMe = propagatingLocally;\n try {\n propagatingLocally = true;\n // Fire the \"storagemutated\" event.\n globalEvents.storagemutated.fire(updateParts);\n // Invalidate cached queries and signal subscribers to requery.\n signalSubscribersNow(updateParts, true);\n } finally {\n propagatingLocally = wasMe;\n }\n}\n\nexport let propagatingLocally = false;\n","import {\n globalEvents,\n STORAGE_MUTATED_DOM_EVENT_NAME,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport { propagateLocally, propagatingLocally } from './propagate-locally';\n\nexport let bc: BroadcastChannel;\n\nexport let createBC = ()=>{};\n\nif (typeof BroadcastChannel !== 'undefined') {\n createBC = () => {\n bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME);\n bc.onmessage = ev => ev.data && propagateLocally(ev.data);\n }\n createBC();\n\n /**\n * The Node.js BroadcastChannel will prevent the node process from exiting\n * if the BroadcastChannel is not closed.\n * Therefore we have to call unref() which allows the process to finish\n * properly even when the BroadcastChannel is never closed.\n * @link https://nodejs.org/api/worker_threads.html#broadcastchannelunref\n * @link https://github.com/dexie/Dexie.js/pull/1576\n */\n if (typeof (bc as any).unref === 'function') {\n (bc as any).unref();\n }\n \n //\n // Propagate local changes to remote tabs, windows and workers via BroadcastChannel\n //\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, (changedParts) => {\n if (!propagatingLocally) {\n bc.postMessage(changedParts);\n }\n });\n}\n","import { Dexie } from \"./classes/dexie\";\nimport { connections } from \"./globals/constants\";\nimport { debug } from \"./helpers/debug\";\nimport { RangeSet } from \"./helpers/rangeset\";\nimport { bc, createBC } from \"./live-query/enable-broadcast\";\nimport { propagateLocally } from \"./live-query/propagate-locally\";\n\n\nif (typeof addEventListener !== 'undefined') {\n addEventListener('pagehide', (event) => {\n if (!Dexie.disableBfCache && event.persisted) {\n if (debug) console.debug('Dexie: handling persisted pagehide');\n bc?.close();\n for (const db of connections) {\n db.close({disableAutoOpen: false});\n }\n }\n });\n addEventListener('pageshow', (event) => {\n if (!Dexie.disableBfCache && event.persisted) {\n if (debug) console.debug('Dexie: handling persisted pageshow');\n createBC();\n propagateLocally({all: new RangeSet(-Infinity, [[]])}); // Trigger all queries to requery\n }\n });\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function add(value: number | BigInt | Array) {\n return new PropModification({add: value});\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function remove(value: number | BigInt | Array) {\n return new PropModification({remove: value});\n}\n","import { PropModification } from \"../../helpers/prop-modification\";\n\nexport function replacePrefix(a: string, b:string) {\n return new PropModification({replacePrefix: [a, b]});\n}\n","import { Dexie } from './classes/dexie';\nimport { DexieConstructor } from './public/types/dexie-constructor';\nimport { DexiePromise } from './helpers/promise';\nimport { mapError } from './errors';\nimport * as Debug from './helpers/debug';\nimport { dexieStackFrameFilter } from './globals/constants';\n\n// Generate all static properties such as Dexie.maxKey etc\n// (implement interface DexieConstructor):\nimport './classes/dexie/dexie-static-props';\nimport './live-query/enable-broadcast';\nimport './support-bfcache';\nimport { liveQuery } from './live-query/live-query';\nimport { Entity } from './classes/entity/Entity';\nimport { cmp } from './functions/cmp';\nimport { PropModification, PropModSymbol } from './helpers/prop-modification';\nimport { replacePrefix, add, remove } from './functions/propmods';\n\n\n// Set rejectionMapper of DexiePromise so that it generally tries to map\n// DOMErrors and DOMExceptions to a DexieError instance with same name but with\n// async stack support and with a prototypal inheritance from DexieError and Error.\n// of Map DOMErrors and DOMExceptions to corresponding Dexie errors.\nDexiePromise.rejectionMapper = mapError;\n\n// Let the async stack filter focus on app code and filter away frames from dexie.min.js:\nDebug.setDebug(Debug.debug, dexieStackFrameFilter);\n\nexport { RangeSet, mergeRanges, rangesOverlap } from \"./helpers/rangeset\";\nexport { Dexie, liveQuery }; // Comply with public/index.d.ts.\nexport { Entity };\nexport { cmp };\nexport { PropModSymbol, PropModification, replacePrefix, add, remove };\nexport default Dexie;\n"],"names":["asap","Promise","Dexie","safari14Workaround","_Dexie","Debug.debug","Debug.setDebug"],"mappings":"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"} \ No newline at end of file diff --git a/src/dexie/import-wrapper-prod.d.mts b/src/dexie/import-wrapper-prod.d.mts deleted file mode 100644 index e6ab49a88..000000000 --- a/src/dexie/import-wrapper-prod.d.mts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/dexie.js'; -export { default } from './dist/dexie.js'; diff --git a/src/dexie/import-wrapper-prod.mjs b/src/dexie/import-wrapper-prod.mjs deleted file mode 100644 index a6556c91a..000000000 --- a/src/dexie/import-wrapper-prod.mjs +++ /dev/null @@ -1,15 +0,0 @@ -// Making the module version consumable via require - to prohibit -// multiple occurrancies of the same module in the same app -// (dual package hazard, https://nodejs.org/api/packages.html#dual-package-hazard) -import _Dexie from "./dist/dexie.min.js"; -const DexieSymbol = Symbol.for("Dexie"); -const Dexie = globalThis[DexieSymbol] || (globalThis[DexieSymbol] = _Dexie); -if (_Dexie.semVer !== Dexie.semVer) { - throw new Error(`Two different versions of Dexie loaded in the same app: ${_Dexie.semVer} and ${Dexie.semVer}`); -} -const { - liveQuery, mergeRanges, rangesOverlap, RangeSet, cmp, Entity, - PropModSymbol, PropModification, replacePrefix, add, remove } = Dexie; -export { liveQuery, mergeRanges, rangesOverlap, RangeSet, cmp, Dexie, Entity, - PropModSymbol, PropModification, replacePrefix, add, remove }; -export default Dexie; diff --git a/src/dexie/import-wrapper.d.mts b/src/dexie/import-wrapper.d.mts deleted file mode 100644 index e6ab49a88..000000000 --- a/src/dexie/import-wrapper.d.mts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/dexie.js'; -export { default } from './dist/dexie.js'; diff --git a/src/dexie/import-wrapper.mjs b/src/dexie/import-wrapper.mjs deleted file mode 100644 index c70c6b72a..000000000 --- a/src/dexie/import-wrapper.mjs +++ /dev/null @@ -1,14 +0,0 @@ -// Making the module version consumable via require - to prohibit -// multiple occurrancies of the same module in the same app -// (dual package hazard, https://nodejs.org/api/packages.html#dual-package-hazard) -import _Dexie from "./dist/dexie.js"; -const DexieSymbol = Symbol.for("Dexie"); -const Dexie = globalThis[DexieSymbol] || (globalThis[DexieSymbol] = _Dexie); -if (_Dexie.semVer !== Dexie.semVer) { - throw new Error(`Two different versions of Dexie loaded in the same app: ${_Dexie.semVer} and ${Dexie.semVer}`); -} -const { liveQuery, mergeRanges, rangesOverlap, RangeSet, cmp, Entity, - PropModSymbol, PropModification, replacePrefix, add, remove } = Dexie; -export { liveQuery, mergeRanges, rangesOverlap, RangeSet, cmp, Dexie, Entity, - PropModSymbol, PropModification, replacePrefix, add, remove }; -export default Dexie; diff --git a/src/dexie/package.json b/src/dexie/package.json deleted file mode 100644 index 16d81e844..000000000 --- a/src/dexie/package.json +++ /dev/null @@ -1,145 +0,0 @@ -{ - "name": "dexie", - "version": "4.0.7", - "description": "A Minimalistic Wrapper for IndexedDB", - "main": "dist/dexie.js", - "module": "dist/dexie.mjs", - "jsnext:main": "dist/dexie.mjs", - "exports": { - ".": { - "production": { - "module": "./import-wrapper-prod.mjs", - "import": "./import-wrapper-prod.mjs", - "require": "./dist/dexie.min.js", - "default": "./dist/dexie.min.js" - }, - "development": { - "module": "./import-wrapper.mjs", - "import": "./import-wrapper.mjs", - "require": "./dist/dexie.js", - "default": "./dist/dexie.js" - }, - "default": { - "module": "./import-wrapper.mjs", - "import": "./import-wrapper.mjs", - "require": "./dist/dexie.js", - "default": "./dist/dexie.js" - } - }, - "./package.json": "./package.json", - "./dist/dexie.mjs": "./dist/dexie.mjs" - }, - "typings": "dist/dexie.d.ts", - "jspm": { - "format": "cjs", - "ignore": [ - "src/" - ] - }, - "repository": { - "type": "git", - "url": "https://github.com/dexie/Dexie.js.git" - }, - "keywords": [ - "indexeddb", - "browser", - "database" - ], - "author": "David Fahlander ", - "contributors": [ - "Christopher Hunt ", - "Nikolas Poniros ", - "Anders Ekdahl ", - "Yury Solovyov ", - "Martin Diphoorn " - ], - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/dexie/Dexie.js/issues" - }, - "just-build": { - "default": [ - "# Build all targets (es5, es6 and test) and minify the default es5 UMD module", - "just-build release test" - ], - "dexie": [ - "# Build dist/dexie.js, dist/dexie.mjs and dist/dexie.d.ts", - "cd src", - "tsc [--watch 'Watching for file changes']", - "tsc --target es2020 --outdir ../tools/tmp/modern/src/", - "rollup -c ../tools/build-configs/rollup.config.js", - "rollup -c ../tools/build-configs/rollup.umd.config.js", - "rollup -c ../tools/build-configs/rollup.modern.config.js", - "node ../tools/replaceVersionAndDate.js ../dist/dexie.js", - "node ../tools/replaceVersionAndDate.js ../dist/dexie.mjs", - "node ../tools/replaceVersionAndDate.js ../dist/modern/dexie.mjs", - "dts-bundle-generator --inline-declare-global --inline-declare-externals -o ../dist/dexie.d.ts public/index.d.ts", - "node ../tools/prepend.js ../dist/dexie.d.ts ../tools/build-configs/banner.txt", - "node ../tools/replaceVersionAndDate.js ../dist/dexie.d.ts" - ], - "release": [ - "# Build ES5 umd module as well as the es6 module.", - "just-build dexie", - "node tools/replaceVersionAndDate.js dist/dexie.d.ts", - "# Minify the default ES5 UMD module", - "cd dist", - "uglifyjs dexie.js -m -c negate_iife=0 -o dexie.min.js --source-map url=dexie.min.js.map", - "# Minify modern bundle", - "cd modern", - "terser --comments false --compress --mangle --module --source-map url=dexie.min.mjs.map -o dexie.min.mjs -- dexie.mjs" - ], - "dev": [ - "# Build ES5 module and the tests", - "just-build dexie test" - ], - "gzip": [ - "# Optionally gzip to find the size of the minified & gzipped version", - "gzip dist/dexie.min.js -k -f -9" - ], - "test": [ - "# Build the test suite.", - "cd test", - "tsc [--watch 'Watching for file changes']", - "rollup -c ../tools/build-configs/rollup.tests.config.js" - ] - }, - "homepage": "https://dexie.org", - "devDependencies": { - "@lambdatest/node-tunnel": "^4.0.7", - "cross-env": "^7.0.3", - "dts-bundle-generator": "^5.9.0", - "just-build": "^0.9.24", - "karma": "^6.1.1", - "karma-chrome-launcher": "^3.1.0", - "karma-firefox-launcher": "^2.1.0", - "karma-mocha-reporter": "^2.2.5", - "karma-qunit": "^4.1.1", - "karma-webdriver-launcher": "^1.0.8", - "qunit": "^2.10.0", - "qunitjs": "^1.23.1", - "rollup": "^2.40.0", - "rollup-plugin-cleanup": "^3.2.1", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-sourcemaps": "^0.6.3", - "rxjs": "^6.6.6", - "safari-14-idb-fix": "^3.0.0", - "serve-static": "^1.14.1", - "sorted-json": "^0.2.6", - "terser": "^5.3.1", - "tslib": "^2.1.0", - "typescript": "^5.3.3", - "uglify-js": "^3.9.2" - }, - "scripts": { - "build": "just-build", - "watch": "just-build --watch", - "clean": "rm -rf tools/tmp && rm dist/*.js && rm dist/*.map && rm dist/*.ts && rm dist/*.mjs", - "test": "pnpm run build && pnpm run test:typings && pnpm run test:unit", - "test:unit": "karma start test/karma.conf.js --single-run", - "test:typings": "tsc -p test/typings-test/", - "test:debug": "karma start test/karma.conf.js --log-level debug", - "test:ltcloud": "cross-env LAMBDATEST=true pnpm run test:ltTunnel & sleep 10 && pnpm run test:unit; UNIT_STATUS=$?; kill $(cat tunnel.pid); exit $UNIT_STATUS", - "test:ltTunnel": "node test/lt-local" - } -} \ No newline at end of file diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 0bd217c5f..43c1647f5 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -4,4 +4,4 @@ import { environment as oaprProd } from './suport/oapr' import { DevDev } from './suport/dev' -export const environment: Environment = oaprProd; +export const environment: Environment = DevDev; diff --git a/src/main.ts b/src/main.ts index 047624410..69ba70b53 100644 --- a/src/main.ts +++ b/src/main.ts @@ -60,51 +60,3 @@ platformBrowserDynamic().bootstrapModule(AppModule) // Call the element loader after the platform has been bootstrapped defineCustomElements(window); - -console.log(environment.version.lastCommitTime) - -// error-capture.js - -// Function to capture error details -function captureError(message, sourceURL, lineno, colno, error) { - const errorDetails = { - message: message || 'Unknown error', - sourceURL: sourceURL || 'Unknown source', - lineNumber: lineno || 'Unknown line', - columnNumber: colno || 'Unknown column', - stack: error ? error.stack : 'No stack trace' - }; - - // Log to console - console.error('Error Details:', JSON.stringify(errorDetails, null, 2)); - - // Optionally, send to server or write to a local storage - // Example: Sending to server (requires server-side handling) - // fetch('/log-error', { - // method: 'POST', - // headers: { - // 'Content-Type': 'application/json' - // }, - // body: JSON.stringify(errorDetails) - // }); - - // Example: Storing in localStorage - // localStorage.setItem('errorLog', JSON.stringify(errorDetails)); -} - -// Capture errors from synchronous code -window.onerror = function(message, sourceURL, lineno, colno, error) { - captureError(message, sourceURL, lineno, colno, error); - // Return true to prevent default handling (optional) - return true; -}; - -// Capture errors from promise rejections -window.addEventListener('unhandledrejection', function(event) { - const { reason } = event; - captureError(reason.message || 'Unhandled rejection', 'Unknown source', 'Unknown line', 'Unknown column', reason); -}); -window.onerror = function(message, source, lineno, colno, error) { - if (error) message = error.stack; - console.log('send', 'event', 'window.onerror', message, navigator.userAgent); -} \ No newline at end of file diff --git a/src/shared-worker.js b/src/shared-worker.js new file mode 100644 index 000000000..30b386d7d --- /dev/null +++ b/src/shared-worker.js @@ -0,0 +1,23 @@ +// src/shared-worker.js +self.onconnect = function (event) { + const port = event.ports[0]; + + port.onmessage = function (e) { + const message = e.data; + console.log('Received from client:', message); + + // Echo the message back to all connected clients + port.postMessage('Echo: ' + message); + } + + + // Optional: broadcast messages to all connected clients + function broadcast(message) { + self.clients.forEach(client => { + client.postMessage(message); + }); + } + + // Example of broadcasting a message + broadcast('Shared Worker connected'); +} diff --git a/src/style/ios.scss b/src/style/ios.scss index c147f33e5..fa5db3edb 100644 --- a/src/style/ios.scss +++ b/src/style/ios.scss @@ -229,3 +229,18 @@ ion-toolbar { .header-fix { padding-top: var(--ion-safe-area-top); } + +.edit-message::part(content) { + width: 600px !important; + height: auto !important; + // left: unset !important; + // right: unset !important; + // top: unset !important; +} + +/* Media query for mobile view */ +@media (max-width: 768px) { /* Adjust the max-width as per your mobile breakpoints */ + .edit-message::part(content) { + width: 300px !important; /* Set width to 300px for mobile screens */ + } +} diff --git a/src/theme/variables.scss b/src/theme/variables.scss index 0d14da602..d5d5c8aa3 100644 --- a/src/theme/variables.scss +++ b/src/theme/variables.scss @@ -399,6 +399,22 @@ $app-theme: mat-light-theme( opacity: 1; } +.modal-aside::part(content), .modal-aside .modal-wrapper { + position: absolute; + right: 0px; + height: 90%; + max-width: 100%; + border-radius: 0 0 25px 25px; + -webkit-border-radius: 0 0 25px 25px; + -moz-border-radius: 0 0 25px 25px; + -ms-border-radius: 0 0 25px 25px; + -o-border-radius: 0 0 25px 25px; + max-width: 400px; + width: 100%; + opacity: 1; + top: 0px; +} + .exp-options .popover-content { width: 100% !important; left: 0 !important; diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 000000000..0468b695d --- /dev/null +++ b/typedoc.json @@ -0,0 +1,11 @@ +{ + // Comments are supported, like tsconfig.json + "entryPoints": [ + "./src/app/utils/*.ts", + "./src/app/infra/camera/*.ts", + "./src/app/infra/**/*.ts", + "./src/app/module/**/*.ts", + //"./src/app/infra/repository/dexie/dexie-repository.service.ts", + ] , + "out": "doc/TypeDoc", +} diff --git a/version/git-version.ts b/version/git-version.ts index 5d31e3fc2..a102b0e4a 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "2963fa752", - "SHA": "2963fa752fe45c9729c56eaf91f6856f60537445", + "shortSHA": "e6fa43524", + "SHA": "e6fa43524e595b9ce0893be92741228a5d8d013d", "branch": "feature/agenda-api-peter", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Thu Sep 12 19:40:57 2024 +0100'", - "lastCommitMessage": "start documenting version", - "lastCommitNumber": "5904", - "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 4 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/module/agenda/data/repository/agenda-data-repository.service.ts\n\tmodified: src/app/pages/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/services/permission.service.ts\n\tmodified: src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts\n\tmodified: src/app/shared/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/shared/agenda/new-event/new-event.page.html\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts", + "lastCommitTime": "'Fri Sep 13 09:31:55 2024 +0100'", + "lastCommitMessage": "fix update", + "lastCommitNumber": "5905", + "changeStatus": "On branch feature/agenda-api-peter\nYour branch is up to date with 'origin/feature/agenda-api-peter'.\n\nAll conflicts fixed but you are still merging.\n (use \"git commit\" to conclude merge)\n\nChanges to be committed:\n\tmodified: .gitignore\n\tmodified: angular.json\n\tnew file: doc/TypeDoc/.nojekyll\n\tnew file: doc/TypeDoc/assets/highlight.css\n\tnew file: doc/TypeDoc/assets/icons.js\n\tnew file: doc/TypeDoc/assets/icons.svg\n\tnew file: doc/TypeDoc/assets/main.js\n\tnew file: doc/TypeDoc/assets/navigation.js\n\tnew file: doc/TypeDoc/assets/search.js\n\tnew file: doc/TypeDoc/assets/style.css\n\tnew file: doc/TypeDoc/index.html\n\tmodified: gabinete-digital-fo.code-workspace\n\tdeleted: jest-puppeteer.config.js\n\tmodified: package-lock.json\n\tmodified: package.json\n\tdeleted: src/app/animations/animations.ts\n\tmodified: src/app/app-routing.module.ts\n\tmodified: src/app/app.component.ts\n\tmodified: src/app/app.module.ts\n\tdeleted: src/app/config/auth-constants.ts\n\tdeleted: src/app/controller/chat.ts\n\tmodified: src/app/controller/event.ts\n\tnew file: src/app/core/chat/entity/distribution.ts\n\tnew file: src/app/core/chat/entity/group.ts\n\tnew file: src/app/core/chat/entity/member.ts\n\tnew file: src/app/core/chat/entity/message.ts\n\tnew file: src/app/core/chat/mapper/getRoomByIdMapper.ts\n\tnew file: src/app/core/chat/mapper/getRoomListMapper.ts\n\tnew file: src/app/core/chat/repository/attachment/attachment-local-repository.ts\n\tnew file: src/app/core/chat/repository/attachment/attachment-remote-repository.ts\n\tnew file: src/app/core/chat/repository/bold/bold-local-repository.ts\n\tnew file: src/app/core/chat/repository/distribution/distribution-local-repository.ts\n\tnew file: src/app/core/chat/repository/dto/messageOutputDTO.ts\n\tnew file: src/app/core/chat/repository/member/member-local-repository.ts\n\tnew file: src/app/core/chat/repository/member/member-remote-repository.ts\n\tnew file: src/app/core/chat/repository/message/message-local-repository.ts\n\tnew file: src/app/core/chat/repository/message/message-remote-repository.ts\n\tnew file: src/app/core/chat/repository/message/message-socket-repository.ts\n\tnew file: src/app/core/chat/repository/message/socket-repositoty-parameter.ts\n\tnew file: src/app/core/chat/repository/room/room-local-repository.ts\n\tnew file: src/app/core/chat/repository/room/room-remote-repository.ts\n\tnew file: src/app/core/chat/repository/room/room-socket-repository.ts\n\tnew file: src/app/core/chat/repository/typing/typing-local-repository.ts\n\tnew file: src/app/core/chat/repository/typing/typing-remote-repository.ts\n\tnew file: src/app/core/chat/repository/user-photo/user-photo-local-repository.ts\n\tnew file: src/app/core/chat/repository/user-photo/user-photo-remote-repository.ts\n\tnew file: src/app/core/chat/usecase/message/http-listen-to-message-load-history-by-roomId-use-case.ts\n\tnew file: src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts\n\tnew file: src/app/core/chat/usecase/socket/socket-on-reconnect-use-case.ts\n\tmodified: src/app/home/home-routing.module.ts\n\tmodified: src/app/home/home.page.html\n\tmodified: src/app/home/home.page.ts\n\trenamed: src/app/services/chat/nf.service.spec.ts -> src/app/infra/camera/camera.service.spec.ts\n\tmodified: src/app/infra/camera/camera.service.ts\n\tnew file: src/app/infra/database/dexie/instance/chat/schema/attachment.ts\n\tnew file: src/app/infra/database/dexie/instance/chat/schema/bold.ts\n\tnew file: src/app/infra/database/dexie/instance/chat/schema/destribution.ts\n\tnew file: src/app/infra/database/dexie/instance/chat/schema/members.ts\n\tnew file: src/app/infra/database/dexie/instance/chat/schema/message.ts\n\tnew file: src/app/infra/database/dexie/instance/chat/schema/room.ts\n\tnew file: src/app/infra/database/dexie/instance/chat/schema/typing.ts\n\tnew file: src/app/infra/database/dexie/instance/chat/schema/user-foto.ts\n\tnew file: src/app/infra/database/dexie/service.ts\n\trenamed: src/app/shared/chat/add-user/add-user.page.scss -> src/app/infra/file-picker/adapter.ts\n\tnew file: src/app/infra/file-picker/file-picker.service.ts\n\tnew file: src/app/infra/file-picker/mobile/file-picker-mobile.service.ts\n\tnew file: src/app/infra/file-picker/web/file-picker-web.service.ts\n\tnew file: src/app/infra/file-system/mobile/file-system-mobile.service.ts\n\tnew file: src/app/infra/http/adapter.ts\n\tnew file: src/app/infra/http/http.module.ts\n\tnew file: src/app/infra/http/http.service.ts\n\tnew file: src/app/infra/http/type.ts\n\tnew file: src/app/infra/repository/adapter.ts\n\tnew file: src/app/infra/repository/dexie/dexie-repository.service.ts\n\tnew file: src/app/infra/repository/index.ts\n\tnew file: src/app/infra/repository/types.ts\n\trenamed: src/app/shared/popover/chat-debugging/chat-debugging.page.scss -> src/app/infra/repository/util.ts\n\tnew file: src/app/infra/socket/adapter.ts\n\tnew file: src/app/infra/socket/signalR/signal-r.service.ts\n\tnew file: src/app/infra/socket/signalR/signalR.ts\n\tnew file: src/app/infra/socket/signalR/simple.html\n\tnew file: src/app/infra/socket/signalR/socket.ts\n\tnew file: src/app/infra/socket/type.ts\n\tnew file: src/app/infra/speaker/speaker.service.ts\n\tnew file: src/app/infra/speaker/type.ts\n\tmodified: src/app/interceptors/chatToken.interceptor.ts\n\tmodified: src/app/modals/chat-options-features/chat-options-features.page.ts\n\tmodified: src/app/modals/profile/edit-profile/edit-profile.page.ts\n\tdeleted: src/app/modals/set-room-owner/set-room-owner.page.ts\n\tdeleted: src/app/models/beast-orm-function.ts\n\tdeleted: src/app/models/beast-orm.ts\n\tdeleted: src/app/models/chatMethod.ts\n\tdeleted: src/app/models/search-document.spec.ts\n\tnew file: src/app/module/chat/1tsconfig.json\n\tnew file: src/app/module/chat/chat.module.ts\n\tnew file: src/app/module/chat/data/async/list/rooms/distributionListChangedetector.ts\n\tnew file: src/app/module/chat/data/async/list/rooms/messageListChangedetector.ts\n\tnew file: src/app/module/chat/data/async/list/rooms/roomByIdChangeDetector.ts\n\tnew file: src/app/module/chat/data/async/list/rooms/roomListChangeDetector.ts\n\tnew file: src/app/module/chat/data/async/list/rooms/roomMembersChangeDetector.ts\n\tnew file: src/app/module/chat/data/repository/attachment/attachment-local-repository.service.ts\n\tnew file: src/app/module/chat/data/repository/attachment/attachment-remote-repository.service.ts\n\tnew file: src/app/module/chat/data/repository/bold/bold-local-repository.ts\n\tnew file: src/app/module/chat/data/repository/destribution/destribution-local-repository.ts\n\tnew file: src/app/module/chat/data/repository/member/member-list-local-repository.service.ts\n\tnew file: src/app/module/chat/data/repository/member/member-list-remote-repository.service.ts\n\tnew file: src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts\n\tnew file: src/app/module/chat/data/repository/message/message-local-data-source.service.ts\n\tnew file: src/app/module/chat/data/repository/message/message-remote-data-source.service.ts\n\tnew file: src/app/module/chat/data/repository/room/room-local-repository.service.ts\n\tnew file: src/app/module/chat/data/repository/room/room-remote-repository.service.ts\n\tnew file: src/app/module/chat/data/repository/room/room-socket-repository.service.ts\n\tnew file: src/app/module/chat/data/repository/typing/user-typing-live-data-source.service.ts\n\tnew file: src/app/module/chat/data/repository/typing/user-typing-local-data-source.service.ts\n\tnew file: src/app/module/chat/data/repository/user-foto/user-photo-local-repository.service.ts\n\tnew file: src/app/module/chat/data/repository/user-foto/user-photo-remote-repository.service.ts\n\tnew file: src/app/module/chat/domain/adapter.ts\n\tnew file: src/app/module/chat/domain/chat-service.service.ts\n\tnew file: src/app/module/chat/domain/mapper/memberLIstMapper.ts\n\tnew file: src/app/module/chat/domain/mapper/messageMapper.ts\n\trenamed: src/app/services/chat/message.service.spec.ts -> src/app/module/chat/domain/service/distribution.service.spec.ts\n\tnew file: src/app/module/chat/domain/service/distribution.service.ts\n\trenamed: src/app/services/webnotifications.service.spec.ts -> src/app/module/chat/domain/service/room-last-message.service.spec.ts\n\tnew file: src/app/module/chat/domain/service/room-last-message.service.ts\n\trenamed: src/app/services/chat/room.service.spec.ts -> src/app/module/chat/domain/service/room.service.spec.ts\n\tnew file: src/app/module/chat/domain/service/room.service.ts\n\tnew file: src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service.spec.ts\n\tnew file: src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service.ts\n\tnew file: src/app/module/chat/domain/use-case/member/-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/member/member-add-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/member/member-admin-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/member/member-list-http-sync-use-case.ts.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/listen-message-by-roomId.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/listen-message-update-by-roomId.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/listen-send-message.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/listene-message-delete-by-roomId.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/message-attachment-by-message-id.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/message-create-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/message-download-attachment-user-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/message-get-attachment-localy-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/message-mark-all-message-as-read-by-room-id.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/message-mark-as-read-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/message-reaction-by-id-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/message-update-by-id-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/messages-send-offline-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/message/sync-all-room-messages.service.ts\n\tnew file: src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/room/room-create-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/room/room-delete-by-id-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/room/room-get-list-on-create-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/room/room-get-list-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/room/room-leave-by-id-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/room/room-set-last-message.service.ts\n\tnew file: src/app/module/chat/domain/use-case/room/room-update-by-id-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/socket-connect-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/socket-join-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/socket/member-list-update-status-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/socket/socket-message-create-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/typing/typing-send-use-case.service.ts\n\tnew file: src/app/module/chat/domain/use-case/user-photo/user-photo-get-by-id-use-case.service.ts\n\trenamed: src/app/shared/popover/chat-message-debugging/chat-message-debugging.page.scss -> src/app/module/chat/type.ts\n\tdeleted: src/app/pages/chat/chat-routing.module.ts\n\tdeleted: src/app/pages/chat/chat.page.html\n\tdeleted: src/app/pages/chat/chat.page.ts\n\tdeleted: src/app/pages/chat/group-messages/group-messages.page.html\n\tdeleted: src/app/pages/chat/messages/contacts/contacts.page.ts\n\tdeleted: src/app/pages/chat/messages/messages.page.html\n\tdeleted: src/app/pages/chat/messages/messages.page.ts\n\tmodified: src/app/pages/events/events.page.html\n\tmodified: src/app/pages/events/events.page.ts\n\tmodified: src/app/pages/gabinete-digital/expediente/expediente-detail/expediente-detail.page.ts\n\tmodified: src/app/pages/gabinete-digital/pedidos/pedido/pedido.page.ts\n\tmodified: src/app/pages/login/login.page.ts\n\tmodified: src/app/pages/publications/new-publication/new-publication.page.ts\n\tdeleted: src/app/pipes/safe.pipe.spec.ts\n\tdeleted: src/app/pipes/safehtml.pipe.spec.ts\n\tmodified: src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts\n\tnew file: src/app/services/Repositorys/type.ts\n\tmodified: src/app/services/alert.service.ts\n\tmodified: src/app/services/auth.service.ts\n\tdeleted: src/app/services/cache-service.service.spec.ts\n\tdeleted: src/app/services/chat.service.ts\n\tdeleted: src/app/services/chat/change-message-queue.service.spec.ts\n\tdeleted: src/app/services/chat/chat-methods.service.spec.ts\n\tdeleted: src/app/services/chat/chat-methods.service.ts\n\tdeleted: src/app/services/chat/chat-system.service.ts\n\tdeleted: src/app/services/chat/message.service.ts\n\tdeleted: src/app/services/chat/nf.service.ts\n\tdeleted: src/app/services/chat/rochet-chat-connector.service.spec.ts\n\tdeleted: src/app/services/chat/rochet-chat-connector.service.ts\n\tdeleted: src/app/services/chat/room.service.ts\n\tdeleted: src/app/services/chat/viewed-message.service.spec.ts\n\tdeleted: src/app/services/chat/viewed-message.service.ts\n\tnew file: src/app/services/decorators/api-validate-schema.decorator.ts\n\tnew file: src/app/services/decorators/captureAndReraiseAsync.ts\n\tnew file: src/app/services/decorators/socket-validate-schema.decorator.ts\n\tnew file: src/app/services/decorators/validate-schema.decorator.ts\n\tdeleted: src/app/services/directives/input-filter.directive.spec.ts\n\tdeleted: src/app/services/directives/visibility.directive.spec.ts\n\tdeleted: src/app/services/directives/visibility1.directive.spec.ts\n\trenamed: src/app/services/chat/chat-system.service.spec.ts -> src/app/services/domain/chat/chat-service.service.spec.ts\n\trenamed: src/app/services/chat/change-message-queue.service.ts -> src/app/services/domain/chat/chat-service.service.ts\n\tmodified: src/app/services/functions/file.service.ts\n\tmodified: src/app/services/functions/time.service.ts\n\tmodified: src/app/services/http-error-handle.service.ts\n\tnew file: src/app/services/http/adapter.ts\n\tdeleted: src/app/services/http/http-service.service.spec.ts\n\tnew file: src/app/services/logger/colored/date.ts\n\tmodified: src/app/services/logger/colored/service.ts\n\tnew file: src/app/services/logger/main/service.ts\n\tmodified: src/app/services/monitoring/opentelemetry/logging.ts\n\tmodified: src/app/services/monitoring/opentelemetry/matrix.ts\n\tmodified: src/app/services/monitoring/opentelemetry/opentelemetry.ts\n\tmodified: src/app/services/monitoring/opentelemetry/tracer.ts\n\tmodified: src/app/services/monitoring/socket/socket.ts\n\tmodified: src/app/services/notifications.service.ts\n\tmodified: src/app/services/processes.service.ts\n\tdeleted: src/app/services/webnotifications.service.ts\n\tnew file: src/app/services/zod.ts\n\tmodified: src/app/shared/agenda/view-event/view-event.module.ts\n\tmodified: src/app/shared/agenda/view-event/view-event.page.ts\n\tdeleted: src/app/shared/chat/add-user/add-user.page.html\n\tdeleted: src/app/shared/chat/add-user/add-user.page.ts\n\tdeleted: src/app/shared/chat/group-messages/group-contacts/group-contacts.page.ts\n\tdeleted: src/app/shared/chat/group-messages/group-messages.page.html\n\tdeleted: src/app/shared/chat/messages/contacts/contacts.page.ts\n\tdeleted: src/app/shared/chat/messages/messages.page.html\n\tdeleted: src/app/shared/chat/messages/messages.page.ts\n\tdeleted: src/app/shared/chat/new-group/contacts/contacts.page.ts\n\tdeleted: src/app/shared/popover/chat-popover/chat-popover.page.html\n\tdeleted: src/app/shared/popover/chat-popover/chat-popover.page.ts\n\tdeleted: src/app/shared/popover/deploma-options/deploma-options.page.spec.ts\n\tmodified: src/app/shared/popover/opts-expediente/opts-expediente.page.ts\n\tmodified: src/app/shared/popover/request-options/request-options.page.ts\n\tdeleted: src/app/store/chat/chat-message.service.spec.ts\n\tdeleted: src/app/store/chat/chat-message.service.ts\n\tdeleted: src/app/store/chat/chat-user.service.spec.ts\n\tdeleted: src/app/store/chat/chat-user.service.ts\n\tmodified: src/app/store/documentManagement.ts\n\tdeleted: src/app/store/publication-event-folder.service.spec.ts\n\tdeleted: src/app/store/session.service.spec.ts\n\tnew file: src/app/ui/chat/chat-routing.module.ts\n\trenamed: src/app/pages/chat/chat.module.ts -> src/app/ui/chat/chat.module.ts\n\tnew file: src/app/ui/chat/chat.page.html\n\trenamed: src/app/pages/chat/chat.page.scss -> src/app/ui/chat/chat.page.scss\n\trenamed: src/app/pages/chat/chat.page.spec.ts -> src/app/ui/chat/chat.page.spec.ts\n\tnew file: src/app/ui/chat/chat.page.ts\n\trenamed: src/app/pages/chat/messages/contacts/contacts-routing.module.ts -> src/app/ui/chat/component/contacts/contacts-routing.module.ts\n\trenamed: src/app/shared/chat/new-group/contacts/contacts.module.ts -> src/app/ui/chat/component/contacts/contacts.module.ts\n\trenamed: src/app/shared/chat/new-group/contacts/contacts.page.html -> src/app/ui/chat/component/contacts/contacts.page.html\n\trenamed: src/app/shared/chat/new-group/contacts/contacts.page.scss -> src/app/ui/chat/component/contacts/contacts.page.scss\n\trenamed: src/app/pages/chat/messages/contacts/contacts.page.spec.ts -> src/app/ui/chat/component/contacts/contacts.page.spec.ts\n\tnew file: src/app/ui/chat/component/contacts/contacts.page.ts\n\trenamed: src/app/pages/chat/edit-group/edit-group-routing.module.ts -> src/app/ui/chat/component/edit-group/edit-group-routing.module.ts\n\trenamed: src/app/shared/chat/edit-group/edit-group.module.ts -> src/app/ui/chat/component/edit-group/edit-group.module.ts\n\trenamed: src/app/shared/chat/edit-group/edit-group.page.html -> src/app/ui/chat/component/edit-group/edit-group.page.html\n\trenamed: src/app/shared/chat/edit-group/edit-group.page.scss -> src/app/ui/chat/component/edit-group/edit-group.page.scss\n\trenamed: src/app/shared/chat/edit-group/edit-group.page.spec.ts -> src/app/ui/chat/component/edit-group/edit-group.page.spec.ts\n\trenamed: src/app/shared/chat/edit-group/edit-group.page.ts -> src/app/ui/chat/component/edit-group/edit-group.page.ts\n\trenamed: src/app/shared/chat/empty-chat/empty-chat-routing.module.ts -> src/app/ui/chat/component/empty-chat/empty-chat-routing.module.ts\n\trenamed: src/app/shared/chat/empty-chat/empty-chat.module.ts -> src/app/ui/chat/component/empty-chat/empty-chat.module.ts\n\trenamed: src/app/shared/chat/empty-chat/empty-chat.page.html -> src/app/ui/chat/component/empty-chat/empty-chat.page.html\n\trenamed: src/app/shared/chat/empty-chat/empty-chat.page.scss -> src/app/ui/chat/component/empty-chat/empty-chat.page.scss\n\trenamed: src/app/shared/chat/empty-chat/empty-chat.page.spec.ts -> src/app/ui/chat/component/empty-chat/empty-chat.page.spec.ts\n\trenamed: src/app/shared/chat/empty-chat/empty-chat.page.ts -> src/app/ui/chat/component/empty-chat/empty-chat.page.ts\n\trenamed: src/app/pages/chat/group-messages/group-contacts/group-contacts-routing.module.ts -> src/app/ui/chat/component/group-messages/group-contacts/group-contacts-routing.module.ts\n\trenamed: src/app/shared/chat/group-messages/group-contacts/group-contacts.module.ts -> src/app/ui/chat/component/group-messages/group-contacts/group-contacts.module.ts\n\trenamed: src/app/shared/chat/group-messages/group-contacts/group-contacts.page.html -> src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.html\n\trenamed: src/app/shared/chat/group-messages/group-contacts/group-contacts.page.scss -> src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.scss\n\trenamed: src/app/pages/chat/group-messages/group-contacts/group-contacts.page.spec.ts -> src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.spec.ts\n\tnew file: src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.ts\n\trenamed: src/app/pages/chat/group-messages/group-messages-routing.module.ts -> src/app/ui/chat/component/group-messages/group-messages-routing.module.ts\n\trenamed: src/app/shared/chat/group-messages/group-messages.module.ts -> src/app/ui/chat/component/group-messages/group-messages.module.ts\n\tnew file: src/app/ui/chat/component/group-messages/group-messages.page.html\n\trenamed: src/app/shared/chat/group-messages/group-messages.page.scss -> src/app/ui/chat/component/group-messages/group-messages.page.scss\n\trenamed: src/app/pages/chat/group-messages/group-messages.page.spec.ts -> src/app/ui/chat/component/group-messages/group-messages.page.spec.ts\n\trenamed: src/app/shared/chat/group-messages/group-messages.page.ts -> src/app/ui/chat/component/group-messages/group-messages.page.ts\n\trenamed: src/app/pages/chat/new-group/contacts/contacts-routing.module.ts -> src/app/ui/chat/component/messages/contacts/contacts-routing.module.ts\n\trenamed: src/app/shared/chat/messages/contacts/contacts.module.ts -> src/app/ui/chat/component/messages/contacts/contacts.module.ts\n\trenamed: src/app/shared/chat/messages/contacts/contacts.page.html -> src/app/ui/chat/component/messages/contacts/contacts.page.html\n\trenamed: src/app/shared/chat/messages/contacts/contacts.page.scss -> src/app/ui/chat/component/messages/contacts/contacts.page.scss\n\trenamed: src/app/pages/chat/new-group/contacts/contacts.page.spec.ts -> src/app/ui/chat/component/messages/contacts/contacts.page.spec.ts\n\tnew file: src/app/ui/chat/component/messages/contacts/contacts.page.ts\n\trenamed: src/app/pages/chat/messages/messages-routing.module.ts -> src/app/ui/chat/component/messages/messages-routing.module.ts\n\trenamed: src/app/shared/chat/messages/messages.module.ts -> src/app/ui/chat/component/messages/messages.module.ts\n\tnew file: src/app/ui/chat/component/messages/messages.page.html\n\trenamed: src/app/shared/chat/messages/messages.page.scss -> src/app/ui/chat/component/messages/messages.page.scss\n\trenamed: src/app/pages/chat/messages/messages.page.spec.ts -> src/app/ui/chat/component/messages/messages.page.spec.ts\n\tnew file: src/app/ui/chat/component/messages/messages.page.ts\n\trenamed: src/app/shared/chat/new-group/new-group-routing.module.ts -> src/app/ui/chat/component/new-group/new-group-routing.module.ts\n\trenamed: src/app/shared/chat/new-group/new-group.module.ts -> src/app/ui/chat/component/new-group/new-group.module.ts\n\trenamed: src/app/shared/chat/new-group/new-group.page.html -> src/app/ui/chat/component/new-group/new-group.page.html\n\trenamed: src/app/shared/chat/new-group/new-group.page.scss -> src/app/ui/chat/component/new-group/new-group.page.scss\n\trenamed: src/app/pages/chat/new-group/new-group.page.spec.ts -> src/app/ui/chat/component/new-group/new-group.page.spec.ts\n\trenamed: src/app/shared/chat/new-group/new-group.page.ts -> src/app/ui/chat/component/new-group/new-group.page.ts\n\trenamed: src/app/shared/popover/chat-debugging/chat-debugging-routing.module.ts -> src/app/ui/chat/modal/chat-debugging/chat-debugging-routing.module.ts\n\trenamed: src/app/shared/popover/chat-debugging/chat-debugging.module.ts -> src/app/ui/chat/modal/chat-debugging/chat-debugging.module.ts\n\trenamed: src/app/shared/popover/chat-debugging/chat-debugging.page.html -> src/app/ui/chat/modal/chat-debugging/chat-debugging.page.html\n\tnew file: src/app/ui/chat/modal/chat-debugging/chat-debugging.page.scss\n\trenamed: src/app/shared/popover/chat-debugging/chat-debugging.page.spec.ts -> src/app/ui/chat/modal/chat-debugging/chat-debugging.page.spec.ts\n\trenamed: src/app/shared/popover/chat-debugging/chat-debugging.page.ts -> src/app/ui/chat/modal/chat-debugging/chat-debugging.page.ts\n\trenamed: src/app/shared/popover/chat-message-debugging/chat-message-debugging-routing.module.ts -> src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging-routing.module.ts\n\trenamed: src/app/shared/popover/chat-message-debugging/chat-message-debugging.module.ts -> src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.module.ts\n\trenamed: src/app/shared/popover/chat-message-debugging/chat-message-debugging.page.html -> src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.page.html\n\tnew file: src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.page.scss\n\trenamed: src/app/shared/popover/chat-message-debugging/chat-message-debugging.page.spec.ts -> src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.page.spec.ts\n\trenamed: src/app/shared/popover/chat-message-debugging/chat-message-debugging.page.ts -> src/app/ui/chat/modal/chat-message-debugging/chat-message-debugging.page.ts\n\trenamed: src/app/shared/popover/chat-options-popover/chat-options-popover-routing.module.ts -> src/app/ui/chat/modal/chat-options-popover/chat-options-popover-routing.module.ts\n\trenamed: src/app/shared/popover/chat-options-popover/chat-options-popover.module.ts -> src/app/ui/chat/modal/chat-options-popover/chat-options-popover.module.ts\n\trenamed: src/app/shared/popover/chat-options-popover/chat-options-popover.page.html -> src/app/ui/chat/modal/chat-options-popover/chat-options-popover.page.html\n\trenamed: src/app/shared/popover/chat-options-popover/chat-options-popover.page.scss -> src/app/ui/chat/modal/chat-options-popover/chat-options-popover.page.scss\n\trenamed: src/app/shared/popover/chat-options-popover/chat-options-popover.page.spec.ts -> src/app/ui/chat/modal/chat-options-popover/chat-options-popover.page.spec.ts\n\trenamed: src/app/shared/popover/chat-options-popover/chat-options-popover.page.ts -> src/app/ui/chat/modal/chat-options-popover/chat-options-popover.page.ts\n\trenamed: src/app/shared/popover/chat-popover/chat-popover-routing.module.ts -> src/app/ui/chat/modal/chat-popover/chat-popover-routing.module.ts\n\trenamed: src/app/shared/popover/chat-popover/chat-popover.module.ts -> src/app/ui/chat/modal/chat-popover/chat-popover.module.ts\n\tnew file: src/app/ui/chat/modal/chat-popover/chat-popover.page.html\n\trenamed: src/app/shared/popover/chat-popover/chat-popover.page.scss -> src/app/ui/chat/modal/chat-popover/chat-popover.page.scss\n\trenamed: src/app/shared/popover/chat-popover/chat-popover.page.spec.ts -> src/app/ui/chat/modal/chat-popover/chat-popover.page.spec.ts\n\tnew file: src/app/ui/chat/modal/chat-popover/chat-popover.page.ts\n\trenamed: src/app/shared/chat/edit-group/edit-group-routing.module.ts -> src/app/ui/chat/modal/edit-group/edit-group-routing.module.ts\n\trenamed: src/app/pages/chat/edit-group/edit-group.module.ts -> src/app/ui/chat/modal/edit-group/edit-group.module.ts\n\trenamed: src/app/pages/chat/edit-group/edit-group.page.html -> src/app/ui/chat/modal/edit-group/edit-group.page.html\n\trenamed: src/app/pages/chat/edit-group/edit-group.page.scss -> src/app/ui/chat/modal/edit-group/edit-group.page.scss\n\trenamed: src/app/pages/chat/edit-group/edit-group.page.spec.ts -> src/app/ui/chat/modal/edit-group/edit-group.page.spec.ts\n\trenamed: src/app/pages/chat/edit-group/edit-group.page.ts -> src/app/ui/chat/modal/edit-group/edit-group.page.ts\n\tnew file: src/app/ui/chat/modal/edit-message/edit-message-routing.module.ts\n\tnew file: src/app/ui/chat/modal/edit-message/edit-message.module.ts\n\tnew file: src/app/ui/chat/modal/edit-message/edit-message.page.html\n\tnew file: src/app/ui/chat/modal/edit-message/edit-message.page.scss\n\tnew file: src/app/ui/chat/modal/edit-message/edit-message.page.spec.ts\n\tnew file: src/app/ui/chat/modal/edit-message/edit-message.page.ts\n\tnew file: src/app/ui/chat/modal/group-duration/group-duration-routing.module.ts\n\tnew file: src/app/ui/chat/modal/group-duration/group-duration.module.ts\n\tnew file: src/app/ui/chat/modal/group-duration/group-duration.page.html\n\tnew file: src/app/ui/chat/modal/group-duration/group-duration.page.scss\n\tnew file: src/app/ui/chat/modal/group-duration/group-duration.page.spec.ts\n\tnew file: src/app/ui/chat/modal/group-duration/group-duration.page.ts\n\trenamed: src/app/shared/chat/group-messages/group-contacts/group-contacts-routing.module.ts -> src/app/ui/chat/modal/group-messages/group-contacts/group-contacts-routing.module.ts\n\trenamed: src/app/pages/chat/group-messages/group-contacts/group-contacts.module.ts -> src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.module.ts\n\trenamed: src/app/pages/chat/group-messages/group-contacts/group-contacts.page.html -> src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.page.html\n\trenamed: src/app/pages/chat/group-messages/group-contacts/group-contacts.page.scss -> src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.page.scss\n\trenamed: src/app/shared/chat/group-messages/group-contacts/group-contacts.page.spec.ts -> src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.page.spec.ts\n\trenamed: src/app/pages/chat/group-messages/group-contacts/group-contacts.page.ts -> src/app/ui/chat/modal/group-messages/group-contacts/group-contacts.page.ts\n\trenamed: src/app/shared/chat/group-messages/group-messages-routing.module.ts -> src/app/ui/chat/modal/group-messages/group-messages-routing.module.ts\n\trenamed: src/app/pages/chat/group-messages/group-messages.module.ts -> src/app/ui/chat/modal/group-messages/group-messages.module.ts\n\tnew file: src/app/ui/chat/modal/group-messages/group-messages.page.html\n\trenamed: src/app/pages/chat/group-messages/group-messages.page.scss -> src/app/ui/chat/modal/group-messages/group-messages.page.scss\n\trenamed: src/app/shared/chat/group-messages/group-messages.page.spec.ts -> src/app/ui/chat/modal/group-messages/group-messages.page.spec.ts\n\trenamed: src/app/pages/chat/group-messages/group-messages.page.ts -> src/app/ui/chat/modal/group-messages/group-messages.page.ts\n\trenamed: src/app/shared/popover/messages-options/messages-options-routing.module.ts -> src/app/ui/chat/modal/messages-options/messages-options-routing.module.ts\n\trenamed: src/app/shared/popover/messages-options/messages-options.module.ts -> src/app/ui/chat/modal/messages-options/messages-options.module.ts\n\trenamed: src/app/shared/popover/messages-options/messages-options.page.html -> src/app/ui/chat/modal/messages-options/messages-options.page.html\n\trenamed: src/app/shared/popover/messages-options/messages-options.page.scss -> src/app/ui/chat/modal/messages-options/messages-options.page.scss\n\trenamed: src/app/shared/popover/messages-options/messages-options.page.spec.ts -> src/app/ui/chat/modal/messages-options/messages-options.page.spec.ts\n\trenamed: src/app/shared/popover/messages-options/messages-options.page.ts -> src/app/ui/chat/modal/messages-options/messages-options.page.ts\n\trenamed: src/app/shared/chat/messages/contacts/contacts-routing.module.ts -> src/app/ui/chat/modal/messages/contacts/contacts-routing.module.ts\n\trenamed: src/app/pages/chat/messages/contacts/contacts.module.ts -> src/app/ui/chat/modal/messages/contacts/contacts.module.ts\n\trenamed: src/app/pages/chat/messages/contacts/contacts.page.html -> src/app/ui/chat/modal/messages/contacts/contacts.page.html\n\trenamed: src/app/pages/chat/messages/contacts/contacts.page.scss -> src/app/ui/chat/modal/messages/contacts/contacts.page.scss\n\trenamed: src/app/shared/chat/messages/contacts/contacts.page.spec.ts -> src/app/ui/chat/modal/messages/contacts/contacts.page.spec.ts\n\tnew file: src/app/ui/chat/modal/messages/contacts/contacts.page.ts\n\trenamed: src/app/shared/chat/messages/messages-routing.module.ts -> src/app/ui/chat/modal/messages/messages-routing.module.ts\n\trenamed: src/app/pages/chat/messages/messages.module.ts -> src/app/ui/chat/modal/messages/messages.module.ts\n\tnew file: src/app/ui/chat/modal/messages/messages.page.html\n\trenamed: src/app/pages/chat/messages/messages.page.scss -> src/app/ui/chat/modal/messages/messages.page.scss\n\trenamed: src/app/shared/chat/messages/messages.page.spec.ts -> src/app/ui/chat/modal/messages/messages.page.spec.ts\n\tnew file: src/app/ui/chat/modal/messages/messages.page.ts\n\trenamed: src/app/shared/chat/new-group/contacts/contacts-routing.module.ts -> src/app/ui/chat/modal/new-group/contacts/contacts-routing.module.ts\n\trenamed: src/app/pages/chat/new-group/contacts/contacts.module.ts -> src/app/ui/chat/modal/new-group/contacts/contacts.module.ts\n\trenamed: src/app/pages/chat/new-group/contacts/contacts.page.html -> src/app/ui/chat/modal/new-group/contacts/contacts.page.html\n\trenamed: src/app/pages/chat/new-group/contacts/contacts.page.scss -> src/app/ui/chat/modal/new-group/contacts/contacts.page.scss\n\trenamed: src/app/shared/chat/new-group/contacts/contacts.page.spec.ts -> src/app/ui/chat/modal/new-group/contacts/contacts.page.spec.ts\n\trenamed: src/app/pages/chat/new-group/contacts/contacts.page.ts -> src/app/ui/chat/modal/new-group/contacts/contacts.page.ts\n\trenamed: src/app/pages/chat/new-group/new-group-routing.module.ts -> src/app/ui/chat/modal/new-group/new-group-routing.module.ts\n\trenamed: src/app/pages/chat/new-group/new-group.module.ts -> src/app/ui/chat/modal/new-group/new-group.module.ts\n\trenamed: src/app/pages/chat/new-group/new-group.page.html -> src/app/ui/chat/modal/new-group/new-group.page.html\n\trenamed: src/app/pages/chat/new-group/new-group.page.scss -> src/app/ui/chat/modal/new-group/new-group.page.scss\n\trenamed: src/app/shared/chat/new-group/new-group.page.spec.ts -> src/app/ui/chat/modal/new-group/new-group.page.spec.ts\n\trenamed: src/app/pages/chat/new-group/new-group.page.ts -> src/app/ui/chat/modal/new-group/new-group.page.ts\n\trenamed: src/app/shared/chat/add-user/add-user-routing.module.ts -> src/app/ui/chat/modal/room-info/room-info-routing.module.ts\n\trenamed: src/app/shared/chat/add-user/add-user.module.ts -> src/app/ui/chat/modal/room-info/room-info.module.ts\n\tnew file: src/app/ui/chat/modal/room-info/room-info.page.html\n\tnew file: src/app/ui/chat/modal/room-info/room-info.page.scss\n\trenamed: src/app/shared/chat/add-user/add-user.page.spec.ts -> src/app/ui/chat/modal/room-info/room-info.page.spec.ts\n\tnew file: src/app/ui/chat/modal/room-info/room-info.page.ts\n\trenamed: src/app/modals/set-room-owner/set-room-owner-routing.module.ts -> src/app/ui/chat/modal/set-room-owner/set-room-owner-routing.module.ts\n\trenamed: src/app/modals/set-room-owner/set-room-owner.module.ts -> src/app/ui/chat/modal/set-room-owner/set-room-owner.module.ts\n\trenamed: src/app/modals/set-room-owner/set-room-owner.page.html -> src/app/ui/chat/modal/set-room-owner/set-room-owner.page.html\n\trenamed: src/app/modals/set-room-owner/set-room-owner.page.scss -> src/app/ui/chat/modal/set-room-owner/set-room-owner.page.scss\n\trenamed: src/app/modals/set-room-owner/set-room-owner.page.spec.ts -> src/app/ui/chat/modal/set-room-owner/set-room-owner.page.spec.ts\n\tnew file: src/app/ui/chat/modal/set-room-owner/set-room-owner.page.ts\n\tnew file: src/app/ui/chat/modal/view-onces/view-onces-routing.module.ts\n\tnew file: src/app/ui/chat/modal/view-onces/view-onces.module.ts\n\tnew file: src/app/ui/chat/modal/view-onces/view-onces.page.html\n\tnew file: src/app/ui/chat/modal/view-onces/view-onces.page.scss\n\tnew file: src/app/ui/chat/modal/view-onces/view-onces.page.spec.ts\n\tnew file: src/app/ui/chat/modal/view-onces/view-onces.page.ts\n\tnew file: src/app/ui/chat/requirements.readme.md\n\tnew file: src/app/ui/chat/store/model/message.ts\n\tnew file: src/app/ui/chat/store/model/room.ts\n\tnew file: src/app/ui/chat/store/roomStore.ts\n\tnew file: src/app/ui/chat/utils/lastMessage.ts\n\tnew file: src/app/ui/chat/utils/messageBallon.ts\n\tnew file: src/app/ui/shared/utils/whatappdate.ts\n\tnew file: src/app/utils/ToBase64.ts\n\tnew file: src/app/utils/allowedDocExtension.ts\n\tnew file: src/app/utils/date.ts\n\tnew file: src/app/utils/document-mimetype.ts\n\tnew file: src/app/utils/entity.ts\n\tnew file: src/app/utils/imageCompressore.ts\n\tnew file: src/app/utils/sentryErrorInterface.ts\n\tnew file: src/app/utils/stackTrace.ts\n\tnew file: src/app/utils/task-scheduler.ts\n\tnew file: src/app/utils/use-case-interface.ts\n\tnew file: src/app/utils/zod.ts\n\tnew file: src/app/utils/zodValidation.ts\n\tdeleted: src/assets/dexie/CODE_OF_CONDUCT.md\n\tdeleted: src/assets/dexie/CONTRIBUTING.md\n\tdeleted: src/assets/dexie/LICENSE\n\tdeleted: src/assets/dexie/NOTICE\n\tdeleted: src/assets/dexie/README.md\n\tdeleted: src/assets/dexie/SECURITY.md\n\tdeleted: src/assets/dexie/dist/dexie.d.ts\n\tdeleted: src/assets/dexie/dist/dexie.js\n\tdeleted: src/assets/dexie/dist/dexie.js.map\n\tdeleted: src/assets/dexie/dist/dexie.min.js\n\tdeleted: src/assets/dexie/dist/dexie.min.js.map\n\tdeleted: src/assets/dexie/dist/dexie.mjs\n\tdeleted: src/assets/dexie/dist/dexie.mjs.map\n\tdeleted: src/assets/dexie/dist/modern/dexie.min.mjs\n\tdeleted: src/assets/dexie/dist/modern/dexie.min.mjs.map\n\tdeleted: src/assets/dexie/dist/modern/dexie.mjs\n\tdeleted: src/assets/dexie/dist/modern/dexie.mjs.map\n\tdeleted: src/assets/dexie/import-wrapper-prod.d.mts\n\tdeleted: src/assets/dexie/import-wrapper-prod.mjs\n\tdeleted: src/assets/dexie/import-wrapper.d.mts\n\tdeleted: src/assets/dexie/import-wrapper.mjs\n\tdeleted: src/assets/dexie/package.json\n\tdeleted: src/dexie/CODE_OF_CONDUCT.md\n\tdeleted: src/dexie/CONTRIBUTING.md\n\tdeleted: src/dexie/LICENSE\n\tdeleted: src/dexie/NOTICE\n\tdeleted: src/dexie/README.md\n\tdeleted: src/dexie/SECURITY.md\n\tdeleted: src/dexie/dist/dexie.d.ts\n\tdeleted: src/dexie/dist/dexie.js\n\tdeleted: src/dexie/dist/dexie.js.map\n\tdeleted: src/dexie/dist/dexie.min.js\n\tdeleted: src/dexie/dist/dexie.min.js.map\n\tdeleted: src/dexie/dist/dexie.mjs\n\tdeleted: src/dexie/dist/dexie.mjs.map\n\tdeleted: src/dexie/dist/modern/dexie.min.mjs\n\tdeleted: src/dexie/dist/modern/dexie.min.mjs.map\n\tdeleted: src/dexie/dist/modern/dexie.mjs\n\tdeleted: src/dexie/dist/modern/dexie.mjs.map\n\tdeleted: src/dexie/import-wrapper-prod.d.mts\n\tdeleted: src/dexie/import-wrapper-prod.mjs\n\tdeleted: src/dexie/import-wrapper.d.mts\n\tdeleted: src/dexie/import-wrapper.mjs\n\tdeleted: src/dexie/package.json\n\tmodified: src/environments/environment.prod.ts\n\tmodified: src/main.ts\n\tnew file: src/shared-worker.js\n\tmodified: src/style/ios.scss\n\tmodified: src/theme/variables.scss\n\tnew file: typedoc.json\n\tmodified: workspace.code-workspace", "changeAuthor": "peter.maquiran" } \ No newline at end of file diff --git a/workspace.code-workspace b/workspace.code-workspace index 63e287f6a..b456df374 100644 --- a/workspace.code-workspace +++ b/workspace.code-workspace @@ -4,7 +4,10 @@ "path": "." }, { - "path": "../testAu" + "path": "../sentry" + }, + { + "path": "../sentium" } ], "settings": {