@graffiti-garden/implementation-local 0.2.11 → 0.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- "use strict";var G=Object.create;var h=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var z=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty;var S=(r,e)=>{for(var t in e)h(r,t,{get:e[t],enumerable:!0})},y=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of w(e))!g.call(r,a)&&a!==t&&h(r,a,{get:()=>e[a],enumerable:!(i=O(e,a))||i.enumerable});return r};var k=(r,e,t)=>(t=r!=null?G(z(r)):{},y(e||!r||!r.__esModule?h(t,"default",{value:r,enumerable:!0}):t,r)),D=r=>y(h({},"__esModule",{value:!0}),r);var P={};S(P,{GraffitiSynchronize:()=>B});module.exports=D(P);var d=k(require("ajv-draft-04")),u=require("@repeaterjs/repeater"),m=require("fast-json-patch"),c=require("./utilities.js");class B{ajv;graffiti;callbacks=new Set;constructor(e,t){this.ajv=t??new d.default({strict:!1}),this.graffiti=e}async synchronizeDispatch(e,t){for(const i of this.callbacks)i(e,t);await Promise.resolve(),await Promise.resolve(),await Promise.resolve()}get=async(...e)=>{const t=await this.graffiti.get(...e);return this.synchronizeDispatch(t),t};put=async(...e)=>{const t=await this.graffiti.put(...e),i=e[0],a={...t,value:i.value,channels:i.channels,allowed:i.allowed,tombstone:!1};return await this.synchronizeDispatch(t,a),t};patch=async(...e)=>{const t=await this.graffiti.patch(...e),i={...t};i.tombstone=!1;for(const a of["value","channels","allowed"])(0,c.applyGraffitiPatch)(m.applyPatch,a,e[0],i);return await this.synchronizeDispatch(t,i),t};delete=async(...e)=>{const t=await this.graffiti.delete(...e);return await this.synchronizeDispatch(t),t};objectStream(e){const t=this.synchronizeDispatch.bind(this);return async function*(){let a=await e.next();for(;!a.done;)a.value.error||t(a.value.value),yield a.value,a=await e.next();return a.value}()}discover=(...e)=>{const t=this.graffiti.discover(...e);return this.objectStream(t)};recoverOrphans=(...e)=>{const t=this.graffiti.recoverOrphans(...e);return this.objectStream(t)};synchronize(e,t,i,a){const s=(0,c.attemptAjvCompile)(this.ajv,i);return new u.Repeater(async(o,l)=>{const b=async(v,j)=>{for(const f of[j,v])if(f&&e(f)&&(0,c.isActorAllowedGraffitiObject)(f,a)){const p={...f};if((0,c.maskGraffitiObject)(p,t,a),s(p)){o({value:p});break}}};this.callbacks.add(b),await l,this.callbacks.delete(b)})}synchronizeDiscover=(...e)=>{const[t,i,a]=e;function s(n){return n.channels.some(o=>t.includes(o))}return this.synchronize(s,t,i,a)};synchronizeGet=(...e)=>{const[t,i,a]=e;function s(n){const o=(0,c.locationToUri)(n),{uri:l}=(0,c.unpackLocationOrUri)(t);return o===l}return this.synchronize(s,[],i,a)};synchronizeRecoverOrphans=(...e)=>{const[t,i]=e;function a(s){return s.actor===i.actor&&s.channels.length===0}return this.synchronize(a,[],t,i)}}
1
+ "use strict";var O=Object.create;var h=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var z=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty;var S=(r,e)=>{for(var t in e)h(r,t,{get:e[t],enumerable:!0})},d=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of w(e))!g.call(r,a)&&a!==t&&h(r,a,{get:()=>e[a],enumerable:!(i=v(e,a))||i.enumerable});return r};var k=(r,e,t)=>(t=r!=null?O(z(r)):{},d(e||!r||!r.__esModule?h(t,"default",{value:r,enumerable:!0}):t,r)),D=r=>d(h({},"__esModule",{value:!0}),r);var R={};S(R,{GraffitiSynchronize:()=>B});module.exports=D(R);var u=k(require("ajv-draft-04")),y=require("@repeaterjs/repeater"),m=require("fast-json-patch"),c=require("./utilities.js");class B{ajv;graffiti;callbacks=new Set;constructor(e,t){this.ajv=t??new u.default({strict:!1}),this.graffiti=e}async synchronizeDispatch(e,t,i=!1){for(const a of this.callbacks)a(e,t);i&&await new Promise(a=>setTimeout(a,0))}get=async(...e)=>{const t=await this.graffiti.get(...e);return this.synchronizeDispatch(t),t};put=async(...e)=>{const t=await this.graffiti.put(...e),i=e[0],a={...t,value:i.value,channels:i.channels,allowed:i.allowed,tombstone:!1};return await this.synchronizeDispatch(t,a,!0),t};patch=async(...e)=>{const t=await this.graffiti.patch(...e),i={...t};i.tombstone=!1;for(const a of["value","channels","allowed"])(0,c.applyGraffitiPatch)(m.applyPatch,a,e[0],i);return await this.synchronizeDispatch(t,i,!0),t};delete=async(...e)=>{const t=await this.graffiti.delete(...e);return await this.synchronizeDispatch(t,void 0,!0),t};objectStream(e){const t=this.synchronizeDispatch.bind(this);return async function*(){let a=await e.next();for(;!a.done;)a.value.error||t(a.value.value),yield a.value,a=await e.next();return a.value}()}discover=(...e)=>{const t=this.graffiti.discover(...e);return this.objectStream(t)};recoverOrphans=(...e)=>{const t=this.graffiti.recoverOrphans(...e);return this.objectStream(t)};synchronize(e,t,i,a){const s=(0,c.attemptAjvCompile)(this.ajv,i);return new y.Repeater(async(n,l)=>{const b=(j,G)=>{for(const f of[G,j])if(f&&e(f)&&(0,c.isActorAllowedGraffitiObject)(f,a)){const p={...f};if((0,c.maskGraffitiObject)(p,t,a),s(p)){n({value:p});break}}};this.callbacks.add(b),await l,this.callbacks.delete(b)})}synchronizeDiscover=(...e)=>{const[t,i,a]=e;function s(o){return o.channels.some(n=>t.includes(n))}return this.synchronize(s,t,i,a)};synchronizeGet=(...e)=>{const[t,i,a]=e;function s(o){const n=(0,c.locationToUri)(o),{uri:l}=(0,c.unpackLocationOrUri)(t);return n===l}return this.synchronize(s,[],i,a)};synchronizeRecoverOrphans=(...e)=>{const[t,i]=e;function a(s){return s.actor===i.actor&&s.channels.length===0}return this.synchronize(a,[],t,i)}}
2
2
  //# sourceMappingURL=synchronize.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/synchronize.ts"],
