@graffiti-garden/implementation-local 0.6.4 → 1.0.1
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.
- package/README.md +0 -1
- package/dist/browser/ajv-IY2ZY7VT.js +9 -0
- package/dist/browser/ajv-IY2ZY7VT.js.map +7 -0
- package/dist/browser/{chunk-KNUPPOQC.js → chunk-GE6AZATH.js} +2 -2
- package/dist/browser/{chunk-KNUPPOQC.js.map → chunk-GE6AZATH.js.map} +1 -1
- package/dist/browser/{index-browser.es-G37SKL53.js → index-browser.es-UXYPGJ2M.js} +2 -2
- package/dist/browser/{index-browser.es-G37SKL53.js.map → index-browser.es-UXYPGJ2M.js.map} +1 -1
- package/dist/browser/index.js +11 -2
- package/dist/browser/index.js.map +4 -4
- package/dist/cjs/identity.js +112 -0
- package/dist/cjs/identity.js.map +7 -0
- package/dist/cjs/index.js +43 -22
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/media.js +111 -0
- package/dist/cjs/media.js.map +7 -0
- package/dist/cjs/objects.js +307 -0
- package/dist/cjs/objects.js.map +7 -0
- package/dist/cjs/tests.spec.js +1 -2
- package/dist/cjs/tests.spec.js.map +2 -2
- package/dist/cjs/utilities.js +68 -43
- package/dist/cjs/utilities.js.map +2 -2
- package/dist/esm/identity.js +92 -0
- package/dist/esm/identity.js.map +7 -0
- package/dist/esm/index.js +43 -24
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/media.js +91 -0
- package/dist/esm/media.js.map +7 -0
- package/dist/esm/objects.js +285 -0
- package/dist/esm/objects.js.map +7 -0
- package/dist/esm/tests.spec.js +2 -4
- package/dist/esm/tests.spec.js.map +2 -2
- package/dist/esm/utilities.js +69 -48
- package/dist/esm/utilities.js.map +2 -2
- package/dist/{session-manager.d.ts → identity.d.ts} +7 -5
- package/dist/identity.d.ts.map +1 -0
- package/dist/index.d.ts +15 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/media.d.ts +9 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/objects.d.ts +63 -0
- package/dist/objects.d.ts.map +1 -0
- package/dist/utilities.d.ts +19 -8
- package/dist/utilities.d.ts.map +1 -1
- package/package.json +31 -19
- package/src/identity.ts +131 -0
- package/src/index.ts +44 -29
- package/src/media.ts +106 -0
- package/src/objects.ts +432 -0
- package/src/tests.spec.ts +2 -4
- package/src/utilities.ts +67 -87
- package/dist/browser/ajv-6AI3HK2A.js +0 -9
- package/dist/browser/ajv-6AI3HK2A.js.map +0 -7
- package/dist/browser/fast-json-patch-ZE7SZEYK.js +0 -19
- package/dist/browser/fast-json-patch-ZE7SZEYK.js.map +0 -7
- package/dist/cjs/database.js +0 -626
- package/dist/cjs/database.js.map +0 -7
- package/dist/cjs/session-manager.js +0 -107
- package/dist/cjs/session-manager.js.map +0 -7
- package/dist/database.d.ts +0 -106
- package/dist/database.d.ts.map +0 -1
- package/dist/esm/database.js +0 -608
- package/dist/esm/database.js.map +0 -7
- package/dist/esm/session-manager.js +0 -87
- package/dist/esm/session-manager.js.map +0 -7
- package/dist/session-manager.d.ts.map +0 -1
- package/src/database.ts +0 -921
- package/src/session-manager.ts +0 -123
package/dist/browser/index.js
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
import{d as m,f as y,g as b}from"./chunk-KNUPPOQC.js";m();b();y();m();b();y();var C=class{},z={type:"object",properties:{value:{type:"object"},channels:{type:"array",items:{type:"string"}},allowed:{type:"array",items:{type:"string"},nullable:!0},url:{type:"string"},actor:{type:"string"},lastModified:{type:"number"}},additionalProperties:!1,required:["value","channels","actor","url","lastModified"]},Y={...z,required:["value","channels"]};var w=class T extends Error{constructor(t){super(t),this.name="GraffitiErrorForbidden",Object.setPrototypeOf(this,T.prototype)}},g=class I extends Error{constructor(t){super(t),this.name="GraffitiErrorNotFound",Object.setPrototypeOf(this,I.prototype)}},D=class U extends Error{constructor(t){super(t),this.name="GraffitiErrorInvalidSchema",Object.setPrototypeOf(this,U.prototype)}},k=class B extends Error{constructor(t){super(t),this.name="GraffitiErrorSchemaMismatch",Object.setPrototypeOf(this,B.prototype)}},_=class N extends Error{constructor(t){super(t),this.name="GraffitiErrorPatchTestFailed",Object.setPrototypeOf(this,N.prototype)}},G=class R extends Error{constructor(t){super(t),this.name="GraffitiErrorPatchError",Object.setPrototypeOf(this,R.prototype)}};m();b();y();var E=class{sessionEvents=new EventTarget;constructor(){(async()=>{await Promise.resolve();for(let r of this.getLoggedInActors()){let i=new CustomEvent("login",{detail:{session:{actor:r}}});this.sessionEvents.dispatchEvent(i)}let e=new CustomEvent("initialized",{detail:{}});this.sessionEvents.dispatchEvent(e)})()}loggedInActors=[];getLoggedInActors(){if(typeof window<"u"){let t=window.localStorage.getItem("graffiti-actor");return t?t.split(",").map(decodeURIComponent):[]}else return this.loggedInActors}setLoggedInActors(t){typeof window<"u"?window.localStorage.setItem("graffiti-actor",t.map(encodeURIComponent).join(",")):this.loggedInActors=t}login=async t=>{let e=t?.actor;if(!e&&typeof window<"u"){let o=window.prompt(`This is an insecure implementation of the Graffiti API for *demo purposes only*. Do not store any sensitive information here.
|
|
1
|
+
import{a as L,b as Rt,c as d,e as l,f as m,g as u}from"./chunk-GE6AZATH.js";var lt=L((Be,_)=>{"use strict";d();u();l();_.exports=dt;_.exports.preferredCharsets=dt;var Nt=/^\s*([^\s;]+)\s*(?:;(.*))?$/;function Ft(i){for(var t=i.split(","),e=0,r=0;e<t.length;e++){var o=kt(t[e].trim(),e);o&&(t[r++]=o)}return t.length=r,t}function kt(i,t){var e=Nt.exec(i);if(!e)return null;var r=e[1],o=1;if(e[2])for(var n=e[2].split(";"),a=0;a<n.length;a++){var s=n[a].trim().split("=");if(s[0]==="q"){o=parseFloat(s[1]);break}}return{charset:r,q:o,i:t}}function $t(i,t,e){for(var r={o:-1,q:0,s:0},o=0;o<t.length;o++){var n=Jt(i,t[o],e);n&&(r.s-n.s||r.q-n.q||r.o-n.o)<0&&(r=n)}return r}function Jt(i,t,e){var r=0;if(t.charset.toLowerCase()===i.toLowerCase())r|=1;else if(t.charset!=="*")return null;return{i:e,o:t.i,q:t.q,s:r}}function dt(i,t){var e=Ft(i===void 0?"*":i||"");if(!t)return e.filter(ft).sort(ct).map(zt);var r=t.map(function(n,a){return $t(n,e,a)});return r.filter(ft).sort(ct).map(function(n){return t[r.indexOf(n)]})}function ct(i,t){return t.q-i.q||t.s-i.s||i.o-t.o||i.i-t.i||0}function zt(i){return i.charset}function ft(i){return i.q>0}});var gt=L((Ne,H)=>{"use strict";d();u();l();H.exports=ht;H.exports.preferredEncodings=ht;var Qt=/^\s*([^\s;]+)\s*(?:;(.*))?$/;function Kt(i){for(var t=i.split(","),e=!1,r=1,o=0,n=0;o<t.length;o++){var a=Wt(t[o].trim(),o);a&&(t[n++]=a,e=e||pt("identity",a),r=Math.min(r,a.q||1))}return e||(t[n++]={encoding:"identity",q:r,i:o}),t.length=n,t}function Wt(i,t){var e=Qt.exec(i);if(!e)return null;var r=e[1],o=1;if(e[2])for(var n=e[2].split(";"),a=0;a<n.length;a++){var s=n[a].trim().split("=");if(s[0]==="q"){o=parseFloat(s[1]);break}}return{encoding:r,q:o,i:t}}function Xt(i,t,e){for(var r={encoding:i,o:-1,q:0,s:0},o=0;o<t.length;o++){var n=pt(i,t[o],e);n&&(r.s-n.s||r.q-n.q||r.o-n.o)<0&&(r=n)}return r}function pt(i,t,e){var r=0;if(t.encoding.toLowerCase()===i.toLowerCase())r|=1;else if(t.encoding!=="*")return null;return{encoding:i,i:e,o:t.i,q:t.q,s:r}}function ht(i,t,e){var r=Kt(i||""),o=e?function(s,c){if(s.q!==c.q)return c.q-s.q;var p=e.indexOf(s.encoding),g=e.indexOf(c.encoding);return p===-1&&g===-1?c.s-s.s||s.o-c.o||s.i-c.i:p!==-1&&g!==-1?p-g:p===-1?1:-1}:Vt;if(!t)return r.filter(ut).sort(o).map(Yt);var n=t.map(function(s,c){return Xt(s,r,c)});return n.filter(ut).sort(o).map(function(s){return t[n.indexOf(s)]})}function Vt(i,t){return t.q-i.q||t.s-i.s||i.o-t.o||i.i-t.i}function Yt(i){return i.encoding}function ut(i){return i.q>0}});var bt=L((Je,N)=>{"use strict";d();u();l();N.exports=wt;N.exports.preferredLanguages=wt;var Zt=/^\s*([^\s\-;]+)(?:-([^\s;]+))?\s*(?:;(.*))?$/;function te(i){for(var t=i.split(","),e=0,r=0;e<t.length;e++){var o=vt(t[e].trim(),e);o&&(t[r++]=o)}return t.length=r,t}function vt(i,t){var e=Zt.exec(i);if(!e)return null;var r=e[1],o=e[2],n=r;o&&(n+="-"+o);var a=1;if(e[3])for(var s=e[3].split(";"),c=0;c<s.length;c++){var p=s[c].split("=");p[0]==="q"&&(a=parseFloat(p[1]))}return{prefix:r,suffix:o,q:a,i:t,full:n}}function ee(i,t,e){for(var r={o:-1,q:0,s:0},o=0;o<t.length;o++){var n=re(i,t[o],e);n&&(r.s-n.s||r.q-n.q||r.o-n.o)<0&&(r=n)}return r}function re(i,t,e){var r=vt(i);if(!r)return null;var o=0;if(t.full.toLowerCase()===r.full.toLowerCase())o|=4;else if(t.prefix.toLowerCase()===r.full.toLowerCase())o|=2;else if(t.full.toLowerCase()===r.prefix.toLowerCase())o|=1;else if(t.full!=="*")return null;return{i:e,o:t.i,q:t.q,s:o}}function wt(i,t){var e=te(i===void 0?"*":i||"");if(!t)return e.filter(mt).sort(yt).map(ie);var r=t.map(function(n,a){return ee(n,e,a)});return r.filter(mt).sort(yt).map(function(n){return t[r.indexOf(n)]})}function yt(i,t){return t.q-i.q||t.s-i.s||i.o-t.o||i.i-t.i||0}function ie(i){return i.full}function mt(i){return i.q>0}});var Ct=L((We,F)=>{"use strict";d();u();l();F.exports=Lt;F.exports.preferredMediaTypes=Lt;var oe=/^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/;function ne(i){for(var t=de(i),e=0,r=0;e<t.length;e++){var o=Et(t[e].trim(),e);o&&(t[r++]=o)}return t.length=r,t}function Et(i,t){var e=oe.exec(i);if(!e)return null;var r=Object.create(null),o=1,n=e[2],a=e[1];if(e[3])for(var s=le(e[3]).map(fe),c=0;c<s.length;c++){var p=s[c],g=p[0].toLowerCase(),h=p[1],y=h&&h[0]==='"'&&h[h.length-1]==='"'?h.slice(1,-1):h;if(g==="q"){o=parseFloat(y);break}r[g]=y}return{type:a,subtype:n,params:r,q:o,i:t}}function ae(i,t,e){for(var r={o:-1,q:0,s:0},o=0;o<t.length;o++){var n=se(i,t[o],e);n&&(r.s-n.s||r.q-n.q||r.o-n.o)<0&&(r=n)}return r}function se(i,t,e){var r=Et(i),o=0;if(!r)return null;if(t.type.toLowerCase()==r.type.toLowerCase())o|=4;else if(t.type!="*")return null;if(t.subtype.toLowerCase()==r.subtype.toLowerCase())o|=2;else if(t.subtype!="*")return null;var n=Object.keys(t.params);if(n.length>0)if(n.every(function(a){return t.params[a]=="*"||(t.params[a]||"").toLowerCase()==(r.params[a]||"").toLowerCase()}))o|=1;else return null;return{i:e,o:t.i,q:t.q,s:o}}function Lt(i,t){var e=ne(i===void 0?"*/*":i||"");if(!t)return e.filter(Gt).sort(Ot).map(ce);var r=t.map(function(n,a){return ae(n,e,a)});return r.filter(Gt).sort(Ot).map(function(n){return t[r.indexOf(n)]})}function Ot(i,t){return t.q-i.q||t.s-i.s||i.o-t.o||i.i-t.i||0}function ce(i){return i.type+"/"+i.subtype}function Gt(i){return i.q>0}function xt(i){for(var t=0,e=0;(e=i.indexOf('"',e))!==-1;)t++,e++;return t}function fe(i){var t=i.indexOf("="),e,r;return t===-1?e=i:(e=i.slice(0,t),r=i.slice(t+1)),[e,r]}function de(i){for(var t=i.split(","),e=1,r=0;e<t.length;e++)xt(t[r])%2==0?t[++r]=t[e]:t[r]+=","+t[e];return t.length=r+1,t}function le(i){for(var t=i.split(";"),e=1,r=0;e<t.length;e++)xt(t[r])%2==0?t[++r]=t[e]:t[r]+=";"+t[e];t.length=r+1;for(var e=0;e<t.length;e++)t[e]=t[e].trim();return t}});var jt=L((Ze,k)=>{"use strict";d();u();l();var ue=lt(),pe=gt(),he=bt(),ge=Ct();k.exports=f;k.exports.Negotiator=f;function f(i){if(!(this instanceof f))return new f(i);this.request=i}f.prototype.charset=function(t){var e=this.charsets(t);return e&&e[0]};f.prototype.charsets=function(t){return ue(this.request.headers["accept-charset"],t)};f.prototype.encoding=function(t,e){var r=this.encodings(t,e);return r&&r[0]};f.prototype.encodings=function(t,e){var r=e||{};return pe(this.request.headers["accept-encoding"],t,r.preferred)};f.prototype.language=function(t){var e=this.languages(t);return e&&e[0]};f.prototype.languages=function(t){return he(this.request.headers["accept-language"],t)};f.prototype.mediaType=function(t){var e=this.mediaTypes(t);return e&&e[0]};f.prototype.mediaTypes=function(t){return ge(this.request.headers.accept,t)};f.prototype.preferredCharset=f.prototype.charset;f.prototype.preferredCharsets=f.prototype.charsets;f.prototype.preferredEncoding=f.prototype.encoding;f.prototype.preferredEncodings=f.prototype.encodings;f.prototype.preferredLanguage=f.prototype.language;f.prototype.preferredLanguages=f.prototype.languages;f.prototype.preferredMediaType=f.prototype.mediaType;f.prototype.preferredMediaTypes=f.prototype.mediaTypes});d();u();l();d();u();l();var _t={type:"object",properties:{value:{type:"object"},channels:{type:"array",items:{type:"string"}},allowed:{type:"array",items:{type:"string"},nullable:!0},url:{type:"string"},actor:{type:"string"}},additionalProperties:!1,required:["value","channels","actor","url"]},me={..._t,required:["value","channels"]};var M=class $ extends Error{constructor(t){super(t),this.name="GraffitiErrorForbidden",Object.setPrototypeOf(this,$.prototype)}},b=class J extends Error{constructor(t){super(t),this.name="GraffitiErrorNotFound",Object.setPrototypeOf(this,J.prototype)}},Ht=class z extends Error{constructor(t){super(t),this.name="GraffitiErrorInvalidSchema",Object.setPrototypeOf(this,z.prototype)}},Q=class K extends Error{constructor(t){super(t),this.name="GraffitiErrorSchemaMismatch",Object.setPrototypeOf(this,K.prototype)}},W=class X extends Error{constructor(t){super(t),this.name="GraffitiErrorTooLarge",Object.setPrototypeOf(this,X.prototype)}},V=class Y extends Error{constructor(t){super(t),this.name="GraffitiErrorNotAcceptable",Object.setPrototypeOf(this,Y.prototype)}};function D(i){return typeof i=="string"?i:i.url}function I(i,t){try{return i.compile(t)}catch(e){throw new Ht(e instanceof Error?e.message:void 0)}}function U(i,t){return!Array.isArray(i.allowed)||typeof t?.actor=="string"&&(i.actor===t.actor||i.allowed.includes(t.actor))}function A(i,t,e){i.actor!==e?.actor&&(i.allowed=i.allowed&&e?[e.actor]:void 0,i.channels=i.channels.filter(r=>t.includes(r)))}d();u();l();d();u();l();function B(i){return btoa(String.fromCodePoint(...i)).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,"")}function Z(i){let t=i.replace(/-/g,"+").replace(/_/g,"/");for(;t.length%4!==0;)t+="=";return Uint8Array.from(atob(t),e=>e.charCodeAt(0))}function tt(i=32){let t=new Uint8Array(i);return crypto.getRandomValues(t),B(t)}var et="graffiti:object:",rt="graffiti:media:";function it(i,t,e){return`${e}${encodeURIComponent(i)}:${encodeURIComponent(t)}`}function x(i,t){return it(i,t,et)}function ot(i,t){return it(i,t,rt)}function nt(i,t){if(!i.startsWith(t))throw new Error(`URL does not start with ${t}`);let e=i.slice(t.length).split(":");if(e.length!==2)throw new Error("URL has too many colon-seperated parts");let[r,o]=e.map(decodeURIComponent);return{actor:r,id:o}}function O(i){return nt(i,et)}function R(i){return nt(i,rt)}async function at(i){if(typeof FileReader<"u")return new Promise((t,e)=>{let r=new FileReader;r.onload=()=>{typeof r.result=="string"?t(r.result):e(new Error("Unexpected result type"))},r.onerror=e,r.readAsDataURL(i)});if(typeof m<"u"){let t=await i.arrayBuffer();return`data:${i.type};base64,${m.from(t).toString("base64")}`}throw new Error("Unsupported environment")}async function st(i){return await(await fetch(i)).blob()}var S="did:local:",q=class{sessionEvents=new EventTarget;handleToActor=async t=>{let e=new TextEncoder().encode(t),r=B(e);return`${S}${r}`};actorToHandle=async t=>{if(!t.startsWith(S))throw new Error(`actor must start with ${S}`);let e=t.slice(S.length),r=Z(e);return new TextDecoder().decode(r)};constructor(){(async()=>{await Promise.resolve();for(let r of this.getLoggedInHandles()){let o=new CustomEvent("login",{detail:{session:{actor:await this.handleToActor(r)}}});this.sessionEvents.dispatchEvent(o)}let e=new CustomEvent("initialized",{detail:{}});this.sessionEvents.dispatchEvent(e)})()}loggedInHandles=[];getLoggedInHandles(){if(typeof window<"u"){let t=window.localStorage.getItem("graffiti-handles");return t?t.split(",").map(decodeURIComponent):[]}else return this.loggedInHandles}setLoggedInHandles(t){typeof window<"u"?window.localStorage.setItem("graffiti-handles",t.join(",")):this.loggedInHandles=t}login=async t=>{await new Promise(r=>setTimeout(r,0));let e=t?await this.actorToHandle(t):void 0;if(typeof window<"u"&&(e=window.prompt("Choose a username to log in.",e)??void 0),e){let r=this.getLoggedInHandles();r.includes(e)||this.setLoggedInHandles([...r,e]),window.location.reload()}else{let r={error:new Error("No handle provided to login")},o=new CustomEvent("login",{detail:r});this.sessionEvents.dispatchEvent(o)}};logout=async t=>{let e=await this.actorToHandle(t.actor),r=this.getLoggedInHandles(),o=r.includes(e);o&&this.setLoggedInHandles(r.filter(s=>s!==e));let n=o?{actor:t.actor}:{actor:t.actor,error:new Error("Not logged in with that actor")},a=new CustomEvent("logout",{detail:n});this.sessionEvents.dispatchEvent(a)}};d();u();l();var T=class{db_;ajv_;options;get db(){return this.db_||(this.db_=(async()=>{let{default:t}=await import("./index-browser.es-UXYPGJ2M.js"),e={name:"graffitiDb",...this.options.pouchDBOptions},r=new t(e.name,e);return await r.put({_id:"_design/indexes",views:{objectsPerChannelAndLastModified:{map:function(o){let n=o.lastModified.toString().padStart(15,"0");o.channels.forEach(function(a){let s=encodeURIComponent(a)+"/"+n;emit(s)})}.toString()}}}).catch(o=>{if(!(o&&typeof o=="object"&&"name"in o&&o.name==="conflict"))throw o}),r})()),this.db_}get ajv(){return this.ajv_||(this.ajv_=(async()=>{let{default:t}=await import("./ajv-IY2ZY7VT.js");return new t({strict:!1})})()),this.ajv_}async getOperationClock(){return Number((await(await this.db).info()).update_seq)}constructor(t){this.options=t??{}}get=async(...t)=>{let[e,r,o]=t,n=D(e),a;try{a=await(await this.db).get(n)}catch{throw new b("The object you are trying to get either does not exist or you are not allowed to see it")}if(a.tombstone)throw new b("The object you are trying to get either does not exist or you are not allowed to see it");let{actor:s}=O(n),{value:c,channels:p,allowed:g}=a,h={value:c,channels:p,allowed:g,url:n,actor:s};if(!U(h,o))throw new b("The object you are trying to get either does not exist or you are not allowed to see it");if(A(h,[],o),!I(await this.ajv,r)(h))throw new Q;return h};delete=async(...t)=>{let[e,r]=t,o=D(e),{actor:n}=O(o);if(n!==r.actor)throw new M("You cannot delete an object that you did not create.");let a;try{a=await(await this.db).get(o)}catch{throw new b("Object not found.")}if(a.tombstone)throw new b("Object not found.");a.tombstone=!0,a.lastModified=await this.getOperationClock();try{await(await this.db).put(a)}catch{throw new b("Object not found.")}};post=async(...t)=>{let[e,r]=t,o=r.actor,n=tt(),a=x(o,n),{value:s,channels:c,allowed:p}=e,g={value:s,channels:c,allowed:p,lastModified:await this.getOperationClock(),tombstone:!1};return await(await this.db).put({_id:a,...g}),{...e,actor:o,url:a}};async*discoverMeta(t,e){if(e){let h=this.options.continueBuffer??2e3,y=Date.now()-e.lastDiscovered;y<h&&await new Promise(G=>setTimeout(G,h-y))}let[r,o,n]=t,a=I(await this.ajv,o),s=e?e.ifModifiedSince.toString().padStart(15,"0"):"",c="\uFFFF",p=new Set,g=await this.getOperationClock();for(let h of r){let y=encodeURIComponent(h)+"/",G=y+s,qt=y+c,Tt=await(await this.db).query("indexes/objectsPerChannelAndLastModified",{startkey:G,endkey:qt,include_docs:!0});for(let Pt of Tt.rows){let C=Pt.doc;if(!C)continue;let E=C._id;if(p.has(E)||(p.add(E),!e&&C.tombstone))continue;let{tombstone:Dt,value:It,channels:Ut,allowed:At}=C,{actor:Bt}=O(E),j={url:E,value:It,allowed:At,channels:Ut,actor:Bt};U(j,n)&&(A(j,r,n),a(j)&&(yield Dt?{tombstone:!0,object:{url:E}}:{object:j}))}}return{lastDiscovered:Date.now(),ifModifiedSince:g}}discoverCursor(t,e){let[r,o,n]=t;return"discover:"+JSON.stringify({channels:r,schema:o,continueParams:e,actor:n?.actor})}async*discoverContinue(t,e,r){if(r?.actor!==t[2]?.actor)throw new M("Cannot continue a cursor started by another actor");let o=this.discoverMeta(t,e);for(;;){let n=await o.next();if(n.done)return{continue:a=>this.discoverContinue(t,n.value,a),cursor:this.discoverCursor(t,n.value)};yield n.value}}discover=(...t)=>{let[e,r,o]=t,n=this.discoverMeta([e,r,o]),a=this;return(async function*(){for(;;){let s=await n.next();if(s.done)return{continue:c=>a.discoverContinue(t,s.value,c),cursor:a.discoverCursor(t,s.value)};s.value.tombstone||(yield s.value)}})()};continueDiscover=(...t)=>{let[e,r]=t;if(e.startsWith("discover:")){let{channels:o,schema:n,actor:a,continueParams:s}=JSON.parse(e.slice(9));if(a&&a!==r?.actor)throw new M("Cannot continue a cursor started by another actor");return this.discoverContinue([o,n,r],s)}else throw new b("Cursor not found")}};d();u();l();var Mt=Rt(jt()),ye={properties:{value:{properties:{dataBase64:{type:"string"},type:{type:"string"},size:{type:"number"}},required:["dataBase64","type","size"]}}},P=class{db;constructor(t){this.db=t}postMedia=async(...t)=>{let[e,r]=t,o=await at(e.data),n=e.data.type,{url:a}=await this.db.post({value:{dataBase64:o,type:n,size:e.data.size},channels:[],allowed:e.allowed},r),{actor:s,id:c}=O(a);return ot(s,c)};getMedia=async(...t)=>{let[e,r,o]=t,{actor:n,id:a}=R(e),s=x(n,a),c=await this.db.get(s,ye,o),{dataBase64:p,type:g,size:h}=c.value;if(r?.maxBytes&&h>r.maxBytes)throw new W("File size exceeds limit");if(r?.accept&&new Mt.default({headers:{accept:r.accept}}).mediaType([g])!==g)throw new V(`Unsupported media type, ${g}`);let y=await st(p);if(y.size!==h||y.type!==g)throw new Error("Invalid data");return{data:y,actor:c.actor,allowed:c.allowed}};deleteMedia=async(...t)=>{let[e,r]=t,{actor:o,id:n}=R(e),a=x(o,n);await this.db.delete(a,r)}};var St=class{graffitiLocalIdentity=new q;login=this.graffitiLocalIdentity.login.bind(this.graffitiLocalIdentity);logout=this.graffitiLocalIdentity.logout.bind(this.graffitiLocalIdentity);handleToActor=this.graffitiLocalIdentity.handleToActor.bind(this.graffitiLocalIdentity);actorToHandle=this.graffitiLocalIdentity.actorToHandle.bind(this.graffitiLocalIdentity);sessionEvents=this.graffitiLocalIdentity.sessionEvents;graffitiLocalObjects;post;get;delete;discover;continueDiscover;graffitiLocalMedia;postMedia;getMedia;deleteMedia;constructor(t){this.graffitiLocalObjects=new T(t),this.post=this.graffitiLocalObjects.post.bind(this.graffitiLocalObjects),this.get=this.graffitiLocalObjects.get.bind(this.graffitiLocalObjects),this.delete=this.graffitiLocalObjects.delete.bind(this.graffitiLocalObjects),this.discover=this.graffitiLocalObjects.discover.bind(this.graffitiLocalObjects),this.continueDiscover=this.graffitiLocalObjects.continueDiscover.bind(this.graffitiLocalObjects),this.graffitiLocalMedia=new P(this.graffitiLocalObjects),this.postMedia=this.graffitiLocalMedia.postMedia.bind(this.graffitiLocalMedia),this.getMedia=this.graffitiLocalMedia.getMedia.bind(this.graffitiLocalMedia),this.deleteMedia=this.graffitiLocalMedia.deleteMedia.bind(this.graffitiLocalMedia)}};export{St as GraffitiLocal};
|
|
2
|
+
/*! Bundled license information:
|
|
2
3
|
|
|
3
|
-
Simply choose a username to log in.`);o&&(e=o)}let r;if(!e)r={error:new Error("No actor ID provided to login")};else{let o=this.getLoggedInActors();o.includes(e)||this.setLoggedInActors([...o,e]),r={session:{actor:e}}}let i=new CustomEvent("login",{detail:r});this.sessionEvents.dispatchEvent(i)};logout=async t=>{let e=this.getLoggedInActors(),r=e.includes(t.actor);r&&this.setLoggedInActors(e.filter(n=>n!==t.actor));let i=r?{actor:t.actor}:{actor:t.actor,error:new Error("Not logged in with that actor")},o=new CustomEvent("logout",{detail:i});this.sessionEvents.dispatchEvent(o)}};m();b();y();m();b();y();function J(d){return typeof d=="string"?d:d.url}function M(d=24){let t=new Uint8Array(d);return crypto.getRandomValues(t),btoa(String.fromCodePoint(...t)).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,"")}function F(d,t,e,r){let i=e[t];if(!(!i||!i.length))try{r[t]=d(r[t],i,!0,!1).newDocument}catch(o){throw typeof o=="object"&&o&&"name"in o&&typeof o.name=="string"&&"message"in o&&typeof o.message=="string"?o.name==="TEST_OPERATION_FAILED"?new _(o.message):new G(o.name+": "+o.message):o}}function x(d,t){try{return d.compile(t)}catch(e){throw new D(e instanceof Error?e.message:void 0)}}function L(d,t,e){d.actor!==e?.actor&&(d.allowed=d.allowed&&e?[e.actor]:void 0,d.channels=d.channels.filter(r=>t.includes(r)))}function P(d,t){return d.allowed===void 0||d.allowed===null||!!t?.actor&&(d.actor===t.actor||d.allowed.includes(t.actor))}var K="graffiti:local:",V=6e4,A=class{db_;applyPatch_;ajv_;options;origin;get db(){return this.db_||(this.db_=(async()=>{let{default:t}=await import("./index-browser.es-G37SKL53.js"),e={name:"graffitiDb",...this.options.pouchDBOptions},r=new t(e.name,e);return await r.put({_id:"_design/indexes",views:{objectsPerChannelAndLastModified:{map:function(i){let o=i.lastModified.toString().padStart(15,"0");i.channels.forEach(function(n){let a=encodeURIComponent(n)+"/"+o;emit(a)})}.toString()},orphansPerActorAndLastModified:{map:function(i){if(i.channels.length===0){let o=i.lastModified.toString().padStart(15,"0"),n=encodeURIComponent(i.actor)+"/"+o;emit(n)}}.toString()},channelStatsPerActor:{map:function(i){i.tombstone||i.channels.forEach(function(o){let n=encodeURIComponent(i.actor)+"/"+encodeURIComponent(o);emit(n,i.lastModified)})}.toString(),reduce:"_stats"}}}).catch(i=>{if(!(i&&typeof i=="object"&&"name"in i&&i.name==="conflict"))throw i}),r})()),this.db_}get applyPatch(){return this.applyPatch_||(this.applyPatch_=(async()=>{let t=await import("./fast-json-patch-ZE7SZEYK.js");return t.applyPatch||t.default.applyPatch})()),this.applyPatch_}get ajv(){return this.ajv_||(this.ajv_=this.options.ajv?Promise.resolve(this.options.ajv):(async()=>{let{default:t}=await import("./ajv-6AI3HK2A.js");return new t({strict:!1})})()),this.ajv_}extractGraffitiObject(t){let{value:e,channels:r,allowed:i,url:o,actor:n,lastModified:a}=t;return{value:e,channels:r,allowed:i,url:o,actor:n,lastModified:a}}constructor(t){this.options=t??{},this.origin=this.options.origin??K,!this.origin.endsWith(":")&&!this.origin.endsWith("/")&&(this.origin+="/")}async allDocsAtLocation(t){let e=J(t)+"/";return(await(await this.db).allDocs({startkey:e,endkey:e+"\uFFFF",include_docs:!0})).rows.map(o=>o.doc).reduce((o,n)=>(n&&o.push(n),o),[])}docId(t){return t.url+"/"+M()}get=async(...t)=>{let[e,r,i]=t,n=(await this.allDocsAtLocation(e)).filter(l=>P(l,i));if(!n.length)throw new g("The object you are trying to get either does not exist or you are not allowed to see it");let a=n.reduce((l,f)=>l.lastModified>f.lastModified||l.lastModified===f.lastModified&&!l.tombstone&&f.tombstone?l:f);if(a.tombstone)throw new g("The object you are trying to get either does not exist or you are not allowed to see it");let c=this.extractGraffitiObject(a);if(L(c,[],i),!x(await this.ajv,r)(c))throw new k;return c};async deleteAtLocation(t,e={keepLatest:!1}){let r=await this.allDocsAtLocation(t),i=e.session?r.filter(s=>P(s,e.session)):r;if(i.length){if(e.session&&i.some(s=>s.actor!==e.session?.actor))throw new w("You cannot delete an object owned by another actor")}else throw new g("The object you are trying to delete either does not exist or you are not allowed to see it");let o=i.filter(s=>!s.tombstone);if(!o.length)return;let n=o.map(s=>s.lastModified).reduce((s,p)=>s>p?s:p),a=o.filter(s=>!e.keepLatest||s.lastModified<n),c=o.filter(s=>e.keepLatest&&s.lastModified===n);if(c.length){let s=c.map(h=>h._id).reduce((h,v)=>h>v?h:v),p=c.filter(h=>h._id!==s);a.push(...p)}let u=e.keepLatest?n:new Date().getTime(),l=await(await this.db).bulkDocs(a.map(s=>({...s,tombstone:!0,lastModified:u}))),f;for(let s of l)if("ok"in s){let{id:p}=s,h=a.find(v=>v._id===p);if(h){f={...this.extractGraffitiObject(h),lastModified:u};break}}return f}delete=async(...t)=>{let[e,r]=t,i=await this.deleteAtLocation(e,{session:r});if(!i)throw new g("The object has already been deleted");return i};put=async(...t)=>{let[e,r]=t;if(e.actor&&e.actor!==r.actor)throw new w("Cannot put an object with a different actor than the session actor");if(e.url){let a;try{a=await this.get(e.url,{},r)}catch(c){if(c instanceof g){if(!this.options.allowSettingArbitraryUrls)throw new g("The object you are trying to replace does not exist or you are not allowed to see it")}else throw c}if(a?.actor!==r.actor)throw new w("The object you are trying to replace is owned by another actor")}let i=(this.options.allowSettinngLastModified??!1)&&e.lastModified||new Date().getTime(),o={value:e.value,channels:e.channels,allowed:e.allowed,url:e.url??this.origin+M(),actor:r.actor,tombstone:!1,lastModified:i};await(await this.db).put({_id:this.docId(o),...o});let n=await this.deleteAtLocation(o,{keepLatest:!0});return n||{...o,value:{},channels:[],allowed:[],tombstone:!0}};patch=async(...t)=>{let[e,r,i]=t,o;try{o=await this.get(r,{},i)}catch(a){throw a instanceof g?new g("The object you are trying to patch does not exist or you are not allowed to see it"):a}if(o.actor!==i.actor)throw new w("The object you are trying to patch is owned by another actor");let n={...o};for(let a of["value","channels","allowed"])F(await this.applyPatch,a,e,n);if(typeof n.value!="object"||Array.isArray(n.value)||!n.value)throw new G("value is no longer an object");if(!Array.isArray(n.channels)||!n.channels.every(a=>typeof a=="string"))throw new G("channels are no longer an array of strings");if(n.allowed&&(!Array.isArray(n.allowed)||!n.allowed.every(a=>typeof a=="string")))throw new G("allowed list is not an array of strings");return n.lastModified=new Date().getTime(),await(await this.db).put({...n,tombstone:!1,_id:this.docId(n)}),await this.deleteAtLocation(n,{keepLatest:!0}),{...o,lastModified:n.lastModified}};queryLastModifiedSuffixes(t,e){let r="",i="\uFFFF";if(typeof t=="object"&&t.properties?.lastModified&&typeof t.properties.lastModified=="object"){let o=t.properties.lastModified,n=e&&o.minimum?Math.max(e,o.minimum):e??o.minimum,a=o.exclusiveMinimum,c;a!==void 0?(c=Math.ceil(a),c===a&&c++):n!==void 0&&(c=Math.ceil(n)),c!==void 0&&(r=c.toString().padStart(15,"0"));let u=o.maximum,l=o.exclusiveMaximum,f;l!==void 0?(f=Math.floor(l),f===l&&f--):u!==void 0&&(f=Math.floor(u)),f!==void 0&&(i=f.toString().padStart(15,"0"))}return{startKeySuffix:r,endKeySuffix:i}}async*streamObjects(t,e,r,i,o,n,a,c){n!==void 0&&(n-=V);let u=await(await this.db).query(t,{startkey:e,endkey:r,include_docs:!0});for(let l of u.rows){let f=l.doc;if(!f||c?.has(f._id)||(c?.add(f._id),n===void 0&&f.tombstone))continue;let s=this.extractGraffitiObject(f);if(a){if(!P(s,o))continue;L(s,a,o)}i(s)&&(yield f.tombstone?{tombstone:!0,object:{url:s.url,lastModified:s.lastModified}}:{object:s})}}async waitToContinue(t){if(t===void 0)return;let e=this.options.continueBuffer??1e3,r=Date.now()-t;r<e&&await new Promise(i=>setTimeout(i,e-r))}async*discoverMeta(t,e){await this.waitToContinue(e);let[r,i,o]=t,n=x(await this.ajv,i),{startKeySuffix:a,endKeySuffix:c}=this.queryLastModifiedSuffixes(i,e),u=new Set,l=new Date().getTime();for(let f of r){let s=encodeURIComponent(f)+"/",p=s+a,h=s+c,v=this.streamObjects("indexes/objectsPerChannelAndLastModified",p,h,n,o,e,r,u);for await(let q of v)yield q}return l}async*recoverOrphansMeta(t,e){await this.waitToContinue(e);let[r,i]=t,{startKeySuffix:o,endKeySuffix:n}=this.queryLastModifiedSuffixes(r,e),a=encodeURIComponent(i.actor)+"/",c=a+o,u=a+n,l=x(await this.ajv,r),f=new Date().getTime(),s=this.streamObjects("indexes/orphansPerActorAndLastModified",c,u,l,i,e);for await(let p of s)yield p;return f}discoverCursor(t,e){return"discover:"+JSON.stringify({channels:t[0],schema:t[1],actor:t[2]?.actor,ifModifiedSince:e})}async*discoverContinue(t,e){let r=this.discoverMeta(t,e);for(;;){let i=await r.next();if(i.done){let o=i.value;return{continue:()=>this.discoverContinue(t,o),cursor:this.discoverCursor(t,o)}}yield i.value}}discover=(...t)=>{let e=this.discoverMeta(t),r=this;return async function*(){for(;;){let i=await e.next();if(i.done)return{continue:()=>r.discoverContinue(t,i.value),cursor:r.discoverCursor(t,i.value)};i.value.tombstone||(yield i.value)}}()};recoverOrphansCursor(t,e){return"orphans:"+JSON.stringify({schema:t[0],actor:t[1]?.actor,ifModifiedSince:e})}async*recoverOrphansContinue(t,e){let r=this.recoverOrphansMeta(t,e);for(;;){let i=await r.next();if(i.done){let o=i.value;return{continue:()=>this.recoverOrphansContinue(t,o),cursor:this.recoverOrphansCursor(t,o)}}yield i.value}}recoverOrphans=(...t)=>{let e=this.recoverOrphansMeta(t),r=this;return async function*(){for(;;){let i=await e.next();if(i.done)return{continue:()=>r.recoverOrphansContinue(t,i.value),cursor:r.recoverOrphansCursor(t,i.value)};i.value.tombstone||(yield i.value)}}()};channelStats=t=>{let e=this;return async function*(){let r=encodeURIComponent(t.actor)+"/",i=await(await e.db).query("indexes/channelStatsPerActor",{startkey:r,endkey:r+"\uFFFF",reduce:!0,group:!0});for(let o of i.rows){let n=o.key.split("/")[1];if(typeof n!="string")continue;let{count:a,max:c}=o.value;typeof a!="number"||typeof c!="number"||(yield{value:{channel:decodeURIComponent(n),count:a,lastModified:c}})}}()};continueObjectStream=(t,e)=>{if(t.startsWith("discover:")){let{channels:r,schema:i,actor:o,ifModifiedSince:n}=JSON.parse(t.slice(9));if(o&&o!==e?.actor)throw new w("Cannot continue a cursor for another actor");return this.discoverContinue([r,i,e],n)}else if(t.startsWith("orphans:")){let{schema:r,actor:i,ifModifiedSince:o}=JSON.parse(t.slice(8));if(!e||i!==e?.actor)throw new w("Cannot continue a cursor for another actor");return this.recoverOrphansContinue([r,e],o)}else throw new g("Cursor not found")}};var W=class extends C{sessionManagerLocal=new E;login=this.sessionManagerLocal.login.bind(this.sessionManagerLocal);logout=this.sessionManagerLocal.logout.bind(this.sessionManagerLocal);sessionEvents=this.sessionManagerLocal.sessionEvents;put;get;patch;delete;discover;recoverOrphans;channelStats;continueObjectStream;constructor(t){super();let e=new A(t);this.put=e.put.bind(e),this.get=e.get.bind(e),this.patch=e.patch.bind(e),this.delete=e.delete.bind(e),this.discover=e.discover.bind(e),this.recoverOrphans=e.recoverOrphans.bind(e),this.channelStats=e.channelStats.bind(e),this.continueObjectStream=e.continueObjectStream.bind(e)}};export{W as GraffitiLocal};
|
|
4
|
+
negotiator/index.js:
|
|
5
|
+
(*!
|
|
6
|
+
* negotiator
|
|
7
|
+
* Copyright(c) 2012 Federico Romero
|
|
8
|
+
* Copyright(c) 2012-2014 Isaac Z. Schlueter
|
|
9
|
+
* Copyright(c) 2015 Douglas Christopher Wilson
|
|
10
|
+
* MIT Licensed
|
|
11
|
+
*)
|
|
12
|
+
*/
|
|
4
13
|
//# sourceMappingURL=index.js.map
|