4
- "sourcesContent": ["import Ajv from \"ajv-draft-04\";\nimport type {\n Graffiti,\n GraffitiSession,\n JSONSchema4,\n} from \"@graffiti-garden/api\";\nimport type { GraffitiObjectBase } from \"@graffiti-garden/api\";\nimport { Repeater } from \"@repeaterjs/repeater\";\nimport { applyPatch } from \"fast-json-patch\";\nimport {\n applyGraffitiPatch,\n attemptAjvCompile,\n isActorAllowedGraffitiObject,\n locationToUri,\n maskGraffitiObject,\n unpackLocationOrUri,\n} from \"./utilities.js\";\n\ntype GraffitiDatabaseMethods = Pick<\n Graffiti,\n \"get\" | \"put\" | \"patch\" | \"delete\" | \"discover\" | \"recoverOrphans\"\n>;\n\ntype Callback = (\n oldObject: GraffitiObjectBase,\n newObject?: GraffitiObjectBase,\n) => void;\n\n/**\n * Wraps a partial implementation of the [Graffiti API](https://api.graffiti.garden/classes/Graffiti.html)\n * to provide the [`synchronize`](https://api.graffiti.garden/classes/Graffiti.html#synchronize) method.\n * The partial implementation must include the primary database methods:\n * `get`, `put`, `patch`, `delete`, and `discover`.\n */\nexport class GraffitiSynchronize\n implements\n Pick<\n Graffiti,\n | \"put\"\n | \"get\"\n | \"patch\"\n | \"delete\"\n | \"discover\"\n | \"recoverOrphans\"\n | \"synchronizeDiscover\"\n | \"synchronizeGet\"\n | \"synchronizeRecoverOrphans\"\n >\n{\n protected readonly ajv: Ajv;\n protected readonly graffiti: GraffitiDatabaseMethods;\n protected readonly callbacks = new Set<Callback>();\n\n // Pass in the ajv instance\n // and database methods to wrap\n constructor(graffiti: GraffitiDatabaseMethods, ajv?: Ajv) {\n this.ajv = ajv ?? new Ajv({ strict: false });\n this.graffiti = graffiti;\n }\n\n protected async synchronizeDispatch(\n oldObject: GraffitiObjectBase,\n newObject?: GraffitiObjectBase,\n ) {\n for (const callback of this.callbacks) {\n callback(oldObject, newObject);\n }\n // No idea why this works...\n // You can't await push in the callback\n // below, because the await will only resolve\n // after a subsequent .next() call\n await Promise.resolve();\n await Promise.resolve();\n await Promise.resolve();\n }\n\n get: Graffiti[\"get\"] = async (...args) => {\n const object = await this.graffiti.get(...args);\n this.synchronizeDispatch(object);\n return object;\n };\n\n put: Graffiti[\"put\"] = async (...args) => {\n const oldObject = await this.graffiti.put(...args);\n const partialObject = args[0];\n const newObject: GraffitiObjectBase = {\n ...oldObject,\n value: partialObject.value,\n channels: partialObject.channels,\n allowed: partialObject.allowed,\n tombstone: false,\n };\n await this.synchronizeDispatch(oldObject, newObject);\n return oldObject;\n };\n\n patch: Graffiti[\"patch\"] = async (...args) => {\n const oldObject = await this.graffiti.patch(...args);\n const newObject: GraffitiObjectBase = { ...oldObject };\n newObject.tombstone = false;\n for (const prop of [\"value\", \"channels\", \"allowed\"] as const) {\n applyGraffitiPatch(applyPatch, prop, args[0], newObject);\n }\n await this.synchronizeDispatch(oldObject, newObject);\n return oldObject;\n };\n\n delete: Graffiti[\"delete\"] = async (...args) => {\n const oldObject = await this.graffiti.delete(...args);\n await this.synchronizeDispatch(oldObject);\n return oldObject;\n };\n\n protected objectStream<Schema extends JSONSchema4>(\n iterator: ReturnType<typeof Graffiti.prototype.discover<Schema>>,\n ) {\n const dispatch = this.synchronizeDispatch.bind(this);\n const wrapper = async function* () {\n let result = await iterator.next();\n while (!result.done) {\n if (!result.value.error) {\n dispatch(result.value.value);\n }\n yield result.value;\n result = await iterator.next();\n }\n return result.value;\n };\n return wrapper();\n }\n\n discover: Graffiti[\"discover\"] = (...args) => {\n const iterator = this.graffiti.discover(...args);\n return this.objectStream(iterator);\n };\n\n recoverOrphans: Graffiti[\"recoverOrphans\"] = (...args) => {\n const iterator = this.graffiti.recoverOrphans(...args);\n return this.objectStream(iterator);\n };\n\n protected synchronize<Schema extends JSONSchema4>(\n matchObject: (object: GraffitiObjectBase) => boolean,\n channels: string[],\n schema: Schema,\n session?: GraffitiSession | null,\n ) {\n const validate = attemptAjvCompile(this.ajv, schema);\n\n const repeater: ReturnType<\n typeof Graffiti.prototype.synchronizeDiscover<typeof schema>\n > = new Repeater(async (push, stop) => {\n const callback: Callback = async (oldObjectRaw, newObjectRaw) => {\n for (const objectRaw of [newObjectRaw, oldObjectRaw]) {\n if (\n objectRaw &&\n matchObject(objectRaw) &&\n isActorAllowedGraffitiObject(objectRaw, session)\n ) {\n const object = { ...objectRaw };\n maskGraffitiObject(object, channels, session);\n if (validate(object)) {\n push({ value: object });\n break;\n }\n }\n }\n };\n\n this.callbacks.add(callback);\n await stop;\n this.callbacks.delete(callback);\n });\n\n return repeater;\n }\n\n synchronizeDiscover: Graffiti[\"synchronizeDiscover\"] = (...args) => {\n const [channels, schema, session] = args;\n function matchObject(object: GraffitiObjectBase) {\n return object.channels.some((channel) => channels.includes(channel));\n }\n return this.synchronize(matchObject, channels, schema, session);\n };\n\n synchronizeGet: Graffiti[\"synchronizeGet\"] = (...args) => {\n const [locationOrUri, schema, session] = args;\n function matchObject(object: GraffitiObjectBase) {\n const objectUri = locationToUri(object);\n const { uri } = unpackLocationOrUri(locationOrUri);\n return objectUri === uri;\n }\n return this.synchronize(matchObject, [], schema, session);\n };\n\n synchronizeRecoverOrphans: Graffiti[\"synchronizeRecoverOrphans\"] = (\n ...args\n ) => {\n const [schema, session] = args;\n function matchObject(object: GraffitiObjectBase) {\n return object.actor === session.actor && object.channels.length === 0;\n }\n return this.synchronize(matchObject, [], schema, session);\n };\n}\n"],
5
- "mappings": "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",
6
- "names": ["synchronize_exports", "__export", "GraffitiSynchronize", "__toCommonJS", "import_ajv_draft_04", "import_repeater", "import_fast_json_patch", "import_utilities", "graffiti", "ajv", "Ajv", "oldObject", "newObject", "callback", "args", "object", "partialObject", "prop", "iterator", "dispatch", "result", "matchObject", "channels", "schema", "session", "validate", "push", "stop", "oldObjectRaw", "newObjectRaw", "objectRaw", "channel", "locationOrUri", "objectUri", "uri"]
4
+ "sourcesContent": ["import Ajv from \"ajv-draft-04\";\nimport type {\n Graffiti,\n GraffitiSession,\n JSONSchema4,\n} from \"@graffiti-garden/api\";\nimport type { GraffitiObjectBase } from \"@graffiti-garden/api\";\nimport { Repeater } from \"@repeaterjs/repeater\";\nimport { applyPatch } from \"fast-json-patch\";\nimport {\n applyGraffitiPatch,\n attemptAjvCompile,\n isActorAllowedGraffitiObject,\n locationToUri,\n maskGraffitiObject,\n unpackLocationOrUri,\n} from \"./utilities.js\";\n\ntype GraffitiDatabaseMethods = Pick<\n Graffiti,\n \"get\" | \"put\" | \"patch\" | \"delete\" | \"discover\" | \"recoverOrphans\"\n>;\n\ntype Callback = (\n oldObject: GraffitiObjectBase,\n newObject?: GraffitiObjectBase,\n) => void;\n\n/**\n * Wraps a partial implementation of the [Graffiti API](https://api.graffiti.garden/classes/Graffiti.html)\n * to provide the [`synchronize`](https://api.graffiti.garden/classes/Graffiti.html#synchronize) method.\n * The partial implementation must include the primary database methods:\n * `get`, `put`, `patch`, `delete`, and `discover`.\n */\nexport class GraffitiSynchronize\n implements\n Pick<\n Graffiti,\n | \"put\"\n | \"get\"\n | \"patch\"\n | \"delete\"\n | \"discover\"\n | \"recoverOrphans\"\n | \"synchronizeDiscover\"\n | \"synchronizeGet\"\n | \"synchronizeRecoverOrphans\"\n >\n{\n protected readonly ajv: Ajv;\n protected readonly graffiti: GraffitiDatabaseMethods;\n protected readonly callbacks = new Set<Callback>();\n\n // Pass in the ajv instance\n // and database methods to wrap\n constructor(graffiti: GraffitiDatabaseMethods, ajv?: Ajv) {\n this.ajv = ajv ?? new Ajv({ strict: false });\n this.graffiti = graffiti;\n }\n\n protected async synchronizeDispatch(\n oldObject: GraffitiObjectBase,\n newObject?: GraffitiObjectBase,\n macroTask = false,\n ) {\n for (const callback of this.callbacks) {\n callback(oldObject, newObject);\n }\n if (macroTask) {\n // Wait for one macro task cycle...\n // This way the yields, triggered by the callbacks,\n // will resolve first. Unfortunately, if we try to\n // use @repeaterjs's `await push` in the callback,\n // the promise won't resolve until the next\n // .next() call of the iterator, so if only\n // one .next() is called, this dispatch will hang.\n //\n // Only mutators (put, patch, delete) should bother\n // using this, so that they can ensure the application\n // state has been updated everywhere before returning,\n // for proper feedback.\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n }\n\n get: Graffiti[\"get\"] = async (...args) => {\n const object = await this.graffiti.get(...args);\n this.synchronizeDispatch(object);\n return object;\n };\n\n put: Graffiti[\"put\"] = async (...args) => {\n const oldObject = await this.graffiti.put(...args);\n const partialObject = args[0];\n const newObject: GraffitiObjectBase = {\n ...oldObject,\n value: partialObject.value,\n channels: partialObject.channels,\n allowed: partialObject.allowed,\n tombstone: false,\n };\n await this.synchronizeDispatch(oldObject, newObject, true);\n return oldObject;\n };\n\n patch: Graffiti[\"patch\"] = async (...args) => {\n const oldObject = await this.graffiti.patch(...args);\n const newObject: GraffitiObjectBase = { ...oldObject };\n newObject.tombstone = false;\n for (const prop of [\"value\", \"channels\", \"allowed\"] as const) {\n applyGraffitiPatch(applyPatch, prop, args[0], newObject);\n }\n await this.synchronizeDispatch(oldObject, newObject, true);\n return oldObject;\n };\n\n delete: Graffiti[\"delete\"] = async (...args) => {\n const oldObject = await this.graffiti.delete(...args);\n await this.synchronizeDispatch(oldObject, undefined, true);\n return oldObject;\n };\n\n protected objectStream<Schema extends JSONSchema4>(\n iterator: ReturnType<typeof Graffiti.prototype.discover<Schema>>,\n ) {\n const dispatch = this.synchronizeDispatch.bind(this);\n const wrapper = async function* () {\n let result = await iterator.next();\n while (!result.done) {\n if (!result.value.error) {\n dispatch(result.value.value);\n }\n yield result.value;\n result = await iterator.next();\n }\n return result.value;\n };\n return wrapper();\n }\n\n discover: Graffiti[\"discover\"] = (...args) => {\n const iterator = this.graffiti.discover(...args);\n return this.objectStream(iterator);\n };\n\n recoverOrphans: Graffiti[\"recoverOrphans\"] = (...args) => {\n const iterator = this.graffiti.recoverOrphans(...args);\n return this.objectStream(iterator);\n };\n\n protected synchronize<Schema extends JSONSchema4>(\n matchObject: (object: GraffitiObjectBase) => boolean,\n channels: string[],\n schema: Schema,\n session?: GraffitiSession | null,\n ) {\n const validate = attemptAjvCompile(this.ajv, schema);\n\n const repeater: ReturnType<\n typeof Graffiti.prototype.synchronizeDiscover<typeof schema>\n > = new Repeater(async (push, stop) => {\n const callback: Callback = (oldObjectRaw, newObjectRaw) => {\n for (const objectRaw of [newObjectRaw, oldObjectRaw]) {\n if (\n objectRaw &&\n matchObject(objectRaw) &&\n isActorAllowedGraffitiObject(objectRaw, session)\n ) {\n const object = { ...objectRaw };\n maskGraffitiObject(object, channels, session);\n if (validate(object)) {\n push({ value: object });\n break;\n }\n }\n }\n };\n\n this.callbacks.add(callback);\n await stop;\n this.callbacks.delete(callback);\n });\n\n return repeater;\n }\n\n synchronizeDiscover: Graffiti[\"synchronizeDiscover\"] = (...args) => {\n const [channels, schema, session] = args;\n function matchObject(object: GraffitiObjectBase) {\n return object.channels.some((channel) => channels.includes(channel));\n }\n return this.synchronize(matchObject, channels, schema, session);\n };\n\n synchronizeGet: Graffiti[\"synchronizeGet\"] = (...args) => {\n const [locationOrUri, schema, session] = args;\n function matchObject(object: GraffitiObjectBase) {\n const objectUri = locationToUri(object);\n const { uri } = unpackLocationOrUri(locationOrUri);\n return objectUri === uri;\n }\n return this.synchronize(matchObject, [], schema, session);\n };\n\n synchronizeRecoverOrphans: Graffiti[\"synchronizeRecoverOrphans\"] = (\n ...args\n ) => {\n const [schema, session] = args;\n function matchObject(object: GraffitiObjectBase) {\n return object.actor === session.actor && object.channels.length === 0;\n }\n return this.synchronize(matchObject, [], schema, session);\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["synchronize_exports", "__export", "GraffitiSynchronize", "__toCommonJS", "import_ajv_draft_04", "import_repeater", "import_fast_json_patch", "import_utilities", "graffiti", "ajv", "Ajv", "oldObject", "newObject", "macroTask", "callback", "resolve", "args", "object", "partialObject", "prop", "iterator", "dispatch", "result", "matchObject", "channels", "schema", "session", "validate", "push", "stop", "oldObjectRaw", "newObjectRaw", "objectRaw", "channel", "locationOrUri", "objectUri", "uri"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import b from"ajv-draft-04";import{Repeater as y}from"@repeaterjs/repeater";import{applyPatch as d}from"fast-json-patch";import{applyGraffitiPatch as u,attemptAjvCompile as m,isActorAllowedGraffitiObject as v,locationToUri as j,maskGraffitiObject as G,unpackLocationOrUri as O}from"./utilities.js";class D{ajv;graffiti;callbacks=new Set;constructor(e,t){this.ajv=t??new b({strict:!1}),this.graffiti=e}async synchronizeDispatch(e,t){for(const a of this.callbacks)a(e,t);await Promise.resolve(),await Promise.resolve(),await Promise.resolve()}get=async(...e)=>{const t=await this.graffiti.get(...e);return this.synchronizeDispatch(t),t};put=async(...e)=>{const t=await this.graffiti.put(...e),a=e[0],i={...t,value:a.value,channels:a.channels,allowed:a.allowed,tombstone:!1};return await this.synchronizeDispatch(t,i),t};patch=async(...e)=>{const t=await this.graffiti.patch(...e),a={...t};a.tombstone=!1;for(const i of["value","channels","allowed"])u(d,i,e[0],a);return await this.synchronizeDispatch(t,a),t};delete=async(...e)=>{const t=await this.graffiti.delete(...e);return await this.synchronizeDispatch(t),t};objectStream(e){const t=this.synchronizeDispatch.bind(this);return async function*(){let i=await e.next();for(;!i.done;)i.value.error||t(i.value.value),yield i.value,i=await e.next();return i.value}()}discover=(...e)=>{const t=this.graffiti.discover(...e);return this.objectStream(t)};recoverOrphans=(...e)=>{const t=this.graffiti.recoverOrphans(...e);return this.objectStream(t)};synchronize(e,t,a,i){const r=m(this.ajv,a);return new y(async(c,n)=>{const h=async(l,p)=>{for(const o of[p,l])if(o&&e(o)&&v(o,i)){const f={...o};if(G(f,t,i),r(f)){c({value:f});break}}};this.callbacks.add(h),await n,this.callbacks.delete(h)})}synchronizeDiscover=(...e)=>{const[t,a,i]=e;function r(s){return s.channels.some(c=>t.includes(c))}return this.synchronize(r,t,a,i)};synchronizeGet=(...e)=>{const[t,a,i]=e;function r(s){const c=j(s),{uri:n}=O(t);return c===n}return this.synchronize(r,[],a,i)};synchronizeRecoverOrphans=(...e)=>{const[t,a]=e;function i(r){return r.actor===a.actor&&r.channels.length===0}return this.synchronize(i,[],t,a)}}export{D as GraffitiSynchronize};
1
+ import b from"ajv-draft-04";import{Repeater as d}from"@repeaterjs/repeater";import{applyPatch as u}from"fast-json-patch";import{applyGraffitiPatch as y,attemptAjvCompile as m,isActorAllowedGraffitiObject as j,locationToUri as G,maskGraffitiObject as O,unpackLocationOrUri as v}from"./utilities.js";class D{ajv;graffiti;callbacks=new Set;constructor(e,t){this.ajv=t??new b({strict:!1}),this.graffiti=e}async synchronizeDispatch(e,t,i=!1){for(const a of this.callbacks)a(e,t);i&&await new Promise(a=>setTimeout(a,0))}get=async(...e)=>{const t=await this.graffiti.get(...e);return this.synchronizeDispatch(t),t};put=async(...e)=>{const t=await this.graffiti.put(...e),i=e[0],a={...t,value:i.value,channels:i.channels,allowed:i.allowed,tombstone:!1};return await this.synchronizeDispatch(t,a,!0),t};patch=async(...e)=>{const t=await this.graffiti.patch(...e),i={...t};i.tombstone=!1;for(const a of["value","channels","allowed"])y(u,a,e[0],i);return await this.synchronizeDispatch(t,i,!0),t};delete=async(...e)=>{const t=await this.graffiti.delete(...e);return await this.synchronizeDispatch(t,void 0,!0),t};objectStream(e){const t=this.synchronizeDispatch.bind(this);return async function*(){let a=await e.next();for(;!a.done;)a.value.error||t(a.value.value),yield a.value,a=await e.next();return a.value}()}discover=(...e)=>{const t=this.graffiti.discover(...e);return this.objectStream(t)};recoverOrphans=(...e)=>{const t=this.graffiti.recoverOrphans(...e);return this.objectStream(t)};synchronize(e,t,i,a){const r=m(this.ajv,i);return new d(async(c,o)=>{const h=(l,p)=>{for(const n of[p,l])if(n&&e(n)&&j(n,a)){const f={...n};if(O(f,t,a),r(f)){c({value:f});break}}};this.callbacks.add(h),await o,this.callbacks.delete(h)})}synchronizeDiscover=(...e)=>{const[t,i,a]=e;function r(s){return s.channels.some(c=>t.includes(c))}return this.synchronize(r,t,i,a)};synchronizeGet=(...e)=>{const[t,i,a]=e;function r(s){const c=G(s),{uri:o}=v(t);return c===o}return this.synchronize(r,[],i,a)};synchronizeRecoverOrphans=(...e)=>{const[t,i]=e;function a(r){return r.actor===i.actor&&r.channels.length===0}return this.synchronize(a,[],t,i)}}export{D as GraffitiSynchronize};
2
2
  //# sourceMappingURL=synchronize.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/synchronize.ts"],
4
- "sourcesContent": ["import Ajv from \"ajv-draft-04\";\nimport type {\n Graffiti,\n GraffitiSession,\n JSONSchema4,\n} from \"@graffiti-garden/api\";\nimport type { GraffitiObjectBase } from \"@graffiti-garden/api\";\nimport { Repeater } from \"@repeaterjs/repeater\";\nimport { applyPatch } from \"fast-json-patch\";\nimport {\n applyGraffitiPatch,\n attemptAjvCompile,\n isActorAllowedGraffitiObject,\n locationToUri,\n maskGraffitiObject,\n unpackLocationOrUri,\n} from \"./utilities.js\";\n\ntype GraffitiDatabaseMethods = Pick<\n Graffiti,\n \"get\" | \"put\" | \"patch\" | \"delete\" | \"discover\" | \"recoverOrphans\"\n>;\n\ntype Callback = (\n oldObject: GraffitiObjectBase,\n newObject?: GraffitiObjectBase,\n) => void;\n\n/**\n * Wraps a partial implementation of the [Graffiti API](https://api.graffiti.garden/classes/Graffiti.html)\n * to provide the [`synchronize`](https://api.graffiti.garden/classes/Graffiti.html#synchronize) method.\n * The partial implementation must include the primary database methods:\n * `get`, `put`, `patch`, `delete`, and `discover`.\n */\nexport class GraffitiSynchronize\n implements\n Pick<\n Graffiti,\n | \"put\"\n | \"get\"\n | \"patch\"\n | \"delete\"\n | \"discover\"\n | \"recoverOrphans\"\n | \"synchronizeDiscover\"\n | \"synchronizeGet\"\n | \"synchronizeRecoverOrphans\"\n >\n{\n protected readonly ajv: Ajv;\n protected readonly graffiti: GraffitiDatabaseMethods;\n protected readonly callbacks = new Set<Callback>();\n\n // Pass in the ajv instance\n // and database methods to wrap\n constructor(graffiti: GraffitiDatabaseMethods, ajv?: Ajv) {\n this.ajv = ajv ?? new Ajv({ strict: false });\n this.graffiti = graffiti;\n }\n\n protected async synchronizeDispatch(\n oldObject: GraffitiObjectBase,\n newObject?: GraffitiObjectBase,\n ) {\n for (const callback of this.callbacks) {\n callback(oldObject, newObject);\n }\n // No idea why this works...\n // You can't await push in the callback\n // below, because the await will only resolve\n // after a subsequent .next() call\n await Promise.resolve();\n await Promise.resolve();\n await Promise.resolve();\n }\n\n get: Graffiti[\"get\"] = async (...args) => {\n const object = await this.graffiti.get(...args);\n this.synchronizeDispatch(object);\n return object;\n };\n\n put: Graffiti[\"put\"] = async (...args) => {\n const oldObject = await this.graffiti.put(...args);\n const partialObject = args[0];\n const newObject: GraffitiObjectBase = {\n ...oldObject,\n value: partialObject.value,\n channels: partialObject.channels,\n allowed: partialObject.allowed,\n tombstone: false,\n };\n await this.synchronizeDispatch(oldObject, newObject);\n return oldObject;\n };\n\n patch: Graffiti[\"patch\"] = async (...args) => {\n const oldObject = await this.graffiti.patch(...args);\n const newObject: GraffitiObjectBase = { ...oldObject };\n newObject.tombstone = false;\n for (const prop of [\"value\", \"channels\", \"allowed\"] as const) {\n applyGraffitiPatch(applyPatch, prop, args[0], newObject);\n }\n await this.synchronizeDispatch(oldObject, newObject);\n return oldObject;\n };\n\n delete: Graffiti[\"delete\"] = async (...args) => {\n const oldObject = await this.graffiti.delete(...args);\n await this.synchronizeDispatch(oldObject);\n return oldObject;\n };\n\n protected objectStream<Schema extends JSONSchema4>(\n iterator: ReturnType<typeof Graffiti.prototype.discover<Schema>>,\n ) {\n const dispatch = this.synchronizeDispatch.bind(this);\n const wrapper = async function* () {\n let result = await iterator.next();\n while (!result.done) {\n if (!result.value.error) {\n dispatch(result.value.value);\n }\n yield result.value;\n result = await iterator.next();\n }\n return result.value;\n };\n return wrapper();\n }\n\n discover: Graffiti[\"discover\"] = (...args) => {\n const iterator = this.graffiti.discover(...args);\n return this.objectStream(iterator);\n };\n\n recoverOrphans: Graffiti[\"recoverOrphans\"] = (...args) => {\n const iterator = this.graffiti.recoverOrphans(...args);\n return this.objectStream(iterator);\n };\n\n protected synchronize<Schema extends JSONSchema4>(\n matchObject: (object: GraffitiObjectBase) => boolean,\n channels: string[],\n schema: Schema,\n session?: GraffitiSession | null,\n ) {\n const validate = attemptAjvCompile(this.ajv, schema);\n\n const repeater: ReturnType<\n typeof Graffiti.prototype.synchronizeDiscover<typeof schema>\n > = new Repeater(async (push, stop) => {\n const callback: Callback = async (oldObjectRaw, newObjectRaw) => {\n for (const objectRaw of [newObjectRaw, oldObjectRaw]) {\n if (\n objectRaw &&\n matchObject(objectRaw) &&\n isActorAllowedGraffitiObject(objectRaw, session)\n ) {\n const object = { ...objectRaw };\n maskGraffitiObject(object, channels, session);\n if (validate(object)) {\n push({ value: object });\n break;\n }\n }\n }\n };\n\n this.callbacks.add(callback);\n await stop;\n this.callbacks.delete(callback);\n });\n\n return repeater;\n }\n\n synchronizeDiscover: Graffiti[\"synchronizeDiscover\"] = (...args) => {\n const [channels, schema, session] = args;\n function matchObject(object: GraffitiObjectBase) {\n return object.channels.some((channel) => channels.includes(channel));\n }\n return this.synchronize(matchObject, channels, schema, session);\n };\n\n synchronizeGet: Graffiti[\"synchronizeGet\"] = (...args) => {\n const [locationOrUri, schema, session] = args;\n function matchObject(object: GraffitiObjectBase) {\n const objectUri = locationToUri(object);\n const { uri } = unpackLocationOrUri(locationOrUri);\n return objectUri === uri;\n }\n return this.synchronize(matchObject, [], schema, session);\n };\n\n synchronizeRecoverOrphans: Graffiti[\"synchronizeRecoverOrphans\"] = (\n ...args\n ) => {\n const [schema, session] = args;\n function matchObject(object: GraffitiObjectBase) {\n return object.actor === session.actor && object.channels.length === 0;\n }\n return this.synchronize(matchObject, [], schema, session);\n };\n}\n"],
5
- "mappings": "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",
6
- "names": ["Ajv", "Repeater", "applyPatch", "applyGraffitiPatch", "attemptAjvCompile", "isActorAllowedGraffitiObject", "locationToUri", "maskGraffitiObject", "unpackLocationOrUri", "GraffitiSynchronize", "graffiti", "ajv", "oldObject", "newObject", "callback", "args", "object", "partialObject", "prop", "iterator", "dispatch", "result", "matchObject", "channels", "schema", "session", "validate", "push", "stop", "oldObjectRaw", "newObjectRaw", "objectRaw", "channel", "locationOrUri", "objectUri", "uri"]
4
+ "sourcesContent": ["import Ajv from \"ajv-draft-04\";\nimport type {\n Graffiti,\n GraffitiSession,\n JSONSchema4,\n} from \"@graffiti-garden/api\";\nimport type { GraffitiObjectBase } from \"@graffiti-garden/api\";\nimport { Repeater } from \"@repeaterjs/repeater\";\nimport { applyPatch } from \"fast-json-patch\";\nimport {\n applyGraffitiPatch,\n attemptAjvCompile,\n isActorAllowedGraffitiObject,\n locationToUri,\n maskGraffitiObject,\n unpackLocationOrUri,\n} from \"./utilities.js\";\n\ntype GraffitiDatabaseMethods = Pick<\n Graffiti,\n \"get\" | \"put\" | \"patch\" | \"delete\" | \"discover\" | \"recoverOrphans\"\n>;\n\ntype Callback = (\n oldObject: GraffitiObjectBase,\n newObject?: GraffitiObjectBase,\n) => void;\n\n/**\n * Wraps a partial implementation of the [Graffiti API](https://api.graffiti.garden/classes/Graffiti.html)\n * to provide the [`synchronize`](https://api.graffiti.garden/classes/Graffiti.html#synchronize) method.\n * The partial implementation must include the primary database methods:\n * `get`, `put`, `patch`, `delete`, and `discover`.\n */\nexport class GraffitiSynchronize\n implements\n Pick<\n Graffiti,\n | \"put\"\n | \"get\"\n | \"patch\"\n | \"delete\"\n | \"discover\"\n | \"recoverOrphans\"\n | \"synchronizeDiscover\"\n | \"synchronizeGet\"\n | \"synchronizeRecoverOrphans\"\n >\n{\n protected readonly ajv: Ajv;\n protected readonly graffiti: GraffitiDatabaseMethods;\n protected readonly callbacks = new Set<Callback>();\n\n // Pass in the ajv instance\n // and database methods to wrap\n constructor(graffiti: GraffitiDatabaseMethods, ajv?: Ajv) {\n this.ajv = ajv ?? new Ajv({ strict: false });\n this.graffiti = graffiti;\n }\n\n protected async synchronizeDispatch(\n oldObject: GraffitiObjectBase,\n newObject?: GraffitiObjectBase,\n macroTask = false,\n ) {\n for (const callback of this.callbacks) {\n callback(oldObject, newObject);\n }\n if (macroTask) {\n // Wait for one macro task cycle...\n // This way the yields, triggered by the callbacks,\n // will resolve first. Unfortunately, if we try to\n // use @repeaterjs's `await push` in the callback,\n // the promise won't resolve until the next\n // .next() call of the iterator, so if only\n // one .next() is called, this dispatch will hang.\n //\n // Only mutators (put, patch, delete) should bother\n // using this, so that they can ensure the application\n // state has been updated everywhere before returning,\n // for proper feedback.\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n }\n\n get: Graffiti[\"get\"] = async (...args) => {\n const object = await this.graffiti.get(...args);\n this.synchronizeDispatch(object);\n return object;\n };\n\n put: Graffiti[\"put\"] = async (...args) => {\n const oldObject = await this.graffiti.put(...args);\n const partialObject = args[0];\n const newObject: GraffitiObjectBase = {\n ...oldObject,\n value: partialObject.value,\n channels: partialObject.channels,\n allowed: partialObject.allowed,\n tombstone: false,\n };\n await this.synchronizeDispatch(oldObject, newObject, true);\n return oldObject;\n };\n\n patch: Graffiti[\"patch\"] = async (...args) => {\n const oldObject = await this.graffiti.patch(...args);\n const newObject: GraffitiObjectBase = { ...oldObject };\n newObject.tombstone = false;\n for (const prop of [\"value\", \"channels\", \"allowed\"] as const) {\n applyGraffitiPatch(applyPatch, prop, args[0], newObject);\n }\n await this.synchronizeDispatch(oldObject, newObject, true);\n return oldObject;\n };\n\n delete: Graffiti[\"delete\"] = async (...args) => {\n const oldObject = await this.graffiti.delete(...args);\n await this.synchronizeDispatch(oldObject, undefined, true);\n return oldObject;\n };\n\n protected objectStream<Schema extends JSONSchema4>(\n iterator: ReturnType<typeof Graffiti.prototype.discover<Schema>>,\n ) {\n const dispatch = this.synchronizeDispatch.bind(this);\n const wrapper = async function* () {\n let result = await iterator.next();\n while (!result.done) {\n if (!result.value.error) {\n dispatch(result.value.value);\n }\n yield result.value;\n result = await iterator.next();\n }\n return result.value;\n };\n return wrapper();\n }\n\n discover: Graffiti[\"discover\"] = (...args) => {\n const iterator = this.graffiti.discover(...args);\n return this.objectStream(iterator);\n };\n\n recoverOrphans: Graffiti[\"recoverOrphans\"] = (...args) => {\n const iterator = this.graffiti.recoverOrphans(...args);\n return this.objectStream(iterator);\n };\n\n protected synchronize<Schema extends JSONSchema4>(\n matchObject: (object: GraffitiObjectBase) => boolean,\n channels: string[],\n schema: Schema,\n session?: GraffitiSession | null,\n ) {\n const validate = attemptAjvCompile(this.ajv, schema);\n\n const repeater: ReturnType<\n typeof Graffiti.prototype.synchronizeDiscover<typeof schema>\n > = new Repeater(async (push, stop) => {\n const callback: Callback = (oldObjectRaw, newObjectRaw) => {\n for (const objectRaw of [newObjectRaw, oldObjectRaw]) {\n if (\n objectRaw &&\n matchObject(objectRaw) &&\n isActorAllowedGraffitiObject(objectRaw, session)\n ) {\n const object = { ...objectRaw };\n maskGraffitiObject(object, channels, session);\n if (validate(object)) {\n push({ value: object });\n break;\n }\n }\n }\n };\n\n this.callbacks.add(callback);\n await stop;\n this.callbacks.delete(callback);\n });\n\n return repeater;\n }\n\n synchronizeDiscover: Graffiti[\"synchronizeDiscover\"] = (...args) => {\n const [channels, schema, session] = args;\n function matchObject(object: GraffitiObjectBase) {\n return object.channels.some((channel) => channels.includes(channel));\n }\n return this.synchronize(matchObject, channels, schema, session);\n };\n\n synchronizeGet: Graffiti[\"synchronizeGet\"] = (...args) => {\n const [locationOrUri, schema, session] = args;\n function matchObject(object: GraffitiObjectBase) {\n const objectUri = locationToUri(object);\n const { uri } = unpackLocationOrUri(locationOrUri);\n return objectUri === uri;\n }\n return this.synchronize(matchObject, [], schema, session);\n };\n\n synchronizeRecoverOrphans: Graffiti[\"synchronizeRecoverOrphans\"] = (\n ...args\n ) => {\n const [schema, session] = args;\n function matchObject(object: GraffitiObjectBase) {\n return object.actor === session.actor && object.channels.length === 0;\n }\n return this.synchronize(matchObject, [], schema, session);\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Ajv", "Repeater", "applyPatch", "applyGraffitiPatch", "attemptAjvCompile", "isActorAllowedGraffitiObject", "locationToUri", "maskGraffitiObject", "unpackLocationOrUri", "GraffitiSynchronize", "graffiti", "ajv", "oldObject", "newObject", "macroTask", "callback", "resolve", "args", "object", "partialObject", "prop", "iterator", "dispatch", "result", "matchObject", "channels", "schema", "session", "validate", "push", "stop", "oldObjectRaw", "newObjectRaw", "objectRaw", "channel", "locationOrUri", "objectUri", "uri"]
7
7
  }
@@ -14,7 +14,7 @@ return `+t+";",{})}function hw(t){var e=["return function(doc) {",' "use strict
14
14
  You can debug this error by doing:
15
15
  myDatabase.on('error', function (err) { debugger; });
16
16
  Please double-check your map/reduce function.`),vt("error",e,r)}}function a1(t,e,r,n){function i(q,C,L){try{C(L)}catch(B){th(q,B,{fun:C,doc:L})}}function s(q,C,L,B,F){try{return{output:C(L,B,F)}}catch(X){return th(q,X,{fun:C,keys:L,values:B,rereduce:F}),{error:X}}}function o(q,C){let L=Be(q.key,C.key);return L!==0?L:Be(q.value,C.value)}function a(q,C,L){return L=L||0,typeof C=="number"?q.slice(L,C+L):L>0?q.slice(L):q}function c(q){let C=q.value;return C&&typeof C=="object"&&C._id||q.id}function d(q){for(let C of q.rows){let L=C.doc&&C.doc._attachments;if(L)for(let B of Object.keys(L)){let F=L[B];L[B].data=Wa(F.data,F.content_type)}}}function m(q){return function(C){return q.include_docs&&q.attachments&&q.binary&&d(C),C}}function f(q,C,L,B){let F=C[q];typeof F<"u"&&(B&&(F=encodeURIComponent(JSON.stringify(F))),L.push(q+"="+F))}function y(q){if(typeof q<"u"){let C=Number(q);return!isNaN(C)&&C===parseInt(q,10)?C:q}}function _(q){return q.group_level=y(q.group_level),q.limit=y(q.limit),q.skip=y(q.skip),q}function b(q){if(q){if(typeof q!="number")return new yr(`Invalid value for integer: "${q}"`);if(q<0)return new yr(`Invalid value for positive integer: "${q}"`)}}function P(q,C){let L=q.descending?"endkey":"startkey",B=q.descending?"startkey":"endkey";if(typeof q[L]<"u"&&typeof q[B]<"u"&&Be(q[L],q[B])>0)throw new yr("No rows can match your key range, reverse your start_key and end_key or set {descending : true}");if(C.reduce&&q.reduce!==!1){if(q.include_docs)throw new yr("{include_docs:true} is invalid for reduce");if(q.keys&&q.keys.length>1&&!q.group&&!q.group_level)throw new yr("Multi-key fetches for reduce views must use {group: true}")}for(let F of["group_level","limit","skip"]){let X=b(q[F]);if(X)throw X}}async function S(q,C,L){let B=[],F,X="GET",ie;if(f("reduce",L,B),f("include_docs",L,B),f("attachments",L,B),f("limit",L,B),f("descending",L,B),f("group",L,B),f("group_level",L,B),f("skip",L,B),f("stale",L,B),f("conflicts",L,B),f("startkey",L,B,!0),f("start_key",L,B,!0),f("endkey",L,B,!0),f("end_key",L,B,!0),f("inclusive_end",L,B),f("key",L,B,!0),f("update_seq",L,B),B=B.join("&"),B=B===""?"":"?"+B,typeof L.keys<"u"){let W=`keys=${encodeURIComponent(JSON.stringify(L.keys))}`;W.length+B.length+1<=2e3?B+=(B[0]==="?"?"&":"?")+W:(X="POST",typeof C=="string"?F={keys:L.keys}:C.keys=L.keys)}if(typeof C=="string"){let M=ya(C),W=await q.fetch("_design/"+M[0]+"/_view/"+M[1]+B,{headers:new zr({"Content-Type":"application/json"}),method:X,body:JSON.stringify(F)});ie=W.ok;let ee=await W.json();if(!ie)throw ee.status=W.status,Jr(ee);for(let ne of ee.rows)if(ne.value&&ne.value.error&&ne.value.error==="builtin_reduce_error")throw new Error(ne.reason);return new Promise(function(ne){ne(ee)}).then(m(L))}F=F||{};for(let M of Object.keys(C))Array.isArray(C[M])?F[M]=C[M]:F[M]=C[M].toString();let J=await q.fetch("_temp_view"+B,{headers:new zr({"Content-Type":"application/json"}),method:"POST",body:JSON.stringify(F)});ie=J.ok;let D=await J.json();if(!ie)throw D.status=J.status,Jr(D);return new Promise(function(M){M(D)}).then(m(L))}function g(q,C,L){return new Promise(function(B,F){q._query(C,L,function(X,ie){if(X)return F(X);B(ie)})})}function w(q){return new Promise(function(C,L){q._viewCleanup(function(B,F){if(B)return L(B);C(F)})})}function p(q){return function(C){if(C.status===404)return q;throw C}}async function h(q,C,L){let B="_local/doc_"+q,F={_id:B,keys:[]},X=L.get(q),ie=X[0],J=X[1];function D(){return o1(J)?Promise.resolve(F):C.db.get(B).catch(p(F))}function M(Ee){return Ee.keys.length?C.db.allDocs({keys:Ee.keys,include_docs:!0}):Promise.resolve({rows:[]})}function W(Ee,$e){let Re=[],We=new Set;for(let ve of $e.rows){let ge=ve.doc;if(ge&&(Re.push(ge),We.add(ge._id),ge._deleted=!ie.has(ge._id),!ge._deleted)){let Se=ie.get(ge._id);"value"in Se&&(ge.value=Se.value)}}let ct=va(ie);for(let ve of ct)if(!We.has(ve)){let ge={_id:ve},Se=ie.get(ve);"value"in Se&&(ge.value=Se.value),Re.push(ge)}return Ee.keys=Wd(ct.concat(Ee.keys)),Re.push(Ee),Re}let ee=await D(),ne=await M(ee);return W(ee,ne)}function v(q){return q.sourceDB.get("_local/purges").then(function(C){let L=C.purgeSeq;return q.db.get("_local/purgeSeq").then(function(B){return B._rev}).catch(p(void 0)).then(function(B){return q.db.put({_id:"_local/purgeSeq",_rev:B,purgeSeq:L})})}).catch(function(C){if(C.status!==404)throw C})}function E(q,C,L){var B="_local/lastSeq";return q.db.get(B).catch(p({_id:B,seq:0})).then(function(F){var X=va(C);return Promise.all(X.map(function(ie){return h(ie,q,C)})).then(function(ie){var J=ie.flat();return F.seq=L,J.push(F),q.db.bulkDocs({docs:J})}).then(()=>v(q))})}function k(q){let C=typeof q=="string"?q:q.name,L=Zd[C];return L||(L=Zd[C]=new Nn),L}async function x(q,C){return ma(k(q),function(){return j(q,C)})()}async function j(q,C){let L,B,F;function X(ve,ge){let Se={id:B._id,key:$r(ve)};typeof ge<"u"&&ge!==null&&(Se.value=$r(ge)),L.push(Se)}let ie=e(q.mapFun,X),J=q.seq||0;function D(){return q.sourceDB.info().then(function(ve){F=q.sourceDB.activeTasks.add({name:"view_indexing",total_items:ve.update_seq-J})})}function M(ve,ge){return function(){return E(q,ve,ge)}}let W=0,ee={view:q.name,indexed_docs:W};q.sourceDB.emit("indexing",ee);let ne=new Nn;async function Ee(){let ve=await q.sourceDB.changes({return_docs:!0,conflicts:!0,include_docs:!0,style:"all_docs",since:J,limit:C.changes_batch_size}),ge=await $e();return Re(ve,ge)}function $e(){return q.db.get("_local/purgeSeq").then(function(ve){return ve.purgeSeq}).catch(p(-1)).then(function(ve){return q.sourceDB.get("_local/purges").then(function(ge){let Se=ge.purges.filter(function(Fe,Pe){return Pe>ve}).map(Fe=>Fe.docId),nt=Se.filter(function(Fe,Pe){return Se.indexOf(Fe)===Pe});return Promise.all(nt.map(function(Fe){return q.sourceDB.get(Fe).then(function(Pe){return{docId:Fe,doc:Pe}}).catch(p({docId:Fe}))}))}).catch(p([]))})}function Re(ve,ge){let Se=ve.results;if(!Se.length&&!ge.length)return;for(let Pe of ge)if(Se.findIndex(function(tr){return tr.id===Pe.docId})<0){let tr={_id:Pe.docId,doc:{_id:Pe.docId,_deleted:1},changes:[]};Pe.doc&&(tr.doc=Pe.doc,tr.changes.push({rev:Pe.doc._rev})),Se.push(tr)}let nt=We(Se);ne.add(M(nt,J)),W=W+Se.length;let Fe={view:q.name,last_seq:ve.last_seq,results_count:Se.length,indexed_docs:W};if(q.sourceDB.emit("indexing",Fe),q.sourceDB.activeTasks.update(F,{completed_items:W}),!(Se.length<C.changes_batch_size))return Ee()}function We(ve){let ge=new Map;for(let Se of ve){if(Se.doc._id[0]!=="_"){L=[],B=Se.doc,B._deleted||i(q.sourceDB,ie,B),L.sort(o);let nt=ct(L);ge.set(Se.doc._id,[nt,Se.changes])}J=Se.seq}return ge}function ct(ve){let ge=new Map,Se;for(let nt=0,Fe=ve.length;nt<Fe;nt++){let Pe=ve[nt],er=[Pe.key,Pe.id];nt>0&&Be(Pe.key,Se)===0&&er.push(nt),ge.set(Et(er),Pe),Se=Pe.key}return ge}try{await D(),await Ee(),await ne.finish(),q.seq=J,q.sourceDB.activeTasks.remove(F)}catch(ve){q.sourceDB.activeTasks.remove(F,ve)}}function G(q,C,L){L.group_level===0&&delete L.group_level;let B=L.group||L.group_level,F=r(q.reduceFun),X=[],ie=isNaN(L.group_level)?Number.POSITIVE_INFINITY:L.group_level;for(let J of C){let D=X[X.length-1],M=B?J.key:null;if(B&&Array.isArray(M)&&(M=M.slice(0,ie)),D&&Be(D.groupKey,M)===0){D.keys.push([J.key,J.id]),D.values.push(J.value);continue}X.push({keys:[[J.key,J.id]],values:[J.value],groupKey:M})}C=[];for(let J of X){let D=s(q.sourceDB,F,J.keys,J.values,!1);if(D.error&&D.error instanceof Ji)throw D.error;C.push({value:D.error?null:D.output,key:J.groupKey})}return{rows:a(C,L.limit,L.skip)}}function H(q,C){return ma(k(q),function(){return re(q,C)})()}async function re(q,C){let L,B=q.reduceFun&&C.reduce!==!1,F=C.skip||0;typeof C.keys<"u"&&!C.keys.length&&(C.limit=0,delete C.keys);async function X(J){J.include_docs=!0;let D=await q.db.allDocs(J);return L=D.total_rows,D.rows.map(function(M){if("value"in M.doc&&typeof M.doc.value=="object"&&M.doc.value!==null){let ee=Object.keys(M.doc.value).sort(),ne=["id","key","value"];if(!(ee<ne||ee>ne))return M.doc.value}let W=X0(M.doc._id);return{key:W[0],id:W[1],value:"value"in M.doc?M.doc.value:null}})}async function ie(J){let D;if(B?D=G(q,J,C):typeof C.keys>"u"?D={total_rows:L,offset:F,rows:J}:D={total_rows:L,offset:F,rows:a(J,C.limit,C.skip)},C.update_seq&&(D.update_seq=q.seq),C.include_docs){let M=Wd(J.map(c)),W=await q.sourceDB.allDocs({keys:M,include_docs:!0,conflicts:C.conflicts,attachments:C.attachments,binary:C.binary}),ee=new Map;for(let ne of W.rows)ee.set(ne.id,ne.doc);for(let ne of J){let Ee=c(ne),$e=ee.get(Ee);$e&&(ne.doc=$e)}}return D}if(typeof C.keys<"u"){let D=C.keys.map(function(ee){let ne={startkey:Et([ee]),endkey:Et([ee,{}])};return C.update_seq&&(ne.update_seq=!0),X(ne)}),W=(await Promise.all(D)).flat();return ie(W)}else{let J={descending:C.descending};C.update_seq&&(J.update_seq=!0);let D,M;if("start_key"in C&&(D=C.start_key),"startkey"in C&&(D=C.startkey),"end_key"in C&&(M=C.end_key),"endkey"in C&&(M=C.endkey),typeof D<"u"&&(J.startkey=C.descending?Et([D,{}]):Et([D])),typeof M<"u"){let ee=C.inclusive_end!==!1;C.descending&&(ee=!ee),J.endkey=Et(ee?[M,{}]:[M])}if(typeof C.key<"u"){let ee=Et([C.key]),ne=Et([C.key,{}]);J.descending?(J.endkey=ee,J.startkey=ne):(J.startkey=ee,J.endkey=ne)}B||(typeof C.limit=="number"&&(J.limit=C.limit),J.skip=F);let W=await X(J);return ie(W)}}async function Q(q){return(await q.fetch("_view_cleanup",{headers:new zr({"Content-Type":"application/json"}),method:"POST"})).json()}async function Z(q){try{let C=await q.get("_local/"+t),L=new Map;for(let D of Object.keys(C.views)){let M=ya(D),W="_design/"+M[0],ee=M[1],ne=L.get(W);ne||(ne=new Set,L.set(W,ne)),ne.add(ee)}let B={keys:va(L),include_docs:!0},F=await q.allDocs(B),X={};for(let D of F.rows){let M=D.key.substring(8);for(let W of L.get(D.key)){let ee=M+"/"+W;C.views[ee]||(ee=W);let ne=Object.keys(C.views[ee]),Ee=D.doc&&D.doc.views&&D.doc.views[W];for(let $e of ne)X[$e]=X[$e]||Ee}}let J=Object.keys(X).filter(function(D){return!X[D]}).map(function(D){return ma(k(D),function(){return new q.constructor(D,q.__opts).destroy()})()});return Promise.all(J).then(function(){return{ok:!0}})}catch(C){if(C.status===404)return{ok:!0};throw C}}async function ce(q,C,L){if(typeof q._query=="function")return g(q,C,L);if(Rt(q))return S(q,C,L);let B={changes_batch_size:q.__opts.view_update_changes_batch_size||s1};if(typeof C!="string")return P(L,C),eh.add(async function(){let F=await Xd(q,"temp_view/temp_view",C.map,C.reduce,!0,t);return e1(x(F,B).then(function(){return H(F,L)}),function(){return F.db.destroy()})}),eh.finish();{let F=C,X=ya(F),ie=X[0],J=X[1],D=await q.get("_design/"+ie);if(C=D.views&&D.views[J],!C)throw new Vi(`ddoc ${D._id} has no view named ${J}`);n(D,J),P(L,C);let M=await Xd(q,F,C.map,C.reduce,!1,t);return L.stale==="ok"||L.stale==="update_after"?(L.stale==="update_after"&&qt(function(){x(M,B)}),H(M,L)):(await x(M,B),H(M,L))}}function fe(q,C,L){let B=this;typeof C=="function"&&(L=C,C={}),C=C?_(C):{},typeof q=="function"&&(q={map:q});let F=Promise.resolve().then(function(){return ce(B,q,C)});return Bh(F,L),F}let me=Zw(function(){let q=this;return typeof q._viewCleanup=="function"?w(q):Rt(q)?Q(q):Z(q)});return{query:fe,viewCleanup:me}}var ga={_sum:function(t,e){return Na(e)},_count:function(t,e){return e.length},_stats:function(t,e){function r(n){for(var i=0,s=0,o=n.length;s<o;s++){var a=n[s];i+=a*a}return i}return{sum:Na(e),min:Math.min.apply(null,e),max:Math.max.apply(null,e),count:e.length,sumsqr:r(e)}}};function u1(t){if(/^_sum/.test(t))return ga._sum;if(/^_count/.test(t))return ga._count;if(/^_stats/.test(t))return ga._stats;if(/^_/.test(t))throw new Error(t+" is not a supported reduce function.")}function c1(t,e){if(typeof t=="function"&&t.length===2){var r=t;return function(n){return r(n,e)}}else return Lh(t.toString(),e)}function f1(t){var e=t.toString(),r=u1(e);return r||Lh(e)}function l1(t,e){var r=t.views&&t.views[e];if(typeof r.map!="string")throw new Vi("ddoc "+t._id+" has no string view named "+e+", instead found object of type: "+typeof r.map)}var d1="mrviews",Mh=a1(d1,c1,f1,l1);function h1(t,e,r){return Mh.query.call(this,t,e,r)}function p1(t){return Mh.viewCleanup.call(this,t)}var m1={query:h1,viewCleanup:p1};function v1(t,e,r){return!t._attachments||!t._attachments[r]||t._attachments[r].digest!==e._attachments[r].digest}function rh(t,e){var r=Object.keys(e._attachments);return Promise.all(r.map(function(n){return t.getAttachment(e._id,n,{rev:e._rev})}))}function y1(t,e,r){var n=Rt(e)&&!Rt(t),i=Object.keys(r._attachments);return n?t.get(r._id).then(function(s){return Promise.all(i.map(function(o){return v1(s,r,o)?e.getAttachment(r._id,o):t.getAttachment(s._id,o)}))}).catch(function(s){if(s.status!==404)throw s;return rh(e,r)}):rh(e,r)}function g1(t){var e=[];return Object.keys(t).forEach(function(r){var n=t[r].missing;n.forEach(function(i){e.push({id:r,rev:i})})}),{docs:e,revs:!0,latest:!0}}function _1(t,e,r,n){r=Ge(r);var i=[],s=!0;function o(){var c=g1(r);if(c.docs.length)return t.bulkGet(c).then(function(d){if(n.cancelled)throw new Error("cancelled");return Promise.all(d.results.map(function(m){return Promise.all(m.docs.map(function(f){var y=f.ok;return f.error&&(s=!1),!y||!y._attachments?y:y1(e,t,y).then(_=>{var b=Object.keys(y._attachments);return _.forEach(function(P,S){var g=y._attachments[b[S]];delete g.stub,delete g.length,g.data=P}),y})}))})).then(function(m){i=i.concat(m.flat().filter(Boolean))})})}function a(){return{ok:s,docs:i}}return Promise.resolve().then(o).then(a)}var nh=1,ih="pouchdb",w1=5,bt=0;function ja(t,e,r,n,i){return t.get(e).catch(function(s){if(s.status===404)return(t.adapter==="http"||t.adapter==="https")&&ba(404,"PouchDB is just checking if a remote checkpoint exists."),{session_id:n,_id:e,history:[],replicator:ih,version:nh};throw s}).then(function(s){if(!i.cancelled&&s.last_seq!==r)return s.history=(s.history||[]).filter(function(o){return o.session_id!==n}),s.history.unshift({last_seq:r,session_id:n}),s.history=s.history.slice(0,w1),s.version=nh,s.replicator=ih,s.session_id=n,s.last_seq=r,t.put(s).catch(function(o){if(o.status===409)return ja(t,e,r,n,i);throw o})})}var Hi=class{constructor(e,r,n,i,s={writeSourceCheckpoint:!0,writeTargetCheckpoint:!0}){this.src=e,this.target=r,this.id=n,this.returnValue=i,this.opts=s,typeof s.writeSourceCheckpoint>"u"&&(s.writeSourceCheckpoint=!0),typeof s.writeTargetCheckpoint>"u"&&(s.writeTargetCheckpoint=!0)}writeCheckpoint(e,r){var n=this;return this.updateTarget(e,r).then(function(){return n.updateSource(e,r)})}updateTarget(e,r){return this.opts.writeTargetCheckpoint?ja(this.target,this.id,e,r,this.returnValue):Promise.resolve(!0)}updateSource(e,r){if(this.opts.writeSourceCheckpoint){var n=this;return ja(this.src,this.id,e,r,this.returnValue).catch(function(i){if(oh(i))return n.opts.writeSourceCheckpoint=!1,!0;throw i})}else return Promise.resolve(!0)}getCheckpoint(){var e=this;return!e.opts.writeSourceCheckpoint&&!e.opts.writeTargetCheckpoint?Promise.resolve(bt):e.opts&&e.opts.writeSourceCheckpoint&&!e.opts.writeTargetCheckpoint?e.src.get(e.id).then(function(r){return r.last_seq||bt}).catch(function(r){if(r.status!==404)throw r;return bt}):e.target.get(e.id).then(function(r){return e.opts&&e.opts.writeTargetCheckpoint&&!e.opts.writeSourceCheckpoint?r.last_seq||bt:e.src.get(e.id).then(function(n){if(r.version!==n.version)return bt;var i;return r.version?i=r.version.toString():i="undefined",i in sh?sh[i](r,n):bt},function(n){if(n.status===404&&r.last_seq)return e.src.put({_id:e.id,last_seq:bt}).then(function(){return bt},function(i){return oh(i)?(e.opts.writeSourceCheckpoint=!1,r.last_seq):bt});throw n})}).catch(function(r){if(r.status!==404)throw r;return bt})}},sh={undefined:function(t,e){return Be(t.last_seq,e.last_seq)===0?e.last_seq:0},1:function(t,e){return b1(e,t).last_seq}};function b1(t,e){return t.session_id===e.session_id?{last_seq:t.last_seq,history:t.history}:Uh(t.history,e.history)}function Uh(t,e){var r=t[0],n=t.slice(1),i=e[0],s=e.slice(1);if(!r||e.length===0)return{last_seq:bt,history:[]};var o=r.session_id;if(Da(o,e))return{last_seq:r.last_seq,history:t};var a=i.session_id;return Da(a,n)?{last_seq:i.last_seq,history:s}:Uh(n,s)}function Da(t,e){var r=e[0],n=e.slice(1);return!t||e.length===0?!1:t===r.session_id?!0:Da(t,n)}function oh(t){return typeof t.status=="number"&&Math.floor(t.status/100)===4}function Gh(t,e,r,n,i){return this instanceof Hi?Gh:new Hi(t,e,r,n,i)}var ah=0;function E1(t,e,r,n){if(t.retry===!1){e.emit("error",r),e.removeAllListeners();return}if(typeof t.back_off_function!="function"&&(t.back_off_function=H_),e.emit("requestError",r),e.state==="active"||e.state==="pending"){e.emit("paused",r),e.state="stopped";var i=function(){t.current_back_off=ah},s=function(){e.removeListener("active",i)};e.once("paused",s),e.once("active",i)}t.current_back_off=t.current_back_off||ah,t.current_back_off=t.back_off_function(t.current_back_off),setTimeout(n,t.current_back_off)}function $1(t){return Object.keys(t).sort(Be).reduce(function(e,r){return e[r]=t[r],e},{})}function S1(t,e,r){var n=r.doc_ids?r.doc_ids.sort(Be):"",i=r.filter?r.filter.toString():"",s="",o="",a="";return r.selector&&(a=JSON.stringify(r.selector)),r.filter&&r.query_params&&(s=JSON.stringify($1(r.query_params))),r.filter&&r.filter==="_view"&&(o=r.view.toString()),Promise.all([t.id(),e.id()]).then(function(c){var d=c[0]+c[1]+i+o+s+n+a;return new Promise(function(m){Ya(d,m)})}).then(function(c){return c=c.replace(/\//g,".").replace(/\+/g,"_"),"_local/"+c})}function Fh(t,e,r,n,i){var s=[],o,a={seq:0,changes:[],docs:[]},c=!1,d=!1,m=!1,f=0,y=0,_=r.continuous||r.live||!1,b=r.batch_size||100,P=r.batches_limit||10,S=r.style||"all_docs",g=!1,w=r.doc_ids,p=r.selector,h,v,E=[],k=Yi(),x;i=i||{ok:!0,start_time:new Date().toISOString(),docs_read:0,docs_written:0,doc_write_failures:0,errors:[]};var j={};n.ready(t,e);function G(){return v?Promise.resolve():S1(t,e,r).then(function(D){h=D;var M={};r.checkpoint===!1?M={writeSourceCheckpoint:!1,writeTargetCheckpoint:!1}:r.checkpoint==="source"?M={writeSourceCheckpoint:!0,writeTargetCheckpoint:!1}:r.checkpoint==="target"?M={writeSourceCheckpoint:!1,writeTargetCheckpoint:!0}:M={writeSourceCheckpoint:!0,writeTargetCheckpoint:!0},v=new Gh(t,e,h,n,M)})}function H(){if(E=[],o.docs.length!==0){var D=o.docs,M={timeout:r.timeout};return e.bulkDocs({docs:D,new_edits:!1},M).then(function(W){if(n.cancelled)throw q(),new Error("cancelled");var ee=Object.create(null);W.forEach(function(Ee){Ee.error&&(ee[Ee.id]=Ee)});var ne=Object.keys(ee).length;i.doc_write_failures+=ne,i.docs_written+=D.length-ne,D.forEach(function(Ee){var $e=ee[Ee._id];if($e){i.errors.push($e);var Re=($e.name||"").toLowerCase();if(Re==="unauthorized"||Re==="forbidden")n.emit("denied",Ge($e));else throw $e}else E.push(Ee)})},function(W){throw i.doc_write_failures+=D.length,W})}}function re(){if(o.error)throw new Error("There was a problem getting docs.");i.last_seq=y=o.seq;var D=Ge(i);return E.length&&(D.docs=E,typeof o.pending=="number"&&(D.pending=o.pending,delete o.pending),n.emit("change",D)),c=!0,t.info().then(function(M){var W=t.activeTasks.get(x);if(!(!o||!W)){var ee=W.completed_items||0,ne=parseInt(M.update_seq,10)-parseInt(f,10);t.activeTasks.update(x,{completed_items:ee+o.changes.length,total_items:ne})}}),v.writeCheckpoint(o.seq,k).then(function(){if(n.emit("checkpoint",{checkpoint:o.seq}),c=!1,n.cancelled)throw q(),new Error("cancelled");o=void 0,F()}).catch(function(M){throw J(M),M})}function Q(){var D={};return o.changes.forEach(function(M){n.emit("checkpoint",{revs_diff:M}),M.id!=="_user/"&&(D[M.id]=M.changes.map(function(W){return W.rev}))}),e.revsDiff(D).then(function(M){if(n.cancelled)throw q(),new Error("cancelled");o.diffs=M})}function Z(){return _1(t,e,o.diffs,n).then(function(D){o.error=!D.ok,D.docs.forEach(function(M){delete o.diffs[M._id],i.docs_read++,o.docs.push(M)})})}function ce(){if(!(n.cancelled||o)){if(s.length===0){fe(!0);return}o=s.shift(),n.emit("checkpoint",{start_next_batch:o.seq}),Q().then(Z).then(H).then(re).then(ce).catch(function(D){me("batch processing terminated with error",D)})}}function fe(D){if(a.changes.length===0){s.length===0&&!o&&((_&&j.live||d)&&(n.state="pending",n.emit("paused")),d&&q());return}(D||d||a.changes.length>=b)&&(s.push(a),a={seq:0,changes:[],docs:[]},(n.state==="pending"||n.state==="stopped")&&(n.state="active",n.emit("active")),ce())}function me(D,M){m||(M.message||(M.message=D),i.ok=!1,i.status="aborting",s=[],a={seq:0,changes:[],docs:[]},q(M))}function q(D){if(!m&&!(n.cancelled&&(i.status="cancelled",c)))if(i.status=i.status||"complete",i.end_time=new Date().toISOString(),i.last_seq=y,m=!0,t.activeTasks.remove(x,D),D){D=oe(D),D.result=i;var M=(D.name||"").toLowerCase();M==="unauthorized"||M==="forbidden"?(n.emit("error",D),n.removeAllListeners()):E1(r,n,D,function(){Fh(t,e,r,n)})}else n.emit("complete",i),n.removeAllListeners()}function C(D,M,W){if(n.cancelled)return q();typeof M=="number"&&(a.pending=M);var ee=za(r)(D);if(!ee){var ne=t.activeTasks.get(x);if(ne){var Ee=ne.completed_items||0;t.activeTasks.update(x,{completed_items:++Ee})}return}a.seq=D.seq||W,a.changes.push(D),n.emit("checkpoint",{pending_batch:a.seq}),qt(function(){fe(s.length===0&&j.live)})}function L(D){if(g=!1,n.cancelled)return q();if(D.results.length>0)j.since=D.results[D.results.length-1].seq,F(),fe(!0);else{var M=function(){_?(j.live=!0,F()):d=!0,fe(!0)};!o&&D.results.length===0?(c=!0,v.writeCheckpoint(D.last_seq,k).then(function(){if(c=!1,i.last_seq=y=D.last_seq,n.cancelled)throw q(),new Error("cancelled");M()}).catch(J)):M()}}function B(D){if(g=!1,n.cancelled)return q();me("changes rejected",D)}function F(){if(!(!g&&!d&&s.length<P))return;g=!0;function D(){W.cancel()}function M(){n.removeListener("cancel",D)}n._changes&&(n.removeListener("cancel",n._abortChanges),n._changes.cancel()),n.once("cancel",D);var W=t.changes(j).on("change",C);W.then(M,M),W.then(L).catch(B),r.retry&&(n._changes=W,n._abortChanges=D)}function X(D){return t.info().then(function(M){var W=typeof r.since>"u"?parseInt(M.update_seq,10)-parseInt(D,10):parseInt(M.update_seq,10);return x=t.activeTasks.add({name:`${_?"continuous ":""}replication from ${M.db_name}`,total_items:W}),D})}function ie(){G().then(function(){if(n.cancelled){q();return}return v.getCheckpoint().then(X).then(function(D){y=D,f=D,j={since:y,limit:b,batch_size:b,style:S,doc_ids:w,selector:p,return_docs:!0},r.filter&&(typeof r.filter!="string"?j.include_docs=!0:j.filter=r.filter),"heartbeat"in r&&(j.heartbeat=r.heartbeat),"timeout"in r&&(j.timeout=r.timeout),r.query_params&&(j.query_params=r.query_params),r.view&&(j.view=r.view),F()})}).catch(function(D){me("getCheckpoint rejected with ",D)})}function J(D){c=!1,me("writeCheckpoint completed with error",D)}if(n.cancelled){q();return}n._addedListeners||(n.once("cancel",q),typeof r.complete=="function"&&(n.once("error",r.complete),n.once("complete",function(D){r.complete(null,D)})),n._addedListeners=!0),typeof r.since>"u"?ie():G().then(function(){return c=!0,v.writeCheckpoint(r.since,k)}).then(function(){if(c=!1,n.cancelled){q();return}y=r.since,ie()}).catch(J)}var Ba=class extends ut{constructor(){super(),this.cancelled=!1,this.state="pending";let e=new Promise((r,n)=>{this.once("complete",r),this.once("error",n)});this.then=function(r,n){return e.then(r,n)},this.catch=function(r){return e.catch(r)},this.catch(function(){})}cancel(){this.cancelled=!0,this.state="cancelled",this.emit("cancel")}ready(e,r){if(this._readyCalled)return;this._readyCalled=!0;let n=()=>{this.cancel()};e.once("destroyed",n),r.once("destroyed",n);function i(){e.removeListener("destroyed",n),r.removeListener("destroyed",n)}this.once("complete",i),this.once("error",i)}};function Wi(t,e){var r=e.PouchConstructor;return typeof t=="string"?new r(t,e):t}function La(t,e,r,n){if(typeof r=="function"&&(n=r,r={}),typeof r>"u"&&(r={}),r.doc_ids&&!Array.isArray(r.doc_ids))throw oe(Qi,"`doc_ids` filter parameter is not a list.");r.complete=n,r=Ge(r),r.continuous=r.continuous||r.live,r.retry="retry"in r?r.retry:!1,r.PouchConstructor=r.PouchConstructor||this;var i=new Ba(r),s=Wi(t,r),o=Wi(e,r);return Fh(s,o,r,i),i}function P1(t,e,r,n){return typeof r=="function"&&(n=r,r={}),typeof r>"u"&&(r={}),r=Ge(r),r.PouchConstructor=r.PouchConstructor||this,t=Wi(t,r),e=Wi(e,r),new Ma(t,e,r,n)}var Ma=class extends ut{constructor(e,r,n,i){super(),this.canceled=!1;let s=n.push?Object.assign({},n,n.push):n,o=n.pull?Object.assign({},n,n.pull):n;this.push=La(e,r,s),this.pull=La(r,e,o),this.pushPaused=!0,this.pullPaused=!0;let a=p=>{this.emit("change",{direction:"pull",change:p})},c=p=>{this.emit("change",{direction:"push",change:p})},d=p=>{this.emit("denied",{direction:"push",doc:p})},m=p=>{this.emit("denied",{direction:"pull",doc:p})},f=()=>{this.pushPaused=!0,this.pullPaused&&this.emit("paused")},y=()=>{this.pullPaused=!0,this.pushPaused&&this.emit("paused")},_=()=>{this.pushPaused=!1,this.pullPaused&&this.emit("active",{direction:"push"})},b=()=>{this.pullPaused=!1,this.pushPaused&&this.emit("active",{direction:"pull"})},P={},S=p=>(h,v)=>{(h==="change"&&(v===a||v===c)||h==="denied"&&(v===m||v===d)||h==="paused"&&(v===y||v===f)||h==="active"&&(v===b||v===_))&&(h in P||(P[h]={}),P[h][p]=!0,Object.keys(P[h]).length===2&&this.removeAllListeners(h))};n.live&&(this.push.on("complete",this.pull.cancel.bind(this.pull)),this.pull.on("complete",this.push.cancel.bind(this.push)));function g(p,h,v){p.listeners(h).indexOf(v)==-1&&p.on(h,v)}this.on("newListener",function(p){p==="change"?(g(this.pull,"change",a),g(this.push,"change",c)):p==="denied"?(g(this.pull,"denied",m),g(this.push,"denied",d)):p==="active"?(g(this.pull,"active",b),g(this.push,"active",_)):p==="paused"&&(g(this.pull,"paused",y),g(this.push,"paused",f))}),this.on("removeListener",function(p){p==="change"?(this.pull.removeListener("change",a),this.push.removeListener("change",c)):p==="denied"?(this.pull.removeListener("denied",m),this.push.removeListener("denied",d)):p==="active"?(this.pull.removeListener("active",b),this.push.removeListener("active",_)):p==="paused"&&(this.pull.removeListener("paused",y),this.push.removeListener("paused",f))}),this.pull.on("removeListener",S("pull")),this.push.on("removeListener",S("push"));let w=Promise.all([this.push,this.pull]).then(p=>{let h={push:p[0],pull:p[1]};return this.emit("complete",h),i&&i(null,h),this.removeAllListeners(),h},p=>{if(this.cancel(),i?i(p):this.emit("error",p),this.removeAllListeners(),i)throw p});this.then=function(p,h){return w.then(p,h)},this.catch=function(p){return w.catch(p)}}cancel(){this.canceled||(this.canceled=!0,this.push.cancel(),this.pull.cancel())}};function O1(t){t.replicate=La,t.sync=P1,Object.defineProperty(t.prototype,"replicate",{get:function(){var e=this;return typeof this.replicateMethods>"u"&&(this.replicateMethods={from:function(r,n,i){return e.constructor.replicate(r,e,n,i)},to:function(r,n,i){return e.constructor.replicate(e,r,n,i)}}),this.replicateMethods}}),t.prototype.sync=function(e,r,n){return this.constructor.sync(this,e,r,n)}}ae.plugin(zw).plugin(Xw).plugin(m1).plugin(O1);var zh=ae;I();R();T();var Yt=t=>`${t.source}/${encodeURIComponent(t.actor)}/${encodeURIComponent(t.name)}`,ru=t=>{let e=t.split("/"),r=e.pop(),n=e.pop();if(!r||!n||!e.length)throw new Jc;return{name:decodeURIComponent(r),actor:decodeURIComponent(n),source:e.join("/")}};function nu(t=16){let e=new Uint8Array(t);return crypto.getRandomValues(e),btoa(String.fromCodePoint(...e)).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,"")}function Hr(t){return typeof t=="string"?{location:ru(t),uri:t}:{location:{name:t.name,actor:t.actor,source:t.source},uri:Yt(t)}}function Kh(t,e){return t.lastModified>e.lastModified||t.lastModified===e.lastModified&&!t.tombstone&&e.tombstone}function Xi(t,e,r,n){let i=r[e];if(!(!i||!i.length))try{n[e]=t(n[e],i,!0,!1).newDocument}catch(s){throw typeof s=="object"&&s&&"name"in s&&typeof s.name=="string"&&"message"in s&&typeof s.message=="string"?s.name==="TEST_OPERATION_FAILED"?new zc(s.message):new Tr(s.name+": "+s.message):s}}function Wr(t,e){try{return t.compile(e)}catch(r){throw new Mc(r instanceof Error?r.message:void 0)}}function Bn(t,e,r){t.actor!==r?.actor&&(t.allowed=t.allowed&&r?[r.actor]:void 0,t.channels=t.channels.filter(n=>e.includes(n)))}function Ln(t,e){return t.allowed===void 0||t.allowed===null||!!e?.actor&&(t.actor===e.actor||t.allowed.includes(e.actor))}I();R();T();var su=function(t,e){return su=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,n){r.__proto__=n}||function(r,n){for(var i in n)n.hasOwnProperty(i)&&(r[i]=n[i])},su(t,e)};function A1(t,e){su(t,e);function r(){this.constructor=t}t.prototype=e===null?Object.create(e):(r.prototype=e.prototype,new r)}function Yr(t,e,r,n){function i(s){return s instanceof r?s:new r(function(o){o(s)})}return new(r||(r=Promise))(function(s,o){function a(m){try{d(n.next(m))}catch(f){o(f)}}function c(m){try{d(n.throw(m))}catch(f){o(f)}}function d(m){m.done?s(m.value):i(m.value).then(a,c)}d((n=n.apply(t,e||[])).next())})}function Xt(t,e){var r={label:0,sent:function(){if(s[0]&1)throw s[1];return s[1]},trys:[],ops:[]},n,i,s,o;return o={next:a(0),throw:a(1),return:a(2)},typeof Symbol=="function"&&(o[Symbol.iterator]=function(){return this}),o;function a(d){return function(m){return c([d,m])}}function c(d){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,i&&(s=d[0]&2?i.return:d[0]?i.throw||((s=i.return)&&s.call(i),0):i.next)&&!(s=s.call(i,d[1])).done)return s;switch(i=0,s&&(d=[d[0]&2,s.value]),d[0]){case 0:case 1:s=d;break;case 4:return r.label++,{value:d[1],done:!1};case 5:r.label++,i=d[1],d=[0];continue;case 7:d=r.ops.pop(),r.trys.pop();continue;default:if(s=r.trys,!(s=s.length>0&&s[s.length-1])&&(d[0]===6||d[0]===2)){r=0;continue}if(d[0]===3&&(!s||d[1]>s[0]&&d[1]<s[3])){r.label=d[1];break}if(d[0]===6&&r.label<s[1]){r.label=s[1],s=d;break}if(s&&r.label<s[2]){r.label=s[2],r.ops.push(d);break}s[2]&&r.ops.pop(),r.trys.pop();continue}d=e.call(t,r)}catch(m){d=[6,m],i=0}finally{n=s=0}if(d[0]&5)throw d[1];return{value:d[0]?d[1]:void 0,done:!0}}}function Xr(t){var e=typeof Symbol=="function"&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&typeof t.length=="number")return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function Un(t){return this instanceof Un?(this.v=t,this):new Un(t)}function I1(t,e,r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=r.apply(t,e||[]),i,s=[];return i={},o("next"),o("throw"),o("return"),i[Symbol.asyncIterator]=function(){return this},i;function o(y){n[y]&&(i[y]=function(_){return new Promise(function(b,P){s.push([y,_,b,P])>1||a(y,_)})})}function a(y,_){try{c(n[y](_))}catch(b){f(s[0][3],b)}}function c(y){y.value instanceof Un?Promise.resolve(y.value.v).then(d,m):f(s[0][2],y)}function d(y){a("next",y)}function m(y){a("throw",y)}function f(y,_){y(_),s.shift(),s.length&&a(s[0][0],s[0][1])}}var Hh=function(t){A1(e,t);function e(r){var n=t.call(this,r)||this;return Object.defineProperty(n,"name",{value:"RepeaterOverflowError",enumerable:!1}),typeof Object.setPrototypeOf=="function"?Object.setPrototypeOf(n,n.constructor.prototype):n.__proto__=n.constructor.prototype,typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(n,n.constructor),n}return e}(Error),qA=function(){function t(e){if(e<0)throw new RangeError("Capacity may not be less than 0");this._c=e,this._q=[]}return Object.defineProperty(t.prototype,"empty",{get:function(){return this._q.length===0},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"full",{get:function(){return this._q.length>=this._c},enumerable:!1,configurable:!0}),t.prototype.add=function(e){if(this.full)throw new Error("Buffer full");this._q.push(e)},t.prototype.remove=function(){if(this.empty)throw new Error("Buffer empty");return this._q.shift()},t}(),kA=function(){function t(e){if(e<1)throw new RangeError("Capacity may not be less than 1");this._c=e,this._q=[]}return Object.defineProperty(t.prototype,"empty",{get:function(){return this._q.length===0},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"full",{get:function(){return!1},enumerable:!1,configurable:!0}),t.prototype.add=function(e){for(;this._q.length>=this._c;)this._q.shift();this._q.push(e)},t.prototype.remove=function(){if(this.empty)throw new Error("Buffer empty");return this._q.shift()},t}(),CA=function(){function t(e){if(e<1)throw new RangeError("Capacity may not be less than 1");this._c=e,this._q=[]}return Object.defineProperty(t.prototype,"empty",{get:function(){return this._q.length===0},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"full",{get:function(){return!1},enumerable:!1,configurable:!0}),t.prototype.add=function(e){this._q.length<this._c&&this._q.push(e)},t.prototype.remove=function(){if(this.empty)throw new Error("Buffer empty");return this._q.shift()},t}();function ou(t){t!=null&&typeof t.then=="function"&&t.then(rs,rs)}var iu=0,Vh=1,Pr=2,es=3,au=4,ts=1024,rs=function(){};function Qr(t){var e=t.err,r=Promise.resolve(t.execution).then(function(n){if(e!=null)throw e;return n});return t.err=void 0,t.execution=r.then(function(){},function(){}),t.pending===void 0?r:t.pending.then(function(){return r})}function Sr(t,e){var r=t.state>=es;return Promise.resolve(e).then(function(n){return!r&&t.state>=au?Qr(t).then(function(i){return{value:i,done:!0}}):{value:n,done:r}})}function uu(t,e){var r,n;if(!(t.state>=Pr))if(t.state=Pr,t.onnext(),t.onstop(),t.err==null&&(t.err=e),t.pushes.length===0&&(typeof t.buffer>"u"||t.buffer.empty))Mn(t);else try{for(var i=Xr(t.pushes),s=i.next();!s.done;s=i.next()){var o=s.value;o.resolve()}}catch(a){r={error:a}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}}function Mn(t){var e,r;if(!(t.state>=es)){t.state<Pr&&uu(t),t.state=es,t.buffer=void 0;try{for(var n=Xr(t.nexts),i=n.next();!i.done;i=n.next()){var s=i.value,o=t.pending===void 0?Qr(t):t.pending.then(function(){return Qr(t)});s.resolve(Sr(t,o))}}catch(a){e={error:a}}finally{try{i&&!i.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}t.pushes=[],t.nexts=[]}}function Jh(t){t.state>=au||(t.state<es&&Mn(t),t.state=au)}function T1(t,e){if(ou(e),t.pushes.length>=ts)throw new Hh("No more than "+ts+" pending calls to push are allowed on a single repeater.");if(t.state>=Pr)return Promise.resolve(void 0);var r=t.pending===void 0?Promise.resolve(e):t.pending.then(function(){return e});r=r.catch(function(c){t.state<Pr&&(t.err=c),Jh(t)});var n;if(t.nexts.length){var i=t.nexts.shift();i.resolve(Sr(t,r)),t.nexts.length?n=Promise.resolve(t.nexts[0].value):typeof t.buffer<"u"&&!t.buffer.full?n=Promise.resolve(void 0):n=new Promise(function(c){return t.onnext=c})}else typeof t.buffer<"u"&&!t.buffer.full?(t.buffer.add(r),n=Promise.resolve(void 0)):n=new Promise(function(c){return t.pushes.push({resolve:c,value:r})});var s=!0,o={},a=n.catch(function(c){if(s)throw c});return o.then=function(c,d){return s=!1,Promise.prototype.then.call(n,c,d)},o.catch=function(c){return s=!1,Promise.prototype.catch.call(n,c)},o.finally=n.finally.bind(n),t.pending=r.then(function(){return a}).catch(function(c){t.err=c,Jh(t)}),o}function R1(t){var e=uu.bind(null,t),r=new Promise(function(n){return t.onstop=n});return e.then=r.then.bind(r),e.catch=r.catch.bind(r),e.finally=r.finally.bind(r),e}function q1(t){if(!(t.state>=Vh)){t.state=Vh;var e=T1.bind(null,t),r=R1(t);t.execution=new Promise(function(n){return n(t.executor(e,r))}),t.execution.catch(function(){return uu(t)})}}var Zi=new WeakMap,kt=function(){function t(e,r){Zi.set(this,{executor:e,buffer:r,err:void 0,state:iu,pushes:[],nexts:[],pending:void 0,execution:void 0,onnext:rs,onstop:rs})}return t.prototype.next=function(e){ou(e);var r=Zi.get(this);if(r===void 0)throw new Error("WeakMap error");if(r.nexts.length>=ts)throw new Hh("No more than "+ts+" pending calls to next are allowed on a single repeater.");if(r.state<=iu&&q1(r),r.onnext(e),typeof r.buffer<"u"&&!r.buffer.empty){var n=Sr(r,r.buffer.remove());if(r.pushes.length){var i=r.pushes.shift();r.buffer.add(i.value),r.onnext=i.resolve}return n}else if(r.pushes.length){var s=r.pushes.shift();return r.onnext=s.resolve,Sr(r,s.value)}else if(r.state>=Pr)return Mn(r),Sr(r,Qr(r));return new Promise(function(o){return r.nexts.push({resolve:o,value:e})})},t.prototype.return=function(e){ou(e);var r=Zi.get(this);if(r===void 0)throw new Error("WeakMap error");return Mn(r),r.execution=Promise.resolve(r.execution).then(function(){return e}),Sr(r,Qr(r))},t.prototype.throw=function(e){var r=Zi.get(this);if(r===void 0)throw new Error("WeakMap error");return r.state<=iu||r.state>=Pr||typeof r.buffer<"u"&&!r.buffer.empty?(Mn(r),r.err==null&&(r.err=e),Sr(r,Qr(r))):this.next(Promise.reject(e))},t.prototype[Symbol.asyncIterator]=function(){return this},t.race=k1,t.merge=C1,t.zip=x1,t.latest=N1,t}();function ns(t,e){var r,n,i=[],s=function(d){d!=null&&typeof d[Symbol.asyncIterator]=="function"?i.push(d[Symbol.asyncIterator]()):d!=null&&typeof d[Symbol.iterator]=="function"?i.push(d[Symbol.iterator]()):i.push(function(){return I1(this,arguments,function(){return Xt(this,function(y){switch(y.label){case 0:return e.yieldValues?[4,Un(d)]:[3,3];case 1:return[4,y.sent()];case 2:y.sent(),y.label=3;case 3:return e.returnValues?[4,Un(d)]:[3,5];case 4:return[2,y.sent()];case 5:return[2]}})})}())};try{for(var o=Xr(t),a=o.next();!a.done;a=o.next()){var c=a.value;s(c)}}catch(d){r={error:d}}finally{try{a&&!a.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return i}function k1(t){var e=this,r=ns(t,{returnValues:!0});return new kt(function(n,i){return Yr(e,void 0,void 0,function(){var s,o,a,c,d,m;return Xt(this,function(f){switch(f.label){case 0:if(!r.length)return i(),[2];o=!1,i.then(function(){s(),o=!0}),f.label=1;case 1:f.trys.push([1,,5,7]),c=void 0,d=0,m=function(){var y,_,b,P,S,g;return Xt(this,function(w){switch(w.label){case 0:y=d;try{for(_=(S=void 0,Xr(r)),b=_.next();!b.done;b=_.next())P=b.value,Promise.resolve(P.next()).then(function(p){p.done?(i(),a===void 0&&(a=p)):d===y&&(d++,s(p))},function(p){return i(p)})}catch(p){S={error:p}}finally{try{b&&!b.done&&(g=_.return)&&g.call(_)}finally{if(S)throw S.error}}return[4,new Promise(function(p){return s=p})];case 1:return c=w.sent(),c===void 0?[3,3]:[4,n(c.value)];case 2:w.sent(),w.label=3;case 3:return[2]}})},f.label=2;case 2:return o?[3,4]:[5,m()];case 3:return f.sent(),[3,2];case 4:return[2,a&&a.value];case 5:return i(),[4,Promise.race(r.map(function(y){return y.return&&y.return()}))];case 6:return f.sent(),[7];case 7:return[2]}})})})}function C1(t){var e=this,r=ns(t,{yieldValues:!0});return new kt(function(n,i){return Yr(e,void 0,void 0,function(){var s,o,a,c=this;return Xt(this,function(d){switch(d.label){case 0:if(!r.length)return i(),[2];s=[],o=!1,i.then(function(){var m,f;o=!0;try{for(var y=Xr(s),_=y.next();!_.done;_=y.next()){var b=_.value;b()}}catch(P){m={error:P}}finally{try{_&&!_.done&&(f=y.return)&&f.call(y)}finally{if(m)throw m.error}}}),d.label=1;case 1:return d.trys.push([1,,3,4]),[4,Promise.all(r.map(function(m,f){return Yr(c,void 0,void 0,function(){var y,_;return Xt(this,function(b){switch(b.label){case 0:b.trys.push([0,,6,9]),b.label=1;case 1:return o?[3,5]:(Promise.resolve(m.next()).then(function(P){return s[f](P)},function(P){return i(P)}),[4,new Promise(function(P){s[f]=P})]);case 2:return y=b.sent(),y===void 0?[3,4]:y.done?(a=y,[2]):[4,n(y.value)];case 3:b.sent(),b.label=4;case 4:return[3,1];case 5:return[3,9];case 6:return _=m.return,_?[4,m.return()]:[3,8];case 7:_=b.sent(),b.label=8;case 8:return[7];case 9:return[2]}})})}))];case 2:return d.sent(),[2,a&&a.value];case 3:return i(),[7];case 4:return[2]}})})})}function x1(t){var e=this,r=ns(t,{returnValues:!0});return new kt(function(n,i){return Yr(e,void 0,void 0,function(){var s,o,a,c;return Xt(this,function(d){switch(d.label){case 0:if(!r.length)return i(),[2,[]];o=!1,i.then(function(){s(),o=!0}),d.label=1;case 1:d.trys.push([1,,6,8]),d.label=2;case 2:return o?[3,5]:(Promise.all(r.map(function(m){return m.next()})).then(function(m){return s(m)},function(m){return i(m)}),[4,new Promise(function(m){return s=m})]);case 3:return a=d.sent(),a===void 0?[2]:(c=a.map(function(m){return m.value}),a.some(function(m){return m.done})?[2,c]:[4,n(c)]);case 4:return d.sent(),[3,2];case 5:return[3,8];case 6:return i(),[4,Promise.all(r.map(function(m){return m.return&&m.return()}))];case 7:return d.sent(),[7];case 8:return[2]}})})})}function N1(t){var e=this,r=ns(t,{yieldValues:!0,returnValues:!0});return new kt(function(n,i){return Yr(e,void 0,void 0,function(){var s,o,a,c,d,m=this;return Xt(this,function(f){switch(f.label){case 0:if(!r.length)return i(),[2,[]];o=[],a=!1,i.then(function(){var y,_;s();try{for(var b=Xr(o),P=b.next();!P.done;P=b.next()){var S=P.value;S()}}catch(g){y={error:g}}finally{try{P&&!P.done&&(_=b.return)&&_.call(b)}finally{if(y)throw y.error}}a=!0}),f.label=1;case 1:return f.trys.push([1,,5,7]),Promise.all(r.map(function(y){return y.next()})).then(function(y){return s(y)},function(y){return i(y)}),[4,new Promise(function(y){return s=y})];case 2:return c=f.sent(),c===void 0?[2]:(d=c.map(function(y){return y.value}),c.every(function(y){return y.done})?[2,d]:[4,n(d.slice())]);case 3:return f.sent(),[4,Promise.all(r.map(function(y,_){return Yr(m,void 0,void 0,function(){var b;return Xt(this,function(P){switch(P.label){case 0:if(c[_].done)return[2,c[_].value];P.label=1;case 1:return a?[3,4]:(Promise.resolve(y.next()).then(function(S){return o[_](S)},function(S){return i(S)}),[4,new Promise(function(S){return o[_]=S})]);case 2:return b=P.sent(),b===void 0?[2,c[_].value]:b.done?[2,b.value]:(d[_]=b.value,[4,n(d.slice())]);case 3:return P.sent(),[3,1];case 4:return[2]}})})}))];case 4:return[2,f.sent()];case 5:return i(),[4,Promise.all(r.map(function(y){return y.return&&y.return()}))];case 6:return f.sent(),[7];case 7:return[2]}})})})}var Yh=en(Ri());I();R();T();var cu={};hs(cu,{JsonPatchError:()=>Ne,_areEquals:()=>zn,applyOperation:()=>Or,applyPatch:()=>Zt,applyReducer:()=>M1,deepClone:()=>B1,getValueByPointer:()=>us,validate:()=>Qh,validator:()=>cs});I();R();T();I();R();T();var j1=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var s in i)i.hasOwnProperty(s)&&(n[s]=i[s])},t(e,r)};return function(e,r){t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),D1=Object.prototype.hasOwnProperty;function ss(t,e){return D1.call(t,e)}function os(t){if(Array.isArray(t)){for(var e=new Array(t.length),r=0;r<e.length;r++)e[r]=""+r;return e}if(Object.keys)return Object.keys(t);var n=[];for(var i in t)ss(t,i)&&n.push(i);return n}function He(t){switch(typeof t){case"object":return JSON.parse(JSON.stringify(t));case"undefined":return null;default:return t}}function as(t){for(var e=0,r=t.length,n;e<r;){if(n=t.charCodeAt(e),n>=48&&n<=57){e++;continue}return!1}return!0}function Ct(t){return t.indexOf("/")===-1&&t.indexOf("~")===-1?t:t.replace(/~/g,"~0").replace(/\//g,"~1")}function Gn(t){return t.replace(/~1/g,"/").replace(/~0/g,"~")}function is(t){if(t===void 0)return!0;if(t){if(Array.isArray(t)){for(var e=0,r=t.length;e<r;e++)if(is(t[e]))return!0}else if(typeof t=="object"){for(var n=os(t),i=n.length,s=0;s<i;s++)if(is(t[n[s]]))return!0}}return!1}function Wh(t,e){var r=[t];for(var n in e){var i=typeof e[n]=="object"?JSON.stringify(e[n],null,2):e[n];typeof i<"u"&&r.push(n+": "+i)}return r.join(`
17
- `)}var Fn=function(t){j1(e,t);function e(r,n,i,s,o){var a=this.constructor,c=t.call(this,Wh(r,{name:n,index:i,operation:s,tree:o}))||this;return c.name=n,c.index=i,c.operation=s,c.tree=o,Object.setPrototypeOf(c,a.prototype),c.message=Wh(r,{name:n,index:i,operation:s,tree:o}),c}return e}(Error);var Ne=Fn,B1=He,Zr={add:function(t,e,r){return t[e]=this.value,{newDocument:r}},remove:function(t,e,r){var n=t[e];return delete t[e],{newDocument:r,removed:n}},replace:function(t,e,r){var n=t[e];return t[e]=this.value,{newDocument:r,removed:n}},move:function(t,e,r){var n=us(r,this.path);n&&(n=He(n));var i=Or(r,{op:"remove",path:this.from}).removed;return Or(r,{op:"add",path:this.path,value:i}),{newDocument:r,removed:n}},copy:function(t,e,r){var n=us(r,this.from);return Or(r,{op:"add",path:this.path,value:He(n)}),{newDocument:r}},test:function(t,e,r){return{newDocument:r,test:zn(t[e],this.value)}},_get:function(t,e,r){return this.value=t[e],{newDocument:r}}},L1={add:function(t,e,r){return as(e)?t.splice(e,0,this.value):t[e]=this.value,{newDocument:r,index:e}},remove:function(t,e,r){var n=t.splice(e,1);return{newDocument:r,removed:n[0]}},replace:function(t,e,r){var n=t[e];return t[e]=this.value,{newDocument:r,removed:n}},move:Zr.move,copy:Zr.copy,test:Zr.test,_get:Zr._get};function us(t,e){if(e=="")return t;var r={op:"_get",path:e};return Or(t,r),r.value}function Or(t,e,r,n,i,s){if(r===void 0&&(r=!1),n===void 0&&(n=!0),i===void 0&&(i=!0),s===void 0&&(s=0),r&&(typeof r=="function"?r(e,0,t,e.path):cs(e,0)),e.path===""){var o={newDocument:t};if(e.op==="add")return o.newDocument=e.value,o;if(e.op==="replace")return o.newDocument=e.value,o.removed=t,o;if(e.op==="move"||e.op==="copy")return o.newDocument=us(t,e.from),e.op==="move"&&(o.removed=t),o;if(e.op==="test"){if(o.test=zn(t,e.value),o.test===!1)throw new Ne("Test operation failed","TEST_OPERATION_FAILED",s,e,t);return o.newDocument=t,o}else{if(e.op==="remove")return o.removed=t,o.newDocument=null,o;if(e.op==="_get")return e.value=t,o;if(r)throw new Ne("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",s,e,t);return o}}else{n||(t=He(t));var a=e.path||"",c=a.split("/"),d=t,m=1,f=c.length,y=void 0,_=void 0,b=void 0;for(typeof r=="function"?b=r:b=cs;;){if(_=c[m],_&&_.indexOf("~")!=-1&&(_=Gn(_)),i&&(_=="__proto__"||_=="prototype"&&m>0&&c[m-1]=="constructor"))throw new TypeError("JSON-Patch: modifying `__proto__` or `constructor/prototype` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README");if(r&&y===void 0&&(d[_]===void 0?y=c.slice(0,m).join("/"):m==f-1&&(y=e.path),y!==void 0&&b(e,0,t,y)),m++,Array.isArray(d)){if(_==="-")_=d.length;else{if(r&&!as(_))throw new Ne("Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index","OPERATION_PATH_ILLEGAL_ARRAY_INDEX",s,e,t);as(_)&&(_=~~_)}if(m>=f){if(r&&e.op==="add"&&_>d.length)throw new Ne("The specified index MUST NOT be greater than the number of elements in the array","OPERATION_VALUE_OUT_OF_BOUNDS",s,e,t);var o=L1[e.op].call(e,d,_,t);if(o.test===!1)throw new Ne("Test operation failed","TEST_OPERATION_FAILED",s,e,t);return o}}else if(m>=f){var o=Zr[e.op].call(e,d,_,t);if(o.test===!1)throw new Ne("Test operation failed","TEST_OPERATION_FAILED",s,e,t);return o}if(d=d[_],r&&m<f&&(!d||typeof d!="object"))throw new Ne("Cannot perform operation at the desired path","OPERATION_PATH_UNRESOLVABLE",s,e,t)}}}function Zt(t,e,r,n,i){if(n===void 0&&(n=!0),i===void 0&&(i=!0),r&&!Array.isArray(e))throw new Ne("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");n||(t=He(t));for(var s=new Array(e.length),o=0,a=e.length;o<a;o++)s[o]=Or(t,e[o],r,!0,i,o),t=s[o].newDocument;return s.newDocument=t,s}function M1(t,e,r){var n=Or(t,e);if(n.test===!1)throw new Ne("Test operation failed","TEST_OPERATION_FAILED",r,e,t);return n.newDocument}function cs(t,e,r,n){if(typeof t!="object"||t===null||Array.isArray(t))throw new Ne("Operation is not an object","OPERATION_NOT_AN_OBJECT",e,t,r);if(Zr[t.op]){if(typeof t.path!="string")throw new Ne("Operation `path` property is not a string","OPERATION_PATH_INVALID",e,t,r);if(t.path.indexOf("/")!==0&&t.path.length>0)throw new Ne('Operation `path` property must start with "/"',"OPERATION_PATH_INVALID",e,t,r);if((t.op==="move"||t.op==="copy")&&typeof t.from!="string")throw new Ne("Operation `from` property is not present (applicable in `move` and `copy` operations)","OPERATION_FROM_REQUIRED",e,t,r);if((t.op==="add"||t.op==="replace"||t.op==="test")&&t.value===void 0)throw new Ne("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_REQUIRED",e,t,r);if((t.op==="add"||t.op==="replace"||t.op==="test")&&is(t.value))throw new Ne("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED",e,t,r);if(r){if(t.op=="add"){var i=t.path.split("/").length,s=n.split("/").length;if(i!==s+1&&i!==s)throw new Ne("Cannot perform an `add` operation at the desired path","OPERATION_PATH_CANNOT_ADD",e,t,r)}else if(t.op==="replace"||t.op==="remove"||t.op==="_get"){if(t.path!==n)throw new Ne("Cannot perform the operation at a path that does not exist","OPERATION_PATH_UNRESOLVABLE",e,t,r)}else if(t.op==="move"||t.op==="copy"){var o={op:"_get",path:t.from,value:void 0},a=Qh([o],r);if(a&&a.name==="OPERATION_PATH_UNRESOLVABLE")throw new Ne("Cannot perform the operation from a path that does not exist","OPERATION_FROM_UNRESOLVABLE",e,t,r)}}}else throw new Ne("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",e,t,r)}function Qh(t,e,r){try{if(!Array.isArray(t))throw new Ne("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");if(e)Zt(He(e),He(t),r||!0);else{r=r||cs;for(var n=0;n<t.length;n++)r(t[n],n,e,void 0)}}catch(i){if(i instanceof Ne)return i;throw i}}function zn(t,e){if(t===e)return!0;if(t&&e&&typeof t=="object"&&typeof e=="object"){var r=Array.isArray(t),n=Array.isArray(e),i,s,o;if(r&&n){if(s=t.length,s!=e.length)return!1;for(i=s;i--!==0;)if(!zn(t[i],e[i]))return!1;return!0}if(r!=n)return!1;var a=Object.keys(t);if(s=a.length,s!==Object.keys(e).length)return!1;for(i=s;i--!==0;)if(!e.hasOwnProperty(a[i]))return!1;for(i=s;i--!==0;)if(o=a[i],!zn(t[o],e[o]))return!1;return!0}return t!==t&&e!==e}var hu={};hs(hu,{compare:()=>H1,generate:()=>fu,observe:()=>J1,unobserve:()=>V1});I();R();T();var lu=new WeakMap,U1=function(){function t(e){this.observers=new Map,this.obj=e}return t}(),G1=function(){function t(e,r){this.callback=e,this.observer=r}return t}();function F1(t){return lu.get(t)}function z1(t,e){return t.observers.get(e)}function K1(t,e){t.observers.delete(e.callback)}function V1(t,e){e.unobserve()}function J1(t,e){var r=[],n,i=F1(t);if(!i)i=new U1(t),lu.set(t,i);else{var s=z1(i,e);n=s&&s.observer}if(n)return n;if(n={},i.value=He(t),e){n.callback=e,n.next=null;var o=function(){fu(n)},a=function(){clearTimeout(n.next),n.next=setTimeout(o)};typeof window<"u"&&(window.addEventListener("mouseup",a),window.addEventListener("keyup",a),window.addEventListener("mousedown",a),window.addEventListener("keydown",a),window.addEventListener("change",a))}return n.patches=r,n.object=t,n.unobserve=function(){fu(n),clearTimeout(n.next),K1(i,n),typeof window<"u"&&(window.removeEventListener("mouseup",a),window.removeEventListener("keyup",a),window.removeEventListener("mousedown",a),window.removeEventListener("keydown",a),window.removeEventListener("change",a))},i.observers.set(e,new G1(e,n)),n}function fu(t,e){e===void 0&&(e=!1);var r=lu.get(t.object);du(r.value,t.object,t.patches,"",e),t.patches.length&&Zt(r.value,t.patches);var n=t.patches;return n.length>0&&(t.patches=[],t.callback&&t.callback(n)),n}function du(t,e,r,n,i){if(e!==t){typeof e.toJSON=="function"&&(e=e.toJSON());for(var s=os(e),o=os(t),a=!1,c=!1,d=o.length-1;d>=0;d--){var m=o[d],f=t[m];if(ss(e,m)&&!(e[m]===void 0&&f!==void 0&&Array.isArray(e)===!1)){var y=e[m];typeof f=="object"&&f!=null&&typeof y=="object"&&y!=null&&Array.isArray(f)===Array.isArray(y)?du(f,y,r,n+"/"+Ct(m),i):f!==y&&(a=!0,i&&r.push({op:"test",path:n+"/"+Ct(m),value:He(f)}),r.push({op:"replace",path:n+"/"+Ct(m),value:He(y)}))}else Array.isArray(t)===Array.isArray(e)?(i&&r.push({op:"test",path:n+"/"+Ct(m),value:He(f)}),r.push({op:"remove",path:n+"/"+Ct(m)}),c=!0):(i&&r.push({op:"test",path:n,value:t}),r.push({op:"replace",path:n,value:e}),a=!0)}if(!(!c&&s.length==o.length))for(var d=0;d<s.length;d++){var m=s[d];!ss(t,m)&&e[m]!==void 0&&r.push({op:"add",path:n+"/"+Ct(m),value:He(e[m])})}}}function H1(t,e,r){r===void 0&&(r=!1);var n=[];return du(t,e,n,"",r),n}var XA=Object.assign({},cu,hu,{JsonPatchError:Fn,deepClone:He,escapePathComponent:Ct,unescapePathComponent:Gn});var fs=class{db;source="local";tombstoneRetention=864e5;ajv;constructor(e,r){this.ajv=r??new Yh.default({strict:!1}),this.source=e?.sourceName??this.source,this.tombstoneRetention=e?.tombstoneRetention??this.tombstoneRetention;let n={name:"graffitiDb",...e?.pouchDBOptions};this.db=new zh(n.name,n),this.db.put({_id:"_design/indexes",views:{objectsPerChannelAndLastModified:{map:function(i){let s=i.lastModified.toString().padStart(15,"0");i.channels.forEach(function(o){let a=encodeURIComponent(o)+"/"+s;emit(a)})}.toString()},orphansPerActorAndLastModified:{map:function(i){if(i.channels.length===0){let s=i.lastModified.toString().padStart(15,"0"),o=encodeURIComponent(i.actor)+"/"+s;emit(o)}}.toString()},channelStatsPerActor:{map:function(i){i.tombstone||i.channels.forEach(function(s){let o=encodeURIComponent(i.actor)+"/"+encodeURIComponent(s);emit(o,i.lastModified)})}.toString(),reduce:"_stats"}}}).catch(i=>{if(!(i&&typeof i=="object"&&"name"in i&&i.name==="conflict"))throw i})}async queryByLocation(e){let r=Yt(e)+"/";return(await this.db.allDocs({startkey:r,endkey:r+"\uFFFF",include_docs:!0})).rows.map(s=>s.doc).reduce((s,o)=>(o&&s.push(o),s),[])}docId(e){return Yt(e)+"/"+nu()}get=async(...e)=>{let[r,n,i]=e,{location:s}=Hr(r),a=(await this.queryByLocation(s)).filter(_=>Ln(_,i));if(!a.length)throw new Wn;let c=a.reduce((_,b)=>Kh(_,b)?_:b),{_id:d,_rev:m,...f}=c;if(Bn(f,[],i),!Wr(this.ajv,n)(f))throw new Gc;return f};async deleteAtLocation(e,r=!1){let i=(await this.queryByLocation(e)).filter(f=>!f.tombstone);if(!i.length)return;let s=i.map(f=>f.lastModified).reduce((f,y)=>f>y?f:y),o=i.filter(f=>!r||f.lastModified<s),a=i.filter(f=>r&&f.lastModified===s);if(a.length){let f=a.map(_=>_._id).reduce((_,b)=>_>b?_:b),y=a.filter(_=>_._id!==f);o.push(...y)}let c=r?s:new Date().getTime(),d=await this.db.bulkDocs(o.map(f=>({...f,tombstone:!0,lastModified:c}))),m;for(let f of d)if("ok"in f){let{id:y}=f,_=o.find(b=>b._id===y);if(_){let{_id:b,_rev:P,_conflicts:S,_attachments:g,...w}=_;m={...w,tombstone:!0,lastModified:c};break}}return m}delete=async(...e)=>{let[r,n]=e,{location:i}=Hr(r);if(i.actor!==n.actor)throw new rn;let s=await this.deleteAtLocation(i);if(!s)throw new Wn;return s};put=async(...e)=>{let[r,n]=e;if(r.actor&&r.actor!==n.actor)throw new rn;if(r.source&&r.source!==this.source)throw new rn("Putting an object that does not match this source");let i={value:r.value,channels:r.channels,allowed:r.allowed,name:r.name??nu(),source:this.source,actor:n.actor,tombstone:!1,lastModified:new Date().getTime()};await this.db.put({_id:this.docId(i),...i});let s=await this.deleteAtLocation(i,!0);return s||{...i,value:{},channels:[],allowed:void 0,tombstone:!0}};patch=async(...e)=>{let[r,n,i]=e,{location:s}=Hr(n);if(s.actor!==i.actor)throw new rn;let o=await this.get(n,{},i);if(o.tombstone)throw new Wn("The object you are trying to patch has been deleted");let a={...o};for(let c of["value","channels","allowed"])Xi(Zt,c,r,a);if(typeof a.value!="object"||Array.isArray(a.value)||!a.value)throw new Tr("value is no longer an object");if(!Array.isArray(a.channels)||!a.channels.every(c=>typeof c=="string"))throw new Tr("channels are no longer an array of strings");if(a.allowed&&(!Array.isArray(a.allowed)||!a.allowed.every(c=>typeof c=="string")))throw new Tr("allowed list is not an array of strings");return a.lastModified=new Date().getTime(),await this.db.put({...a,_id:this.docId(a)}),await this.deleteAtLocation(a,!0),{...o,tombstone:!0,lastModified:a.lastModified}};queryLastModifiedSuffixes(e){let r="",n="\uFFFF",i=e.properties?.lastModified;if(i?.minimum){let s=Math.ceil(i.minimum);s===i.minimum&&i.exclusiveMinimum&&s++,r=s.toString().padStart(15,"0")}if(i?.maximum){let s=Math.floor(i.maximum);s===i.maximum&&i.exclusiveMaximum&&s--,n=s.toString().padStart(15,"0")}return{startKeySuffix:r,endKeySuffix:n}}discover=(...e)=>{let[r,n,i]=e,s=Wr(this.ajv,n),{startKeySuffix:o,endKeySuffix:a}=this.queryLastModifiedSuffixes(n);return new kt(async(d,m)=>{let f=new Set;for(let y of r){let _=encodeURIComponent(y)+"/",b=_+o,P=_+a,S=await this.db.query("indexes/objectsPerChannelAndLastModified",{startkey:b,endkey:P,include_docs:!0});for(let g of S.rows){let w=g.doc;if(!w)continue;let{_id:p,_rev:h,...v}=w;f.has(p)||(f.add(p),Ln(w,i)&&(Bn(v,r,i),s(v)&&await d({value:v})))}}return m(),{tombstoneRetention:this.tombstoneRetention}})};recoverOrphans=(e,r)=>{let n=Wr(this.ajv,e),{startKeySuffix:i,endKeySuffix:s}=this.queryLastModifiedSuffixes(e),o=encodeURIComponent(r.actor)+"/",a=o+i,c=o+s;return new kt(async(m,f)=>{let y=await this.db.query("indexes/orphansPerActorAndLastModified",{startkey:a,endkey:c,include_docs:!0});for(let _ of y.rows){let b=_.doc;if(!b)continue;let{_id:P,_rev:S,...g}=b;n(g)&&await m({value:g})}return f(),{tombstoneRetention:this.tombstoneRetention}})};channelStats=e=>new kt(async(n,i)=>{let s=encodeURIComponent(e.actor)+"/",o=await this.db.query("indexes/channelStatsPerActor",{startkey:s,endkey:s+"\uFFFF",reduce:!0,group:!0});for(let a of o.rows){let c=a.key.split("/")[1];if(typeof c!="string")continue;let{count:d,max:m}=a.value;typeof d!="number"||typeof m!="number"||await n({value:{channel:decodeURIComponent(c),count:d,lastModified:m}})}i()})};I();R();T();var Xh=en(Ri());var ls=class{ajv;graffiti;callbacks=new Set;constructor(e,r){this.ajv=r??new Xh.default({strict:!1}),this.graffiti=e}async synchronizeDispatch(e,r){for(let n of this.callbacks)n(e,r);await Promise.resolve(),await Promise.resolve(),await Promise.resolve()}get=async(...e)=>{let r=await this.graffiti.get(...e);return this.synchronizeDispatch(r),r};put=async(...e)=>{let r=await this.graffiti.put(...e),n=e[0],i={...r,value:n.value,channels:n.channels,allowed:n.allowed,tombstone:!1};return await this.synchronizeDispatch(r,i),r};patch=async(...e)=>{let r=await this.graffiti.patch(...e),n={...r};n.tombstone=!1;for(let i of["value","channels","allowed"])Xi(Zt,i,e[0],n);return await this.synchronizeDispatch(r,n),r};delete=async(...e)=>{let r=await this.graffiti.delete(...e);return await this.synchronizeDispatch(r),r};objectStream(e){let r=this.synchronizeDispatch.bind(this);return async function*(){let i=await e.next();for(;!i.done;)i.value.error||r(i.value.value),yield i.value,i=await e.next();return i.value}()}discover=(...e)=>{let r=this.graffiti.discover(...e);return this.objectStream(r)};recoverOrphans=(...e)=>{let r=this.graffiti.recoverOrphans(...e);return this.objectStream(r)};synchronize(e,r,n,i){let s=Wr(this.ajv,n);return new kt(async(a,c)=>{let d=async(m,f)=>{for(let y of[f,m])if(y&&e(y)&&Ln(y,i)){let _={...y};if(Bn(_,r,i),s(_)){a({value:_});break}}};this.callbacks.add(d),await c,this.callbacks.delete(d)})}synchronizeDiscover=(...e)=>{let[r,n,i]=e;function s(o){return o.channels.some(a=>r.includes(a))}return this.synchronize(s,r,n,i)};synchronizeGet=(...e)=>{let[r,n,i]=e;function s(o){let a=Yt(o),{uri:c}=Hr(r);return a===c}return this.synchronize(s,[],n,i)};synchronizeRecoverOrphans=(...e)=>{let[r,n]=e;function i(s){return s.actor===n.actor&&s.channels.length===0}return this.synchronize(i,[],r,n)}};var Zh=class extends Dc{locationToUri=Yt;uriToLocation=ru;login;logout;sessionEvents;put;get;patch;delete;discover;recoverOrphans;synchronizeGet;synchronizeDiscover;synchronizeRecoverOrphans;channelStats;constructor(e){super();let r=new qi;this.login=r.login.bind(r),this.logout=r.logout.bind(r),this.sessionEvents=r.sessionEvents;let n=new ep.default({strict:!1}),i=new fs(e,n),s=new ls(i,n);this.put=s.put.bind(s),this.get=s.get.bind(s),this.patch=s.patch.bind(s),this.delete=s.delete.bind(s),this.discover=s.discover.bind(s),this.recoverOrphans=s.recoverOrphans.bind(i),this.channelStats=i.channelStats.bind(i),this.synchronizeDiscover=s.synchronizeDiscover.bind(s),this.synchronizeGet=s.synchronizeGet.bind(s),this.synchronizeRecoverOrphans=s.synchronizeRecoverOrphans.bind(s)}};export{Zh as GraffitiLocal};
17
+ `)}var Fn=function(t){j1(e,t);function e(r,n,i,s,o){var a=this.constructor,c=t.call(this,Wh(r,{name:n,index:i,operation:s,tree:o}))||this;return c.name=n,c.index=i,c.operation=s,c.tree=o,Object.setPrototypeOf(c,a.prototype),c.message=Wh(r,{name:n,index:i,operation:s,tree:o}),c}return e}(Error);var Ne=Fn,B1=He,Zr={add:function(t,e,r){return t[e]=this.value,{newDocument:r}},remove:function(t,e,r){var n=t[e];return delete t[e],{newDocument:r,removed:n}},replace:function(t,e,r){var n=t[e];return t[e]=this.value,{newDocument:r,removed:n}},move:function(t,e,r){var n=us(r,this.path);n&&(n=He(n));var i=Or(r,{op:"remove",path:this.from}).removed;return Or(r,{op:"add",path:this.path,value:i}),{newDocument:r,removed:n}},copy:function(t,e,r){var n=us(r,this.from);return Or(r,{op:"add",path:this.path,value:He(n)}),{newDocument:r}},test:function(t,e,r){return{newDocument:r,test:zn(t[e],this.value)}},_get:function(t,e,r){return this.value=t[e],{newDocument:r}}},L1={add:function(t,e,r){return as(e)?t.splice(e,0,this.value):t[e]=this.value,{newDocument:r,index:e}},remove:function(t,e,r){var n=t.splice(e,1);return{newDocument:r,removed:n[0]}},replace:function(t,e,r){var n=t[e];return t[e]=this.value,{newDocument:r,removed:n}},move:Zr.move,copy:Zr.copy,test:Zr.test,_get:Zr._get};function us(t,e){if(e=="")return t;var r={op:"_get",path:e};return Or(t,r),r.value}function Or(t,e,r,n,i,s){if(r===void 0&&(r=!1),n===void 0&&(n=!0),i===void 0&&(i=!0),s===void 0&&(s=0),r&&(typeof r=="function"?r(e,0,t,e.path):cs(e,0)),e.path===""){var o={newDocument:t};if(e.op==="add")return o.newDocument=e.value,o;if(e.op==="replace")return o.newDocument=e.value,o.removed=t,o;if(e.op==="move"||e.op==="copy")return o.newDocument=us(t,e.from),e.op==="move"&&(o.removed=t),o;if(e.op==="test"){if(o.test=zn(t,e.value),o.test===!1)throw new Ne("Test operation failed","TEST_OPERATION_FAILED",s,e,t);return o.newDocument=t,o}else{if(e.op==="remove")return o.removed=t,o.newDocument=null,o;if(e.op==="_get")return e.value=t,o;if(r)throw new Ne("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",s,e,t);return o}}else{n||(t=He(t));var a=e.path||"",c=a.split("/"),d=t,m=1,f=c.length,y=void 0,_=void 0,b=void 0;for(typeof r=="function"?b=r:b=cs;;){if(_=c[m],_&&_.indexOf("~")!=-1&&(_=Gn(_)),i&&(_=="__proto__"||_=="prototype"&&m>0&&c[m-1]=="constructor"))throw new TypeError("JSON-Patch: modifying `__proto__` or `constructor/prototype` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README");if(r&&y===void 0&&(d[_]===void 0?y=c.slice(0,m).join("/"):m==f-1&&(y=e.path),y!==void 0&&b(e,0,t,y)),m++,Array.isArray(d)){if(_==="-")_=d.length;else{if(r&&!as(_))throw new Ne("Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index","OPERATION_PATH_ILLEGAL_ARRAY_INDEX",s,e,t);as(_)&&(_=~~_)}if(m>=f){if(r&&e.op==="add"&&_>d.length)throw new Ne("The specified index MUST NOT be greater than the number of elements in the array","OPERATION_VALUE_OUT_OF_BOUNDS",s,e,t);var o=L1[e.op].call(e,d,_,t);if(o.test===!1)throw new Ne("Test operation failed","TEST_OPERATION_FAILED",s,e,t);return o}}else if(m>=f){var o=Zr[e.op].call(e,d,_,t);if(o.test===!1)throw new Ne("Test operation failed","TEST_OPERATION_FAILED",s,e,t);return o}if(d=d[_],r&&m<f&&(!d||typeof d!="object"))throw new Ne("Cannot perform operation at the desired path","OPERATION_PATH_UNRESOLVABLE",s,e,t)}}}function Zt(t,e,r,n,i){if(n===void 0&&(n=!0),i===void 0&&(i=!0),r&&!Array.isArray(e))throw new Ne("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");n||(t=He(t));for(var s=new Array(e.length),o=0,a=e.length;o<a;o++)s[o]=Or(t,e[o],r,!0,i,o),t=s[o].newDocument;return s.newDocument=t,s}function M1(t,e,r){var n=Or(t,e);if(n.test===!1)throw new Ne("Test operation failed","TEST_OPERATION_FAILED",r,e,t);return n.newDocument}function cs(t,e,r,n){if(typeof t!="object"||t===null||Array.isArray(t))throw new Ne("Operation is not an object","OPERATION_NOT_AN_OBJECT",e,t,r);if(Zr[t.op]){if(typeof t.path!="string")throw new Ne("Operation `path` property is not a string","OPERATION_PATH_INVALID",e,t,r);if(t.path.indexOf("/")!==0&&t.path.length>0)throw new Ne('Operation `path` property must start with "/"',"OPERATION_PATH_INVALID",e,t,r);if((t.op==="move"||t.op==="copy")&&typeof t.from!="string")throw new Ne("Operation `from` property is not present (applicable in `move` and `copy` operations)","OPERATION_FROM_REQUIRED",e,t,r);if((t.op==="add"||t.op==="replace"||t.op==="test")&&t.value===void 0)throw new Ne("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_REQUIRED",e,t,r);if((t.op==="add"||t.op==="replace"||t.op==="test")&&is(t.value))throw new Ne("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED",e,t,r);if(r){if(t.op=="add"){var i=t.path.split("/").length,s=n.split("/").length;if(i!==s+1&&i!==s)throw new Ne("Cannot perform an `add` operation at the desired path","OPERATION_PATH_CANNOT_ADD",e,t,r)}else if(t.op==="replace"||t.op==="remove"||t.op==="_get"){if(t.path!==n)throw new Ne("Cannot perform the operation at a path that does not exist","OPERATION_PATH_UNRESOLVABLE",e,t,r)}else if(t.op==="move"||t.op==="copy"){var o={op:"_get",path:t.from,value:void 0},a=Qh([o],r);if(a&&a.name==="OPERATION_PATH_UNRESOLVABLE")throw new Ne("Cannot perform the operation from a path that does not exist","OPERATION_FROM_UNRESOLVABLE",e,t,r)}}}else throw new Ne("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",e,t,r)}function Qh(t,e,r){try{if(!Array.isArray(t))throw new Ne("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");if(e)Zt(He(e),He(t),r||!0);else{r=r||cs;for(var n=0;n<t.length;n++)r(t[n],n,e,void 0)}}catch(i){if(i instanceof Ne)return i;throw i}}function zn(t,e){if(t===e)return!0;if(t&&e&&typeof t=="object"&&typeof e=="object"){var r=Array.isArray(t),n=Array.isArray(e),i,s,o;if(r&&n){if(s=t.length,s!=e.length)return!1;for(i=s;i--!==0;)if(!zn(t[i],e[i]))return!1;return!0}if(r!=n)return!1;var a=Object.keys(t);if(s=a.length,s!==Object.keys(e).length)return!1;for(i=s;i--!==0;)if(!e.hasOwnProperty(a[i]))return!1;for(i=s;i--!==0;)if(o=a[i],!zn(t[o],e[o]))return!1;return!0}return t!==t&&e!==e}var hu={};hs(hu,{compare:()=>H1,generate:()=>fu,observe:()=>J1,unobserve:()=>V1});I();R();T();var lu=new WeakMap,U1=function(){function t(e){this.observers=new Map,this.obj=e}return t}(),G1=function(){function t(e,r){this.callback=e,this.observer=r}return t}();function F1(t){return lu.get(t)}function z1(t,e){return t.observers.get(e)}function K1(t,e){t.observers.delete(e.callback)}function V1(t,e){e.unobserve()}function J1(t,e){var r=[],n,i=F1(t);if(!i)i=new U1(t),lu.set(t,i);else{var s=z1(i,e);n=s&&s.observer}if(n)return n;if(n={},i.value=He(t),e){n.callback=e,n.next=null;var o=function(){fu(n)},a=function(){clearTimeout(n.next),n.next=setTimeout(o)};typeof window<"u"&&(window.addEventListener("mouseup",a),window.addEventListener("keyup",a),window.addEventListener("mousedown",a),window.addEventListener("keydown",a),window.addEventListener("change",a))}return n.patches=r,n.object=t,n.unobserve=function(){fu(n),clearTimeout(n.next),K1(i,n),typeof window<"u"&&(window.removeEventListener("mouseup",a),window.removeEventListener("keyup",a),window.removeEventListener("mousedown",a),window.removeEventListener("keydown",a),window.removeEventListener("change",a))},i.observers.set(e,new G1(e,n)),n}function fu(t,e){e===void 0&&(e=!1);var r=lu.get(t.object);du(r.value,t.object,t.patches,"",e),t.patches.length&&Zt(r.value,t.patches);var n=t.patches;return n.length>0&&(t.patches=[],t.callback&&t.callback(n)),n}function du(t,e,r,n,i){if(e!==t){typeof e.toJSON=="function"&&(e=e.toJSON());for(var s=os(e),o=os(t),a=!1,c=!1,d=o.length-1;d>=0;d--){var m=o[d],f=t[m];if(ss(e,m)&&!(e[m]===void 0&&f!==void 0&&Array.isArray(e)===!1)){var y=e[m];typeof f=="object"&&f!=null&&typeof y=="object"&&y!=null&&Array.isArray(f)===Array.isArray(y)?du(f,y,r,n+"/"+Ct(m),i):f!==y&&(a=!0,i&&r.push({op:"test",path:n+"/"+Ct(m),value:He(f)}),r.push({op:"replace",path:n+"/"+Ct(m),value:He(y)}))}else Array.isArray(t)===Array.isArray(e)?(i&&r.push({op:"test",path:n+"/"+Ct(m),value:He(f)}),r.push({op:"remove",path:n+"/"+Ct(m)}),c=!0):(i&&r.push({op:"test",path:n,value:t}),r.push({op:"replace",path:n,value:e}),a=!0)}if(!(!c&&s.length==o.length))for(var d=0;d<s.length;d++){var m=s[d];!ss(t,m)&&e[m]!==void 0&&r.push({op:"add",path:n+"/"+Ct(m),value:He(e[m])})}}}function H1(t,e,r){r===void 0&&(r=!1);var n=[];return du(t,e,n,"",r),n}var XA=Object.assign({},cu,hu,{JsonPatchError:Fn,deepClone:He,escapePathComponent:Ct,unescapePathComponent:Gn});var fs=class{db;source="local";tombstoneRetention=864e5;ajv;constructor(e,r){this.ajv=r??new Yh.default({strict:!1}),this.source=e?.sourceName??this.source,this.tombstoneRetention=e?.tombstoneRetention??this.tombstoneRetention;let n={name:"graffitiDb",...e?.pouchDBOptions};this.db=new zh(n.name,n),this.db.put({_id:"_design/indexes",views:{objectsPerChannelAndLastModified:{map:function(i){let s=i.lastModified.toString().padStart(15,"0");i.channels.forEach(function(o){let a=encodeURIComponent(o)+"/"+s;emit(a)})}.toString()},orphansPerActorAndLastModified:{map:function(i){if(i.channels.length===0){let s=i.lastModified.toString().padStart(15,"0"),o=encodeURIComponent(i.actor)+"/"+s;emit(o)}}.toString()},channelStatsPerActor:{map:function(i){i.tombstone||i.channels.forEach(function(s){let o=encodeURIComponent(i.actor)+"/"+encodeURIComponent(s);emit(o,i.lastModified)})}.toString(),reduce:"_stats"}}}).catch(i=>{if(!(i&&typeof i=="object"&&"name"in i&&i.name==="conflict"))throw i})}async queryByLocation(e){let r=Yt(e)+"/";return(await this.db.allDocs({startkey:r,endkey:r+"\uFFFF",include_docs:!0})).rows.map(s=>s.doc).reduce((s,o)=>(o&&s.push(o),s),[])}docId(e){return Yt(e)+"/"+nu()}get=async(...e)=>{let[r,n,i]=e,{location:s}=Hr(r),a=(await this.queryByLocation(s)).filter(_=>Ln(_,i));if(!a.length)throw new Wn;let c=a.reduce((_,b)=>Kh(_,b)?_:b),{_id:d,_rev:m,...f}=c;if(Bn(f,[],i),!Wr(this.ajv,n)(f))throw new Gc;return f};async deleteAtLocation(e,r=!1){let i=(await this.queryByLocation(e)).filter(f=>!f.tombstone);if(!i.length)return;let s=i.map(f=>f.lastModified).reduce((f,y)=>f>y?f:y),o=i.filter(f=>!r||f.lastModified<s),a=i.filter(f=>r&&f.lastModified===s);if(a.length){let f=a.map(_=>_._id).reduce((_,b)=>_>b?_:b),y=a.filter(_=>_._id!==f);o.push(...y)}let c=r?s:new Date().getTime(),d=await this.db.bulkDocs(o.map(f=>({...f,tombstone:!0,lastModified:c}))),m;for(let f of d)if("ok"in f){let{id:y}=f,_=o.find(b=>b._id===y);if(_){let{_id:b,_rev:P,_conflicts:S,_attachments:g,...w}=_;m={...w,tombstone:!0,lastModified:c};break}}return m}delete=async(...e)=>{let[r,n]=e,{location:i}=Hr(r);if(i.actor!==n.actor)throw new rn;let s=await this.deleteAtLocation(i);if(!s)throw new Wn;return s};put=async(...e)=>{let[r,n]=e;if(r.actor&&r.actor!==n.actor)throw new rn;if(r.source&&r.source!==this.source)throw new rn("Putting an object that does not match this source");let i={value:r.value,channels:r.channels,allowed:r.allowed,name:r.name??nu(),source:this.source,actor:n.actor,tombstone:!1,lastModified:new Date().getTime()};await this.db.put({_id:this.docId(i),...i});let s=await this.deleteAtLocation(i,!0);return s||{...i,value:{},channels:[],allowed:void 0,tombstone:!0}};patch=async(...e)=>{let[r,n,i]=e,{location:s}=Hr(n);if(s.actor!==i.actor)throw new rn;let o=await this.get(n,{},i);if(o.tombstone)throw new Wn("The object you are trying to patch has been deleted");let a={...o};for(let c of["value","channels","allowed"])Xi(Zt,c,r,a);if(typeof a.value!="object"||Array.isArray(a.value)||!a.value)throw new Tr("value is no longer an object");if(!Array.isArray(a.channels)||!a.channels.every(c=>typeof c=="string"))throw new Tr("channels are no longer an array of strings");if(a.allowed&&(!Array.isArray(a.allowed)||!a.allowed.every(c=>typeof c=="string")))throw new Tr("allowed list is not an array of strings");return a.lastModified=new Date().getTime(),await this.db.put({...a,_id:this.docId(a)}),await this.deleteAtLocation(a,!0),{...o,tombstone:!0,lastModified:a.lastModified}};queryLastModifiedSuffixes(e){let r="",n="\uFFFF",i=e.properties?.lastModified;if(i?.minimum){let s=Math.ceil(i.minimum);s===i.minimum&&i.exclusiveMinimum&&s++,r=s.toString().padStart(15,"0")}if(i?.maximum){let s=Math.floor(i.maximum);s===i.maximum&&i.exclusiveMaximum&&s--,n=s.toString().padStart(15,"0")}return{startKeySuffix:r,endKeySuffix:n}}discover=(...e)=>{let[r,n,i]=e,s=Wr(this.ajv,n),{startKeySuffix:o,endKeySuffix:a}=this.queryLastModifiedSuffixes(n);return new kt(async(d,m)=>{let f=new Set;for(let y of r){let _=encodeURIComponent(y)+"/",b=_+o,P=_+a,S=await this.db.query("indexes/objectsPerChannelAndLastModified",{startkey:b,endkey:P,include_docs:!0});for(let g of S.rows){let w=g.doc;if(!w)continue;let{_id:p,_rev:h,...v}=w;f.has(p)||(f.add(p),Ln(w,i)&&(Bn(v,r,i),s(v)&&await d({value:v})))}}return m(),{tombstoneRetention:this.tombstoneRetention}})};recoverOrphans=(e,r)=>{let n=Wr(this.ajv,e),{startKeySuffix:i,endKeySuffix:s}=this.queryLastModifiedSuffixes(e),o=encodeURIComponent(r.actor)+"/",a=o+i,c=o+s;return new kt(async(m,f)=>{let y=await this.db.query("indexes/orphansPerActorAndLastModified",{startkey:a,endkey:c,include_docs:!0});for(let _ of y.rows){let b=_.doc;if(!b)continue;let{_id:P,_rev:S,...g}=b;n(g)&&await m({value:g})}return f(),{tombstoneRetention:this.tombstoneRetention}})};channelStats=e=>new kt(async(n,i)=>{let s=encodeURIComponent(e.actor)+"/",o=await this.db.query("indexes/channelStatsPerActor",{startkey:s,endkey:s+"\uFFFF",reduce:!0,group:!0});for(let a of o.rows){let c=a.key.split("/")[1];if(typeof c!="string")continue;let{count:d,max:m}=a.value;typeof d!="number"||typeof m!="number"||await n({value:{channel:decodeURIComponent(c),count:d,lastModified:m}})}i()})};I();R();T();var Xh=en(Ri());var ls=class{ajv;graffiti;callbacks=new Set;constructor(e,r){this.ajv=r??new Xh.default({strict:!1}),this.graffiti=e}async synchronizeDispatch(e,r,n=!1){for(let i of this.callbacks)i(e,r);n&&await new Promise(i=>setTimeout(i,0))}get=async(...e)=>{let r=await this.graffiti.get(...e);return this.synchronizeDispatch(r),r};put=async(...e)=>{let r=await this.graffiti.put(...e),n=e[0],i={...r,value:n.value,channels:n.channels,allowed:n.allowed,tombstone:!1};return await this.synchronizeDispatch(r,i,!0),r};patch=async(...e)=>{let r=await this.graffiti.patch(...e),n={...r};n.tombstone=!1;for(let i of["value","channels","allowed"])Xi(Zt,i,e[0],n);return await this.synchronizeDispatch(r,n,!0),r};delete=async(...e)=>{let r=await this.graffiti.delete(...e);return await this.synchronizeDispatch(r,void 0,!0),r};objectStream(e){let r=this.synchronizeDispatch.bind(this);return async function*(){let i=await e.next();for(;!i.done;)i.value.error||r(i.value.value),yield i.value,i=await e.next();return i.value}()}discover=(...e)=>{let r=this.graffiti.discover(...e);return this.objectStream(r)};recoverOrphans=(...e)=>{let r=this.graffiti.recoverOrphans(...e);return this.objectStream(r)};synchronize(e,r,n,i){let s=Wr(this.ajv,n);return new kt(async(a,c)=>{let d=(m,f)=>{for(let y of[f,m])if(y&&e(y)&&Ln(y,i)){let _={...y};if(Bn(_,r,i),s(_)){a({value:_});break}}};this.callbacks.add(d),await c,this.callbacks.delete(d)})}synchronizeDiscover=(...e)=>{let[r,n,i]=e;function s(o){return o.channels.some(a=>r.includes(a))}return this.synchronize(s,r,n,i)};synchronizeGet=(...e)=>{let[r,n,i]=e;function s(o){let a=Yt(o),{uri:c}=Hr(r);return a===c}return this.synchronize(s,[],n,i)};synchronizeRecoverOrphans=(...e)=>{let[r,n]=e;function i(s){return s.actor===n.actor&&s.channels.length===0}return this.synchronize(i,[],r,n)}};var Zh=class extends Dc{locationToUri=Yt;uriToLocation=ru;login;logout;sessionEvents;put;get;patch;delete;discover;recoverOrphans;synchronizeGet;synchronizeDiscover;synchronizeRecoverOrphans;channelStats;constructor(e){super();let r=new qi;this.login=r.login.bind(r),this.logout=r.logout.bind(r),this.sessionEvents=r.sessionEvents;let n=new ep.default({strict:!1}),i=new fs(e,n),s=new ls(i,n);this.put=s.put.bind(s),this.get=s.get.bind(s),this.patch=s.patch.bind(s),this.delete=s.delete.bind(s),this.discover=s.discover.bind(s),this.recoverOrphans=s.recoverOrphans.bind(i),this.channelStats=i.channelStats.bind(i),this.synchronizeDiscover=s.synchronizeDiscover.bind(s),this.synchronizeGet=s.synchronizeGet.bind(s),this.synchronizeRecoverOrphans=s.synchronizeRecoverOrphans.bind(s)}};export{Zh as GraffitiLocal};
18
18
  /*! Bundled license information:
19
19
 
20
20
  @jspm/core/nodelibs/browser/chunk-DtuTasat.js: